[PATCH] bearer-mbim: handle already disconnected case

pprabhu at chromium.org pprabhu at chromium.org
Fri Jun 13 14:22:30 PDT 2014


From: Prathmesh Prabhu <pprabhu at chromium.org>

If the modem responds with MBIM_STATUS_ERROR_CONTEXT_NOT_ACTIVATED, take it to
mean that the bearer has already been disconnected.
---
 src/mm-bearer-mbim.c | 61 +++++++++++++++++++++++++++++++---------------------
 1 file changed, 37 insertions(+), 24 deletions(-)

diff --git a/src/mm-bearer-mbim.c b/src/mm-bearer-mbim.c
index b1e3176..cc658ee 100644
--- a/src/mm-bearer-mbim.c
+++ b/src/mm-bearer-mbim.c
@@ -950,35 +950,48 @@ disconnect_set_ready (MbimDevice *device,
     guint32 nw_error;
 
     response = mbim_device_command_finish (device, res, &error);
-    if (response &&
-        (mbim_message_command_done_get_result (response, &error) ||
-         error->code == MBIM_STATUS_ERROR_FAILURE)) {
+    if (response) {
         GError *inner_error = NULL;
+        gboolean result = FALSE, parsed_result = FALSE;
+
+        result = mbim_message_command_done_get_result(response, &error);
+        /* Parse the response only for the cases we need to */
+        if (result ||
+            error->code == MBIM_STATUS_ERROR_FAILURE ||
+            error->code == MBIM_STATUS_ERROR_CONTEXT_NOT_ACTIVATED) {
+            parsed_result = mbim_message_connect_response_parse (
+                    response,
+                    &session_id,
+                    &activation_state,
+                    NULL, /* voice_call_state */
+                    NULL, /* ip_type */
+                    NULL, /* context_type */
+                    &nw_error,
+                    &inner_error);
+        }
 
-        if (mbim_message_connect_response_parse (
-                response,
-                &session_id,
-                &activation_state,
-                NULL, /* voice_call_state */
-                NULL, /* ip_type */
-                NULL, /* context_type */
-                &nw_error,
-                &inner_error)) {
+        /* Now handle different response / error cases */
+        if (result && parsed_result) {
+            mm_dbg ("Session ID '%u': %s",
+                    session_id,
+                    mbim_activation_state_get_string (activation_state));
+        } else if (error->code == MBIM_STATUS_ERROR_CONTEXT_NOT_ACTIVATED) {
+            mm_dbg ("Session ID '%u' already disconnected.", session_id);
+            g_clear_error (&error);
+            g_clear_error (&inner_error);
+        } else if (error->code == MBIM_STATUS_ERROR_FAILURE) {
+            /* This is the only case when nw_error may be set */
             if (nw_error) {
-                if (error)
-                    g_error_free (error);
+                g_error_free (error);
                 error = mm_mobile_equipment_error_from_mbim_nw_error (nw_error);
-            } else
-                mm_dbg ("Session ID '%u': %s",
-                        session_id,
-                        mbim_activation_state_get_string (activation_state));
-        } else {
-            /* Prefer the error from the result to the parsing error */
-            if (!error)
-                error = inner_error;
-            else
-                g_error_free (inner_error);
+            }
+        }  /* else: Some other error->code we don't care about OR (result && !parsed_result) */
+
+        /* Give precedence to original error over parsing error */
+        if (!error && inner_error) {
+            error = inner_error;
         }
+        g_clear_error(&inner_error);
     }
 
     if (response)
-- 
2.0.0.526.g5318336



More information about the ModemManager-devel mailing list