net: stats: Make byte counters 64-bit
In high throughput tests it's fairly easy to overflow the current 32-bit byte counters in net statistics (it's just over 4 GB of data). Therefore, make the byte counters 64-bit to prevent overflows. Rearrange some fields to avoid padding. Signed-off-by: Robert Lubos <robert.lubos@nordicsemi.no>
This commit is contained in:
parent
b877d2c1fe
commit
86244a9c54
5 changed files with 32 additions and 32 deletions
|
@ -49,9 +49,9 @@ typedef uint32_t net_stats_t;
|
|||
*/
|
||||
struct net_stats_bytes {
|
||||
/** Number of bytes sent */
|
||||
net_stats_t sent;
|
||||
uint64_t sent;
|
||||
/** Number of bytes received */
|
||||
net_stats_t received;
|
||||
uint64_t received;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -319,6 +319,8 @@ struct net_stats_rx_time {
|
|||
struct net_stats_tc {
|
||||
/** TX statistics for each traffic class */
|
||||
struct {
|
||||
/** Number of bytes sent for this traffic class */
|
||||
uint64_t bytes;
|
||||
/** Helper for calculating average TX time statistics */
|
||||
struct net_stats_tx_time tx_time;
|
||||
#if defined(CONFIG_NET_PKT_TXTIME_STATS_DETAIL)
|
||||
|
@ -330,14 +332,14 @@ struct net_stats_tc {
|
|||
net_stats_t pkts;
|
||||
/** Number of packets dropped for this traffic class */
|
||||
net_stats_t dropped;
|
||||
/** Number of bytes sent for this traffic class */
|
||||
net_stats_t bytes;
|
||||
/** Priority of this traffic class */
|
||||
uint8_t priority;
|
||||
} sent[NET_TC_TX_STATS_COUNT];
|
||||
|
||||
/** RX statistics for each traffic class */
|
||||
struct {
|
||||
/** Number of bytes received for this traffic class */
|
||||
uint64_t bytes;
|
||||
/** Helper for calculating average RX time statistics */
|
||||
struct net_stats_rx_time rx_time;
|
||||
#if defined(CONFIG_NET_PKT_RXTIME_STATS_DETAIL)
|
||||
|
@ -349,8 +351,6 @@ struct net_stats_tc {
|
|||
net_stats_t pkts;
|
||||
/** Number of packets dropped for this traffic class */
|
||||
net_stats_t dropped;
|
||||
/** Number of bytes received for this traffic class */
|
||||
net_stats_t bytes;
|
||||
/** Priority of this traffic class */
|
||||
uint8_t priority;
|
||||
} recv[NET_TC_RX_STATS_COUNT];
|
||||
|
@ -404,15 +404,15 @@ struct net_stats_pkt_filter {
|
|||
* @brief All network statistics in one struct.
|
||||
*/
|
||||
struct net_stats {
|
||||
/** Count of malformed packets or packets we do not have handler for */
|
||||
net_stats_t processing_error;
|
||||
|
||||
/**
|
||||
* This calculates amount of data transferred through all the
|
||||
* network interfaces.
|
||||
*/
|
||||
struct net_stats_bytes bytes;
|
||||
|
||||
/** Count of malformed packets or packets we do not have handler for */
|
||||
net_stats_t processing_error;
|
||||
|
||||
/** IP layer errors */
|
||||
struct net_stats_ip_errors ip_errors;
|
||||
|
||||
|
|
|
@ -99,7 +99,7 @@ static void print_stats(struct net_if *iface, struct net_stats *data)
|
|||
#endif
|
||||
|
||||
#if defined(CONFIG_NET_STATISTICS_TCP)
|
||||
printk("TCP bytes recv %u\tsent\t%u\n",
|
||||
printk("TCP bytes recv %llu\tsent\t%llu\n",
|
||||
GET_STAT(iface, tcp.bytes.received),
|
||||
GET_STAT(iface, tcp.bytes.sent));
|
||||
printk("TCP seg recv %u\tsent\t%u\tdrop\t%u\n",
|
||||
|
@ -119,8 +119,8 @@ static void print_stats(struct net_if *iface, struct net_stats *data)
|
|||
GET_STAT(iface, tcp.connrst));
|
||||
#endif
|
||||
|
||||
printk("Bytes received %u\n", GET_STAT(iface, bytes.received));
|
||||
printk("Bytes sent %u\n", GET_STAT(iface, bytes.sent));
|
||||
printk("Bytes received %llu\n", GET_STAT(iface, bytes.received));
|
||||
printk("Bytes sent %llu\n", GET_STAT(iface, bytes.sent));
|
||||
printk("Processing err %u\n", GET_STAT(iface, processing_error));
|
||||
}
|
||||
|
||||
|
@ -141,8 +141,8 @@ static void print_eth_stats(struct net_if *iface, struct net_stats_eth *data)
|
|||
printk("Statistics for Ethernet interface %p [%d]\n", iface,
|
||||
net_if_get_by_iface(iface));
|
||||
|
||||
printk("Bytes received : %u\n", data->bytes.received);
|
||||
printk("Bytes sent : %u\n", data->bytes.sent);
|
||||
printk("Bytes received : %llu\n", data->bytes.received);
|
||||
printk("Bytes sent : %llu\n", data->bytes.sent);
|
||||
printk("Packets received : %u\n", data->pkts.rx);
|
||||
printk("Packets sent : %u\n", data->pkts.tx);
|
||||
printk("Bcast received : %u\n", data->broadcast.rx);
|
||||
|
|
|
@ -152,7 +152,7 @@ static inline void stats(struct net_if *iface)
|
|||
#endif
|
||||
|
||||
#if defined(CONFIG_NET_STATISTICS_TCP)
|
||||
NET_INFO("TCP bytes recv %u\tsent\t%u",
|
||||
NET_INFO("TCP bytes recv %llu\tsent\t%llu",
|
||||
GET_STAT(iface, tcp.bytes.received),
|
||||
GET_STAT(iface, tcp.bytes.sent));
|
||||
NET_INFO("TCP seg recv %u\tsent\t%u\tdrop\t%u",
|
||||
|
@ -172,8 +172,8 @@ static inline void stats(struct net_if *iface)
|
|||
GET_STAT(iface, tcp.connrst));
|
||||
#endif
|
||||
|
||||
NET_INFO("Bytes received %u", GET_STAT(iface, bytes.received));
|
||||
NET_INFO("Bytes sent %u", GET_STAT(iface, bytes.sent));
|
||||
NET_INFO("Bytes received %llu", GET_STAT(iface, bytes.received));
|
||||
NET_INFO("Bytes sent %llu", GET_STAT(iface, bytes.sent));
|
||||
NET_INFO("Processing err %u",
|
||||
GET_STAT(iface, processing_error));
|
||||
|
||||
|
@ -183,7 +183,7 @@ static inline void stats(struct net_if *iface)
|
|||
NET_INFO("TC Priority\tSent pkts\tbytes");
|
||||
|
||||
for (i = 0; i < NET_TC_TX_COUNT; i++) {
|
||||
NET_INFO("[%d] %s (%u)\t%u\t\t%u", i,
|
||||
NET_INFO("[%d] %s (%u)\t%u\t\t%llu", i,
|
||||
priority2str(GET_STAT(iface,
|
||||
tc.sent[i].priority)),
|
||||
GET_STAT(iface, tc.sent[i].priority),
|
||||
|
@ -197,7 +197,7 @@ static inline void stats(struct net_if *iface)
|
|||
NET_INFO("TC Priority\tRecv pkts\tbytes");
|
||||
|
||||
for (i = 0; i < NET_TC_RX_COUNT; i++) {
|
||||
NET_INFO("[%d] %s (%u)\t%u\t\t%u", i,
|
||||
NET_INFO("[%d] %s (%u)\t%u\t\t%llu", i,
|
||||
priority2str(GET_STAT(iface,
|
||||
tc.recv[i].priority)),
|
||||
GET_STAT(iface, tc.recv[i].priority),
|
||||
|
|
|
@ -1565,8 +1565,8 @@ static void print_wifi_stats(struct net_if *iface, struct net_stats_wifi *data,
|
|||
PR("Statistics for Wi-Fi interface %p [%d]\n", iface,
|
||||
net_if_get_by_iface(iface));
|
||||
|
||||
PR("Bytes received : %u\n", data->bytes.received);
|
||||
PR("Bytes sent : %u\n", data->bytes.sent);
|
||||
PR("Bytes received : %llu\n", data->bytes.received);
|
||||
PR("Bytes sent : %llu\n", data->bytes.sent);
|
||||
PR("Packets received : %u\n", data->pkts.rx);
|
||||
PR("Packets sent : %u\n", data->pkts.tx);
|
||||
PR("Receive errors : %u\n", data->errors.rx);
|
||||
|
|
|
@ -50,8 +50,8 @@ static void print_eth_stats(struct net_if *iface, struct net_stats_eth *data,
|
|||
PR("Statistics for Ethernet interface %p [%d]\n", iface,
|
||||
net_if_get_by_iface(iface));
|
||||
|
||||
PR("Bytes received : %u\n", data->bytes.received);
|
||||
PR("Bytes sent : %u\n", data->bytes.sent);
|
||||
PR("Bytes received : %llu\n", data->bytes.received);
|
||||
PR("Bytes sent : %llu\n", data->bytes.sent);
|
||||
PR("Packets received : %u\n", data->pkts.rx);
|
||||
PR("Packets sent : %u\n", data->pkts.tx);
|
||||
PR("Bcast received : %u\n", data->broadcast.rx);
|
||||
|
@ -315,13 +315,13 @@ static void print_tc_tx_stats(const struct shell *sh, struct net_if *iface)
|
|||
net_stats_t count = GET_STAT(iface,
|
||||
tc.sent[i].tx_time.count);
|
||||
if (count == 0) {
|
||||
PR("[%d] %s (%u)\t%u\t\t%u\t-\n", i,
|
||||
PR("[%d] %s (%u)\t%u\t\t%llu\t-\n", i,
|
||||
priority2str(GET_STAT(iface, tc.sent[i].priority)),
|
||||
GET_STAT(iface, tc.sent[i].priority),
|
||||
GET_STAT(iface, tc.sent[i].pkts),
|
||||
GET_STAT(iface, tc.sent[i].bytes));
|
||||
} else {
|
||||
PR("[%d] %s (%u)\t%u\t\t%u\t%u us%s\n", i,
|
||||
PR("[%d] %s (%u)\t%u\t\t%llu\t%u us%s\n", i,
|
||||
priority2str(GET_STAT(iface, tc.sent[i].priority)),
|
||||
GET_STAT(iface, tc.sent[i].priority),
|
||||
GET_STAT(iface, tc.sent[i].pkts),
|
||||
|
@ -336,7 +336,7 @@ static void print_tc_tx_stats(const struct shell *sh, struct net_if *iface)
|
|||
PR("TC Priority\tSent pkts\tbytes\n");
|
||||
|
||||
for (i = 0; i < NET_TC_TX_COUNT; i++) {
|
||||
PR("[%d] %s (%u)\t%u\t\t%u\n", i,
|
||||
PR("[%d] %s (%u)\t%u\t\t%llu\n", i,
|
||||
priority2str(GET_STAT(iface, tc.sent[i].priority)),
|
||||
GET_STAT(iface, tc.sent[i].priority),
|
||||
GET_STAT(iface, tc.sent[i].pkts),
|
||||
|
@ -374,14 +374,14 @@ static void print_tc_rx_stats(const struct shell *sh, struct net_if *iface)
|
|||
net_stats_t count = GET_STAT(iface,
|
||||
tc.recv[i].rx_time.count);
|
||||
if (count == 0) {
|
||||
PR("[%d] %s (%u)\t%u\t%u\t\t%u\t-\n", i,
|
||||
PR("[%d] %s (%u)\t%u\t%u\t\t%llu\t-\n", i,
|
||||
priority2str(GET_STAT(iface, tc.recv[i].priority)),
|
||||
GET_STAT(iface, tc.recv[i].priority),
|
||||
GET_STAT(iface, tc.recv[i].pkts),
|
||||
GET_STAT(iface, tc.recv[i].dropped),
|
||||
GET_STAT(iface, tc.recv[i].bytes));
|
||||
} else {
|
||||
PR("[%d] %s (%u)\t%u\t%u\t\t%u\t%u us%s\n", i,
|
||||
PR("[%d] %s (%u)\t%u\t%u\t\t%llu\t%u us%s\n", i,
|
||||
priority2str(GET_STAT(iface, tc.recv[i].priority)),
|
||||
GET_STAT(iface, tc.recv[i].priority),
|
||||
GET_STAT(iface, tc.recv[i].pkts),
|
||||
|
@ -397,7 +397,7 @@ static void print_tc_rx_stats(const struct shell *sh, struct net_if *iface)
|
|||
PR("TC Priority\tRecv pkts\tDrop pkts\tbytes\n");
|
||||
|
||||
for (i = 0; i < NET_TC_RX_COUNT; i++) {
|
||||
PR("[%d] %s (%u)\t%u\t%u\t\t%u\n", i,
|
||||
PR("[%d] %s (%u)\t%u\t%u\t\t%llu\n", i,
|
||||
priority2str(GET_STAT(iface, tc.recv[i].priority)),
|
||||
GET_STAT(iface, tc.recv[i].priority),
|
||||
GET_STAT(iface, tc.recv[i].pkts),
|
||||
|
@ -533,7 +533,7 @@ static void net_shell_print_statistics(struct net_if *iface, void *user_data)
|
|||
#endif
|
||||
|
||||
#if defined(CONFIG_NET_STATISTICS_TCP) && defined(CONFIG_NET_NATIVE_TCP)
|
||||
PR("TCP bytes recv %u\tsent\t%u\tresent\t%u\n",
|
||||
PR("TCP bytes recv %llu\tsent\t%llu\tresent\t%u\n",
|
||||
GET_STAT(iface, tcp.bytes.received),
|
||||
GET_STAT(iface, tcp.bytes.sent),
|
||||
GET_STAT(iface, tcp.resent));
|
||||
|
@ -575,8 +575,8 @@ static void net_shell_print_statistics(struct net_if *iface, void *user_data)
|
|||
GET_STAT(iface, pkt_filter.tx.drop));
|
||||
#endif /* CONFIG_NET_STATISTICS_DNS */
|
||||
|
||||
PR("Bytes received %u\n", GET_STAT(iface, bytes.received));
|
||||
PR("Bytes sent %u\n", GET_STAT(iface, bytes.sent));
|
||||
PR("Bytes received %llu\n", GET_STAT(iface, bytes.received));
|
||||
PR("Bytes sent %llu\n", GET_STAT(iface, bytes.sent));
|
||||
PR("Processing err %u\n", GET_STAT(iface, processing_error));
|
||||
|
||||
print_tc_tx_stats(sh, iface);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue