mirror of
https://gitlab.com/etherlab.org/ethercat.git
synced 2026-02-06 03:41:52 +08:00
Clear frame statistics on link loss.
This commit is contained in:
2
TODO
2
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:
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user