Net リング要素の管理

このトピックのガイダンスに従って、ネットワーク データ転送中に、NET_RING 構造とその要素を管理します。 このトピックの規則では、データ パスのシナリオに応じて、クライアント ドライバーが変更できるネット リング要素のメンバーとタイミング、およびこれらの構造についてクライアント ドライバーが留意する必要がある一般的な情報が示されています。

重要

クライアント ドライバーは、開発のすべてのフェーズで、これらの指示に従う必要があります。 Driver Verifier でのテスト中にクライアント ドライバーが、これらの指示に従わない場合、ドライバー検証ツールは違反を報告し、テスト対象デバイスでバグ チェックをトリガーします。

NET_RING

NET_RING の親パケット キューが開始されると、リング内のすべてのインデックスが 0 に初期化されます。

次の表では、クライアント ドライバーが変更できるネット リングのメンバーについて説明します。

フィールド クライアント ドライバーは、変更することを許可されています
OSReserved1 いいえ
ElementStride いいえ
NumberOfElements いいえ
ElementIndexMask いいえ
EndIndex いいえ
OSReserved0 いいえ
OSReserved2 いいえ
BeginIndex はい (必須)
NextIndex はい (オプション) : フレームワークは NextIndex を読み取ることはありません。
スクラッチ はい (オプション) : フレームワークは Scratch を読み取ることはありません。
Buffer いいえ

クライアント ドライバーは、この構造体の読み取り専用メンバーの変更、EvtPacketQueueAdvance の呼び出し中に BeginIndexEndIndex を超えるインクリメントを、してはいけません。

ネットリングのインデックス所有権の詳細については、「ネットリングの概要」を参照してください。

NET_PACKET

NET_PACKET のフィールドは、データ パスが動作するさまざまなコンテキストの影響を受けます。 パケットの Ignore フィールドが設定されているかどうか、およびドライバーがパケットを受信 (Rx) しているか送信 (Tx) しているかによって、パケットに適用されるルールセットが変更されます。

次の表に、各シナリオでのドライバーの指示を示します。

Rx または Tx 無視フィールドの設定元 メモ
Rx クライアント ドライバー
  • Rx 中に、クライアント ドライバーは必要に応じて Ignore を設定し、フレームワークはそれを読み取ります。 クライアント ドライバーは、Rx 中のどの時点でも Ignore を読み取る必要はありません。
  • クライアント ドライバーが Rx 中に Ignore フィールドを設定する場合は、次のようになります。
    • クライアント ドライバーは、ハードウェアに正常にプログラムされていないパケットの Rx 操作を取り消すときに、Ignore フィールドに書き込む必要があります。 詳しくは、「ネット リングを使用したネットワーク データの取り消し」をご覧ください。
    • クライアント ドライバーは、リソースが解放されないため、パケットにリソースを関連付けないでください。
  • クライアント ドライバーが Rx 中に Ignore フィールドを設定しない場合は、次のようになります。
    • クライアント ドライバーは、FragmentIndexFragmentCountLayout のすべてのフィールドに入力する必要があります。
    • FragmentIndex 内で FragmentIndex は、BeginIndex から EndIndex までの間である必要があります。
    • FragmentCount は、フラグメント リング内の BeginIndex から EndIndex までの間のフラグメント数を超えることはできません。
    • クライアント ドライバーは、対応するフラグメント リング BeginIndex を移動する場合、パケット リング BeginIndex を移動する必要があります。
    • EvtPacketQueueAdvance を呼び出した後、クライアント ドライバーがパケット リングをインクリメントする場合 BeginIndex の場合、ドライバーは、そのパケットのフラグメントを超えてフラグメント リング BeginIndex をインクリメントする必要もあります。 つまり、フラグメント リング BeginIndex は、前のパケットのフラグメントの EndIndex に移動する必要があります。
Tx NetAdapterCx
  • クライアント ドライバーは、Scratch 以外のパケット内のフィールドを変更してはなりません。
  • クライアント ドライバーは Ignore の値を読み取れますが、書き込むことはできません。
  • Tx パケットが無視される場合、ドライバーは、必要に応じて Scratch 以外のフィールドを読み取らないでください。

NET_PACKET_LAYOUT

Rx 操作中、NET_PACKETLayout フィールドには、次の規則が適用されます。

  • Reserved0 を除くすべてのフィールドは、クライアント ドライバーによって初期化する必要があります。
  • Layer2TypeNetPacketLayer2TypeEthernet に設定されている場合、Layer2HeaderLength14 以上である必要があります。
  • Layer2TypeNetPacketLayer2TypeNull に設定されている場合は、Layer2HeaderLength0 に設定する必要があります。
  • Layer3Type が IPv4 タイプの場合、Layer3HeaderLength20 以上である必要があります。
  • Layer3Type が IPv6 タイプの場合、Layer3HeaderLength40 以上である必要があります。
  • Layer4TypeTcp に設定されている場合、Layer4HeaderLength40 以上である必要があります。
  • Layer4TypeUdp に設定されている場合、Layer4HeaderLength8 以上である必要があります。
  • レイヤー タイプ フィールドは適切な列挙範囲内にある必要があります。

Tx 中は、レイアウト は使用されません。

NET_FRAGMENT

NET_FRAGMENT フィールド ルールは、ドライバーが受信しているか送信しているか、および、フラグメント バッファーがドライバーとフレームワークのどちらによってパケットにアタッチされているかによって異なります。

Rx または Tx メモ
Rx
  • クライアント ドライバーは、OsReserved_Bounced フィールドに書き込むことができません。
  • ドライバが接続されていない場合は、Capacity を変更しないでください。ただし、ValidLengthOffset については、変更する必要があります。
  • ドライバーがアタッチされている場合は、CapacityValidLengthOffset をすべて変更する必要があります。
  • Offset + ValidLengthCapacity 未満である必要があります。
Tx
  • クライアント ドライバーは、Scratch 以外のフィールドを変更することができません。