aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederic Martinsons <frederic.martinsons@sigfox.com>2021-10-15 08:27:42 +0200
committerAleksander Morgado <aleksander@aleksander.es>2021-12-13 09:35:28 +0000
commit9fc3d15d29678585b2a120f944ec765dcbbf3293 (patch)
treedc5f91a04b9b39d974b0bab1dbd07296f4d54ac3
parent07c4e95ac96e6a810a1fbfdc3277b8d11aab34dd (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.xml9
-rw-r--r--libmm-glib/mm-bearer.c21
-rw-r--r--libmm-glib/mm-bearer.h2
-rw-r--r--src/mm-base-bearer.c52
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 */