summaryrefslogtreecommitdiffstats
path: root/NetworkIOMeter.c
diff options
context:
space:
mode:
authorNathan Scott <nathans@redhat.com>2021-03-01 11:55:15 +1100
committerNathan Scott <nathans@redhat.com>2021-03-01 11:55:15 +1100
commit2d1839289eca016893b898dc713cbf1a1df92fc1 (patch)
tree70990056703220405da20a7c97e66e3d53dff59c /NetworkIOMeter.c
parent379421d3b2a5a1cf718b555663ec873ef7ea90d8 (diff)
Fix integer sizing issues in the NetworkIO Meter
On Linux kernels the size of the values exported for network device bytes and packets has used a 64 bit integer for quite some time (2.6+ IIRC). Make the procfs value extraction use correct types and change internal types used to rate convert these counters (within the NetworkIO Meter) 64 bit integers, where appropriate.
Diffstat (limited to 'NetworkIOMeter.c')
-rw-r--r--NetworkIOMeter.c64
1 files changed, 35 insertions, 29 deletions
diff --git a/NetworkIOMeter.c b/NetworkIOMeter.c
index b78ac89a..cd1d46b0 100644
--- a/NetworkIOMeter.c
+++ b/NetworkIOMeter.c
@@ -19,10 +19,10 @@ static const int NetworkIOMeter_attributes[] = {
static bool hasData = false;
-static unsigned long int cached_rxb_diff = 0;
-static unsigned long int cached_rxp_diff = 0;
-static unsigned long int cached_txb_diff = 0;
-static unsigned long int cached_txp_diff = 0;
+static unsigned long int cached_rxb_diff;
+static unsigned long int cached_rxp_diff;
+static unsigned long int cached_txb_diff;
+static unsigned long int cached_txp_diff;
static void NetworkIOMeter_updateValues(Meter* this, char* buffer, size_t len) {
static unsigned long long int cached_last_update = 0;
@@ -34,50 +34,56 @@ static void NetworkIOMeter_updateValues(Meter* this, char* buffer, size_t len) {
/* update only every 500ms */
if (passedTimeInMs > 500) {
- static unsigned long int cached_rxb_total = 0;
- static unsigned long int cached_rxp_total = 0;
- static unsigned long int cached_txb_total = 0;
- static unsigned long int cached_txp_total = 0;
+ static unsigned long long int cached_rxb_total;
+ static unsigned long long int cached_rxp_total;
+ static unsigned long long int cached_txb_total;
+ static unsigned long long int cached_txp_total;
+ unsigned long long diff;
cached_last_update = timeInMilliSeconds;
- unsigned long int bytesReceived, packetsReceived, bytesTransmitted, packetsTransmitted;
-
- hasData = Platform_getNetworkIO(&bytesReceived, &packetsReceived, &bytesTransmitted, &packetsTransmitted);
+ NetworkIOData data;
+ hasData = Platform_getNetworkIO(&data);
if (!hasData) {
xSnprintf(buffer, len, "no data");
return;
}
- if (bytesReceived > cached_rxb_total) {
- cached_rxb_diff = (bytesReceived - cached_rxb_total) / 1024; /* Meter_humanUnit() expects unit in kilo */
- cached_rxb_diff = 1000.0 * cached_rxb_diff / passedTimeInMs; /* convert to per second */
+ if (data.bytesReceived > cached_rxb_total) {
+ diff = data.bytesReceived - cached_rxb_total;
+ diff /= ONE_K; /* Meter_humanUnit() expects unit in kilo */
+ diff = (1000 * diff) / passedTimeInMs; /* convert to per second */
+ cached_rxb_diff = (unsigned long)diff;
} else {
- cached_rxb_diff = 0;
+ cached_rxb_diff = 0UL;
}
- cached_rxb_total = bytesReceived;
+ cached_rxb_total = data.bytesReceived;
- if (packetsReceived > cached_rxp_total) {
- cached_rxp_diff = packetsReceived - cached_rxp_total;
+ if (data.packetsReceived > cached_rxp_total) {
+ diff = data.packetsReceived - cached_rxp_total;
+ cached_rxp_diff = (unsigned long)diff;
} else {
- cached_rxp_diff = 0;
+ cached_rxp_diff = 0UL;
}
- cached_rxp_total = packetsReceived;
+ cached_rxp_total = data.packetsReceived;
- if (bytesTransmitted > cached_txb_total) {
- cached_txb_diff = (bytesTransmitted - cached_txb_total) / 1024; /* Meter_humanUnit() expects unit in kilo */
- cached_txb_diff = 1000.0 * cached_txb_diff / passedTimeInMs; /* convert to per second */
+ if (data.bytesTransmitted > cached_txb_total) {
+ diff = data.bytesTransmitted - cached_txb_total;
+ diff /= ONE_K; /* Meter_humanUnit() expects unit in kilo */
+ diff = (1000 * diff) / passedTimeInMs; /* convert to per second */
+ cached_txb_diff = (unsigned long)diff;
} else {
- cached_txb_diff = 0;
+ cached_txb_diff = 0UL;
}
- cached_txb_total = bytesTransmitted;
+ cached_txb_total = data.bytesTransmitted;
- if (packetsTransmitted > cached_txp_total) {
- cached_txp_diff = packetsTransmitted - cached_txp_total;
+ if (data.packetsTransmitted > cached_txp_total) {
+ diff = data.packetsTransmitted - cached_txp_total;
+ cached_txp_diff = (unsigned long)diff;
} else {
- cached_txp_diff = 0;
+ cached_txp_diff = 0UL;
}
- cached_txp_total = packetsTransmitted;
+ cached_txp_total = data.packetsTransmitted;
}
this->values[0] = cached_rxb_diff;

© 2014-2024 Faster IT GmbH | imprint | privacy policy