码迷,mamicode.com
首页 > 系统相关 > 详细

以太网MAC地址规范

时间:2018-07-31 19:22:02      阅读:266      评论:0      收藏:0      [点我收藏+]

标签:clip   16px   单播   ack   multicast   border   _for   track   turn   

原文地址:http://blog.csdn.net/skyflying2012/article/details/40322563


之前一段时间在做网卡驱动的工作,现在产品量产,利用ifconfig eth hw ether在配置mac地址时发现一个问题,

随机配置一个mac地址,发现有的会报出Cannot assign requested address。

错误码是EADDRNOTAVAIL。

driver中实现了专门的set_mac_addr函数,察看该函数,发现原来会检验该mac地址的有效性。

 

[cpp] view plain copy
 
 技术分享图片技术分享图片
  1. <span style="font-size:14px;">static inline int is_valid_ether_addr(const u8 *addr)  
  2. {  
  3.     /* FF:FF:FF:FF:FF:FF is a multicast address so we don‘t need to 
  4.      * explicitly check for it here. */  
  5.     return !is_multicast_ether_addr(addr) && !is_zero_ether_addr(addr);  
  6. }  
  7. </span>  
检查不是组播地址也不是全0地址。

 

组播地址就是第一个字节最低位为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地址虽然可以修改,但是不要乱改,要按照厂商规定来修改,以免重复。

以太网MAC地址规范

标签:clip   16px   单播   ack   multicast   border   _for   track   turn   

原文地址:https://www.cnblogs.com/ancongliang/p/9397144.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!