skb_frag_unref(skb, i); eat -= size; } else { skb_frag_t *frag = &skb_shinfo(skb)->frags[k]; // 这里把不需要拷贝到线性区的frags[k]拷贝到frags[i] *frag = skb_shinfo(skb)->frags[i]; if (eat) { // 为第i个frag修改偏移 // frag->bv_offset += eat; skb_frag_off_add(...
}else{skb_frag_t*frag = &skb_shinfo(skb)->frags[k];// 这里把不需要拷贝到线性区的frags[k]拷贝到frags[i]*frag =skb_shinfo(skb)->frags[i];if(eat) {// 为第i个frag修改偏移// frag->bv_offset += eat;skb_frag_off_add(frag, eat);skb_frag_size_sub(frag, eat);if(!i)gotoend;...
skb_frag_t*frag = &skb_shinfo(skb)->frags[k]; // 这里把不需要拷贝到线性区的frags[k]拷贝到frags[i] *frag = skb_shinfo(skb)->frags[i]; if(eat) { // 为第i个frag修改偏移 // frag->bv_offset += eat; skb_frag_off_add(frag, eat); skb_frag_size_sub(frag, eat); if(!i) ...
The nr_frags member states howmany frags there are active in the frags[] array. The tso_size and tso_segs is used to convey information to the devicedriver for TCP segmentation offload. The frag_list is used to maintain a chain of SKBs organizedfor fragmentation purposes, it is _not_ u...
[1] All SKB_GSO_DODGY producers can allow user space to feed packets that trigger the current check. We could prevent them from doing so, rejecting packets, but this might add regressions to existing programs. It turns out our SKB_GSO_DODGY handlers properly set up checksum information that...
第二就是什么时候会使用no-linear,frag_list在处理IP分片时被使用,可以查看内核中的ip_fragment->ip_do_fragment函数,[1][2][3]中对这个部分的描述并不够详细,或者说对frags对描述还不够详细。
(__alloc_page_frag+0x13c/0x15c) 2017-03-05T16:35:55.624957-08:00 kernel: [<803bd390>] (__alloc_page_frag) from [<803c2bbc>] (__alloc_rx_skb+0x58/0xe4) 2017-03-05T16:35:55.624970-08:00 kernel: [<803c2bbc>] (__alloc_rx_skb) from [<803c2c64>] (__netdev_alloc_skb...
如下图,将上一次 push_len 给 pop 掉,则skb->data 回到 skb_put 时的起始位置。这主要被协议栈RX收包时,去除协议头时使用。SKB 常用成员 struct sk_buff { struct sk_buff *next; // frag_list 通过next串联起来(下文会介绍frag_list) unsigned int len, // 线性区和非线性区数据总长(下文会详细介绍...
一、先直观的看一下这个结构体~~~在下面解释每个字段...减少变化,总之表示的是放入数据的内存区域(由图一)可知。 现在需要解释一下skb_shared_info这个结构体,这个结构体真的是很很有特色!主要是其中的两个字段frags和frag_list,下面 智能推荐 cenos7清空 buff/cache...
skb_frag_off_add(frag, eat); skb_frag_size_sub(frag, eat); if(!i) gotoend; eat=0; } k++; } } // nr_frags设置为k skb_shinfo(skb)->nr_frags = k; end: // tail增加data skb->tail += delta; // 非线性数据减去delta