bearer-mbim: implement stats loading
This commit is contained in:
@@ -106,6 +106,113 @@ peek_ports (gpointer self,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/* 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 */
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user