版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ADSL接入及共享技術(shù)的實(shí)現(xiàn)(二)
EncapLength、EncapData針對(duì)RFC1483Bridged、RFC1483Routed、ATMARP等協(xié)議的規(guī)定進(jìn)行相應(yīng)初始化及數(shù)據(jù)填充,供底層驅(qū)動(dòng)在封裝、解封裝時(shí)直接作為依據(jù)。PCookie是muxBind底層設(shè)備驅(qū)動(dòng)后返回的設(shè)備索引號(hào),以便系統(tǒng)卸載網(wǎng)絡(luò)服務(wù)子層時(shí)可解除該綁定。Ifp是網(wǎng)絡(luò)服務(wù)子層Attach至協(xié)議棧時(shí)返回的子網(wǎng)接口索引號(hào),以便系統(tǒng)卸載該Service時(shí)可解除綁定。6.2.3Service協(xié)議數(shù)據(jù)收發(fā)流程Service正確綁定至協(xié)議棧后,就可以接收SAREND驅(qū)動(dòng)層傳入的該協(xié)議類型數(shù)據(jù)報(bào)文并對(duì)其處理,根據(jù)處理的結(jié)果選擇轉(zhuǎn)發(fā)或丟棄;對(duì)于協(xié)議棧下發(fā)的報(bào)文,也可以方便地進(jìn)行相應(yīng)協(xié)議封裝,再交給END驅(qū)動(dòng)發(fā)送。其收發(fā)流程框圖如圖6-1所示。圖6-1Service收發(fā)流程示意圖接收流程(虛線箭頭所示):1)SAR模塊收到報(bào)文,產(chǎn)生中斷,進(jìn)入接收中斷處理例程2)調(diào)用END_RCV_RTN_CALL將報(bào)文返回給協(xié)議棧(reserved中存放協(xié)議類型)3)MUX層詢問(wèn)該報(bào)文的協(xié)議類型4)SAR驅(qū)動(dòng)層將reserved中的類型返回給MUX層5)MUX層根據(jù)協(xié)議類型將報(bào)文提交給相應(yīng)的Service.6)Service解封裝后,調(diào)用do_protocol_with_type將報(bào)文提交給協(xié)議棧發(fā)送流程(實(shí)線箭頭所示):1)協(xié)議棧通過(guò)MUX層發(fā)送報(bào)文2)MUX層將報(bào)文傳給預(yù)先綁定的Service3)Service對(duì)數(shù)據(jù)進(jìn)行封裝后,returnFalse,將數(shù)據(jù)返回MUX層4)MUX層將數(shù)據(jù)發(fā)送到SAR模塊相應(yīng)的PVC接口5)SAR模塊相應(yīng)的PVC接口發(fā)送該報(bào)文。6.3RFC1483協(xié)議報(bào)文處理由于RFC1483數(shù)據(jù)報(bào)文的封裝格式比較簡(jiǎn)單,我們將該類型報(bào)文的封裝、解封裝例程放在END驅(qū)動(dòng)中實(shí)現(xiàn),以提高系統(tǒng)對(duì)該類型報(bào)文的處理效率。6.3.1RFC1483報(bào)文封裝格式RFC1483標(biāo)準(zhǔn)描述了ATM網(wǎng)絡(luò)上承載無(wú)連接網(wǎng)絡(luò)互連業(yè)務(wù)(即路由和橋接的協(xié)議數(shù)據(jù)單元)的兩種不同方法。第一種方法允許在一條ATM虛電路上復(fù)用多個(gè)協(xié)議,這是需要在所傳送的PDU前加上IEEE802.2邏輯鏈路控制信頭,以此來(lái)表示所傳遞的PDU的協(xié)議,這種方法稱為L(zhǎng)LC封裝;第二種方法是一個(gè)高層協(xié)議由一條ATM虛電路來(lái)承載,這種方法成為基于VC的復(fù)用。LLC封裝在LLC封裝中,路由協(xié)議通過(guò)在PDU前加一個(gè)IEEE802.2LLC信頭來(lái)進(jìn)行標(biāo)識(shí),IEEE802.2LLC信頭后接IEEE802.1a子網(wǎng)絡(luò)附屬點(diǎn)(SNAP)信頭。在LLC類型1的操作中,LLC信頭包括3個(gè)字節(jié),如下:在用于路由協(xié)議的LLC封裝中,LLC信頭編碼有兩種格式:一種為0xFE-FE-03,用于說(shuō)明后接的是ISO路由協(xié)議的PDU;另一種為0xAA-AA-03,用于說(shuō)明后接的是非ISO路由協(xié)議??刂谱侄尉幋a為0x03,用于說(shuō)明后接的是無(wú)編號(hào)信息的命令PDU。對(duì)于ISO路由協(xié)議PDU,其AAL5CPCS-PDU凈荷字段的格式為對(duì)于非ISO路由PDU(如IP協(xié)議),其封裝格式為(其中,如果是IP報(bào)文的話,EthernetType值為0x0800)對(duì)于橋接協(xié)議報(bào)文,在LLC封裝的SNAP信頭中應(yīng)標(biāo)識(shí)出橋接媒體的類型。與非ISO路由協(xié)議的封裝一樣,LLC信頭編碼值0xAA-AA-03表示存在SNAP信頭,SNAP信頭中的OUI值是802.1組織編碼0x00-80-C2,橋接媒體的實(shí)際類型由2字節(jié)的PID來(lái)標(biāo)識(shí)。此外,PID還標(biāo)識(shí)是否在封裝的橋接PDU中保留源幀校驗(yàn)序列(FCS)。以最常見(jiàn)的以太網(wǎng)/802.3為例,用于封裝802.3PDU的AAL5CPCS-PDU凈荷幀格式如下基于VC的復(fù)用在基于VC的復(fù)用中,不同的協(xié)議報(bào)文可以通過(guò)不同的VC通道傳遞,因此在AAL5的CPCP-PDU凈荷上就不再包含明確標(biāo)識(shí)所承載協(xié)議的信息了,使得處理開(kāi)銷最小。路由協(xié)議的PDU在AAL5CPCS-PDU的凈荷中直接承載。橋接協(xié)議的PDU和LLC封裝格式描述相同,但僅包含PID字段后的內(nèi)容。其AAL5CPCS-PDU凈荷字段格式如下所示:6.3.2RFC1483報(bào)文的封裝處理上層協(xié)議在調(diào)用muxSend之前,會(huì)先調(diào)用endAddressForm函數(shù)進(jìn)行二層數(shù)據(jù)封裝,我們?cè)谶@個(gè)函數(shù)里實(shí)現(xiàn)IP報(bào)文到Ethernet類型報(bào)文的數(shù)據(jù)封裝。SarEndSend函數(shù)里會(huì)調(diào)用ATMSRV_Encap進(jìn)行Ethernet報(bào)文到AAL5相應(yīng)協(xié)議類型的封裝。6.3.3RFC1483報(bào)文解封裝處理在中斷接收處理函數(shù)里,會(huì)調(diào)用ATMSRV_Decap解除ATM協(xié)議封裝,同時(shí)將二層協(xié)議類型存于mBlkPktHdr.reserved中,由endPacketDataGet通知MUX。7增加NAT支持目前已經(jīng)有很多forvxworks的第三方NAT協(xié)議產(chǎn)品,而且windriver公司自己也推出了Tornado開(kāi)發(fā)平臺(tái)下的NAT組件,但價(jià)位實(shí)在太高。由于該協(xié)議本身實(shí)現(xiàn)的難度不大,而且有l(wèi)inux或BSD的相關(guān)模塊可供參考和移植,所以我們決定自己實(shí)現(xiàn)這個(gè)協(xié)議。難點(diǎn)主要在于NAT收發(fā)處理函數(shù)的綁定,NAT端口地址轉(zhuǎn)換hash表的建立及查找算法的實(shí)現(xiàn)。7.1NAT模塊主處理流程主要包括LAN口和WAN口的IP地址轉(zhuǎn)換。如圖7-1所示。圖7-1NAT主處理流程示意圖7.2NAT模塊初始化7.2.1NAT數(shù)據(jù)結(jié)構(gòu)初始化1)nat_session結(jié)構(gòu),記錄每一連接的連接信息:structnat_session{UCHARip_proto;
//協(xié)議類型structin_addrsrc_addr,dst_addr,new_addr;//源地址,目標(biāo)地址,轉(zhuǎn)換后地址/*PortnumbersareinhostUCHARorder:*/union{/*ForTCP_and_UDP:*/struct{UINT16src_port,dst_port,new_port;}tcp;//端口/*ForICMP:*/struct{UINT16src_ident,new_ident;}icmp;
//identification}U;enumnat_session_statestate;
//連接狀態(tài)unsignedlongtimestamp;//時(shí)間戳NAT_ALG
*alg;//應(yīng)用層網(wǎng)關(guān)函數(shù)指針intalg_use;//標(biāo)志,是否需要應(yīng)用層網(wǎng)關(guān)NAT_SESSION*parent;//ftp中指向控制連接session的指針NAT_SESSION*next_hash;
//Hash表下一表項(xiàng)};2)nat_interface接口結(jié)構(gòu)structnat_interface{NAT_INTERFACE*next;//指向下一個(gè)接口結(jié)構(gòu)structin_addripaddress;//接口地址(轉(zhuǎn)換地址)/*Pointertotableofsessionstructures,andhashtable:*/NAT_SESSION*sessions;//指向session結(jié)構(gòu)表NAT_SESSION**hashtable;
//指向hash結(jié)構(gòu)表intnext_session;/*Pointertotableoffragmentstructures*/NAT_FRAGMENT*fragments;
//指向fragment結(jié)構(gòu)表intfrag_queued;//記錄保存有多少個(gè)分片隊(duì)列/*Stats-countsofsessions*/
//各種計(jì)數(shù)器UINT32tcp_out,udp_out;UINT32icmp_q_out,icmp_err_out,icmp_err_in;UINT32discard_in,discard_out,refused_in,del_early;};仔細(xì)分析vxworks協(xié)議棧代碼后,覺(jué)得使用_ipFilterHook綁定NAT接收?qǐng)?bào)文處理函數(shù)的方式比較可行,該鉤子函數(shù)在協(xié)議棧接收到數(shù)據(jù)報(bào)文時(shí)被調(diào)用,函數(shù)輸入輸出格式如下:BOOLNatIpFilterHookRtn(structifnetrcvifnet,
/*數(shù)據(jù)接收的接口*/structmbuf**m,/*數(shù)據(jù)報(bào)文地址*/structip**ip,
/*IP頭部地址*/inthlen/*IP頭的長(zhǎng)度*/)返回值:為FALSE時(shí)表示報(bào)文處理正常,協(xié)議??衫^續(xù)轉(zhuǎn)發(fā)或處理為TRUE時(shí)指示系統(tǒng)丟棄該報(bào)文由于無(wú)法找到協(xié)議棧輸出報(bào)文的鉤子,我們打算把輸出報(bào)文NAT轉(zhuǎn)換放在_ipFilterHook的LAN口鉤子中處理,即在LAN口報(bào)文進(jìn)入?yún)f(xié)議棧之前就更改源IP和端口地址。但這樣做的缺點(diǎn)是:此時(shí)系統(tǒng)還沒(méi)有檢索過(guò)該報(bào)文的路由目的接口,需要人為增加查找路由表算法,當(dāng)發(fā)現(xiàn)是發(fā)往指定WAN口時(shí)再行轉(zhuǎn)換,處理的效率較低。為充分利用協(xié)議棧的報(bào)文路由處理功能,決定采用更改協(xié)議棧代碼的方式,在ip_output函數(shù)適當(dāng)位置處人為增加一個(gè)鉤子_func_natOutput,重新編譯vxworks協(xié)議棧庫(kù)函數(shù)。這樣,NAT模塊初始化時(shí)即可將NAT輸出報(bào)文處理函數(shù)綁定至該鉤子。函數(shù)的輸入輸出關(guān)系格式如下:intNatOutput(structmbuf**m0,
/*數(shù)據(jù)報(bào)文地址*/structip**ip,
/*IP頭部地址*/structin_ifaddr*ia/*報(bào)文目的接口*/)返回值:OK或ERROR(ERROR時(shí)將丟棄并釋放該報(bào)文)7.3NAT模塊主要算法7.3.1NAT端口地址轉(zhuǎn)換HASH算法NAPT轉(zhuǎn)換表查找算法可分為按端口查找和按地址查找兩種。在實(shí)際的ADSL接入環(huán)境中,局端很少會(huì)為一個(gè)連接分配多個(gè)IP,因此我們采用按端口查找的算法來(lái)簡(jiǎn)單實(shí)現(xiàn)。1)session結(jié)構(gòu)數(shù)組的初始化NAT初始化時(shí)根據(jù)系統(tǒng)支持的最大轉(zhuǎn)換數(shù)目建立一個(gè)按端口分布的nat_session結(jié)構(gòu)數(shù)組(nat_session節(jié)點(diǎn)的定義見(jiàn)7.2.1),同時(shí)建立一個(gè)指向nat_session的空hash表。Hash節(jié)點(diǎn)結(jié)構(gòu)如下:typedefstructnat_hash_bucket_{structnat_hash_bucket_*next;
//指向下一個(gè)節(jié)點(diǎn)structnat_hash_bucket_*prev;
//指向前一個(gè)節(jié)點(diǎn)unsignednat_session*pSession;//指向nat鏈表中相應(yīng)的節(jié)點(diǎn)}nat_hash_bucket;2)新建sessionget_free_session在session靜態(tài)表(結(jié)構(gòu)數(shù)組)中獲得一個(gè)freesession,并將其從Hash表中unlink出來(lái)。查找的依據(jù)為時(shí)間戳,順序遍歷session表,直到找到第一個(gè)超時(shí)的session。若未找到,則覆蓋當(dāng)前指針指向的session。填充該session結(jié)構(gòu),返回該session所對(duì)應(yīng)的端口號(hào)。根據(jù)TCP/UDP報(bào)文的源IP和源端口號(hào)計(jì)算出hash頭,增加到hash頭所對(duì)應(yīng)的鏈表后。其中,hash頭的算法如下:LOCALUINT16ipnat_hash_fn(ipaddrtypeaddr1,ipaddrtypeaddr2,UINT16port1,UINT16port2){UINT16bucket;bucket=addr1>>16;bucket^=addr1&0xffff;bucket^=port1;bucket^=addr2>>16;bucket^=addr2&0xffff;bucket^=port2;bucket=bucket%IPNAT_HASHLEN;return(bucket);}轉(zhuǎn)換后的TCP/IP報(bào)文源IP變?yōu)閃AN口IP,源端口變?yōu)閟ession索引值,這樣做的優(yōu)點(diǎn)是:外部返回的報(bào)文可以通過(guò)TCP/IP報(bào)文的目的端口號(hào)直接定位到session數(shù)組中,查找的速度最快。3)查找session通過(guò)TCP/UDP報(bào)文的源IP和源端口號(hào)計(jì)算出hash頭,然后遍歷該頭所對(duì)應(yīng)的鏈表,直到找到相匹配的hash節(jié)點(diǎn)。4)刪除session收到TCP/UDP連接關(guān)閉請(qǐng)求后,根據(jù)目的端口號(hào)找到session數(shù)組,釋放該session,并將其從Hash表中unlink出來(lái)。7.3.2TCP/UDP協(xié)議端口地址轉(zhuǎn)換setup_tcpudp_outgoing為從內(nèi)部網(wǎng)絡(luò)出去的TCP/UDP連接建立一個(gè)session,記錄下連接的源地址、端口,目標(biāo)地址、端口,轉(zhuǎn)換后的地址、端口,協(xié)議類型以及連接建立時(shí)間等信息。translate_outgoing_tcpudp核心函數(shù),根據(jù)session的對(duì)應(yīng)記錄,轉(zhuǎn)換數(shù)據(jù)包的IP地址、端口,同時(shí)重新調(diào)整IP校驗(yàn)和及TCP/UDP校驗(yàn)和,其中,校驗(yàn)和調(diào)整主要用到了adjust_chksum函數(shù)。算法如下:voidadjust_chksum(ulong*chkSum,ushortoldW,ushortnewW){*chkSum-=oldW&0xffff;if((*lChkSum)<=0){(*chkSum)--;(*chkSum)&=0xffff;}(*chkSum)+=newW&0xffff;if((*chkSum)&0x10000){(*chkSum)++;(*chkSum)&=0xffff;}}8設(shè)計(jì)總結(jié)本系統(tǒng)的優(yōu)點(diǎn)是,僅需采用一塊CPU即可同時(shí)實(shí)現(xiàn)ADSL接入和路由兩項(xiàng)功能,硬件資源利用率高,而且,兩種功能在同一套系統(tǒng)平臺(tái)中可以有機(jī)結(jié)合,避免因中間插入多余轉(zhuǎn)換接口導(dǎo)致包處理效率降低。文中所述的僅實(shí)現(xiàn)了一個(gè)最簡(jiǎn)單的ADSL共享接入方式,并不能完全滿足實(shí)際使用中的種種需求,還需要補(bǔ)充其它如協(xié)議報(bào)文處理、ICMP報(bào)文處理、應(yīng)用層網(wǎng)關(guān)處理等功能。此外,在實(shí)際測(cè)試中,感覺(jué)NAT地址轉(zhuǎn)換Hash表的算法還不夠理想:在新建一
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全策劃及風(fēng)險(xiǎn)分級(jí)管理制度
- 第四章《光現(xiàn)象》基礎(chǔ)練習(xí)題 (含解析)2024-2025學(xué)年物理人教版八年級(jí)上冊(cè)
- 《一橋飛架連天塹》課件 2024-2025學(xué)年嶺南美版 (2024)初中美術(shù)七年級(jí)上冊(cè)
- 2024至2030年中國(guó)普通金屬膨脹螺栓行業(yè)投資前景及策略咨詢研究報(bào)告
- 2014-2018年鉭酸鋰行業(yè)投資分析報(bào)告
- 2010-2012年碳五行業(yè)市場(chǎng)研究與競(jìng)爭(zhēng)力分析報(bào)告
- 2024年湖南省長(zhǎng)沙市中考語(yǔ)文試題含解析
- 2024年中國(guó)電子屏市場(chǎng)調(diào)查研究報(bào)告
- 2024年中國(guó)冷光無(wú)煙煙花市場(chǎng)調(diào)查研究報(bào)告
- 高中語(yǔ)文第12課動(dòng)物游戲之謎課件3新人教版必修
- 廣東發(fā)布新版《工程勘察設(shè)計(jì)收費(fèi)導(dǎo)則》
- 220KV變電所管理制度
- 香港聯(lián)合交易所有限公司證券上市規(guī)則
- 語(yǔ)文記敘文閱讀理解答題技巧ppt課件
- 水電站組成和生產(chǎn)過(guò)程
- 《神經(jīng)系統(tǒng)脊髓》PPT課件.ppt
- 破堤施工方案
- 票據(jù)法第三章本、支票
- 商檢、法檢、三檢的區(qū)別
- 小兒川崎病ppt課件
- 異形金屬板幕墻掛接安裝施工工法(含模型圖,節(jié)點(diǎn)圖)
評(píng)論
0/150
提交評(píng)論