From 0c7f3380ae96698e496abce1e55c52d21449d57a Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Fri, 25 Aug 2017 13:12:01 +0200 Subject: bearer-mbim: ensure session is disconnected before trying to connect 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 --- src/mm-bearer-mbim.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'src') 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; -- cgit v1.2.3-70-g09d2