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
This commit is contained in:
Aleksander Morgado
2017-08-25 13:12:01 +02:00
committed by Dan Williams
parent abfd8d3b08
commit 0c7f3380ae

View File

@@ -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;