diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2021-10-22 22:51:48 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-11-03 12:43:39 +0100 |
commit | cf376204e894ceb78f9973cd276b45a1ef3c6426 (patch) | |
tree | fc6a634ec84aee47d25ffd1f9d28a7b1688f42f1 | |
parent | 21c8cadb41881da707288e6364ecb60c0f80bd14 (diff) |
base-bearer: allow reporting uplink/downlink speeds via indications
-rw-r--r-- | src/mm-base-bearer.c | 15 | ||||
-rw-r--r-- | src/mm-base-bearer.h | 4 | ||||
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 33 |
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 |