summaryrefslogtreecommitdiff
path: root/drivers/atmodem
diff options
context:
space:
mode:
authorAntara Borwankar <antara.borwankar@intel.com>2019-04-24 11:24:50 +0530
committerDenis Kenzior <denkenz@gmail.com>2019-04-29 11:33:58 -0500
commit413e6ecab09a27d3d8ab825bb6f3999f12c2f468 (patch)
treee9965eddd79f217cd276f3f34dc87a1c21658b89 /drivers/atmodem
parent64df5344c5fe8e004a63ea9a912dd78b50a6d804 (diff)
downloadofono-413e6ecab09a27d3d8ab825bb6f3999f12c2f468.tar.gz
xmm7modem: handling of IPv6 address for activated context
Handled IPv6 address after activating PDP context. Received IPv6 address is of format addr + netmask in the same string in the form of "a1.a2.a3.a4.a5.a6.a7.a8.a9.a10.a11.a12.a13.a14.a15.a16. m1.m2.m3.m4.m5.m6.m7.m8.m9.m10.m11.m12.m13.m14.m15.m16"
Diffstat (limited to 'drivers/atmodem')
-rw-r--r--drivers/atmodem/atutil.c39
-rw-r--r--drivers/atmodem/atutil.h3
2 files changed, 42 insertions, 0 deletions
diff --git a/drivers/atmodem/atutil.c b/drivers/atmodem/atutil.c
index 98e3a2f8..adcca85b 100644
--- a/drivers/atmodem/atutil.c
+++ b/drivers/atmodem/atutil.c
@@ -656,6 +656,45 @@ int at_util_get_ipv4_address_and_netmask(const char *addrnetmask,
return ret;
}
+/*
+ * CGCONTRDP returns addr + netmask in the same string in the form
+ * of "a1.a2.a3.a4.a5.a6.a7.a8.a9.a10.a11.a12.a13.a14.a15.a16.m1.m2.
+ * m3.m4.m5.m6.m7.m8.m9.m10.m11.m12.m13.m14.m15.m16" for IPv6.
+ * address/netmask must be able to hold 64 characters.
+ */
+int at_util_get_ipv6_address_and_netmask(const char *addrnetmask,
+ char *address, char *netmask)
+{
+ const char *s = addrnetmask;
+ const char *net = NULL;
+
+ int ret = -EINVAL;
+ int i;
+
+ /* Count 31 dots for ipv6, less or more means error. */
+ for (i = 0; i < 33; i++, s++) {
+ s = strchr(s, '.');
+
+ if (!s)
+ break;
+
+ if (i == 15) {
+ /* set netmask ptr and break the string */
+ net = s + 1;
+ }
+ }
+
+ if (i == 31) {
+ memcpy(address, addrnetmask, net - addrnetmask);
+ address[net - addrnetmask - 1] = '\0';
+ strcpy(netmask, net);
+
+ ret = 0;
+ }
+
+ return ret;
+}
+
int at_util_gprs_auth_method_to_auth_prot(
enum ofono_gprs_auth_method auth_method)
{
diff --git a/drivers/atmodem/atutil.h b/drivers/atmodem/atutil.h
index 69e8b499..61800ff4 100644
--- a/drivers/atmodem/atutil.h
+++ b/drivers/atmodem/atutil.h
@@ -86,6 +86,9 @@ void at_util_sim_state_query_free(struct at_util_sim_state_query *req);
int at_util_get_ipv4_address_and_netmask(const char *addrnetmask,
char *address, char *netmask);
+int at_util_get_ipv6_address_and_netmask(const char *addrnetmask,
+ char *address, char *netmask);
+
int at_util_gprs_auth_method_to_auth_prot(
enum ofono_gprs_auth_method auth_method);