[PATCH v2 7/7] bearer-mbim: implement stats loading

Aleksander Morgado aleksander at aleksander.es
Wed Dec 2 08:32:45 PST 2015


---
 src/mm-bearer-mbim.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 109 insertions(+)

diff --git a/src/mm-bearer-mbim.c b/src/mm-bearer-mbim.c
index 6e5b705..baf419d 100644
--- a/src/mm-bearer-mbim.c
+++ b/src/mm-bearer-mbim.c
@@ -107,6 +107,113 @@ peek_ports (gpointer self,
 }

 /*****************************************************************************/
+/* Stats */
+
+typedef struct {
+    guint64 rx_bytes;
+    guint64 tx_bytes;
+} ReloadStatsResult;
+
+typedef struct {
+    MMBearerMbim *self;
+    GSimpleAsyncResult *result;
+    ReloadStatsResult stats;
+} ReloadStatsContext;
+
+static void
+reload_stats_context_complete_and_free (ReloadStatsContext *ctx)
+{
+    g_simple_async_result_complete (ctx->result);
+    g_object_unref (ctx->result);
+    g_object_unref (ctx->self);
+    g_slice_free (ReloadStatsContext, ctx);
+}
+
+static gboolean
+reload_stats_finish (MMBaseBearer *bearer,
+                     guint64 *rx_bytes,
+                     guint64 *tx_bytes,
+                     GAsyncResult *res,
+                     GError **error)
+{
+    ReloadStatsResult *stats;
+
+    if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error))
+        return FALSE;
+
+    stats = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res));
+    if (rx_bytes)
+        *rx_bytes = stats->rx_bytes;
+    if (tx_bytes)
+        *tx_bytes = stats->tx_bytes;
+    return TRUE;
+}
+
+static void
+packet_statistics_query_ready (MbimDevice *device,
+                               GAsyncResult *res,
+                               ReloadStatsContext *ctx)
+{
+    GError      *error = NULL;
+    MbimMessage *response;
+    guint64      in_octets = 0;
+    guint64      out_octets = 0;
+
+    response = mbim_device_command_finish (device, res, &error);
+    if (response &&
+        mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error) &&
+        mbim_message_packet_statistics_response_parse (
+            response,
+            NULL, /* in_discards */
+            NULL, /* in_errors */
+            &in_octets, /* in_octets */
+            NULL, /* in_packets */
+            &out_octets, /* out_octets */
+            NULL, /* out_packets */
+            NULL, /* out_errors */
+            NULL, /* out_discards */
+            &error)) {
+        /* Store results */
+        ctx->stats.rx_bytes = in_octets;
+        ctx->stats.tx_bytes = out_octets;
+        g_simple_async_result_set_op_res_gpointer (ctx->result, &ctx->stats, NULL);
+    } else
+        g_simple_async_result_take_error (ctx->result, error);
+
+    reload_stats_context_complete_and_free (ctx);
+    mbim_message_unref (response);
+}
+
+static void
+reload_stats (MMBaseBearer *self,
+              GAsyncReadyCallback callback,
+              gpointer user_data)
+{
+    MbimDevice *device;
+    ReloadStatsContext *ctx;
+    MbimMessage *message;
+
+    if (!peek_ports (self, &device, NULL, callback, user_data))
+        return;
+
+    ctx = g_slice_new0 (ReloadStatsContext);
+    ctx->self = g_object_ref (self);
+    ctx->result = g_simple_async_result_new (G_OBJECT (self),
+                                             callback,
+                                             user_data,
+                                             reload_stats);
+
+    message = (mbim_message_packet_statistics_query_new (NULL));
+    mbim_device_command (device,
+                         message,
+                         5,
+                         NULL,
+                         (GAsyncReadyCallback)packet_statistics_query_ready,
+                         ctx);
+    mbim_message_unref (message);
+}
+
+/*****************************************************************************/
 /* Connect */

 typedef enum {
@@ -1244,6 +1351,8 @@ mm_bearer_mbim_class_init (MMBearerMbimClass *klass)
     base_bearer_class->disconnect = disconnect;
     base_bearer_class->disconnect_finish = disconnect_finish;
     base_bearer_class->report_connection_status = report_connection_status;
+    base_bearer_class->reload_stats = reload_stats;
+    base_bearer_class->reload_stats_finish = reload_stats_finish;

     properties[PROP_SESSION_ID] =
         g_param_spec_uint (MM_BEARER_MBIM_SESSION_ID,
--
2.6.2


More information about the ModemManager-devel mailing list