[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