如果从中断调用,则必须传递的优先级为GFP_ATOMIC。 skb_copy_expand 拷贝并扩展sk_buff struct sk_buff *skb_copy_expand(const struct sk_buff * skb, int newheadroom, intnewtailroom, intgfp_mask); skb为要拷贝的缓冲区,newheadroom为头部的新空闲字节数,newtailroom为尾部的新空闲字节数。 既拷贝&sk_bu...
skb_reserve(): skb->data和skb->tail同时往下拉(增大);2. 三个拷贝 skb_clone(): 函数仅仅是克隆个sk_buff结构体,其他数据都是共享; pskb_copy(): 函数克隆复制了sk_buff和其数据区(包括分片结构体/非线性区),其他数据共享; skb_copy(): 函数则是完全的复制拷贝函数了,把sk_buff结构体和其数据区(...
{inti;//这是个把sk_buff结构中有效数据拷贝到新的skb1中,pos为有效数据长度,len为剩下数据长度,得:pos-len为要拷贝的数据长度//skb_put(skb1,pos-len)是移动tail指针让skb1结构数据区空出空间来存放将要拷贝的数据,该函数返回tail指针skb_copy_from_linear_data_offset(skb, len, skb_put(skb1, pos -...
可以先判断skb的tailroom,如果空间够大,则我们可以把需要添加的数据放在skb的tailroom里。如果tailroom不够大,则需要调用skb_copy_expand函数来扩充tailroom或者headroom。 例如我们需要在skb的后面加上一个16个字节的字符串,则代码类似如下: 1if(skb_tailroom(skb) <16)2{3nskb = skb_copy_expand(skb, skb_headro...
linux协议栈skb操作函数
· void copy_skb_header(struct sk_buff *new, const struct sk_buff *old) · pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, gfp_t gfp_mask) · int skb_copy_bits(const struct sk_buff *skb, int offset, void *to, int len) ...
int expand = (skb->tail + skb->data_len) - skb->end; //如果此skb被共享 if (skb_shared(skb)) BUG();//产生BUG oops //还需要的内存大小 if (expand <= 0) expand = 0; //新申请的skb的大小 size = skb->end - skb->head + expand; ...
nskb=skb_copy_expand(skb,skb_headroom(skb),skb_tailroom(skb)+16,GFP_ATOMIC); if(!nskb) { printk("low memory.../n"); dev_kfree_skb(skb); return-1; } else { kfree_skb(skb);// 注意,如果此时是钩子函数钩出来的,则skb不能在这里释放,否则会造成死机。 skb...
23 /* must be last field, see pskb_expand_head() */ 24 skb_frag_t frags[MAX_SKB_FRAGS]; /*保存分页数据,skb->data_len = 所有数组数据长度之和*/ 25 }; 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
if(pskb_expand_head(skb, 0, eat > 0 ? eat + 128 : 0, GFP_ATOMIC)) returnNULL; } /* * skb_copy_bits - copy bitsfromskb to kernel buffer * @skb:sourceskb * @offset: offsetinsource * @to: destination buffer * @len: numberofbytes to copy ...