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

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
This commit is contained in:
Aleksander Morgado
2017-03-24 21:49:23 +01:00
parent dd1e281e82
commit 15d135b9c4
2 changed files with 49 additions and 18 deletions
+18 -2
View File
@@ -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,
+31 -16
View File
@@ -1992,30 +1992,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);
if (!MM_BROADBAND_BEARER (self)->priv->cid) {
g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
"Couldn't load connection status: cid not defined");
g_object_unref (task);
return;
}
g_object_get (MM_BASE_BEARER (self),
MM_BASE_BEARER_MODEM, &modem,
NULL);
mm_base_modem_at_command (MM_BASE_MODEM (modem),
"+CGACT?",
3,
FALSE,
(GAsyncReadyCallback) cgact_periodic_query_ready,
task);
/* 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,
"Couldn't load connection status: cid not defined");
g_object_unref (task);
goto out;
}
g_object_unref (modem);
/* 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: no control port available");
g_object_unref (task);
goto out;
}
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);
out:
g_clear_object (&modem);
}
/*****************************************************************************/