VMQ フィルターの設定

受信キューが割り当てられた後、基になるドライバーは、受信キューにフィルターを設定できます。 受信キューを割り当てたプロトコル ドライバーのみが、そのキューにフィルターを設定できます。

既定の受信キュー (NDIS_DEFAULT_RECEIVE_QUEUE_ID) は常に存在するため、上位ドライバーは常に既定のキューに受信フィルターを設定できます。 上位ドライバーは、既定のキューを所有していません。 したがって、ネットワーク アダプターにバインドされているすべてのプロトコル ドライバーは、規定の キュー を使用できます。

受信キューでのフィルターの設定

構成パラメーターの初期セットを使用して受信キューにフィルターを設定するために、基になるドライバーは OID_RECEIVE_FILTER_SET_FILTER メソッド オブジェクト識別子 (OID) 要求を発行します。 この NDIS_OID_REQUEST 構造の InformationBuffer メンバーは、最初に NDIS_RECEIVE_FILTER_PARAMETERS 構造へのポインターを含んでいます。 OID メソッド要求から正常に返された後、NDIS_OID_REQUEST 構造体の InformationBuffer メンバーには、新しいフィルター識別子を持つ NDIS_RECEIVE_FILTER_PARAMETERS 構造体へのポインターが含まれます。

上位ドライバーは、受信キューの次のフィルター構成パラメーターを使用して、NDIS_RECEIVE_FILTER_PARAMETERS 構造体を初期化します。

  • NDIS_RECEIVE_FILTER_TYPE 列挙値によって指定されるフィルターの種類。

    NDIS 6.20 以降では、NdisReceiveFilterTypeVMQueue フィルターの種類のみが仮想マシン キュー (VMQ) インターフェイスでサポートされています。

  • キュー識別子。

  • NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 構造体として書式設定された 1 つ以上のフィールド テスト パラメーター。 VMQ の場合、次のフィールド テスト パラメーターが定義されています。

    • パケット内の宛先メディア アクセス制御 (MAC) アドレスは、指定された MAC アドレスと等しくなります。

    • パケット内の仮想 LAN (VLAN) 識別子は、指定された VLAN 識別子と等しくなります。

NDIS_RECEIVE_FILTER_PARAMETERS構造体は、フィルターの構成パラメーターを指定するために、OID_RECEIVE_FILTER_PARAMETERS OID および OID_RECEIVE_FILTER_SET_FILTER OID と共に使用されます。

NDIS_RECEIVE_FILTER_PARAMETERS 構造体の FieldParametersArrayOffsetFieldParametersArrayNumElements、および FieldParametersArrayElementSize メンバーは、NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 構造体の配列を定義します。 配列内の各 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 構造体は、ネットワーク ヘッダー内の 1 つのフィールドのフィルター テスト条件を設定します。

NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 構造体の Flags メンバーは、受信フィルターに対して実行するアクションを指定します。 NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO フラグには、次の点が適用されます:

  • NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO フラグが NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 構造体の Flags メンバーに設定されている場合、ネットワーク アダプターは、次のすべてのテスト条件に一致する受信パケットのみを示す必要があります:

    • 一致する MAC アドレスを持つパケット。

    • VLAN タグがないパケット、または VLAN 識別子が 0 のパケット。

    NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO フラグが設定されている場合、ネットワーク アダプターは、一致する MAC アドレスと 0 以外の VLAN 識別子を持つパケットを示してはなりません。

    Hyper-V 拡張可能スイッチが MAC アドレス フィルターを設定し、OID_RECEIVE_FILTER_SET_FILTER に VLAN 識別子フィルターが構成されていない場合、スイッチは NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO フラグも設定します。

  • NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO フラグが設定されておらず、OID_RECEIVE_FILTER_SET_FILTER の OID セット要求によって構成された VLAN 識別子フィルターがない場合、ミニポート ドライバーは次のいずれかを実行する必要があります:

    • ミニポート ドライバーが NDIS 6.20 をサポートしている場合は、OID_RECEIVE_FILTER_Standard Edition T_FILTERの OID 要求の失敗した状態を返す必要があります。

    • ミニポート ドライバーが NDIS 6.30 以降のバージョンの NDIS をサポートしている場合は、指定した MAC アドレス フィールドを検査してフィルター処理するようにネットワーク アダプターを構成する必要があります。 受信したパケットに VLAN タグが存在する場合、ネットワーク アダプターはパケット データから VLAN タグを削除する必要があります。 ミニポート ドライバーは、パケットの NET_BUFFER_LIST 構造に関連付けられている NDIS_NET_BUFFER_LIST_8021Q_INFO に VLAN タグを配置する必要があります。

  • プロトコル ドライバーが MAC アドレス フィルターと VLAN 識別子フィルターを OID_RECEIVE_FILTER_SET_FILTER OID と共に設定した場合、いずれのフィルター フィールドにも NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO フラグは設定されません。 この場合、ミニポート ドライバーは、指定した MAC アドレスと VLAN 識別子の両方に一致するパケットを示す必要があります。 つまり、ミニポートドライバは、一致する MAC アドレスを持つパケットのうち、VLAN 識別子がゼロのもの、またはタグなしパケットを示すべきではありません。

