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 ?
  
> +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.



> @@ -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.


> +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.

My second question is: Why do you need that ?:

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


> @@ -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.

-- 
Intel Open Source Technology Centre
http://oss.intel.com/
_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman

Reply via email to