mirror of git://git.sysmocom.de/ofono
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:
parent
e98af8127f
commit
17bf6ac7c0
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue