发信人: 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.*]