[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