summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksandermj@chromium.org>2023-05-03 13:00:47 +0000
committerAleksander Morgado <aleksandermj@chromium.org>2023-05-03 13:00:47 +0000
commit5bd8bbb40857b6949a5c76d13387e9d6373cbf1f (patch)
tree1d94505608095ef86408f9ace438667af070c7e3
parent60735b2ea0706b2694a5544e81b0d166bf16955a (diff)
downloadModemManager-5bd8bbb40857b6949a5c76d13387e9d6373cbf1f.tar.gz
broadband-modem-mbim: group together all runtime state while enabled in its own struct
-rw-r--r--src/mm-broadband-modem-mbim.c183
1 files changed, 96 insertions, 87 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index 1759db75d..e18fd7afc 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -106,6 +106,20 @@ enum {
PROP_LAST
};
+/* Runtime cache while enabled */
+typedef struct {
+ gchar *current_operator_id;
+ gchar *current_operator_name;
+ GList *pco_list;
+ MbimDataClass available_data_classes;
+ MbimDataClass highest_available_data_class;
+ MbimRegisterState reg_state;
+ MbimPacketServiceState packet_service_state;
+ guint64 packet_service_uplink_speed;
+ guint64 packet_service_downlink_speed;
+ MbimSubscriberReadyState last_ready_state;
+} EnabledCache;
+
struct _MMBroadbandModemMbimPrivate {
/* Queried and cached capabilities */
MbimCellularClass caps_cellular_class;
@@ -137,17 +151,8 @@ struct _MMBroadbandModemMbimPrivate {
ProcessNotificationFlag setup_flags;
ProcessNotificationFlag enable_flags;
- /* Runtime cached state while enabled, to be cleaned up once disabled */
- gchar *current_operator_id;
- gchar *current_operator_name;
- GList *pco_list;
- MbimDataClass available_data_classes;
- MbimDataClass highest_available_data_class;
- MbimRegisterState reg_state;
- MbimPacketServiceState packet_service_state;
- guint64 packet_service_uplink_speed;
- guint64 packet_service_downlink_speed;
- MbimSubscriberReadyState last_ready_state;
+ /* State while enabled */
+ EnabledCache enabled_cache;
/* 3GPP registration helpers */
gulong enabling_signal_id;
@@ -1585,7 +1590,7 @@ unlock_required_subscriber_ready_state_ready (MbimDevice *device,
self = g_task_get_source_object (task);
/* reset to the default if any error happens */
- self->priv->last_ready_state = MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED;
+ self->priv->enabled_cache.last_ready_state = MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED;
response = mbim_device_command_finish (device, res, &error);
if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) {
@@ -1625,7 +1630,7 @@ unlock_required_subscriber_ready_state_ready (MbimDevice *device,
if (!error) {
/* Store last valid status loaded */
- self->priv->last_ready_state = ready_state;
+ self->priv->enabled_cache.last_ready_state = ready_state;
switch (ready_state) {
case MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED:
@@ -2204,9 +2209,9 @@ signal_state_query_ready (MbimDevice *device,
g_task_return_error (task, error);
else {
/* Best guess of current data class */
- data_class = self->priv->highest_available_data_class;
+ data_class = self->priv->enabled_cache.highest_available_data_class;
if (data_class == 0)
- data_class = self->priv->available_data_classes;
+ data_class = self->priv->enabled_cache.available_data_classes;
if (mm_signal_from_mbim_signal_state (data_class, rssi, error_rate, rsrp_snr, rsrp_snr_count,
self, &cdma, &evdo, &gsm, &umts, &lte, &nr5g))
mm_iface_modem_signal_update (MM_IFACE_MODEM_SIGNAL (self), cdma, evdo, gsm, umts, lte, nr5g);
@@ -4553,9 +4558,9 @@ basic_connect_notification_signal_state (MMBroadbandModemMbim *self,
mm_iface_modem_update_signal_quality (MM_IFACE_MODEM (self), quality);
/* Best guess of current data class */
- data_class = self->priv->highest_available_data_class;
+ data_class = self->priv->enabled_cache.highest_available_data_class;
if (data_class == 0)
- data_class = self->priv->available_data_classes;
+ data_class = self->priv->enabled_cache.available_data_classes;
if (mm_signal_from_mbim_signal_state (data_class, coded_rssi, coded_error_rate, rsrp_snr, rsrp_snr_count,
self, &cdma, &evdo, &gsm, &umts, &lte, &nr5g))
@@ -4620,9 +4625,9 @@ update_access_technologies (MMBroadbandModemMbim *self)
{
MMModemAccessTechnology act;
- act = mm_modem_access_technology_from_mbim_data_class (self->priv->highest_available_data_class);
+ act = mm_modem_access_technology_from_mbim_data_class (self->priv->enabled_cache.highest_available_data_class);
if (act == MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN)
- act = mm_modem_access_technology_from_mbim_data_class (self->priv->available_data_classes);
+ act = mm_modem_access_technology_from_mbim_data_class (self->priv->enabled_cache.available_data_classes);
mm_iface_modem_3gpp_update_access_technologies (MM_IFACE_MODEM_3GPP (self), act);
}
@@ -4643,20 +4648,20 @@ update_packet_service_info (MMBroadbandModemMbim *self,
{
MMModem3gppPacketServiceState state;
- if (packet_service_state == self->priv->packet_service_state)
+ if (packet_service_state == self->priv->enabled_cache.packet_service_state)
return;
- self->priv->packet_service_state = packet_service_state;
+ self->priv->enabled_cache.packet_service_state = packet_service_state;
state = mm_modem_3gpp_packet_service_state_from_mbim_packet_service_state (packet_service_state);
mm_iface_modem_3gpp_update_packet_service_state (MM_IFACE_MODEM_3GPP (self), state);
/* PS reg state depends on the packet service state */
update_registration_info (self,
FALSE,
- self->priv->reg_state,
- self->priv->available_data_classes,
- g_strdup (self->priv->current_operator_id),
- g_strdup (self->priv->current_operator_name));
+ self->priv->enabled_cache.reg_state,
+ self->priv->enabled_cache.available_data_classes,
+ g_strdup (self->priv->enabled_cache.current_operator_id),
+ g_strdup (self->priv->enabled_cache.current_operator_name));
}
/*****************************************************************************/
@@ -4674,10 +4679,10 @@ enabling_state_changed (MMBroadbandModemMbim *self)
mm_obj_dbg (self, "triggering 3GPP registration info update");
update_registration_info (self,
TRUE,
- self->priv->reg_state,
- self->priv->available_data_classes,
- g_strdup (self->priv->current_operator_id),
- g_strdup (self->priv->current_operator_name));
+ self->priv->enabled_cache.reg_state,
+ self->priv->enabled_cache.available_data_classes,
+ g_strdup (self->priv->enabled_cache.current_operator_id),
+ g_strdup (self->priv->enabled_cache.current_operator_name));
}
/* if something bad happened during enabling, we can ignore any pending
* registration info update */
@@ -4713,36 +4718,38 @@ update_registration_info (MMBroadbandModemMbim *self,
if (modem_state == MM_MODEM_STATE_ENABLING)
schedule_update_in_enabled = TRUE;
- if (self->priv->reg_state != state)
+ if (self->priv->enabled_cache.reg_state != state)
reg_state_updated = TRUE;
- self->priv->reg_state = state;
+ self->priv->enabled_cache.reg_state = state;
reg_state = mm_modem_3gpp_registration_state_from_mbim_register_state (state);
if (reg_state == MM_MODEM_3GPP_REGISTRATION_STATE_HOME ||
reg_state == MM_MODEM_3GPP_REGISTRATION_STATE_ROAMING) {
- if (self->priv->current_operator_id && operator_id_take &&
- g_str_equal (self->priv->current_operator_id, operator_id_take)) {
+ if (self->priv->enabled_cache.current_operator_id && operator_id_take &&
+ g_str_equal (self->priv->enabled_cache.current_operator_id, operator_id_take)) {
g_free (operator_id_take);
} else {
operator_updated = TRUE;
- g_free (self->priv->current_operator_id);
- self->priv->current_operator_id = operator_id_take;
+ g_free (self->priv->enabled_cache.current_operator_id);
+ self->priv->enabled_cache.current_operator_id = operator_id_take;
}
- if (self->priv->current_operator_name && operator_name_take &&
- g_str_equal (self->priv->current_operator_name, operator_name_take)) {
+ if (self->priv->enabled_cache.current_operator_name && operator_name_take &&
+ g_str_equal (self->priv->enabled_cache.current_operator_name, operator_name_take)) {
g_free (operator_name_take);
} else {
operator_updated = TRUE;
- g_free (self->priv->current_operator_name);
- self->priv->current_operator_name = operator_name_take;
+ g_free (self->priv->enabled_cache.current_operator_name);
+ self->priv->enabled_cache.current_operator_name = operator_name_take;
}
} else {
- if (self->priv->current_operator_id || self->priv->current_operator_name)
+ if (self->priv->enabled_cache.current_operator_id ||
+ self->priv->enabled_cache.current_operator_name) {
operator_updated = TRUE;
- g_clear_pointer (&self->priv->current_operator_id, g_free);
- g_clear_pointer (&self->priv->current_operator_name, g_free);
+ }
+ g_clear_pointer (&self->priv->enabled_cache.current_operator_id, g_free);
+ g_clear_pointer (&self->priv->enabled_cache.current_operator_name, g_free);
g_free (operator_id_take);
g_free (operator_name_take);
}
@@ -4757,7 +4764,7 @@ update_registration_info (MMBroadbandModemMbim *self,
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)
+ if (self->priv->enabled_cache.packet_service_state == MBIM_PACKET_SERVICE_STATE_ATTACHED)
reg_state_ps = reg_state;
}
@@ -4781,14 +4788,16 @@ update_registration_info (MMBroadbandModemMbim *self,
mm_iface_modem_3gpp_reload_current_registration_info (MM_IFACE_MODEM_3GPP (self), NULL, NULL);
}
- self->priv->available_data_classes = available_data_classes;
+ self->priv->enabled_cache.available_data_classes = available_data_classes;
/* If we can update access technologies right now, do it */
if (!schedule_update_in_enabled)
update_access_technologies (self);
/* request to reload location info */
- if (!schedule_update_in_enabled && self->priv->is_atds_location_supported && (reg_state_updated || scheduled)) {
- if (self->priv->reg_state < MBIM_REGISTER_STATE_HOME) {
+ if (!schedule_update_in_enabled &&
+ self->priv->is_atds_location_supported &&
+ (reg_state_updated || scheduled)) {
+ if (self->priv->enabled_cache.reg_state < MBIM_REGISTER_STATE_HOME) {
mm_iface_modem_3gpp_update_location (MM_IFACE_MODEM_3GPP (self), 0, 0, 0);
} else
@@ -5001,25 +5010,25 @@ basic_connect_notification_subscriber_ready_status (MMBroadbandModemMbim *self,
if (ready_state == MBIM_SUBSCRIBER_READY_STATE_INITIALIZED)
mm_iface_modem_update_own_numbers (MM_IFACE_MODEM (self), telephone_numbers);
- if ((self->priv->last_ready_state != MBIM_SUBSCRIBER_READY_STATE_NO_ESIM_PROFILE &&
+ if ((self->priv->enabled_cache.last_ready_state != MBIM_SUBSCRIBER_READY_STATE_NO_ESIM_PROFILE &&
ready_state == MBIM_SUBSCRIBER_READY_STATE_NO_ESIM_PROFILE) ||
- (self->priv->last_ready_state == MBIM_SUBSCRIBER_READY_STATE_NO_ESIM_PROFILE &&
+ (self->priv->enabled_cache.last_ready_state == MBIM_SUBSCRIBER_READY_STATE_NO_ESIM_PROFILE &&
ready_state != MBIM_SUBSCRIBER_READY_STATE_NO_ESIM_PROFILE)) {
/* eSIM profiles have been added or removed, re-probe to ensure correct interfaces are exposed */
mm_obj_dbg (self, "eSIM profile updates detected");
active_sim_event = TRUE;
}
- if ((self->priv->last_ready_state != MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED &&
+ if ((self->priv->enabled_cache.last_ready_state != MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED &&
ready_state == MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED) ||
- (self->priv->last_ready_state == MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED &&
+ (self->priv->enabled_cache.last_ready_state == MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED &&
ready_state != MBIM_SUBSCRIBER_READY_STATE_SIM_NOT_INSERTED)) {
/* SIM has been removed or reinserted, re-probe to ensure correct interfaces are exposed */
mm_obj_dbg (self, "SIM hot swap detected");
active_sim_event = TRUE;
}
- self->priv->last_ready_state = ready_state;
+ self->priv->enabled_cache.last_ready_state = ready_state;
if (active_sim_event) {
mm_iface_modem_process_sim_event (MM_IFACE_MODEM (self));
@@ -5035,9 +5044,9 @@ mm_broadband_modem_mbim_get_speeds (MMBroadbandModemMbim *self,
guint64 *downlink_speed)
{
if (uplink_speed)
- *uplink_speed = self->priv->packet_service_uplink_speed;
+ *uplink_speed = self->priv->enabled_cache.packet_service_uplink_speed;
if (downlink_speed)
- *downlink_speed = self->priv->packet_service_downlink_speed;
+ *downlink_speed = self->priv->enabled_cache.packet_service_downlink_speed;
}
static void
@@ -5049,8 +5058,8 @@ bearer_list_report_speeds (MMBaseBearer *bearer,
mm_obj_dbg (self, "bearer '%s' speeds updated", mm_base_bearer_get_path (bearer));
mm_base_bearer_report_speeds (bearer,
- self->priv->packet_service_uplink_speed,
- self->priv->packet_service_downlink_speed);
+ self->priv->enabled_cache.packet_service_uplink_speed,
+ self->priv->enabled_cache.packet_service_downlink_speed);
}
static void
@@ -5060,12 +5069,12 @@ update_bearer_speeds (MMBroadbandModemMbim *self,
{
g_autoptr(MMBearerList) bearer_list = NULL;
- if ((self->priv->packet_service_uplink_speed == uplink_speed) &&
- (self->priv->packet_service_downlink_speed == downlink_speed))
+ if ((self->priv->enabled_cache.packet_service_uplink_speed == uplink_speed) &&
+ (self->priv->enabled_cache.packet_service_downlink_speed == downlink_speed))
return;
- self->priv->packet_service_uplink_speed = uplink_speed;
- self->priv->packet_service_downlink_speed = downlink_speed;
+ self->priv->enabled_cache.packet_service_uplink_speed = uplink_speed;
+ self->priv->enabled_cache.packet_service_downlink_speed = downlink_speed;
g_object_get (self,
MM_IFACE_MODEM_BEARER_LIST, &bearer_list,
@@ -5171,11 +5180,11 @@ basic_connect_notification_packet_service (MMBroadbandModemMbim *self,
if (packet_service_state == MBIM_PACKET_SERVICE_STATE_ATTACHED) {
if (data_class_v3)
- self->priv->highest_available_data_class = mm_mbim_data_class_from_mbim_data_class_v3_and_subclass (data_class_v3, data_subclass);
+ self->priv->enabled_cache.highest_available_data_class = mm_mbim_data_class_from_mbim_data_class_v3_and_subclass (data_class_v3, data_subclass);
else
- self->priv->highest_available_data_class = data_class;
+ self->priv->enabled_cache.highest_available_data_class = data_class;
} else if (packet_service_state == MBIM_PACKET_SERVICE_STATE_DETACHED) {
- self->priv->highest_available_data_class = 0;
+ self->priv->enabled_cache.highest_available_data_class = 0;
}
update_access_technologies (self);
@@ -5393,9 +5402,9 @@ ms_basic_connect_extensions_notification_pco (MMBroadbandModemMbim *self,
pco_value->pco_data_buffer,
pco_value->pco_data_size);
- self->priv->pco_list = mm_pco_list_add (self->priv->pco_list, pco);
+ self->priv->enabled_cache.pco_list = mm_pco_list_add (self->priv->enabled_cache.pco_list, pco);
mm_iface_modem_3gpp_update_pco_list (MM_IFACE_MODEM_3GPP (self),
- self->priv->pco_list);
+ self->priv->enabled_cache.pco_list);
g_object_unref (pco);
mbim_pco_value_free (pco_value);
}
@@ -5727,22 +5736,22 @@ common_setup_cleanup_unsolicited_events_3gpp_finish (MMIfaceModem3gpp *self,
static void
cleanup_enabled_cache (MMBroadbandModemMbim *self)
{
- g_clear_pointer (&self->priv->current_operator_id, g_free);
- g_clear_pointer (&self->priv->current_operator_name, g_free);
- g_list_free_full (self->priv->pco_list, g_object_unref);
- self->priv->pco_list = NULL;
- self->priv->available_data_classes = MBIM_DATA_CLASS_NONE;
- self->priv->highest_available_data_class = MBIM_DATA_CLASS_NONE;
- self->priv->reg_state = MBIM_REGISTER_STATE_UNKNOWN;
- self->priv->packet_service_state = MBIM_PACKET_SERVICE_STATE_UNKNOWN;
- self->priv->packet_service_uplink_speed = 0;
- self->priv->packet_service_downlink_speed = 0;
+ g_clear_pointer (&self->priv->enabled_cache.current_operator_id, g_free);
+ g_clear_pointer (&self->priv->enabled_cache.current_operator_name, g_free);
+ g_list_free_full (self->priv->enabled_cache.pco_list, g_object_unref);
+ self->priv->enabled_cache.pco_list = NULL;
+ self->priv->enabled_cache.available_data_classes = MBIM_DATA_CLASS_NONE;
+ self->priv->enabled_cache.highest_available_data_class = MBIM_DATA_CLASS_NONE;
+ self->priv->enabled_cache.reg_state = MBIM_REGISTER_STATE_UNKNOWN;
+ self->priv->enabled_cache.packet_service_state = MBIM_PACKET_SERVICE_STATE_UNKNOWN;
+ self->priv->enabled_cache.packet_service_uplink_speed = 0;
+ self->priv->enabled_cache.packet_service_downlink_speed = 0;
/* NOTE: FLAG_SUBSCRIBER_INFO is managed both via 3GPP unsolicited
* events and via SIM hot swap setup. We only reset the last ready state
* if SIM hot swap context is not using it. */
if (!self->priv->sim_hot_swap_configured)
- self->priv->last_ready_state = MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED;
+ self->priv->enabled_cache.last_ready_state = MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED;
}
static void
@@ -6217,9 +6226,9 @@ modem_3gpp_load_operator_name (MMIfaceModem3gpp *_self,
GTask *task;
task = g_task_new (self, NULL, callback, user_data);
- if (self->priv->current_operator_name)
+ if (self->priv->enabled_cache.current_operator_name)
g_task_return_pointer (task,
- g_strdup (self->priv->current_operator_name),
+ g_strdup (self->priv->enabled_cache.current_operator_name),
g_free);
else
g_task_return_new_error (task,
@@ -6249,9 +6258,9 @@ modem_3gpp_load_operator_code (MMIfaceModem3gpp *_self,
GTask *task;
task = g_task_new (self, NULL, callback, user_data);
- if (self->priv->current_operator_id)
+ if (self->priv->enabled_cache.current_operator_id)
g_task_return_pointer (task,
- g_strdup (self->priv->current_operator_id),
+ g_strdup (self->priv->enabled_cache.current_operator_id),
g_free);
else
g_task_return_new_error (task,
@@ -9443,11 +9452,11 @@ mm_broadband_modem_mbim_init (MMBroadbandModemMbim *self)
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
MM_TYPE_BROADBAND_MODEM_MBIM,
MMBroadbandModemMbimPrivate);
- self->priv->available_data_classes = MBIM_DATA_CLASS_NONE;
- self->priv->highest_available_data_class = MBIM_DATA_CLASS_NONE;
- self->priv->reg_state = MBIM_REGISTER_STATE_UNKNOWN;
- self->priv->packet_service_state = MBIM_PACKET_SERVICE_STATE_UNKNOWN;
- self->priv->last_ready_state = MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED;
+ self->priv->enabled_cache.available_data_classes = MBIM_DATA_CLASS_NONE;
+ self->priv->enabled_cache.highest_available_data_class = MBIM_DATA_CLASS_NONE;
+ self->priv->enabled_cache.reg_state = MBIM_REGISTER_STATE_UNKNOWN;
+ self->priv->enabled_cache.packet_service_state = MBIM_PACKET_SERVICE_STATE_UNKNOWN;
+ self->priv->enabled_cache.last_ready_state = MBIM_SUBSCRIBER_READY_STATE_NOT_INITIALIZED;
}
static void
@@ -9489,10 +9498,10 @@ finalize (GObject *object)
g_free (self->priv->caps_device_id);
g_free (self->priv->caps_firmware_info);
g_free (self->priv->caps_hardware_info);
- g_free (self->priv->current_operator_id);
- g_free (self->priv->current_operator_name);
+ g_free (self->priv->enabled_cache.current_operator_id);
+ g_free (self->priv->enabled_cache.current_operator_name);
g_free (self->priv->requested_operator_id);
- g_list_free_full (self->priv->pco_list, g_object_unref);
+ g_list_free_full (self->priv->enabled_cache.pco_list, g_object_unref);
G_OBJECT_CLASS (mm_broadband_modem_mbim_parent_class)->finalize (object);
}