因此,我正在编写一个需要有关本地网络接口的统计信息的内核模块,并且我想出了以下代码...一切正常,除了我尝试读取无线设备统计信息的部分...显然该wireless_handler
结构不是填充是因为CONFIG_WIRELESS_EXT
未设置...我的问题?从哪里ifconfig
获得其无线统计数据?
struct net_device *dev;
struct net_device_stats *stats;
struct iw_statistics *wi_stats;
dev = first_net_device(&init_net);
while (dev)
{
if (strncmp(dev->name , "wlan",4)==0 && (dev->flags & IFF_UP) == 1)
{
#ifndef CONFIG_WIRELESS_EXT
wi_stats = dev -> wireless_handlers -> get_wireless_stats(dev);
#endif
}
else if (strncmp(dev->name , "eth",3)==0 || strncmp(dev->name , "lo",2)==0)
{
stats = dev->netdev_ops->ndo_get_stats(dev);
printk(KERN_INFO "recive packets: [%li]\ntransmitted packets: [%li]\nrecive errors: [%li]\ntransmission errors: [%li]\nnumber of collisions: [%li]",
stats->rx_packets , stats->tx_packets ,stats->rx_errors , stats->tx_errors, stats->collisions);
}
dev = next_net_device(dev);
}//end while
答案1
使用strace
,您可以看到iwconfig
执行如下操作:
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 3
ioctl(3, SIOCGIWNAME, 0xbfb02c7c) = 0
ioctl(3, SIOCGIWNWID, 0xbfb02c7c) = -1 EOPNOTSUPP (Operation not supported)
ioctl(3, SIOCGIWFREQ, 0xbfb02c7c) = -1 EINVAL (Invalid argument)
ioctl(3, SIOCGIWENCODE, 0xbfb02c7c) = 0
十几个左右的其他人也ioctl
紧随其后。ioctl
在内核中追踪这些s,您就会找到数据的位置。
答案2
预处理器的条件为 IF NOT DEFINED CONFIG_WIRELESS_EXT
这意味着您的代码仅在不支持无线卡时才包含在内......这不是倒退吗?
#ifndef CONFIG_WIRELESS_EXT
这不应该是:
#ifdef CONFIG_WIRELESS_EXT