sk_buff有两个地方可以存储下一个碎片数据:
skb_shinfo(head)->frag_list
skb_shinfo(head)->frags[]
请有人解释这两种处理碎片的方法之间的差异。
谢谢,最诚挚的问候!
答案 0 :(得分:6)
两者都用于不同的情况。
<强>断支[] 强>
当您的设备支持分散 - 收集I / O,并且您希望它进行数据等的组合时,您可以从第2个片段开始填充frags[]
结构,直到第n个片段。第一个片段始终由data
和tail
指针指定。其余的片段填充在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;