發信人: gdtyy (gdtyy), 信區: Embedded
標 題: PPPOE在EasyARM2200和SmartARM2200上的實現
發信站: 水木社區 (Mon Jun 25 23:23:10 2007), 站內
********************************************
* PPPOE在EasyARM2200和SmartARM2200上的實現 *
********************************************
------ 漫談《ecos增值包》網路整體解決方案
2007/04/29 asdjf@163.com www.armecos.com
PPPOE是PPP over Ethernet的縮寫,可以簡單理解成乙太網路上跑的PPP協議,而PPP是點
到點協議,完成點對點的通訊串連。如今,IP分組網路大有一統天下的趨勢,各種業務應用
,如:語音、視頻、資料、控制資訊等都趨向於融合到IP網路中,即Anything over IP。而
IP網路又可以基於各種介質,即IP over Anything。從而我們能夠實現Anything over
Anything。
然而,寬頻接入一直困擾著IP網路的發展,也就是人們常說的最後一公裡問題。現在,
通訊市場上存在著五花八門的寬頻接入方式:LAN、ADSL、HFC Cable Modem、WLAN等各自占
據一定的市場份額。其中,ADSL因為採用已有的廣泛鋪設的電話銅線,成本優勢明顯,所以
成為主流寬頻接入方式。它能夠提供最低512 kHz, 最高8 MHz 的頻寬。使用者獨享,不會因
為上網人數增加而導致上網速率的降低。ADSL價格低廉, 能為廣大的普通消費者所接受。用
戶一般通過ADSL Modem串連服務商的寬頻接入伺服器進而接入網路。作為《ecos增值包》產
品線的一部分,EcosNet PPPOE允許PPP會話承載在乙太網路上,它從兩方面簡化了寬頻互連網
接入解決方案的開發難度。首先是PPPOE服務提供者可以使用現有電話網和計費方法;其次
,PPPOE服務提供者可以讓客戶使用類似於目前流行的方便使用的撥接方式安裝和訪問
網路。
儘管乙太網路是廣播方式,但仍有必要實現點到點協議,主要是因為大量實際應用中要滿
足使用者認證的需要。比如:
1、計費---目前,服務商的計費方法主要有兩種:按時間長度計費(包月不限時、包月限時
、計時、分時段);按流量計費。每種計費方法都不一定十全十美,一般根據實際情況靈活
促銷,比如:套餐、節假日優惠、午夜降價什麼的,這導致計費公式不斷變化,需要資料庫
記錄交易情況,因此,必須提供使用者識別能力。另外,流量管理也是一種特殊的計費,雖然
不需要實際收費,但可以類比成計費。
2、使用者分級管理---比如:酒店裡VOD點播,可以用PPPOE實現使用者認證。
=================
| PPPOE協議分析 |
=================
PPPOE是如何工作的呢?
PPPOE協議分為發現階段和會話階段。發現階段主要完成訪問集中器選擇,確定會話標
識ID;會話階段執行標準的PPP過程。
發現階段:
第一步 主機向網路上所有的AC(訪問集中器)廣播,要求其中一個AC提供服務;
第二步 所有滿足條件的AC返回應答,應答幀源地址為伺服器MAC地址;
第三步 主機從收到的多個應答中根據集中器名稱和能提供的服務標籤選擇一個合適的
訪問集中器,並向其確認應答。
第四步 訪問集中器收到確認後再向主機回一個確認,主機收到確認後雙方進入會話階
段。
在會話階段,任一方都可以終止會話。
會話階段傳輸的就是正常的PPP幀了,完成LCP、PAP/CHAP、NCP,最後進入IP傳輸階段
。
===============
| PPPOE框架格式 |
===============
PPPOE幀是直接承載在乙太網路上的,802.3協議為此特別指定了8863和8864作為PPPPOE的
類型識別編碼。802.3的幀結構如下所示:
--------------------------------------------------------------------------------
----------------------------------
| 前置位PR | 幀起始位SD | 目的MAC地址DA | 源MAC地址SA | 類型TYPE/長度LEN |
資料域DATA | 填充PAD | 校正FCS |
--------------------------------------------------------------------------------
----------------------------------
64 bit 2 bit 48 bit 48 bit 16 bit
<=1500位元組 DATA小於46位元組補0 32 bit
類型TYPE說明:0800 IP包;0806 ARP包;814C SNMP包;8137 IPX/SPX;8863 PPPOE發
現階段;8864 PPPOE會話階段
小於0600H值用於IEEE802幀,表示資料包長度。
DATA說明:DA + SA + TYPE = 14位元組 + DATA = 1514位元組,即最大傳輸包長度<=1514
位元組。
PAD說明:最小包長度不小於60位元組,最小DATA長度46位元組,不夠的補0。
由上可知,網路通訊協定棧可以在乙太網路幀一級識別出IP、ARP、PPPOE等幀。更多乙太網路幀
資料結構詳見《NE2000網卡晶片驅動程式》。
PPPOE幀的資料域中承載著PPPOE資料報文,報文格式如下:
-------------------------------------------------------
| 版本0x1 | 類型0x1 | 編碼 | 會話ID | 長度 | 載荷 |
-------------------------------------------------------
4 bit 4 bit 1位元組 2位元組 2位元組 0-1500位元組
各欄位含義如下:
(1)版本欄位標誌協議版本資訊,目前規定其值為1;
(2)類型欄位規定為1;
(3)編碼欄位在不同階段具有不同取值;
(4)會話ID欄位,在發現階段取值為0x0000,在後續PPPOE會話過程中取值為發現階段所
獲得的由AC(訪問集中器Access Concentration)分配的唯一值;
(5)長度欄位可以取值0-1500位元組;
(6)淨載荷欄位存放PPPOE協議幀所承載的資料。在發現階段承載零個或多個TAG結構,
在會話階段承載PPP協議資料。注意不是簡單的PPP封包,因為並不需要PPP協議中的起始位
標誌、地址位、控制位和結束標誌,也不需要PPP協議中規定的資料轉譯和CRC校正。
TAG標籤結構:
-----------------------------
| TAG類型 | TAG長度 | TAG值 |
-----------------------------
2位元組 2位元組
===========================
| EcosNet網路整體解決方案 |
===========================
如何讓EasyARM2200和SmartARM2200支援多種網路互聯呢?EcosNet提供的網路整體解決
方案可以比較容易地實現這一點。
EcosNet網路架構提供了介面API函數和鉤子API函數,能靈活方便地增加各種功能和適
應各種網路介質。
介面API函數
netif_add(netif, &ipaddr, netmask, &gw, state, init, input);
--------------------------------------------------------------------------------
-
struct netif *
netif_add(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr
*netmask,
struct ip_addr *gw,
void *state,
err_t (* init)(struct netif *netif),
err_t (* input)(struct pbuf *p, struct netif *netif))
--------------------------------------------------------------------------------
-
netif 預分配的網路介面資料結構
ipaddr 新網路介面的IP地址
netmask 新網路介面的子網路遮罩
gw 新網路介面的預設網關IP地址
state 傳遞到新網路介面的不透明資料
init 初始化介面的回呼函數
input 被傳輸調用的回呼函數
入口包傳遞到上層協議棧
返回netif結構,如果失敗返回NULL。
例如:netif_add(n2k_netif, &ipaddr, &netmask, &gw, NULL, n2k_init,
tcpip_input);
介面API函數netif_add把網路裝置驅動程式增加到IP路由隊列裡,由ip_router程式根
據路由協議選擇發送介面。此函數參數包括網路介面資料結構、IP地址、子網路遮罩、網關地
址、傳遞資料、初始化回調、傳輸回調。各種網路介面裝置都可以使用這個函數加入到IP路
由隊列中,例如:LOOP環回、SLIP、Ethernet、PPP等,而且可以在路由隊列鏈表中註冊很
多介面驅動。這樣各種網路裝置都能夠很方便地接入到系統中來。
鉤子API函數
etherInputHookAdd(myhook);
myhook 自己的乙太網路鉤子處理函數。
PPPoE通過採用乙太網路發送函數etherOutput發送資料包, 接收方向主要是調用EcosNet
提供的增加鉤子函數etherInputHookAdd添加自己的乙太網路鉤子函數對乙太網路框架類型為
0x8863和0x8864的包進行攔截處理。
乙太網路幀中同時傳輸IP、ARP、PPPOE等幀,通過鉤子函數攔截不同類型的幀到相應處理
入口。如:IP幀直接發到IP路由隊列;ARP分發到ARP處理部分;PPPOE攔截到PPPOE處理部分
。鉤子函數主要完成過濾處理,有三種處理方式:
1、透傳---不改變原有包的資料,直接透傳上去。例如串口監聽,把收到的資料記錄下
來同時向上透傳;
2、攔截---攔截特定的資料,改變傳遞路徑;
3、篡改---修改資料並向上傳遞。
PPPOE採用攔截方式,改變乙太網路幀傳輸路徑到PPPOE處理部分。
鉤子函數可以堆疊串聯,因此存在一個堆疊順序問題。例如:
------------
| PPPOE |
------------
| firewall |
------------
| VPN |
------------
最底層鉤子掛接VPN,上面掛防火牆,再上面掛PPPOE攔截,順序可以調整,越靠近底層
,功能越強,不過消耗CPU資源也越多。
VPN可以在公網上實現專網效果,主要工作是加解密,需要商密局的加密晶片(就是一個
EEPROM,很貴的),還有入網證。
防火牆通過過濾IP包完成一系列控管規則。
PPPOE幀被攔截到PPPOE處理部分。
在EasyARM2200和SmartARM2200上的實現PPPOE的簡單方法就是利用EcosNet提供的介面
API和鉤子API,偽程式如下:
//增加PPPOE攔截鉤子函數
etherInputHookAdd(pppoe_hook);
//建立PPP線程
sys_create_new(pppmain, para, PPP_THREAD_PRIO);
//註冊PPP網路介面
netif_add(ppp_netif, &ipaddr, &netmask, &gw, NULL, ppp_init,tcpip_input);
這樣,乙太網路上傳輸的PPPOE幀被攔截到PPPOE處理常式,然後被發送到PPP協議,如果
ppp協商成功,IP資料包將被傳到上層協議棧。PPPOE發送程式直接調用乙太網路發送函數
etherOutput,發送封裝之後的PPPOE幀。
--
※ 來源:·水木社區 http://newsmth.net·[FROM: 61.149.56.*]