我正在制作一个模块,其中我需要网络接口的mac地址。是否有任何功能可以通过它找到mac地址而无需在用户空间中执行ioctl。
答案 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);