base-bearer: avoid conncheck or stats update while disconnecting

We don't want the connection status checks to interfere with the
disconnection logic, e.g. if they're both using the same TTY for both
things.

E.g. the CGACT? from the conncheck gets in the way of the
disconnection logic:

    <debug> [1576037519.710684] Flashing data port (ttyUSB1)...
    <debug> [1576037519.710740] (ttyUSB1): port attributes not fully set
    <debug> [1576037520.287636] (ttyUSB1) device open count is 3 (open)
    <debug> [1576037520.287804] (ttyUSB1): --> 'AT+CGACT?<CR>'
    <debug> [1576037520.711067] (ttyUSB1) device open count is 2 (close)
    <debug> [1576037520.711127] (ttyUSB1): running init sequence...
    <debug> [1576037520.711231] PDP disconnection already sent
    <debug> [1576037520.711263] Disconnected bearer '/org/freedesktop/ModemManager1/Bearer/0'

Instead, fully skip all conncheck and stat updates as long as the
modem is not connected. The actual conncheck and stat update timeouts
will be removed once completely disconnected, as it was before.
This commit is contained in:
Aleksander Morgado
2019-12-16 16:34:50 +00:00
committed by Dan Williams
parent 7d1e949137
commit ab00796009
+18 -12
View File
@@ -195,20 +195,22 @@ static gboolean
connection_monitor_cb (MMBaseBearer *self)
{
/* 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,
NULL);
if (self->priv->status == MM_BEARER_STATUS_CONNECTED)
MM_BASE_BEARER_GET_CLASS (self)->load_connection_status (
self,
(GAsyncReadyCallback)load_connection_status_ready,
NULL);
return G_SOURCE_CONTINUE;
}
static gboolean
initial_connection_monitor_cb (MMBaseBearer *self)
{
MM_BASE_BEARER_GET_CLASS (self)->load_connection_status (
self,
(GAsyncReadyCallback)load_connection_status_ready,
NULL);
if (self->priv->status == MM_BEARER_STATUS_CONNECTED)
MM_BASE_BEARER_GET_CLASS (self)->load_connection_status (
self,
(GAsyncReadyCallback)load_connection_status_ready,
NULL);
/* Add new monitor timeout at a higher rate */
self->priv->connection_monitor_id = g_timeout_add_seconds (BEARER_CONNECTION_MONITOR_TIMEOUT,
@@ -305,6 +307,10 @@ reload_stats_ready (MMBaseBearer *self,
static gboolean
stats_update_cb (MMBaseBearer *self)
{
/* Ignore stats update if we're not connected */
if (self->priv->status != MM_BEARER_STATUS_CONNECTED)
return G_SOURCE_CONTINUE;
/* If the implementation knows how to update stat values, run it */
if (!self->priv->reload_stats_unsupported &&
MM_BASE_BEARER_GET_CLASS (self)->reload_stats &&
@@ -411,15 +417,15 @@ bearer_update_status_connected (MMBaseBearer *self,
self->priv->ignore_disconnection_reports = TRUE;
}
/* Update the property value */
self->priv->status = MM_BEARER_STATUS_CONNECTED;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_STATUS]);
/* Start statistics */
bearer_stats_start (self);
/* Start connection monitor, if supported */
connection_monitor_start (self);
/* Update the property value */
self->priv->status = MM_BEARER_STATUS_CONNECTED;
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_STATUS]);
}
/*****************************************************************************/