Send connman mailing list submissions to
        [email protected]

To subscribe or unsubscribe via the World Wide Web, visit
        https://lists.01.org/mailman/listinfo/connman
or, via email, send a message with subject or body 'help' to
        [email protected]

You can reach the person managing the list at
        [email protected]

When replying, please edit your Subject line so it is more specific
than "Re: Contents of connman digest..."


Today's Topics:

   1. Re: [PATCH 1/2] service: Set search domains when connected
      (Patrik Flykt)
   2. [RFC v2 0/8] Implementation of simultaneous internet contexts
      activation (Mylene JOSSERAND)
   3. [RFC v2 1/8] ofono: create a list of contexts (Mylene JOSSERAND)
   4. [RFC v2 2/8] ofono: move some properties to context struct
      (Mylene JOSSERAND)
   5. [RFC v2 3/8] ofono: move "network" property to context struct
      (Mylene JOSSERAND)


----------------------------------------------------------------------

Message: 1
Date: Fri, 27 Nov 2015 10:11:11 +0200
From: Patrik Flykt <[email protected]>
To: Mike Purvis <[email protected]>
Cc: [email protected]
Subject: Re: [PATCH 1/2] service: Set search domains when connected
Message-ID: <[email protected]>
Content-Type: text/plain; charset="UTF-8"

On Thu, 2015-11-26 at 10:18 -0500, Mike Purvis wrote:
> Cool, thanks for addressing this? will try it out in v1.31.

It'd be much better if you can try it out before we release 1.31. If you
notice it's still wrong after the release, you'll have to wait even
longer to get a release where it is correct... :-)


Cheers,

        Patrik



------------------------------

Message: 2
Date: Fri, 27 Nov 2015 19:37:04 +0100
From: Mylene JOSSERAND <[email protected]>
To: [email protected]
Subject: [RFC v2 0/8] Implementation of simultaneous internet contexts
        activation
Message-ID: <[email protected]>

This patchset updates and implements in ofono's plugin a simultaneous internet 
contexts activation per modem.
Thanks to these patches, we can create two (or more) contexts for one modem and 
activates them simultaneous (if the modem handles it).
It has been tested with a cinterion pxs8 for two contexts : one for QMI and 
another for PPP interface.

This is the second version. I tried to split the best I can according to 
previous
comments but I think it can be improved (that is why I put it in RFC again).

Thank you in advance for patch reviews.

Mylene JOSSERAND (8):
  ofono: create a list of contexts
  ofono: move some properties to context struct
  ofono: move "network" property to context struct
  ofono: add network_context to property info
  ofono: remove the context struct in modem one
  ofono: implementation of simultaneous APNS
  ofono: add array parsing when contexts are added
  ofono: set "powered" property according to value

 plugins/ofono.c | 489 +++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 310 insertions(+), 179 deletions(-)

-- 
2.1.4



------------------------------

Message: 3
Date: Fri, 27 Nov 2015 19:37:05 +0100
From: Mylene JOSSERAND <[email protected]>
To: [email protected]
Subject: [RFC v2 1/8] ofono: create a list of contexts
Message-ID:
        
<037ef4fb373f7b331af70db463495d45c33dc00e.1448627165.git.josserand.myl...@gmail.com>
        

The current commit creates a list of contexts which will be used
when the user adds many contexts for one modem.
---
 plugins/ofono.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 54 insertions(+), 13 deletions(-)

diff --git a/plugins/ofono.c b/plugins/ofono.c
index 4337d45..54822fd 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -150,6 +150,7 @@ struct modem_data {
        struct connman_network *network;
 
        struct network_context *context;
+       GSList *context_list;
 
        /* Modem Interface */
        char *serial;
@@ -219,6 +220,24 @@ static char *get_ident(const char *path)
        return pos + 1;
 }
 
