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 주 소 를 설정 할 때 주의해 야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
6. OpenStack 설치 Neutron-3Compute 노드에서 # nano/etc/sysctl.conf # sysctl -p #apt-get install neutron-common neutron-plugin-ml2 neutron-plugin-openvs...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.