aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-broadband-bearer.c22
-rw-r--r--src/mm-modem-helpers.c68
-rw-r--r--src/mm-modem-helpers.h5
-rw-r--r--src/tests/test-modem-helpers.c4
4 files changed, 76 insertions, 23 deletions
diff --git a/src/mm-broadband-bearer.c b/src/mm-broadband-bearer.c
index 995d8417..6918d89a 100644
--- a/src/mm-broadband-bearer.c
+++ b/src/mm-broadband-bearer.c
@@ -752,6 +752,7 @@ find_cid_ready (MMBaseModem *modem,
GVariant *result;
gchar *command;
GError *error = NULL;
+ const gchar *pdp_type;
result = mm_base_modem_at_sequence_full_finish (modem, res, NULL, &error);
if (!result) {
@@ -768,10 +769,20 @@ find_cid_ready (MMBaseModem *modem,
return;
/* Initialize PDP context with our APN */
+ pdp_type = mm_3gpp_get_pdp_type_from_ip_family (mm_bearer_properties_get_ip_type (mm_bearer_peek_config (MM_BEARER (ctx->self))));
+ if (!pdp_type) {
+ g_simple_async_result_set_error (ctx->result,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_INVALID_ARGS,
+ "Invalid PDP type requested");
+ detailed_connect_context_complete_and_free (ctx);
+ return;
+ }
+
ctx->cid = g_variant_get_uint32 (result);
command = g_strdup_printf ("+CGDCONT=%u,\"%s\",\"%s\"",
ctx->cid,
- mm_bearer_properties_get_ip_type (mm_bearer_peek_config (MM_BEARER (ctx->self))),
+ pdp_type,
mm_bearer_properties_get_apn (mm_bearer_peek_config (MM_BEARER (ctx->self))));
mm_base_modem_at_command_full (ctx->modem,
ctx->primary,
@@ -830,7 +841,8 @@ parse_cid_range (MMBaseModem *modem,
pdp_type = g_match_info_fetch (match_info, 3);
- if (g_str_equal (pdp_type, mm_bearer_properties_get_ip_type (mm_bearer_peek_config (MM_BEARER (ctx->self))))) {
+ if (mm_3gpp_get_ip_family_from_pdp_type (pdp_type) ==
+ mm_bearer_properties_get_ip_type (mm_bearer_peek_config (MM_BEARER (ctx->self)))) {
gchar *max_cid_range_str;
guint max_cid_range;
@@ -914,9 +926,9 @@ parse_pdp_list (MMBaseModem *modem,
mm_dbg (" PDP context [cid=%u] [type='%s'] [apn='%s']",
pdp->cid,
- pdp->pdp_type ? pdp->pdp_type : "",
+ mm_bearer_ip_family_get_string (pdp->pdp_type),
pdp->apn ? pdp->apn : "");
- if (g_str_equal (pdp->pdp_type, mm_bearer_properties_get_ip_type (mm_bearer_peek_config (MM_BEARER (ctx->self))))) {
+ if (pdp->pdp_type == mm_bearer_properties_get_ip_type (mm_bearer_peek_config (MM_BEARER (ctx->self)))) {
/* PDP with no APN set? we may use that one if not exact match found */
if (!pdp->apn || !pdp->apn[0]) {
mm_dbg ("Found PDP context with CID %u and no APN",
@@ -930,7 +942,7 @@ parse_pdp_list (MMBaseModem *modem,
g_str_equal (pdp->apn, apn)) {
/* Found a PDP context with the same CID and PDP type, we'll use it. */
mm_dbg ("Found PDP context with CID %u and PDP type %s for APN '%s'",
- pdp->cid, pdp->pdp_type, pdp->apn);
+ pdp->cid, mm_bearer_ip_family_get_string (pdp->pdp_type), pdp->apn);
cid = pdp->cid;
/* In this case, stop searching */
break;
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,
diff --git a/src/mm-modem-helpers.h b/src/mm-modem-helpers.h
index 8da0a176..9733ead0 100644
--- a/src/mm-modem-helpers.h
+++ b/src/mm-modem-helpers.h
@@ -85,7 +85,7 @@ GList *mm_3gpp_parse_cops_test_response (const gchar *reply,
/* AT+CGDCONT? (PDP context query) response parser */
typedef struct {
guint cid;
- gchar *pdp_type;
+ MMBearerIpFamily pdp_type;
gchar *apn;
} MM3gppPdpContext;
void mm_3gpp_pdp_context_list_free (GList *pdp_list);
@@ -152,6 +152,9 @@ MMModemAccessTechnology mm_string_to_access_tech (const gchar *string);
gchar *mm_3gpp_parse_operator (const gchar *reply,
MMModemCharset cur_charset);
+const gchar *mm_3gpp_get_pdp_type_from_ip_family (MMBearerIpFamily family);
+MMBearerIpFamily mm_3gpp_get_ip_family_from_pdp_type (const gchar *pdp_type);
+
/*****************************************************************************/
/* CDMA specific helpers and utilities */
/*****************************************************************************/
diff --git a/src/tests/test-modem-helpers.c b/src/tests/test-modem-helpers.c
index abe8a3c1..12904a8e 100644
--- a/src/tests/test-modem-helpers.c
+++ b/src/tests/test-modem-helpers.c
@@ -1244,7 +1244,7 @@ test_cgdcont_results (const gchar *desc,
if (pdp->cid == expected->cid) {
found = TRUE;
- g_assert_cmpstr (pdp->pdp_type, ==, expected->pdp_type);
+ g_assert_cmpuint (pdp->pdp_type, ==, expected->pdp_type);
g_assert_cmpstr (pdp->apn, ==, expected->apn);
}
}
@@ -1260,7 +1260,7 @@ test_cgdcont_response_nokia (void *f, gpointer d)
{
const gchar *reply = "+CGDCONT: 1,\"IP\",,,0,0";
static MM3gppPdpContext expected[] = {
- { 1, "IP", NULL }
+ { 1, MM_BEARER_IP_FAMILY_IPV4, NULL }
};
test_cgdcont_results ("Nokia", reply, &expected[0], G_N_ELEMENTS (expected));