[PATCH 2/2] altair-lte: ignore invalid bands in %BANDCAP / %GETCFG="BAND" responses

Ben Chan benchan at chromium.org
Wed May 28 23:13:15 PDT 2014


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.
---
 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);
-- 
1.9.1.423.g4596e3a



More information about the ModemManager-devel mailing list