
linux 内核网络 sk_buff 结构详解
文章平均质量分 93
老王不让用
芝兰生于幽谷,不以无人而不芳; 君子修身立德,不为穷困而改节
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
linux 内核网络 sk_buff 之队列管理函数Ⅴ
1初始化函数skb_queue_head_init()首先获取到sk_buff_head结构体中自旋锁,因为队列管理函数都是原子操作(要么不操作,要不一定要操作完,操作时不能被打扰),所以获取到锁才可以操作,防止异步中断。然后创建个空的链表。函数实现如下:static inline void skb_queue_head_init(struct sk_buff_head *list){ spin_lock_init(&list->lock);//获得头结点中的自旋锁...转载 2021-01-15 11:13:37 · 2667 阅读 · 3 评论 -
linux 内核网络 sk_buff 之克隆与复制Ⅳ
目录1 skb_clone() 函数2 pskb_copy() 函数3 skb_copy() 函数4 小结1 skb_clone() 函数该函数就是单单克隆下 sk_buff 结构体,对 sk_buff 结构的数据区、分片结构体 skb_shared_info、分片结构体数据区等结果进行共享。skb:将要被克隆的sk_buff结构体(后面用父skb来称); gfp_mask:向内核申请分配内存的方式; 返回:新克隆出来的skb结构体(后面称其为子skb);struct s转载 2021-01-15 11:10:53 · 2034 阅读 · 0 评论 -
linux 内核网络 sk_buff 之申请和释放 Ⅲ
目录1 sk_buff 内存申请接口概述2 sk_buff 申请__alloc_skb()3 sk_buff 释放kfree_skb()1 sk_buff 内存申请接口概述因为 sk_buff 结构是比较复杂的(并不是其本身结构复杂,而是其所指的数据区以及分片结构等,合在一起就变复杂了),所以在内存申请和释放时,就要搞清楚什么函数对应的申请分配或释放什么结构内存。这里不提倡自己用 kmalloc() 和 kfree() 函数来为 sk_buff 相关结构体申请内存及销毁,而要用内核提..转载 2021-01-15 11:10:27 · 4275 阅读 · 0 评论 -
linux 内核网络 sk_buff 之数据区操作函数集合Ⅱ
目录1 sk_buff 中的四大指针2 sk_buff 指针数据区操作函数集2.1 skb_put()2.2 skb_push()2.3 skb_pull()2.4 skb_reserve()1 sk_buff 中的四大指针四大指针分别是:head、data、tail、end;这四个指针都是指向了数据区的,数据区中存放的是协议头和数据。head 和 end 指针是每个数据包一样的,也是有这两个指针来确定数据区的大小的。最开始的时候 head、data、tail 三个指针都是指转载 2021-01-15 11:10:15 · 1105 阅读 · 3 评论 -
linux 内核网络 sk_buff 之数据结构剖析Ⅰ
1 sk_buff 结构体内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体,而是通过增加协议头和移动指针来操作的。如果是从L4传输到L2,则是通过往sk_buff结构体中增加该层协议头来操作;如果是从L4到L2,则是通过移动sk_buff结构体中的data指针来实现,不会删除各层协议头。这样做是为了提高CPU的工作效率。sk_buff结构体中有很多条件编译,比如:...#if defined(CONFIG_NF_CONNTRACK) || defined(...转载 2021-01-15 11:10:04 · 2907 阅读 · 0 评论