linux 的流量控制子系统已有长足的进步,并且代表着linux内核实力的一方面。相关联的内核选项为Device drivers ->networking support networking options -?Qos and/or fair queueing, net_device 结构中的相关字段包括
struct net_device *next_ched
由软中断之一使用,对此在第十一章给出了描述。
struct Qdisc *qdisc
struct Qdisc *qdisc_sleeping
struct QDisc *qdisc_ingress
struct list_headqdisc_list
这些字段用于管理入口和出口的封包队列,以及不同CPU对此设备的访问。
spinlock_queue_lock
spinlock_t ingress_lock
流量控制子系统位每个网络设备定义了一个私有的出口队列,quuee_lock用于避免队列的并发访问,ingress_lock则是针对入口流量做相同的事情。
unsigned long tx_queue_len
设备的传送队列的长度,当内核支持流量控制时,可能不用tx_queue_len ,表2-2所列是最常见设备类型所采用的值,其值可以通过sysfs 文件系统予以调整。
表2-2 不同设备类型tx_queue_len值。
设备类型
Ethernet 1000
Token Ring 100
EtherChannel 100
FibreChannel 100
表2-2, 不同设备类型的tx_queue_len
设备类型
FDDI 100
TEQL 100
ISDN 30
HIPPI 25
PLIP 10
SLIP 10
AX25 10
EQL 5
Generic PPP 3
Bonding 0
loopback 0
Bridge 0
VLAN 0
TEQL 是队列规则之一,可以用流量控制Qos层进行配置。
根据所用的队列规则决定输入和输出的封包队列的策略,可能会用到tx_queue_len ,但是也可能用不到,当队列类型为FIFO First In, First Out先进先出,或者相当简单的队列时,通常就会使用到它。
注意,所有对了长度为0的设备都是虚拟设备,虚拟设备依赖相关莲的真实设备去做所有的队列化工作。
功能专用
如说明sk_buff 时所见,只有当所属的功能包含在内核时,那些参数才会出现在net_device 的定义中。
struct divert_blk *divert
分流器是一种功能,允许你改变输入的封包的源和目的地址,因此,有可能以此配置所指定的特定特征重新绕送流量到不同的接口或者不同的主机,此字段所指的数据结构存储了分流器功能所需要的参数,相关联的内核选项位Device Drivers -<Networking support->Networking options,->Frame Diverter
struct net_bridge_port *br_port
当此设备配置成桥接端口时,就需要额外的信息,桥接代码和STP 会在第四部分讨论,相关联的内核选项位Device Drivers->networking support->Networking options->802.1d Ethernet Bridging
void (*vlan_rx)register)()
void (*vlan_rx_add_vid){}
void (*vlan_rx_kill)_vid){...}
这三个函数指针由VLAN代码所用,分别是把设备注册位拥有VLAN标记功能,把VLAN添加到设备以及从设备中删除VLAN,相关联的内核选项位Device Drivers->Networking support->networking options
int netpoll_rx
void (*poll_contoller){...}
由选项的Netpoll功能使用。