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:
+18
-2
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
Reference in New Issue
Block a user