broadband-modem-mbim: allow normalizing the nw error value

Required for modems that don't provide a correct 3GPP network error
value.
This commit is contained in:
Aleksander Morgado
2024-02-15 21:08:57 +00:00
parent b313a603aa
commit 8dffb76f1e
3 changed files with 47 additions and 14 deletions
+17 -6
View File
@@ -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;
+25 -8
View File
@@ -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);
}
}
}
+5
View File
@@ -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);