Lac and cellid information are optional in ss_info notifications.
Remember them in order to give a correct information each time a
notification is received.
---
 drivers/qmimodem/network-registration.c | 53 ++++++++++++++++++++++-----------
 1 file changed, 35 insertions(+), 18 deletions(-)

diff --git a/drivers/qmimodem/network-registration.c 
b/drivers/qmimodem/network-registration.c
index 1fccb57..04f20c6 100644
--- a/drivers/qmimodem/network-registration.c
+++ b/drivers/qmimodem/network-registration.c
@@ -42,6 +42,8 @@ struct netreg_data {
        struct qmi_service *nas;
        struct ofono_network_operator operator;
        uint8_t current_rat;
+       int lac;
+       int cellid;
        bool is_roaming;
 };
 
@@ -166,6 +168,31 @@ static bool extract_ss_info(struct qmi_result *result, int 
*status,
        return true;
 }
 
+static int remember_ss_info(struct netreg_data *data, int status, int lac,
+                                       int cellid, enum roaming_status roaming)
+{
+       if (roaming == ROAMING_STATUS_ON)
+               data->is_roaming = true;
+       else if (roaming == ROAMING_STATUS_OFF)
+               data->is_roaming = false;
+
+       if (status == QMI_NAS_REGISTRATION_STATE_REGISTERED) {
+               if (lac >= 0)
+                       data->lac = lac;
+               if (cellid >= 0)
+                       data->cellid = cellid;
+       } else {
+               data->lac = -1;
+               data->cellid = -1;
+       }
+
+       if (status == QMI_NAS_REGISTRATION_STATE_REGISTERED &&
+                                                       data->is_roaming)
+               status = NETWORK_REGISTRATION_STATUS_ROAMING;
+
+       return status;
+}
+
 static void ss_info_notify(struct qmi_result *result, void *user_data)
 {
        struct ofono_netreg *netreg = user_data;
@@ -183,16 +210,10 @@ static void ss_info_notify(struct qmi_result *result, 
void *user_data)
                                                        &data->operator))
                return;
 
-       if (roaming == ROAMING_STATUS_ON)
-               data->is_roaming = true;
-       else if (roaming == ROAMING_STATUS_OFF)
-               data->is_roaming = false;
-
-       if (status == QMI_NAS_REGISTRATION_STATE_REGISTERED &&
-                                                       data->is_roaming)
-               status = NETWORK_REGISTRATION_STATUS_ROAMING;
+       status = remember_ss_info(data, status, lac, cellid, roaming);
 
-       ofono_netreg_status_notify(netreg, status, lac, cellid, tech);
+       ofono_netreg_status_notify(netreg, status, data->lac, data->cellid,
+                                                                       tech);
 }
 
 static void get_ss_info_cb(struct qmi_result *result, void *user_data)
@@ -216,16 +237,10 @@ static void get_ss_info_cb(struct qmi_result *result, 
void *user_data)
                return;
        }
 
-       if (roaming == ROAMING_STATUS_ON)
-               data->is_roaming = true;
-       else if (roaming == ROAMING_STATUS_OFF)
-               data->is_roaming = false;
-
-       if (status == QMI_NAS_REGISTRATION_STATE_REGISTERED &&
-                                                       data->is_roaming)
-               status = NETWORK_REGISTRATION_STATUS_ROAMING;
+       status = remember_ss_info(data, status, lac, cellid, roaming);
 
-       CALLBACK_WITH_SUCCESS(cb, status, lac, cellid, tech, cbd->data);
+       CALLBACK_WITH_SUCCESS(cb, status, data->lac, data->cellid, tech,
+                                                               cbd->data);
 }
 
 static void qmi_registration_status(struct ofono_netreg *netreg,
@@ -613,6 +628,8 @@ static int qmi_netreg_probe(struct ofono_netreg *netreg,
 
        data->current_rat = QMI_NAS_NETWORK_RAT_NO_CHANGE;
        data->is_roaming = false;
+       data->lac = -1;
+       data->cellid = -1;
 
        ofono_netreg_set_data(netreg, data);
 
-- 
2.7.4

_______________________________________________
ofono mailing list
[email protected]
https://lists.ofono.org/mailman/listinfo/ofono

Reply via email to