net_device 结构处于网络驱动层的非常核心的位置并且值得完全的描述. 这个列表描述
了所有成员, 更多的是提供了一个参考而不是用来备忘. 本章剩下的部分简要地描述了每
个成员, 一旦它用在例子代码上, 因此你不需要不停地回看这一节.
全局信息
结构 net_device 的第一部分是由下面成员组成:
char name[IFNAMSIZ];
设备名子. 如果名子由驱动设置, 包含一个 %d 格式串, register_netdev 用一个
数替换它来形成一个唯一的名子; 分配的编号从 0 开始.
unsigned long state;
设备状态. 这个成员包括几个标志. 驱动正常情况下不直接操作这些标志; 相反,
提供了一套实用函数. 这些函数在我们进入驱动操作后马上讨论这些函数.
struct net_device *next;
全局列表中指向下一个设备的指针. 这个成员驱动不能动.
int (*init)(struct net_device *dev);
一个初始化函数. 如果设置了这个指针, 这个函数被 register_netdev 调用来完
成对 net_device 结构的初始化. 大部分现代的网络驱动不再使用这个函数; 相反,
初始化在注册接口前进行.
硬件信息
下面的成员包含了相对简单设备的低层硬件信息. 它们是早期 Linux 网络的延续; 大部
分现代驱动确实使用它们(可能的例外是 if_port ). 我们为完整起见在这里列出.
unsigned long rmem_end;
unsigned long rmem_start;
unsigned long mem_end;
unsigned long mem_start;
设备内存信息. 这些成员持有设备使用的共享内存的开始和结束地址. 如果设备有
不同的接收和发送内存, mem 成员由发送内存使用, rmem 成员由接收内存使用.
rmem 成员在驱动之外从不被引用. 惯例上, 设置 end 成员, 所以 end – start
是可用的板上内存的数量.
unsigned long base_addr;
网络接口的 I/O 基地址. 这个成员, 如同前面的, 由驱动在设备探测时赋值.
ifconfig 目录可用来显示或修改当前值. base_addr 可以当系统启动时在内核命
令行中显式赋值( 通过 netdev= 参数), 或者在模块加载时. 这个成员, 象上面描
述过的内存成员, 内核不使用它们.
unsigned char irq;
安排的中断号. 当接口被列出时 ifconfig 打印出 dev->irq 的值. 这个值常常在
启动或者加载时间设置并且在后来由 ifconfig 打印.
unsigned char if_port;
在多端口设备中使用的端口. 例如, 这个成员用在同时支持同轴线
(IF_PORT_10BASE2)和双绞线(IF_PORT_100BSAET)以太网连接. 完整的已知端口类
型设置定义在 <linux/netdevie.h>.
unsigned char dma;
设备分配的 DMA 通道. 这个成员只在某些外设总线时有意义, 例如 ISA. 它不在
设备驱动自身以外使用, 只是为了信息目的( 在 ifconfig ) 中.
接口信息
有关接口的大部分信息由 ether_setup 函数正确设置(或者任何其他对给定硬件类型适合
的设置函数). 以太网卡可以依赖这个通用的函数设置大部分这些成员, 但是 flags 和
dev_addr 成员是特定设备的, 必须在初始化时间明确指定.
一些非以太网接口可以使用类似 ether_setup 的帮助函数. deviers/net/net_init.c 输
出了一些类似的函数, 包括下列:
void ltalk_setup(struct net_device *dev);
设置一个 LocalTalk 设备的成员
void fc_setup(struct net_device *dev);
初始化光通道设备的成员
void fddi_setup(struct net_device *dev);
配置一个光纤分布数据接口 (FDDI) 网络的接口
void hippi_setup(struct net_device *dev);
预备给一个高性能并行接口 (HIPPI) 的高速互连驱动的成员
void tr_setup(struct net_device *dev);
处理令牌环网络接口的设置
大部分设备会归于这些类别中的一类. 如果你的是全新和不同的, 但是, 你需要手工赋值
下面的成员:
unsigned short hard_header_len;
硬件头部长度, 就是, 被发送报文前面在 IP 头之前的字节数, 或者别的协议信息.
对于以太网接口 hard_header_len 值是 14 (ETH_HLEN).
unsigned mtu;
最大传输单元 (MTU). 这个成员是网络层用作驱动报文传输. 以太网有一个 1500
字节的 MTU (ETH_DATA_LEN). 这个值可用 ifconfig 改变.
unsigned long tx_queue_len;
设备发送队列中可以排队的最大帧数. 这个值由 ether_setup 设置为 1000, 但是
你可以改它. 例如, plip 使用 10 来避免浪费系统内存( 相比真实以太网接口,
plip 有一个低些的吞吐量).
unsigned short type;
接口的硬件类型. 这个 type 成员由 ARP 用来决定接口支持什么样的硬件地址.
对以太网接口正确的值是 ARPHRD_ETHER, 这是由 ether_setup 设置的值. 可认识
的类型定义于 <linux/if_arp.h>.
unsigned char addr_len;
unsigned char broadcast[MAX_ADDR_LEN];
unsigned char dev_addr[MAX_ADDR_LEN];
硬件 (MAC) 地址长度和设备硬件地址. 以太网地址长度是 6 个字节( 我们指的是
接口板的硬件 ID ), 广播地址由 6 个 0xff 字节组成; ether_setup 安排成正确
的值. 设备地址, 另外, 必须以特定于设备的方式从接口板读出, 驱动应当将它拷
贝到 dev_addr. 硬件地址用来产生正确的以太网头, 在报文传递给驱动发送之前.
snull 设备不使用物理接口, 它创造自己的硬件接口.
unsigned short flags;
int features;
接口标志(下面详述)
这个 flags 成员是一个位掩码, 包括下面的位值. IFF_ 前缀代表 “interface flags”.
有些标志由内核管理, 有些由接口在初始化时设置来表明接口的能力和其他特性. 有效的
标志, 对应于 <linux/if.h>,