modem-helpers-qmi: new helper to process System Info messages
This commit is contained in:
@@ -1517,6 +1517,628 @@ mm_modem_cdma_activation_state_from_qmi_activation_state (QmiDmsActivationState
|
|||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
static void
|
||||||
|
process_common_info (const gchar *info_name,
|
||||||
|
QmiNasServiceStatus service_status,
|
||||||
|
gboolean domain_valid,
|
||||||
|
QmiNasNetworkServiceDomain domain,
|
||||||
|
gboolean roaming_status_valid,
|
||||||
|
QmiNasRoamingStatus roaming_status,
|
||||||
|
gboolean forbidden_valid,
|
||||||
|
gboolean forbidden,
|
||||||
|
gboolean lac_valid,
|
||||||
|
guint16 lac,
|
||||||
|
gboolean tac_valid,
|
||||||
|
guint16 tac,
|
||||||
|
gboolean cid_valid,
|
||||||
|
guint32 cid,
|
||||||
|
gboolean network_id_valid,
|
||||||
|
const gchar *mcc,
|
||||||
|
const gchar *mnc,
|
||||||
|
MMModem3gppRegistrationState *out_cs_registration_state,
|
||||||
|
MMModem3gppRegistrationState *out_ps_registration_state,
|
||||||
|
guint16 *out_lac,
|
||||||
|
guint16 *out_tac,
|
||||||
|
guint32 *out_cid,
|
||||||
|
gchar **out_operator_id,
|
||||||
|
gpointer log_object)
|
||||||
|
{
|
||||||
|
#define SET_OUTPUT(OUT, VAL) do { \
|
||||||
|
if (OUT) \
|
||||||
|
*(OUT) = (VAL); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* If power save service status reported the modem is not actively searching
|
||||||
|
* for a network, therefore "idle". */
|
||||||
|
if (service_status == QMI_NAS_SERVICE_STATUS_POWER_SAVE) {
|
||||||
|
SET_OUTPUT (out_cs_registration_state, MM_MODEM_3GPP_REGISTRATION_STATE_IDLE);
|
||||||
|
SET_OUTPUT (out_ps_registration_state, MM_MODEM_3GPP_REGISTRATION_STATE_IDLE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If no service status reported, the modem is actively searching for a
|
||||||
|
* network, therefore "searching". */
|
||||||
|
if (service_status == QMI_NAS_SERVICE_STATUS_NONE) {
|
||||||
|
SET_OUTPUT (out_cs_registration_state, MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING);
|
||||||
|
SET_OUTPUT (out_ps_registration_state, MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* When forbidden, the service status is usually reported as 'limited' or
|
||||||
|
* 'limited-regional', e.g. allowing only emergency calls. If the
|
||||||
|
* forbidden flag is explicitly reported, we report 'denied', otherwise
|
||||||
|
* 'emergency-services-only' */
|
||||||
|
if (forbidden_valid && forbidden) {
|
||||||
|
SET_OUTPUT (out_cs_registration_state, MM_MODEM_3GPP_REGISTRATION_STATE_DENIED);
|
||||||
|
SET_OUTPUT (out_ps_registration_state, MM_MODEM_3GPP_REGISTRATION_STATE_DENIED);
|
||||||
|
} else if (service_status == QMI_NAS_SERVICE_STATUS_LIMITED ||
|
||||||
|
service_status == QMI_NAS_SERVICE_STATUS_LIMITED_REGIONAL) {
|
||||||
|
SET_OUTPUT (out_cs_registration_state, MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY);
|
||||||
|
SET_OUTPUT (out_ps_registration_state, MM_MODEM_3GPP_REGISTRATION_STATE_EMERGENCY_ONLY);
|
||||||
|
}
|
||||||
|
/* On a successful registration (either home or roaming) we require a valid
|
||||||
|
* domain and "available" service status */
|
||||||
|
else if (domain_valid &&
|
||||||
|
domain != QMI_NAS_NETWORK_SERVICE_DOMAIN_UNKNOWN &&
|
||||||
|
domain != QMI_NAS_NETWORK_SERVICE_DOMAIN_NONE &&
|
||||||
|
service_status == QMI_NAS_SERVICE_STATUS_AVAILABLE) {
|
||||||
|
MMModem3gppRegistrationState tmp_registration_state;
|
||||||
|
|
||||||
|
if (roaming_status_valid && roaming_status == QMI_NAS_ROAMING_STATUS_ON)
|
||||||
|
tmp_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING;
|
||||||
|
else
|
||||||
|
tmp_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_HOME;
|
||||||
|
|
||||||
|
if (domain == QMI_NAS_NETWORK_SERVICE_DOMAIN_CS) {
|
||||||
|
SET_OUTPUT (out_cs_registration_state, tmp_registration_state);
|
||||||
|
SET_OUTPUT (out_ps_registration_state, MM_MODEM_3GPP_REGISTRATION_STATE_IDLE);
|
||||||
|
} else if (domain == QMI_NAS_NETWORK_SERVICE_DOMAIN_PS) {
|
||||||
|
SET_OUTPUT (out_cs_registration_state, MM_MODEM_3GPP_REGISTRATION_STATE_IDLE);
|
||||||
|
SET_OUTPUT (out_ps_registration_state, tmp_registration_state);
|
||||||
|
} else if (domain == QMI_NAS_NETWORK_SERVICE_DOMAIN_CS_PS) {
|
||||||
|
SET_OUTPUT (out_cs_registration_state, tmp_registration_state);
|
||||||
|
SET_OUTPUT (out_ps_registration_state, tmp_registration_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If we're registered either at home or roaming, try to get LAC/CID */
|
||||||
|
if (lac_valid)
|
||||||
|
SET_OUTPUT (out_lac, lac);
|
||||||
|
if (tac_valid)
|
||||||
|
SET_OUTPUT (out_tac, tac);
|
||||||
|
if (cid_valid)
|
||||||
|
SET_OUTPUT (out_cid, cid);
|
||||||
|
} else {
|
||||||
|
/* Issue a warning in case this ever happens and this logic needs to be updated */
|
||||||
|
mm_obj_warn (log_object, "unexpected %s system info: domain valid %s, domain %s, service status %s",
|
||||||
|
info_name,
|
||||||
|
domain_valid ? "yes" : "no",
|
||||||
|
qmi_nas_network_service_domain_get_string (domain),
|
||||||
|
qmi_nas_service_status_get_string (service_status));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Network ID report also in the case of registration denial */
|
||||||
|
if (network_id_valid) {
|
||||||
|
*out_operator_id = g_malloc0 (7);
|
||||||
|
memcpy (*out_operator_id, mcc, 3);
|
||||||
|
if ((guint8)mnc[2] == 0xFF)
|
||||||
|
memcpy (&((*out_operator_id)[3]), mnc, 2);
|
||||||
|
else
|
||||||
|
memcpy (&((*out_operator_id)[3]), mnc, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
process_gsm_info (QmiMessageNasGetSystemInfoOutput *response_output,
|
||||||
|
QmiIndicationNasSystemInfoOutput *indication_output,
|
||||||
|
MMModem3gppRegistrationState *out_cs_registration_state,
|
||||||
|
MMModem3gppRegistrationState *out_ps_registration_state,
|
||||||
|
guint16 *out_lac,
|
||||||
|
guint32 *out_cid,
|
||||||
|
gchar **out_operator_id,
|
||||||
|
gpointer log_object)
|
||||||
|
{
|
||||||
|
QmiNasServiceStatus service_status = QMI_NAS_SERVICE_STATUS_NONE;
|
||||||
|
gboolean domain_valid = FALSE;
|
||||||
|
QmiNasNetworkServiceDomain domain = QMI_NAS_NETWORK_SERVICE_DOMAIN_UNKNOWN;
|
||||||
|
gboolean roaming_status_valid = FALSE;
|
||||||
|
QmiNasRoamingStatus roaming_status = QMI_NAS_ROAMING_STATUS_OFF;
|
||||||
|
gboolean forbidden_valid = FALSE;
|
||||||
|
gboolean forbidden = FALSE;
|
||||||
|
gboolean lac_valid = FALSE;
|
||||||
|
guint16 lac = 0;
|
||||||
|
gboolean cid_valid = FALSE;
|
||||||
|
guint32 cid = 0;
|
||||||
|
gboolean network_id_valid = FALSE;
|
||||||
|
const gchar *mcc = NULL;
|
||||||
|
const gchar *mnc = NULL;
|
||||||
|
|
||||||
|
if (response_output) {
|
||||||
|
/* if service status info not given, ACT is unsupported */
|
||||||
|
if (!qmi_message_nas_get_system_info_output_get_gsm_service_status (
|
||||||
|
response_output,
|
||||||
|
&service_status,
|
||||||
|
NULL, /* true_service_status */
|
||||||
|
NULL, /* preferred_data_path */
|
||||||
|
NULL))
|
||||||
|
return;
|
||||||
|
|
||||||
|
qmi_message_nas_get_system_info_output_get_gsm_system_info_v2 (
|
||||||
|
response_output,
|
||||||
|
&domain_valid, &domain,
|
||||||
|
NULL, NULL, /* service_capability */
|
||||||
|
&roaming_status_valid, &roaming_status,
|
||||||
|
&forbidden_valid, &forbidden,
|
||||||
|
&lac_valid, &lac,
|
||||||
|
&cid_valid, &cid,
|
||||||
|
NULL, NULL, NULL, /* registration_reject_info */
|
||||||
|
&network_id_valid, &mcc, &mnc,
|
||||||
|
NULL, NULL, /* egprs support */
|
||||||
|
NULL, NULL, /* dtm_support */
|
||||||
|
NULL);
|
||||||
|
} else if (indication_output) {
|
||||||
|
/* if service status info not given, ACT is unsupported */
|
||||||
|
if (!qmi_indication_nas_system_info_output_get_gsm_service_status (
|
||||||
|
indication_output,
|
||||||
|
&service_status,
|
||||||
|
NULL, /* true_service_status */
|
||||||
|
NULL, /* preferred_data_path */
|
||||||
|
NULL))
|
||||||
|
return;
|
||||||
|
|
||||||
|
qmi_indication_nas_system_info_output_get_gsm_system_info_v2 (
|
||||||
|
indication_output,
|
||||||
|
&domain_valid, &domain,
|
||||||
|
NULL, NULL, /* service_capability */
|
||||||
|
&roaming_status_valid, &roaming_status,
|
||||||
|
&forbidden_valid, &forbidden,
|
||||||
|
&lac_valid, &lac,
|
||||||
|
&cid_valid, &cid,
|
||||||
|
NULL, NULL, NULL, /* registration_reject_info */
|
||||||
|
&network_id_valid, &mcc, &mnc,
|
||||||
|
NULL, NULL, /* egprs support */
|
||||||
|
NULL, NULL, /* dtm_support */
|
||||||
|
NULL);
|
||||||
|
} else
|
||||||
|
g_assert_not_reached ();
|
||||||
|
|
||||||
|
process_common_info ("GSM",
|
||||||
|
service_status,
|
||||||
|
domain_valid, domain,
|
||||||
|
roaming_status_valid, roaming_status,
|
||||||
|
forbidden_valid, forbidden,
|
||||||
|
lac_valid, lac,
|
||||||
|
FALSE, 0,
|
||||||
|
cid_valid, cid,
|
||||||
|
network_id_valid, mcc, mnc,
|
||||||
|
out_cs_registration_state,
|
||||||
|
out_ps_registration_state,
|
||||||
|
out_lac,
|
||||||
|
NULL, /* out_tac */
|
||||||
|
out_cid,
|
||||||
|
out_operator_id,
|
||||||
|
log_object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
process_wcdma_info (QmiMessageNasGetSystemInfoOutput *response_output,
|
||||||
|
QmiIndicationNasSystemInfoOutput *indication_output,
|
||||||
|
MMModem3gppRegistrationState *out_cs_registration_state,
|
||||||
|
MMModem3gppRegistrationState *out_ps_registration_state,
|
||||||
|
guint16 *out_lac,
|
||||||
|
guint32 *out_cid,
|
||||||
|
gchar **out_operator_id,
|
||||||
|
gpointer log_object)
|
||||||
|
{
|
||||||
|
QmiNasServiceStatus service_status = QMI_NAS_SERVICE_STATUS_NONE;
|
||||||
|
gboolean domain_valid = FALSE;
|
||||||
|
QmiNasNetworkServiceDomain domain = QMI_NAS_NETWORK_SERVICE_DOMAIN_UNKNOWN;
|
||||||
|
gboolean roaming_status_valid = FALSE;
|
||||||
|
QmiNasRoamingStatus roaming_status = QMI_NAS_ROAMING_STATUS_OFF;
|
||||||
|
gboolean forbidden_valid = FALSE;
|
||||||
|
gboolean forbidden = FALSE;
|
||||||
|
gboolean lac_valid = FALSE;
|
||||||
|
guint16 lac = 0;
|
||||||
|
gboolean cid_valid = FALSE;
|
||||||
|
guint32 cid = 0;
|
||||||
|
gboolean network_id_valid = FALSE;
|
||||||
|
const gchar *mcc = NULL;
|
||||||
|
const gchar *mnc = NULL;
|
||||||
|
|
||||||
|
if (response_output) {
|
||||||
|
/* if service status info not given, ACT is unsupported */
|
||||||
|
if (!qmi_message_nas_get_system_info_output_get_wcdma_service_status (
|
||||||
|
response_output,
|
||||||
|
&service_status,
|
||||||
|
NULL, /* true_service_status */
|
||||||
|
NULL, /* preferred_data_path */
|
||||||
|
NULL))
|
||||||
|
return;
|
||||||
|
|
||||||
|
qmi_message_nas_get_system_info_output_get_wcdma_system_info_v2 (
|
||||||
|
response_output,
|
||||||
|
&domain_valid, &domain,
|
||||||
|
NULL, NULL, /* service_capability */
|
||||||
|
&roaming_status_valid, &roaming_status,
|
||||||
|
&forbidden_valid, &forbidden,
|
||||||
|
&lac_valid, &lac,
|
||||||
|
&cid_valid, &cid,
|
||||||
|
NULL, NULL, NULL, /* registration_reject_info */
|
||||||
|
&network_id_valid, &mcc, &mnc,
|
||||||
|
NULL, NULL, /* hs_call_status */
|
||||||
|
NULL, NULL, /* hs_service */
|
||||||
|
NULL, NULL, /* primary_scrambling_code */
|
||||||
|
NULL);
|
||||||
|
} else if (indication_output) {
|
||||||
|
/* if service status info not given, ACT is unsupported */
|
||||||
|
if (!qmi_indication_nas_system_info_output_get_wcdma_service_status (
|
||||||
|
indication_output,
|
||||||
|
&service_status,
|
||||||
|
NULL, /* true_service_status */
|
||||||
|
NULL, /* preferred_data_path */
|
||||||
|
NULL))
|
||||||
|
return;
|
||||||
|
|
||||||
|
qmi_indication_nas_system_info_output_get_wcdma_system_info_v2 (
|
||||||
|
indication_output,
|
||||||
|
&domain_valid, &domain,
|
||||||
|
NULL, NULL, /* service_capability */
|
||||||
|
&roaming_status_valid, &roaming_status,
|
||||||
|
&forbidden_valid, &forbidden,
|
||||||
|
&lac_valid, &lac,
|
||||||
|
&cid_valid, &cid,
|
||||||
|
NULL, NULL, NULL, /* registration_reject_info */
|
||||||
|
&network_id_valid, &mcc, &mnc,
|
||||||
|
NULL, NULL, /* hs_call_status */
|
||||||
|
NULL, NULL, /* hs_service */
|
||||||
|
NULL, NULL, /* primary_scrambling_code */
|
||||||
|
NULL);
|
||||||
|
} else
|
||||||
|
g_assert_not_reached ();
|
||||||
|
|
||||||
|
process_common_info ("WCDMA",
|
||||||
|
service_status,
|
||||||
|
domain_valid, domain,
|
||||||
|
roaming_status_valid, roaming_status,
|
||||||
|
forbidden_valid, forbidden,
|
||||||
|
lac_valid, lac,
|
||||||
|
FALSE, 0,
|
||||||
|
cid_valid, cid,
|
||||||
|
network_id_valid, mcc, mnc,
|
||||||
|
out_cs_registration_state,
|
||||||
|
out_ps_registration_state,
|
||||||
|
out_lac,
|
||||||
|
NULL, /* out_tac */
|
||||||
|
out_cid,
|
||||||
|
out_operator_id,
|
||||||
|
log_object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
process_lte_info (QmiMessageNasGetSystemInfoOutput *response_output,
|
||||||
|
QmiIndicationNasSystemInfoOutput *indication_output,
|
||||||
|
MMModem3gppRegistrationState *out_eps_registration_state,
|
||||||
|
guint16 *out_tac,
|
||||||
|
guint32 *out_cid,
|
||||||
|
gchar **out_operator_id,
|
||||||
|
gboolean *out_endc_available,
|
||||||
|
gpointer log_object)
|
||||||
|
{
|
||||||
|
QmiNasServiceStatus service_status = QMI_NAS_SERVICE_STATUS_NONE;
|
||||||
|
gboolean domain_valid = FALSE;
|
||||||
|
QmiNasNetworkServiceDomain domain = QMI_NAS_NETWORK_SERVICE_DOMAIN_UNKNOWN;
|
||||||
|
gboolean roaming_status_valid = FALSE;
|
||||||
|
QmiNasRoamingStatus roaming_status = QMI_NAS_ROAMING_STATUS_OFF;
|
||||||
|
gboolean forbidden_valid = FALSE;
|
||||||
|
gboolean forbidden = FALSE;
|
||||||
|
gboolean tac_valid = FALSE;
|
||||||
|
guint16 tac = 0;
|
||||||
|
gboolean cid_valid = FALSE;
|
||||||
|
guint32 cid = 0;
|
||||||
|
gboolean network_id_valid = FALSE;
|
||||||
|
const gchar *mcc = NULL;
|
||||||
|
const gchar *mnc = NULL;
|
||||||
|
|
||||||
|
if (response_output) {
|
||||||
|
/* if service status info not given, ACT is unsupported */
|
||||||
|
if (!qmi_message_nas_get_system_info_output_get_lte_service_status (
|
||||||
|
response_output,
|
||||||
|
&service_status,
|
||||||
|
NULL, /* true_service_status */
|
||||||
|
NULL, /* preferred_data_path */
|
||||||
|
NULL))
|
||||||
|
return;
|
||||||
|
|
||||||
|
qmi_message_nas_get_system_info_output_get_lte_system_info_v2 (
|
||||||
|
response_output,
|
||||||
|
&domain_valid, &domain,
|
||||||
|
NULL, NULL, /* service_capability */
|
||||||
|
&roaming_status_valid, &roaming_status,
|
||||||
|
&forbidden_valid, &forbidden,
|
||||||
|
NULL, NULL, /* lac */
|
||||||
|
&cid_valid, &cid,
|
||||||
|
NULL, NULL, NULL, /* registration_reject_info */
|
||||||
|
&network_id_valid, &mcc, &mnc,
|
||||||
|
&tac_valid, &tac,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
qmi_message_nas_get_system_info_output_get_eutra_with_nr5g_availability (
|
||||||
|
response_output,
|
||||||
|
out_endc_available,
|
||||||
|
NULL);
|
||||||
|
} else if (indication_output) {
|
||||||
|
/* if service status info not given, ACT is unsupported */
|
||||||
|
if (!qmi_indication_nas_system_info_output_get_lte_service_status (
|
||||||
|
indication_output,
|
||||||
|
&service_status,
|
||||||
|
NULL, /* true_service_status */
|
||||||
|
NULL, /* preferred_data_path */
|
||||||
|
NULL))
|
||||||
|
return;
|
||||||
|
|
||||||
|
qmi_indication_nas_system_info_output_get_lte_system_info_v2 (
|
||||||
|
indication_output,
|
||||||
|
&domain_valid, &domain,
|
||||||
|
NULL, NULL, /* service_capability */
|
||||||
|
&roaming_status_valid, &roaming_status,
|
||||||
|
&forbidden_valid, &forbidden,
|
||||||
|
NULL, NULL, /* lac */
|
||||||
|
&cid_valid, &cid,
|
||||||
|
NULL, NULL, NULL, /* registration_reject_info */
|
||||||
|
&network_id_valid, &mcc, &mnc,
|
||||||
|
&tac_valid, &tac,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
qmi_indication_nas_system_info_output_get_eutra_with_nr5g_availability (
|
||||||
|
indication_output,
|
||||||
|
out_endc_available,
|
||||||
|
NULL);
|
||||||
|
} else
|
||||||
|
g_assert_not_reached ();
|
||||||
|
|
||||||
|
process_common_info ("LTE",
|
||||||
|
service_status,
|
||||||
|
domain_valid, domain,
|
||||||
|
roaming_status_valid, roaming_status,
|
||||||
|
forbidden_valid, forbidden,
|
||||||
|
FALSE, 0,
|
||||||
|
tac_valid, tac,
|
||||||
|
cid_valid, cid,
|
||||||
|
network_id_valid, mcc, mnc,
|
||||||
|
NULL, /* out_cs_registration_state */
|
||||||
|
out_eps_registration_state,
|
||||||
|
NULL, /* out_lac */
|
||||||
|
out_tac,
|
||||||
|
out_cid,
|
||||||
|
out_operator_id,
|
||||||
|
log_object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
process_nr5g_info (QmiMessageNasGetSystemInfoOutput *response_output,
|
||||||
|
QmiIndicationNasSystemInfoOutput *indication_output,
|
||||||
|
MMModem3gppRegistrationState *out_5gs_registration_state,
|
||||||
|
guint16 *out_tac,
|
||||||
|
guint32 *out_cid,
|
||||||
|
gchar **out_operator_id,
|
||||||
|
gpointer log_object)
|
||||||
|
{
|
||||||
|
QmiNasServiceStatus service_status = QMI_NAS_SERVICE_STATUS_NONE;
|
||||||
|
gboolean domain_valid = FALSE;
|
||||||
|
QmiNasNetworkServiceDomain domain = QMI_NAS_NETWORK_SERVICE_DOMAIN_UNKNOWN;
|
||||||
|
gboolean roaming_status_valid = FALSE;
|
||||||
|
QmiNasRoamingStatus roaming_status = QMI_NAS_ROAMING_STATUS_OFF;
|
||||||
|
gboolean forbidden_valid = FALSE;
|
||||||
|
gboolean forbidden = FALSE;
|
||||||
|
gboolean tac_valid = FALSE;
|
||||||
|
guint16 tac = 0;
|
||||||
|
gboolean cid_valid = FALSE;
|
||||||
|
guint32 cid = 0;
|
||||||
|
gboolean network_id_valid = FALSE;
|
||||||
|
const gchar *mcc = NULL;
|
||||||
|
const gchar *mnc = NULL;
|
||||||
|
|
||||||
|
if (response_output) {
|
||||||
|
/* if service status info not given, ACT is unsupported */
|
||||||
|
if (!qmi_message_nas_get_system_info_output_get_nr5g_service_status_info (
|
||||||
|
response_output,
|
||||||
|
&service_status,
|
||||||
|
NULL, /* true_service_status */
|
||||||
|
NULL, /* preferred_data_path */
|
||||||
|
NULL))
|
||||||
|
return;
|
||||||
|
|
||||||
|
qmi_message_nas_get_system_info_output_get_nr5g_system_info (
|
||||||
|
response_output,
|
||||||
|
&domain_valid, &domain,
|
||||||
|
NULL, NULL, /* service_capability */
|
||||||
|
&roaming_status_valid, &roaming_status,
|
||||||
|
&forbidden_valid, &forbidden,
|
||||||
|
NULL, NULL, /* lac */
|
||||||
|
&cid_valid, &cid,
|
||||||
|
NULL, NULL, NULL, /* registration_reject_info */
|
||||||
|
&network_id_valid, &mcc, &mnc,
|
||||||
|
&tac_valid, &tac,
|
||||||
|
NULL);
|
||||||
|
} else if (indication_output) {
|
||||||
|
/* if service status info not given, ACT is unsupported */
|
||||||
|
if (!qmi_indication_nas_system_info_output_get_nr5g_service_status_info (
|
||||||
|
indication_output,
|
||||||
|
&service_status,
|
||||||
|
NULL, /* true_service_status */
|
||||||
|
NULL, /* preferred_data_path */
|
||||||
|
NULL))
|
||||||
|
return;
|
||||||
|
|
||||||
|
qmi_indication_nas_system_info_output_get_nr5g_system_info (
|
||||||
|
indication_output,
|
||||||
|
&domain_valid, &domain,
|
||||||
|
NULL, NULL, /* service_capability */
|
||||||
|
&roaming_status_valid, &roaming_status,
|
||||||
|
&forbidden_valid, &forbidden,
|
||||||
|
NULL, NULL, /* lac */
|
||||||
|
&cid_valid, &cid,
|
||||||
|
NULL, NULL, NULL, /* registration_reject_info */
|
||||||
|
&network_id_valid, &mcc, &mnc,
|
||||||
|
&tac_valid, &tac,
|
||||||
|
NULL);
|
||||||
|
} else
|
||||||
|
g_assert_not_reached ();
|
||||||
|
|
||||||
|
process_common_info ("NR5G",
|
||||||
|
service_status,
|
||||||
|
domain_valid, domain,
|
||||||
|
roaming_status_valid, roaming_status,
|
||||||
|
forbidden_valid, forbidden,
|
||||||
|
FALSE, 0,
|
||||||
|
tac_valid, tac,
|
||||||
|
cid_valid, cid,
|
||||||
|
network_id_valid, mcc, mnc,
|
||||||
|
NULL, /* cs_registration_state */
|
||||||
|
out_5gs_registration_state,
|
||||||
|
NULL, /* out_lac */
|
||||||
|
out_tac,
|
||||||
|
out_cid,
|
||||||
|
out_operator_id,
|
||||||
|
log_object);
|
||||||
|
}
|
||||||
|
|
||||||
|
static MMModem3gppRegistrationState
|
||||||
|
unregistered_state_fallback (MMModem3gppRegistrationState umts_state,
|
||||||
|
MMModem3gppRegistrationState gsm_state)
|
||||||
|
{
|
||||||
|
/* For 3G and 2G unregistered states, we will select SEARCHING if one of them
|
||||||
|
* reports it, otherwise DENIED if one of the reports it, and otherwise
|
||||||
|
* the 3G one if not unknown and finally the 2G one otherwise. */
|
||||||
|
if (umts_state == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING || gsm_state == MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING)
|
||||||
|
return MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING;
|
||||||
|
if (umts_state == MM_MODEM_3GPP_REGISTRATION_STATE_DENIED || gsm_state == MM_MODEM_3GPP_REGISTRATION_STATE_DENIED)
|
||||||
|
return MM_MODEM_3GPP_REGISTRATION_STATE_DENIED;
|
||||||
|
if (umts_state != MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN)
|
||||||
|
return umts_state;
|
||||||
|
return gsm_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mm_modem_registration_state_from_qmi_system_info (QmiMessageNasGetSystemInfoOutput *response_output,
|
||||||
|
QmiIndicationNasSystemInfoOutput *indication_output,
|
||||||
|
MMModem3gppRegistrationState *out_cs_registration_state,
|
||||||
|
MMModem3gppRegistrationState *out_ps_registration_state,
|
||||||
|
MMModem3gppRegistrationState *out_eps_registration_state,
|
||||||
|
MMModem3gppRegistrationState *out_5gs_registration_state,
|
||||||
|
guint16 *out_lac,
|
||||||
|
guint16 *out_tac,
|
||||||
|
guint32 *out_cid,
|
||||||
|
gchar **out_operator_id,
|
||||||
|
MMModemAccessTechnology *out_act,
|
||||||
|
gpointer log_object)
|
||||||
|
{
|
||||||
|
MMModem3gppRegistrationState gsm_cs_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN;
|
||||||
|
MMModem3gppRegistrationState gsm_ps_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN;
|
||||||
|
MMModem3gppRegistrationState wcdma_cs_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN;
|
||||||
|
MMModem3gppRegistrationState wcdma_ps_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN;
|
||||||
|
MMModem3gppRegistrationState lte_eps_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN;
|
||||||
|
MMModem3gppRegistrationState nr5g_5gs_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN;
|
||||||
|
g_autofree gchar *gsm_operator_id = NULL;
|
||||||
|
g_autofree gchar *wcdma_operator_id = NULL;
|
||||||
|
g_autofree gchar *lte_operator_id = NULL;
|
||||||
|
g_autofree gchar *nr5g_operator_id = NULL;
|
||||||
|
guint16 gsm_lac = 0;
|
||||||
|
guint32 gsm_cid = 0;
|
||||||
|
guint16 wcdma_lac = 0;
|
||||||
|
guint32 wcdma_cid = 0;
|
||||||
|
guint16 lte_tac = 0;
|
||||||
|
guint32 lte_cid = 0;
|
||||||
|
guint16 nr5g_tac = 0;
|
||||||
|
guint32 nr5g_cid = 0;
|
||||||
|
gboolean endc_available = FALSE;
|
||||||
|
gboolean reg_info_set = FALSE;
|
||||||
|
|
||||||
|
/* Reset outputs */
|
||||||
|
*out_cs_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN;
|
||||||
|
*out_ps_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN;
|
||||||
|
*out_eps_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN;
|
||||||
|
*out_5gs_registration_state = MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN;
|
||||||
|
*out_lac = 0;
|
||||||
|
*out_tac = 0;
|
||||||
|
*out_cid = 0;
|
||||||
|
*out_operator_id = NULL;
|
||||||
|
*out_act = MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN;
|
||||||
|
|
||||||
|
process_nr5g_info (response_output, indication_output,
|
||||||
|
&nr5g_5gs_registration_state,
|
||||||
|
&nr5g_tac, &nr5g_cid, &nr5g_operator_id,
|
||||||
|
log_object);
|
||||||
|
|
||||||
|
process_lte_info (response_output, indication_output,
|
||||||
|
<e_eps_registration_state,
|
||||||
|
<e_tac, <e_cid, <e_operator_id,
|
||||||
|
&endc_available, log_object);
|
||||||
|
|
||||||
|
process_wcdma_info (response_output, indication_output,
|
||||||
|
&wcdma_cs_registration_state, &wcdma_ps_registration_state,
|
||||||
|
&wcdma_lac, &wcdma_cid, &wcdma_operator_id,
|
||||||
|
log_object);
|
||||||
|
|
||||||
|
process_gsm_info (response_output, indication_output,
|
||||||
|
&gsm_cs_registration_state, &gsm_ps_registration_state,
|
||||||
|
&gsm_lac, &gsm_cid, &gsm_operator_id,
|
||||||
|
log_object);
|
||||||
|
|
||||||
|
#define REG_INFO_SET(TAC,LAC,CID,OPERATOR_ID) \
|
||||||
|
if (!reg_info_set) { \
|
||||||
|
reg_info_set = TRUE; \
|
||||||
|
*out_tac = (TAC); \
|
||||||
|
*out_lac = (LAC); \
|
||||||
|
*out_cid = (CID); \
|
||||||
|
*out_operator_id = g_steal_pointer (&(OPERATOR_ID)); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Process 5G data */
|
||||||
|
*out_5gs_registration_state = nr5g_5gs_registration_state;
|
||||||
|
if (mm_modem_3gpp_registration_state_is_registered (nr5g_5gs_registration_state)) {
|
||||||
|
REG_INFO_SET (nr5g_tac, 0, nr5g_cid, nr5g_operator_id)
|
||||||
|
*out_act |= MM_MODEM_ACCESS_TECHNOLOGY_5GNR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Process 4G data */
|
||||||
|
*out_eps_registration_state = lte_eps_registration_state;
|
||||||
|
if (mm_modem_3gpp_registration_state_is_registered (lte_eps_registration_state)) {
|
||||||
|
REG_INFO_SET (lte_tac, 0, lte_cid, lte_operator_id)
|
||||||
|
*out_act |= MM_MODEM_ACCESS_TECHNOLOGY_LTE;
|
||||||
|
if (endc_available)
|
||||||
|
*out_act |= MM_MODEM_ACCESS_TECHNOLOGY_5GNR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Process 2G/3G data */
|
||||||
|
if (mm_modem_3gpp_registration_state_is_registered (wcdma_ps_registration_state)) {
|
||||||
|
*out_ps_registration_state = wcdma_ps_registration_state;
|
||||||
|
*out_act |= MM_MODEM_ACCESS_TECHNOLOGY_UMTS;
|
||||||
|
REG_INFO_SET (0, wcdma_lac, wcdma_cid, wcdma_operator_id)
|
||||||
|
} else if (mm_modem_3gpp_registration_state_is_registered (gsm_ps_registration_state)) {
|
||||||
|
*out_ps_registration_state = gsm_ps_registration_state;
|
||||||
|
*out_act |= MM_MODEM_ACCESS_TECHNOLOGY_GPRS;
|
||||||
|
REG_INFO_SET (0, gsm_lac, gsm_cid, gsm_operator_id)
|
||||||
|
} else {
|
||||||
|
*out_ps_registration_state = unregistered_state_fallback (wcdma_ps_registration_state, gsm_ps_registration_state);
|
||||||
|
}
|
||||||
|
if (mm_modem_3gpp_registration_state_is_registered (wcdma_cs_registration_state)) {
|
||||||
|
*out_cs_registration_state = wcdma_cs_registration_state;
|
||||||
|
*out_act |= MM_MODEM_ACCESS_TECHNOLOGY_UMTS;
|
||||||
|
REG_INFO_SET (0, wcdma_lac, wcdma_cid, wcdma_operator_id)
|
||||||
|
} else if (mm_modem_3gpp_registration_state_is_registered (gsm_cs_registration_state)) {
|
||||||
|
*out_cs_registration_state = gsm_cs_registration_state;
|
||||||
|
*out_act |= MM_MODEM_ACCESS_TECHNOLOGY_GSM;
|
||||||
|
REG_INFO_SET (0, gsm_lac, gsm_cid, gsm_operator_id)
|
||||||
|
} else {
|
||||||
|
*out_cs_registration_state = unregistered_state_fallback (wcdma_cs_registration_state, gsm_cs_registration_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef REG_INFO_SET
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
QmiWmsStorageType
|
QmiWmsStorageType
|
||||||
mm_sms_storage_to_qmi_storage_type (MMSmsStorage storage)
|
mm_sms_storage_to_qmi_storage_type (MMSmsStorage storage)
|
||||||
{
|
{
|
||||||
|
@@ -111,6 +111,22 @@ MMModemCdmaRegistrationState mm_modem_cdma_registration_state_from_qmi_registrat
|
|||||||
|
|
||||||
MMModemCdmaActivationState mm_modem_cdma_activation_state_from_qmi_activation_state (QmiDmsActivationState state);
|
MMModemCdmaActivationState mm_modem_cdma_activation_state_from_qmi_activation_state (QmiDmsActivationState state);
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* QMI NAS System Info processor */
|
||||||
|
|
||||||
|
void mm_modem_registration_state_from_qmi_system_info (QmiMessageNasGetSystemInfoOutput *response_output,
|
||||||
|
QmiIndicationNasSystemInfoOutput *indication_output,
|
||||||
|
MMModem3gppRegistrationState *out_cs_registration_state,
|
||||||
|
MMModem3gppRegistrationState *out_ps_registration_state,
|
||||||
|
MMModem3gppRegistrationState *out_eps_registration_state,
|
||||||
|
MMModem3gppRegistrationState *out_5gs_registration_state,
|
||||||
|
guint16 *out_lac,
|
||||||
|
guint16 *out_tac,
|
||||||
|
guint32 *out_cid,
|
||||||
|
gchar **out_operator_id,
|
||||||
|
MMModemAccessTechnology *out_act,
|
||||||
|
gpointer log_object);
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* QMI/WMS to MM translations */
|
/* QMI/WMS to MM translations */
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user