aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Chan <benchan@chromium.org>2013-10-24 02:30:18 -0700
committerAleksander Morgado <aleksander@lanedo.com>2013-10-24 16:44:05 +0200
commit686caef536f4dee3ddee22bdfc8f3522e68abf7b (patch)
treec6d2e8f4da2daecdae70d66c0f35e40c9e9a5e63
parent613155cb2e92d858c8a9465be0d5daf80475a24e (diff)
huawei: handle pending network-initiated disconnection in disconnect_3gpp
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.
-rw-r--r--plugins/huawei/mm-broadband-bearer-huawei.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/plugins/huawei/mm-broadband-bearer-huawei.c b/plugins/huawei/mm-broadband-bearer-huawei.c
index deb91caa..1b9c0ffb 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 */