skb_buff 布局字段

http://www.cnblogs.com/liloke/archive/2011/11/20/2255736.html

一. sk_buff

Linux网络协议栈中主要的缓存类型。定义在include/linux/skbuff.h中,它是一个双向链表的数据结构。它的字段和函数主要分为四大类:

1. 布局字段:与整个sk_buff链表结构相关的字段

2. 通用信息字段:

3. 特性相关字段:

4. 管理功能函数:

二. sk_buff布局字段

为了很快地找到sk_buff链表中的表头,每个链表中都有一个这样的字段:

struct sk_buff_head     *list;

这个域是指向sk_buff链表头的指针。

struct sk_buff_head {
         /* These two members must be first. */
         struct sk_buff  *next;
         struct sk_buff  *prev;
 
         __u32           qlen;
         spinlock_t      lock;
};

其中qlen为链表长度,lock是与链表管理相关的字段

整个链表的结构如下:

sk_buff_list

其他字段如下:

struct sock *sk;  L4需要的字段,存储与之相关的socket信息,在其他层该字段为NULL

unsigned int len; buffer中数据的长度,包括head->next指向的主长度和分片长度

unsigned int data_len; 不同于上,该字段只指分片数据的长度

unsigned int mac_len; mac头部长度

atomic_t users; 引用计数,防止在有其他程序引用该buffer时被释放

unsigned int truesize; 表示buffer的所有长度,包括sk_buff结构自身的长度

unsigned char *head; unsigned char *end; unsigned char *data; unsigned char *tail; 这四个指针功能如下

sk_buff_head_tail_begin_end

void (*destructor)(...) 当buff被释放时,函数指针可以进行某些工作

三. 通用信息字段

struct timeval stamp; 报文接收的时间

struct net_device *dev; 根据接收到了包或者是要发送包,该指针指向的设备所扮演的角色不同

struct net_device *input_dev; 包是从哪个设备接收的

struct net_device *real_dev; 对于虚拟设备这个字段才是有意义的

union {...} h; union {...} nh; union {...} mac h是L4的头部,nh是L3的头部,mac是L2的头部。在包向上或者向下传递过程中,这些域会被依次有序地设置

head_movestruct dst_entry dst; 路由相关的字段

char cb[40]; 存放每层私有的控制数据

unsigned int csum; unsigned char ip_summed 检验和相关状态的字段

unsigned char cloned; 是否是从别的buffer复制过来的

unsigned char pkt_type; 报文类型,详见include/linux/if_packet.h

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值