diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2021-10-21 14:47:12 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-11-02 09:50:17 +0000 |
commit | 49a295474936d7a5523ed7e34397dcd1c97f1c98 (patch) | |
tree | 2ce9a5e721b40cb73205bbbd76f52af1d1f0b8fa | |
parent | d6b5e76d1f3915cd666de2ed8b2be8bc76333e12 (diff) |
broadband-modem-mbim: fix reporting CS/PS/EPS/5GS reg status
Until now we just reported any registration status change as PS, and
that was fine because we wouldn't need to have any logic on top to
build a consolidated registration state.
But now we need to know whether the reported registration status is
for a packet domain (e.g. PS/EPS/5GS) in order to correctly update the
PacketServiceStatus property in DBus.
So, monitor the packet service status reported by the modem, and
decide which domain registration we're updating every time.
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 56 |
1 files changed, 47 insertions, 9 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index fef05d4a..faf04a51 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -142,9 +142,11 @@ struct _MMBroadbandModemMbimPrivate { /* USSD helpers */ GTask *pending_ussd_action; - /* Access technology updates */ + /* Access technology and registration updates */ MbimDataClass available_data_classes; MbimDataClass highest_available_data_class; + MbimRegisterState reg_state; + MbimPacketServiceState packet_service_state; MbimSubscriberReadyState last_ready_state; @@ -3621,14 +3623,20 @@ update_access_technologies (MMBroadbandModemMbim *self) static void update_registration_info (MMBroadbandModemMbim *self, - MbimRegisterState state, - MbimDataClass available_data_classes, - gchar *operator_id_take, - gchar *operator_name_take) + MbimRegisterState state, + MbimDataClass available_data_classes, + gchar *operator_id_take, + gchar *operator_name_take) { MMModem3gppRegistrationState reg_state; + MMModem3gppRegistrationState reg_state_cs; + MMModem3gppRegistrationState reg_state_ps; + MMModem3gppRegistrationState reg_state_eps; + MMModem3gppRegistrationState reg_state_5gs; gboolean operator_updated = FALSE; + self->priv->reg_state = state; + reg_state = mm_modem_3gpp_registration_state_from_mbim_register_state (state); if (reg_state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME || @@ -3659,9 +3667,30 @@ update_registration_info (MMBroadbandModemMbim *self, g_free (operator_name_take); } - mm_iface_modem_3gpp_update_ps_registration_state ( - MM_IFACE_MODEM_3GPP (self), - reg_state); + reg_state_cs = MM_MODEM_3GPP_REGISTRATION_STATE_IDLE; + reg_state_ps = MM_MODEM_3GPP_REGISTRATION_STATE_IDLE; + reg_state_eps = MM_MODEM_3GPP_REGISTRATION_STATE_IDLE; + reg_state_5gs = MM_MODEM_3GPP_REGISTRATION_STATE_IDLE; + + if (available_data_classes & (MBIM_DATA_CLASS_GPRS | MBIM_DATA_CLASS_EDGE | + MBIM_DATA_CLASS_UMTS | MBIM_DATA_CLASS_HSDPA | MBIM_DATA_CLASS_HSUPA)) { + reg_state_cs = reg_state; + if (self->priv->packet_service_state == MBIM_PACKET_SERVICE_STATE_ATTACHED) + reg_state_ps = reg_state; + } + + if (available_data_classes & (MBIM_DATA_CLASS_LTE)) + reg_state_eps = reg_state; + + if (available_data_classes & (MBIM_DATA_CLASS_5G_NSA | MBIM_DATA_CLASS_5G_SA)) + reg_state_5gs = reg_state; + + mm_iface_modem_3gpp_update_cs_registration_state (MM_IFACE_MODEM_3GPP (self), reg_state_cs); + mm_iface_modem_3gpp_update_ps_registration_state (MM_IFACE_MODEM_3GPP (self), reg_state_ps); + if (mm_iface_modem_is_3gpp_lte (MM_IFACE_MODEM (self))) + mm_iface_modem_3gpp_update_eps_registration_state (MM_IFACE_MODEM_3GPP (self), reg_state_eps); + if (mm_iface_modem_is_3gpp_5gnr (MM_IFACE_MODEM (self))) + mm_iface_modem_3gpp_update_5gs_registration_state (MM_IFACE_MODEM_3GPP (self), reg_state_5gs); self->priv->available_data_classes = available_data_classes; update_access_technologies (self); @@ -3899,8 +3928,16 @@ basic_connect_notification_packet_service (MMBroadbandModemMbim *self, } else if (packet_service_state == MBIM_PACKET_SERVICE_STATE_DETACHED) { self->priv->highest_available_data_class = 0; } - update_access_technologies (self); + + if (self->priv->packet_service_state != packet_service_state) { + self->priv->packet_service_state = packet_service_state; + update_registration_info (self, + self->priv->reg_state, + self->priv->available_data_classes, + NULL, + NULL); + } } static void @@ -7689,6 +7726,7 @@ mm_broadband_modem_mbim_init (MMBroadbandModemMbim *self) self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, MM_TYPE_BROADBAND_MODEM_MBIM, MMBroadbandModemMbimPrivate); + self->priv->packet_service_state = MBIM_PACKET_SERVICE_STATE_UNKNOWN; } static void |