diff options
author | Christophe Ronco <c.ronco@kerlink.fr> | 2019-07-17 15:29:24 +0200 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2019-07-19 01:19:23 -0500 |
commit | 17bf6ac7c0b269bd7ac0678a6f43f920fa8f2fb3 (patch) | |
tree | 2bebecfa8ec7feca26f710b967467191c7a5be2f /drivers/qmimodem | |
parent | e98af8127fcffc54a6a3c969bbd9a4c5793395ad (diff) | |
download | ofono-17bf6ac7c0b269bd7ac0678a6f43f920fa8f2fb3.tar.gz |
qmimodem: remember lac and cellid
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.
Diffstat (limited to 'drivers/qmimodem')
-rw-r--r-- | drivers/qmimodem/network-registration.c | 53 |
1 files changed, 35 insertions, 18 deletions
diff --git a/drivers/qmimodem/network-registration.c b/drivers/qmimodem/network-registration.c index 1fccb573..04f20c66 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); |