[PATCH] base-bearer: stop connection status monitoring if no TTY available

Dan Williams dcbw at redhat.com
Fri Mar 24 20:15:49 UTC 2017


On Fri, 2017-03-24 at 14:55 +0100, Aleksander Morgado wrote:
> On modems with a single TTY for both control and data, we cannot use
> the TTY to load connection status once we're in connected mode:
> 
>     Connection through a plain serial AT port (ttyUSB2)
>     (ttyUSB2): --> 'ATD*99***2#<CR>'
>     (ttyUSB2): <-- '<CR><LF>CONNECT 100000000<CR><LF>'
>     (ttyUSB2): port now connected
>     Connected bearer '/org/freedesktop/ModemManager1/Bearer/0'
>     Modem /org/freedesktop/ModemManager1/Modem/0: state changed
> (connecting -> connected)
>     Simple connect state (8/8): All done
>     checking if connected failed: Couldn't check current list of
> active PDP contexts: No AT port available to run command
>     checking if connected failed: Couldn't check current list of
> active PDP contexts: No AT port available to run command
>     checking if connected failed: Couldn't check current list of
> active PDP contexts: No AT port available to run command
>     ...
> 
> So, disable connection monitoring right away if that situation is
> detected:
> 
>     Connection through a plain serial AT port (ttyUSB2)
>     (ttyUSB2): --> 'ATD*99***2#<CR>'
>     (ttyUSB2): <-- '<CR><LF>CONNECT 100000000<CR><LF>'
>     (ttyUSB2): port now connected
>     Connected bearer '/org/freedesktop/ModemManager1/Bearer/0'
>     Modem /org/freedesktop/ModemManager1/Modem/0: state changed
> (connecting -> connected)
>     Simple connect state (8/8): All done
>     Connection monitoring is unsupported by the device
>     ...
> 
> https://bugs.freedesktop.org/show_bug.cgi?id=100376
> ---
> 
> Hey everyone,
> 
> Plugins can now report a MM_CORE_UNSUPPORTED error in
> load_connection_status() in order to instruct the upper layers to
> stop doing the connection status monitoring for the current
> connection. This is implemented in the generic broadband bearer for
> the specific case of single-TTY modems, where the control TTY can no
> longer be used for AT commands once it gets in connected mode.
> 
> Comments?
> 
> ---
>  src/mm-base-bearer.c      | 20 ++++++++++++++++++--
>  src/mm-broadband-bearer.c | 43 +++++++++++++++++++++++++++++------
> --------
>  2 files changed, 47 insertions(+), 16 deletions(-)
> 
> diff --git a/src/mm-base-bearer.c b/src/mm-base-bearer.c
> index 0cca8534..02084dff 100644
> --- a/src/mm-base-bearer.c
> +++ b/src/mm-base-bearer.c
> @@ -92,6 +92,8 @@ struct _MMBaseBearerPrivate {
> 
>      /* Connection status monitoring */
>      guint connection_monitor_id;
> +    /* Flag to specify whether connection monitoring is supported or
> not */
> +    gboolean load_connection_status_unsupported;
> 
>      /*-- 3GPP specific --*/
>      guint deferred_3gpp_unregistration_id;
> @@ -162,7 +164,18 @@ load_connection_status_ready (MMBaseBearer
> *self,
> 
>      status = MM_BASE_BEARER_GET_CLASS (self)-
> >load_connection_status_finish (self, res, &error);
>      if (status == MM_BEARER_CONNECTION_STATUS_UNKNOWN) {
> -        mm_warn ("checking if connected failed: %s", error-
> >message);
> +        /* Only warn if not reporting an "unsupported" error */
> +        if (!g_error_matches (error, MM_CORE_ERROR,
> MM_CORE_ERROR_UNSUPPORTED)) {
> +            mm_warn ("checking if connected failed: %s", error-
> >message);
> +            g_error_free (error);
> +            return;
> +        }
> +
> +        /* If we're being told that connection monitoring is
> unsupported, just
> +         * ignore the error and remove the timeout. */
> +        mm_dbg ("Connection monitoring is unsupported by the
> device");
> +        self->priv->load_connection_status_unsupported = TRUE;
> +        connection_monitor_stop (self);
>          g_error_free (error);
>          return;
>      }
> @@ -176,7 +189,7 @@ load_connection_status_ready (MMBaseBearer *self,
>  static gboolean
>  connection_monitor_cb (MMBaseBearer *self)
>  {
> -    /* If the implementation knows how to update stat values, run it
> */
> +    /* If the implementation knows how to load connection status,
> run it */
>      MM_BASE_BEARER_GET_CLASS (self)->load_connection_status (
>              self,
>              (GAsyncReadyCallback)load_connection_status_ready,
> @@ -192,6 +205,9 @@ connection_monitor_start (MMBaseBearer *self)
>          !MM_BASE_BEARER_GET_CLASS (self)-
> >load_connection_status_finish)
>          return;
> 
> +    if (self->priv->load_connection_status_unsupported)
> +        return;
> +
>      /* Schedule */
>      g_assert (!self->priv->connection_monitor_id);
>      self->priv->connection_monitor_id = g_timeout_add_seconds
> (BEARER_CONNECTION_MONITOR_TIMEOUT,
> diff --git a/src/mm-broadband-bearer.c b/src/mm-broadband-bearer.c
> index 1188f60a..f2834b1b 100644
> --- a/src/mm-broadband-bearer.c
> +++ b/src/mm-broadband-bearer.c
> @@ -1983,30 +1983,45 @@ load_connection_status
> (MMBaseBearer        *self,
>                          GAsyncReadyCallback  callback,
>                          gpointer             user_data)
>  {
> -    GTask       *task;
> -    MMBaseModem *modem = NULL;
> +    GTask          *task;
> +    MMBaseModem    *modem = NULL;
> +    MMPortSerialAt *port;
> 
>      task = g_task_new (self, NULL, callback, user_data);
> 
> +    g_object_get (MM_BASE_BEARER (self),
> +                  MM_BASE_BEARER_MODEM, &modem,
> +                  NULL);
> +
> +    /* If CID not defined, error out */
>      if (!MM_BROADBAND_BEARER (self)->priv->cid) {
> -        g_task_return_new_error (task, MM_CORE_ERROR,
> MM_CORE_ERROR_FAILED,
> +        g_task_return_new_error (task, MM_CORE_ERROR,
> MM_CORE_ERROR_UNSUPPORTED,

Did you mean to change this case from FAILED -> UNSUPPORTED?

Dan

>                                   "Couldn't load connection status:
> cid not defined");
>          g_object_unref (task);
> -        return;
> +        goto out;
>      }
> 
> -    g_object_get (MM_BASE_BEARER (self),
> -                  MM_BASE_BEARER_MODEM, &modem,
> -                  NULL);
> +    /* If no control port available, error out */
> +    port = mm_base_modem_peek_best_at_port (modem, NULL);
> +    if (!port) {
> +        g_task_return_new_error (task, MM_CORE_ERROR,
> MM_CORE_ERROR_UNSUPPORTED,
> +                                 "Couldn't load connection status:
> cid not defined");
> +        g_object_unref (task);
> +        goto out;
> +    }
> 
> -    mm_base_modem_at_command (MM_BASE_MODEM (modem),
> -                              "+CGACT?",
> -                              3,
> -                              FALSE,
> -                              (GAsyncReadyCallback)
> cgact_periodic_query_ready,
> -                              task);
> +    mm_base_modem_at_command_full (MM_BASE_MODEM (modem),
> +                                   port,
> +                                   "+CGACT?",
> +                                   3,
> +                                   FALSE, /* allow cached */
> +                                   FALSE, /* raw */
> +                                   NULL, /* cancellable */
> +                                   (GAsyncReadyCallback)
> cgact_periodic_query_ready,
> +                                   task);
> 
> -    g_object_unref (modem);
> +out:
> +    g_clear_object (&modem);
>  }
> 
>  /*******************************************************************
> **********/
> --
> 2.12.0
> _______________________________________________
> ModemManager-devel mailing list
> ModemManager-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/modemmanager-devel


More information about the ModemManager-devel mailing list