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

Ben Chan benchan at chromium.org
Thu Oct 24 02:30:18 PDT 2013


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.
---
 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 */
-- 
1.8.4.1



More information about the ModemManager-devel mailing list