ADSL接入及共享技术的实现一文档格式.docx
《ADSL接入及共享技术的实现一文档格式.docx》由会员分享,可在线阅读,更多相关《ADSL接入及共享技术的实现一文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
缺点是:
需要占用一台服务器作为数据转发设备,成本较高;
数据交换的效率较低,和服务器的性能有很大关系;
此外,病毒入侵或服务器本身性能不稳定,极易造成网络异常。
2.普通ADSLModem+共享器
所谓共享器,其实是一种集成PPPOE、NAT等功能的简单路器。
图2-2所示的组网方案中,共享器取代了前一个方案中双网卡PC的地位。
采用这种方案后,可以节省一台服务器以及相关软件的花费,较第一种方案来说,确实经济很多,也不用再担心病毒入侵、服务器不稳定等问题了。
很多共享器本身就带多个LAN口,无需再添置HUB或Switch等设备即可供多台微机使用,对于家庭局域网或小型办公场所非常合适。
图1-2共享器+ADSLModem接入示意图
3.带路功能的ADSLModem
带简单路器功能的ADSLModem集成了ADSL接入功能及网络共享技术。
如图1-3所示,局域网用户仅需将自身的IP网关指向设置在ADSLModem以太网接口上的IP地址,即可实现与外部网络的互连。
于ADSL接入和路两种功能集成在同一设备中,减少了中间的数据转发环节,传输效率会更高一些,配置及调试起来也方便很多。
此外,用一块CPU就可以实现ADSL接入协议及简单路等软件功能,硬件成本降低很多,价格比起ADSLModem+共享器当然更有优势了。
图1-3带简单路功能的ADSLModem接入示意图
将首先介绍网络共享原理,然后逐个分析目前常用的各种ADSL接入协议以及实现共享的方式。
最后以Motorola850SAR+为开发平台,设计一套带简单路功能的ADSL接入设备,重点阐述ATMSAR层驱动的编写、AAL5业务、各种接入协议以及带宽共享功能的软件实现。
2网络共享原理
私有网络地址和公有网络地址
私有地址是指内部网络的主机地址,而公有网络地址是局域网的外部地址。
因特网地址分配组织规定以下的三个范围网络地址保留用做私有地址:
——
——
也就是说这三个范围网络的地址不会在因特网上被分配,但可以在一个企业内部使用。
各个企业根据在可预见的将来主机数量的多少,来选择一个合适的内部网络地址。
不同的企业,他们的内部网络地址可以相同。
如果一个公司选择上述三个范围之外的其他网段作为内部网络地址,则有可能会引起路的混乱。
NAT原理
NAT网络地址转换,是一个IETF标准,允许一个机构以一个公有网络地址出现在Internet上。
NAT将每个局域网节点的私有网络地址转换成一个公有网络地址,反之亦然。
它也可以应用到防火墙技术里,把私有地址隐藏起来不被外界发现,使外界无法直接访问内部网络设备,同时,它还帮助网络可以超越地址的限制,合理地安排网络中的公有网络地址和私有网络地址的使用。
NAPT(NetworkAddressandPortTranslation)网络端口地址转换,可以将外部网的公有IP及端口号与内部网络的私有网络IP及端口号相互映射。
通过这种端口重定向方式实现的NAT映射功能,可以将来自公共网络的服务请求映射到内部网络某台微机上。
例如,如果公司想以内部网络中的主机A作为对外公开的Web服务器,就得告诉NAT设备将任何访问其公网地址80端口的连接重新定向为到内部网络A主机地址的80端口。
如下图所示
图2-1
NAT端口映射应用示意图
3ADSL连接协议概述
RFC1483Bridged接入方式
RFC1483标准的制定是为了实现多种协议数据包在ATM的AAL5层的封装传送。
在协议模型上,RFC1483-Bridged方式在数据链路层对MAC帧进行LLC/SNAP或VCMUX的封装,以此来指明上层所应用的协议类型,因此可以适用于网络层上的多协议传送。
在形式上,它仿真了以太网的桥接功能,相当于将用户侧的终端设备直接挂接在网络侧的网桥设备上。
于ADSL接入设备配置为桥连接方式,理论上来说,设备后可以接多台配置为公网IP地址的微机,这些微机都可以通过网关直接接入Internet网络中。
但实际上可分配的公有IP地址并不多,很多服务提供商限制了每根线上可分配的IP个数,因此只有将IP地址设在ADSL接入设备的WAN端,然后通过NAT的方式来共享有限的IP资源,这就是目前较为常见的1483Bridged+NAT接入方式,又称为桥路方式,其接入模型如图3-1所示。
图3-1
1483Bridged+NAT接入示意图
RFC1577经典IPOA接入方式
严格的说,RFC1577并非一种接入标准,它规定了在ATM的AAL5上使用的地址解析机制,是对RFC1483Routed接入方式在ATMARP实现细节的补充。
在协议模型上,RFC1577不再转发类似ARP协议的各种以太网报文,而是通过和网络指定的ARP服务器交互ATMARP信息获得下一跳IP地址所对应的ATM地址,然后采用RFC1483LLC/SNAP或基于VC的复用方式对Routed报文进行封装处理。
RFC1577一般用于需要静态IP的商业用户,和RFC1483Bridged方式一样,可以采用带NAT功能的设备实现多台微机共享带宽。
RFC2364PPPOverATM接入方式
PPPOA接入技术根据RFC2364封装标准对PPP包进行AAL5层封装处理,形成ATM信元流,传送到网络侧的宽带接入服务器上,完成授权、认证、分配IP地址和计费等一系列PPP接入过程。
同样,可以采用带NAT功能的设备实现多台微机共享带宽。
此外,当服务商是根据PPP接入的时间进行计费时,还需要考虑ADSL设备是否具有按需拨号及自动断开功能,这样可以避免无数据访问时系统仍占用带宽,浪费网络资源及增加不必要的费用开支。
RFC2516PPPOE接入方式
早期的PPPOE接入方式,拨号程序一般放在PC机上,ADSLModem配置为简单的RFC1483Bridged桥接方式,PC机使用PPPOE客户端程序发起PPP拨号请求并获得动态的公网IP地址。
其接入模型如下图所示
图3-2
PPPOE接入示意图
为了实现多台微机带宽共享,需要将PPPOE客户端呼叫例程集成至ATUR端,其后加上NAT地址转换机制。
目前,一般带路功能的ADSL接入设备都具有这样的功能。
4开发平台的选择及搭建
产品定位
鉴于目前市场上面向低端用户的ADSL接入产品较多,价格竞争非常激烈,利润空间已急剧减缩。
我们希望开发一款针对中高端用户使用的ADSL路器产品,除了实现普通ADSL接入及简单NAT、防火墙等功能外,还具有路器产品的VPN、IPSEC、服务映射、动态路更新协议等功能,具有和CISCO兼容的配置命令集,实现即配即用,便于用户随时进行监控管理。
硬件开发平台的选择
通过调研,我们找到几款符合需求的CPU芯片,如Motorola的PowerPC850SAR、Intel的IXP225、SamSung的S5N89xx系列芯片,Virata等。
这几款芯片在性能、价格等方面的综合比较如下表所示:
CPU
Core
提供评估参考板
软件方面支持
价格
Virata
ARM
有
全套
低
MotorolaPPC850SAR
PPC850
有BSP、AAL5驱动参考例程
适当
Intel
IXP225
ARM7
有BSP,AAL、ATM业务API等模块
高
SamSung
S5N89xx
需购买
有BSP,AAL2、AAL5、ATM业务等API
表4-1硬件平台综合比较表
若从成本方面考虑,选择virata芯片比较合适,而且厂方提供了自己的操作系统及全套开发源代码,几乎已是半成品。
但测试中感觉部分协议、功能不够完善,控制台人机界面也不符合要求,还需要进行后续开发,而其提供的开发环境不够理想,代码可移植性也比较差,不利于技术积累。
IntelIXP225、SamSungS5提供的软件支持较多,已支持forTornado的1483Bridged和PPPOA等协议,也有NAT、PAT等网关路应用模块,此外,还支持VoiceOverAAL2功能。
但芯片价格相比之下也高出很多。
考虑到目前VoAAL2的应用并不明朗,很少有局端支持此项功能,所以暂不考虑这两款芯片。
MotorolaPowerPC850SAR是850系列芯片针对ADSL接入推出的专用简化版本,价格较低,其提供的软件方面支持虽然较少,但已基本符合我们的需求,后续开发的难度不会太大。
如果选择通用的Tornado开发套件进行开发,以后可以方便地迁移至IntelIXP225、IntelIXP425或SamSung等系统平台,代码的重复利用率高。
此,我们决定采用PowerPC850SAR作为核心部件,ADSL接入前端则选择兼容性较好的AlcatelDSP芯片组,总体架构如图4-1所示。
软件开发平台的选择
软件上目前流行的嵌入式操作系统有vxworks、Psos、Rtos、QNX、ulLinux等,于vxworks对PowerPC、ARM都有良好的支持,已经提供了针对Motorola开发评估板的BSP组件,并且其集成开发套件Tornado使用起来非常方便,可以有效地节省开发周期,也便于以后系统迁移,所以决定采用这款操作系统。
开发平台搭建简述
开发平台的准备包括硬件平台调试及底层驱动编写,因为篇幅有限,硬件平台的调试略过,底层驱动及软件开发环境的搭建工作仅作简单描述:
1)针对目标板与ADS板在SDRAM、Flash、Ethernet等芯片的不同,更改相应的外围器件驱动,生成新的BSP驱动,并编译生成vxworks系统的Boot代码,使其可以在新的目标板上运行。
2)在此BSP基础上创建Bootable工程,编译bootable程序代码,使其可以正常下载至目标板中运行,并能正常启动TargetShell。
此后,就可以建立downloadable工程,将应用程序以任务执行方式在目标板中进行调试。
3)编写AlcatelDSP驱动,调通ADSL物理层、ATM层的连接。
这部分工作的要点在于AlcatelDSP内部寄存器和提供目标代码都是LittleEndian模式,而PowerPC默认的总线是BigEndian模式,下载时需要对相应数据做字节或字交换。
图4-2ADSL共享接入系统软件架构示意图
这些部分调试完成后,就可以着手SAREND驱动、网络层接口及网关应用层的开发了。
软件架构系统如图4-2所示
5
SAREND驱动的编写
SAR驱动模块是参照Vxworks系统的END驱动模板编写的,基本符合MUX接口规范,其中主要的几个功能实现。
Utopia接口初始化
850SAR内部参数的全局联系结构。
是SCC各个参数表间的联系,左至右是从上级表到下级表的关系,代码实现中,对这些参数表的初始化顺序则要相反,即先初始化下级表,再初始化上级表。
具体初始化流程如下:
加载及初始化函数
sarEndLoad
系统在加载muxDevEndLoad时间接调用,是END驱动第一个被加载的例程,它根据入口参数unit,对相应AAL5通道的atmif结构表进行初始化,并调用SarAAL5Add增加相应的通道。
sarEndStart
系统在运行muxDevEndStart时间接调用,它根据入口参数unit调用SarAAL5Start函数激活相应的AAL5通道,允许其正常开始收发。
SarAAL5Add
增加一条AAL5通道,初始化这条通道的收发缓冲区,缓冲区描述字,TCT及RCT表中的相关参数值。
SarAAL5Start激活一条AAL5通道,根据通道对应的atmif结构设定PVC,上行速率。
将通道PVCMASK放入Lookup表中,激活该通道进行接收;
发送Tx_Active命令,激活该通道进行发送。
停止及卸载函数
在系统执行muxDevUnload或muxDevStop时间接调用这两个函数。
sarEndUnload
释放这个设备所占的EndObject结构资源。
但通道所占的内存资源并没有释放。
sarEndStop
停止这个接口。
并调用sarAAL5Stop函数关闭这条通道,执行与sarEndStart相反的操作。
SarAAL5Stop
解激活并关闭这条通道。
将通道PVCMASK移出Lookup表,解激活该通道,使其停止接收;
发送Tx_Deactive命令,解激活该通道,使其停止发送。
数据发送函数
函数名称:
sarEndSend
功能:
将数据发送到相应的AAL5通道中。
入口参数:
指向通道的EndObject设备结构指针,指向待发送的数据包mBlk结构指针。
返回:
发送成功,返回OK;
阻塞状态返回END_ERR_BLOCK;
其他情况返回ERROR。
流程简介:
将mBlk指向的数据包进行加封装操作,将指针及长度填入当前发送BD中即可。
(注:
为防止重入,使用到发送指示信号量,并在修改阻塞状态时给予中断保护)
中断控制流程
SCC工作在UTOPIA模式下的中断联接在IDMA1上,使用函数
Intconnect(IV_IDMA1,(VOIDFUNCPTR)sarIntr,0)
就能够在SAR发生中断时调用sarIntr函数。
此时我们将轮询整个SAR中断表,并对相应中断进行处理,为避免该中断过多占用系统资源,我们将其放置在一个netJob任务中。
同时,进入该任务后,屏蔽全局中断,直到所有的中断事件处理完毕。
数据接收处理
当Utopia接口收到来自于DSP的数据后,会提取出ATM报文头部信息,如果是AAL5通道报文,则将报文存入相应的数据缓冲区中,设置相关寄存器值,并产生Utopia数据接收中断。
系统收到中断请求后,将会进入所示的中断例程进行处理,判断是接收事件时,提取产生事件的通道号,计算出该通道对应的atmif结构起始地址,作为参数调用sarRecv函数,在函数中进行数据报文处理。
6.AAL5业务模块的实现
作为系统(Vxworks)协议栈和SAREND驱动模块之间的接口,ATMAAL5业务网络服务子层主要完成如下功能:
1)发送:
向系统注册1483Bridged、1483Routed、ATMARP、PPPOA、PPPOE等不同类型接口,根据各个接口的不同类型,对系统IP数据报文进行ATM链路封装,将封装后的数据报文发送到驱动模块并同时指示发送的VC通道;
注:
因为1483Bridged封装的是以太网帧,解封装后可视为正常的以太网数据帧,直接交协议栈处理,所以我们不需要再注册1483Bridged协议类型接口。
2)接收:
向系统注册业务类型,接收系统送来的数据报文,根据接口属性对数据报文进行解封装后提交到系统协议栈或者交其他模块处理,
3)控制:
接收系统对于接口上的控制操作,通过向mux接口注册重发例程实现数据报文重发。
vxworks网络服务子层编写规范
vxworks网络服务子层介于从OSI规范的网络层和链路层之间,主要负责处理系统网络协议栈和MUX接口之间的数据报文。
它包括接口初始化、数据结构初始化、数据收发处理、错误报告和流量控制等部分。
接口初始化
vxworks系统协议栈通过调用网络服务子层初始化例程来激活相关网络接口。
在这个例程开始处,我们需要先用muxBind函数将该服务子层绑定至相关的网络接口驱动上,使该服务子层能够从MUX层收发数据报文。
数据结构初始化
服务子层在收发相关数据报文时,可能需要申请或释放网络内存块。
为避免系统正常运行期间频繁使用系统内存块操作导致效率降低或稳定性降低,可以在初始化时预先申请一个内存区域,netBufLib所提供的netBuffer控制机制进行管理。
其它如接口的状态、服务子层数据封装类型、MUX接口初始化Cookie、服务子层地址映射表等参数结构也需要在这一步进行初始化。
数据收发处理
如上所述,网络服务子层通过muxBind函数将数据接收例程绑定至底层设备驱动。
底层设备驱动接收到报文后,通过调用stackRcvRtn函数将数据经MUX层查找特定协议类型返回至服务子层。
服务子层处理该报文之后如果返回FALSE,则系统将报文发往其它服务子层继续处理,否则,该报文被丢弃。
数据报文被封装成mBlk形式从协议栈上层发送至网络服务子层,网络服务子层对报文进行处理后,再调用muxSend或muxTkSend函数将报文通过MUX层发送至该接口设备驱动。
在这期间,网络服务子层可以通过调用该接口设备指定的地址解析函数获得二层目标地址,然后对数据帧进行二层封装。
具体的数据收发处理实例可参见AAL5Service协议数据处理流程。
错误报告
当设备驱动层向网络服务子层汇报收发或其它错误时,网络服务子层可以通过回调stackErrorRtn函数向上层报告这个错误。
设备控制
设备驱动程序需要增加相应的控制接口函数,并注册至MUX层,网络服务子层就可以通过调用muxIoCtl控制底层设备驱动。
AAL5业务Service的实现
Service层主要实现如下相关协议类型:
ATMARPService.用于收发ATMARP报文,绑定类型为0x1577
PPPOEService,用于收发PPPOE报文,绑定类型为0x8863,0x8864
PPPOAService,用于收发PPPOA报文,绑定类型为0x2516
如所介绍的,我们首先需要向MUX注册这些Service,然后在Service的收发中对相关协议的数据报文进行处理。
向vxworksMUX层注册Service
1)根据协议类型,初始化封装数据、大小等值
2)用muxBind函数绑定接收函数,使某接口收到相应类型的报文时能够提
交该函数处理。
例如,绑定ATMARP时作如下调用:
#defineMUX_PROTO_ATMARP0x1577
intunit=1;
muxBind(“pvc”,unit,(FUNCPTR)AtmSrv1483RoutedRcvRtn,NULL,NULL,NULL,MUX_PROTO_ATMARP,“AtmSrv1483RoutedRcvRtn”,unit);
/*此处,把AtmSrv1483RoutedRcvRtn函数绑定至pvc1接口,当pvc1收到0x1577类型的数据报文时,就会自动提交给该函数进行处理*/
3)初始化Service网络参数,定义报文发送时的处理函数,并向MUX层注册该Service,例程如下:
structifnet*pIfp=&
AtmSrvCtrl[unit].ifp;
bzero((char*)pIfp,sizeof(structifnet));
pIfp->
if_unit
=unit;
if_name
=ifName;
muxIoctl(AtmSrvCtrl[unit].pCookie,EIOCGFLAGS,(caddr_t)&
flags);
if_flags=flags;
if(muxIoctl(AtmSrvCtrl[unit].pCookie,EIOCGMIB2,(caddr_t)&
mib2Tbl)==ERROR)
return(ERROR);
pIfp->
if_mtu=;
if_baudrate=;
if_type=;
if_addrlen=;
if_flags|=IFF_BROA