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.
This commit is contained in:
@@ -8959,53 +8959,69 @@ packet_service_set_ready (MbimDevice *device,
|
|||||||
GAsyncResult *res,
|
GAsyncResult *res,
|
||||||
GTask *task)
|
GTask *task)
|
||||||
{
|
{
|
||||||
|
MMBroadbandModemMbim *self;
|
||||||
g_autoptr(MbimMessage) response = NULL;
|
g_autoptr(MbimMessage) response = NULL;
|
||||||
GError *error = NULL;
|
g_autoptr(GError) error = NULL;
|
||||||
MbimPacketServiceState requested_packet_service_state;
|
MbimPacketServiceState requested_packet_service_state;
|
||||||
MbimPacketServiceState 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);
|
response = mbim_device_command_finish (device, res, &error);
|
||||||
if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) {
|
if (response &&
|
||||||
g_task_return_error (task, error);
|
(mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error) ||
|
||||||
g_object_unref (task);
|
error->code == MBIM_STATUS_ERROR_FAILURE)) {
|
||||||
return;
|
g_autoptr(GError) inner_error = NULL;
|
||||||
}
|
|
||||||
|
|
||||||
if (mbim_device_check_ms_mbimex_version (device, 3, 0)) {
|
if (mbim_device_check_ms_mbimex_version (device, 3, 0)) {
|
||||||
mbim_message_ms_basic_connect_v3_packet_service_response_parse (
|
mbim_message_ms_basic_connect_v3_packet_service_response_parse (
|
||||||
response,
|
response,
|
||||||
NULL, /* &nw_error */
|
&nw_error,
|
||||||
&packet_service_state,
|
&packet_service_state,
|
||||||
NULL, /* data_class_v3 */
|
NULL, /* data_class_v3 */
|
||||||
NULL, /* uplink_speed */
|
NULL, /* uplink_speed */
|
||||||
NULL, /* downlink_speed */
|
NULL, /* downlink_speed */
|
||||||
NULL, /* frequency_range */
|
NULL, /* frequency_range */
|
||||||
NULL, /* data_subclass */
|
NULL, /* data_subclass */
|
||||||
NULL, /* tai */
|
NULL, /* tai */
|
||||||
&error);
|
&inner_error);
|
||||||
} else if (mbim_device_check_ms_mbimex_version (device, 2, 0)) {
|
} else if (mbim_device_check_ms_mbimex_version (device, 2, 0)) {
|
||||||
mbim_message_ms_basic_connect_v2_packet_service_response_parse (
|
mbim_message_ms_basic_connect_v2_packet_service_response_parse (
|
||||||
response,
|
response,
|
||||||
NULL, /* nw_error */
|
&nw_error,
|
||||||
&packet_service_state,
|
&packet_service_state,
|
||||||
NULL, /* data_class */
|
NULL, /* data_class */
|
||||||
NULL, /* uplink_speed */
|
NULL, /* uplink_speed */
|
||||||
NULL, /* downlink_speed */
|
NULL, /* downlink_speed */
|
||||||
NULL, /* frequency_range */
|
NULL, /* frequency_range */
|
||||||
&error);
|
&inner_error);
|
||||||
} else {
|
} else {
|
||||||
mbim_message_packet_service_response_parse (
|
mbim_message_packet_service_response_parse (
|
||||||
response,
|
response,
|
||||||
NULL, /* nw_error */
|
&nw_error,
|
||||||
&packet_service_state,
|
&packet_service_state,
|
||||||
NULL, /* data_class */
|
NULL, /* data_class */
|
||||||
NULL, /* uplink_speed */
|
NULL, /* uplink_speed */
|
||||||
NULL, /* downlink_speed */
|
NULL, /* downlink_speed */
|
||||||
&error);
|
&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) {
|
if (error) {
|
||||||
g_task_return_error (task, error);
|
g_task_return_error (task, g_steal_pointer (&error));
|
||||||
g_object_unref (task);
|
g_object_unref (task);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user