aboutsummaryrefslogtreecommitdiff
path: root/src/mm-broadband-modem-mbim.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksandermj@chromium.org>2022-10-20 10:39:56 +0000
committerAleksander Morgado <aleksandermj@chromium.org>2022-11-08 14:25:32 +0000
commit9f330da90bd4274f51e5386886c2070259b0a59e (patch)
tree539d531638e40f4bdef11e2fa4bebcc87060c49e /src/mm-broadband-modem-mbim.c
parentd28d00f04f69f2d7d2ff2fc80bd324c877bc1538 (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.c92
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;
}