关于网络MAC地址

关于网络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/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值