首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从驱动程序代码中提取接口的MAC地址

如何从驱动程序代码中提取接口的MAC地址
EN

Stack Overflow用户
提问于 2013-03-20 12:01:36
回答 2查看 1.4K关注 0票数 1

我对Linux内核编程和驱动程序编程很陌生。我正在使用madwifi驱动程序,在内核版本2.6.32-37的Linux上,并希望在驱动程序代码中提取接口的MAC地址。我知道这个信息应该在netdevice结构字段中找到,但不太确定哪一个是正确的。

我的问题是:

  1. *开发和*真实之间的区别是什么?
  2. 我该用哪一个?(它们都在代码的不同部分中使用,我不明白何时使用前者,何时使用后者)。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-20 12:04:49

引用http://www.makelinux.net/ldd3/chp-17-sect-3

无符号字符dev_addrMAX_ADDR_LEN; 硬件(MAC)地址长度和设备硬件地址。以太网地址长度为6个八进制(我们指的是接口板的硬件ID ),广播地址由6个0xff八位数组成;ether_setup安排这些值是正确的。另一方面,设备地址必须以特定于设备的方式从接口板读取,驱动程序应该将其复制到dev_addr。硬件地址用于在将数据包转交给驱动程序进行传输之前生成正确的以太网报头。snull设备不使用物理接口,它发明了自己的硬件地址。

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2018-12-03 11:57:25

网络驱动程序中有访问/设置MAC地址的代码。

net_device_ops中甚至定义了回调

代码语言:javascript
复制
.ndo_set_mac_address = netdev_set_mac_address

根据HW寄存器体系结构,每个网络设备对其进行不同的处理。例如,对于Xilinx,MAC地址被写入网络控制器的net_device结构和特定的HW寄存器:

代码语言:javascript
复制
static void axienet_set_mac_address(struct net_device *ndev, void *address)
{
struct axienet_local *lp = netdev_priv(ndev);

if (address)
    memcpy(ndev->dev_addr, address, ETH_ALEN);
if (!is_valid_ether_addr(ndev->dev_addr))
    eth_random_addr(ndev->dev_addr);

/* Set up unicast MAC address filter set its mac address */
axienet_iow(lp, XAE_UAW0_OFFSET,
        (ndev->dev_addr[0]) |
        (ndev->dev_addr[1] << 8) |
        (ndev->dev_addr[2] << 16) |
        (ndev->dev_addr[3] << 24));
axienet_iow(lp, XAE_UAW1_OFFSET,
        (((axienet_ior(lp, XAE_UAW1_OFFSET)) &
          ~XAE_UAW1_UNICASTADDR_MASK) |
         (ndev->dev_addr[4] |
         (ndev->dev_addr[5] << 8))));
}

因此,一旦设置了MAC地址,ifconfig之类的命令就不会从访问HW寄存器的设备驱动程序中获得,而是从net_device结构中获得。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15522948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档