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:

committed by
Dan Williams

parent
abfd8d3b08
commit
0c7f3380ae
@@ -211,6 +211,7 @@ typedef enum {
|
|||||||
CONNECT_STEP_FIRST,
|
CONNECT_STEP_FIRST,
|
||||||
CONNECT_STEP_PACKET_SERVICE,
|
CONNECT_STEP_PACKET_SERVICE,
|
||||||
CONNECT_STEP_PROVISIONED_CONTEXTS,
|
CONNECT_STEP_PROVISIONED_CONTEXTS,
|
||||||
|
CONNECT_STEP_ENSURE_DISCONNECTED,
|
||||||
CONNECT_STEP_CONNECT,
|
CONNECT_STEP_CONNECT,
|
||||||
CONNECT_STEP_IP_CONFIGURATION,
|
CONNECT_STEP_IP_CONFIGURATION,
|
||||||
CONNECT_STEP_LAST
|
CONNECT_STEP_LAST
|
||||||
@@ -623,6 +624,26 @@ connect_set_ready (MbimDevice *device,
|
|||||||
connect_context_step (task);
|
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
|
static void
|
||||||
provisioned_contexts_query_ready (MbimDevice *device,
|
provisioned_contexts_query_ready (MbimDevice *device,
|
||||||
GAsyncResult *res,
|
GAsyncResult *res,
|
||||||
@@ -808,6 +829,37 @@ connect_context_step (GTask *task)
|
|||||||
mbim_message_unref (message);
|
mbim_message_unref (message);
|
||||||
return;
|
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: {
|
case CONNECT_STEP_CONNECT: {
|
||||||
const gchar *apn;
|
const gchar *apn;
|
||||||
const gchar *user;
|
const gchar *user;
|
||||||
|
Reference in New Issue
Block a user