diff --git a/core/frontend/src/components/system-information/NetworkCard.vue b/core/frontend/src/components/system-information/NetworkCard.vue
index 288053480e..b75ba9b38e 100644
--- a/core/frontend/src/components/system-information/NetworkCard.vue
+++ b/core/frontend/src/components/system-information/NetworkCard.vue
@@ -62,9 +62,9 @@
mdi-package-down
- Received package:
+ Packets received:
- {{ network.total_packets_received }}
+ {{ network.packets_received }} / {{ network.total_packets_received }} total
@@ -74,33 +74,33 @@
mdi-package-up
- Transmitted package:
+ Packets transmitted:
- {{ network.total_packets_transmitted }}
+ {{ network.packets_transmitted }} / {{ network.total_packets_transmitted }} total
- mdi-cloud-upload
+ mdi-cloud-download
Bytes received:
- {{ formatSize(network.total_received_B) }}
+ {{ formatSize(network.received_B) }} / {{ formatSize(network.total_received_B) }} total
- mdi-cloud-download
+ mdi-cloud-upload
Bytes transmitted:
- {{ formatSize(network.total_transmitted_B) }}
+ {{ formatSize(network.transmitted_B) }} / {{ formatSize(network.total_transmitted_B) }} total
diff --git a/core/frontend/src/store/system-information.ts b/core/frontend/src/store/system-information.ts
index fd273a727e..6b0930a9ef 100644
--- a/core/frontend/src/store/system-information.ts
+++ b/core/frontend/src/store/system-information.ts
@@ -20,6 +20,7 @@ import {
CPU, Disk, Info, Memory, Network, Process, System, Temperature,
} from '@/types/system-information/system'
import back_axios, { isBackendOffline } from '@/utils/api'
+import { networkProbeRateBps } from '@/utils/networking'
export enum FetchType {
KernelType = 'kernel_buffer',
@@ -182,16 +183,12 @@ class SystemInformationStore extends VuexModule {
@Mutation
updateSystemNetwork(networks: [Network]): void {
if (this.system) {
- // derivate interface upload and download speeds from the previous values
- const now = Date.now()
- for(let network of networks) {
- const previousNetwork = this.system.network.find(n => n.name === network.name)
- const dt = (now - (previousNetwork?.last_update ?? 5)) / 1000
- network.last_update = now
- if (previousNetwork) {
- network.download_speed = (network.total_received_B - previousNetwork.total_received_B) / dt
- network.upload_speed = (network.total_transmitted_B - previousNetwork.total_transmitted_B) / dt
- }
+ // Use linux2rest/sysinfo per-sample deltas (received_B / transmitted_B), not a
+ // frontend re-diff of total_*. Those deltas are already saturating and match the
+ // Sampler window (LINUX2REST_SYSTEM_SAMPLE_INTERVAL_S).
+ for (const network of networks) {
+ network.download_speed = networkProbeRateBps(network.received_B)
+ network.upload_speed = networkProbeRateBps(network.transmitted_B)
}
this.system.network = networks
}
diff --git a/core/frontend/src/types/system-information/system.ts b/core/frontend/src/types/system-information/system.ts
index 8f3b3297d5..d0cb5c436c 100644
--- a/core/frontend/src/types/system-information/system.ts
+++ b/core/frontend/src/types/system-information/system.ts
@@ -83,15 +83,16 @@ export interface Network {
* @param name - Name of the interface, E.g: "lo", "eth0"
* @param packets_received - Number of packages received since last probe
* @param packets_transmitted - Number of packages transmitted since last probe
- * @param received_B - Number of bytes received since last probe
+ * @param received_B - Bytes received since last linux2rest/sysinfo probe
* @param total_errors_on_received - Total number of errors when receiving packages
* @param total_errors_on_transmitted - Total number of errors when transmitting packages
* @param total_packets_received - Total number of packages received
* @param total_packets_transmitted - Total number of packages transmitted
* @param total_received_B - Total number of bytes received
* @param total_transmitted_B - Total number of bytes transmitted
- * @param transmitted_B - Number of bytes received since last probe
- * @param last_update - Unix time in seconds
+ * @param transmitted_B - Bytes transmitted since last linux2rest/sysinfo probe
+ * @param upload_speed - Frontend: transmitted_B / linux2rest sample interval (B/s)
+ * @param download_speed - Frontend: received_B / linux2rest sample interval (B/s)
* */
description: string,
errors_on_received: number,
@@ -111,7 +112,6 @@ export interface Network {
total_received_B: number,
total_transmitted_B: number,
transmitted_B: number
- last_update?: number
upload_speed?: number
download_speed?: number
}
diff --git a/core/frontend/src/utils/networking.ts b/core/frontend/src/utils/networking.ts
index d5f271696e..1c6ecbf23b 100644
--- a/core/frontend/src/utils/networking.ts
+++ b/core/frontend/src/utils/networking.ts
@@ -1,3 +1,12 @@
+// Must match linux2rest Sampler interval (src/main.rs: Duration::from_secs(5)).
+// TODO: prefer a probed interval if/when linux2rest exposes it (Mbps silently drift if Sampler cadence changes).
+export const LINUX2REST_SYSTEM_SAMPLE_INTERVAL_S = 5
+
+/** Convert a linux2rest per-sample byte delta into a bytes-per-second rate. Negative deltas are clamped to zero. */
+export function networkProbeRateBps(bytesSinceLastProbe: number): number {
+ return Math.max(0, bytesSinceLastProbe) / LINUX2REST_SYSTEM_SAMPLE_INTERVAL_S
+}
+
export function formatBandwidth(bytesPerSecond: number): string {
const mbps = (8 * bytesPerSecond / 1024 / 1024)
const decimal_places = mbps < 10 ? 2 : mbps < 100 ? 1 : 0