版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
ADSL接入及共享技術的實現(xiàn)(二)
EncapLength、EncapData針對RFC1483Bridged、RFC1483Routed、ATMARP等協(xié)議的規(guī)定進行相應初始化及數(shù)據(jù)填充,供底層驅動在封裝、解封裝時直接作為依據(jù)。PCookie是muxBind底層設備驅動后返回的設備索引號,以便系統(tǒng)卸載網(wǎng)絡服務子層時可解除該綁定。Ifp是網(wǎng)絡服務子層Attach至協(xié)議棧時返回的子網(wǎng)接口索引號,以便系統(tǒng)卸載該Service時可解除綁定。6.2.3Service協(xié)議數(shù)據(jù)收發(fā)流程Service正確綁定至協(xié)議棧后,就可以接收SAREND驅動層傳入的該協(xié)議類型數(shù)據(jù)報文并對其處理,根據(jù)處理的結果選擇轉發(fā)或丟棄;對于協(xié)議棧下發(fā)的報文,也可以方便地進行相應協(xié)議封裝,再交給END驅動發(fā)送。其收發(fā)流程框圖如圖6-1所示。圖6-1Service收發(fā)流程示意圖接收流程(虛線箭頭所示):1)SAR模塊收到報文,產(chǎn)生中斷,進入接收中斷處理例程2)調用END_RCV_RTN_CALL將報文返回給協(xié)議棧(reserved中存放協(xié)議類型)3)MUX層詢問該報文的協(xié)議類型4)SAR驅動層將reserved中的類型返回給MUX層5)MUX層根據(jù)協(xié)議類型將報文提交給相應的Service.6)Service解封裝后,調用do_protocol_with_type將報文提交給協(xié)議棧發(fā)送流程(實線箭頭所示):1)協(xié)議棧通過MUX層發(fā)送報文2)MUX層將報文傳給預先綁定的Service3)Service對數(shù)據(jù)進行封裝后,returnFalse,將數(shù)據(jù)返回MUX層4)MUX層將數(shù)據(jù)發(fā)送到SAR模塊相應的PVC接口5)SAR模塊相應的PVC接口發(fā)送該報文。6.3RFC1483協(xié)議報文處理由于RFC1483數(shù)據(jù)報文的封裝格式比較簡單,我們將該類型報文的封裝、解封裝例程放在END驅動中實現(xiàn),以提高系統(tǒng)對該類型報文的處理效率。6.3.1RFC1483報文封裝格式RFC1483標準描述了ATM網(wǎng)絡上承載無連接網(wǎng)絡互連業(yè)務(即路由和橋接的協(xié)議數(shù)據(jù)單元)的兩種不同方法。第一種方法允許在一條ATM虛電路上復用多個協(xié)議,這是需要在所傳送的PDU前加上IEEE802.2邏輯鏈路控制信頭,以此來表示所傳遞的PDU的協(xié)議,這種方法稱為LLC封裝;第二種方法是一個高層協(xié)議由一條ATM虛電路來承載,這種方法成為基于VC的復用。LLC封裝在LLC封裝中,路由協(xié)議通過在PDU前加一個IEEE802.2LLC信頭來進行標識,IEEE802.2LLC信頭后接IEEE802.1a子網(wǎng)絡附屬點(SNAP)信頭。在LLC類型1的操作中,LLC信頭包括3個字節(jié),如下:在用于路由協(xié)議的LLC封裝中,LLC信頭編碼有兩種格式:一種為0xFE-FE-03,用于說明后接的是ISO路由協(xié)議的PDU;另一種為0xAA-AA-03,用于說明后接的是非ISO路由協(xié)議。控制字段編碼為0x03,用于說明后接的是無編號信息的命令PDU。對于ISO路由協(xié)議PDU,其AAL5CPCS-PDU凈荷字段的格式為對于非ISO路由PDU(如IP協(xié)議),其封裝格式為(其中,如果是IP報文的話,EthernetType值為0x0800)對于橋接協(xié)議報文,在LLC封裝的SNAP信頭中應標識出橋接媒體的類型。與非ISO路由協(xié)議的封裝一樣,LLC信頭編碼值0xAA-AA-03表示存在SNAP信頭,SNAP信頭中的OUI值是802.1組織編碼0x00-80-C2,橋接媒體的實際類型由2字節(jié)的PID來標識。此外,PID還標識是否在封裝的橋接PDU中保留源幀校驗序列(FCS)。以最常見的以太網(wǎng)/802.3為例,用于封裝802.3PDU的AAL5CPCS-PDU凈荷幀格式如下基于VC的復用在基于VC的復用中,不同的協(xié)議報文可以通過不同的VC通道傳遞,因此在AAL5的CPCP-PDU凈荷上就不再包含明確標識所承載協(xié)議的信息了,使得處理開銷最小。路由協(xié)議的PDU在AAL5CPCS-PDU的凈荷中直接承載。橋接協(xié)議的PDU和LLC封裝格式描述相同,但僅包含PID字段后的內容。其AAL5CPCS-PDU凈荷字段格式如下所示:6.3.2RFC1483報文的封裝處理上層協(xié)議在調用muxSend之前,會先調用endAddressForm函數(shù)進行二層數(shù)據(jù)封裝,我們在這個函數(shù)里實現(xiàn)IP報文到Ethernet類型報文的數(shù)據(jù)封裝。SarEndSend函數(shù)里會調用ATMSRV_Encap進行Ethernet報文到AAL5相應協(xié)議類型的封裝。6.3.3RFC1483報文解封裝處理在中斷接收處理函數(shù)里,會調用ATMSRV_Decap解除ATM協(xié)議封裝,同時將二層協(xié)議類型存于mBlkPktHdr.reserved中,由endPacketDataGet通知MUX。7增加NAT支持目前已經(jīng)有很多forvxworks的第三方NAT協(xié)議產(chǎn)品,而且windriver公司自己也推出了Tornado開發(fā)平臺下的NAT組件,但價位實在太高。由于該協(xié)議本身實現(xiàn)的難度不大,而且有l(wèi)inux或BSD的相關模塊可供參考和移植,所以我們決定自己實現(xiàn)這個協(xié)議。難點主要在于NAT收發(fā)處理函數(shù)的綁定,NAT端口地址轉換hash表的建立及查找算法的實現(xiàn)。7.1NAT模塊主處理流程主要包括LAN口和WAN口的IP地址轉換。如圖7-1所示。圖7-1NAT主處理流程示意圖7.2NAT模塊初始化7.2.1NAT數(shù)據(jù)結構初始化1)nat_session結構,記錄每一連接的連接信息:structnat_session{UCHARip_proto;
//協(xié)議類型structin_addrsrc_addr,dst_addr,new_addr;//源地址,目標地址,轉換后地址/*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;//時間戳NAT_ALG
*alg;//應用層網(wǎng)關函數(shù)指針intalg_use;//標志,是否需要應用層網(wǎng)關NAT_SESSION*parent;//ftp中指向控制連接session的指針NAT_SESSION*next_hash;
//Hash表下一表項};2)nat_interface接口結構structnat_interface{NAT_INTERFACE*next;//指向下一個接口結構structin_addripaddress;//接口地址(轉換地址)/*Pointertotableofsessionstructures,andhashtable:*/NAT_SESSION*sessions;//指向session結構表NAT_SESSION**hashtable;
//指向hash結構表intnext_session;/*Pointertotableoffragmentstructures*/NAT_FRAGMENT*fragments;
//指向fragment結構表intfrag_queued;//記錄保存有多少個分片隊列/*Stats-countsofsessions*/
//各種計數(shù)器UINT32tcp_out,udp_out;UINT32icmp_q_out,icmp_err_out,icmp_err_in;UINT32discard_in,discard_out,refused_in,del_early;};仔細分析vxworks協(xié)議棧代碼后,覺得使用_ipFilterHook綁定NAT接收報文處理函數(shù)的方式比較可行,該鉤子函數(shù)在協(xié)議棧接收到數(shù)據(jù)報文時被調用,函數(shù)輸入輸出格式如下:BOOLNatIpFilterHookRtn(structifnetrcvifnet,
/*數(shù)據(jù)接收的接口*/structmbuf**m,/*數(shù)據(jù)報文地址*/structip**ip,
/*IP頭部地址*/inthlen/*IP頭的長度*/)返回值:為FALSE時表示報文處理正常,協(xié)議??衫^續(xù)轉發(fā)或處理為TRUE時指示系統(tǒng)丟棄該報文由于無法找到協(xié)議棧輸出報文的鉤子,我們打算把輸出報文NAT轉換放在_ipFilterHook的LAN口鉤子中處理,即在LAN口報文進入?yún)f(xié)議棧之前就更改源IP和端口地址。但這樣做的缺點是:此時系統(tǒng)還沒有檢索過該報文的路由目的接口,需要人為增加查找路由表算法,當發(fā)現(xiàn)是發(fā)往指定WAN口時再行轉換,處理的效率較低。為充分利用協(xié)議棧的報文路由處理功能,決定采用更改協(xié)議棧代碼的方式,在ip_output函數(shù)適當位置處人為增加一個鉤子_func_natOutput,重新編譯vxworks協(xié)議棧庫函數(shù)。這樣,NAT模塊初始化時即可將NAT輸出報文處理函數(shù)綁定至該鉤子。函數(shù)的輸入輸出關系格式如下:intNatOutput(structmbuf**m0,
/*數(shù)據(jù)報文地址*/structip**ip,
/*IP頭部地址*/structin_ifaddr*ia/*報文目的接口*/)返回值:OK或ERROR(ERROR時將丟棄并釋放該報文)7.3NAT模塊主要算法7.3.1NAT端口地址轉換HASH算法NAPT轉換表查找算法可分為按端口查找和按地址查找兩種。在實際的ADSL接入環(huán)境中,局端很少會為一個連接分配多個IP,因此我們采用按端口查找的算法來簡單實現(xiàn)。1)session結構數(shù)組的初始化NAT初始化時根據(jù)系統(tǒng)支持的最大轉換數(shù)目建立一個按端口分布的nat_session結構數(shù)組(nat_session節(jié)點的定義見7.2.1),同時建立一個指向nat_session的空hash表。Hash節(jié)點結構如下:typedefstructnat_hash_bucket_{structnat_hash_bucket_*next;
//指向下一個節(jié)點structnat_hash_bucket_*prev;
//指向前一個節(jié)點unsignednat_session*pSession;//指向nat鏈表中相應的節(jié)點}nat_hash_bucket;2)新建sessionget_free_session在session靜態(tài)表(結構數(shù)組)中獲得一個freesession,并將其從Hash表中unlink出來。查找的依據(jù)為時間戳,順序遍歷session表,直到找到第一個超時的session。若未找到,則覆蓋當前指針指向的session。填充該session結構,返回該session所對應的端口號。根據(jù)TCP/UDP報文的源IP和源端口號計算出hash頭,增加到hash頭所對應的鏈表后。其中,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);}轉換后的TCP/IP報文源IP變?yōu)閃AN口IP,源端口變?yōu)閟ession索引值,這樣做的優(yōu)點是:外部返回的報文可以通過TCP/IP報文的目的端口號直接定位到session數(shù)組中,查找的速度最快。3)查找session通過TCP/UDP報文的源IP和源端口號計算出hash頭,然后遍歷該頭所對應的鏈表,直到找到相匹配的hash節(jié)點。4)刪除session收到TCP/UDP連接關閉請求后,根據(jù)目的端口號找到session數(shù)組,釋放該session,并將其從Hash表中unlink出來。7.3.2TCP/UDP協(xié)議端口地址轉換setup_tcpudp_outgoing為從內部網(wǎng)絡出去的TCP/UDP連接建立一個session,記錄下連接的源地址、端口,目標地址、端口,轉換后的地址、端口,協(xié)議類型以及連接建立時間等信息。translate_outgoing_tcpudp核心函數(shù),根據(jù)session的對應記錄,轉換數(shù)據(jù)包的IP地址、端口,同時重新調整IP校驗和及TCP/UDP校驗和,其中,校驗和調整主要用到了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設計總結本系統(tǒng)的優(yōu)點是,僅需采用一塊CPU即可同時實現(xiàn)ADSL接入和路由兩項功能,硬件資源利用率高,而且,兩種功能在同一套系統(tǒng)平臺中可以有機結合,避免因中間插入多余轉換接口導致包處理效率降低。文中所述的僅實現(xiàn)了一個最簡單的ADSL共享接入方式,并不能完全滿足實際使用中的種種需求,還需要補充其它如協(xié)議報文處理、ICMP報文處理、應用層網(wǎng)關處理等功能。此外,在實際測試中,感覺NAT地址轉換Hash表的算法還不夠理想:在新建一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024家具銷售合同樣本
- 景觀工程合同的履行期限
- 工程總價固定合同格式
- 2024年購銷合同大米
- 房地產(chǎn)分銷代理合同
- 2024個人與公司合作協(xié)議書
- 工程維護居間合同格式
- 2024年婚前財產(chǎn)協(xié)議書示例
- 城市房屋拆遷流程指南
- 合作經(jīng)營協(xié)議書范本經(jīng)典案例
- TMF自智網(wǎng)絡白皮書4.0
- 電視劇《國家孩子》觀影分享會PPT三千孤兒入內蒙一段流淌著民族大愛的共和國往事PPT課件(帶內容)
- 所水力除焦設備介紹
- 農村黑臭水體整治項目可行性研究報告
- 改革開放英語介紹-課件
- pet考試歷屆真題和答案
- 《企業(yè)員工薪酬激勵問題研究10000字(論文)》
- 大學英語三級B真題2023年06月
- GB/T 7909-2017造紙木片
- GB/T 25217.6-2019沖擊地壓測定、監(jiān)測與防治方法第6部分:鉆屑監(jiān)測方法
- 中醫(yī)學課件 治則與治法
評論
0/150
提交評論