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
This commit is contained in:
committed by
Aleksander Morgado
parent
af810a0a87
commit
0b975f2266
@@ -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,32 +1207,10 @@ 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,
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user