ネット リングの概要
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 がインクリメントされると、ドライバーはバッファーをハードウェアにポストし、リングのドレイン セクションにバッファーを転送します。 | No | NIC クライアント ドライバー |
EndIndex | NIC クライアント ドライバーが所有する NET_RING 内の要素の範囲の末尾。 クライアント ドライバーは 、EndIndex - 1 までの要素を所有します。 | はい | NetAdapterCx |
パケット キューの EvtPacketQueueAdvance コールバック中にこれらのインデックスを操作することは、クライアント ドライバーがシステムとネットワーク インターフェイス カード (NIC) ハードウェアの間でネットワーク データを転送する方法です。
クライアント ドライバーは 、BeginIndex から EndIndex までのすべての要素を所有しています 。1 を含みます。 たとえば、 BeginIndex が 2 で EndIndex が 5 の場合、クライアント ドライバーは 3 つの要素 (インデックス値が 2、3、4 の要素) を所有します。
BeginIndex が EndIndex と等しい場合、クライアント ドライバーは要素を所有しません。
NetAdapterCx は EndIndex をインクリメントすることで、要素をリング バッファーにポストします。 クライアント ドライバーは、バッファーをドレインし、 BeginIndex を進めることによって要素の所有権を返します。
NextIndex は、クライアント ドライバーが使用するオプションであり、リングのクライアント ドライバーのセクションのポストとドレインのサブセクションを分離する際に便利に提供されます。
NextIndex と EndIndex - 1 の間のインデックス値を持つ要素は、クライアントによって所有されていますが、まだハードウェアにポストされていません。 NextIndex が BeginIndex と等しい場合、クライアント ドライバーには OS に転送する完了したバッファーがありません。 NextIndex が EndIndex と等しい場合、クライアント ドライバーにはハードウェアにポストするバッファーがありません。
ネット リングは円形であるため、最終的にはインデックス値がバッファーの末尾をラップし、先頭に戻ります。 NetAdapterCx は、クライアント ドライバーが適切なメソッドを呼び出すときに、リングの周囲にインデックス値をラップする処理を自動的に処理します。
ネット リング内の要素の管理に関する具体的な情報については、 ネット リング要素の管理を参照してください。
ネット リングを使用したネットワーク データの送受信
ネット リングでのネットワーク データの送信と再取得に関する詳細とコード サンプルについては、次のトピックを参照してください。