[PATCH] bearer-mbim: handle already disconnected case

Prathmesh Prabhu Chromium pprabhu at chromium.org
Fri Jun 13 14:29:28 PDT 2014


Trace from a successful disconnect:

2014-06-13T21:50:08.819297+01:00 localhost ModemManager[7467]: <debug>
Disconnecting bearer '/org/freedesktop/ModemManager1/Bearer/0'
2014-06-13T21:50:08.819403+01:00 localhost ModemManager[7467]: <info>
 Modem /org/freedesktop/ModemManager1/Modem/0: state changed (connected ->
disconnecting)
2014-06-13T21:50:08.820824+01:00 localhost ModemManager[7467]: <debug>
Launching disconnection on data port (net/wwan0)
2014-06-13T21:50:08.821363+01:00 localhost ModemManager[7467]:
[/dev/cdc-wdm0] Sent message...#012<<<<<< RAW:#012<<<<<<   length =
108#012<<<<<<   data   =
03:00:00:00:6C:00:00:00:16:00:00:00:01:00:00:00:00:00:00:00:A2:89:CC:33:BC:BB:8B:4F:B6:B0:13:3E:C2:AA:E6:DF:0C:00:00:00:01:00:00:00:3C:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:7E:5E:2A:7E:4E:6F:72:72:73:6B:65:6E:7E:5E:2A:7E
2014-06-13T21:50:08.821427+01:00 localhost ModemManager[7467]:
[/dev/cdc-wdm0] Sent message (translated)...#012<<<<<< Header:#012<<<<<<
length      = 108#012<<<<<<   type        = command (0x00000003)#012<<<<<<
  transaction = 22#012<<<<<< Fragment header:#012<<<<<<   total   =
1#012<<<<<<   current = 0#012<<<<<< Contents:#012<<<<<<   service =
'basic-connect' (a289cc33-bcbb-8b4f-b6b0-133ec2aae6df)#012<<<<<<   cid
= 'connect' (0x0000000c)#012<<<<<<   type    = 'set' (0x00000001)
2014-06-13T21:50:08.824002+01:00 localhost ModemManager[7467]:
[/dev/cdc-wdm0] Received message...#012>>>>>> RAW:#012>>>>>>   length =
84#012>>>>>>   data   =
03:00:00:80:54:00:00:00:16:00:00:00:01:00:00:00:00:00:00:00:A2:89:CC:33:BC:BB:8B:4F:B6:B0:13:3E:C2:AA:E6:DF:0C:00:00:00:00:00:00:00:24:00:00:00:00:00:00:00:03:00:00:00:00:00:00:00:00:00:00:00:7E:5E:2A:7E:4E:6F:72:72:73:6B:65:6E:7E:5E:2A:7E:00:00:00:00
2014-06-13T21:50:08.824038+01:00 localhost ModemManager[7467]:
[/dev/cdc-wdm0] Received message (translated)...#012>>>>>>
Header:#012>>>>>>   length      = 84#012>>>>>>   type        = command-done
(0x80000003)#012>>>>>>   transaction = 22#012>>>>>> Fragment
header:#012>>>>>>   total   = 1#012>>>>>>   current = 0#012>>>>>>
Contents:#012>>>>>>   status error = 'None' (0x00000000)#012>>>>>>
service      = 'basic-connect'
(a289cc33-bcbb-8b4f-b6b0-133ec2aae6df)#012>>>>>>   cid          = 'connect'
(0x0000000c)
2014-06-13T21:50:08.824053+01:00 localhost ModemManager[7467]: <debug>
Session ID '0': deactivated
2014-06-13T21:50:08.824061+01:00 localhost ModemManager[7467]: <debug>
(wwan0): port now disconnected
2014-06-13T21:50:08.824070+01:00 localhost ModemManager[7467]: <debug>
Disconnected bearer '/org/freedesktop/ModemManager1/Bearer/0'
2014-06-13T21:50:08.824078+01:00 localhost ModemManager[7467]: <info>
 Modem /org/freedesktop/ModemManager1/Modem/0: state changed (disconnecting
-> registered)


Trace from a failed disconnect (simulated by reducing the timeout to 1
seconds (that ought to be enough for everybody, right? ;) ).
The second attempt to disconnect hits the CONTEXT_NOT_ACTIVATED error, and
succeeds.