+
+static struct network_context *get_context_with_path(GSList *context_list,
+                                               const gchar *path)
+{
+       GSList *list;
+
+       DBG("path %s", path);
+
+       for (list = context_list; list; list = list->next) {
+               struct network_context *context = list->data;
+
+               if (g_strcmp0(context->path, path) == 0)
+                       return context;
+       }
+
+       return NULL;
+}
+
 static struct network_context *network_context_alloc(const char *path)
 {
        struct network_context *context;
@@ -1205,6 +1224,7 @@ static int add_cm_context(struct modem_data *modem, const 
char *context_path,
        modem->context = context;
        modem->active = active;
 
+       modem->context_list = g_slist_prepend(modem->context_list, context);
        g_hash_table_replace(context_hash, g_strdup(context_path), modem);
 
        if (modem->valid_apn && modem->attached &&
@@ -1217,23 +1237,44 @@ static int add_cm_context(struct modem_data *modem, 
const char *context_path,
 }
 
 static void remove_cm_context(struct modem_data *modem,
-                               const char *context_path)
+                               struct network_context *context)
 {
        if (!modem->context)
                return;
+       if (!modem->context_list)
+               return;
+       if (!context)
+               return;
 
        if (modem->network)
                remove_network(modem);
 
-       g_hash_table_remove(context_hash, context_path);
+       g_hash_table_remove(context_hash, context->path);
+
+       modem->context_list = g_slist_remove(modem->context_list, context);
 
        network_context_free(modem->context);
        modem->context = NULL;
 
        modem->valid_apn = false;
+}
 
-       if (modem->network)
-               remove_network(modem);
+static void remove_all_contexts(struct modem_data *modem)
+{
+       GSList *list = NULL;
+
+       DBG("");
+
+       if (modem->context_list == NULL)
+               return;
+
+       for (list = modem->context_list; list; list = list->next) {
+               struct network_context *context = list->data;
+
+               remove_cm_context(modem, context);
+       }
+       g_slist_free(modem->context_list);
+       modem->context_list = NULL;
 }
 
 static gboolean context_changed(DBusConnection *conn,
@@ -1451,6 +1492,7 @@ static gboolean cm_context_removed(DBusConnection *conn,
        const char *path = dbus_message_get_path(message);
        const char *context_path;
        struct modem_data *modem;
+       struct network_context *context;
        DBusMessageIter iter;
 
        DBG("context path %s", path);
@@ -1464,7 +1506,8 @@ static gboolean cm_context_removed(DBusConnection *conn,
        if (!modem)
                return TRUE;
 
-       remove_cm_context(modem, context_path);
+       context = get_context_with_path(modem->context_list, context_path);
+       remove_cm_context(modem, context);
 
        return TRUE;
 }
@@ -2149,14 +2192,11 @@ static void modem_update_interfaces(struct modem_data 
*modem,
                        dbus_pending_call_unref(modem->call_get_contexts);
                        modem->call_get_contexts = NULL;
                }
-               if (modem->context) {
-                       DBG("removing context %s", modem->context->path);
-                       remove_cm_context(modem, modem->context->path);
-               }
+               remove_all_contexts(modem);
        }
 
        if (api_removed(old_ifaces, new_ifaces, OFONO_API_CDMA_CM))
-               remove_cm_context(modem, modem->context->path);
+               remove_all_contexts(modem);
 
        if (api_removed(old_ifaces, new_ifaces, OFONO_API_NETREG))
                remove_network(modem);
@@ -2365,12 +2405,13 @@ static void remove_modem(gpointer data)
                dbus_pending_call_unref(modem->call_get_contexts);
        }
 
+       /* Must remove the contexts before the device */
+       if (modem->context_list)
+               remove_all_contexts(modem);
+
        if (modem->device)
                destroy_device(modem);
 
-       if (modem->context)
-               remove_cm_context(modem, modem->context->path);
-
        g_free(modem->serial);
        g_free(modem->name);
        g_free(modem->imsi);
-- 
2.1.4



------------------------------

Message: 4
Date: Fri, 27 Nov 2015 19:37:06 +0100
From: Mylene JOSSERAND <[email protected]>
To: [email protected]
Subject: [RFC v2 2/8] ofono: move some properties to context struct
Message-ID:
        
<30aedd7e4fa519874cbfb66e6b648ea5c67d0290.1448627165.git.josserand.myl...@gmail.com>
        

This commit moves "active" and "valid_apn" properties from
modem structure to context structure as these properties are
context's specific.
---
 plugins/ofono.c | 51 +++++++++++++++++++++++++++++----------------------
 1 file changed, 29 insertions(+), 22 deletions(-)

diff --git a/plugins/ofono.c b/plugins/ofono.c
index 54822fd..be247bb 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -141,6 +141,9 @@ struct network_context {
        enum connman_ipconfig_method ipv6_method;
        struct connman_ipaddress *ipv6_address;
        char *ipv6_nameservers;
+
+       bool active;
+       bool valid_apn; /* APN is 'valid' if length > 0 */
 };
 
 struct modem_data {
@@ -168,10 +171,6 @@ struct modem_data {
        bool attached;
        bool cm_powered;
 
-       /* ConnectionContext Interface */
-       bool active;
-       bool valid_apn; /* APN is 'valid' if length > 0 */
-
        /* SimManager Interface */
        char *imsi;
 
@@ -1197,9 +1196,9 @@ static int add_cm_context(struct modem_data *modem, const 
char *context_path,
 
                        dbus_message_iter_get_basic(&value, &apn);
                        if (apn && strlen(apn) > 0)
-                               modem->valid_apn = true;
+                               context->valid_apn = true;
                        else
-                               modem->valid_apn = false;
+                               context->valid_apn = false;
 
                        DBG("%s AccessPointName '%s'", modem->path, apn);
                }  else if (g_str_equal(key, "Protocol") &&
@@ -1222,12 +1221,12 @@ static int add_cm_context(struct modem_data *modem, 
const char *context_path,
                set_context_ipconfig(context, ip_protocol);
 
        modem->context = context;
-       modem->active = active;
+       context->active = active;
 
        modem->context_list = g_slist_prepend(modem->context_list, context);
        g_hash_table_replace(context_hash, g_strdup(context_path), modem);
 
-       if (modem->valid_apn && modem->attached &&
+       if (context->valid_apn && modem->attached &&
                        has_interface(modem->interfaces,
                                OFONO_API_NETREG)) {
                add_network(modem);
@@ -1255,8 +1254,6 @@ static void remove_cm_context(struct modem_data *modem,
 
        network_context_free(modem->context);
        modem->context = NULL;
-
-       modem->valid_apn = false;
 }
 
 static void remove_all_contexts(struct modem_data *modem)
@@ -1281,6 +1278,7 @@ static gboolean context_changed(DBusConnection *conn,
                                DBusMessage *message,
                                void *user_data)
 {
+       struct network_context *context = NULL;
        const char *context_path = dbus_message_get_path(message);
        struct modem_data *modem = NULL;
        DBusMessageIter iter, value;
@@ -1292,6 +1290,10 @@ static gboolean context_changed(DBusConnection *conn,
        if (!modem)
                return TRUE;
 
+       context = get_context_with_path(modem->context_list, context_path);
+       if (!context)
+               return TRUE;
+
        if (!dbus_message_iter_init(message, &iter))
                return TRUE;
 
@@ -1317,11 +1319,11 @@ static gboolean context_changed(DBusConnection *conn,
                dbus_bool_t active;
 
                dbus_message_iter_get_basic(&value, &active);
-               modem->active = active;
+               context->active = active;
 
-               DBG("%s Active %d", modem->path, modem->active);
+               DBG("%s Active %d", modem->path, context->active);
 
-               if (modem->active)
+               if (context->active)
                        set_connected(modem);
                else
                        set_disconnected(modem);
@@ -1333,7 +1335,7 @@ static gboolean context_changed(DBusConnection *conn,
                DBG("%s AccessPointName %s", modem->path, apn);
 
                if (apn && strlen(apn) > 0) {
-                       modem->valid_apn = true;
+                       context->valid_apn = true;
 
                        if (modem->network)
                                return TRUE;
@@ -1347,10 +1349,10 @@ static gboolean context_changed(DBusConnection *conn,
 
                        add_network(modem);
 
-                       if (modem->active)
+                       if (context->active)
                                set_connected(modem);
                } else {
-                       modem->valid_apn = false;
+                       context->valid_apn = false;
 
                        if (!modem->network)
                                return TRUE;
@@ -1667,6 +1669,8 @@ static gboolean netreg_changed(DBusConnection *conn, 
DBusMessage *message,
 static void netreg_properties_reply(struct modem_data *modem,
                                        DBusMessageIter *dict)
 {
+       GSList *list = NULL;
+
        DBG("%s", modem->path);
 
        while (dbus_message_iter_get_arg_type(dict) == DBUS_TYPE_DICT_ENTRY) {
@@ -1691,7 +1695,7 @@ static void netreg_properties_reply(struct modem_data 
*modem,
                dbus_message_iter_next(dict);
        }
 
-       if (!modem->context) {
+       if (!modem->context_list) {
                /*
                 * netgreg_get_properties() was issued after we got
                 * cm_get_contexts_reply() where we create the
@@ -1702,12 +1706,15 @@ static void netreg_properties_reply(struct modem_data 
*modem,
                 */
                return;
        }
+       /* Check for all contexts if they are valids and/or actives */
+       for (list = modem->context_list; list; list = list->next) {
+               struct network_context *context = list->data;
 
-       if (modem->valid_apn)
-               add_network(modem);
-
-       if (modem->active)
-               set_connected(modem);
+               if (context->valid_apn)
+                       add_network(modem);
+               if (context->active)
+                       set_connected(modem);
+       }
 }
 
 static int netreg_get_properties(struct modem_data *modem)
-- 
2.1.4



------------------------------

Message: 5
Date: Fri, 27 Nov 2015 19:37:07 +0100
From: Mylene JOSSERAND <[email protected]>
To: [email protected]
Subject: [RFC v2 3/8] ofono: move "network" property to context struct
Message-ID:
        
<c572a50963350d94567c68f5bd25ea09c2c4c35c.1448627165.git.josserand.myl...@gmail.com>
        

The current commit moves the "network" property to the context
structure. Many modifications are needed to take into account
some network modifications using a context instead of a modem struct.
---
 plugins/ofono.c | 280 +++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 163 insertions(+), 117 deletions(-)

diff --git a/plugins/ofono.c b/plugins/ofono.c
index be247bb..5c8b429 100644
--- a/plugins/ofono.c
+++ b/plugins/ofono.c
@@ -133,6 +133,7 @@ static GHashTable *context_hash;
 struct network_context {
        char *path;
        int index;
+       struct connman_network *network;
 
        enum connman_ipconfig_method ipv4_method;
        struct connman_ipaddress *ipv4_address;
@@ -150,7 +151,6 @@ struct modem_data {
        char *path;
 
        struct connman_device *device;
-       struct connman_network *network;
 
        struct network_context *context;
        GSList *context_list;
@@ -272,7 +272,8 @@ static void network_context_free(struct network_context 
*context)
        free(context);
 }
 
-static void set_connected(struct modem_data *modem)
+static void set_connected(struct modem_data *modem,
+                       struct network_context *context)
 {
        struct connman_service *service;
        bool setip = false;
@@ -282,21 +283,21 @@ static void set_connected(struct modem_data *modem)
 
        DBG("%s", modem->path);
 
-       index = modem->context->index;
+       index = context->index;
 
-       method = modem->context->ipv4_method;
-       if (index < 0 || (!modem->context->ipv4_address &&
+       method = context->ipv4_method;
+       if (index < 0 || (!context->ipv4_address &&
                                method == CONNMAN_IPCONFIG_METHOD_FIXED)) {
                connman_error("Invalid index and/or address");
                return;
        }
 
-       service = connman_service_lookup_from_network(modem->network);
+       service = connman_service_lookup_from_network(context->network);
        if (!service)
                return;
 
        connman_service_create_ip4config(service, index);
-       connman_network_set_ipv4_method(modem->network, method);
+       connman_network_set_ipv4_method(context->network, method);
 
        if (method == CONNMAN_IPCONFIG_METHOD_FIXED ||
                        method == CONNMAN_IPCONFIG_METHOD_DHCP) {
@@ -304,58 +305,58 @@ static void set_connected(struct modem_data *modem)
        }
 
        if (method == CONNMAN_IPCONFIG_METHOD_FIXED) {
-               connman_network_set_ipaddress(modem->network,
-                                               modem->context->ipv4_address);
+               connman_network_set_ipaddress(context->network,
+                                               context->ipv4_address);
        }
 
-       method = modem->context->ipv6_method;
+       method = context->ipv6_method;
        connman_service_create_ip6config(service, index);
-       connman_network_set_ipv6_method(modem->network, method);
+       connman_network_set_ipv6_method(context->network, method);
 
        if (method == CONNMAN_IPCONFIG_METHOD_AUTO) {
                setip = true;
        }
 
        /* Set the nameservers */
-       if (modem->context->ipv4_nameservers &&
-                       modem->context->ipv6_nameservers) {
+       if (context->ipv4_nameservers &&
+                   context->ipv6_nameservers) {
                nameservers = g_strdup_printf("%s %s",
-                                       modem->context->ipv4_nameservers,
-                                       modem->context->ipv6_nameservers);
-               connman_network_set_nameservers(modem->network, nameservers);
+                                   context->ipv4_nameservers,
+                                   context->ipv6_nameservers);
+               connman_network_set_nameservers(context->network, nameservers);
                g_free(nameservers);
-       } else if (modem->context->ipv4_nameservers) {
-               connman_network_set_nameservers(modem->network,
-                                       modem->context->ipv4_nameservers);
-       } else if (modem->context->ipv6_nameservers) {
-               connman_network_set_nameservers(modem->network,
-                                       modem->context->ipv6_nameservers);
+       } else if (context->ipv4_nameservers) {
+               connman_network_set_nameservers(context->network,
+                                   context->ipv4_nameservers);
+       } else if (context->ipv6_nameservers) {
+               connman_network_set_nameservers(context->network,
+                                   context->ipv6_nameservers);
        }
 
        if (setip) {
-               connman_network_set_index(modem->network, index);
-               connman_network_set_connected(modem->network, true);
+               connman_network_set_index(context->network, index);
+               connman_network_set_connected(context->network, true);
        }
 }
 
-static void set_disconnected(struct modem_data *modem)
+static void set_disconnected(struct network_context *context)
 {
-       DBG("%s", modem->path);
+       DBG("%s", context->path);
 
-       if (modem->network)
-               connman_network_set_connected(modem->network, false);
+       if (context->network)
+               connman_network_set_connected(context->network, false);
 
-       if (modem->context) {
-               g_free(modem->context->ipv4_nameservers);
-               modem->context->ipv4_nameservers = NULL;
-               if (modem->context->ipv4_method != CONNMAN_IPCONFIG_METHOD_OFF)
-                       modem->context->ipv4_method =
+       if (context) {
+               g_free(context->ipv4_nameservers);
+               context->ipv4_nameservers = NULL;
+               if (context->ipv4_method != CONNMAN_IPCONFIG_METHOD_OFF)
+                       context->ipv4_method =
                                        CONNMAN_IPCONFIG_METHOD_UNKNOWN;
 
-               g_free(modem->context->ipv6_nameservers);
-               modem->context->ipv6_nameservers = NULL;
-               if (modem->context->ipv6_method != CONNMAN_IPCONFIG_METHOD_OFF)
-                       modem->context->ipv6_method =
+               g_free(context->ipv6_nameservers);
+               context->ipv6_nameservers = NULL;
+               if (context->ipv6_method != CONNMAN_IPCONFIG_METHOD_OFF)
+                       context->ipv6_method =
                                        CONNMAN_IPCONFIG_METHOD_UNKNOWN;
        }
 }
@@ -560,9 +561,9 @@ static int get_properties(const char *path, const char 
*interface,
 }
 
 static void context_set_active_reply(struct modem_data *modem,
-                                       bool success)
+                               struct network_context *context, bool success)
 {
-       DBG("%s", modem->path);
+       DBG("%s", context->path);
 
        if (success) {
                /*
@@ -579,7 +580,7 @@ static void context_set_active_reply(struct modem_data 
*modem,
         * cycle the modem in such cases?
         */
 
-       if (!modem->network) {
+       if (!context->network) {
                /*
                 * In the case where we power down the device
                 * we don't wait for the reply, therefore the network
@@ -588,7 +589,7 @@ static void context_set_active_reply(struct modem_data 
*modem,
                return;
        }
 
-       connman_network_set_error(modem->network,
+       connman_network_set_error(context->network,
                                CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
 }
 
@@ -612,9 +613,9 @@ static int context_set_active(struct modem_data *modem,
 }
 
 static void cdma_cm_set_powered_reply(struct modem_data *modem,
-                                       bool success)
+                               struct network_context *context, bool success)
 {
-       DBG("%s", modem->path);
+       DBG("%s", context->path);
 
        if (success) {
                /*
@@ -631,7 +632,7 @@ static void cdma_cm_set_powered_reply(struct modem_data 
*modem,
         * cycle the modem in such cases?
         */
 
-       if (!modem->network) {
+       if (!context->network) {
                /*
                 * In the case where we power down the device
                 * we don't wait for the reply, therefore the network
@@ -640,7 +641,7 @@ static void cdma_cm_set_powered_reply(struct modem_data 
*modem,
                return;
        }
 
-       connman_network_set_error(modem->network,
+       connman_network_set_error(context->network,
                                CONNMAN_NETWORK_ERROR_ASSOCIATE_FAIL);
 }
 
@@ -1035,71 +1036,68 @@ static void destroy_device(struct modem_data *modem)
 
        connman_device_set_powered(modem->device, false);
 
-       if (modem->network) {
-               connman_device_remove_network(modem->device, modem->network);
-               connman_network_unref(modem->network);
-               modem->network = NULL;
-       }
-
        connman_device_unregister(modem->device);
        connman_device_unref(modem->device);
 
        modem->device = NULL;
 }
 
-static void add_network(struct modem_data *modem)
+static void add_network(struct modem_data *modem,
+                       struct network_context *context)
 {
        const char *group;
 
        DBG("%s", modem->path);
 
-       if (modem->network)
+       if (context->network)
                return;
 
-       modem->network = connman_network_create(modem->context->path,
-                                               CONNMAN_NETWORK_TYPE_CELLULAR);
-       if (!modem->network)
+       context->network = connman_network_create(context->path,
+                                       CONNMAN_NETWORK_TYPE_CELLULAR);
+       if (!context->network)
                return;
 
-       DBG("network %p", modem->network);
+       DBG("network %p", context->network);
 
-       connman_network_set_data(modem->network, modem);
+       connman_network_set_data(context->network, modem);
 
-       connman_network_set_string(modem->network, "Path",
-                                       modem->context->path);
+       connman_network_set_string(context->network, "Path",
+                                       context->path);
 
        if (modem->name)
-               connman_network_set_name(modem->network, modem->name);
+               connman_network_set_name(context->network, modem->name);
        else
-               connman_network_set_name(modem->network, "");
+               connman_network_set_name(context->network, "");
 
-       connman_network_set_strength(modem->network, modem->strength);
+       connman_network_set_strength(context->network, modem->strength);
 
-       group = get_ident(modem->context->path);
-       connman_network_set_group(modem->network, group);
+       group = get_ident(context->path);
+       connman_network_set_group(context->network, group);
 
-       connman_network_set_bool(modem->network, "Roaming",
-                                       modem->roaming);
+       connman_network_set_bool(context->network, "Roaming",
+                               modem->roaming);
 
-       if (connman_device_add_network(modem->device, modem->network) < 0) {
-               connman_network_unref(modem->network);
-               modem->network = NULL;
+       if (connman_device_add_network(modem->device, context->network) < 0) {
+               connman_network_unref(context->network);
+               context->network = NULL;
                return;
        }
 }
 
-static void remove_network(struct modem_data *modem)
+static void remove_network(struct modem_data *modem,
+               struct network_context *context)
 {
        DBG("%s", modem->path);
 
-       if (!modem->network)
+       if (!context)
                return;
 
-       DBG("network %p", modem->network);
+       DBG("network %p", context->network);
 
-       connman_device_remove_network(modem->device, modem->network);
-       connman_network_unref(modem->network);
-       modem->network = NULL;
+       if (modem->device)
+               connman_device_remove_network(modem->device, context->network);
+       connman_network_unref(context->network);
+       context->network = NULL;
 }
 
 static int set_context_ipconfig(struct network_context *context,
@@ -1227,10 +1225,8 @@ static int add_cm_context(struct modem_data *modem, 
const char *context_path,
        g_hash_table_replace(context_hash, g_strdup(context_path), modem);
 
        if (context->valid_apn && modem->attached &&
-                       has_interface(modem->interfaces,
-                               OFONO_API_NETREG)) {
-               add_network(modem);
-       }
+           has_interface(modem->interfaces, OFONO_API_NETREG))
+               add_network(modem, context);
 
        return 0;
 }
@@ -1245,11 +1241,10 @@ static void remove_cm_context(struct modem_data *modem,
        if (!context)
                return;
 
-       if (modem->network)
-               remove_network(modem);
-
        g_hash_table_remove(context_hash, context->path);
 
+       if (context->network)
+               remove_network(modem, context);
        modem->context_list = g_slist_remove(modem->context_list, context);
 
        network_context_free(modem->context);
@@ -1274,6 +1269,17 @@ static void remove_all_contexts(struct modem_data *modem)
        modem->context_list = NULL;
 }
 
+static void remove_all_networks(struct modem_data *modem)
+{
+       GSList *list;
+
+       for (list = modem->context_list; list; list = list->next) {
+               struct network_context *context = list->data;
+
+               remove_network(modem, context);
+       }
+}
+
 static gboolean context_changed(DBusConnection *conn,
                                DBusMessage *message,
                                void *user_data)
@@ -1324,9 +1330,9 @@ static gboolean context_changed(DBusConnection *conn,
                DBG("%s Active %d", modem->path, context->active);
 
                if (context->active)
-                       set_connected(modem);
+                       set_connected(modem, context);
                else
-                       set_disconnected(modem);
+                       set_disconnected(context);
        } else if (g_str_equal(key, "AccessPointName")) {
                const char *apn;
 
@@ -1337,7 +1343,7 @@ static gboolean context_changed(DBusConnection *conn,
                if (apn && strlen(apn) > 0) {
                        context->valid_apn = true;
 
-                       if (modem->network)
+                       if (context->network)
                                return TRUE;
 
                        if (!modem->attached)
@@ -1347,17 +1353,17 @@ static gboolean context_changed(DBusConnection *conn,
                                                OFONO_API_NETREG))
                                return TRUE;
 
-                       add_network(modem);
+                       add_network(modem, context);
 
                        if (context->active)
-                               set_connected(modem);
+                               set_connected(modem, context);
                } else {
                        context->valid_apn = false;
 
-                       if (!modem->network)
+                       if (!context->network)
                                return TRUE;
 
-                       remove_network(modem);
+                       remove_network(modem, context);
                }
 
        } else if (g_str_equal(key, "Protocol") &&
@@ -1518,6 +1524,7 @@ static void netreg_update_name(struct modem_data *modem,
                                DBusMessageIter* value)
 {
        char *name;
+       GSList *list;
 
        dbus_message_iter_get_basic(value, &name);
 
@@ -1526,21 +1533,30 @@ static void netreg_update_name(struct modem_data *modem,
        g_free(modem->name);
        modem->name = g_strdup(name);
 
-       if (!modem->network)
+       if (!modem->context_list)
                return;
 
-       connman_network_set_name(modem->network, modem->name);
-       connman_network_update(modem->network);
+       /* For all the context */
+       for (list = modem->context_list; list; list = list->next) {
+               struct network_context *context = list->data;
+
+               if (context->network) {
+                       connman_network_set_name(context->network, modem->name);
+                       connman_network_update(context->network);
+               }
+       }
 }
 
 static void netreg_update_strength(struct modem_data *modem,
                                        DBusMessageIter *value)
 {
+       GSList *list;
+
        dbus_message_iter_get_basic(value, &modem->strength);
 
        DBG("%s Strength %d", modem->path, modem->strength);
 
-       if (!modem->network)
+       if (!modem->context_list)
                return;
 
        /*
@@ -1559,19 +1575,29 @@ static void netreg_update_strength(struct modem_data 
*modem,
        if (modem->data_strength != 0)
                return;
 
-       connman_network_set_strength(modem->network, modem->strength);
-       connman_network_update(modem->network);
+       /* For all the context */
+       for (list = modem->context_list; list; list = list->next) {
+               struct network_context *context = list->data;
+
+               if (context->network) {
+                       connman_network_set_strength(context->network,
+                                                       modem->strength);
+                       connman_network_update(context->network);
+               }
+       }
 }
 
 /* Retrieve 1xEVDO Data Strength signal */
 static void netreg_update_datastrength(struct modem_data *modem,
                                        DBusMessageIter *value)
 {
+       GSList *list;
+
        dbus_message_iter_get_basic(value, &modem->data_strength);
 
        DBG("%s Data Strength %d", modem->path, modem->data_strength);
 
-       if (!modem->network)
+       if (!modem->context_list)
                return;
 
        /*
@@ -1582,8 +1608,16 @@ static void netreg_update_datastrength(struct modem_data 
*modem,
        if (modem->data_strength == 0)
                return;
 
-       connman_network_set_strength(modem->network, modem->data_strength);
-       connman_network_update(modem->network);
+       /* For all the context */
+       for (list = modem->context_list; list; list = list->next) {
+               struct network_context *context = list->data;
+
+               if (context->network) {
+                       connman_network_set_strength(context->network,
+                                                       modem->data_strength);
+                       connman_network_update(context->network);
+               }
+       }
 }
 
 static void netreg_update_status(struct modem_data *modem,
@@ -1591,6 +1625,7 @@ static void netreg_update_status(struct modem_data *modem,
 {
        char *status;
        bool roaming;
+       GSList *list;
 
        dbus_message_iter_get_basic(value, &status);
 
@@ -1602,12 +1637,19 @@ static void netreg_update_status(struct modem_data 
*modem,
 
        modem->roaming = roaming;
 
-       if (!modem->network)
+       if (!modem->context_list)
                return;
 
-       connman_network_set_bool(modem->network,
+       /* For all the context */
+       for (list = modem->context_list; list; list = list->next) {
+               struct network_context *context = list->data;
+
+               if (context->network) {
+                       connman_network_set_bool(context->network,
                                "Roaming", modem->roaming);
-       connman_network_update(modem->network);
+                       connman_network_update(context->network);
+               }
+       }
 }
 
 static void netreg_update_regdom(struct modem_data *modem,
@@ -1711,9 +1753,9 @@ static void netreg_properties_reply(struct modem_data 
*modem,
                struct network_context *context = list->data;
 
                if (context->valid_apn)
-                       add_network(modem);
+                       add_network(modem, context);
                if (context->active)
-                       set_connected(modem);
+                       set_connected(modem, context);
        }
 }
 
@@ -1725,6 +1767,7 @@ static int netreg_get_properties(struct modem_data *modem)
 
 static void add_cdma_network(struct modem_data *modem)
 {
+       struct network_context *context;
        /* Be sure that device is created before adding CDMA network */
        if (!modem->device)
                return;
@@ -1733,16 +1776,19 @@ static void add_cdma_network(struct modem_data *modem)
         * CDMA modems don't need contexts for data call, however the current
         * add_network() logic needs one, so we create one to proceed.
         */
-       if (!modem->context)
-               modem->context = network_context_alloc(modem->path);
+       if (!modem->context_list) {
+               context = network_context_alloc(modem->path);
+               modem->context_list = g_slist_prepend(modem->context_list,
+                                                       context);
+       }
 
        if (!modem->name)
                modem->name = g_strdup("CDMA Network");
 
-       add_network(modem);
+       add_network(modem, context);
 
        if (modem->cdma_cm_powered)
-               set_connected(modem);
+               set_connected(modem, context);
 }
 
 static gboolean cdma_netreg_changed(DBusConnection *conn,
@@ -1783,7 +1829,7 @@ static gboolean cdma_netreg_changed(DBusConnection *conn,
        if (modem->registered)
                add_cdma_network(modem);
        else
-               remove_network(modem);
+               remove_network(modem, modem->context);
 
        return TRUE;
 }
@@ -1818,7 +1864,7 @@ static void cdma_netreg_properties_reply(struct 
modem_data *modem,
        if (modem->registered)
                add_cdma_network(modem);
        else
-               remove_network(modem);
+               remove_network(modem, modem->context);
 }
 
 static int cdma_netreg_get_properties(struct modem_data *modem)
@@ -1838,7 +1884,7 @@ static void cm_update_attached(struct modem_data *modem,
        DBG("%s Attached %d", modem->path, modem->attached);
 
        if (!modem->attached) {
-               remove_network(modem);
+               remove_network(modem, modem->context);
                return;
        }
 
@@ -1906,13 +1952,13 @@ static void cdma_cm_update_powered(struct modem_data 
*modem,
 
        DBG("%s CDMA cm Powered %d", modem->path, modem->cdma_cm_powered);
 
-       if (!modem->network)
+       if (!modem->context)
                return;
 
        if (modem->cdma_cm_powered)
-               set_connected(modem);
+               set_connected(modem, modem->context);
        else
-               set_disconnected(modem);
+               set_disconnected(modem->context);
 }
 
 static void cdma_cm_update_settings(struct modem_data *modem,
@@ -1935,7 +1981,7 @@ static gboolean cdma_cm_changed(DBusConnection *conn,
        if (!modem)
                return TRUE;
 
-       if (modem->online && !modem->network)
+       if (modem->online && !modem->context)
                cdma_netreg_get_properties(modem);
 
        if (!dbus_message_iter_init(message, &iter))
@@ -2206,10 +2252,10 @@ static void modem_update_interfaces(struct modem_data 
*modem,
                remove_all_contexts(modem);
 
        if (api_removed(old_ifaces, new_ifaces, OFONO_API_NETREG))
-               remove_network(modem);
+               remove_all_networks(modem);
 
        if (api_removed(old_ifaces, new_ifaces, OFONO_API_CDMA_NETREG))
-               remove_network(modem);
+               remove_all_networks(modem);
 }
 
 static gboolean modem_changed(DBusConnection *conn, DBusMessage *message,
-- 
2.1.4



------------------------------

Subject: Digest Footer

_______________________________________________
connman mailing list
[email protected]
https://lists.01.org/mailman/listinfo/connman


------------------------------

End of connman Digest, Vol 1, Issue 9
*************************************

Reply via email to