[PATCH] huawei: handle pending network-initiated disconnection in disconnect_3gpp

Dan Williams dcbw at redhat.com
Thu Oct 24 07:44:31 PDT 2013


On Thu, 2013-10-24 at 02:30 -0700, Ben Chan wrote:
> If a client-initiated disconnection attempt is issued while a
> network-initiated disconnection is still pending, the latter may
> interfere with the former. Also, when the client-initiated disconnection
> attempt fails but the bearer status is reported as 'disconnected', the
> pending network-initiated disconnection is not cleared and may result
> in an assertion when a connection attempt is issued.
> 
> This patch addresses the issue by clearing any pending network-initiated
> disconnection before proceeding with a client-initiated disconnection.

Looks good to me.

Dan

> ---
>  plugins/huawei/mm-broadband-bearer-huawei.c | 13 ++++++++-----
>  1 file changed, 8 insertions(+), 5 deletions(-)
> 
> diff --git a/plugins/huawei/mm-broadband-bearer-huawei.c b/plugins/huawei/mm-broadband-bearer-huawei.c
> index deb91ca..1b9c0ff 100644
> --- a/plugins/huawei/mm-broadband-bearer-huawei.c
> +++ b/plugins/huawei/mm-broadband-bearer-huawei.c
> @@ -551,6 +551,14 @@ disconnect_3gpp_context_step (Disconnect3gppContext *ctx)
>          /* Store the context */
>          ctx->self->priv->disconnect_pending = ctx;
>  
> +        /* We ignore any pending network-initiated disconnection in order to prevent it
> +         * from interfering with the client-initiated disconnection, as we would like to
> +         * proceed with the latter anyway. */
> +        if (ctx->self->priv->network_disconnect_pending_id != 0) {
> +            g_source_remove (ctx->self->priv->network_disconnect_pending_id);
> +            ctx->self->priv->network_disconnect_pending_id = 0;
> +        }
> +
>          ctx->step++;
>          /* Fall down to the next step */
>  
> @@ -605,11 +613,6 @@ disconnect_3gpp_context_step (Disconnect3gppContext *ctx)
>          return;
>  
>      case DISCONNECT_3GPP_CONTEXT_STEP_LAST:
> -        if (ctx->self->priv->network_disconnect_pending_id != 0) {
> -            g_source_remove (ctx->self->priv->network_disconnect_pending_id);
> -            ctx->self->priv->network_disconnect_pending_id = 0;
> -        }
> -
>          /* Clear context */
>          ctx->self->priv->disconnect_pending = NULL;
>          /* Set data port as result */




More information about the ModemManager-devel mailing list