2014-06-13T21:41:32.436382+01:00 localhost ModemManager[25314]: <debug>
Disconnecting bearer '/org/freedesktop/ModemManager1/Bearer/0'
2014-06-13T21:41:32.436436+01:00 localhost ModemManager[25314]: <info>
 Modem /org/freedesktop/ModemManager1/Modem/0: state changed (connected ->
disconnecting)
2014-06-13T21:41:32.437900+01:00 localhost ModemManager[25314]: <debug>
Launching disconnection on data port (net/wwan0)
2014-06-13T21:41:32.438038+01:00 localhost ModemManager[25314]:
[/dev/cdc-wdm0] Sent message...#012<<<<<< RAW:#012<<<<<<   length =
108#012<<<<<<   data   =
03:00:00:00:6C:00:00:00:16:00:00:00:01:00:00:00:00:00:00:00:A2:89:CC:33:BC:BB:8B:4F:B6:B0:13:3E:C2:AA:E6:DF:0C:00:00:00:01:00:00:00:3C:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:7E:5E:2A:7E:4E:6F:72:72:73:6B:65:6E:7E:5E:2A:7E
2014-06-13T21:41:32.438054+01:00 localhost ModemManager[25314]:
[/dev/cdc-wdm0] Sent message (translated)...#012<<<<<< Header:#012<<<<<<
length      = 108#012<<<<<<   type        = command (0x00000003)#012<<<<<<
  transaction = 22#012<<<<<< Fragment header:#012<<<<<<   total   =
1#012<<<<<<   current = 0#012<<<<<< Contents:#012<<<<<<   service =
'basic-connect' (a289cc33-bcbb-8b4f-b6b0-133ec2aae6df)#012<<<<<<   cid
= 'connect' (0x0000000c)#012<<<<<<   type    = 'set' (0x00000001)
2014-06-13T21:41:33.438774+01:00 localhost ModemManager[25314]: <debug>
Couldn't disconnect bearer '/org/freedesktop/ModemManager1/Bearer/0'
2014-06-13T21:41:33.438856+01:00 localhost ModemManager[25314]: <info>
 Modem /org/freedesktop/ModemManager1/Modem/0: state changed (disconnecting
-> connected)
2014-06-13T21:41:38.801220+01:00 localhost ModemManager[25314]:
[/dev/cdc-wdm0] Received message...#012>>>>>> RAW:#012>>>>>>   length =
84#012>>>>>>   data   =
03:00:00:80:54:00:00:00:16:00:00:00:01:00:00:00:00:00:00:00:A2:89:CC:33:BC:BB:8B:4F:B6:B0:13:3E:C2:AA:E6:DF:0C:00:00:00:00:00:00:00:24:00:00:00:00:00:00:00:03:00:00:00:00:00:00:00:00:00:00:00:7E:5E:2A:7E:4E:6F:72:72:73:6B:65:6E:7E:5E:2A:7E:00:00:00:00
2014-06-13T21:41:38.801294+01:00 localhost ModemManager[25314]:
[/dev/cdc-wdm0] No transaction matched in received message
2014-06-13T21:41:38.801314+01:00 localhost ModemManager[25314]:
[/dev/cdc-wdm0] Received unexpected message (translated)...#012>>>>>>
Header:#012>>>>>>   length      = 84#012>>>>>>   type        = command-done
(0x80000003)#012>>>>>>   transaction = 22#012>>>>>> Fragment
header:#012>>>>>>   total   = 1#012>>>>>>   current = 0#012>>>>>>
Contents:#012>>>>>>   status error = 'None' (0x00000000)#012>>>>>>
service      = 'basic-connect'
(a289cc33-bcbb-8b4f-b6b0-133ec2aae6df)#012>>>>>>   cid          = 'connect'
(0x0000000c)
2014-06-13T21:41:45.368826+01:00 localhost ModemManager[25314]: <debug>
Disconnecting bearer '/org/freedesktop/ModemManager1/Bearer/0'
2014-06-13T21:41:45.369408+01:00 localhost ModemManager[25314]: <info>
 Modem /org/freedesktop/ModemManager1/Modem/0: state changed (connected ->
disconnecting)
2014-06-13T21:41:45.370606+01:00 localhost ModemManager[25314]: <debug>
Launching disconnection on data port (net/wwan0)
2014-06-13T21:41:45.370642+01:00 localhost ModemManager[25314]:
[/dev/cdc-wdm0] Sent message...#012<<<<<< RAW:#012<<<<<<   length =
108#012<<<<<<   data   =
03:00:00:00:6C:00:00:00:17:00:00:00:01:00:00:00:00:00:00:00:A2:89:CC:33:BC:BB:8B:4F:B6:B0:13:3E:C2:AA:E6:DF:0C:00:00:00:01:00:00:00:3C:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:7E:5E:2A:7E:4E:6F:72:72:73:6B:65:6E:7E:5E:2A:7E
2014-06-13T21:41:45.370656+01:00 localhost ModemManager[25314]:
[/dev/cdc-wdm0] Sent message (translated)...#012<<<<<< Header:#012<<<<<<
length      = 108#012<<<<<<   type        = command (0x00000003)#012<<<<<<
  transaction = 23#012<<<<<< Fragment header:#012<<<<<<   total   =
