All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 1/3] gprs: Add list_active_contexts
@ 2019-08-12 21:31 richard.rojfors
  2019-08-12 21:31 ` [PATCH v2 2/3] gprs: Ignore activated contexts during init, list them later richard.rojfors
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: richard.rojfors @ 2019-08-12 21:31 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 689 bytes --]

From: Richard Röjfors <richard@puffinpack.se>

This is useful for instance during startup where early
activated contexts can be listed at a suitable point in time.
---
 include/gprs.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/include/gprs.h b/include/gprs.h
index 988d6102..20bdb7a4 100644
--- a/include/gprs.h
+++ b/include/gprs.h
@@ -45,6 +45,8 @@ struct ofono_gprs_driver {
 				ofono_gprs_cb_t cb, void *data);
 	void (*attached_status)(struct ofono_gprs *gprs,
 					ofono_gprs_status_cb_t cb, void *data);
+	void (*list_active_contexts)(struct ofono_gprs *gprs,
+					ofono_gprs_cb_t cb, void *data);
 };
 
 enum gprs_suspend_cause {
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 2/3] gprs: Ignore activated contexts during init, list them later
  2019-08-12 21:31 [PATCH v2 1/3] gprs: Add list_active_contexts richard.rojfors
@ 2019-08-12 21:31 ` richard.rojfors
  2019-08-13  6:43   ` Denis Kenzior
  2019-08-12 21:31 ` [PATCH v2 3/3] atmodem: Implement the list_activated_contexts callback richard.rojfors
  2019-08-13  6:42 ` [PATCH v2 1/3] gprs: Add list_active_contexts Denis Kenzior
  2 siblings, 1 reply; 6+ messages in thread
From: richard.rojfors @ 2019-08-12 21:31 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 2164 bytes --]

From: Richard Röjfors <richard@puffinpack.se>

There is an issue if an context gets auto activated early,
then provisioning might not have run yet for instance,
so a "new" context is created, which might be duplicated
by a provisioning context later.
So ignore the activated contexts until gprs is ready,
then it calls the driver to list active contexts.
---
 src/gprs.c | 22 +++++++++++++++++++++-
 1 file changed, 21 insertions(+), 1 deletion(-)

diff --git a/src/gprs.c b/src/gprs.c
index f7a2b739..3c6a8deb 100644
--- a/src/gprs.c
+++ b/src/gprs.c
@@ -1965,7 +1965,12 @@ void ofono_gprs_cid_activated(struct ofono_gprs  *gprs, unsigned int cid,
 	struct pri_context *pri_ctx;
 	struct ofono_gprs_context *gc;
 
-	DBG("");
+	DBG("cid %u", cid);
+
+	if (!__ofono_atom_get_registered(gprs->atom)) {
+		DBG("cid %u activated before atom registered", cid);
+		return;
+	}
 
 	if (l_uintset_contains(gprs->used_cids, cid)) {
 		DBG("cid %u already activated", cid);
@@ -3355,11 +3360,20 @@ remove:
 		storage_sync(imsi, SETTINGS_STORE, gprs->settings);
 }
 
+static void gprs_list_active_contexts_callback(const struct ofono_error *error,
+						void *data)
+{
+	(void)data;
+
+	DBG("error = %d", error->type);
+}
+
 static void ofono_gprs_finish_register(struct ofono_gprs *gprs)
 {
 	DBusConnection *conn = ofono_dbus_get_connection();
 	struct ofono_modem *modem = __ofono_atom_get_modem(gprs->atom);
 	const char *path = __ofono_atom_get_path(gprs->atom);
+	const struct ofono_gprs_driver *driver = gprs->driver;
 
 	if (gprs->contexts == NULL) /* Automatic provisioning failed */
 		add_context(gprs, NULL, OFONO_GPRS_CONTEXT_TYPE_INTERNET);
@@ -3383,6 +3397,12 @@ static void ofono_gprs_finish_register(struct ofono_gprs *gprs)
 					netreg_watch, gprs, NULL);
 
 	__ofono_atom_register(gprs->atom, gprs_unregister);
+
+	/* Find any context activated during init */
+	if (driver->list_active_contexts)
+		driver->list_active_contexts(gprs,
+					     gprs_list_active_contexts_callback,
+					     gprs);
 }
 
 static void spn_read_cb(const char *spn, const char *dc, void *data)
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH v2 3/3] atmodem: Implement the list_activated_contexts callback
  2019-08-12 21:31 [PATCH v2 1/3] gprs: Add list_active_contexts richard.rojfors
  2019-08-12 21:31 ` [PATCH v2 2/3] gprs: Ignore activated contexts during init, list them later richard.rojfors
@ 2019-08-12 21:31 ` richard.rojfors
  2019-08-13  6:57   ` Denis Kenzior
  2019-08-13  6:42 ` [PATCH v2 1/3] gprs: Add list_active_contexts Denis Kenzior
  2 siblings, 1 reply; 6+ messages in thread
From: richard.rojfors @ 2019-08-12 21:31 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 7060 bytes --]

From: Richard Röjfors <richard@puffinpack.se>

The callback calls cgact and cgdcont to get information
regarding any activate context.
---
 drivers/atmodem/gprs.c | 167 +++++++++++++++++++++++++++++++++--------
 1 file changed, 134 insertions(+), 33 deletions(-)

diff --git a/drivers/atmodem/gprs.c b/drivers/atmodem/gprs.c
index 10108281..81e4c30f 100644
--- a/drivers/atmodem/gprs.c
+++ b/drivers/atmodem/gprs.c
@@ -29,6 +29,7 @@
 #include <stdio.h>
 #include <errno.h>
 
+#include <ell/ell.h>
 #include <glib.h>
 
 #include <ofono/log.h>
@@ -41,6 +42,8 @@
 #include "atmodem.h"
 #include "vendor.h"
 
+#define MAX_CONTEXTS 255
+
 static const char *cgreg_prefix[] = { "+CGREG:", NULL };
 static const char *cgdcont_prefix[] = { "+CGDCONT:", NULL };
 static const char *cgact_prefix[] = { "+CGACT:", NULL };
@@ -54,6 +57,47 @@ struct gprs_data {
 	int attached;
 };
 
+struct list_contexts_data
+{
+	struct ofono_gprs *gprs;
+	void *cb;
+	void *data;
+	struct l_uintset *active_cids;
+	int ref_count;
+};
+
+static struct list_contexts_data *
+list_contexts_data_new(struct ofono_gprs *gprs, void *cb, void *data)
+{
+	struct list_contexts_data *ret;
+
+	ret = g_new0(struct list_contexts_data, 1);
+	ret->ref_count = 1;
+	ret->gprs = gprs;
+	ret->cb = cb;
+	ret->data = data;
+
+	return ret;
+}
+
+static struct list_contexts_data *
+list_contexts_data_ref(struct list_contexts_data *ld)
+{
+	ld->ref_count++;
+	return ld;
+}
+
+static void list_contexts_data_unref(gpointer user_data)
+{
+	struct list_contexts_data *ld = user_data;
+
+	if (--ld->ref_count)
+		return;
+
+	l_uintset_free(ld->active_cids);
+	g_free(ld);
+}
+
 static void at_cgatt_cb(gboolean ok, GAtResult *result, gpointer user_data)
 {
 	struct cb_data *cbd = user_data;
@@ -146,14 +190,43 @@ static void at_gprs_registration_status(struct ofono_gprs *gprs,
 	CALLBACK_WITH_FAILURE(cb, -1, data);
 }
 
+static void at_cgdcont_parse(struct ofono_gprs *gprs, GAtResult *result,
+				struct l_uintset *cids)
+{
+	GAtResultIter iter;
+
+	g_at_result_iter_init(&iter, result);
+
+	while (g_at_result_iter_next(&iter, "+CGDCONT:")) {
+		int read_cid;
+		const char *apn = NULL;
+
+		if (!g_at_result_iter_next_number(&iter, &read_cid))
+			break;
+
+		if (!l_uintset_contains(cids, read_cid))
+			continue;
+
+		/* ignore protocol */
+		g_at_result_iter_skip_next(&iter);
+
+		g_at_result_iter_next_string(&iter, &apn);
+
+		if (apn)
+			ofono_gprs_cid_activated(gprs, read_cid, apn);
+		else
+			ofono_warn("cid %d: Activated but no apn present",
+					read_cid);
+	}
+}
+
 static void at_cgdcont_read_cb(gboolean ok, GAtResult *result,
 				gpointer user_data)
 {
 	struct ofono_gprs *gprs = user_data;
 	struct gprs_data *gd = ofono_gprs_get_data(gprs);
 	int activated_cid = gd->last_auto_context_id;
-	const char *apn = NULL;
-	GAtResultIter iter;
+	struct l_uintset *cids;
 
 	DBG("ok %d", ok);
 
@@ -162,47 +235,52 @@ static void at_cgdcont_read_cb(gboolean ok, GAtResult *result,
 		return;
 	}
 
-	if (gd->last_auto_context_id == -1) {
+	if (activated_cid == -1) {
 		DBG("Context got deactivated while calling CGDCONT");
 		return;
 	}
 
-	g_at_result_iter_init(&iter, result);
+	cids = l_uintset_new(activated_cid);
 
-	while (g_at_result_iter_next(&iter, "+CGDCONT:")) {
-		int read_cid;
-
-		if (!g_at_result_iter_next_number(&iter, &read_cid))
-			break;
+	l_uintset_put(cids, activated_cid);
 
-		if (read_cid != activated_cid)
-			continue;
+	at_cgdcont_parse(gprs, result, cids);
 
-		/* ignore protocol */
-		g_at_result_iter_skip_next(&iter);
+	l_uintset_free(cids);
+}
 
-		g_at_result_iter_next_string(&iter, &apn);
+static void at_cgdcont_act_read_cb(gboolean ok, GAtResult *result,
+					gpointer user_data)
+{
+	struct list_contexts_data *ld = user_data;
+	ofono_gprs_cb_t cb = ld->cb;
+	struct ofono_error error;
 
-		break;
-	}
+	decode_at_error(&error, g_at_result_final_response(result));
 
-	if (apn)
-		ofono_gprs_cid_activated(gprs, activated_cid, apn);
+	if (!ok)
+		ofono_warn("Can't read CGDCONT context.");
 	else
-		ofono_warn("cid %u: Received activated but no apn present",
-				activated_cid);
+		at_cgdcont_parse(ld->gprs, result, ld->active_cids);
+
+	cb(&error, ld->data);
 }
 
 static void at_cgact_cb(gboolean ok, GAtResult *result, gpointer user_data)
 {
-	struct ofono_gprs *gprs = user_data;
-	struct gprs_data *gd = ofono_gprs_get_data(gprs);
+	struct list_contexts_data *ld = user_data;
+	struct gprs_data *gd = ofono_gprs_get_data(ld->gprs);
+	ofono_gprs_cb_t cb = ld->cb;
+	struct ofono_error error;
 	GAtResultIter iter;
 
-	DBG("ok %d", ok);
+	decode_at_error(&error, g_at_result_final_response(result));
 
 	if (!ok) {
 		ofono_warn("Can't read CGACT contexts.");
+
+		cb(&error, ld->data);
+
 		return;
 	}
 
@@ -222,19 +300,45 @@ static void at_cgact_cb(gboolean ok, GAtResult *result, gpointer user_data)
 			continue;
 
 		/* Flag this as auto context as it was obviously active */
-		if (gd->last_auto_context_id == 0)
+		if (gd->last_auto_context_id == -1)
 			gd->last_auto_context_id = read_cid;
 
-		if (read_cid != gd->last_auto_context_id)
-			continue;
+		if (!ld->active_cids)
+			ld->active_cids = l_uintset_new(MAX_CONTEXTS);
 
-		g_at_chat_send(gd->chat, "AT+CGDCONT?", cgdcont_prefix,
-				at_cgdcont_read_cb, gprs, NULL);
+		l_uintset_put(ld->active_cids, read_cid);
+	}
 
-		break;
+	if (ld->active_cids != NULL) {
+		if (g_at_chat_send(gd->chat, "AT+CGDCONT?", cgdcont_prefix,
+					at_cgdcont_act_read_cb, ld,
+					list_contexts_data_unref)) {
+			list_contexts_data_ref(ld);
+			return;
+		}
+
+		CALLBACK_WITH_FAILURE(cb, ld->data);
+	} else {
+		/* No active contexts found */
+		cb(&error, ld->data);
 	}
 }
 
+static void at_gprs_list_active_contexts(struct ofono_gprs *gprs,
+						ofono_gprs_cb_t cb, void *data)
+{
+	struct gprs_data *gd = ofono_gprs_get_data(gprs);
+	struct list_contexts_data *ld = list_contexts_data_new(gprs, cb, data);
+
+	if (g_at_chat_send(gd->chat, "AT+CGACT?", cgact_prefix,
+				at_cgact_cb, ld, list_contexts_data_unref))
+		return;
+
+	list_contexts_data_unref(ld);
+
+	CALLBACK_WITH_FAILURE(cb, data);
+}
+
 static void cgreg_notify(GAtResult *result, gpointer user_data)
 {
 	struct ofono_gprs *gprs = user_data;
@@ -538,10 +642,6 @@ static void gprs_initialized(gboolean ok, GAtResult *result, gpointer user_data)
 		break;
 	}
 
-	/* Check if there is any already activated contexts at init */
-	g_at_chat_send(gd->chat, "AT+CGACT?", cgact_prefix,
-			at_cgact_cb, gprs, NULL);
-
 	ofono_gprs_register(gprs);
 }
 
@@ -705,6 +805,7 @@ static const struct ofono_gprs_driver driver = {
 	.remove			= at_gprs_remove,
 	.set_attached		= at_gprs_set_attached,
 	.attached_status	= at_gprs_registration_status,
+	.list_active_contexts	= at_gprs_list_active_contexts,
 };
 
 void at_gprs_init(void)
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 1/3] gprs: Add list_active_contexts
  2019-08-12 21:31 [PATCH v2 1/3] gprs: Add list_active_contexts richard.rojfors
  2019-08-12 21:31 ` [PATCH v2 2/3] gprs: Ignore activated contexts during init, list them later richard.rojfors
  2019-08-12 21:31 ` [PATCH v2 3/3] atmodem: Implement the list_activated_contexts callback richard.rojfors
@ 2019-08-13  6:42 ` Denis Kenzior
  2 siblings, 0 replies; 6+ messages in thread
From: Denis Kenzior @ 2019-08-13  6:42 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 365 bytes --]

Hi Richard,

On 8/12/19 4:31 PM, richard.rojfors(a)gmail.com wrote:
> From: Richard Röjfors <richard@puffinpack.se>
> 
> This is useful for instance during startup where early
> activated contexts can be listed at a suitable point in time.
> ---
>   include/gprs.h | 2 ++
>   1 file changed, 2 insertions(+)
> 

Applied, thanks.

Regards,
-Denis


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 2/3] gprs: Ignore activated contexts during init, list them later
  2019-08-12 21:31 ` [PATCH v2 2/3] gprs: Ignore activated contexts during init, list them later richard.rojfors
@ 2019-08-13  6:43   ` Denis Kenzior
  0 siblings, 0 replies; 6+ messages in thread
From: Denis Kenzior @ 2019-08-13  6:43 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 840 bytes --]

Hi Richard,

On 8/12/19 4:31 PM, richard.rojfors(a)gmail.com wrote:
> From: Richard Röjfors <richard@puffinpack.se>
> 
> There is an issue if an context gets auto activated early,
> then provisioning might not have run yet for instance,
> so a "new" context is created, which might be duplicated
> by a provisioning context later.
> So ignore the activated contexts until gprs is ready,
> then it calls the driver to list active contexts.
> ---
>   src/gprs.c | 22 +++++++++++++++++++++-
>   1 file changed, 21 insertions(+), 1 deletion(-)
> 

<snip>

>   
> +static void gprs_list_active_contexts_callback(const struct ofono_error *error,
> +						void *data)
> +{
> +	(void)data;
> +

Squashed this pointless line and...

> +	DBG("error = %d", error->type);
> +}
> +

applied, thanks.

Regards,
-Denis

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH v2 3/3] atmodem: Implement the list_activated_contexts callback
  2019-08-12 21:31 ` [PATCH v2 3/3] atmodem: Implement the list_activated_contexts callback richard.rojfors
@ 2019-08-13  6:57   ` Denis Kenzior
  0 siblings, 0 replies; 6+ messages in thread
From: Denis Kenzior @ 2019-08-13  6:57 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 404 bytes --]

Hi Richard,

On 8/12/19 4:31 PM, richard.rojfors(a)gmail.com wrote:
> From: Richard Röjfors <richard@puffinpack.se>
> 
> The callback calls cgact and cgdcont to get information
> regarding any activate context.
> ---
>   drivers/atmodem/gprs.c | 167 +++++++++++++++++++++++++++++++++--------
>   1 file changed, 134 insertions(+), 33 deletions(-)
> 

Applied, thanks.

Regards,
-Denis


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-08-13  6:57 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-12 21:31 [PATCH v2 1/3] gprs: Add list_active_contexts richard.rojfors
2019-08-12 21:31 ` [PATCH v2 2/3] gprs: Ignore activated contexts during init, list them later richard.rojfors
2019-08-13  6:43   ` Denis Kenzior
2019-08-12 21:31 ` [PATCH v2 3/3] atmodem: Implement the list_activated_contexts callback richard.rojfors
2019-08-13  6:57   ` Denis Kenzior
2019-08-13  6:42 ` [PATCH v2 1/3] gprs: Add list_active_contexts Denis Kenzior

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.