QNX操作系统及网络设备驱动模块
uint16_t iface--接口号,可以让同一个驱动负现多个相同硬件;
void *done_hdl--该指针指向tx_done()函数需要的额外数据。
(3)向网络设备发送数据
当上层模块需要硬件传送包的时候,会调用io-net管理器的rx_down()函数。
int(*rx_down)(npkt_t*npkt,
void *func_hdl)
rx_down函数入口参数中,npkt是指向需要传送的数据的结构指针,func_hdl是相应驱动模块在io-net中的句柄。其中npt结构包含许多成员,其中的重要成员如表1所列。
表1
驱动模块在接收到io-net的调用后,就要配置网络设备,让它完成数据的发送工作。网络设备发送数据所需要的信息都会在相应的数据结构中,如net_buf_t结构中保存了等待传送的数据包的链接列表,配置DMA所需的物理地址在net_iov_t中等。驱动模块要等待硬件完成这些包的传送,并调用io-net的tx)done()函数通知上层模块驱动程序已经完成了数据的发送。
4 网络设备信息的统计
应用程序或者用户可以通过网络信息接口nicinfo工具来了解网络工作状态。信息的查询都是通过io-net来进行的。驱动程序必须维护相应的状态数据,方便io-net的查询。网络设备有一些共同的状态属性,如收到和发出的包的个数、发送错误的包的个数等,不同的网络设备还会具有不同的属性和状态,这些都可以在驱动程序中用数据结构详细列明。
需要维护的数据结构中,主要的是Nic_t,它包括四个子结构;
CustNicStats--网络信息入口;
EthernesStats_t--以太网状态;
GenStats_t--常用统计信息;
NetStats_t--网络信息(包含常用统计信息)。
以上是驱动程序需要维护的数据。当用户或应用程序要查询这些信息的时候,它们就通过Nicinfo工具对/dev/io-net/en0调用devctl()函数来取得网络信息。信息的取得是必须通过io-net来完成的,io-net对信息的查询则是通过调用io_net_register_funs_t结构中所指向的函数来取得信息的。例:
#include<sys/nic.h>
int generic_eth_devctl(void *hdl,int dcmd,void *data,size_t size,int *ret)
{
Nic_t *nic=(Nic_t *)hdl;
int status;
status=EOK;
switch(dcmd){
case DCMD_IO_NET_NICINFO;
《QNX操作系统及网络设备驱动模块(第3页)》