aboutsummaryrefslogtreecommitdiff
path: root/src/mm-modem-helpers-qmi.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2021-03-15 17:46:49 +0100
committerAleksander Morgado <aleksander@aleksander.es>2021-03-15 17:46:49 +0100
commitfdfd4b270aa3bb31185feb833691f134c887f869 (patch)
tree4194c73eab79b87633e5b7459681c04bc433a65f /src/mm-modem-helpers-qmi.c
parentbb5bc9c8c560a24ef2951bdb9e1da18dedd7c5b0 (diff)
shared-qmi: acquisition order preference TLV always same items
The acquisition order preference TLV must always have the same number of elements, just the order of the elements should be different. Also, always prefer the acquisition order preference TLV to the GSM+WCDMA specific one, which is the same logic the modem applies. Fixes https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/340
Diffstat (limited to 'src/mm-modem-helpers-qmi.c')
-rw-r--r--src/mm-modem-helpers-qmi.c108
1 files changed, 58 insertions, 50 deletions
diff --git a/src/mm-modem-helpers-qmi.c b/src/mm-modem-helpers-qmi.c
index ef951bac..7d98084a 100644
--- a/src/mm-modem-helpers-qmi.c
+++ b/src/mm-modem-helpers-qmi.c
@@ -1106,67 +1106,75 @@ mm_modem_capability_to_qmi_acquisition_order_preference (MMModemCapability caps)
return array;
}
-GArray *
-mm_modem_mode_to_qmi_acquisition_order_preference (MMModemMode allowed,
- MMModemMode preferred,
- gboolean is_cdma,
- gboolean is_3gpp)
+static gboolean
+radio_interface_array_contains (GArray *array,
+ QmiNasRadioInterface act)
{
- GArray *array;
- QmiNasRadioInterface value;
+ guint i;
- array = g_array_new (FALSE, FALSE, sizeof (QmiNasRadioInterface));
+ for (i = 0; i < array->len; i++) {
+ QmiNasRadioInterface value;
- if (allowed & MM_MODEM_MODE_5G) {
- value = QMI_NAS_RADIO_INTERFACE_5GNR;
- if (preferred == MM_MODEM_MODE_5G)
- g_array_prepend_val (array, value);
- else
- g_array_append_val (array, value);
+ value = g_array_index (array, QmiNasRadioInterface, i);
+ if (value == act)
+ return TRUE;
}
+ return FALSE;
+}
- if (allowed & MM_MODEM_MODE_4G) {
- value = QMI_NAS_RADIO_INTERFACE_LTE;
- if (preferred == MM_MODEM_MODE_4G)
- g_array_prepend_val (array, value);
- else
+static void
+radio_interface_array_add_missing (GArray *array,
+ GArray *all)
+{
+ guint i;
+
+ for (i = 0; i < all->len; i++) {
+ QmiNasRadioInterface value;
+
+ value = g_array_index (all, QmiNasRadioInterface, i);
+ if (!radio_interface_array_contains (array, value))
g_array_append_val (array, value);
}
+}
- if (allowed & MM_MODEM_MODE_3G) {
- if (is_cdma) {
- value = QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO;
- if (preferred == MM_MODEM_MODE_3G)
- g_array_prepend_val (array, value);
- else
- g_array_append_val (array, value);
- }
- if (is_3gpp) {
- value = QMI_NAS_RADIO_INTERFACE_UMTS;
- if (preferred == MM_MODEM_MODE_3G)
- g_array_prepend_val (array, value);
- else
- g_array_append_val (array, value);
- }
- }
+GArray *
+mm_modem_mode_to_qmi_acquisition_order_preference (MMModemMode allowed,
+ MMModemMode preferred,
+ GArray *all)
+{
+ GArray *array;
+ QmiNasRadioInterface preferred_radio = QMI_NAS_RADIO_INTERFACE_UNKNOWN;
+ QmiNasRadioInterface value;
- if (allowed & MM_MODEM_MODE_2G) {
- if (is_cdma) {
- value = QMI_NAS_RADIO_INTERFACE_CDMA_1X;
- if (preferred == MM_MODEM_MODE_2G)
- g_array_prepend_val (array, value);
- else
- g_array_append_val (array, value);
- }
- if (is_3gpp) {
- value = QMI_NAS_RADIO_INTERFACE_GSM;
- if (preferred == MM_MODEM_MODE_2G)
- g_array_prepend_val (array, value);
- else
- g_array_append_val (array, value);
- }
+ array = g_array_sized_new (FALSE, FALSE, sizeof (QmiNasRadioInterface), all->len);
+
+#define PROCESS_ALLOWED_PREFERRED_MODE(MODE,RADIO) \
+ if ((allowed & MODE) && (radio_interface_array_contains (all, RADIO))) { \
+ if ((preferred == MODE) && (preferred_radio == QMI_NAS_RADIO_INTERFACE_UNKNOWN)) \
+ preferred_radio = RADIO; \
+ else { \
+ value = RADIO; \
+ g_array_append_val (array, value); \
+ } \
}
+ PROCESS_ALLOWED_PREFERRED_MODE (MM_MODEM_MODE_5G, QMI_NAS_RADIO_INTERFACE_5GNR);
+ PROCESS_ALLOWED_PREFERRED_MODE (MM_MODEM_MODE_4G, QMI_NAS_RADIO_INTERFACE_LTE);
+ PROCESS_ALLOWED_PREFERRED_MODE (MM_MODEM_MODE_3G, QMI_NAS_RADIO_INTERFACE_UMTS);
+ PROCESS_ALLOWED_PREFERRED_MODE (MM_MODEM_MODE_3G, QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO);
+ PROCESS_ALLOWED_PREFERRED_MODE (MM_MODEM_MODE_2G, QMI_NAS_RADIO_INTERFACE_GSM);
+ PROCESS_ALLOWED_PREFERRED_MODE (MM_MODEM_MODE_2G, QMI_NAS_RADIO_INTERFACE_CDMA_1X);
+
+#undef PROCESS_ALLOWED_PREFERRED_MODE
+
+ if (preferred_radio != QMI_NAS_RADIO_INTERFACE_UNKNOWN)
+ g_array_prepend_val (array, preferred_radio);
+
+ /* the acquisition order preference is a TLV that must ALWAYS contain the
+ * same list of QmiNasRadioInterface values, just with a different order. */
+ radio_interface_array_add_missing (array, all);
+ g_assert_cmpuint (array->len, ==, all->len);
+
return array;
}