aboutsummaryrefslogtreecommitdiff
path: root/src/mm-modem-helpers-qmi.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2013-03-13 11:16:13 +0100
committerAleksander Morgado <aleksander@lanedo.com>2013-04-11 09:17:13 +0200
commit162d96b11680bbdf819a3f8e1c058184abb7b792 (patch)
treebc983e82899cbe9ab3174fcb6b1bf8e1bceb4da9 /src/mm-modem-helpers-qmi.c
parentbe8c8a99bb29d340720715874696bc1fae11d331 (diff)
test-modem-helpers-qmi: new unit tests to check the 'current-capabilities' logic
Based on Dan's tests with QMI modems.
Diffstat (limited to 'src/mm-modem-helpers-qmi.c')
-rw-r--r--src/mm-modem-helpers-qmi.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/mm-modem-helpers-qmi.c b/src/mm-modem-helpers-qmi.c
index 7de04347..3331de6a 100644
--- a/src/mm-modem-helpers-qmi.c
+++ b/src/mm-modem-helpers-qmi.c
@@ -1145,3 +1145,74 @@ mm_bearer_allowed_auth_to_qmi_authentication (MMBearerAllowedAuth auth)
return out;
}
+
+/*****************************************************************************/
+
+MMModemCapability
+mm_modem_capability_from_qmi_capabilities_context (MMQmiCapabilitiesContext *ctx)
+{
+ MMModemCapability tmp = MM_MODEM_CAPABILITY_NONE;
+ gchar *nas_ssp_mode_preference_str;
+ gchar *nas_ssp_band_preference_str;
+ gchar *nas_ssp_lte_band_preference_str;
+ gchar *nas_tp_str;
+ gchar *dms_capabilities_str;
+ gchar *tmp_str;
+
+ /* SSP logic to gather capabilities uses the Mode Preference TLV if available,
+ * and if not available it falls back to using Band Preference TLVs */
+ if (ctx->nas_ssp_mode_preference_mask)
+ tmp = mm_modem_capability_from_qmi_rat_mode_preference (ctx->nas_ssp_mode_preference_mask);
+ else if (ctx->nas_ssp_band_preference_mask) {
+ tmp = mm_modem_capability_from_qmi_band_preference (ctx->nas_ssp_band_preference_mask);
+ /* Just the presence of the LTE band preference tells us it's LTE */
+ if (ctx->nas_ssp_lte_band_preference_mask)
+ tmp |= MM_MODEM_CAPABILITY_LTE;
+ }
+
+ /* If no value retrieved from SSP, check TP. We only process TP
+ * values if not 'auto'. */
+ if ( tmp == MM_MODEM_CAPABILITY_NONE
+ && ctx->nas_tp_mask
+ && ctx->nas_tp_mask != QMI_NAS_RADIO_TECHNOLOGY_PREFERENCE_AUTO)
+ tmp = mm_modem_capability_from_qmi_radio_technology_preference (ctx->nas_tp_mask);
+
+ /* Final capabilities are the intersection between the Technology
+ * Preference or SSP and the device's capabilities.
+ * If the Technology Preference was "auto" or unknown we just fall back
+ * to the Get Capabilities response.
+ */
+ if (tmp == MM_MODEM_CAPABILITY_NONE)
+ tmp = ctx->dms_capabilities;
+ else
+ tmp &= ctx->dms_capabilities;
+
+
+ /* Log about the logic applied */
+ nas_ssp_mode_preference_str = qmi_nas_rat_mode_preference_build_string_from_mask (ctx->nas_ssp_mode_preference_mask);
+ nas_ssp_band_preference_str = qmi_nas_band_preference_build_string_from_mask (ctx->nas_ssp_band_preference_mask);
+ nas_ssp_lte_band_preference_str = qmi_nas_lte_band_preference_build_string_from_mask (ctx->nas_ssp_band_preference_mask);
+ nas_tp_str = qmi_nas_radio_technology_preference_build_string_from_mask (ctx->nas_tp_mask);
+ dms_capabilities_str = mm_modem_capability_build_string_from_mask (ctx->dms_capabilities);
+ tmp_str = mm_modem_capability_build_string_from_mask (tmp);
+ mm_dbg ("Current capabilities built: '%s'\n"
+ " SSP mode preference: '%s'\n"
+ " SSP band preference: '%s'\n"
+ " SSP LTE band preference: '%s'\n"
+ " TP: '%s'\n"
+ " DMS Capabilities: '%s'",
+ tmp_str,
+ nas_ssp_mode_preference_str ? nas_ssp_mode_preference_str : "unknown",
+ nas_ssp_band_preference_str ? nas_ssp_band_preference_str : "unknown",
+ nas_ssp_lte_band_preference_str ? nas_ssp_lte_band_preference_str : "unknown",
+ nas_tp_str ? nas_tp_str : "unknown",
+ dms_capabilities_str);
+ g_free (nas_ssp_mode_preference_str);
+ g_free (nas_ssp_band_preference_str);
+ g_free (nas_ssp_lte_band_preference_str);
+ g_free (nas_tp_str);
+ g_free (dms_capabilities_str);
+ g_free (tmp_str);
+
+ return tmp;
+}