[PATCH] broadband-bearer-icera: deactivate context before authentication

Aleksander Morgado aleksander at aleksander.es
Fri May 13 18:05:11 UTC 2016


On Wed, May 11, 2016 at 11:25 PM, Dan Williams <dcbw at redhat.com> wrote:
> If the modem thinks a PDP context is already active it'll return
> 583 errors from IPDPCFG and IPDPACT until the context is
> deactivated.  Deactivation was previously done after authentication,
> but needs to be done before any part of the connect process to
> ensure the PDP context is inactive.
>
> The previous approach worked only if the context was being
> deactivated already (which can take a bit of time) because it would
> be deactivated after a few seconds and the connect could continue.
> This approach works for more cases (like a MM crash and restart
> while the modem is connected).
> ---

LGTM.

>  plugins/icera/mm-broadband-bearer-icera.c | 99 ++++++++++++++++---------------
>  1 file changed, 52 insertions(+), 47 deletions(-)
>
> diff --git a/plugins/icera/mm-broadband-bearer-icera.c b/plugins/icera/mm-broadband-bearer-icera.c
> index 95e5722..ec5779c 100644
> --- a/plugins/icera/mm-broadband-bearer-icera.c
> +++ b/plugins/icera/mm-broadband-bearer-icera.c
> @@ -752,43 +752,6 @@ activate_ready (MMBaseModem *modem,
>                                                             self);
>  }
>
> -static void
> -deactivate_ready (MMBaseModem *modem,
> -                  GAsyncResult *res,
> -                  Dial3gppContext *ctx)
> -{
> -    gchar *command;
> -
> -    /*
> -     * Ignore any error here; %IPDPACT=ctx,0 will produce an error 767
> -     * if the context is not, in fact, connected. This is annoying but
> -     * harmless.
> -     */
> -    mm_base_modem_at_command_full_finish (modem, res, NULL);
> -
> -    /* The unsolicited response to %IPDPACT may come before the OK does.
> -     * We will keep the connection context in the bearer private data so
> -     * that it is accessible from the unsolicited message handler. Note
> -     * also that we do NOT pass the ctx to the GAsyncReadyCallback, as it
> -     * may not be valid any more when the callback is called (it may be
> -     * already completed in the unsolicited handling) */
> -    g_assert (ctx->self->priv->connect_pending == NULL);
> -    ctx->self->priv->connect_pending = ctx;
> -
> -    command = g_strdup_printf ("%%IPDPACT=%d,1", ctx->cid);
> -    mm_base_modem_at_command_full (
> -        ctx->modem,
> -        ctx->primary,
> -        command,
> -        60,
> -        FALSE,
> -        FALSE, /* raw */
> -        NULL, /* cancellable */
> -        (GAsyncReadyCallback)activate_ready,
> -        g_object_ref (ctx->self)); /* we pass the bearer object! */
> -    g_free (command);
> -}
> -
>  static void authenticate (Dial3gppContext *ctx);
>
>  static gboolean
> @@ -827,13 +790,16 @@ authenticate_ready (MMBaseModem *modem,
>          return;
>      }
>
> -    /*
> -     * Deactivate the context we want to use before we try to activate
> -     * it. This handles the case where ModemManager crashed while
> -     * connected and is now trying to reconnect. (Should some part of
> -     * the core or modem driver have made sure of this already?)
> -     */
> -    command = g_strdup_printf ("%%IPDPACT=%d,0", ctx->cid);
> +    /* The unsolicited response to %IPDPACT may come before the OK does.
> +     * We will keep the connection context in the bearer private data so
> +     * that it is accessible from the unsolicited message handler. Note
> +     * also that we do NOT pass the ctx to the GAsyncReadyCallback, as it
> +     * may not be valid any more when the callback is called (it may be
> +     * already completed in the unsolicited handling) */
> +    g_assert (ctx->self->priv->connect_pending == NULL);
> +    ctx->self->priv->connect_pending = ctx;
> +
> +    command = g_strdup_printf ("%%IPDPACT=%d,1", ctx->cid);
>      mm_base_modem_at_command_full (
>          ctx->modem,
>          ctx->primary,
> @@ -842,8 +808,8 @@ authenticate_ready (MMBaseModem *modem,
>          FALSE,
>          FALSE, /* raw */
>          NULL, /* cancellable */
> -        (GAsyncReadyCallback)deactivate_ready,
> -        ctx);
> +        (GAsyncReadyCallback)activate_ready,
> +        g_object_ref (ctx->self)); /* we pass the bearer object! */
>      g_free (command);
>  }
>
> @@ -913,6 +879,45 @@ authenticate (Dial3gppContext *ctx)
>  }
>
>  static void
> +deactivate_ready (MMBaseModem *modem,
> +                  GAsyncResult *res,
> +                  Dial3gppContext *ctx)
> +{
> +    /*
> +     * Ignore any error here; %IPDPACT=ctx,0 will produce an error 767
> +     * if the context is not, in fact, connected. This is annoying but
> +     * harmless.
> +     */
> +    mm_base_modem_at_command_full_finish (modem, res, NULL);
> +
> +    authenticate (ctx);
> +}
> +
> +static void
> +connect_deactivate (Dial3gppContext *ctx)
> +{
> +    gchar *command;
> +
> +    /* Deactivate the context we want to use before we try to activate
> +     * it. This handles the case where ModemManager crashed while
> +     * connected and is now trying to reconnect. (Should some part of
> +     * the core or modem driver have made sure of this already?)
> +     */
> +    command = g_strdup_printf ("%%IPDPACT=%d,0", ctx->cid);
> +    mm_base_modem_at_command_full (
> +        ctx->modem,
> +        ctx->primary,
> +        command,
> +        60,
> +        FALSE,
> +        FALSE, /* raw */
> +        NULL, /* cancellable */
> +        (GAsyncReadyCallback)deactivate_ready,
> +        ctx);
> +    g_free (command);
> +}
> +
> +static void
>  dial_3gpp (MMBroadbandBearer *self,
>             MMBaseModem *modem,
>             MMPortSerialAt *primary,
> @@ -948,7 +953,7 @@ dial_3gpp (MMBroadbandBearer *self,
>          return;
>      }
>
> -    authenticate (ctx);
> +    connect_deactivate (ctx);
>  }
>
>  /*****************************************************************************/
> --
> 2.5.5
> _______________________________________________
> ModemManager-devel mailing list
> ModemManager-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel



-- 
Aleksander
https://aleksander.es


More information about the ModemManager-devel mailing list