[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