2012-04-12 55 views
2

我正在写大概需要本地计算机的接口,就像通过一个简单的“使用ifconfig”命令重新调校的那些信息的内核模块,我已经搜查了很多的,但找不到任何有没有一个内核模块能够返回一个简单的'ifconfig'呢?

+0

检查ifconfig的源代码并查看它的作用(或者使用strace进行检查),然后检查Linux内核源代码,了解执行这些系统调用时网络驱动程序的功能。例如ioctl SIOCGIFHWADDR,SIOCGIFADDR等。 – 2012-04-12 13:41:45

+0

例如,检查net/core/dev.c函数__dev_get_by_name()看起来很有趣。你可以使用它并从返回的结构中获取关于接口的一些信息。 – 2012-04-12 13:49:45

回答

5

你可以通过struct net_device这样或那样的方式获得所有这些信息。正如Albert Veli所说,你可以使用__dev_get_by_name()得到这个struct net_device指针。

如果您告诉我们您需要具体哪些信息,我们甚至可以将您指向正确的字段。

查找MAC地址是相当简单:

struct net_device *dev = __dev_get_by_name("eth0"); 
dev->dev_addr; // is the MAC address 
dev->stats.rx_dropped; // RX dropped packets. (stats has more statistics) 

查找IP地址是相当困难的,但不是不可能的:

struct in_device *in_dev = rcu_dereference(dev->ip_ptr); 
// in_dev has a list of IP addresses (because an interface can have multiple) 
struct in_ifaddr *ifap; 
for (ifap = in_dev->ifa_list; ifap != NULL; 
     ifap = ifa1->ifa_next) { 
    ifap->ifa_address; // is the IPv4 address 
} 

(所有这些是不编译测试,所以错别字是可能)

+0

好吧,我想获得接口的IP地址,MAC地址,状态,错误的数据包数量和丢失的数据包,并且有什么方法可以在此接口上获得链接的速度或带宽? – 2012-04-12 15:40:58

0

例如,请参阅函数net/ipv6/addrconf.c以了解如何获取地址。对于链接属性,如链接层地址,请参见core/rtnetlink.c。 ifconfig及其ioctls已经过时(在Linux上),所以最好不要认为现在是bug弥漫的程序。

相关问题