受信フィルター機能の判断

このトピックでは、NDIS と上にあるドライバーが、単一ルート I/O 仮想化 (SR-IOV) をサポートするネットワーク アダプターの受信フィルター機能を決定する方法について説明します。 このトピックの内容は次のとおりです。

MiniportInitializeEx 中の受信フィルター機能の報告

上にあるドライバーによる受信フィルター機能の照会

SR-IOV ネットワーク アダプターの PCI Express (PCIe) 物理機能 (PF) のミニポート ドライバーのみが受信フィルター機能を報告できます。 PCIe 仮想関数 (VF) のミニポート ドライバーは、SR-IOV アダプターの受信フィルター機能を報告できません。

MiniportInitializeEx 中の受信フィルター機能の報告

NDIS が、PF ミニポート ドライバーの MiniportInitializeEx 関数を呼び出すと、ドライバーは、次の受信フィルター機能を提供します。

  • ネットワーク アダプターでサポートできる完全なハードウェア受信フィルター機能。

  • ネットワーク アダプターで現在有効になっているインターフェイスの受信フィルター機能。

ミニポート ドライバーは、次のように初期化された NDIS_RECEIVE_FILTER_CAPABILITIES 構造体を介して、下にあるネットワーク アダプターの完全なハードウェア受信フィルター機能を報告します。

  1. ミニポート ドライバーは、Header メンバーを初期化します。 ドライバーは、HeaderType メンバーを NDIS_OBJECT_TYPE_DEFAULT に設定します。

    NDIS 6.30 以降、ミニポート ドライバーは、HeaderRevision メンバーを NDIS_RECEIVE_FILTER_CAPABILITIES_REVISION_2 に Size メンバーを NDIS_SIZEOF_RECEIVE_FILTER_CAPABILITIES_REVISION_2 に設定します。

  2. ミニポート ドライバーは、NDIS_RECEIVE_FILTER_CAPABILITIES 構造体の他のメンバーを SR-IOV ネットワーク アダプターの受信フィルター機能の値の範囲に設定します。 たとえば、ミニポート ドライバーは、ミニポート ドライバーがサポートするフィルター テスト操作を指定する SupportedFilterTests の適切なフラグを設定します。

  3. SR-IOV に加えて、受信フィルターは次のインターフェイスでも使用されます。

    ミニポート ドライバーが、これらのインターフェイスのいずれかをサポートしている場合、NDIS_RECEIVE_FILTER_CAPABILITIES 構造体のメンバーをインターフェイスに固有の受信フィルター機能の値の範囲に設定する必要があります。 たとえば、ドライバーが NDIS パケット合体と SR-IOV をサポートしている場合、SupportedQueueProperties メンバーの NDIS_RECEIVE_FILTER_PACKET_COALESCING_SUPPORTED_ON_DEFAULT_QUEUE フラグを設定する必要があります。

ミニポート ドライバーは、次のように初期化された NDIS_RECEIVE_FILTER_CAPABILITIES 構造体を介して、下にあるネットワーク アダプターの現在有効な受信フィルター機能を報告します。

  1. ミニポート ドライバーは、Header メンバーを初期化します。 ドライバーは、HeaderType メンバーを NDIS_OBJECT_TYPE_DEFAULT に設定します。

    NDIS 6.30 以降、ミニポート ドライバーは、HeaderRevision メンバーを NDIS_RECEIVE_FILTER_CAPABILITIES_REVISION_2 に Size メンバーを NDIS_SIZEOF_RECEIVE_FILTER_CAPABILITIES_REVISION_2 に設定します。

  2. ミニポート ドライバーは、現在有効になっているインターフェイスの受信フィルター機能の値の範囲に NDIS_RECEIVE_FILTER_CAPABILITIES 構造体の他のメンバーを設定します。 たとえば、NDIS パケット合体が有効になっている場合、ドライバーは、このテクノロジーに固有のメンバーのみを設定する必要があります。

    受信フィルターを使用するインターフェイスは、標準化された INF キーワードによって有効または無効になります。 NDIS パケット合体を有効にする方法の詳細については、「パケット合体の標準化された INF キーワード」を参照してください。 SR-IOV と VMQ を有効にする方法の詳細については、「SR-IOV、VMQ、RSS 標準化 INF キーワードの処理」を参照してください。

