新聞中心

EEPW首頁 > 手機與無線通信 > 設(shè)計應(yīng)用 > 基于Linux內(nèi)核模式的PPPoE優(yōu)化與實現(xiàn)

基于Linux內(nèi)核模式的PPPoE優(yōu)化與實現(xiàn)

作者: 時間:2010-09-13 來源:網(wǎng)絡(luò) 收藏

2.1 PPPoE會話初始化
PPPoE的初始化包括整個Discovery階段以及Session階段的IPCP和LCP等其他鏈路協(xié)商過程,所有的工作都在用戶空間完成,圖3描述了整個初始化的流程。

本文引用地址:http://m.butianyuan.cn/article/157118.htm


首先通過Raw socket發(fā)送PADS、PADR、PADO、PADI,當這個請求完成后,得到遠端服務(wù)器的MAC地址以及雙方建立起來的Session_ID。由于后面的內(nèi)核封包需要用到這些數(shù)據(jù),所以需要將這些數(shù)據(jù)切換到內(nèi)核空間去。由于數(shù)據(jù)量較小,則采用proc文件系統(tǒng)完成內(nèi)核空間與用戶空間的數(shù)據(jù)切換。
對于proc中的數(shù)據(jù),設(shè)計以下數(shù)據(jù)格式:接口名詞SMAC DMAC SESSION_ID RX TX。
其中“接口名詞”為接口名稱,設(shè)計中不再用虛擬PPP接口傳輸數(shù)據(jù),而是將數(shù)據(jù)遷移到物理網(wǎng)卡上,這樣在某種程度上減輕了路由模塊的負擔,但需要去proc文件讀取接口名稱以此判斷該物理接口是否啟用PPPoE撥號。“SMAC”和“DMAC”參數(shù)為雙方的MAC地址,在內(nèi)核封包中用到。“SESSION_ID”雙方建立起來的Session_ID,也用于內(nèi)核封包。而“RX”和“TX”是用于記錄最后一次解包與封包的時間點,該數(shù)據(jù)用于按需撥號。
在建立好PPP連接后就進行IPCP協(xié)商,這個過程將為協(xié)商到雙方的IP的地址,并將這個IP地址配置到物理口上,而這些數(shù)據(jù)將通過PPP口通信。除此之外,還需要為PPPoE鏈路配置相應(yīng)的路由、更新ARP列表以及獲取相應(yīng)的DNS服務(wù)器地址。
2.2 PPPoE數(shù)據(jù)接收
PPPoE數(shù)據(jù)接收主要是對數(shù)據(jù)進行解包,其全部動作在內(nèi)核空間完成。當一個PPPoE數(shù)據(jù)包從網(wǎng)卡驅(qū)動里面讀出來時,是一個完整的PPPoE包。而上層模塊無法識別這樣的包,所以需要將中間的那些PPP協(xié)議數(shù)據(jù)從包中剝離出來,使其變成一個普通的IP數(shù)據(jù)包,圖4描述了PPPoE接收數(shù)據(jù)的整體流程。


當從網(wǎng)卡驅(qū)動上讀取數(shù)據(jù)時,也就是獲取數(shù)據(jù)的SKB,首先需要判斷這個SKB是否有效,然后再判斷該網(wǎng)卡是否起動了PPPoE服務(wù),很顯然這里需要讀取proc的接口信息。如果已經(jīng)PPPoE撥號服務(wù),還需要判斷該包是不是一個LCP或者IPCP等其他協(xié)商數(shù)據(jù),也就是判斷協(xié)議域的數(shù)據(jù)是不是0X0021。因為如果是協(xié)商數(shù)據(jù),則不需要解包,而直接將其轉(zhuǎn)發(fā)到PPP虛擬接口上。對于具體的解包過程將進行代碼分析。解完包以后該數(shù)據(jù)包就屬于普通的IP包,后續(xù)流程與普通的IP包處理相同。
2.3 PPPoE數(shù)據(jù)發(fā)送
PPPoE數(shù)據(jù)發(fā)送流程基本上是數(shù)據(jù)接收的逆過程,圖5描述整個數(shù)據(jù)發(fā)送過程。首先從用戶空間或者FORWARDING模塊獲取一個數(shù)據(jù)包,這個數(shù)據(jù)包屬于正常的IP包。很顯然這個包是無法發(fā)送到PPP鏈路上的,因為PPPoE服務(wù)器并不識別這樣的數(shù)據(jù)包。所以需要利用proc文件中的Session_ID、遠端MAC和本地MAC數(shù)據(jù)來封裝IP包,使其成為一個標準的PPP包。



關(guān)鍵詞: 收發(fā)器

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