[直接收取以太网帧]
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 评论:
发表评论