linux 内核网络sk_buff布局字段 “每日读书”

本文详细解析了Linux内核中的sk_buff数据结构,它在双向链表中组织,包括sk_buff_head的特殊设计以快速定位表头,以及sk_buff中的关键字段如socket指针、数据长度等。同时介绍了如何分配、管理这些结构和相关函数如alloc_skb和destructor的用途。
摘要由CSDN通过智能技术生成

sk_buff 有些字段只是为了方便搜寻以及组织数据结构本身,内核在一个双向链表中维护所有的sk_buff结构,但是该表的组织比传统的双向链表更为复杂。

像任何双向链表一样,通过每个sk_buff 结构中的next和prev字段实现联系,next字段只想前,prev指向后,但是,这个表还有另一项必要需求,每个sk_buff 结构必须能够快速找到整个表的头,为了实现这个,在表的开端额外增加一个sk_buff_head 结构作为一种哑元元素,sk_buff_head结构是,

struct sk_buff_head {

struct sk_buff *next;

struct sk_buff *prev;

__u32 qlen;

spinlock_t lock;

}

qlen 代表表中的元素的数目,lock用于防止的并发访问在本章稍后管理函数一节予以描述

sk_buffsk_buff_head 两个元素相同nextprev指针尽管sk_buff_headsk_buff 相比实在太小但是还是允许两个结构共同存在一个表中

另外同样函数也可以用于操作sk_buffsk_buff_head二者

每个sk_buff 结构都包涵一个指针指向单一sk_buff_head 结构增加了复杂性这个指针字段名称list, 2-1 有助于了解这些数据结构关系

sk_buff其他感兴趣字段如下

struct sock *sk

这是一个指针指向拥有缓冲区套接字sock数据结构数据本地产生或者正由本地进程接收就需要这个指针因为数据以及套接字相关信息L4(TCP或者UDP)以及用户应用程序使用缓冲区只是转发指针就是NULL

unsigned int len

这是缓冲区数据区块大小这个长度包括主要缓冲区数据以及一些片段数据缓冲区从一个网络分层移往下一个网络分层时候就会变化因为协议栈往上移动报头就会被丢弃但是往下移动时候就会添加进来len也会协议报头算在内数据预留对齐skb_reserve,skb_put, skb_push 以及skb_pull 一节中国呢2-8所示

unsigned int data_len

len不同data_len 计算片段数据大小

unsigned int mac_len

MAC报头大小

atomic_t user

这是引用计数或者使用这个sk_buff缓冲区实例树木这个参数主要用途避免某人依然使用sk_buff结构这个结构释放因此缓冲区每个用户必要都要递增递减字段计数器计算sk_buff数据结构用户缓冲区所包含实际数据一个相似字段dataref 所包含本章稍后skb_shared_info 结构skb_shinfo 函数一节予以介绍

users 有时直接atomic_incatomic_dec函数递增递减但是大多数情况下采用skb_getkfree_skb 进行处理

unsigned int truesize

此字段代表缓冲区大小包括sk_buff结构本身缓冲区得到所分配len字符数据请求空间字段初始化alloc_skb函数设置成len + sizeof(sk_buff)

struct sk_buff *alloc_skb(unsigned int size, int gfp_mask)

{

skb->truesize = size + sizeof(struct sk_buff);

}

每当skb->len增加字段就会得到更新

unsigned char *head;

unsigned char *end;

unsigned char *data;

unsigned char *tail

这些字段代表缓冲区边界一起其中数据每当一个分层工作准备缓冲区可能会一个报头或者更多数据分配更多空间headend指向已经分配缓冲区空间开端尾端datatail指向实际数据开端尾端参见2-2所示然后分层可以吧headdata之间空隙填上一个协议报头或者数据填入tailhead之间空隙稍后分配内存alloc_skb dev_alloc_skb 一节中就会知道2-2右边缓冲区底端包含一个附加报头

void (*destructor)(...)

函数可以初始化为一个函数缓冲区删除完成某些工作缓冲区不属于一个套接字destructor 通常不湖北初始化缓冲区属于一个套接字通常吧设置sock_kfree或者sock_wfree 这两个sock_xxx函数可用于更新套接字队列中所持有内存

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值