[PATCH 2/2] altair-lte: ignore invalid bands in %BANDCAP / %GETCFG="BAND" responses
Aleksander Morgado
aleksander at aleksander.es
Thu May 29 01:11:44 PDT 2014
On 29/05/14 08:13, Ben Chan wrote:
> Due to a firmware issue, the modem may reply an invalid band value, such
> as 0, for the %BANDCAP or %GETCFG="BAND" command. This patch moves
> parse_bands_response() to mm-modem-helpers-altair-lte.c, modifies the
> function to ignore any invalid band outside the range of E-UTRAN
> operating bands, and add unit tests for the function.
Kudos for the unit test! :)
Pushed, thanks.
> ---
> plugins/altair/mm-broadband-modem-altair-lte.c | 35 ++-----------------
> plugins/altair/mm-modem-helpers-altair-lte.c | 39 ++++++++++++++++++++++
> plugins/altair/mm-modem-helpers-altair-lte.h | 3 ++
> .../altair/tests/test-modem-helpers-altair-lte.c | 29 ++++++++++++++++
> 4 files changed, 73 insertions(+), 33 deletions(-)
>
> diff --git a/plugins/altair/mm-broadband-modem-altair-lte.c b/plugins/altair/mm-broadband-modem-altair-lte.c
> index 8240185..d313a51 100644
> --- a/plugins/altair/mm-broadband-modem-altair-lte.c
> +++ b/plugins/altair/mm-broadband-modem-altair-lte.c
> @@ -264,37 +264,6 @@ load_current_capabilities (MMIfaceModem *self,
> }
>
> /*****************************************************************************/
> -/* supported/current Bands helpers*/
> -
> -static GArray *
> -parse_bands_response (const gchar *response)
> -{
> - guint32 bandval;
> - MMModemBand band;
> - gchar **split;
> - guint i, num_of_bands;
> - GArray *bands;
> -
> - split = g_strsplit_set (response, ",", -1);
> - if (!split)
> - return NULL;
> -
> - num_of_bands = g_strv_length (split);
> -
> - bands = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), num_of_bands);
> -
> - for (i = 0; split[i]; i++) {
> - bandval = (guint32)strtoul (split[i], NULL, 10);
> - band = MM_MODEM_BAND_EUTRAN_I - 1 + bandval;
> - g_array_append_val (bands, band);
> - }
> -
> - g_strfreev (split);
> -
> - return bands;
> -}
> -
> -/*****************************************************************************/
> /* Load supported bands (Modem interface) */
>
> static GArray *
> @@ -334,7 +303,7 @@ load_supported_bands_done (MMIfaceModem *self,
> */
> response = mm_strip_tag (response, BANDCAP_TAG);
>
> - bands = parse_bands_response (response);
> + bands = mm_altair_parse_bands_response (response);
> if (!bands) {
> mm_dbg ("Failed to parse supported bands response");
> g_simple_async_result_set_error (
> @@ -415,7 +384,7 @@ load_current_bands_done (MMIfaceModem *self,
> */
> response = mm_strip_tag (response, CFGBANDS_TAG);
>
> - bands = parse_bands_response (response);
> + bands = mm_altair_parse_bands_response (response);
> if (!bands) {
> mm_dbg ("Failed to parse current bands response");
> g_simple_async_result_set_error (
> diff --git a/plugins/altair/mm-modem-helpers-altair-lte.c b/plugins/altair/mm-modem-helpers-altair-lte.c
> index e19f147..b369e29 100644
> --- a/plugins/altair/mm-modem-helpers-altair-lte.c
> +++ b/plugins/altair/mm-modem-helpers-altair-lte.c
> @@ -14,6 +14,7 @@
> *
> */
>
> +#include <stdlib.h>
> #include <string.h>
>
> #include <ModemManager.h>
> @@ -23,6 +24,44 @@
> #include "mm-modem-helpers-altair-lte.h"
>
> /*****************************************************************************/
> +/* Bands response parser */
> +
> +GArray *
> +mm_altair_parse_bands_response (const gchar *response)
> +{
> + gchar **split;
> + GArray *bands;
> + guint i;
> +
> + /*
> + * Response is "<band>[,<band>...]"
> + */
> + split = g_strsplit_set (response, ",", -1);
> + if (!split)
> + return NULL;
> +
> + bands = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), g_strv_length (split));
> +
> + for (i = 0; split[i]; i++) {
> + guint32 band_value;
> + MMModemBand band;
> +
> + band_value = (guint32)strtoul (split[i], NULL, 10);
> + band = MM_MODEM_BAND_EUTRAN_I - 1 + band_value;
> +
> + /* Due to a firmware issue, the modem may incorrectly includes 0 in the
> + * bands response. We thus ignore any band value outside the range of
> + * E-UTRAN operating bands. */
> + if (band >= MM_MODEM_BAND_EUTRAN_I && band <= MM_MODEM_BAND_EUTRAN_XLIV)
> + g_array_append_val (bands, band);
> + }
> +
> + g_strfreev (split);
> +
> + return bands;
> +}
> +
> +/*****************************************************************************/
> /* +CEER response parser */
>
> gchar *
> diff --git a/plugins/altair/mm-modem-helpers-altair-lte.h b/plugins/altair/mm-modem-helpers-altair-lte.h
> index c6fbf34..56a6e15 100644
> --- a/plugins/altair/mm-modem-helpers-altair-lte.h
> +++ b/plugins/altair/mm-modem-helpers-altair-lte.h
> @@ -19,6 +19,9 @@
>
> #include <glib.h>
>
> +/* Bands response parser */
> +GArray *mm_altair_parse_bands_response (const gchar *response);
> +
> /* +CEER response parser */
> gchar *mm_altair_parse_ceer_response (const gchar *response,
> GError **error);
> diff --git a/plugins/altair/tests/test-modem-helpers-altair-lte.c b/plugins/altair/tests/test-modem-helpers-altair-lte.c
> index 2df3eef..46f70b6 100644
> --- a/plugins/altair/tests/test-modem-helpers-altair-lte.c
> +++ b/plugins/altair/tests/test-modem-helpers-altair-lte.c
> @@ -20,9 +20,37 @@
> #include <glib-object.h>
> #include <locale.h>
>
> +#include <ModemManager.h>
> +#define _LIBMM_INSIDE_MM
> +#include <libmm-glib.h>
> +
> #include "mm-modem-helpers-altair-lte.h"
>
> /*****************************************************************************/
> +/* Test bands response parsing */
> +
> +static void
> +test_parse_bands (void)
> +{
> + GArray *bands;
> +
> + bands = mm_altair_parse_bands_response ("");
> + g_assert (bands != NULL);
> + g_assert_cmpuint (bands->len, ==, 0);
> + g_array_free (bands, TRUE);
> +
> + /* 0 and 45 are outside the range of E-UTRAN operating bands and should be ignored. */
> + bands = mm_altair_parse_bands_response ("0, 0, 1, 4,13,44,45");
> + g_assert (bands != NULL);
> + g_assert_cmpuint (bands->len, ==, 4);
> + g_assert_cmpuint (g_array_index (bands, MMModemBand, 0), ==, MM_MODEM_BAND_EUTRAN_I);
> + g_assert_cmpuint (g_array_index (bands, MMModemBand, 1), ==, MM_MODEM_BAND_EUTRAN_IV);
> + g_assert_cmpuint (g_array_index (bands, MMModemBand, 2), ==, MM_MODEM_BAND_EUTRAN_XIII);
> + g_assert_cmpuint (g_array_index (bands, MMModemBand, 3), ==, MM_MODEM_BAND_EUTRAN_XLIV);
> + g_array_free (bands, TRUE);
> +}
> +
> +/*****************************************************************************/
> /* Test +CEER responses */
>
> typedef struct {
> @@ -105,6 +133,7 @@ int main (int argc, char **argv)
> g_type_init ();
> g_test_init (&argc, &argv, NULL);
>
> + g_test_add_func ("/MM/altair/parse_bands", test_parse_bands);
> g_test_add_func ("/MM/altair/ceer", test_ceer);
> g_test_add_func ("/MM/altair/parse_cid", test_parse_cid);
> g_test_add_func ("/MM/altair/parse_vendor_pco_info", test_parse_vendor_pco_info);
>
--
Aleksander
https://aleksander.es
More information about the ModemManager-devel
mailing list