关于网络MAC地址 | DD'Notes关于网络MAC地址一个MAC地址问题经常会遇到客户反馈这样的问题:在进行以太网MAC地址设置测试(随便写的MAC地址),发现有时候MAC地址会变成随机的MAC地址。 原因: MAC地址的第一个字节的最后一位是用来区分是多播还是单播的,0为单播,1为多播,我们的电脑或是设备的网卡都是单播的,所以不能为1。一般网卡驱动都会去校验,如果校验为多播地址则认为是不符合规范的地址,就会生成一个随机MAC。
https://notes.z-dd.online/2025/02/08/%E5%85%B3%E4%BA%8E%E7%BD%91%E7%BB%9CMAC%E5%9C%B0%E5%9D%80/
关于网络MAC地址
一个MAC地址问题
经常会遇到客户反馈这样的问题:在进行以太网MAC地址设置测试(随便写的MAC地址),发现有时候MAC地址会变成随机的MAC地址。
原因: MAC地址的第一个字节的最后一位是用来区分是多播还是单播的,0为单播,1为多播,我们的电脑或是设备的网卡都是单播的,所以不能为1。
一般网卡驱动都会去校验,如果校验为多播地址则认为是不符合规范的地址,就会生成一个随机MAC。
相关代码如下(include/linux/etherdevice.h):
static inline bool is_multicast_ether_addr(const u8 *addr)
{
#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
u32 a = *(const u32 *)addr;
#else
u16 a = *(const u16 *)addr;
#endif
#ifdef __BIG_ENDIAN
return 0x01 & (a >> ((sizeof(a) * 8) - 8));
#else
return 0x01 & a;
#endif
}
/**
* is_valid_ether_addr - Determine if the given Ethernet address is valid
* @addr: Pointer to a six-byte array containing the Ethernet address
*
* Check that the Ethernet address (MAC) is not 00:00:00:00:00:00, is not
* a multicast address, and is not FF:FF:FF:FF:FF:FF.
*
* Return true if the address is valid.
*
* Please note: addr must be aligned to u16.
*/
static inline bool is_valid_ether_addr(const u8 *addr)
{
/* FF:FF:FF:FF:FF:FF is a multicast address so we don't need to
* explicitly check for it here. */
return !is_multicast_ether_addr(addr) && !is_zero_ether_addr(addr);
}
MAC地址说明
。。。 。。。
更多请关注我的公众号:

或我的博客:https://notes.z-dd.online/
2574

被折叠的 条评论
为什么被折叠?



