我是 Linux 内核编程和驱动程序编程的新手。我正在使用内核版本 2.6.32-37 的 Linux 上的 madwifi 驱动程序,并希望在驱动程序代码中提取接口的 MAC 地址。我知道这些信息应该在netdevice结构字段中找到,但不太确定其中哪一个是正确的。
我的问题是:
- *dev 和 *real 有什么区别?
- 我应该使用其中哪一个?(它们都在代码的不同部分使用,我不明白什么时候应该使用前者,什么时候使用后者)。
我是 Linux 内核编程和驱动程序编程的新手。我正在使用内核版本 2.6.32-37 的 Linux 上的 madwifi 驱动程序,并希望在驱动程序代码中提取接口的 MAC 地址。我知道这些信息应该在netdevice结构字段中找到,但不太确定其中哪一个是正确的。
我的问题是:
引用http://www.makelinux.net/ldd3/chp-17-sect-3:
无符号字符 dev_addr[MAX_ADDR_LEN];
硬件 (MAC) 地址长度和设备硬件地址。以太网地址长度为六个八位字节(我们指的是接口板的硬件ID),广播地址由六个0xff八位字节组成;ether_setup 安排这些值是正确的。另一方面,设备地址必须以设备特定的方式从接口板上读取,驱动程序应将其复制到 dev_addr。在将数据包移交给驱动程序进行传输之前,硬件地址用于生成正确的以太网标头。snull 设备不使用物理接口,它发明了自己的硬件地址。
希望有帮助。
网络驱动程序中有访问/设置 MAC 地址的代码。
甚至定义了一个回调net_device_ops
.ndo_set_mac_address = netdev_set_mac_address
根据硬件寄存器架构,它在每个网络设备上的处理方式不同。例如,Xilinx AXI MAC 地址被写入net_device
网络控制器的结构和特定硬件寄存器:
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这样的命令就不会从访问硬件寄存器的设备驱动程序中获取它,而是从net_device
结构中获取它。