2012-03-31 56 views
1

我正在製作一個模塊,在該模塊中我需要網絡接口的mac地址。有沒有什麼功能,我可以找到沒有在用戶空間執行ioctl的mac地址。從內核空間查找網絡接口的mac地址

+0

arp_find()似乎工作,如果條目已經被學會,但顯然它被depricated。 – 2012-03-31 11:41:56

回答

3

您不指定您正在使用的內核版本。這是基於最新的3.something版本,但它應該是非常相似的舊版本:

假設你有struct net_device(如果你不這樣做,你可能做錯了),你可以只要看看dev_addrs字段。它包含所有設備硬件地址的列表。

include/linux/etherdevice.h中的is_etherdev_addr函數可能是一個關於如何讀取它的好例子。

+0

嗨我應該如何從dev_addrs feild ....通過我使用的方式訪問mac地址2.6.34 ... – karan421 2012-03-31 17:31:01

+1

您可以使用'dev_addr',它是一個簡單的'unsigned char *'。 – ugoren 2012-04-01 08:29:49

-1

請參閱下面的代碼:

struct ifreq tmp; 
    struct socket * sock = NULL; 
    struct net_device *dev = NULL; 
    struct net *net; 
    int retval; 
    char mac_address[6]; 

    retval = sock_create(AF_INET, SOCK_STREAM, 0, &sock); 
    net = sock_net(sock->sk); 

    dev = dev_get_by_name_rcu(net,"eth0"); 

    memcpy(&mac_address,dev->dev_addr,6); 

    sock_release(sock); 
0

可以遍歷所有netdev可用的系統,並得到他們的名字和互助:

#include <linux/netdevice.h> 

...

struct net_device *dev; 

for_each_netdev(&init_net, dev) { 
    pr_info("Interface %s with MAC %02x:%02x:%02x:%02x:%02x:%02x\n" 
      , dev->name 
      , dev->dev_addr[0] 
      , dev->dev_addr[1] 
      , dev->dev_addr[2] 
      , dev->dev_addr[3] 
      , dev->dev_addr[4] 
      , dev->dev_addr[5] 
     ); 
} 

請參閱hwaddr-rand完整示例的源代碼。