diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2020-03-27 18:01:36 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2020-04-10 11:45:03 +0000 |
commit | 79daa3099e1f8478b8e17d8065143bca3e38214b (patch) | |
tree | c18029edf3c1bef13fd7975041c9fb7146ec9db4 | |
parent | f325ef59020b0acc33b6d05e96c8df7b58373715 (diff) |
api,bearer: add 'total-rx-bytes', 'total-tx-bytes' and 'total-duration' stats
Compiling the amount of bytes transferred and received during all
tracked connection attempts, as well as the total duration of all the
connections.
-rw-r--r-- | cli/mmcli-bearer.c | 15 | ||||
-rw-r--r-- | cli/mmcli-output.c | 3 | ||||
-rw-r--r-- | cli/mmcli-output.h | 3 | ||||
-rw-r--r-- | docs/reference/libmm-glib/libmm-glib-sections.txt | 6 | ||||
-rw-r--r-- | introspection/org.freedesktop.ModemManager1.Bearer.xml | 25 | ||||
-rw-r--r-- | libmm-glib/mm-bearer-stats.c | 129 | ||||
-rw-r--r-- | libmm-glib/mm-bearer-stats.h | 6 | ||||
-rw-r--r-- | src/mm-base-bearer.c | 72 |
8 files changed, 248 insertions, 11 deletions
diff --git a/cli/mmcli-bearer.c b/cli/mmcli-bearer.c index 2dfdab35..f3a45bf2 100644 --- a/cli/mmcli-bearer.c +++ b/cli/mmcli-bearer.c @@ -250,6 +250,9 @@ print_bearer_info (MMBearer *bearer) gchar *bytes_tx = NULL; gchar *attempts = NULL; gchar *failed_attempts = NULL; + gchar *total_duration = NULL; + gchar *total_bytes_rx = NULL; + gchar *total_bytes_tx = NULL; if (stats) { guint64 val; @@ -269,6 +272,15 @@ print_bearer_info (MMBearer *bearer) val = mm_bearer_stats_get_failed_attempts (stats); if (val) failed_attempts = g_strdup_printf ("%" G_GUINT64_FORMAT, val); + val = mm_bearer_stats_get_total_duration (stats); + if (val) + total_duration = g_strdup_printf ("%" G_GUINT64_FORMAT, val); + val = mm_bearer_stats_get_total_rx_bytes (stats); + if (val) + total_bytes_rx = g_strdup_printf ("%" G_GUINT64_FORMAT, val); + val = mm_bearer_stats_get_total_tx_bytes (stats); + if (val) + total_bytes_tx = g_strdup_printf ("%" G_GUINT64_FORMAT, val); } mmcli_output_string_take (MMC_F_BEARER_STATS_DURATION, duration); @@ -276,6 +288,9 @@ print_bearer_info (MMBearer *bearer) mmcli_output_string_take (MMC_F_BEARER_STATS_BYTES_TX, bytes_tx); mmcli_output_string_take (MMC_F_BEARER_STATS_ATTEMPTS, attempts); mmcli_output_string_take (MMC_F_BEARER_STATS_FAILED_ATTEMPTS, failed_attempts); + mmcli_output_string_take (MMC_F_BEARER_STATS_TOTAL_DURATION, total_duration); + mmcli_output_string_take (MMC_F_BEARER_STATS_TOTAL_BYTES_RX, total_bytes_rx); + mmcli_output_string_take (MMC_F_BEARER_STATS_TOTAL_BYTES_TX, total_bytes_tx); } mmcli_output_dump (); diff --git a/cli/mmcli-output.c b/cli/mmcli-output.c index 7418fc18..49ebdcdc 100644 --- a/cli/mmcli-output.c +++ b/cli/mmcli-output.c @@ -228,6 +228,9 @@ static FieldInfo field_infos[] = { [MMC_F_BEARER_STATS_BYTES_TX] = { "bearer.stats.bytes-tx", "bytes tx", MMC_S_BEARER_STATS, }, [MMC_F_BEARER_STATS_ATTEMPTS] = { "bearer.stats.attempts", "attempts", MMC_S_BEARER_STATS, }, [MMC_F_BEARER_STATS_FAILED_ATTEMPTS] = { "bearer.stats.failed-attempts", "attempts", MMC_S_BEARER_STATS, }, + [MMC_F_BEARER_STATS_TOTAL_DURATION] = { "bearer.stats.total-duration", "total-duration", MMC_S_BEARER_STATS, }, + [MMC_F_BEARER_STATS_TOTAL_BYTES_RX] = { "bearer.stats.total-bytes-rx", "total-bytes rx", MMC_S_BEARER_STATS, }, + [MMC_F_BEARER_STATS_TOTAL_BYTES_TX] = { "bearer.stats.total-bytes-tx", "total-bytes tx", MMC_S_BEARER_STATS, }, [MMC_F_CALL_GENERAL_DBUS_PATH] = { "call.dbus-path", "dbus path", MMC_S_CALL_GENERAL, }, [MMC_F_CALL_PROPERTIES_NUMBER] = { "call.properties.number", "number", MMC_S_CALL_PROPERTIES, }, [MMC_F_CALL_PROPERTIES_DIRECTION] = { "call.properties.direction", "direction", MMC_S_CALL_PROPERTIES, }, diff --git a/cli/mmcli-output.h b/cli/mmcli-output.h index 76ca2026..5b9cb5ef 100644 --- a/cli/mmcli-output.h +++ b/cli/mmcli-output.h @@ -245,6 +245,9 @@ typedef enum { MMC_F_BEARER_STATS_BYTES_TX, MMC_F_BEARER_STATS_ATTEMPTS, MMC_F_BEARER_STATS_FAILED_ATTEMPTS, + MMC_F_BEARER_STATS_TOTAL_DURATION, + MMC_F_BEARER_STATS_TOTAL_BYTES_RX, + MMC_F_BEARER_STATS_TOTAL_BYTES_TX, MMC_F_CALL_GENERAL_DBUS_PATH, MMC_F_CALL_PROPERTIES_NUMBER, MMC_F_CALL_PROPERTIES_DIRECTION, diff --git a/docs/reference/libmm-glib/libmm-glib-sections.txt b/docs/reference/libmm-glib/libmm-glib-sections.txt index 83dd52f8..00c3adfb 100644 --- a/docs/reference/libmm-glib/libmm-glib-sections.txt +++ b/docs/reference/libmm-glib/libmm-glib-sections.txt @@ -1130,6 +1130,9 @@ mm_bearer_stats_get_rx_bytes mm_bearer_stats_get_tx_bytes mm_bearer_stats_get_attempts mm_bearer_stats_get_failed_attempts +mm_bearer_stats_get_total_duration +mm_bearer_stats_get_total_rx_bytes +mm_bearer_stats_get_total_tx_bytes <SUBSECTION Private> mm_bearer_stats_get_dictionary mm_bearer_stats_new @@ -1139,6 +1142,9 @@ mm_bearer_stats_set_rx_bytes mm_bearer_stats_set_tx_bytes mm_bearer_stats_set_attempts mm_bearer_stats_set_failed_attempts +mm_bearer_stats_set_total_duration +mm_bearer_stats_set_total_rx_bytes +mm_bearer_stats_set_total_tx_bytes <SUBSECTION Standard> MMBearerStatsClass MMBearerStatsPrivate diff --git a/introspection/org.freedesktop.ModemManager1.Bearer.xml b/introspection/org.freedesktop.ModemManager1.Bearer.xml index b82c9d36..a07ee057 100644 --- a/introspection/org.freedesktop.ModemManager1.Bearer.xml +++ b/introspection/org.freedesktop.ModemManager1.Bearer.xml @@ -266,8 +266,8 @@ </varlistentry> <varlistentry><term><literal>"tx-bytes"</literal></term> <listitem> - Number bytes transmitted without error in the ongoing connection, - given as an unsigned 64-bit integer value (signature + Number of bytes transmitted without error in the ongoing + connection, given as an unsigned 64-bit integer value (signature <literal>"t"</literal>). </listitem> </varlistentry> @@ -290,6 +290,27 @@ <literal>"u"</literal>). </listitem> </varlistentry> + <varlistentry><term><literal>"total-rx-bytes"</literal></term> + <listitem> + Total number of bytes received without error in all the successful + connection establishments, given as an unsigned 64-bit integer + value (signature <literal>"t"</literal>). + </listitem> + </varlistentry> + <varlistentry><term><literal>"total-tx-bytes"</literal></term> + <listitem> + Total number of bytes transmitted without error in all the + successful connection establishments, given as an unsigned 64-bit + integer value (signature <literal>"t"</literal>). + </listitem> + </varlistentry> + <varlistentry><term><literal>"total-duration"</literal></term> + <listitem> + Total duration of all the successful connection establishments, in + seconds, given as an unsigned integer value (signature + <literal>"u"</literal>). + </listitem> + </varlistentry> </variablelist> --> <property name="Stats" type="a{sv}" access="read" /> diff --git a/libmm-glib/mm-bearer-stats.c b/libmm-glib/mm-bearer-stats.c index 42e63839..49bebc0b 100644 --- a/libmm-glib/mm-bearer-stats.c +++ b/libmm-glib/mm-bearer-stats.c @@ -38,6 +38,9 @@ G_DEFINE_TYPE (MMBearerStats, mm_bearer_stats, G_TYPE_OBJECT) #define PROPERTY_TX_BYTES "tx-bytes" #define PROPERTY_ATTEMPTS "attempts" #define PROPERTY_FAILED_ATTEMPTS "failed-attempts" +#define PROPERTY_TOTAL_DURATION "total-duration" +#define PROPERTY_TOTAL_RX_BYTES "total-rx-bytes" +#define PROPERTY_TOTAL_TX_BYTES "total-tx-bytes" struct _MMBearerStatsPrivate { guint duration; @@ -45,6 +48,9 @@ struct _MMBearerStatsPrivate { guint64 tx_bytes; guint attempts; guint failed_attempts; + guint total_duration; + guint64 total_rx_bytes; + guint64 total_tx_bytes; }; /*****************************************************************************/ @@ -210,6 +216,104 @@ mm_bearer_stats_set_failed_attempts (MMBearerStats *self, /*****************************************************************************/ /** + * mm_bearer_stats_get_total_duration: + * @self: a #MMBearerStats. + * + * Gets the total duration of all the connections of this bearer. + * + * Returns: a #guint. + * + * Since: 1.14 + */ +guint +mm_bearer_stats_get_total_duration (MMBearerStats *self) +{ + g_return_val_if_fail (MM_IS_BEARER_STATS (self), 0); + + return self->priv->total_duration; +} + +/** + * mm_bearer_stats_set_total_duration: (skip) + */ +void +mm_bearer_stats_set_total_duration (MMBearerStats *self, + guint total_duration) +{ + g_return_if_fail (MM_IS_BEARER_STATS (self)); + + self->priv->total_duration = total_duration; +} + +/*****************************************************************************/ + +/** + * mm_bearer_stats_get_total_rx_bytes: + * @self: a #MMBearerStats. + * + * Gets the total number of bytes received without error during all the + * connections of this bearer. + * + * Returns: a #guint64. + * + * Since: 1.14 + */ +guint64 +mm_bearer_stats_get_total_rx_bytes (MMBearerStats *self) +{ + g_return_val_if_fail (MM_IS_BEARER_STATS (self), 0); + + return self->priv->total_rx_bytes; +} + +/** + * mm_bearer_stats_set_total_rx_bytes: (skip) + */ +void +mm_bearer_stats_set_total_rx_bytes (MMBearerStats *self, + guint64 total_bytes) +{ + g_return_if_fail (MM_IS_BEARER_STATS (self)); + + self->priv->total_rx_bytes = total_bytes; +} + +/*****************************************************************************/ + +/** + * mm_bearer_stats_get_total_tx_bytes: + * @self: a #MMBearerStats. + * + * Gets the total number of bytes transmitted without error during all the + * connections of this bearer. + * + * Returns: a #guint64. + * + * Since: 1.14 + */ +guint64 +mm_bearer_stats_get_total_tx_bytes (MMBearerStats *self) +{ + g_return_val_if_fail (MM_IS_BEARER_STATS (self), 0); + + return self->priv->total_tx_bytes; +} + +/** + * mm_bearer_stats_set_total_tx_bytes: (skip) + */ +void +mm_bearer_stats_set_total_tx_bytes (MMBearerStats *self, + guint64 total_bytes) +{ + g_return_if_fail (MM_IS_BEARER_STATS (self)); + + self->priv->total_tx_bytes = total_bytes; +} + +/*****************************************************************************/ + +/** * mm_bearer_stats_get_dictionary: (skip) */ GVariant * @@ -242,6 +346,18 @@ mm_bearer_stats_get_dictionary (MMBearerStats *self) "{sv}", PROPERTY_FAILED_ATTEMPTS, g_variant_new_uint32 (self->priv->failed_attempts)); + g_variant_builder_add (&builder, + "{sv}", + PROPERTY_TOTAL_DURATION, + g_variant_new_uint32 (self->priv->total_duration)); + g_variant_builder_add (&builder, + "{sv}", + PROPERTY_TOTAL_RX_BYTES, + g_variant_new_uint64 (self->priv->total_rx_bytes)); + g_variant_builder_add (&builder, + "{sv}", + PROPERTY_TOTAL_TX_BYTES, + g_variant_new_uint64 (self->priv->total_tx_bytes)); return g_variant_builder_end (&builder); } @@ -295,7 +411,20 @@ mm_bearer_stats_new_from_dictionary (GVariant *dictionary, mm_bearer_stats_set_failed_attempts ( self, g_variant_get_uint32 (value)); + } else if (g_str_equal (key, PROPERTY_TOTAL_DURATION)) { + mm_bearer_stats_set_total_duration ( + self, + g_variant_get_uint32 (value)); + } else if (g_str_equal (key, PROPERTY_TOTAL_RX_BYTES)) { + mm_bearer_stats_set_total_rx_bytes ( + self, + g_variant_get_uint64 (value)); + } else if (g_str_equal (key, PROPERTY_TOTAL_TX_BYTES)) { + mm_bearer_stats_set_total_tx_bytes ( + self, + g_variant_get_uint64 (value)); } + g_free (key); g_variant_unref (value); } diff --git a/libmm-glib/mm-bearer-stats.h b/libmm-glib/mm-bearer-stats.h index 000bd07b..bfaba1dd 100644 --- a/libmm-glib/mm-bearer-stats.h +++ b/libmm-glib/mm-bearer-stats.h @@ -63,6 +63,9 @@ guint64 mm_bearer_stats_get_rx_bytes (MMBearerStats *self); guint64 mm_bearer_stats_get_tx_bytes (MMBearerStats *self); guint mm_bearer_stats_get_attempts (MMBearerStats *self); guint mm_bearer_stats_get_failed_attempts (MMBearerStats *self); +guint mm_bearer_stats_get_total_duration (MMBearerStats *self); +guint64 mm_bearer_stats_get_total_rx_bytes (MMBearerStats *self); +guint64 mm_bearer_stats_get_total_tx_bytes (MMBearerStats *self); /*****************************************************************************/ /* ModemManager/libmm-glib/mmcli specific methods */ @@ -80,6 +83,9 @@ void mm_bearer_stats_set_rx_bytes (MMBearerStats *self, guint64 rx_b void mm_bearer_stats_set_tx_bytes (MMBearerStats *self, guint64 tx_bytes); void mm_bearer_stats_set_attempts (MMBearerStats *self, guint attempts); void mm_bearer_stats_set_failed_attempts (MMBearerStats *self, guint failed_attempts); +void mm_bearer_stats_set_total_duration (MMBearerStats *self, guint duration); +void mm_bearer_stats_set_total_rx_bytes (MMBearerStats *self, guint64 rx_bytes); +void mm_bearer_stats_set_total_tx_bytes (MMBearerStats *self, guint64 tx_bytes); GVariant *mm_bearer_stats_get_dictionary (MMBearerStats *self); diff --git a/src/mm-base-bearer.c b/src/mm-base-bearer.c index 718956fd..dd4f1ef2 100644 --- a/src/mm-base-bearer.c +++ b/src/mm-base-bearer.c @@ -263,10 +263,64 @@ bearer_reset_ongoing_interface_stats (MMBaseBearer *self) } static void +bearer_set_ongoing_interface_stats (MMBaseBearer *self, + guint duration, + guint64 rx_bytes, + guint64 tx_bytes) +{ + guint n_updates = 0; + + /* Make sure we don't reset to 0 these values if we had ever set them + * before. Just ignore the update if we're reported 0 */ + + if (duration) { + gint delta_duration; + + delta_duration = duration - mm_bearer_stats_get_duration (self->priv->stats); + if (delta_duration > 0) { + mm_bearer_stats_set_duration (self->priv->stats, duration); + mm_bearer_stats_set_total_duration (self->priv->stats, + mm_bearer_stats_get_total_duration (self->priv->stats) + delta_duration); + n_updates++; + } + } + + if (rx_bytes) { + gint64 delta_rx_bytes; + + delta_rx_bytes = rx_bytes - mm_bearer_stats_get_rx_bytes (self->priv->stats); + if (delta_rx_bytes > 0) { + mm_bearer_stats_set_rx_bytes (self->priv->stats, rx_bytes); + mm_bearer_stats_set_total_rx_bytes (self->priv->stats, + mm_bearer_stats_get_total_rx_bytes (self->priv->stats) + delta_rx_bytes); + n_updates++; + } + } + + if (tx_bytes) { + gint64 delta_tx_bytes; + + delta_tx_bytes = tx_bytes - mm_bearer_stats_get_tx_bytes (self->priv->stats); + if (delta_tx_bytes > 0) { + mm_bearer_stats_set_tx_bytes (self->priv->stats, tx_bytes); + mm_bearer_stats_set_total_tx_bytes (self->priv->stats, + mm_bearer_stats_get_total_tx_bytes (self->priv->stats) + delta_tx_bytes); + n_updates++; + } + } + + if (n_updates) + bearer_update_interface_stats (self); +} + +static void bearer_stats_stop (MMBaseBearer *self) { if (self->priv->duration_timer) { - mm_bearer_stats_set_duration (self->priv->stats, (guint64) g_timer_elapsed (self->priv->duration_timer, NULL)); + bearer_set_ongoing_interface_stats (self, + (guint64) g_timer_elapsed (self->priv->duration_timer, NULL), + 0, + 0); g_timer_destroy (self->priv->duration_timer); self->priv->duration_timer = NULL; } @@ -303,10 +357,10 @@ reload_stats_ready (MMBaseBearer *self, } /* We only update stats if they were retrieved properly */ - mm_bearer_stats_set_duration (self->priv->stats, (guint32) g_timer_elapsed (self->priv->duration_timer, NULL)); - mm_bearer_stats_set_tx_bytes (self->priv->stats, tx_bytes); - mm_bearer_stats_set_rx_bytes (self->priv->stats, rx_bytes); - bearer_update_interface_stats (self); + bearer_set_ongoing_interface_stats (self, + (guint32) g_timer_elapsed (self->priv->duration_timer, NULL), + rx_bytes, + tx_bytes); } static gboolean @@ -328,10 +382,10 @@ stats_update_cb (MMBaseBearer *self) } /* Otherwise, just update duration and we're done */ - mm_bearer_stats_set_duration (self->priv->stats, (guint32) g_timer_elapsed (self->priv->duration_timer, NULL)); - mm_bearer_stats_set_tx_bytes (self->priv->stats, 0); - mm_bearer_stats_set_rx_bytes (self->priv->stats, 0); - bearer_update_interface_stats (self); + bearer_set_ongoing_interface_stats (self, + (guint32) g_timer_elapsed (self->priv->duration_timer, NULL), + 0, + 0); return G_SOURCE_CONTINUE; } |