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

Linux 如何从驱动程序代码中提取接口的MAC地址,linux,linux-kernel,linux-device-driver,Linux,Linux Kernel,Linux Device Driver,我是Linux内核编程和驱动程序编程的新手。我正在使用内核版本为2.6.32-37的Linux上的madwifi驱动程序,希望在驱动程序代码中提取接口的MAC地址。我知道应该在netdevice结构字段中找到这些信息,但不太确定哪一个是正确的 我的问题是: “开发”和“真实”有什么区别 我应该使用哪一种?(它们都在代码的不同部分中使用,我不明白什么时候应该使用前者,什么时候应该使用后者) 引述自: 未签名的字符dev_addr[MAX_addr_LEN] 硬件(MAC)地址长度和设备硬件地址。以

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

我的问题是:

  • “开发”和“真实”有什么区别
  • 我应该使用哪一种?(它们都在代码的不同部分中使用,我不明白什么时候应该使用前者,什么时候应该使用后者)
  • 引述自:

    未签名的字符dev_addr[MAX_addr_LEN]

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


    希望有帮助。

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

    甚至在
    net\u device\u ops

    .ndo_set_mac_address = netdev_set_mac_address
    
    它在每个网络设备上的处理方式不同,具体取决于硬件寄存器体系结构。 例如,Xilinx AXI MAC地址写入网络控制器的结构和特定硬件寄存器中:

    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))));
    }
    
    静态无效axienet\u set\u mac\u地址(结构网络设备*ndev,无效*地址)
    {
    结构axienet_local*lp=netdev_priv(ndev);
    如果(地址)
    memcpy(ndev->开发地址、地址、电子邮件);
    如果(!是否有效\u ether\u addr(ndev->dev\u addr))
    eth_random_addr(ndev->dev_addr);
    /*设置单播MAC地址筛选器设置其MAC地址*/
    axienet_iow(lp,XAE_UAW0_偏移量,
    (ndev->开发地址[0])|
    (ndev->dev_addr[1]dev_addr[2]dev_addr[3]dev_addr[4]|
    (ndev->开发地址[5]