以太網MAC地址規范


原文地址: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
 
 在CODE上查看代碼片派生到我的代碼片
  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地址雖然可以修改,但是不要亂改,要按照廠商規定來修改,以免重復。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM