操作tailroom中用户数据块区域:skb_put用于修改指向数据区末尾的指针tail:
void *skb_put(struct sk_buff *skb, unsigned int len)
{
void *tmp = skb_tail_pointer(skb);
SKB_LINEAR_ASSERT(skb);
skb- >tail += len;
skb- >len += len;
if (unlikely(skb- >tail > skb- >end))
skb_over_panic(skb, len, __builtin_return_address(0));
return tmp;
}
可以看到 tail指针的移动是扩大数据区域 ,即数据区向下扩大len字节,并更新数据区长度len。
增加headroom区域的协议头: skb_push函数用于移动data指针,增加头部协议, 与skb_reserve()类似,也并没有真正向数据缓存区中添加数据,而只是移动数据缓存区的头指针data。数据由其他函数复制到数据缓存区中。 函数如下:
void *skb_push(struct sk_buff *skb, unsigned int len)
{
skb- >data -= len;
skb- >len += len;
if (unlikely(skb- >data< skb- >head))
skb_under_panic(skb, len, __builtin_return_address(0));
return skb- >data;
}
如下两张图分别是由传输层、网络层,数据包向下传递时data指针移动,进行头部协议的封装。
- TCP层添加TCP首部。
- SKB传递到IP层,IP层为数据包添加IP首部。
- SKB传递到链路层,链路层为数据包添加链路层首部。
可以看到在数据包封装的过程中,每一层移动data指针进行数据报头的封装。
数据报文解封装,解除协议头: skb_pull通过将data指针向下移动,进行数据报文的解封装,函数如下所示:
static inline void *__skb_pull(struct sk_buff *skb, unsigned int len)
{
skb- >len -= len;
BUG_ON(skb- >len < skb- >data_len);
return skb- >data += len;
}
如下图所示,在收包流程上,向上层协议,如下网络层向传输层传送的时候,调用skb_pull进行数据包的解封装。
以上就是struct sk_buff的四大指针的相关操作,通过分析可得:
- head指向缓冲区的首地址,作为上边界
- end指向缓冲区的尾地址,作为下边界
- data指针在数据包头部封装和解封装的过程中移动,指向各层的协议头,skb_push函数将data的指向,向低地址移动(向上),完成协议头空间的占据,skb_pull函数将data的指向,向高地址移动(向下),完成协议头的解封装。
- tail指针在增加应用层用户缓冲数据时移动,skb_put函数将该指针向高地址移动(向上),完成用户数据空间的占据。
-
嵌入式
+关注
关注
5036文章
18768浏览量
297383 -
Linux
+关注
关注
87文章
11114浏览量
207733 -
内存
+关注
关注
8文章
2884浏览量
73415 -
指针
+关注
关注
1文章
475浏览量
70457
发布评论请先 登录
相关推荐
Linux sk_buff四大指针与相关操作
![Linux <b class='flag-5'>sk_buff</b>四大指针与<b class='flag-5'>相关</b><b class='flag-5'>操作</b>](https://file.elecfans.com/web2/M00/6F/CE/poYBAGNH1sCANs83AAAOVhEjMFs521.png)
使用rt_malloc申请内存空间失败,显示没有内存怎么解决?
Linux内存点滴 用户进程内存空间
嵌入式linux TCP/IP协议栈概述
DM8127使用SWOSD_TI_alloc()分配内存空间怎么加大?
ARM32 Linux的内存布局
RTThread的动态内存空间该如何去分配呢
Linux网络设备驱动程序
如何让你的手机省出内存空间
网卡的Ring Buffer详解
网卡的Ring Buffer详解
sk_buff内存空间布局情况与相关操作(三)
![<b class='flag-5'>sk_buff</b><b class='flag-5'>内存空间布局</b><b class='flag-5'>情况</b>与<b class='flag-5'>相关</b><b class='flag-5'>操作</b>(三)](https://file1.elecfans.com/web2/M00/8E/67/wKgaomTGI5WAeCRcAABWkoA2Sls435.jpg)
评论