2009年1月6日星期二

vxWorks通过MUX直接操作底层网络数据的方法

[直接收取以太网帧]

VxWorks为FEI82559提供的驱动源程序是在\target\src\drv\end下的增强型网络驱动fei82557End.c。通过netFuncs结构体可以看出,82559注册到上层的接收函数有2个:一个是中断方式的fei82557Receive();另一个是查询方式的fei82557PollReceive( )。其中前者是由中断服务程序fei82557HandleRecvInt调用,而后者是由用户主动调用。由于它们都是LOCAL型的函数,所以上层任务不能直接调用,而要通过函数的注册点也就是MUX层间接调用,并且要提供网络控制器的设备注册入口— DRV_CTRL结构指针给函数,这时就可以对收到的数据直接处理或存储下来交给上层任务了。

MUX层绑定一muxBind().VxWorks 使用muxBind将网络服务绑定到网络驱动程序上,它的函数原型是:

vo id * mu xBind

{

cha * pName,

int unit ,

BOOL ( *stackRcvRtn)( void*long,M _BLK_ID,LL _HDR_INFO*void*)

STATUS (*stackShutdownRtn)( void*,void*)

STATUS (*stackTxRestartRtn)( void*,void*)

void ( *stackErrorRtn) (END_OBJ*END_ERR*void*)

long type,

cha r *pProtoName,

void *pSpan

}

特别说明一下type参数,这是定义的协议类型,主要有MUX_ P ROTO_ SNARF,MU X_ PROTO_OUTPUT,M UX_ PROTO_ PROMISC三种,当定义为SNARF类型时,绑定的服务相当于一个防火墙,先于其他所有服务处理数据帧。调用muxBind)后返回一个标识网络驱动程序的cookie,且MUX已经为该驱动程序绑定了一项服务。该服务要使用其他的MUX函数,只需对这个cookie进行跟踪就可以了。

[直接发送以太网帧]

与收取类似,发送也可以使用驱动中的函数。netFunCS中注册到上层的函数指针中,fei82557Send()Fei8255757Pollsend()是用来发送数据的,其中fei8257Pollsend使用的是查询方式。同样,需要从MUX 层调用这些接口,有2种方法: 调用muxSend(),而且也要提供cokie的指针作为参数,其实,cokie指针就是DRV _CTRL的人口点,它们本质上都是设备驱动的注册人口; muxloctl(),需要在fei82557End.c中的fei82557Ioctl()添加新的IOCTL(IO控制)服务,通过这个接口间接调用fei82557Pollsend(),调用的顺序为muxIoctl()-fei82557Ioctl()-fei82557Pollsend()。需要指出的是,通过这些接口发送的数据必须要按照netBufLib规定的数据格式构造。netBuflib是用于建立专用于网络接口驱动程序和网络服务(协议)的存储池的管理库,详情可以参阅windRiver的附录。

0 评论: