All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/7] Support for U-Blox Toby L2 modems
@ 2016-03-17 12:38 Dragos Tatulea
  2016-03-17 12:38 ` [PATCH 1/7] plugins/ublox: give names to model ids Dragos Tatulea
                   ` (6 more replies)
  0 siblings, 7 replies; 12+ messages in thread
From: Dragos Tatulea @ 2016-03-17 12:38 UTC (permalink / raw)
  To: ofono

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

This patchset adds support for Toby L2 modems in high throughput
mode.

Besides basic support, the following things are supported:
* 2/3G bearers
* bridged AND routed modes.
* Multiple primary PDP contexts.

Uptated in this patchset:
* Fixes based on review comments.
* More AT command based function names.
* Authentication: ofono supports larger usernames/passwords than
  Toby L2 does. Check against the Toby L2 upper limit.
* Routed mode: Merged cgcontrdp functions for routed and brieded.

Dongsu Park (2):
  plugins/ublox: read network mode
  ubloxmodem: add routed mode support

Dragos Tatulea (5):
  plugins/ublox: give names to model ids
  ubloxmodem: add Toby L2 gprs context driver
  plugins/ublox: enable ubloxmodem driver when possible
  plugins/ublox: support more internet contexts
  ubloxmodem: support authentication

 Makefile.am                       |   7 +
 drivers/ubloxmodem/gprs-context.c | 569 ++++++++++++++++++++++++++++++++++++++
 drivers/ubloxmodem/ubloxmodem.c   |  49 ++++
 drivers/ubloxmodem/ubloxmodem.h   |  25 ++
 plugins/ublox.c                   |  84 +++++-
 5 files changed, 722 insertions(+), 12 deletions(-)
 create mode 100644 drivers/ubloxmodem/gprs-context.c
 create mode 100644 drivers/ubloxmodem/ubloxmodem.c
 create mode 100644 drivers/ubloxmodem/ubloxmodem.h

-- 
2.5.0


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

* [PATCH 1/7] plugins/ublox: give names to model ids
  2016-03-17 12:38 [PATCH v2 0/7] Support for U-Blox Toby L2 modems Dragos Tatulea
@ 2016-03-17 12:38 ` Dragos Tatulea
  2016-03-17 14:41   ` Denis Kenzior
  2016-03-17 12:38 ` [PATCH 2/7] ubloxmodem: add Toby L2 gprs context driver Dragos Tatulea
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 12+ messages in thread
From: Dragos Tatulea @ 2016-03-17 12:38 UTC (permalink / raw)
  To: ofono

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

To make it easier to understand the code.
---
 plugins/ublox.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/plugins/ublox.c b/plugins/ublox.c
index 5e442a1..938777c 100644
--- a/plugins/ublox.c
+++ b/plugins/ublox.c
@@ -44,9 +44,17 @@
 
 static const char *none_prefix[] = { NULL };
 
+enum supported_models {
+	SARA_G270			= 1102,
+	TOBYL2_COMPATIBLE_MODE 		= 1141,
+	TOBYL2_MEDIUM_THROUGHPUT_MODE 	= 1143,
+	TOBYL2_HIGH_THROUGHPUT_MODE 	= 1146,
+};
+
 struct ublox_data {
 	GAtChat *modem;
 	GAtChat *aux;
+	int model_id;
 	enum ofono_vendor vendor_family;
 };
 
@@ -140,7 +148,6 @@ static int ublox_enable(struct ofono_modem *modem)
 {
 	struct ublox_data *data = ofono_modem_get_data(modem);
 	const char *model_str = NULL;
-	int model_id;
 
 	DBG("%p", modem);
 
@@ -152,19 +159,20 @@ static int ublox_enable(struct ofono_modem *modem)
 	 * Toby L2 devices are more complex and special than previously
 	 * supported U-Blox devices. So they need a vendor of their own.
 	 */
-	model_id = atoi(model_str);
-	switch (model_id) {
-	case 1102:
+	data->model_id = atoi(model_str);
+
+	switch (data->model_id) {
+	case SARA_G270:
 		data->vendor_family = OFONO_VENDOR_UBLOX;
 		break;
-	case 1141:
-	case 1146:
+	case TOBYL2_COMPATIBLE_MODE:
+	case TOBYL2_HIGH_THROUGHPUT_MODE:
 		data->vendor_family = OFONO_VENDOR_UBLOX_TOBY_L2;
 		break;
-	case 1143:
+	case TOBYL2_MEDIUM_THROUGHPUT_MODE:
 		DBG("low/medium throughtput profile unsupported");
 	default:
-		DBG("unknown ublox model id %d", model_id);
+		DBG("unknown ublox model id %d", data->model_id);
 		return -EINVAL;
 	}
 
-- 
2.5.0


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

* [PATCH 2/7] ubloxmodem: add Toby L2 gprs context driver
  2016-03-17 12:38 [PATCH v2 0/7] Support for U-Blox Toby L2 modems Dragos Tatulea
  2016-03-17 12:38 ` [PATCH 1/7] plugins/ublox: give names to model ids Dragos Tatulea
@ 2016-03-17 12:38 ` Dragos Tatulea
  2016-03-17 12:38 ` [PATCH 3/7] plugins/ublox: enable ubloxmodem driver when possible Dragos Tatulea
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 12+ messages in thread
From: Dragos Tatulea @ 2016-03-17 12:38 UTC (permalink / raw)
  To: ofono

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

For now the driver works only with bridged mode for 2G/3G.

Once it activates the context it reads the ip, netmask,
gw, dns and sets them in the context settings.
---
 Makefile.am                       |   7 +
 drivers/ubloxmodem/gprs-context.c | 403 ++++++++++++++++++++++++++++++++++++++
 drivers/ubloxmodem/ubloxmodem.c   |  49 +++++
 drivers/ubloxmodem/ubloxmodem.h   |  25 +++
 4 files changed, 484 insertions(+)
 create mode 100644 drivers/ubloxmodem/gprs-context.c
 create mode 100644 drivers/ubloxmodem/ubloxmodem.c
 create mode 100644 drivers/ubloxmodem/ubloxmodem.h

