br0 과 tap 0 의 상호 영향

4573 단어 neutron
더 읽 기
전재 하 다
http://www.cnblogs.com/wlei/archive/2012/12/15/2819429.html
실제 작업 에서 문 제 를 만 났 습 니 다. 장 치 는 두 개의 네트워크 구멍 이 있 습 니 다. 이 두 개의 네트워크 다 리 를 br0 에 연결 한 후에 mac 주 소 를 설정 하면 데이터 팩 이 정상적으로 송 수신 되 지 못 하 는 것 을 발견 할 수 있 습 니 다.
아래 와 같다.
--------------------------------------------------------------------
전환 하 다http://blog.csdn.net/fanwenbo/article/details/2131193)
현상 을 먼저 말 하 다

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)
          //맥 이 제일 작은 거 찾 아.
            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 주 소 를 처리 할 때의 행동 을 쉽게 이해 할 수 있 습 니 다.
----------------------------------------------------------------------------
이러한 상황 에 대해 현재 사용 하 는 방법 은 먼저 네트워크 포트 의 mac 주 소 를 설정 한 다음 에 브리지 를 br0 으로 연결 하 는 것 이다. 그러면 mac 주 소 는 신경 쓸 필요 가 없다. 브리지 포트 의 mac 주 소 를 설정 할 때 주의해 야 한다.

좋은 웹페이지 즐겨찾기