diff options
author | Christian Göttsche <cgzones@googlemail.com> | 2020-11-02 14:46:42 +0100 |
---|---|---|
committer | Christian Göttsche <cgzones@googlemail.com> | 2020-11-02 14:46:42 +0100 |
commit | 0c1908832b50886cd1fa4ea296aa2570625bfa15 (patch) | |
tree | b9e97e2a305317292111fa1d43405553e4cadbef /NetworkIOMeter.c | |
parent | 15652e7b8102e86b3405254405d8ee5d2a239004 (diff) |
Handle data wraparounds in IO Meters
If the current data is smaller than the previous one, either by a retrieve error
or a device removal or a original data wraparound, sanitize the value to zero.
Fixes: #299
Diffstat (limited to 'NetworkIOMeter.c')
-rw-r--r-- | NetworkIOMeter.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/NetworkIOMeter.c b/NetworkIOMeter.c index 51d8d5ca..a13e3f1c 100644 --- a/NetworkIOMeter.c +++ b/NetworkIOMeter.c @@ -46,18 +46,34 @@ static void NetworkIOMeter_updateValues(ATTR_UNUSED Meter* this, char* buffer, i return; } - 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 (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 */ + } else { + cached_rxb_diff = 0; + } cached_rxb_total = bytesReceived; - cached_rxp_diff = packetsReceived - cached_rxp_total; + if (packetsReceived > cached_rxp_total) { + cached_rxp_diff = packetsReceived - cached_rxp_total; + } else { + cached_rxp_diff = 0; + } cached_rxp_total = packetsReceived; - 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 (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 */ + } else { + cached_txb_diff = 0; + } cached_txb_total = bytesTransmitted; - cached_txp_diff = packetsTransmitted - cached_txp_total; + if (packetsTransmitted > cached_txp_total) { + cached_txp_diff = packetsTransmitted - cached_txp_total; + } else { + cached_txp_diff = 0; + } cached_txp_total = packetsTransmitted; } |