diff options
author | Frederic Martinsons <frederic.martinsons@sigfox.com> | 2021-10-15 08:27:42 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-12-13 09:35:28 +0000 |
commit | 9fc3d15d29678585b2a120f944ec765dcbbf3293 (patch) | |
tree | dc5f91a04b9b39d974b0bab1dbd07296f4d54ac3 | |
parent | 07c4e95ac96e6a810a1fbfdc3277b8d11aab34dd (diff) |
api, dbus, bearer: Add ReloadStatsSupported bearer dbus property
This property means that the current bearer can reload stats and read TX
and RX bytes transmitted.
The property is initiliazed as soon as the bearer is connected.
Signed-off-by: Frederic Martinsons <frederic.martinsons@sigfox.com>
-rw-r--r-- | introspection/org.freedesktop.ModemManager1.Bearer.xml | 9 | ||||
-rw-r--r-- | libmm-glib/mm-bearer.c | 21 | ||||
-rw-r--r-- | libmm-glib/mm-bearer.h | 2 | ||||
-rw-r--r-- | src/mm-base-bearer.c | 52 |
4 files changed, 66 insertions, 18 deletions
diff --git a/introspection/org.freedesktop.ModemManager1.Bearer.xml b/introspection/org.freedesktop.ModemManager1.Bearer.xml index b822bf98..de306a61 100644 --- a/introspection/org.freedesktop.ModemManager1.Bearer.xml +++ b/introspection/org.freedesktop.ModemManager1.Bearer.xml @@ -379,6 +379,15 @@ <property name="Stats" type="a{sv}" access="read" /> <!-- + ReloadStatsSupported: + + Indicates whether or not the bearer support getting rx and tx bytes statistics. + + Since: 1.20 + --> + <property name="ReloadStatsSupported" type="b" access="read" /> + + <!-- IpTimeout: Maximum time to wait for a successful IP establishment, when PPP is used. diff --git a/libmm-glib/mm-bearer.c b/libmm-glib/mm-bearer.c index 52ec6533..ddcfa053 100644 --- a/libmm-glib/mm-bearer.c +++ b/libmm-glib/mm-bearer.c @@ -172,6 +172,27 @@ mm_bearer_get_connected (MMBearer *self) /*****************************************************************************/ /** + * mm_bearer_get_reload_stats_supported: + * @self: A #MMBearer. + * + * Checks whether or not the #MMBearer supporting stats reload (to have + * RX and TX bytes of the ongoing connection). + * + * Returns: %TRUE if the #MMBearer supports these stats, #FALSE otherwise. + * + * Since: 1.20 + */ +gboolean +mm_bearer_get_reload_stats_supported (MMBearer *self) +{ + g_return_val_if_fail (MM_IS_BEARER (self), FALSE); + + return mm_gdbus_bearer_get_reload_stats_supported (MM_GDBUS_BEARER (self)); +} + +/*****************************************************************************/ + +/** * mm_bearer_get_suspended: * @self: A #MMBearer. * diff --git a/libmm-glib/mm-bearer.h b/libmm-glib/mm-bearer.h index 7424c8d9..c1a32cd3 100644 --- a/libmm-glib/mm-bearer.h +++ b/libmm-glib/mm-bearer.h @@ -76,6 +76,8 @@ gchar *mm_bearer_dup_interface (MMBearer *self); gboolean mm_bearer_get_connected (MMBearer *self); +gboolean mm_bearer_get_reload_stats_supported (MMBearer *self); + gboolean mm_bearer_get_suspended (MMBearer *self); gboolean mm_bearer_get_multiplexed (MMBearer *self); diff --git a/src/mm-base-bearer.c b/src/mm-base-bearer.c index e5990b96..344a5e78 100644 --- a/src/mm-base-bearer.c +++ b/src/mm-base-bearer.c @@ -125,7 +125,7 @@ struct _MMBaseBearerPrivate { /* Timer to measure the duration of the connection */ GTimer *duration_timer; /* Flag to specify whether reloading stats is supported or not */ - gboolean reload_stats_unsupported; + gboolean reload_stats_supported; }; /*****************************************************************************/ @@ -390,6 +390,25 @@ bearer_stats_stop (MMBaseBearer *self) } static void +reload_stats_supported_ready (MMBaseBearer *self, + GAsyncResult *res) +{ + GError *error = NULL; + guint64 rx_bytes = 0; + guint64 tx_bytes = 0; + + MM_BASE_BEARER_GET_CLASS (self)->reload_stats_finish (self, &rx_bytes, &tx_bytes, res, &error); + if (!error) { + mm_obj_info (self, "reloading stats is supported by the device"); + self->priv->reload_stats_supported = TRUE; + mm_gdbus_bearer_set_reload_stats_supported (MM_GDBUS_BEARER (self), self->priv->reload_stats_supported); + } else { + mm_obj_info (self, "reloading stats is not supported by the device"); + g_clear_error (&error); + } +} + +static void reload_stats_ready (MMBaseBearer *self, GAsyncResult *res) { @@ -398,20 +417,9 @@ reload_stats_ready (MMBaseBearer *self, guint64 tx_bytes = 0; if (!MM_BASE_BEARER_GET_CLASS (self)->reload_stats_finish (self, &rx_bytes, &tx_bytes, res, &error)) { - /* If reloading stats fails, warn about it and don't update anything */ - if (!g_error_matches (error, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED)) { - mm_obj_warn (self, "reloading stats failed: %s", error->message); - g_error_free (error); - return; - } - - /* If we're being told that reloading stats is unsupported, just ignore - * the error and update oly the duration timer. */ - mm_obj_dbg (self, "reloading stats is unsupported by the device"); - self->priv->reload_stats_unsupported = TRUE; - rx_bytes = 0; - tx_bytes = 0; + mm_obj_warn (self, "reloading stats failed: %s", error->message); g_error_free (error); + return; } /* We only update stats if they were retrieved properly */ @@ -429,9 +437,7 @@ stats_update_cb (MMBaseBearer *self) 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 && - MM_BASE_BEARER_GET_CLASS (self)->reload_stats_finish) { + if (self->priv->reload_stats_supported) { MM_BASE_BEARER_GET_CLASS (self)->reload_stats ( self, (GAsyncReadyCallback)reload_stats_ready, @@ -538,7 +544,7 @@ bearer_update_status (MMBaseBearer *self, "connection #%u finished: duration %us", mm_bearer_stats_get_attempts (self->priv->stats), mm_bearer_stats_get_duration (self->priv->stats)); - if (!self->priv->reload_stats_unsupported) + if (self->priv->reload_stats_supported) g_string_append_printf (report, ", tx: %" G_GUINT64_FORMAT " bytes, rx: %" G_GUINT64_FORMAT " bytes", mm_bearer_stats_get_tx_bytes (self->priv->stats), @@ -583,6 +589,15 @@ bearer_update_status_connected (MMBaseBearer *self, self->priv->status = MM_BEARER_STATUS_CONNECTED; g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_STATUS]); + /* Check that reload statistics is supported by the device */ + if (MM_BASE_BEARER_GET_CLASS (self)->reload_stats && + MM_BASE_BEARER_GET_CLASS (self)->reload_stats_finish) { + MM_BASE_BEARER_GET_CLASS (self)->reload_stats ( + self, + (GAsyncReadyCallback)reload_stats_supported_ready, + NULL); + } + /* Start statistics */ bearer_stats_start (self, uplink_speed, downlink_speed); @@ -1773,6 +1788,7 @@ mm_base_bearer_init (MMBaseBearer *self) self->priv->status = MM_BEARER_STATUS_DISCONNECTED; self->priv->reason_3gpp = CONNECTION_FORBIDDEN_REASON_NONE; self->priv->reason_cdma = CONNECTION_FORBIDDEN_REASON_NONE; + self->priv->reload_stats_supported = FALSE; self->priv->stats = mm_bearer_stats_new (); /* Set defaults */ |