From 9b9f691af7bbcef226b2e9670d5fd5348658e018 Mon Sep 17 00:00:00 2001 From: Florian Pose <fp@igh-essen.com> Date: Mon, 8 Mar 2010 08:01:26 +0100 Subject: [PATCH] Clear frame statistics on link loss. --- TODO | 2 ++ master/device.c | 36 ++++++++++++++++++++++++------------ master/device.h | 20 +++++++++++++------- 3 files changed, 39 insertions(+), 19 deletions(-) diff --git a/TODO b/TODO index f57b246f..5aeff333 100644 --- a/TODO +++ b/TODO @@ -44,6 +44,8 @@ Version 1.5.0: * ethercat tool: - Data type abbreviations. - Implement ranges for slaves and domains. +* Output send errors in frame statistics. +* Output tx rate [bytes/s] in frame statistics. Future issues: diff --git a/master/device.c b/master/device.c index 5730a0e8..c1a2c398 100644 --- a/master/device.c +++ b/master/device.c @@ -324,19 +324,31 @@ void ec_device_send( // 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; } diff --git a/master/device.h b/master/device.h index c5c8882b..17e6bae8 100644 --- a/master/device.h +++ b/master/device.h @@ -96,13 +96,19 @@ struct ec_device struct timeval timeval_poll; #endif unsigned long jiffies_poll; /**< jiffies of last poll */ - unsigned int tx_count; /**< number of frames sent */ - unsigned int rx_count; /**< number of frames received */ - unsigned int last_tx_count; - unsigned int tx_rates[EC_RATE_COUNT]; - int last_loss; /**< Tx/Rx difference of last cycle. */ - int loss_rates[EC_RATE_COUNT]; - unsigned long stats_jiffies; + + // Frame statistics + unsigned int tx_count; /**< Number of frames sent. */ + unsigned int rx_count; /**< Number of frames received. */ + unsigned int last_tx_count; /**< Number of frames sent of last statistics + cycle. */ + unsigned int tx_rates[EC_RATE_COUNT]; /**< Transmit rates for different + statistics cycle periods. */ + int last_loss; /**< Tx/Rx difference of last statistics cycle. */ + int loss_rates[EC_RATE_COUNT]; /**< Frame loss rates for different + statistics cycle periods. */ + unsigned long stats_jiffies; /**< Jiffies of last statistic cycle. */ + #ifdef EC_DEBUG_IF ec_debug_t dbg; /**< debug device */ #endif -- GitLab