diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2013-08-21 13:27:41 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2013-08-21 13:29:50 +0200 |
commit | 7e9ae215509c7e55ca128023100258d664894c32 (patch) | |
tree | 8b5119a19df2d252840bd6f5d19c7e503107b787 /src | |
parent | 75aa4a0df708a981a5d2b1dafc8912dfd3af78e4 (diff) |
broadband-modem-qmi: avoid processing invalid TLVs in GetSignalStrength response
E.g. in the GetSignalStrength output we get EV-DO-only TLVs, even if EV-DO is
not the current access technology, what ends up generating the following:
$ sudo mmcli -m 0 --signal-get
/org/freedesktop/ModemManager1/Modem/0
-------------------------
Refresh rate: '5' seconds
-------------------------
EV-DO | RSSI: '0.00' dBm
| EcIo: '0.00' dBm
| SINR: '9.00' dBm
| Io: '-106.00' dB
-------------------------
UMTS | RSSI: '94.00' dBm
| EcIo: '-6.00' dBm
Instead, we will now assume that the RSSI list always contains the valid access
technologies being reported, and use that list to decide whether we process some
of the per-technology TLVs. We now end up getting:
$ sudo mmcli -m 0 --signal-get
/org/freedesktop/ModemManager1/Modem/0
-------------------------
Refresh rate: '5' seconds
-------------------------
UMTS | RSSI: '94.00' dBm
| EcIo: '-8.00' dBm
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 49 |
1 files changed, 24 insertions, 25 deletions
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c index b9ba41d9..cd2a30b6 100644 --- a/src/mm-broadband-modem-qmi.c +++ b/src/mm-broadband-modem-qmi.c @@ -8781,7 +8781,14 @@ signal_load_values_get_signal_strength_ready (QmiClientNas *client, /* Good, we have results */ ctx->values_result = g_slice_new0 (SignalLoadValuesResult); - /* RSSI */ + /* RSSI + * + * We will assume that valid access technologies reported in this output + * are the ones which are listed in the RSSI output. If a given access tech + * is not given in this list, it will not be considered afterwards (e.g. if + * no EV-DO is given in the RSSI list, the SINR level won't be processed, + * even if the TLV is available. + */ if (qmi_message_nas_get_signal_strength_output_get_rssi_list (output, &array, NULL)) { guint i; @@ -8833,19 +8840,16 @@ signal_load_values_get_signal_strength_ready (QmiClientNas *client, switch (element->radio_interface) { case QMI_NAS_RADIO_INTERFACE_CDMA_1X: - if (!ctx->values_result->cdma) - ctx->values_result->cdma = mm_signal_new (); - mm_signal_set_ecio (ctx->values_result->cdma, ((gdouble)element->ecio) * (-0.5)); + if (ctx->values_result->cdma) + mm_signal_set_ecio (ctx->values_result->cdma, ((gdouble)element->ecio) * (-0.5)); break; case QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO: - if (!ctx->values_result->evdo) - ctx->values_result->evdo = mm_signal_new (); - mm_signal_set_ecio (ctx->values_result->evdo, ((gdouble)element->ecio) * (-0.5)); + if (ctx->values_result->evdo) + mm_signal_set_ecio (ctx->values_result->evdo, ((gdouble)element->ecio) * (-0.5)); break; case QMI_NAS_RADIO_INTERFACE_UMTS: - if (!ctx->values_result->umts) - ctx->values_result->umts = mm_signal_new (); - mm_signal_set_ecio (ctx->values_result->umts, ((gdouble)element->ecio) * (-0.5)); + if (ctx->values_result->umts) + mm_signal_set_ecio (ctx->values_result->umts, ((gdouble)element->ecio) * (-0.5)); break; default: break; @@ -8855,38 +8859,33 @@ signal_load_values_get_signal_strength_ready (QmiClientNas *client, /* IO (EV-DO) */ if (qmi_message_nas_get_signal_strength_output_get_io (output, &aux_int32, NULL)) { - if (!ctx->values_result->evdo) - ctx->values_result->evdo = mm_signal_new (); - mm_signal_set_io (ctx->values_result->evdo, (gdouble)aux_int32); + if (ctx->values_result->evdo) + mm_signal_set_io (ctx->values_result->evdo, (gdouble)aux_int32); } /* RSRP (LTE) */ if (qmi_message_nas_get_signal_strength_output_get_lte_rsrp (output, &aux_int16, NULL)) { - if (!ctx->values_result->lte) - ctx->values_result->lte = mm_signal_new (); - mm_signal_set_rsrp (ctx->values_result->lte, (gdouble)aux_int16); + if (ctx->values_result->lte) + mm_signal_set_rsrp (ctx->values_result->lte, (gdouble)aux_int16); } /* RSRQ (LTE) */ if (qmi_message_nas_get_signal_strength_output_get_rsrq (output, &aux_int8, &radio_interface, NULL) && radio_interface == QMI_NAS_RADIO_INTERFACE_LTE) { - if (!ctx->values_result->lte) - ctx->values_result->lte = mm_signal_new (); - mm_signal_set_rsrq (ctx->values_result->lte, (gdouble)aux_int8); + if (ctx->values_result->lte) + mm_signal_set_rsrq (ctx->values_result->lte, (gdouble)aux_int8); } /* SNR (LTE) */ if (qmi_message_nas_get_signal_strength_output_get_lte_snr (output, &aux_int16, NULL)) { - if (!ctx->values_result->lte) - ctx->values_result->lte = mm_signal_new (); - mm_signal_set_snr (ctx->values_result->lte, (0.1) * ((gdouble)aux_int16)); + if (ctx->values_result->lte) + mm_signal_set_snr (ctx->values_result->lte, (0.1) * ((gdouble)aux_int16)); } /* SINR (EV-DO) */ if (qmi_message_nas_get_signal_strength_output_get_sinr (output, &sinr, NULL)) { - if (!ctx->values_result->evdo) - ctx->values_result->evdo = mm_signal_new (); - mm_signal_set_sinr (ctx->values_result->evdo, get_db_from_sinr_level (sinr)); + if (ctx->values_result->evdo) + mm_signal_set_sinr (ctx->values_result->evdo, get_db_from_sinr_level (sinr)); } qmi_message_nas_get_signal_strength_output_unref (output); |