フィルター識別子の使用

NDIS は、NDIS_RECEIVE_FILTER_PARAMETERS 構造体の FilterId メンバーにフィルター識別子を割り当て、基になるミニポート ドライバーに OID_RECEIVE_FILTER_SET_FILTER の OID メソッド要求を渡します。 受信キューに設定された各フィルターには、ネットワーク アダプターの一意のフィルター識別子があります。 つまり、フィルター識別子は、ネットワーク アダプターが管理する異なるキューでは重複しません。

上位ドライバーは、後の OID 要求で NDIS が提供するフィルター識別子を使用する必要があります。たとえば、フィルター パラメーターを変更したり、フィルターを解放したりします。

NDIS は、受信キューにフィルターを設定する OID 要求を受信すると、フィルター パラメーターを検証します。 NDIS は、必要なリソースとフィルター識別子を割り当てた後、基になるネットワーク アダプターに OID 要求を送信します。 ネットワーク アダプターは、フィルターに必要なソフトウェアとハードウェア リソースを正常に割り当てることができる場合は、NDIS_STATUS_SUCCESS で OID 要求を完了します。

ミニポート ドライバーは、割り当てられた受信フィルターのフィルター識別子を保持する必要があります。 NDIS は、受信フィルター パラメーターを変更したり、受信フィルターをクリアしたりするために、後の OID 要求にフィルターのフィルター識別子を使用します。 パラメーターを変更してフィルターをクリアする方法の詳細については、「VM キュー パラメーターの取得と更新」 および 「VMQ フィルターのクリア」 を参照してください。

受信キューでのフィルターの処理

ミニポート ドライバーは、次の方法でフィルターに基づいてネットワーク アダプターをプログラムします:

  • キュー にパケットを割り当てるには、特定のフィルターのすべてのフィールド テスト パラメーターが一致している必要があります。

  • キューには複数のフィルターを設定できます。

  • いずれかのフィルターに合格した場合は、受信キューにパケットを割り当てる必要があります。

ネットワーク アダプターは、すべてのフィールド テストの結果を論理 AND 操作と組み合わせます。 つまり、NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 構造体の配列に含まれるフィールド テストが失敗した場合、ネットワーク パケットは指定されたフィルター条件を満たしていません。

ネットワーク アダプターは、これらのフィルター条件に対して受信パケットをテストするときに、テスト条件が指定されていないパケット内のすべてのフィールドを無視する必要があります。

受信キューからのパケットの受信

ミニポート ドライバーが、 OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE 要求を受信し、キューに設定されているフィルターをもった後、キューは Running 状態になります。 キューがこの状態にある間、ミニポート ドライバーは、キュー上のパケットを示すことができます。 キューの状態の詳細については、キューの状態と操作を参照してください。

ミニポート ドライバーがキューの OID_RECEIVE_FILTER_QUEUE_ALLOCATION_COMPLETE OID 要求を受信したが、キューにフィルターが設定されていない場合、ミニポート ドライバーは、そのキューの受信パケットを示してはいけません。 この場合、ミニポート ドライバーは、キューの OID_RECEIVE_FILTER_SET_FILTER OID 要求を受信し、場合によっては OID 要求を完了する前に、そのキューのパケットを示すことができます。 ミニポート ドライバーが OID_RECEIVE_FILTER_Standard Edition T_FILTER OID 要求の処理中にキューのパケットを示す場合、ミニポート ドライバーは、NDIS_STATUS_SUCCESS リターン コードを持つ OID_RECEIVE_FILTER_SET_FILTER 要求を完了する必要があります。