summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2021-10-17 22:54:14 +0200
committerAleksander Morgado <aleksander@aleksander.es>2021-10-19 08:27:23 +0000
commitc091860618b3150fc6bc4b24527408234a2f00ad (patch)
tree9547db95bffee1e7d0ee9a3039afd12b75e68d2d
parentaf7d488325c788814e27fbd1c5c6cadfeb04663e (diff)
broadband-modem-mbim: sync current modes and registration requests
In MBIM we use the same "Register State Set Request" for 2 different things: configuring the allowed modes, and selecting the operator to use (manual/automatic). We need to keep track of which were the last things requested by the user so that we don't overwrite previous user actions when we process newer ones.
-rw-r--r--src/mm-broadband-modem-mbim.c58
1 files changed, 30 insertions, 28 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index 2d3e6d63..bb804a9d 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -133,8 +133,10 @@ struct _MMBroadbandModemMbimPrivate {
GList *pco_list;
/* 3GPP registration helpers */
- gchar *current_operator_id;
- gchar *current_operator_name;
+ gchar *current_operator_id;
+ gchar *current_operator_name;
+ gchar *requested_operator_id;
+ MbimDataClass requested_data_class; /* 0 for defaults/auto */
/* USSD helpers */
GTask *pending_ussd_action;
@@ -1251,20 +1253,21 @@ modem_set_current_modes (MMIfaceModem *_self,
if (mbim_device_check_ms_mbimex_version (device, 2, 0)) {
g_autoptr(MbimMessage) message = NULL;
- MbimDataClass data_class;
/* Limit ANY to the currently supported modes */
if (allowed == MM_MODEM_MODE_ANY)
allowed = mm_modem_mode_from_mbim_data_class (self->priv->caps_data_class);
- data_class = mm_mbim_data_class_from_modem_mode (allowed,
- mm_iface_modem_is_3gpp (_self),
- mm_iface_modem_is_cdma (_self));
- g_task_set_task_data (task, GUINT_TO_POINTER (data_class), NULL);
+ self->priv->requested_data_class = mm_mbim_data_class_from_modem_mode (allowed,
+ mm_iface_modem_is_3gpp (_self),
+ mm_iface_modem_is_cdma (_self));
+ g_task_set_task_data (task, GUINT_TO_POINTER (self->priv->requested_data_class), NULL);
+ /* use the last requested operator id to determine whether the
+ * registration should be manual or automatic */
message = mbim_message_register_state_set_new (
- NULL,
- MBIM_REGISTER_ACTION_AUTOMATIC,
- data_class,
+ self->priv->requested_operator_id ? self->priv->requested_operator_id : "",
+ self->priv->requested_operator_id ? MBIM_REGISTER_ACTION_MANUAL : MBIM_REGISTER_ACTION_AUTOMATIC,
+ self->priv->requested_data_class,
NULL);
mbim_device_command (device,
message,
@@ -5004,23 +5007,24 @@ register_state_set_ready (MbimDevice *device,
}
static void
-modem_3gpp_register_in_network (MMIfaceModem3gpp *self,
+modem_3gpp_register_in_network (MMIfaceModem3gpp *_self,
const gchar *operator_id,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
{
- MbimDevice *device;
- MbimMessage *message;
- GTask *task;
+ MMBroadbandModemMbim *self = MM_BROADBAND_MODEM_MBIM (_self);
+ MbimDevice *device;
+ GTask *task;
+ g_autoptr(MbimMessage) message = NULL;
#if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED
/* data_class set to 0 in the MBIM register state set message ends up
* selecting some "auto" mode that would overwrite whatever capabilities
* and modes we had set. So, if we're using QMI-based capability and
* mode switching, also use QMI-based network registration. */
- if (MM_BROADBAND_MODEM_MBIM (self)->priv->qmi_capability_and_mode_switching) {
- mm_shared_qmi_3gpp_register_in_network (self, operator_id, cancellable, callback, user_data);
+ if (self->priv->qmi_capability_and_mode_switching) {
+ mm_shared_qmi_3gpp_register_in_network (_self, operator_id, cancellable, callback, user_data);
return;
}
#endif
@@ -5030,25 +5034,22 @@ modem_3gpp_register_in_network (MMIfaceModem3gpp *self,
task = g_task_new (self, NULL, callback, user_data);
+ /* keep track of which operator id is selected */
+ g_clear_pointer (&self->priv->requested_operator_id, g_free);
if (operator_id && operator_id[0])
- message = (mbim_message_register_state_set_new (
- operator_id,
- MBIM_REGISTER_ACTION_MANUAL,
- 0, /* data_class, none preferred */
- NULL));
- else
- message = (mbim_message_register_state_set_new (
- "",
- MBIM_REGISTER_ACTION_AUTOMATIC,
- 0, /* data_class, none preferred */
- NULL));
+ self->priv->requested_operator_id = g_strdup (operator_id);
+
+ message = (mbim_message_register_state_set_new (
+ self->priv->requested_operator_id ? self->priv->requested_operator_id : "",
+ self->priv->requested_operator_id ? MBIM_REGISTER_ACTION_MANUAL : MBIM_REGISTER_ACTION_AUTOMATIC,
+ self->priv->requested_data_class,
+ NULL));
mbim_device_command (device,
message,
60,
NULL,
(GAsyncReadyCallback)register_state_set_ready,
task);
- mbim_message_unref (message);
}
/*****************************************************************************/
@@ -7560,6 +7561,7 @@ finalize (GObject *object)
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->requested_operator_id);
g_list_free_full (self->priv->pco_list, g_object_unref);
G_OBJECT_CLASS (mm_broadband_modem_mbim_parent_class)->finalize (object);