aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2021-10-21 14:47:12 +0200
committerAleksander Morgado <aleksander@aleksander.es>2021-11-02 09:50:17 +0000
commit49a295474936d7a5523ed7e34397dcd1c97f1c98 (patch)
tree2ce9a5e721b40cb73205bbbd76f52af1d1f0b8fa
parentd6b5e76d1f3915cd666de2ed8b2be8bc76333e12 (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.c56
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