diff options
Diffstat (limited to 'src/mm-modem-helpers.c')
-rw-r--r-- | src/mm-modem-helpers.c | 68 |
1 files changed, 53 insertions, 15 deletions
diff --git a/src/mm-modem-helpers.c b/src/mm-modem-helpers.c index 6019dfe9..6717ed26 100644 --- a/src/mm-modem-helpers.c +++ b/src/mm-modem-helpers.c @@ -500,9 +500,8 @@ mm_3gpp_parse_cops_test_response (const gchar *reply, static void mm_3gpp_pdp_context_free (MM3gppPdpContext *pdp) { - g_free (pdp->pdp_type); g_free (pdp->apn); - g_free (pdp); + g_slice_free (MM3gppPdpContext, pdp); } void @@ -540,21 +539,31 @@ mm_3gpp_parse_cgdcont_read_response (const gchar *reply, while (!inner_error && g_match_info_matches (match_info)) { - MM3gppPdpContext *pdp; - - pdp = g_new0 (MM3gppPdpContext, 1); - if (!mm_get_uint_from_match_info (match_info, 1, &pdp->cid)) { - inner_error = g_error_new (MM_CORE_ERROR, - MM_CORE_ERROR_FAILED, - "Couldn't parse CID from reply: '%s'", - reply); - break; - } - pdp->pdp_type = mm_get_string_unquoted_from_match_info (match_info, 2); - pdp->apn = mm_get_string_unquoted_from_match_info (match_info, 3); + gchar *str; + MMBearerIpFamily ip_family; + + str = mm_get_string_unquoted_from_match_info (match_info, 2); + ip_family = mm_3gpp_get_ip_family_from_pdp_type (str); + if (ip_family == MM_BEARER_IP_FAMILY_UNKNOWN) + mm_dbg ("Ignoring PDP context type: '%s'", str); + else { + MM3gppPdpContext *pdp; + + pdp = g_slice_new0 (MM3gppPdpContext); + if (!mm_get_uint_from_match_info (match_info, 1, &pdp->cid)) { + inner_error = g_error_new (MM_CORE_ERROR, + MM_CORE_ERROR_FAILED, + "Couldn't parse CID from reply: '%s'", + reply); + break; + } + pdp->pdp_type = ip_family; + pdp->apn = mm_get_string_unquoted_from_match_info (match_info, 3); - list = g_list_prepend (list, pdp); + list = g_list_prepend (list, pdp); + } + g_free (str); g_match_info_next (match_info, &inner_error); } @@ -1427,6 +1436,35 @@ mm_3gpp_parse_operator (const gchar *reply, /*************************************************************************/ +const gchar * +mm_3gpp_get_pdp_type_from_ip_family (MMBearerIpFamily family) +{ + switch (family) { + case MM_BEARER_IP_FAMILY_IPV4: + return "IP"; + case MM_BEARER_IP_FAMILY_IPV6: + return "IPV6"; + case MM_BEARER_IP_FAMILY_IPV4V6: + return "IPV4V6"; + default: + return NULL; + } +} + +MMBearerIpFamily +mm_3gpp_get_ip_family_from_pdp_type (const gchar *pdp_type) +{ + if (g_str_equal (pdp_type, "IP")) + return MM_BEARER_IP_FAMILY_IPV4; + if (g_str_equal (pdp_type, "IPV6")) + return MM_BEARER_IP_FAMILY_IPV6; + if (g_str_equal (pdp_type, "IPV4V6")) + return MM_BEARER_IP_FAMILY_IPV4V6; + return MM_BEARER_IP_FAMILY_UNKNOWN; +} + +/*************************************************************************/ + gboolean mm_cdma_parse_spservice_read_response (const gchar *reply, MMModemCdmaRegistrationState *out_cdma_1x_state, |