簡述網橋的特點 網橋MAC位址的特點

2021-10-13 03:20:51 字數 3091 閱讀 5102

在實際工作中碰到乙個問題:裝置有兩個網口,當把這兩個網口橋接到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 又稱網間聯結器 協...