该函数用在调用者希望修改数据并需要数据的私有拷贝来进行改变时。失败返回NULL,成功返回指向缓冲区的指针。 返回的缓冲区其引用计数为1。如果从中断调用,则必须传递的优先级为GFP_ATOMIC。 skb_copy_expand 拷贝并扩展sk_buff struct sk_buff *skb_copy_expand(const struct sk_buff * skb, int newheadroom, in...
dev_kfree_skb(): 这个函数和dev_alloc_skb()相对应,其实现也是对kfree_skb()进行封装。 kfree_skb(): 基本释放函数,对应alloc_skb(); consume_skb(): 表示 skb是正常释放,kfree_skb()表示因为某种错误报文被丢弃,两者实现基本一致,除了调用不同的统计分析函数(网络统计数据上的区别)。4. expand skb_...
* 每个MTU数据包对应一个SKB,这些SKB通过该结构进行链表连接 */ /* must be last field, see pskb_expand_head() */ skb_frag_t frags[MAX_SKB_FRAGS];/* 驱动和硬件支持 Scatter Gatter 对小块数据
len为剩下数据长度,得:pos-len为要拷贝的数据长度//skb_put(skb1,pos-len)是移动tail指针让skb1结构数据区空出空间来存放将要拷贝的数据,该函数返回tail指针skb_copy_from_linear_data_offset(skb, len, skb_put(skb1, pos -len),
linux协议栈skb操作函数
skb_clone和skb_copy可拷贝一个sk_buff结构,skb_clone方式是clone,只生成新的sk_buff内存区,不会生成新的data内存区,新sk_buff的skb->data指向旧data内存区。skb_copy方式是完全拷贝,生成新的sk_buff内存区和data内存区。 1.skb_reserve() skb_reserve()在数据缓存区头部预留一定的空间,通常被用来在数据缓存...
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; ...
· 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) ...
可以先判断skb的tailroom,如果空间够大,则我们可以把需要添加的数据放在skb的tailroom里。如果tailroom不够大,则需要调用skb_copy_expand函数来扩充tailroom或者headroom。 例如我们需要在skb的后面加上一个16个字节的字符串,则代码类似如下: if(skb_tailroom(skb)<16) ...
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 ...