浅析linux网桥设置MAC地址时的行关

浅析linux网桥设置MAC地址时的行关键词为: linux    网桥    MAC                                          

先说现象
brctl addbr br0
ifconfig br0
br0 MAC is 00:00:00:00:00:00

brctl addif br0 eth1  (eth1 is xx:xx:xx:xx:xx:33)
ifconfig br0
br0 MAC is xx:xx:xx:xx:xx:33  same as eth1, auto change

brctl addif br0 eth2  (eth2 is xx:xx:xx:xx:xx:30)
ifconfig br0
br0 MAC is xx:xx:xx:xx:xx:30  same as eth2, For eth2 less than eth1, auto change

ifconfig eth2 hw ether xx:xx:xx:xx:xx:50
ifconfig br0
br0 MAC is xx:xx:xx:xx:xx:33  same as eth1, auto change

ifconfig br0 hw ether xx:xx:xx:xx:xx:99
ifconfig br0
br0 MAC is xx:xx:xx:xx:xx:33  same as eth1, NOT change


ifconfig br0 hw ether xx:xx:xx:xx:xx:33  ;same as eth1
ifconfig eth2 hw ether xx:xx:xx:xx:xx:20  ;less than eth1
ifconfig br0
br0 MAC is xx:xx:xx:xx:xx:33  same as eth1, `ifconfig br0 hw` NOT effective

ifconfig eth1 hw ether xx:xx:xx:xx:xx:50  ;upper op,we set br0 = eth1's MAC,now we change eth1 MAC
ifconfig br0
br0 MAC is xx:xx:xx:xx:xx:20  same as eth2, auto change

结论:
  br0如果没有指定hw MAC, br0的MAC地址会根据bridge中port的变化,自动选择port中最小的一个MAC地址作为br0的MAC地址。
  br0只能指定port中有的interface的MAC作为br0的MAC地址。
 
源代码分析:
  source code dir is: linux-2.4.x/net/bridge
 
  - br_device.c
      br_dev_setup() 注册了一些函数,其中  dev->set_mac_address = br_set_mac_address;  //这个就是ifconfig br0 hw ether调用的函数了
     
      static int  br_set_mac_address(struct net_device *dev, void *addr)
          {
            struct net_bridge *br = dev->priv;
            struct sockaddr *sa = (struct sockaddr *) addr;
           
          。。。。。 
          //here ! copy MAC addr to br->preferred_id.addr
            memcpy(br->preferred_id.addr, sa->sa_data, ETH_ALEN);
         
            br_stp_recalculate_bridge_id(br);
         
          。。。。。
          }

 
  - br_stp_if.c
      static unsigned char br_mac_zero[6] = {0,0,0,0,0,0};
     
      /* called under bridge lock */
      void br_stp_recalculate_bridge_id(struct net_bridge *br)
      {
        unsigned char *addr;
        struct net_bridge_port *p;
     
        //初始br0的MAC为00:00:00:00:00:00
        addr = br_mac_zero;
     
        p = br->port_list;
        while (p != NULL) {
          /* match against preferred address first */
          if (memcmp(p->dev->dev_addr, br->preferred_id.addr, ETH_ALEN) == 0) {
            addr = p->dev->dev_addr;
            //匹配port的MAC地址与首选MAC是否相符
            break;
          }
         
          if (addr == br_mac_zero ||
              memcmp(p->dev->dev_addr, addr, ETH_ALEN) < 0)
          //寻找MAC最小的那一个
            addr = p->dev->dev_addr;
     
          p = p->next;
        }
     
        //如果没有Port的话,就为0;
        //如果没有设置首选MAC,就等于最小的那一个。
        //如果设置了首选MAC,则首选MAC必须同其中一个port的MAC匹配,才等于首选MAC
        if (memcmp(br->bridge_id.addr, addr, ETH_ALEN))
          br_stp_change_bridge_id(br, addr);
      }
 
  - 什么时候会执行br_stp_recalculate_bridge_id呢
      - in br_device.c 中 br_set_mac_address()
      - in br_if.c 中 br_del_if() & br_add_if()
      - in br_notify.c 中 br_devic_event()的 NETDEV_CHANGEADDR 事件,该事件是任意port有修改addr就会触发的
     
     
看过代码就很容易理解bridge在处理自身MAC地址时的行为了


————————————————
版权声明:本文为CSDN博主「潜行狙击」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fanwenbo/article/details/2131193

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Technitium MAC Address Changer允许您立即更改(恶搞)网络接口卡(NIC)的媒体访问控制(MAC)地址。它有一个非常简单的用户界面,并提供有关机器中每个网卡的充足信息。每个NIC都有制造商在其电路中硬编码的MAC地址。这个硬编码的MAC地址被Windows驱动程序用来访问以太网(LAN)。这个工具可以设置一个新的MAC地址到你的网卡,绕过原来的硬编码的MAC地址。Technitium MAC Address Changer是每个安全专家工具箱中必备的工具。 特征 适用于Windows 10,8和7,适用于32位和64位。 增强的支持IPv6的网络配置预设允许您在网络配置之间快速切换。 允许完整配置任何网络适配器。 具有完整软件功能的命令行选项。您可以从指定的预设文件中选择一个预设直接应用。 更新网卡供应商列表功能允许您从IEEE.org下载最新的供应商数据(OUI)。 它是如何工作的? 这个软件只是写入一个值到Windows注册表中。当启用网络适配器设备,Windows在键HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Class \ {4D36E972-E325-11CE-BFC1- 08002bE10318} \ [NIC的ID,例如0001]中搜索注册表值“NetworkAddress”。如果存在一个值,windows将使用它作为MAC地址,如果没有,windows将使用硬编码的制造商提供的MAC地址。某些网络适配器驱动程序内置此设备。它可以在Windows设备管理器的网络适配器的设备属性中的高级设置选项卡中找到。 如何更改MAC地址 启动MAC地址转换器将列出所有可用的网络适配器。 选择您要更改MAC地址的适配器。你会在下面得到你的选择的细节。 在“信息”选项卡中,找到“更改MAC地址”框。在该字段中输入新的MAC地址,然后点击Change Now!按钮。您甚至可以点击随机MAC地址按钮,从可用的供应商列表中填入随机选择的MAC地址。 要恢复网络适配器的原始MAC地址,请选择该适配器,然后在更改MAC地址框中单击恢复原始按钮。 注意:此工具不能更改Microsoft网桥MAC地址。Network Bridge将自动使用第一个添加到网桥的NIC的原始MAC地址MAC地址的第一个字节设置为0x02。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值