network: extract link_get_bit_rates() into networkd-speed-meter.c

Move the bit-rate computation out of property_get_bit_rates() in
networkd-link-bus.c into a standalone link_get_bit_rates() helper in
networkd-speed-meter.c, which already owns the speed meter state.

Co-developed-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
noxiouz
2026-03-18 22:55:52 +00:00
parent ba1caf070f
commit f9ebd7bb06
3 changed files with 35 additions and 21 deletions
+2 -21
View File
@@ -17,6 +17,7 @@
#include "networkd-link.h"
#include "networkd-link-bus.h"
#include "networkd-manager.h"
#include "networkd-speed-meter.h"
#include "networkd-state-file.h"
#include "ordered-set.h"
#include "parse-util.h"
@@ -42,32 +43,12 @@ static int property_get_bit_rates(
sd_bus_error *error) {
Link *link = ASSERT_PTR(userdata);
Manager *manager;
double interval_sec;
uint64_t tx, rx;
assert(bus);
assert(reply);
manager = link->manager;
if (!manager->use_speed_meter ||
manager->speed_meter_usec_old == 0 ||
!link->stats_updated)
return sd_bus_message_append(reply, "(tt)", UINT64_MAX, UINT64_MAX);
assert(manager->speed_meter_usec_new > manager->speed_meter_usec_old);
interval_sec = (double) (manager->speed_meter_usec_new - manager->speed_meter_usec_old) / USEC_PER_SEC;
if (link->stats_new.tx_bytes > link->stats_old.tx_bytes)
tx = (uint64_t) ((link->stats_new.tx_bytes - link->stats_old.tx_bytes) / interval_sec);
else
tx = (uint64_t) ((UINT64_MAX - (link->stats_old.tx_bytes - link->stats_new.tx_bytes)) / interval_sec);
if (link->stats_new.rx_bytes > link->stats_old.rx_bytes)
rx = (uint64_t) ((link->stats_new.rx_bytes - link->stats_old.rx_bytes) / interval_sec);
else
rx = (uint64_t) ((UINT64_MAX - (link->stats_old.rx_bytes - link->stats_new.rx_bytes)) / interval_sec);
link_get_bit_rates(link, &tx, &rx);
return sd_bus_message_append(reply, "(tt)", tx, rx);
}
+32
View File
@@ -86,6 +86,38 @@ static int speed_meter_handler(sd_event_source *s, uint64_t usec, void *userdata
return 0;
}
void link_get_bit_rates(Link *link, uint64_t *ret_tx, uint64_t *ret_rx) {
Manager *manager;
double interval_sec;
assert(link);
assert(ret_tx);
assert(ret_rx);
manager = link->manager;
if (!manager->use_speed_meter ||
manager->speed_meter_usec_old == 0 ||
!link->stats_updated) {
*ret_tx = UINT64_MAX;
*ret_rx = UINT64_MAX;
return;
}
assert(manager->speed_meter_usec_new > manager->speed_meter_usec_old);
interval_sec = (double) (manager->speed_meter_usec_new - manager->speed_meter_usec_old) / USEC_PER_SEC;
if (link->stats_new.tx_bytes > link->stats_old.tx_bytes)
*ret_tx = (uint64_t) ((link->stats_new.tx_bytes - link->stats_old.tx_bytes) / interval_sec);
else
*ret_tx = (uint64_t) ((UINT64_MAX - (link->stats_old.tx_bytes - link->stats_new.tx_bytes)) / interval_sec);
if (link->stats_new.rx_bytes > link->stats_old.rx_bytes)
*ret_rx = (uint64_t) ((link->stats_new.rx_bytes - link->stats_old.rx_bytes) / interval_sec);
else
*ret_rx = (uint64_t) ((UINT64_MAX - (link->stats_old.rx_bytes - link->stats_new.rx_bytes)) / interval_sec);
}
int manager_start_speed_meter(Manager *manager) {
_cleanup_(sd_event_source_unrefp) sd_event_source *s = NULL;
int r;
+1
View File
@@ -9,4 +9,5 @@
#define SPEED_METER_DEFAULT_TIME_INTERVAL (10 * USEC_PER_SEC)
#define SPEED_METER_MINIMUM_TIME_INTERVAL (100 * USEC_PER_MSEC)
void link_get_bit_rates(Link *link, uint64_t *ret_tx, uint64_t *ret_rx);
int manager_start_speed_meter(Manager *m);