diff options
author | Thieu Le <thieule@chromium.org> | 2014-06-06 12:35:42 -0700 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2014-06-09 16:55:12 +0200 |
commit | 0b975f226627b4a3197a46734c11c8d83fbff884 (patch) | |
tree | 833821d636769c492762e52f907928285c065a4b | |
parent | af810a0a87642a0947ec1692b4952105e893bdbf (diff) |
altair-lte: update PCO to handle latest VZW deployment
Update PCO handling code such that it conforms to the latest VZW network
behavior. This includes updating the way we mark a SIM as provisioned.
In the old network, only provisioned SIMs can attach to the network.
Now, unprovisioned SIMs can attach and connect to the network.
Change-Id: Ie454f6fb6d8764161f167e93a4235bb93fbde59a
-rw-r--r-- | plugins/altair/mm-broadband-modem-altair-lte.c | 51 | ||||
-rw-r--r-- | plugins/altair/mm-modem-helpers-altair-lte.c | 28 | ||||
-rw-r--r-- | plugins/altair/mm-modem-helpers-altair-lte.h | 4 | ||||
-rw-r--r-- | plugins/altair/tests/test-modem-helpers-altair-lte.c | 30 | ||||
-rw-r--r-- | src/mm-broadband-modem.c | 9 |
5 files changed, 48 insertions, 74 deletions
diff --git a/plugins/altair/mm-broadband-modem-altair-lte.c b/plugins/altair/mm-broadband-modem-altair-lte.c index b71884b0..c732c521 100644 --- a/plugins/altair/mm-broadband-modem-altair-lte.c +++ b/plugins/altair/mm-broadband-modem-altair-lte.c @@ -1190,33 +1190,15 @@ modem_3gpp_load_subscription_state_finish (MMIfaceModem3gpp *self, } static void -altair_load_internet_cid_ready (MMIfaceModem3gpp *self, - GAsyncResult *res, - LoadSubscriptionStateContext *ctx) +altair_get_subscription_state (MMIfaceModem3gpp *self, + LoadSubscriptionStateContext *ctx) { - const gchar *response; - GError *error = NULL; - guint cid; guint pco_value = -1; + GError *error = NULL; MMModem3gppSubscriptionState subscription_state; - response = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, &error); - if (error) { - mm_dbg ("Failed to load internet CID."); - g_simple_async_result_take_error (ctx->result, error); - load_subscription_state_context_complete_and_free (ctx); - return; - } - - cid = mm_altair_parse_cid (response, &error); - if (error) { - g_simple_async_result_take_error (ctx->result, error); - load_subscription_state_context_complete_and_free (ctx); - return; - } - mm_dbg ("Parsing vendor PCO info: %s", ctx->pco_info); - pco_value = mm_altair_parse_vendor_pco_info (ctx->pco_info, cid, &error); + pco_value = mm_altair_parse_vendor_pco_info (ctx->pco_info, &error); if (error) { g_simple_async_result_take_error (ctx->result, error); load_subscription_state_context_complete_and_free (ctx); @@ -1225,33 +1207,11 @@ altair_load_internet_cid_ready (MMIfaceModem3gpp *self, mm_dbg ("PCO value = %d", pco_value); subscription_state = altair_vzw_pco_value_to_mm_modem_3gpp_subscription_state (pco_value); - if (subscription_state == MM_MODEM_3GPP_SUBSCRIPTION_STATE_UNKNOWN) { - /* The PCO value is loaded after the modem has successfully registered - * with the network. So even if the PCO value is unknown here, - * the successful registration indicates a provisioned SIM. - */ - subscription_state = MM_MODEM_3GPP_SUBSCRIPTION_STATE_PROVISIONED; - } - g_simple_async_result_set_op_res_gpointer (ctx->result, GUINT_TO_POINTER (subscription_state), NULL); load_subscription_state_context_complete_and_free (ctx); } static void -altair_get_subscription_state (MMIfaceModem3gpp *self, - LoadSubscriptionStateContext *ctx) -{ - /* Get the latest internet CID first */ - mm_dbg ("Loading internet CID..."); - mm_base_modem_at_command (MM_BASE_MODEM (self), - "%CGINFO=\"cid\",1", - 6, - FALSE, - (GAsyncReadyCallback)altair_load_internet_cid_ready, - ctx); -} - -static void altair_load_vendor_pco_info_ready (MMIfaceModem3gpp *self, GAsyncResult *res, LoadSubscriptionStateContext *ctx) @@ -1312,7 +1272,8 @@ altair_get_subscription_state_ready (MMBroadbandModemAltairLte *self, } subscription_state = GPOINTER_TO_UINT (g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res))); - mm_iface_modem_3gpp_update_subscription_state (MM_IFACE_MODEM_3GPP (self), subscription_state); + if (subscription_state != MM_MODEM_3GPP_SUBSCRIPTION_STATE_UNKNOWN) + mm_iface_modem_3gpp_update_subscription_state (MM_IFACE_MODEM_3GPP (self), subscription_state); } static void diff --git a/plugins/altair/mm-modem-helpers-altair-lte.c b/plugins/altair/mm-modem-helpers-altair-lte.c index 90b29e0b..3e52ee9c 100644 --- a/plugins/altair/mm-modem-helpers-altair-lte.c +++ b/plugins/altair/mm-modem-helpers-altair-lte.c @@ -23,6 +23,9 @@ #include "mm-modem-helpers-altair-lte.h" +#define MM_ALTAIR_IMS_PDN_CID 1 +#define MM_ALTAIR_INTERNET_PDN_CID 3 + /*****************************************************************************/ /* Bands response parser */ @@ -138,6 +141,13 @@ mm_altair_parse_cid (const gchar *response, GError **error) /*****************************************************************************/ /* %PCOINFO response parser */ +typedef enum { + MM_VZW_PCO_PROVISIONED = 0, + MM_VZW_PCO_LIMIT_REACHED = 1, + MM_VZW_PCO_OUT_OF_DATA = 3, + MM_VZW_PCO_UNPROVISIONED = 5 +} MMVzwPco; + static guint altair_extract_vzw_pco_value (const gchar *pco_payload, GError **error) { @@ -177,9 +187,7 @@ altair_extract_vzw_pco_value (const gchar *pco_payload, GError **error) } guint -mm_altair_parse_vendor_pco_info (const gchar *pco_info, - guint cid, - GError **error) +mm_altair_parse_vendor_pco_info (const gchar *pco_info, GError **error) { GRegex *regex; GMatchInfo *match_info; @@ -231,11 +239,6 @@ mm_altair_parse_vendor_pco_info (const gchar *pco_info, break; } - if (pco_cid != cid) { - g_match_info_next (match_info, error); - continue; - } - pco_id = mm_get_string_unquoted_from_match_info (match_info, 3); if (!pco_id) { g_set_error (error, @@ -264,7 +267,14 @@ mm_altair_parse_vendor_pco_info (const gchar *pco_info, pco_value = altair_extract_vzw_pco_value (pco_payload, error); g_free (pco_payload); - break; + + /* We are only interested in IMS and Internet PDN PCO. */ + if (pco_cid == MM_ALTAIR_IMS_PDN_CID || pco_cid == MM_ALTAIR_INTERNET_PDN_CID) { + break; + } + + pco_value = -1; + g_match_info_next (match_info, error); } g_match_info_free (match_info); diff --git a/plugins/altair/mm-modem-helpers-altair-lte.h b/plugins/altair/mm-modem-helpers-altair-lte.h index 56a6e150..b3199978 100644 --- a/plugins/altair/mm-modem-helpers-altair-lte.h +++ b/plugins/altair/mm-modem-helpers-altair-lte.h @@ -30,8 +30,6 @@ gchar *mm_altair_parse_ceer_response (const gchar *response, guint mm_altair_parse_cid (const gchar *response, GError **error); /* %PCOINFO response parser */ -guint mm_altair_parse_vendor_pco_info (const gchar *pco_info, - guint cid, - GError **error); +guint mm_altair_parse_vendor_pco_info (const gchar *pco_info, GError **error); #endif /* MM_MODEM_HELPERS_ALTAIR_H */ diff --git a/plugins/altair/tests/test-modem-helpers-altair-lte.c b/plugins/altair/tests/test-modem-helpers-altair-lte.c index 46f70b61..d83d3e50 100644 --- a/plugins/altair/tests/test-modem-helpers-altair-lte.c +++ b/plugins/altair/tests/test-modem-helpers-altair-lte.c @@ -103,26 +103,38 @@ test_parse_vendor_pco_info (void) guint pco_value; /* Valid PCO values */ - pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,3,FF00,13018400", 3, NULL); + pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,1,FF00,13018400", NULL); g_assert (pco_value == 0); - pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,3,FF00,13018403", 3, NULL); + pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,1,FF00,13018403", NULL); g_assert (pco_value == 3); - pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,3,FF00,13018405", 3, NULL); + pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,1,FF00,13018405", NULL); + g_assert (pco_value == 5); + pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,3,FF00,13018400", NULL); + g_assert (pco_value == 0); + pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,3,FF00,13018403", NULL); + g_assert (pco_value == 3); + pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,3,FF00,13018405", NULL); + g_assert (pco_value == 5); + pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO:1,FF00,13018400", NULL); + g_assert (pco_value == 0); + pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO:1,FF00,13018403", NULL); + g_assert (pco_value == 3); + pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO:1,FF00,13018405", NULL); g_assert (pco_value == 5); /* Different container */ - pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,3,F000,13018401", 3, NULL); + pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,3,F000,13018401", NULL); g_assert (pco_value == -1); - /* Different CID */ - pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,3,FF00,13018401", 1, NULL); + /* Invalid CID */ + pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,2,FF00,13018401", NULL); g_assert (pco_value == -1); /* Different payload */ - pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,3,FF00,13018501", 1, NULL); + pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,3,FF00,13018501", NULL); g_assert (pco_value == -1); /* Bad PCO info */ - pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: blah,blah,FF00,13018401", 1, NULL); + pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: blah,blah,FF00,13018401", NULL); g_assert (pco_value == -1); /* Multiline PCO info */ - pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,1,FF00,13018400\r\n%PCOINFO: 1,3,FF00,13018403", 3, NULL); + pco_value = mm_altair_parse_vendor_pco_info ("%PCOINFO: 1,2,FF00,13018400\r\n%PCOINFO: 1,3,FF00,13018403", NULL); g_assert (pco_value == 3); } diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c index 9386f0ba..4a36f7b0 100644 --- a/src/mm-broadband-modem.c +++ b/src/mm-broadband-modem.c @@ -3499,16 +3499,9 @@ modem_3gpp_load_subscription_state (MMIfaceModem3gpp *self, user_data, modem_3gpp_load_subscription_state); - /* Reloading subscription state only occurs on a successfully registered - * modem. (Although the 3GPP interface does not reflect this until after - * loading operator information completes.) - * By default, we can assume that successful registration implies a - * provisioned SIM. - */ - mm_dbg ("Load subscription state: Marking the SIM as provisioned."); g_simple_async_result_set_op_res_gpointer ( result, - GUINT_TO_POINTER (MM_MODEM_3GPP_SUBSCRIPTION_STATE_PROVISIONED), + GUINT_TO_POINTER (MM_MODEM_3GPP_SUBSCRIPTION_STATE_UNKNOWN), NULL); g_simple_async_result_complete_in_idle (result); |