struct sk_buff在内核2.6.24版本以后的扩展变化

### ### struct sk_buff 结构体定义及作用 `struct sk_buff` 是 Linux 内核中用于管理网络数据包的核心结构体之一,广泛应用于网络协议栈中。该结构体不仅包含了数据包的元信息,还负责管理数据包在内存中的存储和传输过程。 #### 结构体定义 `struct sk_buff` 的定义位于 Linux 内核源码中,通常位于 `<linux/skbuff.h>` 头文件内。其结构较为复杂,包含多个成员变量,用于描述数据包的属性和状态。以下是一个简化的定义示例: ```c struct sk_buff { struct sk_buff *next; struct sk_buff *prev; ktime_t tstamp; struct sock *sk; struct net_device *dev; unsigned int len, data_len; __u16 mac_len, hdr_len; __u16 queue_mapping; __u8 ip_summed; __be16 protocol; void (*destructor)(struct sk_buff *skb); char cb[48]; skb_data_end_t tail; skb_data_end_t end; unsigned char *head, *data; unsigned int truesize; atomic_t users; }; ``` 该结构体中的 `next` 和 `prev` 成员变量用于将 `sk_buff` 组织成双向链表[^2]。此外,`head` 和 `data` 指针分别指向数据包的起始地址和当前数据的起始地址,而 `len` 和 `data_len` 用于记录数据包的长度信息。 #### 作用 `struct sk_buff` 的主要作用是封装网络数据包,并在协议栈的不同层级之间传递。其设计目标包括: 1. **高效的数据包管理**:通过 `next` 和 `prev` 指针,`sk_buff` 可以被组织成双向链表,使得数据包在不同队列之间的移动无需复制整个缓冲区,只需修改指针即可[^1]。例如,在 USB 网络设备驱动中,`struct usbnet` 使用 `struct sk_buff_head` 管理接收队列 (`rxq`)、发送队列 (`txq`) 和已完成队列 (`done`) 等。 2. **支持线性与非线性数据区域**:`sk_buff` 的数据部分分为线性区域和非线性区域。线性区域直接存储在 `data` 指针指向的内存中,而非线性区域则由 `skb_shared_info` 结构体管理,用于支持分片和共享数据块[^3]。 3. **提供数据包元信息**:`sk_buff` 中包含多个成员变量,如 `tstamp`(时间戳)、`dev`(网络设备)、`protocol`(协议类型)等,用于记录数据包的传输状态和上下文信息。 4. **支持数据包的生命周期管理**:通过 `users` 引用计数器和 `destructor` 析构函数指针,`sk_buff` 可以安全地在多个模块之间共享,并在使用完成后释放资源。 #### 使用示例 以下是一个简单的示例,展示如何在内核模块中分配和释放 `sk_buff`: ```c #include <linux/skbuff.h> #include <linux/netdevice.h> struct sk_buff *skb = alloc_skb(1500, GFP_KERNEL); if (skb) { skb_put(skb, 100); // 假设数据长度为100字节 // 填充数据到 skb->data // ... kfree_skb(skb); // 释放 sk_buff } ``` 上述代码中,`alloc_skb` 用于分配一个 `sk_buff` 结构体及其关联的数据缓冲区,而 `skb_put` 用于扩展数据区域的长度。最后,`kfree_skb` 用于释放 `sk_buff` 资源。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值