diff options
author | Aleksander Morgado <aleksandermj@chromium.org> | 2024-02-14 13:16:42 +0000 |
---|---|---|
committer | Aleksander Morgado <aleksandermj@chromium.org> | 2024-02-15 21:08:57 +0000 |
commit | 8dffb76f1ea37b608b509f8ff5dab0b1dbe8f773 (patch) | |
tree | b78b3b211e229d633c8fc57c6b4d266d78e269c1 /src | |
parent | b313a603aa0eb9ad2d3315aee2762cbb4eb25651 (diff) |
broadband-modem-mbim: allow normalizing the nw error value
Required for modems that don't provide a correct 3GPP network error
value.
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-bearer-mbim.c | 23 | ||||
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 33 | ||||
-rw-r--r-- | src/mm-broadband-modem-mbim.h | 5 |
3 files changed, 47 insertions, 14 deletions
diff --git a/src/mm-bearer-mbim.c b/src/mm-bearer-mbim.c index bb0b80d5..33a1b8f1 100644 --- a/src/mm-bearer-mbim.c +++ b/src/mm-bearer-mbim.c @@ -927,6 +927,7 @@ connect_set_ready (MbimDevice *device, error = g_steal_pointer (&inner_error); } else { /* Report the IP type we asked for and the one returned by the modem */ + nw_error = mm_broadband_modem_mbim_normalize_nw_error (ctx->modem, nw_error); mm_obj_dbg (self, "session ID '%u': %s (requested IP type: %s, activated IP type: %s, nw error: %s)", session_id, mbim_activation_state_get_string (activation_state), @@ -1604,15 +1605,17 @@ typedef enum { } DisconnectStep; typedef struct { - MMPortMbim *mbim; - guint session_id; - DisconnectStep step; + MMPortMbim *mbim; + MMBroadbandModemMbim *modem; + guint session_id; + DisconnectStep step; } DisconnectContext; static void disconnect_context_free (DisconnectContext *ctx) { g_object_unref (ctx->mbim); + g_object_unref (ctx->modem); g_slice_free (DisconnectContext, ctx); } @@ -1732,6 +1735,7 @@ disconnect_set_ready (MbimDevice *device, goto out; } + nw_error = mm_broadband_modem_mbim_normalize_nw_error (ctx->modem, nw_error); if (g_error_matches (error, MBIM_STATUS_ERROR, MBIM_STATUS_ERROR_FAILURE) && parsed_result && nw_error != 0) { g_assert (!inner_error); g_error_free (error); @@ -1801,9 +1805,10 @@ disconnect (MMBaseBearer *_self, GAsyncReadyCallback callback, gpointer user_data) { - MMBearerMbim *self = MM_BEARER_MBIM (_self); - DisconnectContext *ctx; - GTask *task; + MMBearerMbim *self = MM_BEARER_MBIM (_self); + DisconnectContext *ctx; + GTask *task; + g_autoptr(MMBaseModem) modem = NULL; task = g_task_new (self, NULL, callback, user_data); @@ -1815,11 +1820,17 @@ disconnect (MMBaseBearer *_self, return; } + g_object_get (self, + MM_BASE_BEARER_MODEM, &modem, + NULL); + g_assert (modem); + mm_obj_dbg (self, "launching disconnection on data port (%s/%s)", mm_port_subsys_get_string (mm_port_get_subsys (self->priv->data)), mm_port_get_device (self->priv->data)); ctx = g_slice_new0 (DisconnectContext); + ctx->modem = MM_BROADBAND_MODEM_MBIM (g_object_ref (modem)); ctx->mbim = g_object_ref (self->priv->mbim); ctx->session_id = self->priv->session_id; ctx->step = DISCONNECT_STEP_FIRST; diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 2a1f8e6e..0f2f8491 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -401,6 +401,18 @@ mm_broadband_modem_mbim_peek_port_mbim_for_data (MMBroadbandModemMbim *self, /*****************************************************************************/ +guint32 +mm_broadband_modem_mbim_normalize_nw_error (MMBroadbandModemMbim *self, + guint32 nw_error) +{ + if (MM_BROADBAND_MODEM_MBIM_GET_CLASS (self)->normalize_nw_error) + return MM_BROADBAND_MODEM_MBIM_GET_CLASS (self)->normalize_nw_error (self, nw_error); + + return nw_error; +} + +/*****************************************************************************/ + gboolean mm_broadband_modem_mbim_is_context_type_ext_supported (MMBroadbandModemMbim *self) { @@ -4020,6 +4032,7 @@ lte_attach_info_query_ready (MbimDevice *device, if (nw_error) { const gchar *nw_error_str; + nw_error = mm_broadband_modem_mbim_normalize_nw_error (self, nw_error); nw_error_str = mbim_nw_error_get_string (nw_error); if (nw_error_str) mm_obj_dbg (self, "LTE attach info network error reported: %s", nw_error_str); @@ -4975,6 +4988,7 @@ common_process_register_state (MMBroadbandModemMbim *self, } } + nw_error = mm_broadband_modem_mbim_normalize_nw_error (self, nw_error); nw_error_str = mbim_nw_error_get_string (nw_error); available_data_classes_str = mbim_data_class_build_string_from_mask (available_data_classes); preferred_data_classes_str = mbim_data_class_build_string_from_mask (preferred_data_classes); @@ -5091,6 +5105,7 @@ basic_connect_notification_connect (MMBroadbandModemMbim *self, ReportDisconnectedStatusContext ctx; g_autoptr(GError) connection_error = NULL; + nw_error = mm_broadband_modem_mbim_normalize_nw_error (self, nw_error); connection_error = mm_error_from_mbim_nw_error (nw_error, self); mm_obj_dbg (self, "session ID '%u' was deactivated: %s", session_id, connection_error->message); @@ -5418,6 +5433,7 @@ common_process_packet_service (MMBroadbandModemMbim *self, } frequency_range_str = mbim_frequency_range_build_string_from_mask (frequency_range); + nw_error = mm_broadband_modem_mbim_normalize_nw_error (self, nw_error); nw_error_str = mbim_nw_error_get_string (nw_error); mm_obj_dbg (self, "packet service update:"); @@ -5750,6 +5766,7 @@ ms_basic_connect_extensions_notification_lte_attach_info (MMBroadbandModemMbim * if (nw_error) { const gchar *nw_error_str; + nw_error = mm_broadband_modem_mbim_normalize_nw_error (self, nw_error); nw_error_str = mbim_nw_error_get_string (nw_error); if (nw_error_str) mm_obj_dbg (self, "LTE attach info network error reported: %s", nw_error_str); @@ -6834,9 +6851,9 @@ register_state_set_ready (MbimDevice *device, (mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error) || g_error_matches (error, MBIM_STATUS_ERROR, MBIM_STATUS_ERROR_FAILURE))) { g_autoptr(GError) inner_error = NULL; - MbimNwError nw_error = 0; + MbimNwError normalized_nw_error = 0; - if (!common_process_register_state (self, device, response, &nw_error, &inner_error)) { + if (!common_process_register_state (self, device, response, &normalized_nw_error, &inner_error)) { mm_obj_warn (self, "%s", inner_error->message); /* Prefer the error from the result to the parsing error */ if (!error) @@ -6852,9 +6869,9 @@ register_state_set_ready (MbimDevice *device, * that is the case, log about it and ignore the error; we are anyway * reloading the registration info after the set, so it should not be * a big issue. */ - if (nw_error) { + if (normalized_nw_error) { g_clear_error (&error); - error = mm_error_from_mbim_nw_error (nw_error, self); + error = mm_error_from_mbim_nw_error (normalized_nw_error, self); } } } @@ -9787,12 +9804,12 @@ packet_service_set_ready (MbimDevice *device, (mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error) || g_error_matches (error, MBIM_STATUS_ERROR, MBIM_STATUS_ERROR_FAILURE))) { g_autoptr(GError) inner_error = NULL; - guint32 nw_error = 0; + guint32 normalized_nw_error = 0; if (!common_process_packet_service (self, device, response, - &nw_error, + &normalized_nw_error, &packet_service_state, &inner_error)) { mm_obj_warn (self, "%s", inner_error->message); @@ -9801,9 +9818,9 @@ packet_service_set_ready (MbimDevice *device, error = g_steal_pointer (&inner_error); } else { /* Prefer the NW error if available */ - if (nw_error) { + if (normalized_nw_error) { g_clear_error (&error); - error = mm_error_from_mbim_nw_error (nw_error, self); + error = mm_error_from_mbim_nw_error (normalized_nw_error, self); } } } diff --git a/src/mm-broadband-modem-mbim.h b/src/mm-broadband-modem-mbim.h index 8953ef8a..968a5764 100644 --- a/src/mm-broadband-modem-mbim.h +++ b/src/mm-broadband-modem-mbim.h @@ -43,6 +43,8 @@ struct _MMBroadbandModemMbimClass{ MMPortMbim * (* peek_port_mbim_for_data) (MMBroadbandModemMbim *self, MMPort *data, GError **error); + guint32 (* normalize_nw_error) (MMBroadbandModemMbim *self, + guint32 nw_error); }; GType mm_broadband_modem_mbim_get_type (void); @@ -64,6 +66,9 @@ MMPortMbim *mm_broadband_modem_mbim_get_port_mbim_for_data (MMBroadbandModemMbi MMPort *data, GError **error); +guint32 mm_broadband_modem_mbim_normalize_nw_error (MMBroadbandModemMbim *self, + guint32 nw_error); + void mm_broadband_modem_mbim_set_unlock_retries (MMBroadbandModemMbim *self, MMModemLock lock_type, guint32 remaining_attempts); |