diff --git a/Makefile.am b/Makefile.am
index 07624a9..68c03f6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -375,6 +375,13 @@ builtin_sources += drivers/atmodem/atutil.h \
 			drivers/speedupmodem/speedupmodem.c \
 			drivers/speedupmodem/ussd.c
 
+builtin_modules += ubloxmodem
+builtin_sources += drivers/atmodem/atutil.h \
+			drivers/ubloxmodem/ubloxmodem.h \
+			drivers/ubloxmodem/ubloxmodem.c \
+			drivers/ubloxmodem/gprs-context.c
+
+
 if PHONESIM
 builtin_modules += phonesim
 builtin_sources += plugins/phonesim.c
diff --git a/drivers/ubloxmodem/gprs-context.c b/drivers/ubloxmodem/gprs-context.c
new file mode 100644
index 0000000..ccf6289
--- /dev/null
+++ b/drivers/ubloxmodem/gprs-context.c
@@ -0,0 +1,403 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2016  EndoCode AG. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#define _GNU_SOURCE
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <errno.h>
+
+#include <glib.h>
+
+#include <ofono/log.h>
+#include <ofono/modem.h>
+#include <ofono/gprs-context.h>
+
+#include "gatchat.h"
+#include "gatresult.h"
+
+#include "ubloxmodem.h"
+
+static const char *none_prefix[] = { NULL };
+static const char *cgcontrdp_prefix[] = { "+CGCONTRDP:", NULL };
+
+struct gprs_context_data {
+	GAtChat *chat;
+	unsigned int active_context;
+	char apn[OFONO_GPRS_MAX_APN_LENGTH + 1];
+	ofono_gprs_context_cb_t cb;
+	void *cb_data;
+};
+
+/*
+ * CGCONTRDP returns addr + netmask in the same string in the form
+ * of "a.b.c.d.m.m.m.m" for IPv4. IPv6 is not supported so we ignore it.
+ */
+static int set_address_and_netmask(struct ofono_gprs_context *gc,
+				const char *addrnetmask)
+{
+	char *dup = strdup(addrnetmask);
+	char *s = dup;
+
+	const char *addr = s;
+	const char *netmask = NULL;
+
+	int ret = -EINVAL;
+	int i;
+
+	/* Count 7 dots for ipv4, less or more means error. */
+	for (i = 0; i < 8; i++, s++) {
+		s = strchr(s, '.');
+		if (!s)
+			break;
+
+		if (i == 3) {
+			/* set netmask ptr and break the string */
+			netmask = s+1;
+			s[0] = 0;
+		}
+	}
+
+	if (i == 7) {
+		ofono_gprs_context_set_ipv4_address(gc, addr, 1);
+		ofono_gprs_context_set_ipv4_netmask(gc, netmask);
+
+		ret = 0;
+	}
+
+	free(dup);
+
+	return ret;
+}
+
+static void set_gprs_context_interface(struct ofono_gprs_context *gc)
+{
+	struct ofono_modem *modem;
+	const char *interface;
+
+	/* read interface name read@detection time */
+	modem = ofono_gprs_context_get_modem(gc);
+	interface = ofono_modem_get_string(modem, "NetworkInterface");
+	ofono_gprs_context_set_interface(gc, interface);
+}
+
+static void cgcontrdp_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+	struct ofono_gprs_context *gc = user_data;
+	struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+	GAtResultIter iter;
+
+	const char *laddrnetmask = NULL;
+	const char *gw = NULL;
+	const char *dns[3] = { NULL, NULL, NULL };
+
+	DBG("ok %d", ok);
+
+	if (!ok) {
+		struct ofono_error error;
+
+		decode_at_error(&error, g_at_result_final_response(result));
+		gcd->cb(&error, gcd->cb_data);
+
+		return;
+	}
+
+	g_at_result_iter_init(&iter, result);
+
+	while (g_at_result_iter_next(&iter, "+CGCONTRDP:")) {
+		/* skip cid, bearer_id, apn */
+		g_at_result_iter_skip_next(&iter);
+		g_at_result_iter_skip_next(&iter);
+		g_at_result_iter_skip_next(&iter);
+
+		if (!g_at_result_iter_next_string(&iter, &laddrnetmask))
+			break;
+
+		if (!g_at_result_iter_next_string(&iter, &gw))
+			break;
+
+		if (!g_at_result_iter_next_string(&iter, &dns[0]))
+			break;
+
+		if (!g_at_result_iter_next_string(&iter, &dns[1]))
+			break;
+	}
+
+	set_gprs_context_interface(gc);
+
+	if (!laddrnetmask || set_address_and_netmask(gc, laddrnetmask) < 0) {
+		CALLBACK_WITH_FAILURE(gcd->cb, gcd->cb_data);
+		return;
+	}
+
+	if (gw)
+		ofono_gprs_context_set_ipv4_gateway(gc, gw);
+
+	if (dns[0])
+		ofono_gprs_context_set_ipv4_dns_servers(gc, dns);
+
+	CALLBACK_WITH_SUCCESS(gcd->cb, gcd->cb_data);
+}
+
+static int ublox_send_cgcontrdp(struct ofono_gprs_context *gc)
+{
+	struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+	char buf[64];
+
+	/* read ip configuration info */
+	snprintf(buf, sizeof(buf), "AT+CGCONTRDP=%u", gcd->active_context);
+	return g_at_chat_send(gcd->chat, buf, cgcontrdp_prefix,
+				cgcontrdp_cb, gc, NULL);
+
+}
+
+static void ublox_read_settings(struct ofono_gprs_context *gc)
+{
+	struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+
+	if (ublox_send_cgcontrdp(gc) < 0)
+		CALLBACK_WITH_FAILURE(gcd->cb, gcd->cb_data);
+}
+
+static void cgact_enable_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+	struct ofono_gprs_context *gc = user_data;
+	struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+
+	DBG("ok %d", ok);
+
+	if (!ok) {
+		struct ofono_error error;
+
+		gcd->active_context = 0;
+
+		decode_at_error(&error, g_at_result_final_response(result));
+		gcd->cb(&error, gcd->cb_data);
+
+		return;
+	}
+
+	ublox_read_settings(gc);
+}
+
+static void cgdcont_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+	struct ofono_gprs_context *gc = user_data;
+	struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+	char buf[64];
+
+	DBG("ok %d", ok);
+
+	if (!ok) {
+		struct ofono_error error;
+
+		gcd->active_context = 0;
+
+		decode_at_error(&error, g_at_result_final_response(result));
+		gcd->cb(&error, gcd->cb_data);
+
+		return;
+	}
+
+	snprintf(buf, sizeof(buf), "AT+CGACT=1,%u", gcd->active_context);
+	if (g_at_chat_send(gcd->chat, buf, none_prefix,
+				cgact_enable_cb, gc, NULL))
+		return;
+
+	CALLBACK_WITH_FAILURE(gcd->cb, gcd->cb_data);
+}
+
+static void ublox_send_cgdcont(struct ofono_gprs_context *gc)
+{
+	struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+	char buf[OFONO_GPRS_MAX_APN_LENGTH + 128];
+	int len;
+
+	len = snprintf(buf, sizeof(buf), "AT+CGDCONT=%u,\"IP\"",
+				gcd->active_context);
+
+	if (gcd->apn)
+		snprintf(buf + len, sizeof(buf) - len - 3, ",\"%s\"",
+					gcd->apn);
+
+	if (g_at_chat_send(gcd->chat, buf, none_prefix,
+				cgdcont_cb, gc, NULL) > 0)
+		return;
+
+	CALLBACK_WITH_FAILURE(gcd->cb, gcd->cb_data);
+}
+
+static void ublox_gprs_activate_primary(struct ofono_gprs_context *gc,
+				const struct ofono_gprs_primary_context *ctx,
+				ofono_gprs_context_cb_t cb, void *data)
+{
+	struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+
+	/* IPv6 support not implemented */
+	if (ctx->proto != OFONO_GPRS_PROTO_IP) {
+		CALLBACK_WITH_FAILURE(cb, data);
+		return;
+	}
+
+	DBG("cid %u", ctx->cid);
+
+	gcd->active_context = ctx->cid;
+	if (!gcd->active_context) {
+		ofono_error("can't activate more contexts");
+		CALLBACK_WITH_FAILURE(cb, data);
+		return;
+	}
+
+	gcd->cb = cb;
+	gcd->cb_data = data;
+	memcpy(gcd->apn, ctx->apn, sizeof(ctx->apn));
+
+	ublox_send_cgdcont(gc);
+}
+
+static void cgact_disable_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+	struct ofono_gprs_context *gc = user_data;
+	struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+
+	DBG("ok %d", ok);
+
+	if (!ok) {
+		CALLBACK_WITH_FAILURE(gcd->cb, gcd->cb_data);
+		return;
+	}
+
+	gcd->active_context = 0;
+
+	CALLBACK_WITH_SUCCESS(gcd->cb, gcd->cb_data);
+}
+
+static void ublox_gprs_deactivate_primary(struct ofono_gprs_context *gc,
+					unsigned int cid,
+					ofono_gprs_context_cb_t cb, void *data)
+{
+	struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+	char buf[64];
+
+	DBG("cid %u", cid);
+
+	gcd->cb = cb;
+	gcd->cb_data = data;
+
+	snprintf(buf, sizeof(buf), "AT+CGACT=0,%u", gcd->active_context);
+	g_at_chat_send(gcd->chat, buf, none_prefix,
+			cgact_disable_cb, gc, NULL);
+}
+
+static void cgev_notify(GAtResult *result, gpointer user_data)
+{
+	struct ofono_gprs_context *gc = user_data;
+	struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+	GAtResultIter iter;
+	const char *event;
+	gint cid;
+
+	g_at_result_iter_init(&iter, result);
+
+	if (!g_at_result_iter_next(&iter, "+CGEV:"))
+		return;
+
+	if (!g_at_result_iter_next_unquoted_string(&iter, &event))
+		return;
+
+	if (g_str_has_prefix(event, "NW PDN DEACT")) {
+		if (!g_at_result_iter_skip_next(&iter))
+			return;
+	} else if (g_str_has_prefix(event, "NW DEACT") == FALSE)
+		return;
+
+	if (!g_at_result_iter_skip_next(&iter))
+		return;
+
+	if (!g_at_result_iter_next_number(&iter, &cid))
+		return;
+
+	DBG("cid %d", cid);
+
+	if ((unsigned int) cid != gcd->active_context)
+		return;
+
+	ofono_gprs_context_deactivated(gc, gcd->active_context);
+	gcd->active_context = 0;
+}
+
+
+static int ublox_gprs_context_probe(struct ofono_gprs_context *gc,
+					unsigned int vendor, void *data)
+{
+	GAtChat *chat = data;
+	struct gprs_context_data *gcd;
+
+	DBG("");
+
+	gcd = g_try_new0(struct gprs_context_data, 1);
+	if (gcd == NULL)
+		return -ENOMEM;
+
+	gcd->chat = g_at_chat_clone(chat);
+
+	ofono_gprs_context_set_data(gc, gcd);
+
+	g_at_chat_register(chat, "+CGEV:", cgev_notify, FALSE, gc, NULL);
+
+	return 0;
+}
+
+static void ublox_gprs_context_remove(struct ofono_gprs_context *gc)
+{
+	struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+
+	DBG("");
+
+	ofono_gprs_context_set_data(gc, NULL);
+
+	g_at_chat_unref(gcd->chat);
+
+	memset(gcd, 0, sizeof(*gcd));
+}
+
+static struct ofono_gprs_context_driver driver = {
+	.name			= "ubloxmodem",
+	.probe			= ublox_gprs_context_probe,
+	.remove			= ublox_gprs_context_remove,
+	.activate_primary	= ublox_gprs_activate_primary,
+	.deactivate_primary	= ublox_gprs_deactivate_primary,
+};
+
+void ublox_gprs_context_init(void)
+{
+	ofono_gprs_context_driver_register(&driver);
+}
+
+void ublox_gprs_context_exit(void)
+{
+	ofono_gprs_context_driver_unregister(&driver);
+}
diff --git a/drivers/ubloxmodem/ubloxmodem.c b/drivers/ubloxmodem/ubloxmodem.c
new file mode 100644
index 0000000..7fc671e
--- /dev/null
+++ b/drivers/ubloxmodem/ubloxmodem.c
@@ -0,0 +1,49 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2016  Endocode AG. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glib.h>
+#include <gatchat.h>
+
+#define OFONO_API_SUBJECT_TO_CHANGE
+#include <ofono/plugin.h>
+#include <ofono/types.h>
+
+#include "ubloxmodem.h"
+
+static int ubloxmodem_init(void)
+{
+	ublox_gprs_context_init();
+
+	return 0;
+}
+
+static void ubloxmodem_exit(void)
+{
+	ublox_gprs_context_exit();
+}
+
+OFONO_PLUGIN_DEFINE(ubloxmodem, "U-Blox Toby L2 high speed modem driver",
+			VERSION, OFONO_PLUGIN_PRIORITY_DEFAULT,
+			ubloxmodem_init, ubloxmodem_exit)
diff --git a/drivers/ubloxmodem/ubloxmodem.h b/drivers/ubloxmodem/ubloxmodem.h
new file mode 100644
index 0000000..0c8a621
--- /dev/null
+++ b/drivers/ubloxmodem/ubloxmodem.h
@@ -0,0 +1,25 @@
+/*
+ *
+ *  oFono - Open Source Telephony
+ *
+ *  Copyright (C) 2016  Endocode AG. All rights reserved.
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License version 2 as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#include <drivers/atmodem/atutil.h>
+
+extern void ublox_gprs_context_init(void);
+extern void ublox_gprs_context_exit(void);
-- 
2.5.0


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

* [PATCH 3/7] plugins/ublox: enable ubloxmodem driver when possible
  2016-03-17 12:38 [PATCH v2 0/7] Support for U-Blox Toby L2 modems Dragos Tatulea
  2016-03-17 12:38 ` [PATCH 1/7] plugins/ublox: give names to model ids Dragos Tatulea
  2016-03-17 12:38 ` [PATCH 2/7] ubloxmodem: add Toby L2 gprs context driver Dragos Tatulea
@ 2016-03-17 12:38 ` Dragos Tatulea
  2016-03-17 14:53   ` Denis Kenzior
  2016-03-17 12:38 ` [PATCH 4/7] plugins/ublox: support more internet contexts Dragos Tatulea
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 12+ messages in thread
From: Dragos Tatulea @ 2016-03-17 12:38 UTC (permalink / raw)
  To: ofono

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

Where possible means Toby L2 in high speed mode.

The bridge mode is set before enabling the modem because the
driver requires this.
---
 plugins/ublox.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/plugins/ublox.c b/plugins/ublox.c
index 938777c..544d429 100644
--- a/plugins/ublox.c
+++ b/plugins/ublox.c
@@ -141,6 +141,11 @@ static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
 		return;
 	}
 
+	if (data->model_id == TOBYL2_HIGH_THROUGHPUT_MODE)
+		/* use bridged mode until routed mode support is added */
+		g_at_chat_send(data->aux, "AT+UBMCONF=2", none_prefix,
+						NULL, NULL, NULL);
+
 	ofono_modem_set_powered(modem, TRUE);
 }
 