NDIS が、ミニポート ドライバーの MiniportInitializeEx 関数を呼び出すと、ドライバーは、次の手順に従って、ネットワーク アダプターの受信フィルター機能を登録します。

  1. ミニポート ドライバーは、NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES 構造体を初期化します。

    ミニポート ドライバーは、HardwareReceiveFilterCapabilities メンバーを NDIS_RECEIVE_FILTER_CAPABILITIES 構造体のアドレスに設定します。 この構造体は、ネットワーク アダプターの完全なハードウェア受信フィルター機能を使用して以前に初期化されました。

  2. VMQ、SR-IOV、NDIS パケット合体がすべてネットワーク アダプターで現在無効になっている場合、ミニポート ドライバーは CurrentReceiveFilterCapabilities メンバーを NULL に設定します。

  3. VMQ、SR-IOV、または NDIS パケット合体のいずれかが現在ネットワーク アダプターで有効になっている場合、ミニポート ドライバーは、次の操作を行う必要があります。

    • ミニポート ドライバーは、ネットワーク アダプターで現在有効になっているインターフェイスの現在の受信フィルター機能で別の NDIS_RECEIVE_FILTER_CAPABILITIES 構造体を初期化する必要があります。

      SR-IOV インターフェイスが有効になっている場合、ミニポート ドライバーが NDIS_RECEIVE_FILTER_CAPABILITIES 構造体のメンバーを同じまたは異なる値に設定する必要がある状況があります。 これは、SR-IOV インターフェイスが VMQ と同様のキュー メカニズムを提供するが、VM 受信キューの代わりに仮想ポート (VPorts) を使用するためです。

      たとえば、ミニポート ドライバーは、VMQ または SR-IOV インターフェイスのいずれかが有効になっている場合、EnabledFilterTypes メンバーの NDIS_RECEIVE_FILTER_VMQ_FILTERS_ENABLED フラグを設定する必要があります。 ただし、ミニポート ドライバーは、SR-IOV インターフェイスが有効になっている場合は NumQueues メンバーを 0 に設定し、VMQ インターフェイスが有効になっている場合は 0 以外の値に設定する必要があります。

    • ミニポート ドライバーは、CurrentReceiveFilterCapabilities メンバーを、現在有効になっているインターフェイスの現在の受信フィルター機能を含む NDIS_RECEIVE_FILTER_CAPABILITIES 構造体のアドレスに設定します。

  4. 現在、ネットワーク アダプターで VMQ、SR-IOV、または NDIS パケット合体が有効になっている場合、ミニポート ドライバーは HardwareReceiveFilterCapabilities メンバーを NDIS_RECEIVE_FILTER_CAPABILITIES 構造体のアドレスに設定します。 この構造体は、ネットワーク アダプターの現在有効な受信フィルター機能を使用して以前に初期化されました。

  5. ドライバーは NdisMSetMiniportAttributes を呼び出し、MiniportAttributes パラメーターを NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES 構造体へのポインターに設定します。

アダプターの初期化プロセスの詳細については、「ミニポート アダプターの初期化」を参照してください。

上にあるドライバーによる受信フィルター機能の照会

NDIS は、次の方法でネットワーク アダプターにバインドする上にあるドライバーにネットワーク アダプターの現在有効な受信フィルター機能を渡します。

  • NDIS が上にあるフィルター ドライバーの FilterAttach 関数を呼び出すと、NDIS は AttachParameters パラメーターを介してネットワーク アダプターの NIC スイッチ機能を渡します。 このパラメーターには、NDIS_FILTER_ATTACH_PARAMETERS 構造体へのポインターが含まれています。 この構造体の ReceiveFilterCapabilities メンバーには NDIS_RECEIVE_FILTER_CAPABILITIES 構造体へのポインターが含まれています。

  • NDIS が上にあるプロトコル ドライバーの ProtocolBindAdapterEx 関数を呼び出すと、NDIS は BindParameters パラメーターを介してネットワーク アダプターの NIC スイッチ機能を渡します。 このパラメーターには、NDIS_FILTER_ATTACH_PARAMETERS 構造体へのポインターが含まれています。 この構造体の ReceiveFilterCapabilities メンバーには NDIS_RECEIVE_FILTER_CAPABILITIES 構造体へのポインターが含まれています。

NDIS は、上にあるプロトコルまたはフィルター ドライバーによって発行される OID_RECEIVE_FILTER_CURRENT_CAPABILITIESOID_RECEIVE_FILTER_HARDWARE_CAPABILITIES のオブジェクト識別子 (OID) クエリ要求を処理する場合、NDIS_RECEIVE_FILTER_CAPABILITIES 構造体も返します。