aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2017-03-24 14:55:36 +0100
committerAleksander Morgado <aleksander@aleksander.es>2017-03-24 21:49:23 +0100
commit15d135b9c47a0878e3c62906d33c2a5f08546ac1 (patch)
treefe25e9459117602729446f26df22d06f58f8169d
parentdd1e281e82726bcf3349a776da53c4158b088724 (diff)
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
-rw-r--r--src/mm-base-bearer.c20
-rw-r--r--src/mm-broadband-bearer.c41
2 files changed, 46 insertions, 15 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 3a82defa..9491f5a8 100644
--- a/src/mm-broadband-bearer.c
+++ b/src/mm-broadband-bearer.c
@@ -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);
+ 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,
"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: no control port available");
+ 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);
}
/*****************************************************************************/