summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2021-10-22 22:51:48 +0200
committerAleksander Morgado <aleksander@aleksander.es>2021-11-03 12:43:39 +0100
commitcf376204e894ceb78f9973cd276b45a1ef3c6426 (patch)
treefc6a634ec84aee47d25ffd1f9d28a7b1688f42f1
parent21c8cadb41881da707288e6364ecb60c0f80bd14 (diff)
base-bearer: allow reporting uplink/downlink speeds via indications
-rw-r--r--src/mm-base-bearer.c15
-rw-r--r--src/mm-base-bearer.h4
-rw-r--r--src/mm-broadband-modem-mbim.c33
3 files changed, 52 insertions, 0 deletions
diff --git a/src/mm-base-bearer.c b/src/mm-base-bearer.c
index 7c0e2f1e..e5990b96 100644
--- a/src/mm-base-bearer.c
+++ b/src/mm-base-bearer.c
@@ -473,6 +473,21 @@ bearer_stats_start (MMBaseBearer *self,
/*****************************************************************************/
+void
+mm_base_bearer_report_speeds (MMBaseBearer *self,
+ guint64 uplink_speed,
+ guint64 downlink_speed)
+{
+ /* Ignore speeds update if we're not connected */
+ if (self->priv->status != MM_BEARER_STATUS_CONNECTED)
+ return;
+ mm_bearer_stats_set_uplink_speed (self->priv->stats, uplink_speed);
+ mm_bearer_stats_set_downlink_speed (self->priv->stats, downlink_speed);
+ bearer_update_interface_stats (self);
+}
+
+/*****************************************************************************/
+
static void
bearer_reset_interface_status (MMBaseBearer *self)
{
diff --git a/src/mm-base-bearer.h b/src/mm-base-bearer.h
index 60e8d1ed..7432c04a 100644
--- a/src/mm-base-bearer.h
+++ b/src/mm-base-bearer.h
@@ -221,6 +221,10 @@ void mm_base_bearer_report_connection_status_detailed (MMBaseBearer
/* When unknown, just pass NULL */
#define mm_base_bearer_report_connection_status(self, status) mm_base_bearer_report_connection_status_detailed (self, status, NULL)
+void mm_base_bearer_report_speeds (MMBaseBearer *self,
+ guint64 uplink_speed,
+ guint64 downlink_speed);
+
#if defined WITH_SYSTEMD_SUSPEND_RESUME
/* Sync Broadband Bearer (async) */
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index 243599ee..f7ed6cdd 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -3863,6 +3863,24 @@ basic_connect_notification_subscriber_ready_status (MMBroadbandModemMbim *self,
g_strfreev (telephone_numbers);
}
+typedef struct {
+ MMBroadbandModemMbim *self;
+ guint64 uplink_speed;
+ guint64 downlink_speed;
+} ReportSpeedsContext;
+
+static void
+bearer_list_report_speeds (MMBaseBearer *bearer,
+ gpointer user_data)
+{
+ ReportSpeedsContext *ctx = user_data;
+
+ if (MM_IS_BEARER_MBIM (bearer)) {
+ mm_obj_dbg (ctx->self, "bearer '%s' speeds updated", mm_base_bearer_get_path (bearer));
+ mm_base_bearer_report_speeds (bearer, ctx->uplink_speed, ctx->downlink_speed);
+ }
+}
+
static void
basic_connect_notification_packet_service (MMBroadbandModemMbim *self,
MbimDevice *device,
@@ -3878,6 +3896,7 @@ basic_connect_notification_packet_service (MMBroadbandModemMbim *self,
g_autofree gchar *frequency_range_str = NULL;
const gchar *nw_error_str;
g_autoptr(GError) error = NULL;
+ g_autoptr(MMBearerList) bearer_list = NULL;
if (mbim_device_check_ms_mbimex_version (device, 2, 0)) {
if (!mbim_message_ms_basic_connect_v2_packet_service_notification_parse (
@@ -3938,6 +3957,20 @@ basic_connect_notification_packet_service (MMBroadbandModemMbim *self,
NULL,
NULL);
}
+
+ g_object_get (self,
+ MM_IFACE_MODEM_BEARER_LIST, &bearer_list,
+ NULL);
+ if (bearer_list) {
+ ReportSpeedsContext ctx = {
+ .uplink_speed = uplink_speed,
+ .downlink_speed = downlink_speed,
+ };
+
+ mm_bearer_list_foreach (bearer_list,
+ (MMBearerListForeachFunc)bearer_list_report_speeds,
+ &ctx);
+ }
}
static void