sk_buffには、次のフラグメンテーションデータを格納できる場所が2つあります。
skb_shinfo(head)->frag_list
skb_shinfo(head)->frags[]
断片化を処理するこれら2つの方法の違いは何ですか?
sk_buffには、次のフラグメンテーションデータを格納できる場所が2つあります。
skb_shinfo(head)->frag_list
skb_shinfo(head)->frags[]
断片化を処理するこれら2つの方法の違いは何ですか?
どちらも異なるケースに使用されます。
frags []
frags[]
デバイスがスキャッターギャザーI/Oをサポートしていて、データの結合などを実行する場合は、2番目のフラグメントから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フラグメント用ですskb_shinfo(head)-> frags []
NICがSGI / Oをサポートしている場合、 __ ip_append_dataはユーザースペースデータをskb_shinfo(head)->fragsにコピーします。NICドライバー(例:ixgbe_add_rx_frag)は、これらのfrags[]を使用して受信したネットワークトラフィックを伝送することもできます。frags[]のすべてのコンテンツは完全なパケットの一部であることに注意してください。完全なパケットは、すべてのfrags [] +(skb-> data〜skb-> tail)で構成されます。
skb_shinfo(head)-> frag_list
このメンバーは、IPフラグメンテーションによって直接使用されません。__ip_make_skb()では、frag_listを使用してsk->sk_write_queueからすべてのskbを収集します。一部のNICドライバーは、このfrag_listを使用してパケットを上位ネットワークスタックに伝送します。frag_listのすべてのcontent/skbも完全なパケットではありません。tcp_v4_send_ack-> ip_send_unicast_reply-> ip_push_pending_frames-> ip_finish_skb-> __ip_make_skb;