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