關於網橋:
網橋是一個二層設備,在深入之前可以把它當成一個二層的交換機。它在二層協議上轉發數據。
網橋為了轉發數據,維持了一個端口與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;
}