其中skb_headlen()函数的定义为: static inline unsigned int skb_headlen(const struct sk_buff *skb) { return skb->len - skb->data_len; } 其中skb->len是数据包长度,在IPv4中就是单个完整IP包的总长,但这些数据并不一定都在当前内存页;skb->data_len表示在其他页的数据长度(包括本skb在其他页中的数...
skb->data_len //小弟和兄弟的总和,即大哥缺少的份额,非线性数据长度。 skb_headlen() //即大哥长度,线性长度。和skb_headroom()不一样,这个是只头部空间剩余长度。 skb_pagelen() //大哥和小弟的总和,即线性数据长度和页面碎片的长度,不包括分片skb队列长度。 1. 2. 3. 4....
{intpos = skb_headlen(skb);//pos = skb->len - skb->data_len,pos是skb结构中数据区的有效数据长度if(len < pos)//如果拆分长度小于skb数据区中的有效长度,则调用下面函数skb_split_inside_header(skb, skb1, len, pos);//该函数只拆分skb数据区中的数据else//反之,如果拆分长度不小于skb数据区中...
实际线性数据:data - tail,不包含线性数据中的头空间和尾空间。 skb->data_len: skb中的分片数据(非线性数据)的长度。 skb->len: skb中的数据块的总长度,数据块包括实际线性数据和非线性数据,非线性数据为data_len,所以skb->len= (data - tail) + data_len。 skb->truesize: skb的总长度,包括sk_buff...
// skb_headlen = skb->len - skb->data_len; return__pskb_pull_tail(skb, len - skb_headlen(skb)) !=NULL; } 可以看到关键点是__pskb_pull_tail和pskb_expand_head,我们一个一个来: __pskb_pull_tail // 必要时向前移动 skb 头部的尾部,从fragmented部分复制数据。
其中skb_headlen()函数的定义为: static inline unsigned int skb_headlen(const struct sk_buff *skb) { return skb->len - skb->data_len; } 其中skb->len是数据包长度,在IPv4中就是单个完整IP包的总长,但这些数据并不一定都在当前内存页;skb->data_len表示在其他页的数据长度(包括本skb在其他页中的数...
static inline unsigned int skb_headlen(const struct sk_buff *skb) { return skb->len - skb->data_len; } 其中skb->len是数据包长度,在IPv4中就是单个完整IP包的总长,但这些数据并不一定都在当前内存页;skb->data_len表示在其他页的数据长度,因此skb->len - skb->data_len表示在当前页的数据大小。
// skb_headlen = skb->len - skb->data_len; return__pskb_pull_tail(skb, len - skb_headlen(skb)) !=NULL; } 可以看到关键点是__pskb_pull_tail和pskb_expand_head,我们一个一个来: __pskb_pull_tail // 必要时向前移动 skb 头部的尾部,从fragmented部分复制数据。
int start = skb_headlen(skb); //偏移量+len > skb->len,说明可供拷贝的数据量不够 if (offset > (int)skb->len - len) goto fault; //计算需要拷贝的数据量 if ((copy = start - offset) > 0) { if (copy > len) copy = len; ...
(struct sk_buff *skb, unsigned int len) { if (likely(len <= skb_headlen(skb))) return 1; if (unlikely(len > skb->len)) return 0; // skb_headlen其实就是获取线性数据的大小 // skb_headlen = skb->len - skb->data_len; return __pskb_pull_tail(skb, len - skb_headlen(skb))...