skb结构体中的长度和数据指针

len: 线性区和分片区域的总长度
data_len:分片区域frag page中的数据长度
len-data_len: 当前协议层中的线性区长度

head:线性区的起始地址
data:数据的起始地址
tail:数据的结束地址
end:线性区的结束地址

headroom:从head到data之间的空间
tailroom:从tail到end之间的空间

除了上面的几个成员,特别指出一个truesize,它表示一个skb所消耗的内存,包括了skb结构体本身,skb shared info结构体和对应的数据区总占用内存大小。对于truesize来说,内核的定义如下:

#define SKB_TRUESIZE(X) ((X) +                      \                                                                                                                                           SKB_DATA_ALIGN(sizeof(struct sk_buff)) +   \SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))

skb操作函数

对于只有线性区的skb来说,有如下一些操作函数:

skb_put(): 向后扩大数据区空间。headroom空间不变,tailroom空间降低,skb->data指针不变,skb->tail指针下移;
skb_push(): 向前扩大数据区空间。headroom空间降低,tailroom空间不变。skb->tail指针不变,skb->data指针上移;
skb_pull(): 缩小数据区空间.headroom空间增大,tailroom空间不变,skb->data指针下移,skb->tail指针不变;
skb_reserve(): 数据区空间大小不变,headroom空间增大,tailroom空间降低,skb->data和skb->tail同时下移;

skb_reserve()只能用于空的SKB,通常会在分配SKB之后就调用该函数,此时data和tail指针还一同指向数据区的起始位置。例如,某个以太网设备驱动的接收函数,在分配SKB之后,向数据缓存区填充数据之前,会有这样的一条语句skb_reserve(skb, 2),这是因为以太网头长度为14B,再加上2B就正好16字节边界对齐,所以大多数以太网设备都会在数据包之前保留2B。

如果该skb存在分片的frag page,那么不能使用上面的函数了,必须使用:

pskb_pull():
对于带有frag page的分片skb来说,data指针往下移动,可能会导致线性区越界,因此需要判断是否线性区有足够的空间用来pull操作,如果空间不够,那么需要执行linearize,重构线性区,把一部分frags中的数据移动到线性区中来操作。
pskb_may_pull():
主要在使用skb_pull之前来检查线性区buffer有没有足够的数据用于 pull。
pskb_copy():
参考上图(a)只skb拷贝线性区的数据,对于分片的skb来说它的shared_info会拷贝过来,但是指向的frag page是共享的。所以使用该函数拷贝生成的新的skb只能修改线性区中的数据。
skb_copy():
参考上图(b)拷贝线性区和分片区的所有数据,一个分片的skb经过拷贝后会生成一个完全线性的skb。对于只想修改header的操作,建议不要使用该函数,而应该使用pskb_copy()。

skb_clone():
参考本文第一张图,只拷贝skb结构体,对应的head/data/tail/end指针指向的线性区还是共享的,所以clone的skb是不能修改其中的数据的。


https://www.cnblogs.com/zfyouxi/p/4560841.html

