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.
This commit is contained in:
Christophe Ronco 2019-07-17 15:29:24 +02:00 committed by Denis Kenzior
parent e98af8127f
commit 17bf6ac7c0
1 changed files with 35 additions and 18 deletions

View File

@ -42,6 +42,8 @@ struct netreg_data {
struct qmi_service *nas; struct qmi_service *nas;
struct ofono_network_operator operator; struct ofono_network_operator operator;
uint8_t current_rat; uint8_t current_rat;
int lac;
int cellid;
bool is_roaming; bool is_roaming;
}; };
@ -166,6 +168,31 @@ static bool extract_ss_info(struct qmi_result *result, int *status,
return true; 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) static void ss_info_notify(struct qmi_result *result, void *user_data)
{ {
struct ofono_netreg *netreg = 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)) &data->operator))
return; return;
if (roaming == ROAMING_STATUS_ON) status = remember_ss_info(data, status, lac, cellid, roaming);
data->is_roaming = true;
else if (roaming == ROAMING_STATUS_OFF)
data->is_roaming = false;
if (status == QMI_NAS_REGISTRATION_STATE_REGISTERED && ofono_netreg_status_notify(netreg, status, data->lac, data->cellid,
data->is_roaming) tech);
status = NETWORK_REGISTRATION_STATUS_ROAMING;
ofono_netreg_status_notify(netreg, status, lac, cellid, tech);
} }
static void get_ss_info_cb(struct qmi_result *result, void *user_data) 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; return;
} }
if (roaming == ROAMING_STATUS_ON) status = remember_ss_info(data, status, lac, cellid, roaming);
data->is_roaming = true;
else if (roaming == ROAMING_STATUS_OFF)
data->is_roaming = false;
if (status == QMI_NAS_REGISTRATION_STATE_REGISTERED && CALLBACK_WITH_SUCCESS(cb, status, data->lac, data->cellid, tech,
data->is_roaming) cbd->data);
status = NETWORK_REGISTRATION_STATUS_ROAMING;
CALLBACK_WITH_SUCCESS(cb, status, lac, cellid, tech, cbd->data);
} }
static void qmi_registration_status(struct ofono_netreg *netreg, 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->current_rat = QMI_NAS_NETWORK_RAT_NO_CHANGE;
data->is_roaming = false; data->is_roaming = false;
data->lac = -1;
data->cellid = -1;
ofono_netreg_set_data(netreg, data); ofono_netreg_set_data(netreg, data);