论文首页哲学论文经济论文法学论文教育论文文学论文历史论文理学论文工学论文医学论文管理论文艺术论文 |
#define MUX_PROTO_ATMARP 0x1577
int unit = 1;
muxBind(“pvc”, unit ,(FUNCPTR) AtmSrv1483RoutedRcvRtn, NULL,NULL,NULL, MUX_PROTO_ATMARP, "AtmSrv1483RoutedRcvRtn", unit);
/* 此处,把 AtmSrv1483RoutedRcvRtn 函数绑定至pvc1接口,当pvc1收到 0x1577 类型的数据报文时,就会自动提交给该函数进行处理 */
3) 初始化 Service 网络参数,定义报文发送时的处理函数,并向 MUX 层注册该Service,例程如下:
struct ifnet* pIfp = &AtmSrvCtrl[unit].ifp;
bzero ((char *) pIfp, sizeof (struct ifnet));
pIfp->if_unit = unit;
pIfp->if_name = ifName;
muxIoctl(AtmSrvCtrl[unit].pCookie, EIOCGFLAGS, (caddr_t)&flags);
pIfp->if_flags = flags;
if (muxIoctl(AtmSrvCtrl[unit].pCookie, EIOCGMIB2, (caddr_t)&mib2Tbl) == ERROR)
return (ERROR);
pIfp->if_mtu = mib2Tbl.ifMtu;
pIfp->if_baudrate = mib2Tbl.ifSpeed;
pIfp->if_type = mib2Tbl.ifType;
pIfp->if_addrlen = mib2Tbl.ifPhysAddress.addrLength;
pIfp->if_flags |= IFF_BROADCAST;
if (muxIoctl (AtmSrvCtrl[unit].pCookie, EIOCGHDRLEN, (caddr_t)&ifHdrLen)!= OK)
pIfp->if_hdrlen = 0;
else
pIfp->if_hdrlen = (UCHAR)ifHdrLen;
pIfp->if_init = NULL;
pIfp->if_ioctl = ifIoCtrl;
/* 在这里定义该协议类型报文发送时要调用的处理函数 */
pIfp->if_output = AtmSrv1483RoutedService;
pIfp->if_reset = NULL;
pIfp->pCookie = AtmSrvCtrl[unit].pCookie;
pIfp->if_resolve = NULL;
pIfp->if_flags |= (IFF_UP | IFF_RUNNING | IFF_NOTRAILERS | IFF_NOARP);
if(atmif[unit].ifp)
if_dettach(atmif[unit].ifp);
/* 向 MUX 层注册该 Service */
if_attach (pIfp);
6.2.2 Service 数据结构初始化
我们定义 AAL5 业务网络服务子层的数据结构如下:
typedef struct atm_srv_ctrl
{
int tLinkType; /* 定义协议类型*/
int encapLength; /* 定义该协议封装用的 PDU 大小*/
char encapData[50]; /* 该协议使用的 PDU 内容 */
END_OBJ * pCookie; /* 底层设备驱动单元索引 */
struct ifnet ifp; /* 注册后返回的网络服务子层索引*/
}ATM_SRV_CTRL;
其中:
tLinkType 定义的协议类型主要有RFC1483Bridged, RFC1483Routed, ATMARP,PPPOA,PPPOE等。在 atmifAttach 例程中,就是将该值作为协议类型参数调用 muxBind 函数的。
EncapLength、EncapData 针对 RFC1483Bridged、RFC1483Routed、ATMARP 等协议的规定进行相应初始化及数据填充,供底层驱动在封装、解封装时直接作为依据。
PCookie 是 muxBind 底层设备驱动后返回的设备索引号,以便系统卸载网络服务子层时可解除该绑定。
Ifp 是网络服务子层 Attach至协议栈时返回的子网接口索引号,以便系统卸载该 Service 时可解除绑定。
6.2.3 Service 协议数据收发流程
Service 正确绑定至协议栈后,就可以接收SAR END驱动层传入的该协议类型数据报文并对其处理,根据处理的结果选择转发或丢弃;对于协议栈下发的报文,也可以方便地进行相应协议封装,再交给 END驱动发送。其收发流程框图如图 6-1 所示。
(科教作文网http://zw.ΝsΕAc.com发布)
图6-1 Service 收发流程示意图
接收流程(虚线箭头所示):
1)SAR 模块收到报文,产生中断,进入接收中断处理例程
2)调用END_RCV_RTN_CALL将报文返回给协议栈(reserved 中存放协议类型)
3)MUX层询问该报文的协议类型
4)SAR驱动层将 reserved 中的类型返回给MUX层
5)MUX层根据协议类型将报文提交给相应的 Service.
6)Service 解封装后,调用 do_protocol_with_type将报文提交给协议栈
发送流程(实线箭头所示):
1)协议栈通过MUX层发送报文
2)MUX 层将报文传给预先绑定的 Service
3)Service 对数据进行封装后,return False,将数据返回 MUX 层
4)MUX 层将数据发送到 SAR 模块相应的 PVC 接口
5)SAR 模块相应的 PVC 接口发送该报文。
6.3 RFC1483协议报文处理
由于 RFC1483数据报文的封装格式比较简单,我们将该类型报文的封装、解封装例程放在 END 驱动中实现,以提高系统对该类型报文的处理效率。
6.3.1 RFC1483 报文封装格式
RFC1483 标准描述了ATM网络上承载无连接网络互连业务(即路由和桥接的协议数据单元)的两种不同方法。第一种方法允许在一条 ATM 虚电路上复用多个协议,这是需要在所传送的 PDU 前加上 IEEE802.2 链路控制信头,以此来表示所传递的 PDU 的协议,这种方法称为 LLC 封装; 第二种方法是一个高层协议由一条ATM虚电路来承载,这种方法成为基于 VC 的复用。
6.3.1.1 LLC 封装
在 LLC 封装中,路由协议通过在 PDU 前加一个