Hi Samuel,

On 29/07/2011 17:21, Samuel Ortiz wrote:
Hi Guillaume,

On Thu, Jul 28, 2011 at 02:07:20PM +0200, Guillaume Zajac wrote:
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -50,6 +50,7 @@
  #define OFONO_CONTEXT_INTERFACE               OFONO_SERVICE 
".ConnectionContext"
  #define OFONO_SIM_INTERFACE           OFONO_SERVICE ".SimManager"
  #define OFONO_REGISTRATION_INTERFACE  OFONO_SERVICE ".NetworkRegistration"
+#define OFONO_CDMA_CONNECTION_MANAGER_INTERFACE        OFONO_SERVICE 
".cdma.ConnectionManager"

Could we just call this one OFONO_CDMA_INTERFACE ?

Ok then we will get less than 80 characters.


+static int set_cdma_network_inactive(struct connman_network *network,
+                                       const char *path)
+{
+       int err;
+       dbus_bool_t value = FALSE;
+
+       DBG("network %p, path %s", network, path);
+
+       err = set_property(path, OFONO_CDMA_CONNECTION_MANAGER_INTERFACE,
+                               "Powered", DBUS_TYPE_BOOLEAN,&value,
+                               NULL, NULL, NULL);
+
+       if (err == -EINPROGRESS)
+               err = 0;
+
+       return err;
+}
So I'd rather use the set_network_active|inactive() routine and have them
support cdma. You would get the modem from network ->  device ->  modem.
Then you'd set the interface and the property paths depending on the modem
being a cdma one or not.



Fine for me.

@@ -584,6 +616,9 @@ static int network_connect(struct connman_network *network)
        if (modem == NULL)
                return -ENODEV;

+       if (modem->is_cdma)
+               return set_cdma_network_active(network, modem->path);
+
        if (modem->registered == FALSE)
                return -ENOLINK;

@@ -598,13 +633,27 @@ static int network_connect(struct connman_network 
*network)

  static int network_disconnect(struct connman_network *network)
  {
+       struct connman_device *device;
+       struct modem_data *modem;
+
        DBG("network %p", network);

+       device = connman_network_get_device(network);
+       if (device == NULL)
+               return -ENODEV;
+
+       modem = connman_device_get_data(device);
+       if (modem == NULL)
+               return -ENODEV;
+
        if (connman_network_get_index(network)<  0)
                return -ENOTCONN;

        connman_network_set_associating(network, FALSE);

+       if (modem->is_cdma)
+               return set_cdma_network_inactive(network, modem->path);
+
        return set_network_inactive(network);
  }
With my above proposition, those 2 chunks are removed.



Yes

+static int add_cdma_network(struct connman_device *device, const char *path)
+{
+       struct modem_data *modem = connman_device_get_data(device);
+       struct connman_network *network;
+       struct network_info *info;
+       char *ident;
+       const char *hash_path;
+
+       DBG("modem %p device %p path %s", modem, device, path);
+
+       ident = get_ident(path);
+
+       network = connman_device_get_network(device, ident);
+       if (network != NULL)
+               return -EALREADY;
+
+       info = g_hash_table_lookup(network_hash, path);
+       if (info != NULL) {
+               DBG("path %p already exists with device %p", path,
+                       connman_network_get_device(info->network));
+               if (connman_network_get_device(info->network))
+                       return -EALREADY;
+               g_hash_table_remove(network_hash, path);
+       }
+
+       network = connman_network_create(ident, CONNMAN_NETWORK_TYPE_CELLULAR);
+       if (network == NULL)
+               return -ENOMEM;
+
+       info = g_try_new0(struct network_info, 1);
+       if (info == NULL) {
+               connman_network_unref(network);
+               return -ENOMEM;
+       }
+
+       connman_ipaddress_clear(&info->ipv4_address);
+       connman_ipaddress_clear(&info->ipv6_address);
+       info->network = network;
+
+       connman_network_set_string(network, "Path", path);
+       hash_path = connman_network_get_string(network, "Path");
+       if (hash_path == NULL) {
+               connman_network_unref(network);
+               g_free(info);
+               return -EIO;
+       }
+
+       create_service(network);
+
+       connman_network_ref(network);
+       g_hash_table_insert(network_hash, (char *) hash_path, info);
+
+       connman_network_set_available(network, TRUE);
+       connman_network_set_index(network, -1);
+
+       connman_network_set_name(network, "CDMA Network");
+
+       if (modem->has_strength)
+               connman_network_set_strength(network, modem->strength);
+
+       if (connman_device_add_network(device, network) != 0)
+               goto error;
+
+       return 0;
+
+error:
+       connman_network_unref(network);
+       g_hash_table_remove(network_hash, hash_path);
+       return -EIO;
+}
So my first question would be: Why do we need a specific network addition
routine for CDMA ? The only addition to the existing add_network() routine
would be for the network name setting since oFono doesn't have a CDMA netreg
support. By the way, setting all CDMA network names to "CDMA network" is not
good, you need to find a unique name.


I will keep one add_network() function. I will also associate a number to "CDMA network %d" to keep it unique.
My second question is: Why do you need that ?:

+     connman_network_set_string(network, "Path", path);
+     hash_path = connman_network_get_string(network, "Path");


At the beginning I worked on 0.69 ConnMan and there was this part into ofono plugin in add_network() function. My add_cdma_network() function was based on it, that is why on HEAD version there is this stupid thing :)
I will fix it.

@@ -1656,10 +1786,21 @@ static gboolean modem_changed(DBusConnection 
*connection, DBusMessage *message,
                gboolean had_reg = modem->has_reg;
                gboolean has_gprs = modem_has_gprs(&value);
                gboolean had_gprs = modem->has_gprs;
+               gboolean is_cdma = modem_is_cdma(&value);

                modem->has_sim = has_sim;
                modem->has_reg = has_reg;
                modem->has_gprs = has_gprs;
+               modem->is_cdma = is_cdma;
+
+               if (is_cdma) {
+                       if (modem->device == NULL)
+                               return TRUE;
+
+                       add_cdma_network(modem->device, "/context1");
With CDMA supportting only one context, I suppose the hardcoded path here is
ok.

Cheers,
Samuel.


Kind regards,
Guillaume

_______________________________________________
connman mailing list
connman@connman.net
http://lists.connman.net/listinfo/connman

Reply via email to