这些函数会操作sk_buff 元素列表,列表也称为队列(queue), 函数完整的列表参见<include/linux/skbuff.h>和<net/core/skbuff.c> 一些最常用的函数如下。
skb_queue_head_init
用一个元素为空的队列对sk_buff_head
skb_queue_head, skb_queue_tail
把一个缓冲区分别添加到队列的头或尾
skb_dequeue,skb_dequeue_tail
把一个元素分别从队列头或者尾去掉,第二个函数可能应该成为skb_dequeue_head, 才能与其他队列函数之名相称。
skb_queue_purge
吧队列变为空队列
skb_queue_walk
依次循环运行队列里中的每个元素。
这类函数都必须以原子方式执行,也就是说, 他们必须为此队列抓住sk_buff_head结构所提供的回转锁。否则,可能会被指向队列添加元素或者从队列中删除元素等异步事件所终端,如到期定时器所调用的函数,将导致竞争的情况。race condition
因此,每个函数按照以下方式实现。
static inline function_name(parameter_list)
{
unsigned long flags;
spinlock_irqsave(...);
__function_name(parameter_list);
spin_unlock_irqrestore();
}
此函数内有一个包裹函数会取得会转锁,然后调用一个以两个下划线符号开头命名的函数,接着再放开锁。
关键数据结构
net_device结构。
net_device数据结构存储着特定网络设备的所有信息。每个设备都有一个这种结构,无论是真实设备,还是虚拟设备,本节中,接口和设备量词事交替使用的,不过在其他情况下,这两个词之间的差异是很重要的。
所有设备的net_device 结构放在一个由全局变量dev_base所指的全局列表中,此数据结构定义在Include/linux/netdevice.h中,网络设备的注册在第八章中描述,在第八章中会详细描述,net_device 的大多数字段如何做初始化以及初始化的时机。
如同sk_buff,这个结构相当庞大,包括Ethernet卡和Token Ring卡,虽然对同一种类型的所有设备而言,net_device 结构的某些字段会置成相同的值,但是有些字段则必须由每种设备模型做不同的设置,因此,对几乎所有类型而言,linux都提供了一个通用的函数,可以对一些参数做初始化,使其值在所有模型之间都一样,除了针对其模型设置那些具有特定值的字段外,每个设备驱动程序都会启用此函数。驱动程序还可以改写一些已经由内核初始的字段,更多细节参见第八章。
net_device 结构的字段可以分成以下几种类型。
配置 configuration
统计数据 statistics
设备状态 Device status
列表管理 list management
bonding 也称为etherChannel 和trunking 允许一组接口群集起来,视为单一接口,当系统需要以高带宽支持点对点联机时,这种功能就有用处,速度的增加计划可以达到线性,而虚拟接口的吞吐几乎等于个别接口的吞吐量总和。
VLAN 指的是virtual LAN。VLAN的使用是一种方便的方式,通过给Ethernet帧附加VLAN标签,就可以吧使用相同L2交换的,在不同的广播域中的流量隔离出来。
流量管理Traffic management
功能专用 Feature specific
通用 Generic
函数指针 VFT