增加headroom区域的协议头:skb_push函数用于移动data指针,增加头部协议,与skb_reserve()类似,也并没有真正向数据缓存区中添加数据,而只是移动数据缓存区的头指针data。数据由其他函数复制到数据缓存区中。函数如下: void *skb_push(struct sk_buff *skb, unsigned int len) { skb->data -= len; skb->len +=...
操作后skb_buff的指针如下所示: skb_reserve作用就是预留空间,而且是尽最大的空间预留,但它并没有把数据放到该空间,只是简单更新指针,预留空间! 因为很多头都会有可选项,那么不知道头部可选项是多大,所以只能按照最大的分配,同时也要明白一点,预留的空间headroom不一定使用完,可能还有剩余。当我们要增加协议头信息的...
(d)skb_reserve():数据区不变,headroom空间增大,tailroom空间降低,skb->data和skb->tail同一时候下移; 大家也能够照着源代码来分析,还有个当大家看源代码时。会发现好多函数都有个同名的,比方:skb_push()函数,就有两个:static inline unsigned char *__skb_push(struct sk_buff *skb, unsigned int len);...
一路下来,你会发现,skb数据包缓冲区以“压栈(push)”的方式逐渐被填充,每一层,都是通过skb_push接口压入一个栈帧,返回写指针,然后按照该层的协议逻辑从写指针开始写入栈帧长度的数据。 7.在应用数据后面追加PADDING目前为止,从最后的图示上可以看到,在skb数据包缓冲区中,还有两块区域没有使用,一个headroom,一...
首先来说下三个空间。方便以下介绍函数时理解。第一个是:headroom,就是skb->head和skb->data之间的空间。第二个是:data。就是skb->data和skb->tail之间的空间。第三个是:tailroom,就是skb->tail和skb->end之间的空间。例如以下图: 接下来说下四个操作sk_buff结构中指针的函数:(a)skb_put(), (b)skb_...
sk_buff的操作要想形成一个最终的数据包,即以太帧(不考虑其它的链路层)。要进行以下的操作: 1.分配一个skb结构体 可以看出基本的模式,即“定位/设置”两步骤操作,有点区别的是应用层操作,这是因为应用层的操作一般都是在socket接口之上完成的。但是既然本文讲述的是skb的通用操作,就不再区分这个了。
在执行skb_reserve()函数前,skb->head,skb->data和skb->tail指针的位置的一样的,都位于skb内存空间的开始位置。这部份空间叫做headroom。有效数据后的空间叫tailroom。skb_reserve的操作只是把skb->data和skb->tail指针向后移,但缓存总长不变。 运行skb_reserve()前sk_buff的结构...
skb_reserve()函数为skb_buff缓存结构预留足够的空间来存放各层网络协议的头信息。该函数在在skb缓存申请成功后,加载报文数据前执行。在执行skb_reserve()函数前,skb->head,skb->data和skb->tail指针的位置的一样的,都位于skb内存空间的开始位置。这部份空间叫做headroom。有效数据后的空间叫tailroom。skb_reserve的...
根据指定长度重新扩展headroom和tailroom空间。 skb_shared_info 用于管理套接字缓冲区的数据包分片信息。在数据缓存区的末尾,即end指针所指向的地址起紧跟着有一个skb_shared_info结构。保存了数据块的附加信息。 sk_buff结构中并没有指向skb_shared_info结构的指针,可以用skb_info宏来访问skb_shared_info结构。
我们可以看到指针的移动data还是在headroom的下面,中间的是用户数据预留的部分,由skb_put得到,tail表示数据结尾!再看一下sk_buff中的len,变成了数据长度ld!! > : skb_push函数:---> 用于操作headroom区域的协议头 static inline unsigned char *skb_push(struct sk_buff *skb, unsigned int len) { skb->data...