broadband-bearer-mbm: connect errors should trigger a disconnect

Otherwise we may leave a bearer connected when ModemManager doesn't
think it's connected.  Prevents a CME ERROR 277 loop on connect when
the bearer hasn't been torn down correctly.
This commit is contained in:
Dan Williams
2016-05-11 13:18:12 -05:00
parent 5c3461ff9c
commit ba097f1a43

View File

@@ -139,6 +139,36 @@ dial_3gpp_report_connection_status (gpointer data,
ctx->e2nap_status = status; ctx->e2nap_status = status;
} }
static void
connect_error_disconnect_ready (MMBroadbandBearer *self,
GAsyncResult *res,
Dial3gppContext *ctx)
{
MM_BROADBAND_BEARER_GET_CLASS (self)->disconnect_3gpp_finish (
self,
res,
NULL);
dial_3gpp_context_complete_and_free (ctx);
}
static void
connect_error_disconnect_start (Dial3gppContext *ctx)
{
/* We don't care about connect status anymore */
if (ctx->self->priv->connect_pending == ctx)
ctx->self->priv->connect_pending = NULL;
MM_BROADBAND_BEARER_GET_CLASS (ctx->self)->disconnect_3gpp (
MM_BROADBAND_BEARER (ctx->self),
MM_BROADBAND_MODEM (ctx->modem),
ctx->primary,
NULL,
ctx->data,
ctx->cid,
(GAsyncReadyCallback) connect_error_disconnect_ready,
ctx);
}
static gboolean static gboolean
handle_e2nap_connect_status (Dial3gppContext *ctx) handle_e2nap_connect_status (Dial3gppContext *ctx)
{ {
@@ -181,7 +211,7 @@ connect_poll_ready (MMBaseModem *modem,
response = mm_base_modem_at_command_full_finish (modem, res, &error); response = mm_base_modem_at_command_full_finish (modem, res, &error);
if (!response) { if (!response) {
g_simple_async_result_take_error (ctx->result, error); g_simple_async_result_take_error (ctx->result, error);
dial_3gpp_context_complete_and_free (ctx); connect_error_disconnect_start (ctx);
return; return;
} }
@@ -217,7 +247,7 @@ connect_poll_cb (Dial3gppContext *ctx)
MM_CORE_ERROR, MM_CORE_ERROR,
MM_CORE_ERROR_CANCELLED, MM_CORE_ERROR_CANCELLED,
"Dial operation has been cancelled"); "Dial operation has been cancelled");
dial_3gpp_context_complete_and_free (ctx); connect_error_disconnect_start (ctx);
return G_SOURCE_REMOVE; return G_SOURCE_REMOVE;
} }
@@ -231,7 +261,7 @@ connect_poll_cb (Dial3gppContext *ctx)
MM_MOBILE_EQUIPMENT_ERROR, MM_MOBILE_EQUIPMENT_ERROR,
MM_MOBILE_EQUIPMENT_ERROR_NETWORK_TIMEOUT, MM_MOBILE_EQUIPMENT_ERROR_NETWORK_TIMEOUT,
"Connection attempt timed out"); "Connection attempt timed out");
dial_3gpp_context_complete_and_free (ctx); connect_error_disconnect_start (ctx);
return G_SOURCE_REMOVE; return G_SOURCE_REMOVE;
} }
@@ -260,7 +290,7 @@ activate_ready (MMBaseModem *modem,
if (!mm_base_modem_at_command_full_finish (modem, res, &error)) { if (!mm_base_modem_at_command_full_finish (modem, res, &error)) {
g_simple_async_result_take_error (ctx->result, error); g_simple_async_result_take_error (ctx->result, error);
dial_3gpp_context_complete_and_free (ctx); connect_error_disconnect_start (ctx);
return; return;
} }