From: Dongsu Park <dongsu(a)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 76f7fcf..9cfba33 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 {
@@ -52,11 +53,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)
@@ -93,6 +100,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)
{
@@ -142,11 +182,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);
}
@@ -207,6 +242,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