[PATCH] bearer-mbim: ensure session is disconnected before trying to connect
Dan Williams
dcbw at redhat.com
Tue Sep 12 15:25:22 UTC 2017
On Fri, 2017-08-25 at 13:12 +0200, Aleksander Morgado wrote:
> 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
> ---
LGTM; pushed to git master.
Dan
> 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_disconnecte
> d_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