如何得到mac地址

在net driver中一般通过device_get_mac_address来从acpi或dts中拿到mac地址,如下例子所示:
static void hns_init_mac_addr(struct net_device *ndev)
{
    struct hns_nic_priv *priv = netdev_priv(ndev);

    if (!device_get_mac_address(priv->dev, ndev->dev_addr, ETH_ALEN)) {
        eth_hw_addr_random(ndev);
        dev_warn(priv->dev, "No valid mac, use random mac %pM",
             ndev->dev_addr);
    }
}

void *device_get_mac_address(struct device *dev, char *addr, int alen)
{
    char *res;

    res = device_get_mac_addr(dev, "mac-address", addr, alen);
    if (res)
        return res;

    res = device_get_mac_addr(dev, "local-mac-address", addr, alen);
    if (res)
        return res;

    return device_get_mac_addr(dev, "address", addr, alen);
}
在device_get_mac_address 中一次检查mac-address/local-mac-address/address 这三个字串。
static void *device_get_mac_addr(struct device *dev,
                 const char *name, char *addr,
                 int alen)
{
    int ret = device_property_read_u8_array(dev, name, addr, alen);

    if (ret == 0 && alen == ETH_ALEN && is_valid_ether_addr(addr))
        return addr;
    return NULL;
}
在device_get_mac_addr 最终通过device_property_read_u8_array得到mac地址,这样函数是ACPI 和 DT 都可以使用的,前面的文章有分析过,会调用is_valid_ether_addr 检查mac地址是否合法其中有两种mac地址是非法的00:00:00:00:00:00 和 FF:FF:FF:FF:FF:FF
如果device_get_mac_address 返回failed的话,则调用eth_hw_addr_random 来随机得到一组mac值
static inline void eth_hw_addr_random(struct net_device *dev)
{
    dev->addr_assign_type = NET_ADDR_RANDOM;
    eth_random_addr(dev->dev_addr);
}
eth_hw_addr_random 调用eth_random_addr 得到随机值
static inline void eth_random_addr(u8 *addr)
{
    get_random_bytes(addr, ETH_ALEN);
    addr[0] &= 0xfe;    /* clear multicast bit */
    addr[0] |= 0x02;    /* set local assignment bit (IEEE802) */
}
最终调用get_random_bytes 来得到随机数

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值