linux内核中结构net_device的dev_addr和perm_addr有什么区别

What's the difference between dev_addr and perm_addr of the struct net_device in linux kernel

我正在阅读 Linux(版本 3.10)以太网驱动程序的源代码。内核网络中有一个重要的结构net_device

在“struct net_device”里面,有两个变量命名为dev_addrperm_addr表示网卡的mac地址。但是,一些供应商驱动程序同时设置了 dev_addrperm_addr 而有些则设置了 dev_addr 仅。

虽然在头文件中,注释为:

unsigned char       perm_addr[MAX_ADDR_LEN]; /* permanent hw address */
/* Interface address info used in eth_type_trans() */
unsigned char       *dev_addr;  /* hw address, (before bcast
                       because most packets are
                       unicast) */

我仍然无法区分它们。

感谢 skrrgwasme,我也在内核文件 net/core/dev.c reigster_netdev() 函数中发现 :

 /* If the device has permanent device address, driver should
 * set dev_addr and also addr_assign_type should be set to
 * NET_ADDR_PERM (default value).
 */
if (dev->addr_assign_type == NET_ADDR_PERM)
    memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);

所以这个变量在网卡驱动中很少用到

如果设备分配有永久 MAC 地址,则会填充 perm_addr 字段。这通常来自物理设备上的某些 EEPROM 或其他只读存储器。

dev_addr字段是当前分配的MAC地址,可以通过软件更改。