Hi Antara,
On 02/15/2019 05:43 AM, Antara Borwankar wrote:
Added the implementation required to setup data channel in
ifxmodem gprs-context driver for xmm7modem vendor
---
drivers/ifxmodem/gprs-context.c | 43 +++++++++++++++++++++++++++++++++++++----
1 file changed, 39 insertions(+), 4 deletions(-)
diff --git a/drivers/ifxmodem/gprs-context.c b/drivers/ifxmodem/gprs-context.c
index 7f3628b..278d507 100644
--- a/drivers/ifxmodem/gprs-context.c
+++ b/drivers/ifxmodem/gprs-context.c
@@ -260,6 +260,22 @@ error:
failed_setup(gc, NULL, TRUE);
}
+static void cgdata_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) {
+ ofono_error("Failed to establish session");
+ failed_setup(gc, result, TRUE);
+ return;
+ }
+
+ CALLBACK_WITH_SUCCESS(gcd->cb, gcd->cb_data);
+}
+
static void cgcontrdp_cb(gboolean ok, GAtResult *result, gpointer user_data)
{
struct ofono_gprs_context *gc = user_data;
@@ -269,8 +285,11 @@ static void cgcontrdp_cb(gboolean ok, GAtResult *result, gpointer
user_data)
const char *laddrnetmask = NULL;
const char *gw = NULL;
- const char *interface;
const char *dns[3];
+ const char *ctrlpath;
+ char *datapath;
+ char buf[100];
+ const char *interface;
DBG("ok %d", ok);
@@ -327,9 +346,13 @@ static void cgcontrdp_cb(gboolean ok, GAtResult *result, gpointer
user_data)
DBG("DNS2: %s\n", gcd->dns2);
DBG("Gateway: %s\n", gcd->gateway);
- interface = ofono_modem_get_string(modem, "NetworkInterface");
+ ctrlpath = ofono_modem_get_string(modem, "CtrlPath");
+ interface = ofono_gprs_context_get_interface(gc);
+
+ sprintf(buf, "%s%c", ofono_modem_get_string(modem, "DataPath"),
+ interface[strlen(interface)-1]);
Wouldn't this fail if multiple modems are plugged in? It seems like
just basing this off the interface name is not enough.
See attached patches for an idea of how to handle this. Not fully happy
with it, so if you have other ideas please suggest.
+ datapath = g_strdup(buf);
Why do you need this strdup? Just make your life easier and use
g_strdup_printf instead of sprintf above.
Or better yet, simply use a different buffer on the stack for this.
- ofono_gprs_context_set_interface(gc, interface);
ofono_gprs_context_set_ipv4_address(gc, gcd->address, TRUE);
if (gcd->netmask[0])
@@ -340,7 +363,19 @@ static void cgcontrdp_cb(gboolean ok, GAtResult *result, gpointer
user_data)
ofono_gprs_context_set_ipv4_dns_servers(gc, dns);
- CALLBACK_WITH_SUCCESS(gcd->cb, gcd->cb_data);
+ sprintf(buf, "AT+XDATACHANNEL=1,1,\"%s\",\"%s\",2,%u",
ctrlpath,
+ datapath, gcd->active_context);
You can free datapath here actually instead of repeating the g_free
twice below.
+ g_at_chat_send(gcd->chat, buf, none_prefix, NULL, NULL, NULL);
+ sprintf(buf, "AT+CGDATA=\"M-RAW_IP\",%u", gcd->active_context);
+
+ if (g_at_chat_send(gcd->chat, buf, none_prefix, cgdata_cb,
+ gc, NULL) > 0) {
+ g_free(datapath);
+ return;
+ }
+
+ g_free(datapath);
+ CALLBACK_WITH_FAILURE(gcd->cb, gcd->cb_data);
}
static void ifx_read_settings(struct ofono_gprs_context *gc)
Regards,
-Denis