zoukankan      html  css  js  c++  java
  • MAC地址格式小结

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

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

    错误码是EADDRNOTAVAIL。

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

    <span style="font-size:14px;">static inline int 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);
    }
    </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地址尽管能够改动,可是不要乱改,要依照厂商规定来改动,以免反复。



  • 相关阅读:
    2016年中国大学生程序设计竞赛(杭州)解题报告
    HNOI2017滚粗记
    BZOJ4515 SDOI2016 游戏
    BZOJ2157 旅行 模拟
    codevs2019 Uva10029 递变阶梯
    POJ 2585 Window Pains 题解
    linux 下 打包 和解压缩
    php 分页
    js 四舍五入
    angularjs 过滤多组数据
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5120170.html
Copyright © 2011-2022 走看看