分类: LINUX
2016-02-02 09:58:53
之前一段时间在做网卡驱动的工作,现在产品量产,利用ifconfig eth hw ether在配置mac地址时发现一个问题,
随机配置一个mac地址,发现有的会报出Cannot assign requested address。
错误码是EADDRNOTAVAIL。
driver中实现了专门的set_mac_addr函数,察看该函数,发现原来会检验该mac地址的有效性。
组播地址就是第一个字节最低位为1,问题就是在这里。
发现第一个字节最低位为1时该函数就会返回0,driver中的set_mac_addr就会返回EADDRNOTAVAIL错误码。
严格来说mac地址对于每块网卡是固定的,每块网卡被生产出来后,都会有一个全球唯一的编号来标识自己,不会重复,
这个编号就是MAC地址,也就是网卡的物理地址。MAC地址是由48位的二进制数组成,即6个字节。在通信中是用16进制表示的。
前24位是由生产厂家向IEEE标准组织申请的厂家代码,是固定的,但是第一个字节的最低位一定是0,因为网卡的物理地址,一定是单播地址,
在IPv4的环境中,区分单播和组播地址就是校检最低位的二进制数字,0代表单播地址,1代表组播地址。
也就是说第二个数字一定是0、2、4、6、8、A、C、E其中的一个。
所以mac地址虽然可以修改,但是不要乱改,要按照厂商规定来修改,以免重复。
-------------------------------------------------------------------------
我们是在写 wifi mac地址时候,比较随意, 写了比如:91:00:01:03:32:32 地址, 91 就造成了 mac地址变成了 组播地址,但是ifconfig 没有报错
而是在 brctl addif br0 wlan0的时候出错了,提升 无效网络设备
这个经验很重要