資源描述:
《Linux內(nèi)核分析-網(wǎng)絡[五]:網(wǎng)橋.doc》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、看完了路由表,重新回到netif_receive_skb()函數(shù),在提交給上層協(xié)議處理前,會執(zhí)行下面一句,這就是網(wǎng)橋的相關(guān)操作,也是這篇要講解的容。viewplaincopytoclipboardprint?1.skb?=?handle_bridge(skb,?&pt_prev,?&ret,?orig_dev);??skb=handle_bridge(skb,&pt_prev,&ret,orig_dev);???????網(wǎng)橋可以簡單理解為交換機,以下圖為例,一臺linux機器可以看作網(wǎng)橋和路由的結(jié)合,網(wǎng)橋?qū)⑽锢砩系膬蓚€局域網(wǎng)LAN1、LAN2當作一個局域網(wǎng)處理,路由連接了兩個子網(wǎng)1.0和
2、2.0。從eth0和eth1網(wǎng)卡收到的報文在Bridge模塊中會被處理成是由Bridge收到的,因此Bridge也相當于一個虛擬網(wǎng)卡。?STP五種狀態(tài)???????DISABLED???????BLOCKING???????LISTENING???????LEARNING???????FORWARDING創(chuàng)建新的網(wǎng)橋br_add_bridge[netbridgebr_if.c]當使用SIOCBRADDBR調(diào)用ioctl時,會創(chuàng)建新的網(wǎng)橋br_add_bridge。???????首先是創(chuàng)建新的網(wǎng)橋:viewplaincopytoclipboardprint?1.dev?=?new_br
3、idge_dev(net,?name);??dev=new_bridge_dev(net,name);???????然后設置dev->dev.type為br_type,而br_type是個全局變量,只初始化了一個名字變量viewplaincopytoclipboardprint?1.SET_NETDEV_DEVTYPE(dev,?&br_type);??2.static?struct?device_type?br_type?=?{??3.?.name?=?"bridge",??4.};??SET_NETDEV_DEVTYPE(dev,&br_type);staticstructdevic
4、e_typebr_type={.name="bridge",};???????然后注冊新創(chuàng)建的設備dev,網(wǎng)橋就相當一個虛擬網(wǎng)卡設備,注冊過的設備用ifconfig就可查看到:viewplaincopytoclipboardprint?1.ret?=?register_netdevice(dev);??ret=register_netdevice(dev);???????最后在sysfs文件系統(tǒng)中也創(chuàng)建相應項,便于查看和管理:viewplaincopytoclipboardprint?1.ret?=?br_sysfs_addbr(dev);??ret=br_sysfs_addbr(dev
5、);將端口加入網(wǎng)橋br_add_if()[netbridgebr_if.c]當使用SIOCBRADDIF調(diào)用ioctl時,會向網(wǎng)卡加入新的端口br_add_if。???????創(chuàng)建新的net_bridge_portp,會從br->port_list中分配一個未用的port_no,p->br會指向br,p->state設為BR_STATE_DISABLED。這里的p實際代表的就是網(wǎng)卡設備。viewplaincopytoclipboardprint?1.p?=?new_nbp(br,?dev);??p=new_nbp(br,dev);???????將新創(chuàng)建的p加入CAM表中,CAM表是用
6、來記錄mac地址與物理端口的對應關(guān)系;而剛剛創(chuàng)建了p,因此也要加入CAM表中,并且該表項應是local的[關(guān)系如下圖],可以看到,CAM表在實現(xiàn)中作為net_bridge的hash表,以addr作為hash值,鏈入net_bridge_fdb_entry,再由它的dst指向net_bridge_port。viewplaincopytoclipboardprint?1.err?=?br_fdb_insert(br,?p,?dev->dev_addr);???err=br_fdb_insert(br,p,dev->dev_addr);????????設備的br_port指向p。這里要明白的是
7、,net_bridge可以看作全局量,是網(wǎng)橋,而net_bridge_port則是與網(wǎng)卡相對應的端口,因此每個設備dev有個指針br_port指向該端口。viewplaincopytoclipboardprint?1.rcu_assign_pointer(dev->br_port,?p);??rcu_assign_pointer(dev->br_port,p);???????將新創(chuàng)建的net_bridge_port加入br的鏈表po