diff -r fa112b8a371b -r a56bd34e20a1 master/device.c --- a/master/device.c Sun Mar 07 23:12:30 2010 +0100 +++ b/master/device.c Sun Mar 07 23:55:51 2010 +0100 @@ -54,6 +54,10 @@ } while (0) #endif +static const unsigned int rate_intervals[] = { + 1, 10, 60 +}; + /*****************************************************************************/ /** Constructor. @@ -196,6 +200,13 @@ 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; for (i = 0; i < EC_TX_RING_SIZE; i++) device->tx_skb[i]->dev = NULL; } @@ -211,6 +222,7 @@ ) { int ret; + unsigned int i; if (!device->dev) { EC_ERR("No net_device to open!\n"); @@ -225,6 +237,13 @@ 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; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29) ret = device->dev->netdev_ops->ndo_open(device->dev); @@ -302,6 +321,26 @@ { struct sk_buff *skb = device->tx_skb[device->tx_ring_index]; + // frame statistics + if (unlikely(jiffies - device->stats_jiffies >= HZ)) { + unsigned int i; + unsigned int tx_rate = device->tx_count - device->last_tx_count; + 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; + device->stats_jiffies += HZ; + } + if (unlikely(!device->link_state)) // Link down return;