@@ -288,13 +293,19 @@ static void ublox_post_sim(struct ofono_modem *modem)
 	struct ublox_data *data = ofono_modem_get_data(modem);
 	struct ofono_gprs *gprs;
 	struct ofono_gprs_context *gc;
+	GAtChat *chat = data->modem ? data->modem : data->aux;
 
 	DBG("%p", modem);
 
 	gprs = ofono_gprs_create(modem, data->vendor_family, "atmodem",
 					data->aux);
-	gc = ofono_gprs_context_create(modem, data->vendor_family, "atmodem",
-					data->modem ? data->modem : data->aux);
+	if (data->model_id == TOBYL2_HIGH_THROUGHPUT_MODE)
+		gc = ofono_gprs_context_create(modem, data->vendor_family,
+						"ubloxmodem", chat);
+
+	else
+		gc = ofono_gprs_context_create(modem, data->vendor_family,
+						"atmodem", chat);
 
 	if (gprs && gc)
 		ofono_gprs_add_context(gprs, gc);
-- 
2.5.0


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

* [PATCH 4/7] plugins/ublox: support more internet contexts
  2016-03-17 12:38 [PATCH v2 0/7] Support for U-Blox Toby L2 modems Dragos Tatulea
                   ` (2 preceding siblings ...)
  2016-03-17 12:38 ` [PATCH 3/7] plugins/ublox: enable ubloxmodem driver when possible Dragos Tatulea
