在實際工作中碰到乙個問題:裝置有兩個網口,當把這兩個網口橋接到br0上時,之後如果設定了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中有的inte***ce的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] = ;
/* 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位址時的行為了
針對這種情況,目前採用的方法就是先去設定網口的mac位址,然後再橋接成br0,這樣mac位址就不需要操心了,網橋埠的mac位址設定時需要留意一下。
Linux網橋MAC位址的選擇
在網橋建立時 brctl addbr br test 核心為其生成乙個隨機的mac位址,並保證此位址的多播位為零 首位元組第乙個bit位 addr 0 0xfe 並且設定上首位元組的第二個bit位,表明為本地生成的mac位址 addr 0 0x02 static inline void eth hw...
網橋的工作原理
一 什麼是網橋?網橋 bridge 也稱橋接器,是連線兩個區域網的儲存 裝置,用它可以完成具有相同或相似體系結構網路系統的連線。一般情況下,被連線的網路系統都具有相同的邏輯鏈路控制規程 llc 但 訪問控制協議 mac 可以不同。網橋工作在資料鏈路層,將兩個lan連起來,根據mac位址來 幀,可以看...
簡述網橋 閘道器 網絡卡之間的聯絡和區別
1 網橋,是把兩個不同物理層,不同mac子層,不同速率的區域網連線在一起。比如說10mb s與100mb s的區域網。因為它有儲存轉化功能。2 網絡卡是電腦的乙個接收資訊 轉換資訊 暫儲資訊的乙個硬體。它是把接受到資訊遞交給上層,如 cup 的乙個介面。3 閘道器 gateway 又稱網間聯結器 協...