aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-10-08 11:41:03 +0200
committerAleksander Morgado <aleksander@lanedo.com>2012-10-08 11:41:03 +0200
commit13fa73f66677062f254f1c5e25eb874047012d96 (patch)
treea1efd888bba00b90ce38f5d371e3e1afb082a101
parent8d47d31b29ebec367dfbc64782961d7c30a0a83e (diff)
broadband-modem-qmi: process CDMA 1x & EV-DO roaming flags
-rw-r--r--src/mm-broadband-modem-qmi.c60
1 files changed, 56 insertions, 4 deletions
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c
index 9a220fa9..83197de1 100644
--- a/src/mm-broadband-modem-qmi.c
+++ b/src/mm-broadband-modem-qmi.c
@@ -4008,10 +4008,7 @@ common_process_serving_system_cdma (MMBroadbandModemQmi *self,
else
qmi_indication_nas_serving_system_output_get_cdma_system_id (indication_output, &sid, &nid, NULL);
- /* TODO: Roaming flags */
-
- /* Build registration states */
-
+ /* Build generic registration states */
if (mm_access_technologies & MM_IFACE_MODEM_CDMA_ALL_CDMA1X_ACCESS_TECHNOLOGIES_MASK)
mm_cdma1x_registration_state = mm_modem_cdma_registration_state_from_qmi_registration_state (registration_state);
else
@@ -4022,6 +4019,61 @@ common_process_serving_system_cdma (MMBroadbandModemQmi *self,
else
mm_evdo_registration_state = MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN;
+ /* Process per-technology roaming flags */
+ if (response_output) {
+ GArray *array;
+
+ if (qmi_message_nas_get_serving_system_output_get_roaming_indicator_list (response_output, &array, NULL)) {
+ guint i;
+
+ for (i = 0; i < array->len; i++) {
+ QmiMessageNasGetServingSystemOutputRoamingIndicatorListElement *element;
+
+ element = &g_array_index (array, QmiMessageNasGetServingSystemOutputRoamingIndicatorListElement, i);
+
+ if (element->radio_interface == QMI_NAS_RADIO_INTERFACE_CDMA_1X &&
+ mm_cdma1x_registration_state == MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED) {
+ if (element->roaming_indicator == QMI_NAS_ROAMING_INDICATOR_STATUS_ON)
+ mm_cdma1x_registration_state = MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING;
+ else if (element->roaming_indicator == QMI_NAS_ROAMING_INDICATOR_STATUS_OFF)
+ mm_cdma1x_registration_state = MM_MODEM_CDMA_REGISTRATION_STATE_HOME;
+ } else if (element->radio_interface == QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO &&
+ mm_evdo_registration_state == MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED) {
+ if (element->roaming_indicator == QMI_NAS_ROAMING_INDICATOR_STATUS_ON)
+ mm_evdo_registration_state = MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING;
+ else if (element->roaming_indicator == QMI_NAS_ROAMING_INDICATOR_STATUS_OFF)
+ mm_evdo_registration_state = MM_MODEM_CDMA_REGISTRATION_STATE_HOME;
+ }
+ }
+ }
+ } else {
+ GArray *array;
+
+ if (qmi_indication_nas_serving_system_output_get_roaming_indicator_list (indication_output, &array, NULL)) {
+ guint i;
+
+ for (i = 0; i < array->len; i++) {
+ QmiIndicationNasServingSystemOutputRoamingIndicatorListElement *element;
+
+ element = &g_array_index (array, QmiIndicationNasServingSystemOutputRoamingIndicatorListElement, i);
+
+ if (element->radio_interface == QMI_NAS_RADIO_INTERFACE_CDMA_1X &&
+ mm_cdma1x_registration_state == MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED) {
+ if (element->roaming_indicator == QMI_NAS_ROAMING_INDICATOR_STATUS_ON)
+ mm_cdma1x_registration_state = MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING;
+ else if (element->roaming_indicator == QMI_NAS_ROAMING_INDICATOR_STATUS_OFF)
+ mm_cdma1x_registration_state = MM_MODEM_CDMA_REGISTRATION_STATE_HOME;
+ } else if (element->radio_interface == QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO &&
+ mm_evdo_registration_state == MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED) {
+ if (element->roaming_indicator == QMI_NAS_ROAMING_INDICATOR_STATUS_ON)
+ mm_evdo_registration_state = MM_MODEM_CDMA_REGISTRATION_STATE_ROAMING;
+ else if (element->roaming_indicator == QMI_NAS_ROAMING_INDICATOR_STATUS_OFF)
+ mm_evdo_registration_state = MM_MODEM_CDMA_REGISTRATION_STATE_HOME;
+ }
+ }
+ }
+ }
+
/* Note: don't rely on the 'Detailed Service Status', it's not always given. */
/* Report new registration states */