环境:
Freescale i.MX6 CPU
内核版本4.1.15
1、busybox show流程伪代码
struct ifreq ifr;
struct rtnl_link_stats64 stats;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, ifname, IFNAMSIZ - 1);
// 获取接口统计信息
if (ioctl(sk, SIOCGIFSTATS, &ifr) < 0)
goto error;
// 获取接口硬件地址
if (ioctl(sk, SIOCGIFHWADDR, &ifr) < 0)
goto error;
// 获取接口状态
if (ioctl(sk, SIOCGIFFLAGS, &ifr) < 0)
goto error;
// 获取接口 IP 地址和掩码
if (ioctl(sk, SIOCGIFADDR, &ifr) < 0)
goto error;
// 获取接口广播地址
if (ioctl(sk, SIOCGIFBRDADDR, &ifr) < 0)
goto error;
// 获取接口 MTU 值
if (ioctl(sk, SIOCGIFMTU, &ifr) < 0)
goto error;
// 打印接口统计信息
if (ioctl(sk, SIOCQSTATS, &ifr) < 0)
goto error;
sock_set_flag(sk, SOCK_DBG_TRUNC_MSG, 0);
if (ioctl(sk, SIOCGLINKSTATS, &ifr) < 0)
goto error;
memcpy(&stats, LL_STATS_INFO(&ifr), sizeof(stats));
printf("RX bytes:%llu errors:%d dropped:%d overrun:%d frame:%d\n",
stats.rx_bytes, stats.rx_errors, stats.rx_dropped,
stats.rx_over_errors, stats.rx_frame_errors);
printf("TX bytes:%llu errors:%d dropped:%d carrier:%d\n",
stats.tx_bytes, stats.tx_errors, stats.tx_dropped,
stats.tx_carrier_errors);
2、ifconfig get stat流程
通过busybox调用ifconfig。显示出当前device包个数统计。
3、dev_seq_printf_stats函数源码(注意,stat并不是在这里输出的,这里只是将stat按照对应格式输出到了seq文件中)
static void dev_seq_printf_stats(struct seq_file *seq, struct net_device *dev)
{
struct rtnl_link_stats64 temp;
const struct rtnl_link_stats64 *stats = dev_get_stats(dev, &temp);
seq_printf(seq, "%6s: %7llu %7llu %4llu %4llu %4llu %5llu %10llu %9llu "
"%8llu %7llu %4llu %4llu %4llu %5llu %7llu %10llu\n",
dev->name, stats->rx_bytes, stats->rx_packets,
stats->rx_errors,
stats->rx_dropped + stats->rx_missed_errors,
stats->rx_fifo_errors,
stats->rx_length_errors + stats->rx_over_errors +
stats->rx_crc_errors + stats->rx_frame_errors,
stats->rx_compressed, stats->multicast,
stats->tx_bytes, stats->tx_packets,
stats->tx_errors, stats->tx_dropped,
stats->tx_fifo_errors, stats->collisions,
stats->tx_carrier_errors +
stats->tx_aborted_errors +
stats->tx_window_errors +
stats->tx_heartbeat_errors,
stats->tx_compressed);
}