[PATCH] broadband-bearer-icera: deactivate context before authentication
Dan Williams
dcbw at redhat.com
Tue May 24 14:36:32 UTC 2016
On Fri, 2016-05-13 at 20:05 +0200, Aleksander Morgado wrote:
> 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.
Thanks; pushed to git master and mm-1-4.
Dan
> >
> > 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
>
>
More information about the ModemManager-devel
mailing list