@ 2016-03-17 12:38 ` Dragos Tatulea
  2016-03-17 14:54   ` Denis Kenzior
  2016-03-17 12:38 ` [PATCH 5/7] ubloxmodem: support authentication Dragos Tatulea
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 12+ messages in thread
From: Dragos Tatulea @ 2016-03-17 12:38 UTC (permalink / raw)
  To: ofono

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

Create multiple gprs-context instances and let the gprs core use
them as it sees fit.

Only for Toby L2.
---
 plugins/ublox.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/plugins/ublox.c b/plugins/ublox.c
index 544d429..092ba64 100644
--- a/plugins/ublox.c
+++ b/plugins/ublox.c
@@ -294,21 +294,25 @@ static void ublox_post_sim(struct ofono_modem *modem)
 	struct ofono_gprs *gprs;
 	struct ofono_gprs_context *gc;
 	GAtChat *chat = data->modem ? data->modem : data->aux;
+	const char *driver = data->model_id == TOBYL2_HIGH_THROUGHPUT_MODE ?
+						"ubloxmodem" : "atmodem";
+	/* Toby L2: Create same number of contexts as supported PDP contexts. */
+	int ncontexts = data->model_id == TOBYL2_HIGH_THROUGHPUT_MODE ? 8 : 1;
 
 	DBG("%p", modem);
 
 	gprs = ofono_gprs_create(modem, data->vendor_family, "atmodem",
 					data->aux);
-	if (data->model_id == TOBYL2_HIGH_THROUGHPUT_MODE)
-		gc = ofono_gprs_context_create(modem, data->vendor_family,
-						"ubloxmodem", chat);
 
-	else
+	while (ncontexts) {
 		gc = ofono_gprs_context_create(modem, data->vendor_family,
-						"atmodem", chat);
+						driver, chat);
 
-	if (gprs && gc)
-		ofono_gprs_add_context(gprs, gc);
+		if (gprs && gc)
+			ofono_gprs_add_context(gprs, gc);
+
+		--ncontexts;
+	}
 }
 
 static void ublox_post_online(struct ofono_modem *modem)
-- 
2.5.0


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

* [PATCH 5/7] ubloxmodem: support authentication
  2016-03-17 12:38 [PATCH v2 0/7] Support for U-Blox Toby L2 modems Dragos Tatulea
                   ` (3 preceding siblings ...)
  2016-03-17 12:38 ` [PATCH 4/7] plugins/ublox: support more internet contexts Dragos Tatulea
@ 2016-03-17 12:38 ` Dragos Tatulea
  2016-03-17 12:38 ` [PATCH 6/7] plugins/ublox: read network mode Dragos Tatulea
  2016-03-17 12:38 ` [PATCH 7/7] ubloxmodem: add routed mode support Dragos Tatulea
  6 siblings, 0 replies; 12+ messages in thread
