modemmanager-next/samsung: Check error when activation fails Port code from old ModemManager to issue an %IER command when %IPDPACT returns a failure, and pass the relevant error up the stack. BUG=chromium-os:30656 TEST=With an AT&T SIM, try to connect with an bogus APN. "mmcli -m 0 --simple-connect='apn=bogus'". mmcli should return with error #MobileEquipment.Gprs.ServiceOptionNotSubscribed. Change-Id: I8abb70185d488f32574f8abff2e5f7905ea4e935
diff --git a/plugins/samsung/mm-broadband-bearer-samsung.c b/plugins/samsung/mm-broadband-bearer-samsung.c index 9ed908e..afac777 100644 --- a/plugins/samsung/mm-broadband-bearer-samsung.c +++ b/plugins/samsung/mm-broadband-bearer-samsung.c
@@ -147,6 +147,61 @@ } static void +dial_3gpp_get_error_done (MMBaseModem *modem, + GAsyncResult *res, + DialContext *ctx) +{ + MMBroadbandBearerSamsung *self = ctx->self; + const gchar *response; + int activation_err; + GError *error = NULL; + + response = mm_base_modem_at_command_finish (modem, res, &error); + + if (error) { + g_simple_async_result_take_error (ctx->result, error); + dial_context_complete_and_free (ctx); + return; + } + + response = mm_strip_tag (response, "%IER:"); + if (sscanf (response, " %*d,%*d,%d", &activation_err) && + (activation_err == 27 || activation_err == 33)) { + g_simple_async_result_set_error (ctx->result, + MM_MOBILE_EQUIPMENT_ERROR, + MM_MOBILE_EQUIPMENT_ERROR_GPRS_SERVICE_OPTION_NOT_SUBSCRIBED, + "Missing or unknown APN"); + } else { + g_simple_async_result_set_error (ctx->result, + MM_CORE_ERROR, + MM_CORE_ERROR_FAILED, + "Call setup failed"); + } + + dial_context_complete_and_free (ctx); + self->priv->connected_cid = 0; + self->priv->pending_dial = NULL; +} + +static void +dial_3gpp_get_error (MMBroadbandBearerSamsung *self, + DialContext *ctx) +{ + mm_dbg("checking what the error was"); + if (ctx->timeout_id) { + g_source_remove (ctx->timeout_id); + ctx->timeout_id = 0; + } + + mm_base_modem_at_command (ctx->modem, + "%IER?", + 3, + FALSE, + (GAsyncReadyCallback)dial_3gpp_get_error_done, + ctx); +} + +static void disconnect_3gpp_done (MMBroadbandBearerSamsung *self, DisconnectContext *result); @@ -197,6 +252,11 @@ break; case 3: /* activation failed */ + if (self->priv->pending_dial == NULL) { + mm_warn ("Recieved %%IPDPACT failure while not connecting."); + return; + } + dial_3gpp_get_error (self, self->priv->pending_dial); break; default: mm_warn ("Unknown connect status %d", status);