diff options
author | Aleksander Morgado <aleksandermj@chromium.org> | 2022-10-20 10:39:56 +0000 |
---|---|---|
committer | Aleksander Morgado <aleksandermj@chromium.org> | 2022-11-08 14:25:32 +0000 |
commit | 9f330da90bd4274f51e5386886c2070259b0a59e (patch) | |
tree | 539d531638e40f4bdef11e2fa4bebcc87060c49e /src/mm-broadband-modem-mbim.c | |
parent | d28d00f04f69f2d7d2ff2fc80bd324c877bc1538 (diff) |
broadband-modem-mbim: return nw_error on packet service attach failure
If the packet attach operation fails we may still get the response
with a nw_error field telling us a more detailed error reason for the
failure. Try to parse the message and return an error including the
nw_error information.
Diffstat (limited to 'src/mm-broadband-modem-mbim.c')
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 92 |
1 files changed, 54 insertions, 38 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 471f1b0f..c2cd39d9 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -8959,53 +8959,69 @@ packet_service_set_ready (MbimDevice *device, GAsyncResult *res, GTask *task) { + MMBroadbandModemMbim *self; g_autoptr(MbimMessage) response = NULL; - GError *error = NULL; + g_autoptr(GError) error = NULL; MbimPacketServiceState requested_packet_service_state; MbimPacketServiceState packet_service_state; + guint32 nw_error; + + self = g_task_get_source_object (task); response = mbim_device_command_finish (device, res, &error); - if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) { - g_task_return_error (task, error); - g_object_unref (task); - return; - } + if (response && + (mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error) || + error->code == MBIM_STATUS_ERROR_FAILURE)) { + g_autoptr(GError) inner_error = NULL; - if (mbim_device_check_ms_mbimex_version (device, 3, 0)) { - mbim_message_ms_basic_connect_v3_packet_service_response_parse ( - response, - NULL, /* &nw_error */ - &packet_service_state, - NULL, /* data_class_v3 */ - NULL, /* uplink_speed */ - NULL, /* downlink_speed */ - NULL, /* frequency_range */ - NULL, /* data_subclass */ - NULL, /* tai */ - &error); - } else if (mbim_device_check_ms_mbimex_version (device, 2, 0)) { - mbim_message_ms_basic_connect_v2_packet_service_response_parse ( - response, - NULL, /* nw_error */ - &packet_service_state, - NULL, /* data_class */ - NULL, /* uplink_speed */ - NULL, /* downlink_speed */ - NULL, /* frequency_range */ - &error); - } else { - mbim_message_packet_service_response_parse ( - response, - NULL, /* nw_error */ - &packet_service_state, - NULL, /* data_class */ - NULL, /* uplink_speed */ - NULL, /* downlink_speed */ - &error); + if (mbim_device_check_ms_mbimex_version (device, 3, 0)) { + mbim_message_ms_basic_connect_v3_packet_service_response_parse ( + response, + &nw_error, + &packet_service_state, + NULL, /* data_class_v3 */ + NULL, /* uplink_speed */ + NULL, /* downlink_speed */ + NULL, /* frequency_range */ + NULL, /* data_subclass */ + NULL, /* tai */ + &inner_error); + } else if (mbim_device_check_ms_mbimex_version (device, 2, 0)) { + mbim_message_ms_basic_connect_v2_packet_service_response_parse ( + response, + &nw_error, + &packet_service_state, + NULL, /* data_class */ + NULL, /* uplink_speed */ + NULL, /* downlink_speed */ + NULL, /* frequency_range */ + &inner_error); + } else { + mbim_message_packet_service_response_parse ( + response, + &nw_error, + &packet_service_state, + NULL, /* data_class */ + NULL, /* uplink_speed */ + NULL, /* downlink_speed */ + &inner_error); + } + + if (!inner_error) { + /* Prefer the NW error if available */ + if (nw_error) { + g_clear_error (&error); + error = mm_mobile_equipment_error_from_mbim_nw_error (nw_error, self); + } + } else { + /* Prefer the error from the result to the parsing error */ + if (!error) + error = g_steal_pointer (&inner_error); + } } if (error) { - g_task_return_error (task, error); + g_task_return_error (task, g_steal_pointer (&error)); g_object_unref (task); return; } |