POE等不同类型接口(interface),根据各个接口的不同类型,对系统IP数据报文进行ATM链路封装,将封装后的数据报文发送到驱动模块并同时指示发送的VC通道; 注:因为Bridged封装的是以太网帧,解封装后可视为正常的以太网数据帧,直接交由协议栈处理,所以我们不需要再注册Bridged协议类型接口。
)接收:向系统注册业务类型,接收系统送来的数据报文(由驱动模块接收,并由系统根据接收的数据报文业务类型进行分发),根据接口属性对数据报文进行解封装后提交到系统协议栈或者交由其他模块处理, )控制:接收系统对于接口上的控制操作(主要是根据vxworksnetworkservices提供的规范完成),通过向mux接口注册重发例程实现数据报文重发。
. vxworks网络服务子层编写规范 vxworks网络服务子层介于从OSI规范的网络层和链路层之间,主要负责处理系统网络协议栈和MUX接口之间的数据报文。
它包括接口初始化、数据结构初始化、数据收发处理、错误报告和流量控制(可选)等部分。
.. 接口初始化 vxworks系统协议栈通过调用网络服务子层初始化例程(函数名称为xxxAttach)来激活相关网络接口。
在这个例程开始处,我们需要先用muxBind函数将该服务子层绑定至相关的网络接口驱动上,使该服务子层能够从MUX层收发数据报文。
.. 数据结构初始化 服务子层在收发相关数据报文时,可能需要申请或释放网络内存块。
为避免系统正常运行期间频繁使用系统内存块操作导致效率降低或稳定性降低,可以在初始化时预先申请一个内存区域,由netBufLib所提供的netBuffer控制机制进行管理。
其它如接口的状态、服务子层数据封装类型、MUX接口初始化Cookie、服务子层地址映射表等参数结构也需要在这一步进行初始化。
.. 数据收发处理 如上所述,网络服务子层通过muxBind函数将数据接收例程绑定至底层设备驱动。
底层设备驱动接收到报文后,通过调用stackRcvRtn函数将数据经由MUX层查找特定协议类型返回至服务子层。
服务子层处理该报文之后如果返回FALSE,则系统将报文发往其它服务子层继续处理,否则,该报文被丢弃。
数据报文被封装成mBlk形式从协议栈上层发送至网络服务子层,网络服务子层对报文进行处理后,再调用muxSend或muxTkSend函数将报文通过MUX层发送至该接口设备驱动。
在这期间,网络服务子层可以通过调用该接口设备指定的地址解析函数获得二层目标地址,然后对数据帧进行二层封装。
具体的数据收发处理实例可参见.. AALService协议数据处理流程。
.. 错误报告 当设备驱动层向网络服务子层汇报收发或其它错误时,网络服务子层可以通过回调stackErrorRtn函数向上层报告这个错误。
.. 设备控制 设备驱动程序需要增加相应的控制接口函数(如xxxIoCtrl)并注册至MUX层,网络服务子层就可以通过调用muxIoCtl控制底层设备驱动。
. AAL业务Service的实现 Service层主要实现如下相关协议类型: ATMARPService. 用于收发ATMARP报文,绑定类型为x PPPOE Service 用于收发PPPOE报文,绑定类型为xx PPPOA Service 用于收发PPPOA报文,绑定类型为x 如.所介绍的,我们首先需要向MUX注册(绑定)这些Service,然后在Service的收发中对相关协议的数据报文进行处理。
.. 向vxworksMUX层注册Service 根据协议类型,初始化封装数据、大小等值 用muxBind函数绑定接收函数,使某接口收到相应类型的报文时能够提 交该函数处理。
例如(代码摘选自atmSrv.c atmSrvRoutedAttach函数),绑定ATMARP时作如下调用: define MUX_PROTO_ATMARP x intunit muxBind“pvc”unitFUNCPTRAtmSrvRoutedRcvRtnNULLNULLNULLMUX_PROTO_ATMARPAtmSrvRoutedRcvRtnunit /此处,把AtmSrvRoutedRcvRtn函数绑定至pvc接口,当pvc收到x类型的数据报文时,就会自动提交给该函数进行处理/ 初始化Service网络参数,定义报文发送时的处理函数,并向MUX层注册该Service,例程如下: structifnetpIfpAtmSrvCtrlunit.ifp bzerocharpIfpsizeofstructifnet pIfp-if_unit unit pIfp-if_name ifName muxIoctlAtmSrvCtrlunit.pCookieEIOCGFLAGScaddr_tflags pIfp-if_flagsflags ifmuxIoctlAtmSrvCtrlunit.pCookieEIOCGMIBcaddr_tmibTblERROR returnERROR pIfp-if_mtumibTbl.ifMtu pIfp-if_baudratemibTbl.ifSpeed pIfp-if_typemibTbl.ifType pIfp-if_addrlenmibTbl.ifPhysAddress.addrLength pIfp-if_flags IFF_BROADCAST ifmuxIoctlAtmSrvCtrlunit.pCookieEIOCGHDRLENcaddr_tifHdrLenOK pIfp-if_hdrlen else pIfp-if_hdrlenUCHARifHdrLen pIfp-if_init NULL pIfp-if_ioctl ifIoCtrl /在这里定义该协议类型报文发送时要调用的处理函数/ pIfp-if_outputAtmSrvRoutedService pIfp-if_reset NULL pIfp-pCookieAtmSrvCtrlunit.pCookie pIfp-if_resolveNULL pIfp-if_flagsIFF_UPIFF_RUNNINGIFF_NOTRAILERSIFF_NOARP ifatmifunit.ifp if_dettachatmifunit.ifp /向MUX层注册该Service/ if_attachpIfp .. Service数据结构初始化 我们定义AAL业务网络服务子层的数据结构如下: typedef structatm_srv_ctrl int tLinkType /定义协议类型/ int encapLength /定义该协议封装用的PDU大小/ char encapData /该协议使用的PDU内容/ END_OBJ pCookie /底层设备驱动单元索引/ structifnet ifp /注册后返回的网络服务子层索引/ ATM_SRV_CTRL 其中: tLinkType定义的协议类型主要有RFCBridgedRFCRoutedATMARP,PPPOA,PPPOE等。
在atmifAttach例程中,就是将该值作为协议类型参数调用muxBind函数的。
上一篇:
计算机毕业设计系统下载
下一篇:
村落共同体的核心架构研究