重要数据结构
网络设备的关键数据结构是net_device,它不仅包含了网络接口所使用的中断、地址、实际函数等硬件信息,也包含相关的上层网络协议的内容,它是网络和内核的接口。Net_device适用于所有的网络接口,结构比较复杂。在此分四个方面对它进行介绍。 通用部分 net_device的这些项内容用于管理网络设备不和具体协议相关。 char *name:设备的名字,例如eth0,如果不指定,在设备登记时register_netdev()函数将会自动指定一个; struct device *next:指向下一个网络设备,用于维护整个网络设备链表; struct module *owner:在模块加载时指向模块的所有者; int ifindex:提供快速查找网络设备的索引; unsigned long state:包含网络设备的状态信息。 硬件相关部分 标识设备使用的共享内存的首地址及尾地址,包括如下域段: 如果设备用来接收和发送的内存块不同,则mem域段用来标识发送的内存位置,rmem用来标识接收的内存位置。mem_start和mem_end可在系统启动时用内核的命令行指定,用ifconfig命令可以查看它们的值。rmem域段从来不被驱动程序以外的程序所引用。I/O基地址和中断号。对于嵌入式系统,这两个值基本是固定的,在PCI总线连接中它们可以在设备检测期间被赋值,但也可以在系统启动时指定传入(如传给LILO)。ifconfig命令可显示及修改它们的当前值。 unsigned char if_port:记录哪个硬件I/O端口正在被接口所用,如BNC,AUI; unsigned char dma:设备用的DMA通道; void *priv:是指向私有数据的指针。 私有数据是个很重要的结构,硬件不同这个结构内部的定义也不相同,不过一般都包括struct enet_statistics这个结构,用于记录网络设备各种统计信息。因为这些统计信息即使在接口卸下(down)时也要保存。所以私有数据总是在设备初始化时,而不是在设备打开时分配内存空间的。 物理层相关数据 以下这些数据是针对于网络接口使用的各种不同的物理层的,对于以太网设备一般可直接调用ether_setup函数自动完成填写,像token ring、FDDI等其他接口一般也有类似函数完成这些域段的填写。 unsigned short mtu这个域段表示{zd0}数据传输单元,对以太网而言,该域段为1500,不包括MAC帧的帧首和帧尾。 unsigned short type这个域段表示接口的硬件类型,描述了与该网络接口绑在一起的媒介类型。Linux网络设备支持许多不同种类的媒介,如以太网、X.25、令牌环、SLIP、PPP、Apple Localtalk等。ARP在判定接口支持哪种类型的物理地址时要用到该域段。若是以太网接口,则在ether_setup中将之设为ARPHRD_ETHER。 Unsigned long tx_queue_len这个域段表示一个设备的传输队列能容纳的{zd0}的帧数。对以太网,默认为100;而plip则为节省系统资源,仅设为10。 unsigned short hard_header_len这个域段表示在被传送的包中IP头和其他协议信息之前的字节数。对于以太网接口,该域段为14。 这几个域段提供数据链路层所需要的各种地址信息。这两个域段表示在数据链路层提供多播协议要使用的一些信息。 网络层协议相关部分 网路层协议包括8个不同的域段,下面分别讲它们的作用。 下面这域段标识本设备支持的网络层协议地址簇。大部分为AF_INET(因特网IP协议)。 下面三个域段分别描述接口的网络层协议地址、协议广播地址和协议的网络掩码。若dev->family为AF_INET,则它们即为IP地址。这些域段可用ifconfig命令赋值。下面这个域段表示网络层协议地址的长度。对于IP协议(AF_INET)值为4。 下面这个域段表示点对点协议接口(如SLIP、PPP)用这个域记录连接另一边设备的IP值。 下面域段用于多播协议(Muticast),网络层相关信息。 下面的域段包含一系列开关值,开关值有的是描述设备属性,有的表示设备现在的状态。最常用的一个就是IFF_UP表示设备是否被xx。这些开关值都可以用ifconfig命令设置。 服务处理部分 除了各种数据域段外,net_device还提供一系列函数指针,这些函数指针把统一的操作接口映射为实际的硬件操作函数。这些函数指针和实现函数在下几节中还会详细介绍,在此就不再说明了。 |