ninfo->tso_size = skb_shinfo(skb)->tso_size; ninfo->tso_segs = skb_shinfo(skb)->tso_segs; //fraglist为NULL ninfo->nr_frags = 0; ninfo->frag_list = NULL; offset = data - skb->head; //释放之前skb的data skb_release_data(skb); //将skb指向新的data skb->head = data; skb->...
skb_shinfo(rskb)->frag_list = skb; rskb->len += skb->len; rskb->data_len += rskb->len; rskb->truesize += rskb->len;/* Avoid nested fragments */skb_walk_frags(skb, fs) flen += fs->len; skb->next = skb_shinfo(skb)->frag_list;skb_frag_list_init(skb); skb->len -...
因此需要释放frags,frag_list中被拷贝过的数据//计算从frags数组中拷贝的数据量eat =delta;for(i =0; i < skb_shinfo(skb)->nr_frags; i++) {//寻找到满足eat这么多数据量的最后一个pageif(skb_shinfo(skb)->frags[i].size >=eat)//在frags数组中的数据量可以满足delta时,则只...
* and the second, holding only fragments. */if(skb_has_frag_list(head)) {structsk_buff*clone;inti, plen =0;if((clone = alloc_skb(0, GFP_ATOMIC)) ==NULL)gotoout_nomem; clone->next = head->next; head->next = clone;skb_shinfo(clone)->frag_list =skb_shinfo(head)->frag_list;...
对于frags[]一般用在当数据比较多,在线性数据区装不下的时候,skb_frag_t中是一页一页的数据,skb_frag_struct结构体如下: 1/*include/linux/skbuff.h*/2typedefstructskb_frag_struct skb_frag_t;34structskb_frag_struct {5struct{6structpage *p;/*指向分片数据区的指针,类似于sk_buff中的data指针*/7}...
kunmap_skb_frag(vaddr); if ((len -= copy) == 0) return 0; offset += copy; to += copy; } start = end; } /*拷贝其他碎片skb中的数据部分,对于skb的递归调用*/ if (skb_shinfo(skb)->frag_list) { struct sk_buff *list = skb_shinfo(skb)->frag_list; ...
skb_shinfo(skb)->tso_segs = 0; skb_shinfo(skb)->frag_list = NULL; skb_shinfo(skb)->ufo_size = 0; skb_shinfo(skb)->ip6_frag_id = 0; 最后,返回 SKB 的指针. 2. SKB 的分配时机 SKB 的分配时机主要有两种,最常见的一种是在网卡的中断中,有数据包到达的时,系统分配 SKB 包进行包处理...
skb_shinfo(skb)->frag_list = NULL; skb_shinfo(skb)->ufo_size = 0; skb_shinfo(skb)->ip6_frag_id = 0; 最后,返回 SKB 的指针. 2. SKB 的分配时机 SKB 的分配时机主要有两种,最常见的一种是在网卡的中断中,有数据包到达的时,系统分配 SKB 包进行包处理; 第二种情况是主动分配 SKB 包用于各...
*/ if (clone) { clone->next = list; skb_shinfo(skb)->frag_list = clone; } } /* Success! Now we may commit changes to skb data. */ pull_pages: eat = delta; k = 0; for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { int size = skb_frag_size(&skb_shinfo(skb)-...
skb的核心数据结构中,skb_shinfo(skb共享信息)隐藏在skb的end之后,包含frag_list和frags数组,用于处理TCP分段、UDP分包等操作。skb的内存空间划分为线性区(head-end)和非线性区(frags和frag_list),非线性区是通过skb_shinfo管理的。理解skb_shinfo至关重要,它位于skb尾部,其中frags用于Scatter ...