From 48f02107395986c31b95067b5f08de256dab3c18 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Fri, 17 Jun 2016 10:39:02 -0500 Subject: [PATCH] bearer-mbim: use the context IP type MM asked to be activated instead of modem response MM never passes MBIM_CONTEXT_IP_TYPE_DEFAULT which would require paying attention to the ip_type in the reply to figure out what type the modem activated. Instead, MM always specifies the ip_type it wants to activate, and some modems (K5160) return a different type in the response. The modem is required to activate the type MM asks for or return an error, so if the activation was successful we can safely assume the modem activated the ip_type we want, and we can ignore the ip_type in the response. --- src/mm-bearer-mbim.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/mm-bearer-mbim.c b/src/mm-bearer-mbim.c index 8c69fb37..5db5f32a 100644 --- a/src/mm-bearer-mbim.c +++ b/src/mm-bearer-mbim.c @@ -581,7 +581,6 @@ connect_set_ready (MbimDevice *device, MbimMessage *response; guint32 session_id; MbimActivationState activation_state; - MbimContextIpType ip_type; guint32 nw_error; response = mbim_device_command_finish (device, res, &error); @@ -595,7 +594,7 @@ connect_set_ready (MbimDevice *device, &session_id, &activation_state, NULL, /* voice_call_state */ - &ip_type, + NULL, /* ip_type */ NULL, /* context_type */ &nw_error, &inner_error)) { @@ -604,11 +603,15 @@ connect_set_ready (MbimDevice *device, g_error_free (error); error = mm_mobile_equipment_error_from_mbim_nw_error (nw_error); } else { - ctx->ip_type = ip_type; + /* Report the ip_type we originally requested, since the ip_type + * from the response is only relevant if the requested used + * MBIM_CONTEXT_IP_TYPE_DEFAULT, which MM never does. Some + * devices (K5160) report the wrong type in the response. + */ mm_dbg ("Session ID '%u': %s (IP type: %s)", session_id, mbim_activation_state_get_string (activation_state), - mbim_context_ip_type_get_string (ip_type)); + mbim_context_ip_type_get_string (ctx->ip_type)); } } else { /* Prefer the error from the result to the parsing error */ @@ -816,7 +819,6 @@ connect_context_step (ConnectContext *ctx) const gchar *user; const gchar *password; MbimAuthProtocol auth; - MbimContextIpType ip_type; MMBearerIpFamily ip_family; GError *error = NULL; @@ -870,13 +872,13 @@ connect_context_step (ConnectContext *ctx) } if (ip_family == MM_BEARER_IP_FAMILY_IPV4) - ip_type = MBIM_CONTEXT_IP_TYPE_IPV4; + ctx->ip_type = MBIM_CONTEXT_IP_TYPE_IPV4; else if (ip_family == MM_BEARER_IP_FAMILY_IPV6) - ip_type = MBIM_CONTEXT_IP_TYPE_IPV6; + ctx->ip_type = MBIM_CONTEXT_IP_TYPE_IPV6; else if (ip_family == MM_BEARER_IP_FAMILY_IPV4V6) - ip_type = MBIM_CONTEXT_IP_TYPE_IPV4V6; + ctx->ip_type = MBIM_CONTEXT_IP_TYPE_IPV4V6; else if (ip_family == (MM_BEARER_IP_FAMILY_IPV4 | MM_BEARER_IP_FAMILY_IPV6)) - ip_type = MBIM_CONTEXT_IP_TYPE_IPV4_AND_IPV6; + ctx->ip_type = MBIM_CONTEXT_IP_TYPE_IPV4_AND_IPV6; else if (ip_family == MM_BEARER_IP_FAMILY_NONE || ip_family == MM_BEARER_IP_FAMILY_ANY) /* A valid default IP family should have been specified */ @@ -896,7 +898,7 @@ connect_context_step (ConnectContext *ctx) return; } - mm_dbg ("Launching %s connection with APN '%s'...", mbim_context_ip_type_get_string (ip_type), apn); + mm_dbg ("Launching %s connection with APN '%s'...", mbim_context_ip_type_get_string (ctx->ip_type), apn); message = (mbim_message_connect_set_new ( ctx->self->priv->session_id, MBIM_ACTIVATION_COMMAND_ACTIVATE, @@ -905,7 +907,7 @@ connect_context_step (ConnectContext *ctx) password ? password : "", MBIM_COMPRESSION_NONE, auth, - ip_type, + ctx->ip_type, mbim_uuid_from_context_type (MBIM_CONTEXT_TYPE_INTERNET), &error)); if (!message) {