ネット リングの概要
NET_RING の概要
NET_RING は、NetAdapterCx とクライアント ドライバーの間で共有されるネットワーク データの循環バッファーです。 クライアント ドライバー内のすべてのパケット キューには、コア パケット記述子の パケット リング と、各パケットのフラグメント記述子の フラグメント リング という 2 つのリング があります。
パケット記述子の詳細については、「パケット記述子と拡張機能」を参照してください。
パケット リング内のすべてのコア記述子には、そのパケットのフラグメント記述子を検索するためのインデックスがフラグメント リングに含まれています。 別の データ構造である NET_RING_COLLECTIONは、次の図に示すように、特定のパケット キューに対してパケット リングとフラグメント リングをグループ化します。
すべてのパケット キューには独自 の NET_RING_COLLECTION 構造があり、その結果、それらのリング内の独自のパケット リング、フラグメント リング、および記述子が含まれます。 したがって、各パケット キューのネットワーク データ転送操作は完全に独立しています。 パケット キューの詳細については、「キューの送受信」を参照してください。
NET_RING要素の所有権
NET_RING 内の各要素は、クライアント ドライバーまたは NetAdapterCx によって所有されます。 所有権は、 NET_RINGのセクションをマークする 3 つのインデックスによって制御されます。 これらのインデックスは、次の表で説明します。 これらのインデックスを移動する行為は、 ポスト セマンティクスと ドレイン セマンティクスによって記述されます。
NET_RING インデックス名 | 説明 | ネットワーク データの転送に必要 | 変更したユーザー |
---|---|---|---|
BeginIndex | NIC クライアント ドライバーが所有する NET_RING 内の要素の範囲の先頭。 BeginIndex は、 NET_RING の ドレイン サブセクションの先頭でもあります。 BeginIndex がインクリメントされると、ドライバーはリングから要素を ドレイン し、それらの所有権を OS に転送します。 | はい | NIC クライアント ドライバー |
NextIndex | NET_RING の ポスト サブセクションの先頭。 NextIndex は、クライアント ドライバーが所有するリングのセクションをポストサブセクションとドレイン サブセクションに分割します。 NextIndex がインクリメントされると、ドライバーはバッファーをハードウェアに ポスト し、バッファーをリングのドレイン セクションに転送します。 | いいえ | NIC クライアント ドライバー |
EndIndex | NIC クライアント ドライバーが所有する NET_RING 内の要素の範囲の末尾。 クライアント ドライバーは、 EndIndex - 1 までの要素を所有します。 | はい | NetAdapterCx |
パケット キューの EvtPacketQueueAdvance コールバック中にこれらのインデックスを操作することは、クライアント ドライバーがシステムとネットワーク インターフェイス カード (NIC) ハードウェアの間でネットワーク データを転送する方法です。
クライアント ドライバーは、 BeginIndex から EndIndex - 1 までのすべての要素を所有します。 たとえば、 BeginIndex が 2 で EndIndex が 5 の場合、クライアント ドライバーは、インデックス値が 2、3、4 の要素の 3 つの要素を所有します。
BeginIndex が EndIndex と等しい場合、クライアント ドライバーは要素を所有しません。
NetAdapterCx は EndIndex をインクリメントして、要素をリング バッファーにポストします。 クライアント ドライバーは、バッファーをドレインし、 BeginIndex を進めることによって要素の所有権を返します。
NextIndex は、クライアント ドライバーで使用するオプションであり、リングのクライアント ドライバーのセクションのポストサブセクションとドレイン サブセクションを分離する際に便利に提供されます。
NextIndex から EndIndex - 1 までにインデックス値を持つ要素は、クライアントによって所有されますが、まだハードウェアにポストされていません。 NextIndex が BeginIndex と等しい場合、クライアント ドライバーには OS に転送するためのバッファーが完成していません。 NextIndex が EndIndex と等しい場合、クライアント ドライバーにはハードウェアにポストするバッファーがありません。
ネット リングは循環型であるため、最終的にインデックス値はバッファーの末尾をラップし、先頭に戻ります。 NetAdapterCx は、クライアント ドライバーが適切なメソッドを呼び出すときに、リングの周りのインデックス値のラップを自動的に処理します。
ネット リング内の要素の管理に関する詳細については、「Net リング要素の管理」を参照してください。
ネットリングによるネットワークデータの送受信
ネット リングでのネットワーク データの送信と再取得に関する詳細とコード サンプルについては、次のトピックを参照してください。