aboutsummaryrefslogtreecommitdiff
path: root/src
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 /src
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.
Diffstat (limited to 'src')
-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);