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

时间:2013-03-20 12:01:36

标签: linux linux-kernel linux-device-driver

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

我的问题是:

  1. * dev和* real?
  2. 之间有什么区别?
  3. 我应该使用哪一个? (它们都在代码的不同部分使用,我不明白我应该何时使用前者和后者)。

2 个答案:

答案 0 :(得分:1)

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

  

unsigned char dev_addr [MAX_ADDR_LEN];

     

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

希望有所帮助。

答案 1 :(得分:0)

网络驱动程序中有代码可以访问/设置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 之类的命令就不会从访问HW寄存器的设备驱动程序中获取,而是从net_device结构中获取。