master/device.c
changeset 1854 b61bece1ec1c
parent 1852 1ec9f781f3ef
child 1856 10175d5f35ea
--- a/master/device.c	Mon Mar 08 07:46:36 2010 +0100
+++ b/master/device.c	Mon Mar 08 08:01:26 2010 +0100
@@ -324,19 +324,31 @@
     // frame statistics
     if (unlikely(jiffies - device->stats_jiffies >= HZ)) {
         unsigned int i;
-        unsigned int tx_rate =
-            (device->tx_count - device->last_tx_count) * 1000;
-        int loss = device->tx_count - device->rx_count;
-        int loss_rate = (loss - device->last_loss) * 1000;
-        for (i = 0; i < EC_RATE_COUNT; i++) {
-            unsigned int n = rate_intervals[i];
-            device->tx_rates[i] =
-                (device->tx_rates[i] * (n - 1) + tx_rate) / n;
-            device->loss_rates[i] =
-                (device->loss_rates[i] * (n - 1) + loss_rate) / n;
+        if (device->link_state) {
+            unsigned int tx_rate =
+                (device->tx_count - device->last_tx_count) * 1000;
+            int loss = device->tx_count - device->rx_count;
+            int loss_rate = (loss - device->last_loss) * 1000;
+            for (i = 0; i < EC_RATE_COUNT; i++) {
+                unsigned int n = rate_intervals[i];
+                device->tx_rates[i] =
+                    (device->tx_rates[i] * (n - 1) + tx_rate) / n;
+                device->loss_rates[i] =
+                    (device->loss_rates[i] * (n - 1) + loss_rate) / n;
+            }
+            device->last_tx_count = device->tx_count;
+            device->last_loss = loss;
+        } else {
+            // zero frame statistics
+            device->tx_count = 0;
+            device->rx_count = 0;
+            device->last_tx_count = 0;
+            device->last_loss = 0;
+            for (i = 0; i < EC_RATE_COUNT; i++) {
+                device->tx_rates[i] = 0;
+                device->loss_rates[i] = 0;
+            }
         }
-        device->last_tx_count = device->tx_count;
-        device->last_loss = loss;
         device->stats_jiffies = jiffies;
     }