从内核空间中查找网络接口的mac地址

时间:2012-03-31 09:01:02

标签: c linux linux-kernel

我正在制作一个模块,其中我需要网络接口的mac地址。是否有任何功能可以通过它找到mac地址而无需在用户空间中执行ioctl。

3 个答案:

答案 0 :(得分:3)

您没有指定您正在使用的内核版本。这是基于最新的3.something版本,但对于旧版本应该非常相似:

假设你有struct net_device(如果你没有,你可能做错了),你可以看一下dev_addrs字段。它包含所有设备硬件地址的列表。

include / linux / etherdevice.h中的is_etherdev_addr函数可能是如何阅读它的一个很好的例子。

答案 1 :(得分:0)

您可以迭代系统上可用的所有netdev并获取其名称和MAC:

#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源代码。

答案 2 :(得分:-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);