歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

linux協議棧之網橋實現(從網橋配置說起(二))


關於網橋:

網橋是一個二層設備,在深入之前可以把它當成一個二層的交換機。它在二層協議上轉發數據。

網橋為了轉發數據,維持了一個端口與MAC的對應表,通常通為CAM表。根據這張表可以把數據送往相應的端口進行發送.

網橋的轉發過程為:

1:接收到一個包。判斷自己的CAM表中是否含包它此包的源地址.如果沒有,則把源地址與端口更新至於CAM表.

2:判斷包是否是送給本機,如果是,則送往本機上層協議棧處理。如果不是,則查尋CAM表。找到相應的出口。

3:如果找到出口,則將此包送至出口。如果不存在,將會在各端口發送。

4:如果CAM表中對應表項在規定時間之內沒有得到更新,則刪除此項。

網橋的配置:

Brctl是一個比較好的配置網橋的工具。它的源代碼和配置方法極其簡單。我們將從網橋的配置流程說起,看linux內核是怎樣一步步管理的。

首先,創建一個網橋: brctl addbr br0 (建立一個br0的網橋)

然後,將接口添加進網橋:brctl addif br0 eth0 (將eth0和eth1添加進網橋br0)

brctl addif bro eth1

OK,網橋現在就配置好了。這台linux的主機可以當作交換機使用了,從eth0的包都可以轉發到eth1。

現在,我們看下代碼中如何進行處理

首先 brctl addbr 。查看brctl的代碼發現它調用了:ioctl(br_socket_fd, SIOCBRADDBR, brname);

然後 brctl addif 在brctl的代碼中調用了:ioctl(br_socket_fd, SIOCBRADDIF, &ifr);

呵呵。Brctl的代碼很簡單吧,只是調用了用戶空間的配置工具ioctl.

Linux網橋分析:

好了,現在就可以進入內核分析網橋模式了:

static int __init br_init(void) (net/brige/br.c)

{

//分配slab緩沖區

br_fdb_init();

//網橋的netfiter處理,將在以後的章節中分析

#ifdef CONFIG_BRIDGE_NETFILTER

if (br_netfilter_init())

return 1;

#endif

//用戶空間ioctl調用的函數

brioctl_set(br_ioctl_deviceless_stub);

//接收到數據包的處理,也就是我們在上面netif_receive_skb函數中看到的br_handle_frame_hook

br_handle_frame_hook = br_handle_frame;



#if defined(CONFIG_ATM_LANE) || defined(CONFIG_ATM_LANE_MODULE)

br_fdb_get_hook = br_fdb_get;

br_fdb_put_hook = br_fdb_put;

#endif

//在netdev_chain通知鏈表上注冊。關於通知鏈表,在前面已經介紹過,這裡不再討論了

register_netdevice_notifier(&br_device_notifier);



return 0;

}

Copyright © Linux教程網 All Rights Reserved