master/device.c
changeset 1857 ed8b490b5bc3
parent 1856 10175d5f35ea
child 1863 8ea4a79dfe84
--- a/master/device.c	Tue Mar 09 09:59:32 2010 +0100
+++ b/master/device.c	Tue Mar 09 10:22:32 2010 +0100
@@ -198,15 +198,9 @@
     device->module = NULL;
     device->open = 0;
     device->link_state = 0; // down
-    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->stats_jiffies = 0;
+
+    ec_device_clear_stats(device);
+
     for (i = 0; i < EC_TX_RING_SIZE; i++)
         device->tx_skb[i]->dev = NULL;
 }
@@ -222,7 +216,6 @@
         )
 {
     int ret;
-    unsigned int i;
 
     if (!device->dev) {
         EC_ERR("No net_device to open!\n");
@@ -235,15 +228,8 @@
     }
 
     device->link_state = 0;
-    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->stats_jiffies = 0;
+
+    ec_device_clear_stats(device);
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
     ret = device->dev->netdev_ops->ndo_open(device->dev);
@@ -324,18 +310,23 @@
     // frame statistics
     if (unlikely(jiffies - device->stats_jiffies >= HZ)) {
         unsigned int i;
-        unsigned int tx_rate =
+        unsigned int tx_frame_rate =
             (device->tx_count - device->last_tx_count) * 1000;
+        unsigned int tx_byte_rate =
+            (device->tx_bytes - device->last_tx_bytes) * 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->tx_frame_rates[i] =
+                (device->tx_frame_rates[i] * (n - 1) + tx_frame_rate) / n;
+            device->tx_byte_rates[i] =
+                (device->tx_byte_rates[i] * (n - 1) + tx_byte_rate) / n;
             device->loss_rates[i] =
                 (device->loss_rates[i] * (n - 1) + loss_rate) / n;
         }
         device->last_tx_count = device->tx_count;
+        device->last_tx_bytes = device->tx_bytes;
         device->last_loss = loss;
         device->stats_jiffies = jiffies;
     }
@@ -357,6 +348,7 @@
 #endif
     {
         device->tx_count++;
+        device->tx_bytes += ETH_HLEN + size;
 #ifdef EC_DEBUG_IF
         ec_debug_send(&device->dbg, skb->data, ETH_HLEN + size);
 #endif
@@ -364,6 +356,8 @@
         ec_device_debug_ring_append(
                 device, TX, skb->data + ETH_HLEN, size);
 #endif
+    } else {
+        device->tx_errors++;
     }
 }
 
@@ -380,10 +374,14 @@
     // zero frame statistics
     device->tx_count = 0;
     device->rx_count = 0;
+    device->tx_errors = 0;
+    device->tx_bytes = 0;
     device->last_tx_count = 0;
+    device->last_tx_bytes = 0;
     device->last_loss = 0;
     for (i = 0; i < EC_RATE_COUNT; i++) {
-        device->tx_rates[i] = 0;
+        device->tx_frame_rates[i] = 0;
+        device->tx_byte_rates[i] = 0;
         device->loss_rates[i] = 0;
     }
 }