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 /src | |
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.
Diffstat (limited to 'src')
-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 |