skbuff frags和frag_list之间的区别

时间:2012-04-06 06:02:46

标签: linux linux-kernel linux-device-driver fragmentation

sk_buff有两个地方可以存储下一个碎片数据:

skb_shinfo(head)->frag_list 
skb_shinfo(head)->frags[]

请有人解释这两种处理碎片的方法之间的差异。

谢谢,最诚挚的问候!

2 个答案:

答案 0 :(得分:6)

两者都用于不同的情况。

<强>断支[]

当您的设备支持分散 - 收集I / O,并且您希望它进行数据等的组合时,您可以从第2个片段开始填充frags[]结构,直到第n个片段。第一个片段始终由datatail指针指定。其余的片段填充在frags[]结构中。如果不使用分散聚集,则此变量为空。

<强> frag_list

这是IP片段列表。这将在ip_push_pending_frames期间填写。 说你的sk_buffs在这个安排中

sk_buff0->next = sk_buff1
sk_buff1->next = sk_buff2
...
sk_buffn-1->next = sk_buffn

调用ip_push_pending_frames

sk_buff0->frag_list = sk_buff1
sk_buff1->next = sk_buff2
...
sk_buffn-1->next = sk_buffn

简单地说

  • frags[]用于分散 - 聚集i / o缓冲区
  • frag_list用于ip片段

答案 1 :(得分:2)

<强> skb_shinfo(头) - &GT;断枝[]

如果NIC支持SG I / O __ip_append_data将用户空间数据复制到skb_shinfo(head) - &gt; frags; NIC驱动程序(例如ixgbe_add_rx_frag)也可以使用这些frags []来承载接收到的网络流量;请注意,frags []中的每个内容都是完整数据包的一部分。一个完整的数据包由所有frags [] +(skb-&gt; data~skb-&gt; tail)组成。

<强> skb_shinfo(头) - &GT; frag_list

此成员不会直接由IP碎片使用。 在__ip_make_skb()中,frag_list用于从sk-&gt; sk_write_queue收集所有skb;某些NIC驱动程序也使用此frag_list将数据包传输到上层网络堆栈。 frag_list中的每个content / skb也不是完整数据包; tcp_v4_send_ack - &gt; ip_send_unicast_reply - &gt; ip_push_pending_frames - &gt; ip_finish_skb - &gt; __ ip_make_skb;