#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"
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);
}
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;
#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);