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. [PATCH 0/7] Implementation of simultaneous internet contexts
activation (Mylene JOSSERAND)
2. [PATCH 1/7] ofono: create a list of contexts (Mylene JOSSERAND)
3. [PATCH 2/7] ofono: move some properties to context struct
(Mylene JOSSERAND)
4. [PATCH 3/7] ofono: move "network" property to context struct
(Mylene JOSSERAND)
----------------------------------------------------------------------
Message: 1
Date: Fri, 11 Dec 2015 00:07:57 +0100
From: Mylene JOSSERAND <[email protected]>
To: [email protected]
Subject: [PATCH 0/7] 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.
Thank you,
Best regards
Mylene JOSSERAND (7):
ofono: create a list of contexts
ofono: move some properties to context struct
ofono: move "network" property to context struct
ofono: implementation of simultaneous APNS
ofono: remove the context struct in modem one
ofono: add array parsing when contexts are added
ofono: set "powered" property according to value
plugins/ofono.c | 488 +++++++++++++++++++++++++++++++++++---------------------
1 file changed, 309 insertions(+), 179 deletions(-)
--
2.1.4
------------------------------
Message: 2
Date: Fri, 11 Dec 2015 00:07:58 +0100
From: Mylene JOSSERAND <[email protected]>
To: [email protected]
Subject: [PATCH 1/7] ofono: create a list of contexts
Message-ID:
<63bdfbeec2233c5dfebe68c195750f56053a25cf.1449758613.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 | 66 +++++++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 53 insertions(+), 13 deletions(-)
diff --git a/plugins/ofono.c b/plugins/ofono.c
index 4337d45..e23d02f 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,23 @@ 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 +1223,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 +1236,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 +1491,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 +1505,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 +2191,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 +2404,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: 3
Date: Fri, 11 Dec 2015 00:07:59 +0100
From: Mylene JOSSERAND <[email protected]>
To: [email protected]
Subject: [PATCH 2/7] ofono: move some properties to context struct
Message-ID:
<bbaa6908e72a1409aad06c2bf083da4e2455c0cf.1449758613.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 e23d02f..356a38e 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;
@@ -1196,9 +1195,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") &&
@@ -1221,12 +1220,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);
@@ -1254,8 +1253,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)
@@ -1280,6 +1277,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;
@@ -1291,6 +1289,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;
@@ -1316,11 +1318,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);
@@ -1332,7 +1334,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;
@@ -1346,10 +1348,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;
@@ -1666,6 +1668,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) {
@@ -1690,7 +1694,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
@@ -1701,12 +1705,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: 4
Date: Fri, 11 Dec 2015 00:08:00 +0100
From: Mylene JOSSERAND <[email protected]>
To: [email protected]
Subject: [PATCH 3/7] ofono: move "network" property to context struct
Message-ID:
<daf984337835f768edb941e3eebeb91ff64deb4d.1449758613.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.
A new function is needed : "get_context_with_network". It returns
a context from the list according to a network.
---
plugins/ofono.c | 333 +++++++++++++++++++++++++++++++++++---------------------
1 file changed, 206 insertions(+), 127 deletions(-)
diff --git a/plugins/ofono.c b/plugins/ofono.c
index 356a38e..7f2d677 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;
@@ -236,6 +236,23 @@ static struct network_context
*get_context_with_path(GSList *context_list,
return NULL;
}
+static struct network_context *get_context_with_network(GSList *context_list,
+ const struct connman_network *network)
+{
+ GSList *list;
+
+ DBG("network %p", network);
+
+ for (list = context_list; list; list = list->next) {
+ struct network_context *context = list->data;
+
+ if (context->network == network)
+ return context;
+ }
+
+ return NULL;
+}
+
static struct network_context *network_context_alloc(const char *path)
{
struct network_context *context;
@@ -271,7 +288,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;
@@ -281,21 +299,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) {
@@ -303,69 +321,70 @@ 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;
}
}
typedef void (*set_property_cb)(struct modem_data *data,
- bool success);
+ struct network_context *context, bool success);
typedef void (*get_properties_cb)(struct modem_data *data,
DBusMessageIter *dict);
struct property_info {
struct modem_data *modem;
+ struct network_context *context;
const char *path;
const char *interface;
const char *property;
@@ -398,7 +417,8 @@ static void set_property_reply(DBusPendingCall *call, void
*user_data)
}
if (info->set_property_cb)
- (*info->set_property_cb)(info->modem, success);
+ (*info->set_property_cb)(info->modem, info->context,
+ success);
dbus_message_unref(reply);
@@ -406,6 +426,7 @@ static void set_property_reply(DBusPendingCall *call, void
*user_data)
}
static int set_property(struct modem_data *modem,
+ struct network_context *context,
const char *path, const char *interface,
const char *property, int type, void *value,
set_property_cb notify)
@@ -452,6 +473,7 @@ static int set_property(struct modem_data *modem,
}
info->modem = modem;
+ info->context = context;
info->path = path;
info->interface = interface;
info->property = property;
@@ -559,9 +581,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) {
/*
@@ -578,7 +600,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
@@ -587,18 +609,19 @@ 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);
}
static int context_set_active(struct modem_data *modem,
- dbus_bool_t active)
+ struct network_context *context,
+ dbus_bool_t active)
{
int err;
DBG("%s active %d", modem->path, active);
- err = set_property(modem, modem->context->path,
+ err = set_property(modem, context, context->path,
OFONO_CONTEXT_INTERFACE,
"Active", DBUS_TYPE_BOOLEAN,
&active,
@@ -611,9 +634,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) {
/*
@@ -630,7 +653,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
@@ -639,7 +662,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);
}
@@ -649,7 +672,8 @@ static int cdma_cm_set_powered(struct modem_data *modem,
dbus_bool_t powered)
DBG("%s powered %d", modem->path, powered);
- err = set_property(modem, modem->path, OFONO_CDMA_CM_INTERFACE,
+ err = set_property(modem, modem->context, modem->path,
+ OFONO_CDMA_CM_INTERFACE,
"Powered", DBUS_TYPE_BOOLEAN,
&powered,
cdma_cm_set_powered_reply);
@@ -664,7 +688,7 @@ static int modem_set_online(struct modem_data *modem,
dbus_bool_t online)
{
DBG("%s online %d", modem->path, online);
- return set_property(modem, modem->path,
+ return set_property(modem, NULL, modem->path,
OFONO_MODEM_INTERFACE,
"Online", DBUS_TYPE_BOOLEAN,
&online,
@@ -677,7 +701,7 @@ static int cm_set_powered(struct modem_data *modem,
dbus_bool_t powered)
DBG("%s powered %d", modem->path, powered);
- err = set_property(modem, modem->path,
+ err = set_property(modem, NULL, modem->path,
OFONO_CM_INTERFACE,
"Powered", DBUS_TYPE_BOOLEAN,
&powered,
@@ -697,7 +721,7 @@ static int modem_set_powered(struct modem_data *modem,
dbus_bool_t powered)
modem->set_powered = powered;
- err = set_property(modem, modem->path,
+ err = set_property(modem, NULL, modem->path,
OFONO_MODEM_INTERFACE,
"Powered", DBUS_TYPE_BOOLEAN,
&powered,
@@ -1034,71 +1058,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,
@@ -1226,10 +1247,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;
}
@@ -1244,11 +1263,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);
@@ -1273,6 +1291,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)
@@ -1323,9 +1352,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;
@@ -1336,7 +1365,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)
@@ -1346,17 +1375,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") &&
@@ -1517,6 +1546,7 @@ static void netreg_update_name(struct modem_data *modem,
DBusMessageIter* value)
{
char *name;
+ GSList *list;
dbus_message_iter_get_basic(value, &name);
@@ -1525,21 +1555,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;
/*
@@ -1558,19 +1597,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;
/*
@@ -1581,8 +1630,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,
@@ -1590,6 +1647,7 @@ static void netreg_update_status(struct modem_data *modem,
{
char *status;
bool roaming;
+ GSList *list;
dbus_message_iter_get_basic(value, &status);
@@ -1601,12 +1659,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,
@@ -1710,9 +1775,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);
}
}
@@ -1724,6 +1789,7 @@ static int netreg_get_properties(struct modem_data *modem)
static void add_cdma_network(struct modem_data *modem)
{
+ struct network_context *context = NULL;
/* Be sure that device is created before adding CDMA network */
if (!modem->device)
return;
@@ -1732,16 +1798,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,
@@ -1782,7 +1851,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;
}
@@ -1817,7 +1886,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)
@@ -1837,7 +1906,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;
}
@@ -1905,13 +1974,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,
@@ -1934,7 +2003,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))
@@ -2205,10 +2274,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,
@@ -2593,12 +2662,17 @@ static void network_remove(struct connman_network
*network)
static int network_connect(struct connman_network *network)
{
+ struct network_context *context;
struct modem_data *modem = connman_network_get_data(network);
DBG("%s network %p", modem->path, network);
+ context = get_context_with_network(modem->context_list, network);
+ if (!context)
+ return -ENODEV;
+
if (has_interface(modem->interfaces, OFONO_API_CM))
- return context_set_active(modem, TRUE);
+ return context_set_active(modem, context, TRUE);
else if (has_interface(modem->interfaces, OFONO_API_CDMA_CM))
return cdma_cm_set_powered(modem, TRUE);
@@ -2609,12 +2683,17 @@ static int network_connect(struct connman_network
*network)
static int network_disconnect(struct connman_network *network)
{
+ struct network_context *context;
struct modem_data *modem = connman_network_get_data(network);
DBG("%s network %p", modem->path, network);
+ context = get_context_with_network(modem->context_list, network);
+ if (!context)
+ return -ENODEV;
+
if (has_interface(modem->interfaces, OFONO_API_CM))
- return context_set_active(modem, FALSE);
+ return context_set_active(modem, context, FALSE);
else if (has_interface(modem->interfaces, OFONO_API_CDMA_CM))
return cdma_cm_set_powered(modem, FALSE);
--
2.1.4
------------------------------
Subject: Digest Footer
_______________________________________________
connman mailing list
[email protected]
https://lists.01.org/mailman/listinfo/connman
------------------------------
End of connman Digest, Vol 2, Issue 13
**************************************