[PATCH v2] altair-lte: update PCO to handle latest VZW deployment

Aleksander Morgado aleksander at aleksander.es
Mon Jun 9 07:57:32 PDT 2014


On 06/06/14 21:35, Thieu Le wrote:
> 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
> ---

Pushed, thanks.

>  plugins/altair/mm-broadband-modem-altair-lte.c     | 51 +++-------------------
>  plugins/altair/mm-modem-helpers-altair-lte.c       | 28 ++++++++----
>  plugins/altair/mm-modem-helpers-altair-lte.h       |  4 +-
>  .../altair/tests/test-modem-helpers-altair-lte.c   | 30 +++++++++----
>  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 b71884b..c732c52 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 90b29e0..3e52ee9 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 56a6e15..b319997 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 46f70b6..d83d3e5 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 9386f0b..4a36f7b 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);
> 


-- 
Aleksander
https://aleksander.es


More information about the ModemManager-devel mailing list