From: Dragos Tatulea @ 2016-03-17 12:38 UTC (permalink / raw)
  To: ofono

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

If username and password specified, issue an UAUTHREQ
command with the configured authentication method, selected cid
and credentials.
---
 drivers/ubloxmodem/gprs-context.c | 78 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 77 insertions(+), 1 deletion(-)

diff --git a/drivers/ubloxmodem/gprs-context.c b/drivers/ubloxmodem/gprs-context.c
index ccf6289..778ff85 100644
--- a/drivers/ubloxmodem/gprs-context.c
+++ b/drivers/ubloxmodem/gprs-context.c
@@ -48,6 +48,9 @@ struct gprs_context_data {
 	GAtChat *chat;
 	unsigned int active_context;
 	char apn[OFONO_GPRS_MAX_APN_LENGTH + 1];
+	char username[OFONO_GPRS_MAX_USERNAME_LENGTH + 1];
+	char password[OFONO_GPRS_MAX_PASSWORD_LENGTH + 1];
+	enum ofono_gprs_auth_method auth_method;
 	ofono_gprs_context_cb_t cb;
 	void *cb_data;
 };
@@ -250,11 +253,67 @@ static void ublox_send_cgdcont(struct ofono_gprs_context *gc)
 	CALLBACK_WITH_FAILURE(gcd->cb, gcd->cb_data);
 }
 
