[PATCH] bearer-mbim: ensure session is disconnected before trying to connect

Aleksander Morgado aleksander at aleksander.es
Fri Aug 25 11:12:01 UTC 2017


If a suspend/resume cycle happens or ModemManager is restarted (e.g.
after a crash) the modem may be left with a given session id
connected. With this change we're forcing a session disconnection
before we attempt a session connection.

https://bugs.freedesktop.org/show_bug.cgi?id=102231
---

Hey Tore, Ben and Dan,

The following patch makes sure the MBIM session id that we're trying to connect is disconnected before the connection attempt. A more complex solution would have involved checking whether the new connection parameters are the same as the ones in the connected session, and if so just assume we're connected. This solution is just a quick way to solve this issue.

Comments/tests/review welcome!

---
 src/mm-bearer-mbim.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/src/mm-bearer-mbim.c b/src/mm-bearer-mbim.c
index 6d7aea6d..86e08d4c 100644
--- a/src/mm-bearer-mbim.c
+++ b/src/mm-bearer-mbim.c
@@ -211,6 +211,7 @@ typedef enum {
     CONNECT_STEP_FIRST,
     CONNECT_STEP_PACKET_SERVICE,
     CONNECT_STEP_PROVISIONED_CONTEXTS,
+    CONNECT_STEP_ENSURE_DISCONNECTED,
     CONNECT_STEP_CONNECT,
     CONNECT_STEP_IP_CONFIGURATION,
     CONNECT_STEP_LAST
@@ -623,6 +624,26 @@ connect_set_ready (MbimDevice *device,
     connect_context_step (task);
 }

+static void
+ensure_disconnected_ready (MbimDevice   *device,
+                           GAsyncResult *res,
+                           GTask        *task)
+{
+    ConnectContext *ctx;
+    MbimMessage *response;
+
+    ctx = g_task_get_task_data (task);
+
+    /* Ignore all errors, just go on */
+    response = mbim_device_command_finish (device, res, NULL);
+    if (response)
+        mbim_message_unref (response);
+
+    /* Keep on */
+    ctx->step++;
+    connect_context_step (task);
+}
+
 static void
 provisioned_contexts_query_ready (MbimDevice *device,
                                   GAsyncResult *res,
@@ -808,6 +829,37 @@ connect_context_step (GTask *task)
         mbim_message_unref (message);
         return;

+    case CONNECT_STEP_ENSURE_DISCONNECTED: {
+        MbimMessage *message;
+        GError *error = NULL;
+
+        message = (mbim_message_connect_set_new (
+                       self->priv->session_id,
+                       MBIM_ACTIVATION_COMMAND_DEACTIVATE,
+                       "",
+                       "",
+                       "",
+                       MBIM_COMPRESSION_NONE,
+                       MBIM_AUTH_PROTOCOL_NONE,
+                       MBIM_CONTEXT_IP_TYPE_DEFAULT,
+                       mbim_uuid_from_context_type (MBIM_CONTEXT_TYPE_INTERNET),
+                       &error));
+        if (!message) {
+            g_task_return_error (task, error);
+            g_object_unref (task);
+            return;
+        }
+
+        mbim_device_command (ctx->device,
+                             message,
+                             30,
+                             NULL,
+                             (GAsyncReadyCallback)ensure_disconnected_ready,
+                             task);
+        mbim_message_unref (message);
+        return;
+    }
+
     case CONNECT_STEP_CONNECT: {
         const gchar *apn;
         const gchar *user;
--
2.14.1


More information about the ModemManager-devel mailing list