仮想ポートでの受信フィルターの設定

ネットワーク アダプターの NIC スイッチに仮想ポート (VPort) が作成された後、上位ドライバーは、VPort で受信フィルターを設定できます。 VPort を作成したドライバーのみが、その VPort で受信フィルターを設定できます

このトピックの内容は次のとおりです。

VPort での受信フィルターの設定

NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO フラグの使用

フィルター識別子の使用

VPort での受信フィルターの処理

VPort を作成する方法の詳細については、「仮想ポートの作成」を参照してください

既定の VPort は常に存在し、明示的に作成されることはないため、上位ドライバーは既定の VPort で受信フィルターを設定できます。 基になるドライバーは、既定の VPort を所有していません。 したがって、ネットワーク アダプターにバインドされているすべてのプロトコル ドライバーは、規定の VPort を使用できます。 既定の VPort には、NDIS_DEFAULT_VPORT_ID の識別子の値が含まれています。

VPort での受信フィルターの設定

VPort でフィルターを設定および構成するために、基になるドライバーは、OID_RECEIVE_FILTER_SET_FILTERのオブジェクト識別子 (OID) メソッド要求を発行します。 この NDIS_OID_REQUEST 構造の InformationBuffer メンバーは、最初に NDIS_RECEIVE_FILTER_PARAMETERS 構造へのポインターを含んでいます。

基になるドライバーがこの OID メソッド要求を発行する前に、これは NDIS_RECEIVE_FILTER_PARAMETERS 構造体を初期化する必要があります。 上位ドライバーは、次の方法でこの構造体のメンバーを設定する必要があります:

  • FilterType メンバーは、NDIS_RECEIVE_FILTER_TYPE リスト値に設定する必要があります。

    NDIS 6.30 以降では、単一ルート I/O 仮想化 (SR-IOV) インターフェイスでは NdisReceiveFilterTypeVMQueue フィルターの種類のみがサポートされています。

  • QueueId メンバーは、NDIS_DEFAULT_RECEIVE_QUEUE_ID に設定する必要があります。

  • VPortId メンバーは、VPort に関連付けられている識別子に設定する必要があります。 上位ドライバーは、次のいずれかの方法で VPort 識別子を取得します:

  • FilterId メンバーは、NDIS_DEFAULT_RECEIVE_FILTER_ID に設定する必要があります。

    NDIS は、処理のためにミニポート ドライバーに OID 要求を転送する前に、このメンバーの一意のフィルター識別子を割り当てます。

  • NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 構造体の配列を定義するには、NDIS_RECEIVE_FILTER_PARAMETERS 構造体の FieldParametersArrayOffsetFieldParametersArrayNumElementsFieldParametersArrayElementSize メンバーを適切に設定する必要があります。 配列内の各 NDIS_RECEIVE_FILTER_FIELD_PARAMETERS 構造体は、ネットワーク ヘッダー内の 1 つのフィールドのフィルター テスト条件を設定します。

    SR-IOV インターフェイスでは、次のフィールド テスト パラメーターが定義されています:

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

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

OID メソッド要求から正常に返された後、NDIS_OID_REQUEST 構造体の InformationBuffer メンバーには、新しいフィルター識別子を持つ NDIS_RECEIVE_FILTER_PARAMETERS 構造体へのポインターが含まれます。

NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO フラグの使用

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 フラグが Flags メンバーに設定されている場合、ネットワーク アダプターは、次のすべてのテスト条件に一致する受信パケットのみを示す必要があります:

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

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

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

    仮想化スタックが MAC アドレス フィルターを設定し、OID_RECEIVE_FILTER_SET_FILTER セット要求によって VLAN 識別子フィルターが構成されていない場合、スイッチは NDIS_RECEIVE_FILTER_FIELD_MAC_HEADER_VLAN_UNTAGGED_OR_ZERO フラグも設定します。

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

    • ミニポート ドライバーは、OID_RECEIVE_FILTER_SET_FILTER メソッド要求の失敗した状態を返す必要があります。

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

  • プロトコル ドライバーが MAC アドレス フィルターと VLAN 識別子フィルターを OID_RECEIVE_FILTER_SET_FILTER メソッド要求と共に設定した場合、いずれのフィルター フィールドにも 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 メソッド要求を渡します。 VPort に設定された各フィルターは、ネットワーク アダプターについて一意のフィルター識別子を持ちます。 つまり、フィルター識別子は、ネットワーク アダプターが管理する異なるキューでは重複しません。

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

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

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

VPort での受信フィルターの処理

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

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

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

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

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

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