+static void uauthreq_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+	struct ofono_gprs_context *gc = user_data;
+	struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+
+	DBG("ok %d", ok);
+
+	if (!ok) {
+		struct ofono_error error;
+
+		gcd->active_context = 0;
+
+		decode_at_error(&error, g_at_result_final_response(result));
+		gcd->cb(&error, gcd->cb_data);
+
+		return;
+	}
+
+	ublox_send_cgdcont(gc);
+}
+
+#define UBLOX_MAX_USER_LEN 50
+#define UBLOX_MAX_PASS_LEN 50
+
+static void ublox_send_uauthreq(struct ofono_gprs_context *gc)
+{
+	struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+	char buf[UBLOX_MAX_USER_LEN + UBLOX_MAX_PASS_LEN + 32];
+	unsigned auth_method;
+
+	switch (gcd->auth_method) {
+	case OFONO_GPRS_AUTH_METHOD_PAP:
+		auth_method = 1;
+		break;
+	case OFONO_GPRS_AUTH_METHOD_CHAP:
+		auth_method = 2;
+		break;
+	default:
+		ofono_error("Unsupported auth type %u", gcd->auth_method);
+		goto error;
+	}
+
+	snprintf(buf, sizeof(buf), "AT+UAUTHREQ=%u,%u,\"%s\",\"%s\"",
+			gcd->active_context, auth_method,
+			gcd->username, gcd->password);
+
+	/* If this failed, we will see it during context activation. */
+	if (g_at_chat_send(gcd->chat, buf, none_prefix,
+				uauthreq_cb, gc, NULL) > 0)
+		return;
+
+error:
+	CALLBACK_WITH_FAILURE(gcd->cb, gcd->cb_data);
+}
+
 static void ublox_gprs_activate_primary(struct ofono_gprs_context *gc,
 				const struct ofono_gprs_primary_context *ctx,
 				ofono_gprs_context_cb_t cb, void *data)
 {
 	struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+	size_t u_len, p_len;
 
 	/* IPv6 support not implemented */
 	if (ctx->proto != OFONO_GPRS_PROTO_IP) {
@@ -273,9 +332,26 @@ static void ublox_gprs_activate_primary(struct ofono_gprs_context *gc,
 
 	gcd->cb = cb;
 	gcd->cb_data = data;
+
+	gcd->auth_method = ctx->auth_method;
 	memcpy(gcd->apn, ctx->apn, sizeof(ctx->apn));
 
-	ublox_send_cgdcont(gc);
+	u_len = strlen(ctx->username);
+	p_len = strlen(ctx->password);
+
+	if (u_len && p_len) {
+		if (u_len >= UBLOX_MAX_USER_LEN || p_len >= UBLOX_MAX_PASS_LEN) {
+			ofono_error("Toby L2: user or password length too big");
+			CALLBACK_WITH_FAILURE(cb, data);
+
+			return;
+		}
+
+		memcpy(gcd->username, ctx->username, sizeof(gcd->username));
+		memcpy(gcd->password, ctx->password, sizeof(gcd->password));
+		ublox_send_uauthreq(gc);
+	} else
+		ublox_send_cgdcont(gc);
 }
 
 static void cgact_disable_cb(gboolean ok, GAtResult *result, gpointer user_data)
-- 
2.5.0


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

* [PATCH 6/7] plugins/ublox: read network mode
  2016-03-17 12:38 [PATCH v2 0/7] Support for U-Blox Toby L2 modems Dragos Tatulea
                   ` (4 preceding siblings ...)
  2016-03-17 12:38 ` [PATCH 5/7] ubloxmodem: support authentication Dragos Tatulea
@ 2016-03-17 12:38 ` Dragos Tatulea
  2016-03-17 15:09   ` Denis Kenzior
  2016-03-17 12:38 ` [PATCH 7/7] ubloxmodem: add routed mode support Dragos Tatulea
  6 siblings, 1 reply; 12+ messages in thread
From: Dragos Tatulea @ 2016-03-17 12:38 UTC (permalink / raw)
  To: ofono

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

From: Dongsu Park <dongsu@endocode.com>

Read network mode into modem string. This will let the gprs-context
drive know what to do.
---
 plugins/ublox.c | 47 ++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 42 insertions(+), 5 deletions(-)

diff --git a/plugins/ublox.c b/plugins/ublox.c
index 092ba64..d3361a3 100644
--- a/plugins/ublox.c
+++ b/plugins/ublox.c
@@ -42,6 +42,7 @@
 #include <drivers/atmodem/atutil.h>
 #include <drivers/atmodem/vendor.h>
 
+static const char *ubmconf_prefix[] = { "+UBMCONF:", NULL };
 static const char *none_prefix[] = { NULL };
 
 enum supported_models {
@@ -51,11 +52,17 @@ enum supported_models {
 	TOBYL2_HIGH_THROUGHPUT_MODE 	= 1146,
 };
 
+enum ublox_net_mode {
+	UBLOX_TOBYL2_NET_MODE_ROUTER = 1,
+	UBLOX_TOBYL2_NET_MODE_BRIDGE = 2,
+};
+
 struct ublox_data {
 	GAtChat *modem;
 	GAtChat *aux;
 	int model_id;
 	enum ofono_vendor vendor_family;
+	enum ublox_net_mode net_mode;
 };
 
 static void ublox_debug(const char *str, void *user_data)
@@ -92,6 +99,39 @@ static void ublox_remove(struct ofono_modem *modem)
 	g_free(data);
 }
 
+static void read_ubmconf_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+	struct ofono_modem *modem = (struct ofono_modem *) user_data;
+	struct ublox_data *data = ofono_modem_get_data(modem);
+	int mode = 0;
+	GAtResultIter iter;
+
+	g_at_result_iter_init(&iter, result);
+
+	while (!g_at_result_iter_next(&iter, "+UBMCONF:"))
+		;	/* skip every other line that is not UBMCONF */
+
+	g_at_result_iter_next_number(&iter, &mode);
+
+	data->net_mode = mode;
+	DBG("mode=%d", mode);
+	if (mode == 1)
+		ofono_modem_set_string(modem, "NetworkMode", "routed");
+	else if (mode == 2)
+		ofono_modem_set_string(modem, "NetworkMode", "bridged");
+}
+
+static void read_net_mode(struct ofono_modem *modem)
+{
+	struct ublox_data *data = ofono_modem_get_data(modem);
+
+	if (!data->aux)
+		return;
+
+	g_at_chat_send(data->aux, "AT+UBMCONF?",
+			ubmconf_prefix, read_ubmconf_cb, modem, NULL);
+}
+
 static GAtChat *open_device(struct ofono_modem *modem,
 				const char *key, char *debug)
 {
@@ -141,11 +181,6 @@ static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
 		return;
 	}
 
-	if (data->model_id == TOBYL2_HIGH_THROUGHPUT_MODE)
-		/* use bridged mode until routed mode support is added */
-		g_at_chat_send(data->aux, "AT+UBMCONF=2", none_prefix,
-						NULL, NULL, NULL);
-
 	ofono_modem_set_powered(modem, TRUE);
 }
 
@@ -205,6 +240,8 @@ static int ublox_enable(struct ofono_modem *modem)
 	g_at_chat_send(data->aux, "ATE0 +CMEE=1", none_prefix,
 					NULL, NULL, NULL);
 
+	read_net_mode(modem);
+
 	g_at_chat_send(data->aux, "AT+CFUN=4", none_prefix,
 					cfun_enable, modem, NULL);
 
-- 
2.5.0


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

* [PATCH 7/7] ubloxmodem: add routed mode support
  2016-03-17 12:38 [PATCH v2 0/7] Support for U-Blox Toby L2 modems Dragos Tatulea
                   ` (5 preceding siblings ...)
  2016-03-17 12:38 ` [PATCH 6/7] plugins/ublox: read network mode Dragos Tatulea
@ 2016-03-17 12:38 ` Dragos Tatulea
  6 siblings, 0 replies; 12+ messages in thread
From: Dragos Tatulea @ 2016-03-17 12:38 UTC (permalink / raw)
  To: ofono

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

From: Dongsu Park <dongsu@endocode.com>

Routed mode needs a different treatment than bridged mode:

* UIPCONF needs to be used for reading the interface ip configuratuion.
The spec says that DHCP should work on that interface but it doesn't. So
we read the first ip in the dhcp range and use that.

* CGCONTRDP: only DNS configuration is read
---
 drivers/ubloxmodem/gprs-context.c | 104 +++++++++++++++++++++++++++++++++++---
 1 file changed, 97 insertions(+), 7 deletions(-)

diff --git a/drivers/ubloxmodem/gprs-context.c b/drivers/ubloxmodem/gprs-context.c
index 778ff85..77a85c4 100644
--- a/drivers/ubloxmodem/gprs-context.c
+++ b/drivers/ubloxmodem/gprs-context.c
@@ -43,6 +43,7 @@
 
 static const char *none_prefix[] = { NULL };
 static const char *cgcontrdp_prefix[] = { "+CGCONTRDP:", NULL };
+static const char *uipconf_prefix[] = { "+UIPCONF:", NULL };
 
 struct gprs_context_data {
 	GAtChat *chat;
@@ -107,6 +108,15 @@ static void set_gprs_context_interface(struct ofono_gprs_context *gc)
 	ofono_gprs_context_set_interface(gc, interface);
 }
 
+static const char *ublox_network_mode(struct ofono_gprs_context *gc)
+{
+	struct ofono_modem *modem;
+
+	modem = ofono_gprs_context_get_modem(gc);
+	return ofono_modem_get_string(modem, "NetworkMode");
+
+}
+
 static void cgcontrdp_cb(gboolean ok, GAtResult *result, gpointer user_data)
 {
 	struct ofono_gprs_context *gc = user_data;
@@ -151,13 +161,16 @@ static void cgcontrdp_cb(gboolean ok, GAtResult *result, gpointer user_data)
 
 	set_gprs_context_interface(gc);
 
-	if (!laddrnetmask || set_address_and_netmask(gc, laddrnetmask) < 0) {
-		CALLBACK_WITH_FAILURE(gcd->cb, gcd->cb_data);
-		return;
-	}
+	if (g_str_equal(ublox_network_mode(gc), "bridged")) {
+		if (!laddrnetmask ||
+			set_address_and_netmask(gc, laddrnetmask) < 0) {
+			CALLBACK_WITH_FAILURE(gcd->cb, gcd->cb_data);
+			return;
+		}
 
-	if (gw)
-		ofono_gprs_context_set_ipv4_gateway(gc, gw);
+		if (gw)
+			ofono_gprs_context_set_ipv4_gateway(gc, gw);
+	}
 
 	if (dns[0])
 		ofono_gprs_context_set_ipv4_dns_servers(gc, dns);
@@ -177,11 +190,88 @@ static int ublox_send_cgcontrdp(struct ofono_gprs_context *gc)
 
 }
 
+static void uipconf_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+	struct ofono_gprs_context *gc = user_data;
+	struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+	GAtResultIter iter;
+	const char *gw, *netmask, *ipaddr, *dhcp_range_start, *dhcp_range_end;
+	gboolean found = FALSE;
+
+	DBG("ok %d", ok);
+
+	if (!ok) {
+		struct ofono_error error;
+
+		decode_at_error(&error, g_at_result_final_response(result));
+		gcd->cb(&error, gcd->cb_data);
+
+		return;
+	}
+
+	g_at_result_iter_init(&iter, result);
+
+	/* for example, +UIPCONF: entry looks like:
+	 * +UIPCONF: "192.168.1.1","255.255.255.0","192.168.1.100",
+	 *           "192.168.1.100","fe80::48a5:b2ff:fe6f:5f86/64"
+	 */
+	while (g_at_result_iter_next(&iter, "+UIPCONF:")) {
+		if (!g_at_result_iter_next_string(&iter, &gw))
+			continue;
+
+		if (!g_at_result_iter_next_string(&iter, &netmask))
+			continue;
+
+		if (!g_at_result_iter_next_string(&iter, &dhcp_range_start))
+			continue;
+
+		if (!g_at_result_iter_next_string(&iter, &dhcp_range_end))
+			continue;
+
+		/* skip other entries like IPv6 networks */
+		found = TRUE;
+		break;
+	}
+
+	if (!found)
+		goto error;
+
+	if (dhcp_range_start && dhcp_range_end) {
+		/* dhcp doesn't seem to work properly, so take
+		 * first address in range.
+		 */
+		ipaddr = dhcp_range_start;
+		ofono_gprs_context_set_ipv4_address(gc, ipaddr, 1);
+	}
+
+	if (netmask)
+		ofono_gprs_context_set_ipv4_netmask(gc, netmask);
+
+	if (gw)
+		ofono_gprs_context_set_ipv4_gateway(gc, gw);
+
+	/* read dns */
+	if (ublox_send_cgcontrdp(gc) > 0)
+		return;
+
+error:
+	CALLBACK_WITH_FAILURE(gcd->cb, gcd->cb_data);
+}
+
 static void ublox_read_settings(struct ofono_gprs_context *gc)
 {
 	struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+	int ret = 0;
+	char buf[64];
+
+	if (g_str_equal(ublox_network_mode(gc), "routed")) {
+		snprintf(buf, sizeof(buf), "AT+UIPCONF?");
+		ret = g_at_chat_send(gcd->chat, buf, uipconf_prefix,
+					uipconf_cb, gc, NULL);
+	} else
+		ret = ublox_send_cgcontrdp(gc);
 
-	if (ublox_send_cgcontrdp(gc) < 0)
+	if (ret <= 0)
 		CALLBACK_WITH_FAILURE(gcd->cb, gcd->cb_data);
 }
 
-- 
2.5.0


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

* Re: [PATCH 1/7] plugins/ublox: give names to model ids
  2016-03-17 12:38 ` [PATCH 1/7] plugins/ublox: give names to model ids Dragos Tatulea
@ 2016-03-17 14:41   ` Denis Kenzior
  0 siblings, 0 replies; 12+ messages in thread
From: Denis Kenzior @ 2016-03-17 14:41 UTC (permalink / raw)
  To: ofono

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

Hi Dragos,

On 03/17/2016 07:38 AM, Dragos Tatulea wrote:
> To make it easier to understand the code.
> ---
>   plugins/ublox.c | 24 ++++++++++++++++--------
>   1 file changed, 16 insertions(+), 8 deletions(-)
>

Applied, thanks.

Regards,
-Denis


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

* Re: [PATCH 3/7] plugins/ublox: enable ubloxmodem driver when possible
  2016-03-17 12:38 ` [PATCH 3/7] plugins/ublox: enable ubloxmodem driver when possible Dragos Tatulea
@ 2016-03-17 14:53   ` Denis Kenzior
  0 siblings, 0 replies; 12+ messages in thread
From: Denis Kenzior @ 2016-03-17 14:53 UTC (permalink / raw)
  To: ofono

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

Hi Dragos,

On 03/17/2016 07:38 AM, Dragos Tatulea wrote:
> Where possible means Toby L2 in high speed mode.
>
> The bridge mode is set before enabling the modem because the
> driver requires this.
> ---
>   plugins/ublox.c | 15 +++++++++++++--
>   1 file changed, 13 insertions(+), 2 deletions(-)
>

Applied, thanks.

Regards,
-Denis


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

* Re: [PATCH 4/7] plugins/ublox: support more internet contexts
  2016-03-17 12:38 ` [PATCH 4/7] plugins/ublox: support more internet contexts Dragos Tatulea
@ 2016-03-17 14:54   ` Denis Kenzior
  0 siblings, 0 replies; 12+ messages in thread
From: Denis Kenzior @ 2016-03-17 14:54 UTC (permalink / raw)
  To: ofono

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

Hi Dragos,

On 03/17/2016 07:38 AM, Dragos Tatulea wrote:
> Create multiple gprs-context instances and let the gprs core use
> them as it sees fit.
>
> Only for Toby L2.
> ---
>   plugins/ublox.c | 18 +++++++++++-------
>   1 file changed, 11 insertions(+), 7 deletions(-)
>

Applied, thanks.

Regards,
-Denis


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

* Re: [PATCH 6/7] plugins/ublox: read network mode
  2016-03-17 12:38 ` [PATCH 6/7] plugins/ublox: read network mode Dragos Tatulea
@ 2016-03-17 15:09   ` Denis Kenzior
  0 siblings, 0 replies; 12+ messages in thread
From: Denis Kenzior @ 2016-03-17 15:09 UTC (permalink / raw)
  To: ofono

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

Hi Dongsu,

On 03/17/2016 07:38 AM, Dragos Tatulea wrote:
> From: Dongsu Park <dongsu@endocode.com>
>
> Read network mode into modem string. This will let the gprs-context
> drive know what to do.
> ---
>   plugins/ublox.c | 47 ++++++++++++++++++++++++++++++++++++++++++-----
>   1 file changed, 42 insertions(+), 5 deletions(-)
>
> diff --git a/plugins/ublox.c b/plugins/ublox.c
> index 092ba64..d3361a3 100644
> --- a/plugins/ublox.c
> +++ b/plugins/ublox.c
> @@ -42,6 +42,7 @@
>   #include <drivers/atmodem/atutil.h>
>   #include <drivers/atmodem/vendor.h>
>
> +static const char *ubmconf_prefix[] = { "+UBMCONF:", NULL };
>   static const char *none_prefix[] = { NULL };
>
>   enum supported_models {
> @@ -51,11 +52,17 @@ enum supported_models {
>   	TOBYL2_HIGH_THROUGHPUT_MODE 	= 1146,
>   };
>
> +enum ublox_net_mode {
> +	UBLOX_TOBYL2_NET_MODE_ROUTER = 1,
> +	UBLOX_TOBYL2_NET_MODE_BRIDGE = 2,
> +};
> +
>   struct ublox_data {
>   	GAtChat *modem;
>   	GAtChat *aux;
>   	int model_id;
>   	enum ofono_vendor vendor_family;
> +	enum ublox_net_mode net_mode;
>   };
>
>   static void ublox_debug(const char *str, void *user_data)
> @@ -92,6 +99,39 @@ static void ublox_remove(struct ofono_modem *modem)
>   	g_free(data);
>   }
>
> +static void read_ubmconf_cb(gboolean ok, GAtResult *result, gpointer user_data)
> +{
> +	struct ofono_modem *modem = (struct ofono_modem *) user_data;
> +	struct ublox_data *data = ofono_modem_get_data(modem);
> +	int mode = 0;
> +	GAtResultIter iter;
> +
> +	g_at_result_iter_init(&iter, result);
> +
> +	while (!g_at_result_iter_next(&iter, "+UBMCONF:"))
> +		;	/* skip every other line that is not UBMCONF */

g_at_result_iter_next already skips all lines that are not prefixed with 
the prefix.  So this part doesn't seem right.

> +
> +	g_at_result_iter_next_number(&iter, &mode);

Do you want to check the error return here?

> +
> +	data->net_mode = mode;
> +	DBG("mode=%d", mode);

doc/coding-style.txt item M1.

> +	if (mode == 1)
> +		ofono_modem_set_string(modem, "NetworkMode", "routed");
> +	else if (mode == 2)
> +		ofono_modem_set_string(modem, "NetworkMode", "bridged");
> +}
> +
> +static void read_net_mode(struct ofono_modem *modem)
> +{
> +	struct ublox_data *data = ofono_modem_get_data(modem);
> +
> +	if (!data->aux)
> +		return;
> +
> +	g_at_chat_send(data->aux, "AT+UBMCONF?",
> +			ubmconf_prefix, read_ubmconf_cb, modem, NULL);
> +}
> +
>   static GAtChat *open_device(struct ofono_modem *modem,
>   				const char *key, char *debug)
>   {
> @@ -141,11 +181,6 @@ static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
>   		return;
>   	}
>
> -	if (data->model_id == TOBYL2_HIGH_THROUGHPUT_MODE)
> -		/* use bridged mode until routed mode support is added */
> -		g_at_chat_send(data->aux, "AT+UBMCONF=2", none_prefix,
> -						NULL, NULL, NULL);
> -
>   	ofono_modem_set_powered(modem, TRUE);
>   }
>
> @@ -205,6 +240,8 @@ static int ublox_enable(struct ofono_modem *modem)
>   	g_at_chat_send(data->aux, "ATE0 +CMEE=1", none_prefix,
>   					NULL, NULL, NULL);
>
> +	read_net_mode(modem);
> +
>   	g_at_chat_send(data->aux, "AT+CFUN=4", none_prefix,
>   					cfun_enable, modem, NULL);
>
>

