From aadd4668f142bc13985aa956b84614b7457dd96e Mon Sep 17 00:00:00 2001 From: Ankit Navik Date: Wed, 13 Sep 2017 07:58:41 +0530 Subject: [PATCH] atutil: Add logic for cgcontrdp to get address and netmask --- drivers/atmodem/atutil.c | 40 ++++++++++++++++++++++++++++++++++++++++ drivers/atmodem/atutil.h | 3 +++ 2 files changed, 43 insertions(+) diff --git a/drivers/atmodem/atutil.c b/drivers/atmodem/atutil.c index 14873483..6f4e8a20 100644 --- a/drivers/atmodem/atutil.c +++ b/drivers/atmodem/atutil.c @@ -27,6 +27,7 @@ #include #include #include +#include #define OFONO_API_SUBJECT_TO_CHANGE #include @@ -614,3 +615,42 @@ void at_util_sim_state_query_free(struct at_util_sim_state_query *req) g_free(req); } + +/* + * CGCONTRDP returns addr + netmask in the same string in the form + * of "a.b.c.d.m.m.m.m" for IPv4. + * address/netmask must be able to hold + * 255.255.255.255 + null = 16 characters + */ +int at_util_get_ipv4_address_and_netmask(const char *addrnetmask, + char *address, char *netmask) +{ + const char *s = addrnetmask; + const char *net = NULL; + + int ret = -EINVAL; + int i; + + /* Count 7 dots for ipv4, less or more means error. */ + for (i = 0; i < 9; i++, s++) { + s = strchr(s, '.'); + + if (!s) + break; + + if (i == 3) { + /* set netmask ptr and break the string */ + net = s + 1; + } + } + + if (i == 7) { + memcpy(address, addrnetmask, net - addrnetmask); + address[net - addrnetmask - 1] = '\0'; + strcpy(netmask, net); + + ret = 0; + } + + return ret; +} diff --git a/drivers/atmodem/atutil.h b/drivers/atmodem/atutil.h index 5cb88b78..7113a4cd 100644 --- a/drivers/atmodem/atutil.h +++ b/drivers/atmodem/atutil.h @@ -83,6 +83,9 @@ struct at_util_sim_state_query *at_util_sim_state_query_new(GAtChat *chat, GDestroyNotify destroy); 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); + struct cb_data { void *cb; void *data;