5

sk_buffには、次のフラグメンテーションデータを格納できる場所が2つあります

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

断片化を処理するこれら2つの方法の違いは何ですか?

4

2 に答える 2

10

どちらも異なるケースに使用されます。

frags []

frags[]デバイスがスキャッターギャザーI/Oをサポートしていて、データの結合などを実行する場合は、2番目のフラグメントから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_listIPフラグメント用です
于 2012-05-09T09:44:38.163 に答える
4

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;

于 2015-05-30T14:47:22.870 に答える