Regards,
-Denis

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

end of thread, other threads:[~2016-03-17 15:09 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-03-17 12:38 [PATCH v2 0/7] Support for U-Blox Toby L2 modems Dragos Tatulea
2016-03-17 12:38 ` [PATCH 1/7] plugins/ublox: give names to model ids Dragos Tatulea
2016-03-17 14:41   ` Denis Kenzior
2016-03-17 12:38 ` [PATCH 2/7] ubloxmodem: add Toby L2 gprs context driver Dragos Tatulea
2016-03-17 12:38 ` [PATCH 3/7] plugins/ublox: enable ubloxmodem driver when possible Dragos Tatulea
2016-03-17 14:53   ` Denis Kenzior
2016-03-17 12:38 ` [PATCH 4/7] plugins/ublox: support more internet contexts Dragos Tatulea
2016-03-17 14:54   ` Denis Kenzior
2016-03-17 12:38 ` [PATCH 5/7] ubloxmodem: support authentication Dragos Tatulea
2016-03-17 12:38 ` [PATCH 6/7] plugins/ublox: read network mode Dragos Tatulea
2016-03-17 15:09   ` Denis Kenzior
2016-03-17 12:38 ` [PATCH 7/7] ubloxmodem: add routed mode support Dragos Tatulea

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.