SKB中的各种长度、数据指针和操作函数相关推荐

  1. 图表嵌入到数据表格下方_Excel中进行图表下方显示数据表的操作技巧

    Excel 中进行图表下方显示数据表的操作技巧 添加模拟运算 下面是虚拟数据源 ( 三种面膜在 1-3 月的销售量 ) . 选中 A1 : D4 单元格区域,单击插入 insert--- 柱形图 co ...

  2. Python中pandas库实现数据缺失值判断isnull()函数

    [小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python中pandas库实现数据缺失值判断 isnull()函数 ...

  3. Arduino 从串口接收到的数据中提取整型数据(parseInt)

    Arduino 从串口接收到的数据中提取整型数据(parseInt) 函数说明 parseInt函数可用于从设备接收到的数据中寻找整数数值. 该函数属于Stream类.该函数可被Stream类的子类所 ...

  4. exce中让两列数据一一对应_EXCEL表格如何匹配两列数据一样-EXCEL让两个表格中的两列数据一一对应...

    怎样把excel中两列有部分相同的数据进行匹配? 1.首先打开excel表格,可以看到有两列数据需要匹配,找出列B中在列A中没有的数据. 2.然后在C1单元格内输入函数公式:=IF(ISNA(VLOO ...

  5. 静态数据成员和静态成员函数

    转载自:https://blog.csdn.net/computer_liuyun/article/details/29235111 c++中的static静态数据成员和静态成员函数应该是让大家比较头 ...

  6. 【C 语言】文件操作 ( C 语言中的文件操作函数 | 磁盘与内存缓冲区 | 缓冲区工作机制 )

    文章目录 一.C 语言中的文件操作函数 二.磁盘与内存缓冲区 三.缓冲区工作机制 一.C 语言中的文件操作函数 读取 文本文件 可以使用 getc , fgets , fscanf 函数 , 向 文本 ...

  7. C语言:定义一个函数max_min,求一组数据的最大值和最小值. 在主函数中输入n和n个数据,调用max_min函数求出最大最小值,然后在主函数中输出这n个数的最大值和最小值。(要求使用指针做)

    [问题描述]定义一个函数max_min,求一组数据的最大值和最小值. 在主函数中输入n和n个数据,调用max_min函数求出最大最小值,然后在主函数中输出这n个数的最大值和最小值.(要求使用指针做) ...

  8. 使用 bcp 指定数据文件中的前缀长度

    当以本机格式将数据大容量导出到数据文件时,为使文件存储空间最为紧凑,bcp 命令将在每个字段前面使用一个或多个字符来指示字段的长度. 这些字符称为"长度前缀字符". bcp 的前缀 ...

  9. pandas使用query函数基于dataframe字符串数据列中字符串的长度筛选dataframe的数据行(specific column string length)

    pandas使用query函数基于dataframe字符串数据列中字符串的长度筛选dataframe的数据行(select dataframe rows based on specific colum ...

最新文章

  1. (筆記) 如何使用Visual C++ 6.0開發Win32 DLL? (C/C++) (VC++)
  2. Fiddle抓包Https
  3. 晴天php下载,x.php · 一步晴天/smart - Gitee.com
  4. 自由软件基金会庆祝成立35周年
  5. Oracle/云MySQL/MsSQL“大迁移”真相及最优方案
  6. 凸优化第二章凸集 2.1 仿射集合和凸集
  7. React入门(暂缓)
  8. 医学遗传学词汇英语术语英文(Glossary) 5
  9. MySql将一张表的数据copy到另一张表中
  10. 骚男的计算机音乐,lol骚男战歌bgm_lol骚男战歌背景音乐汇总_快吧游戏
  11. 解构企业实名认证的几大「名场面」
  12. 庸科科沾稚尘悦蕉谷捉
  13. python Re模块学习
  14. 当linux reboot不成功时怎么办
  15. nutch-2.1导入eclipse+mysql运行
  16. python123判断火车票座位_【Python】实现12306余票监控
  17. 活动集锦|3月腾讯企业微信、泛微联合产品体验会走进23座城市
  18. 【Axure视频教程】鼠标滚动缩放图片
  19. Broadcom BCM4312 无线网卡驱动安装
  20. 2017年职业生涯小计

热门文章

  1. Kali Linux Web 渗透测试秘籍 第三章 爬虫和蜘蛛
  2. FFmpeg命令(一)、使用filter_complex命令拼接视频
  3. SQL UCASE() 函数、SQL LCASE() 函数、SQL MID() 函数
  4. 用Python头像秒变成表情包
  5. PDA扫码设备放置一会就休眠的解决办法
  6. CV codes代码分类整理合集(http://www.sigvc.org/bbs/thread-72-1-1.html)
  7. 水果编曲软件的安装教程
  8. 吃饭的时候吃饭,睡觉的时候睡觉
  9. 恺撒密码——python
  10. git与github之降龙十八掌