受信フィルター機能の判断
このトピックでは、NDIS と上にあるドライバーが、単一ルート I/O 仮想化 (SR-IOV) をサポートするネットワーク アダプターの受信フィルター機能を決定する方法について説明します。 このトピックの内容は次のとおりです。
MiniportInitializeEx 中の受信フィルター機能の報告
注 SR-IOV ネットワーク アダプターの PCI Express (PCIe) 物理機能 (PF) のミニポート ドライバーのみが受信フィルター機能を報告できます。 PCIe 仮想関数 (VF) のミニポート ドライバーは、SR-IOV アダプターの受信フィルター機能を報告できません。
MiniportInitializeEx 中の受信フィルター機能の報告
NDIS が、PF ミニポート ドライバーの MiniportInitializeEx 関数を呼び出すと、ドライバーは、次の受信フィルター機能を提供します。
ネットワーク アダプターでサポートできる完全なハードウェア受信フィルター機能。
ネットワーク アダプターで現在有効になっているインターフェイスの受信フィルター機能。
ミニポート ドライバーは、次のように初期化された NDIS_RECEIVE_FILTER_CAPABILITIES 構造体を介して、下にあるネットワーク アダプターの完全なハードウェア受信フィルター機能を報告します。
ミニポート ドライバーは、Header メンバーを初期化します。 ドライバーは、Header の Type メンバーを NDIS_OBJECT_TYPE_DEFAULT に設定します。
NDIS 6.30 以降、ミニポート ドライバーは、Header の Revision メンバーを NDIS_RECEIVE_FILTER_CAPABILITIES_REVISION_2 に Size メンバーを NDIS_SIZEOF_RECEIVE_FILTER_CAPABILITIES_REVISION_2 に設定します。
ミニポート ドライバーは、NDIS_RECEIVE_FILTER_CAPABILITIES 構造体の他のメンバーを SR-IOV ネットワーク アダプターの受信フィルター機能の値の範囲に設定します。 たとえば、ミニポート ドライバーは、ミニポート ドライバーがサポートするフィルター テスト操作を指定する SupportedFilterTests の適切なフラグを設定します。
SR-IOV に加えて、受信フィルターは次のインターフェイスでも使用されます。
NDIS Packet Coalescing。 このインターフェイスで受信フィルターを使用する方法の詳細については、「パケット結合受信フィルターの管理」を参照してください。
仮想マシン キュー (VMQ)。 このインターフェイスで受信フィルターを使用する方法の詳細については、「VMQ フィルターの設定とクリア」を参照してください。
ミニポート ドライバーが、これらのインターフェイスのいずれかをサポートしている場合、NDIS_RECEIVE_FILTER_CAPABILITIES 構造体のメンバーをインターフェイスに固有の受信フィルター機能の値の範囲に設定する必要があります。 たとえば、ドライバーが NDIS パケット合体と SR-IOV をサポートしている場合、SupportedQueueProperties メンバーの NDIS_RECEIVE_FILTER_PACKET_COALESCING_SUPPORTED_ON_DEFAULT_QUEUE フラグを設定する必要があります。
ミニポート ドライバーは、次のように初期化された NDIS_RECEIVE_FILTER_CAPABILITIES 構造体を介して、下にあるネットワーク アダプターの現在有効な受信フィルター機能を報告します。
ミニポート ドライバーは、Header メンバーを初期化します。 ドライバーは、Header の Type メンバーを NDIS_OBJECT_TYPE_DEFAULT に設定します。
NDIS 6.30 以降、ミニポート ドライバーは、Header の Revision メンバーを NDIS_RECEIVE_FILTER_CAPABILITIES_REVISION_2 に Size メンバーを NDIS_SIZEOF_RECEIVE_FILTER_CAPABILITIES_REVISION_2 に設定します。
ミニポート ドライバーは、現在有効になっているインターフェイスの受信フィルター機能の値の範囲に NDIS_RECEIVE_FILTER_CAPABILITIES 構造体の他のメンバーを設定します。 たとえば、NDIS パケット合体が有効になっている場合、ドライバーは、このテクノロジーに固有のメンバーのみを設定する必要があります。
受信フィルターを使用するインターフェイスは、標準化された INF キーワードによって有効または無効になります。 NDIS パケット合体を有効にする方法の詳細については、「パケット合体の標準化された INF キーワード」を参照してください。 SR-IOV と VMQ を有効にする方法の詳細については、「SR-IOV、VMQ、RSS 標準化 INF キーワードの処理」を参照してください。
NDIS が、ミニポート ドライバーの MiniportInitializeEx 関数を呼び出すと、ドライバーは、次の手順に従って、ネットワーク アダプターの受信フィルター機能を登録します。
ミニポート ドライバーは、NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES 構造体を初期化します。
ミニポート ドライバーは、HardwareReceiveFilterCapabilities メンバーを NDIS_RECEIVE_FILTER_CAPABILITIES 構造体のアドレスに設定します。 この構造体は、ネットワーク アダプターの完全なハードウェア受信フィルター機能を使用して以前に初期化されました。
VMQ、SR-IOV、NDIS パケット合体がすべてネットワーク アダプターで現在無効になっている場合、ミニポート ドライバーは CurrentReceiveFilterCapabilities メンバーを NULL に設定します。
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 構造体のアドレスに設定します。
現在、ネットワーク アダプターで VMQ、SR-IOV、または NDIS パケット合体が有効になっている場合、ミニポート ドライバーは HardwareReceiveFilterCapabilities メンバーを NDIS_RECEIVE_FILTER_CAPABILITIES 構造体のアドレスに設定します。 この構造体は、ネットワーク アダプターの現在有効な受信フィルター機能を使用して以前に初期化されました。
ドライバーは 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_CAPABILITIES と OID_RECEIVE_FILTER_HARDWARE_CAPABILITIES のオブジェクト識別子 (OID) クエリ要求を処理する場合、NDIS_RECEIVE_FILTER_CAPABILITIES 構造体も返します。