除了稍早讨论的net_device 结构的列表管理字段外,还有一些字段用于管理一些结构,确保这些结构在不需要时能予以删除。
atomic_t refcnt
引用计数,此计数器变为零之前,设备无法除名,参见第八章。
int watchdog_timeo
struct timer_list watchdog_timer
配合先前讨论的tx_timeout变量,这些字段实现了第十一章 看门狗定时器,一节所讨论的定时器。
int (*poll)(...)
struct list_head poll_list
int quota
int weight
由NAPI 功能使用,对此在第十章予以描述
const struct iw_handler_def *wireless_handlers
struct iw_public_data *wireless_data
其他无线设备使用的参数和函数指针。还可以参见get_wireless_stats
struct list_head todo_list
网络设备的注册和除名是以两步骤进行的,todo_list用于处理第二步骤。参见第八章。
struct class_device class_dev
由新的通用内核驱动程序基础架构使用。
函数指针
我们在第一章中看到,网络代码大量使用了函数指针,net_device数据结构中也有不少的函数指针,这类函数主要用于。
传输和接收帧
在缓冲区上添加或者解析链路层的报头
改变配置的一部分
获取统计数据
与特定功能交互。
前几节说明完成特定任务所需的字段时,已经介绍了一些函数指针,以下是通用的函数指针。
struct ethtool_ops *ethtool_ops
指向一组函数指针的指针,用于设置或者取出不同设备参数的配置,参见第八章Ethtool 一节。
int (*init)(...)
void (*uninit)(...)
void (*destructor)(...)
int (*open)(...)
int (*stop)(...)
同于初始化,清理,销毁,开启以及关闭一个设备,不是所有函数都会被用到,参见第八章。
struct net_device_stats * (*get_stats)(...)
struct iw_statistics* (*get)wireless_stats)(...)
设备驱动程序所收集的一些统计数据可以使用用户空间应用程序予以显示,如ifconfig和ip
而其他统计数据则严格由内核使用,贲张稍早的设备状态一节对此已经有讨论,这两种方法用于收集统计数据,get_stats 针对一般设备,而get_wireless_stats 针对无线设备,还可以参见稍早的统计数据一节。
int (*hard_start_xmit)(...)
用于传输一个帧,参见第十一章
int (*hard_header)(...)
int (*rebuild_header)(...)
int (*hard_header_cache)(...)
void (*header_cache_update)(...)
int (*hard)header_parse)(...)
int (*neigh_setup)(...)
由邻居层使用,参见第二十七章的设备驱动程序提供的方法,以及邻居初始化两节。
int (*do_ioctl)()
ioctl系统调用,用于向设备发出命令,调用此方法可以处理一些ioctl命令
void (*set_multicast_list)(...)
在链路层多播,一节已经知道mc_list和mc_count用于管理L2多播地址列表, 这个方法用于要求设备驱动程序配置设备以坚挺这些地址,通常不会直接调用此方法,而是通过包裹函数,如dev_mc_upload 或者其无锁版本__dev_mc_upload 当一个设备无法安装多播地址列表时,就只会将其全部开启。
int (*set_mac_address)(...)
改变设备的mac地址,当设备没有提供此功能时,就会是NULL
int (*set_config)(...)
配置驱动参数,比如硬件参数irq, io_addr以及以及if_port, 较高分层的参数,是由do_ioctl 来处理的,使用此方法的设备不是很多,特别是能实现探测函数的新设备。可以在drivers/net/sis900.c中的,sis900_set_config 一个好的例子及其说明。
int (*change_mtu)(...)
改变设备的MTU值,改变此字段对设备驱动程序没有影响,只是强制内核软件接受新的MTU,再根据此处理分段。
void (*tx_timeout)(...)
再看门狗定时器到期的时候调用这个函数,用于确认该次传送事都花了一段可能很长的时间才完成,只有定义了该方法,看门狗定时器才会启动,参见第十一章 看门狗定时器一节的更多信息。
int (*accept_fastpath)(...)
快速交换是一种内核功能, 允许设备驱动程序在终端期间使用一个小的缓存来用路由输入的流量,也称为fastroute。