1#012<<<<<<   current = 0#012<<<<<< Contents:#012<<<<<<   service =
'basic-connect' (a289cc33-bcbb-8b4f-b6b0-133ec2aae6df)#012<<<<<<   cid
= 'connect' (0x0000000c)#012<<<<<<   type    = 'set' (0x00000001)
2014-06-13T21:41:45.373771+01:00 localhost ModemManager[25314]:
[/dev/cdc-wdm0] Received message...#012>>>>>> RAW:#012>>>>>>   length =
84#012>>>>>>   data   =
03:00:00:80:54:00:00:00:17:00:00:00:01:00:00:00:00:00:00:00:A2:89:CC:33:BC:BB:8B:4F:B6:B0:13:3E:C2:AA:E6:DF:0C:00:00:00:10:00:00:00:24:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00
2014-06-13T21:41:45.373805+01:00 localhost ModemManager[25314]:
[/dev/cdc-wdm0] Received message (translated)...#012>>>>>>
Header:#012>>>>>>   length      = 84#012>>>>>>   type        = command-done
(0x80000003)#012>>>>>>   transaction = 23#012>>>>>> Fragment
header:#012>>>>>>   total   = 1#012>>>>>>   current = 0#012>>>>>>
Contents:#012>>>>>>   status error = 'ContextNotActivated'
(0x00000010)#012>>>>>>   service      = 'basic-connect'
(a289cc33-bcbb-8b4f-b6b0-133ec2aae6df)#012>>>>>>   cid          = 'connect'
(0x0000000c)
2014-06-13T21:41:45.373819+01:00 localhost ModemManager[25314]: <debug>
Session ID '0' already disconnected.
2014-06-13T21:41:45.373828+01:00 localhost ModemManager[25314]: <debug>
(wwan0): port now disconnected
2014-06-13T21:41:45.373837+01:00 localhost ModemManager[25314]: <debug>
Disconnected bearer '/org/freedesktop/ModemManager1/Bearer/0'




On Fri, Jun 13, 2014 at 2:22 PM, <pprabhu at chromium.org> wrote:

> From: Prathmesh Prabhu <pprabhu at chromium.org>
>
> If the modem responds with MBIM_STATUS_ERROR_CONTEXT_NOT_ACTIVATED, take
> it to
> mean that the bearer has already been disconnected.
> ---
>  src/mm-bearer-mbim.c | 61
> +++++++++++++++++++++++++++++++---------------------
>  1 file changed, 37 insertions(+), 24 deletions(-)
>
> diff --git a/src/mm-bearer-mbim.c b/src/mm-bearer-mbim.c
> index b1e3176..cc658ee 100644
> --- a/src/mm-bearer-mbim.c
> +++ b/src/mm-bearer-mbim.c
> @@ -950,35 +950,48 @@ disconnect_set_ready (MbimDevice *device,
>      guint32 nw_error;
>
>      response = mbim_device_command_finish (device, res, &error);
> -    if (response &&
> -        (mbim_message_command_done_get_result (response, &error) ||
> -         error->code == MBIM_STATUS_ERROR_FAILURE)) {
> +    if (response) {
>          GError *inner_error = NULL;
> +        gboolean result = FALSE, parsed_result = FALSE;
> +
> +        result = mbim_message_command_done_get_result(response, &error);
> +        /* Parse the response only for the cases we need to */
> +        if (result ||
> +            error->code == MBIM_STATUS_ERROR_FAILURE ||
> +            error->code == MBIM_STATUS_ERROR_CONTEXT_NOT_ACTIVATED) {
> +            parsed_result = mbim_message_connect_response_parse (
> +                    response,
> +                    &session_id,
> +                    &activation_state,
> +                    NULL, /* voice_call_state */
> +                    NULL, /* ip_type */
> +                    NULL, /* context_type */
> +                    &nw_error,
> +                    &inner_error);
> +        }
>
> -        if (mbim_message_connect_response_parse (
> -                response,
> -                &session_id,
> -                &activation_state,
> -                NULL, /* voice_call_state */
> -                NULL, /* ip_type */
> -                NULL, /* context_type */
> -                &nw_error,
> -                &inner_error)) {
> +        /* Now handle different response / error cases */
> +        if (result && parsed_result) {
> +            mm_dbg ("Session ID '%u': %s",
> +                    session_id,
> +                    mbim_activation_state_get_string (activation_state));
> +        } else if (error->code ==
> MBIM_STATUS_ERROR_CONTEXT_NOT_ACTIVATED) {
> +            mm_dbg ("Session ID '%u' already disconnected.", session_id);
> +            g_clear_error (&error);
> +            g_clear_error (&inner_error);
> +        } else if (error->code == MBIM_STATUS_ERROR_FAILURE) {
> +            /* This is the only case when nw_error may be set */
>              if (nw_error) {
> -                if (error)
> -                    g_error_free (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);
> +            }
> +        }  /* else: Some other error->code we don't care about OR (result
> && !parsed_result) */
> +
> +        /* Give precedence to original error over parsing error */
> +        if (!error && inner_error) {
> +            error = inner_error;
>          }
> +        g_clear_error(&inner_error);
>      }
>
>      if (response)
> --
> 2.0.0.526.g5318336
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/modemmanager-devel/attachments/20140613/0a76cfe1/attachment-0001.html>


More information about the ModemManager-devel mailing list