2012-04-12 53 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瀰漫的程序。

相關問題