From 52d34ce0dbe375de646fd6ae25d2d8197d24dd32 Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Thu, 19 Dec 2013 12:55:51 +0100 Subject: [PATCH] bearer-mbim: parse replies on failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Based on a patch from: Bjørn Mork Some messages provide an additional NwError cause code from the network in case of failure. This means that we need to parse the reply even if the status indicates failure, to be able to return the exact failure cause. --- src/mm-bearer-mbim.c | 144 +++++++++++++++++++++++++++---------------- 1 file changed, 90 insertions(+), 54 deletions(-) diff --git a/src/mm-bearer-mbim.c b/src/mm-bearer-mbim.c index 2cfd1cfa..72cabebc 100644 --- a/src/mm-bearer-mbim.c +++ b/src/mm-bearer-mbim.c @@ -429,24 +429,36 @@ connect_set_ready (MbimDevice *device, response = mbim_device_command_finish (device, res, &error); if (response && - mbim_message_command_done_get_result (response, &error) && - mbim_message_connect_response_parse ( - response, - &session_id, - &activation_state, - NULL, /* voice_call_state */ - &ip_type, - NULL, /* context_type */ - &nw_error, - &error)) { - if (nw_error) - error = mm_mobile_equipment_error_from_mbim_nw_error (nw_error); - else { - ctx->ip_type = ip_type; - mm_dbg ("Session ID '%u': %s (IP type: %s)", - session_id, - mbim_activation_state_get_string (activation_state), - mbim_context_ip_type_get_string (ip_type)); + (mbim_message_command_done_get_result (response, &error) || + error->code == MBIM_STATUS_ERROR_FAILURE)) { + GError *inner_error = NULL; + + if (mbim_message_connect_response_parse ( + response, + &session_id, + &activation_state, + NULL, /* voice_call_state */ + &ip_type, + NULL, /* context_type */ + &nw_error, + &inner_error)) { + if (nw_error) { + if (error) + g_error_free (error); + error = mm_mobile_equipment_error_from_mbim_nw_error (nw_error); + } else { + ctx->ip_type = ip_type; + mm_dbg ("Session ID '%u': %s (IP type: %s)", + session_id, + mbim_activation_state_get_string (activation_state), + mbim_context_ip_type_get_string (ip_type)); + } + } else { + /* Prefer the error from the result to the parsing error */ + if (!error) + error = inner_error; + else + g_error_free (inner_error); } } @@ -523,27 +535,39 @@ packet_service_set_ready (MbimDevice *device, response = mbim_device_command_finish (device, res, &error); if (response && - mbim_message_command_done_get_result (response, &error) && - mbim_message_packet_service_response_parse ( - response, - &nw_error, - &packet_service_state, - &highest_available_data_class, - &uplink_speed, - &downlink_speed, - &error)) { - if (nw_error) - error = mm_mobile_equipment_error_from_mbim_nw_error (nw_error); - else { - gchar *str; + (mbim_message_command_done_get_result (response, &error) || + error->code == MBIM_STATUS_ERROR_FAILURE)) { + GError *inner_error = NULL; - str = mbim_data_class_build_string_from_mask (highest_available_data_class); - mm_dbg ("Packet service update:"); - mm_dbg (" state: '%s'", mbim_packet_service_state_get_string (packet_service_state)); - mm_dbg (" data class: '%s'", str); - mm_dbg (" uplink: '%" G_GUINT64_FORMAT "' bps", uplink_speed); - mm_dbg (" downlink: '%" G_GUINT64_FORMAT "' bps", downlink_speed); - g_free (str); + if (mbim_message_packet_service_response_parse ( + response, + &nw_error, + &packet_service_state, + &highest_available_data_class, + &uplink_speed, + &downlink_speed, + &error)) { + if (nw_error) { + if (error) + g_error_free (error); + error = mm_mobile_equipment_error_from_mbim_nw_error (nw_error); + } else { + gchar *str; + + str = mbim_data_class_build_string_from_mask (highest_available_data_class); + mm_dbg ("Packet service update:"); + mm_dbg (" state: '%s'", mbim_packet_service_state_get_string (packet_service_state)); + mm_dbg (" data class: '%s'", str); + mm_dbg (" uplink: '%" G_GUINT64_FORMAT "' bps", uplink_speed); + mm_dbg (" downlink: '%" G_GUINT64_FORMAT "' bps", downlink_speed); + g_free (str); + } + } else { + /* Prefer the error from the result to the parsing error */ + if (!error) + error = inner_error; + else + g_error_free (inner_error); } } @@ -902,22 +926,34 @@ disconnect_set_ready (MbimDevice *device, response = mbim_device_command_finish (device, res, &error); if (response && - mbim_message_command_done_get_result (response, &error) && - mbim_message_connect_response_parse ( - response, - &session_id, - &activation_state, - NULL, /* voice_call_state */ - NULL, /* ip_type */ - NULL, /* context_type */ - &nw_error, - &error)) { - if (nw_error) - error = mm_mobile_equipment_error_from_mbim_nw_error (nw_error); - else - mm_dbg ("Session ID '%u': %s", - session_id, - mbim_activation_state_get_string (activation_state)); + (mbim_message_command_done_get_result (response, &error) || + error->code == MBIM_STATUS_ERROR_FAILURE)) { + GError *inner_error = NULL; + + if (mbim_message_connect_response_parse ( + response, + &session_id, + &activation_state, + NULL, /* voice_call_state */ + NULL, /* ip_type */ + NULL, /* context_type */ + &nw_error, + &error)) { + if (nw_error) { + if (error) + g_error_free (error); + error = mm_mobile_equipment_error_from_mbim_nw_error (nw_error); + } else + mm_dbg ("Session ID '%u': %s", + session_id, + mbim_activation_state_get_string (activation_state)); + } else { + /* Prefer the error from the result to the parsing error */ + if (!error) + error = inner_error; + else + g_error_free (inner_error); + } } if (error) {