skb_release_all(skb);/*释放skb附带的所有数据*/kfree_skbmem(skb);/*释放skb*/} staticvoidskb_free_head(structsk_buff *skb) { unsignedchar*head = skb->head;if(skb->head_frag)//表示线性区 数据在page 区 len=size&&&date_len=sieze 通过alloc_page_frag拿到skb->head=data=pageskb_free_fr...
copy=len;//映射skb的frag到内核地址空间vaddr = kmap_skb_frag(&skb_shinfo(skb)->frags[i]);//拷贝memcpy(to, vaddr+ skb_shinfo(skb)->frags[i].page_offset+offset-start, copy);//解除映射kunmap_skb_frag(vaddr);if((len -= copy) ==0)return0; offset+=copy; to+=copy; } start=end...
kfree_skb(clone);//递减clone的引用计数 return NULL; } break; } } while (eat); //list指向frag_list头 //直到list遍历到数据量足够的最后一个skb while ((list = skb_shinfo(skb)->frag_list) != insp) { skb_shinfo(skb)->frag_list = list->next; //释放当前的skb kfree_skb(list);//...
· struct sk_buff *skb_pad(struct sk_buff *skb, int pad) · void skb_clone_fraglist(struct sk_buff *skb) · void skb_drop_fraglist(struct sk_buff *skb) · void copy_skb_header(struct sk_buff *new, const struct sk_buff *old) · pskb_expand_head(struct sk_buff *skb, int nhe...
skb */...skb_success:skb_reserve(skb,NET_SKB_PAD);/* 在数据头部保留部分空间 */skb->dev=dev;/* 设定 skb 的 所属的 网卡设备对象 */skb_fail:returnskb;}structsk_buff*__build_skb(void*data,unsignedintfrag_size){structskb_shared_info*shinfo;structsk_buff*skb;unsignedintsize=frag_size?
对于frags[]一般用在当数据比较多,在线性数据区装不下的时候,skb_frag_t中是一页一页的数据,skb_frag_struct结构体如下: AI检测代码解析 1 /* include/linux/skbuff.h */ 2 typedef struct skb_frag_struct skb_frag_t; 3 4 struct skb_frag_struct { ...
[SK_BUFF]: Introduce skb_transport_header(skb) Browse files Browse the repository at this point in the history For the places where we need a pointer to the transport header, it is still legal to touch skb->h.raw directly if just adding to, subtracting from or setting it to another...
pskb_pull(list, eat)) { kfree_skb(clone); return NULL; } break; } } while (eat); /* Free pulled out fragments. */ // 把没用的entry删除 while ((list = skb_shinfo(skb)->frag_list) != insp) { skb_shinfo(skb)->frag_list = list->next; kfree_skb(list); } /* And ...
skb_clone_fraglist(skb); // 如果引用计数为0就free包括非线性区内的所有数据 skb_release_data(skb); }else{ // 把原来的data free掉 skb_free_head(skb); } //不知道这个off有什么意义,可能与NET_SKBUFF_DATA_USES_OFFSET有关 off= (data + nhead) - skb->head; ...
skb_cow 为请求复制缓存头 skb_linearize_cow 确保其是线性的和可写的 skb_head_is_locked skb_head_is_locked - Determine if the skb->head is locked down*@skb: skb to check* The head on skbs build around a head frag can be removed if they are* not cloned sk_wmem_free_skb 源...