NIC スイッチ機能の判断
このトピックでは、NDIS と上にあるドライバーが、単一ルート I/O 仮想化 (SR-IOV) をサポートするネットワーク アダプターの NIC スイッチ機能を決定する方法について説明します。 このトピックの内容は次のとおりです。
MiniportInitializeEx 中の NIC スイッチ機能の報告
注 SR-IOV ネットワーク アダプターの PCI Express (PCIe) 物理機能 (PF) のミニポート ドライバーのみが NIC スイッチ機能を報告できます。 PCIe 仮想関数 (VF) のミニポート ドライバーは、SR-IOV アダプターの NIC スイッチ機能を報告できません。
NIC スイッチの詳細は、「NIC スイッチ」をご覧ください。
MiniportInitializeEx 中の NIC スイッチ機能の報告
NDIS は、ミニポート ドライバーの MiniportInitializeEx 関数を呼び出すと、ドライバーは、次の NIC スイッチ機能を提供します。
ネットワーク アダプターがサポートできる NIC スイッチのハードウェア機能の完全なセット。
注 NDIS 6.30 以降では、ネットワーク アダプターに NIC スイッチが 1 つだけ作成されます。 このスイッチは、既定の NIC スイッチと呼ばれます。
ネットワーク アダプターで現在有効になっている NIC スイッチ機能。
ミニポート ドライバーは、次のように初期化された NDIS_NIC_SWITCH_CAPABILITIES 構造体を介して、下にあるネットワーク アダプターの NIC スイッチハードウェア機能を報告します。
ミニポート ドライバーは、Header メンバーを初期化します。 ドライバーは、Header の Type メンバーを NDIS_OBJECT_TYPE_DEFAULT に設定します。
NDIS 6.30 以降、ミニポート ドライバーは、Header の Revision メンバーを NDIS_NIC_SWITCH_CAPABILITIES_REVISION_2 に Size メンバーを NDIS_SIZEOF_NIC_SWITCH_CAPABILITIES_REVISION_2 に設定します。
ミニポート ドライバーは、NDIS_NIC_SWITCH_CAPABILITIES 構造体の NicSwitchCapabilities メンバーの適切なフラグを SR-IOV ネットワーク アダプターの NIC スイッチ機能に設定します。 たとえば、ミニポート ドライバーは、NIC スイッチがスイッチに作成された各仮想ポート (VPort) の割り込みモデレーションをサポートしている場合、NDIS_NIC_SWITCH_CAPS_PER_VPORT_INTERRUPT_MODERATION_SUPPORTED フラグを設定します。
ミニポート ドライバーは、NDIS_NIC_SWITCH_CAPABILITIES 構造体の他のメンバーを SR-IOV ネットワーク アダプターの NIC スイッチ機能の値の範囲に設定します。 たとえば、ミニポート ドライバーは、MaxNumVFs と MaxNumVPorts メンバーをアダプターがサポートできるVM と VPort の最大数に設定します。
注 ネットワーク アダプターで使用可能なハードウェア リソースに応じて、ミニポート ドライバーは、MaxNumVFs メンバーを *NumVFs キーワード未満の値に設定できます。 このキーワードの詳細については、「SR-IOV の標準化された INF キーワード」を参照してください。
NDIS は、ミニポート ドライバーの MiniportInitializeEx 関数を呼び出すと、ドライバーは、次の手順に従って、ネットワーク アダプターの NIC スイッチ機能を登録します。
ミニポート ドライバーは、NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES 構造体を初期化します。
ミニポート ドライバーは、以前に初期化された NDIS_NIC_SWITCH_CAPABILITIES 構造体へのポインターに HardwareNicSwitchCapabilities メンバーを設定します。
*SRIOV INF キーワーのレジストリ設定の値が 1 の場合、ネットワーク アダプターは現在、NIC スイッチの作成と構成に対して有効になっています。 ミニポート ドライバーは、CurrentNicSwitchCapabilities メンバーを同じ NDIS_NIC_SWITCH_CAPABILITIES 構造体へのポインターに設定します。
*SRIOV INF キーワーのレジストリ設定の値が 0 の場合、ネットワーク アダプターは現在、NIC スイッチの作成と構成に対して有効になっていません。 ミニポート ドライバーは、CurrentNicSwitchCapabilities メンバーを NULL に設定する必要があります。
*SRIOV INF キーワードの詳細については、「SR-IOV の標準化された INF キーワード」を参照してください。
ドライバーは NdisMSetMiniportAttributes を呼び出し、MiniportAttributes パラメーターを NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES 構造体へのポインターに設定します。
アダプターの初期化プロセスの詳細については、「ミニポート アダプターの初期化」を参照してください。
SR-IOV を使用せずに NIC スイッチを作成する
NDIS 6.60 以降のミニポート ドライバーは、SR-IOV が有効になっていない場合に、NIC スイッチと VMQ 機能の共存に関する次の要件に従う必要があります。 SR-IOV が有効になっている場合、ミニポート ドライバーは、前のセクションの既存の要件に従う必要があります。
- ミニポート ドライバーは、NIC スイッチと VMQ 機能の両方をアドバタイズします。
- NIC は、NIC の再起動なしで NIC スイッチと VMQ モードを切り替えることができます。
- NIC の初期起動時には、いずれかのモード (NIC スイッチの作成または VMQ キューの作成) になる準備ができています。
- NIC スイッチが作成された場合、ミニポートは後続の VMQ キューの割り当てコールバックに失敗します。
- VMQ キューが最初に作成された場合、ミニポート ドライバーは、VMQ キューの割り当てに成功し、NIC スイッチの割り当て呼び出しに失敗します。
- NIC スイッチが削除されるか、すべての VMQ キューが削除されると、ミニポート ドライバーは初期状態に戻り、これらのモードのいずれかに再度移行する準備が整います。
- NIC の初期起動時には、いずれかのモード (NIC スイッチの作成または VMQ キューの作成) になる準備ができています。
SR-IOV を使用せずに NIC スイッチを作成できることをアドバタイズするために、ミニポート ドライバーは、NDIS_NIC_SWITCH_CAPABILITIES 構造体の NicSwitchCapabilities メンバーの NDIS_NIC_SWITCH_CAPS_NIC_SWITCH_WITHOUT_IOV_SUPPORTED フラグを設定します。
上にあるドライバーによる NIC スイッチ機能の照会
NDIS は、次の方法でネットワーク アダプターにバインドする上にあるドライバーにネットワーク アダプターの現在有効な NIC スイッチ機能を渡します。
NDIS が上にあるフィルター ドライバーの FilterAttach 関数を呼び出すと、NDIS は AttachParameters パラメーターを介してネットワーク アダプターの NIC スイッチ機能を渡します。 このパラメーターには、NDIS_FILTER_ATTACH_PARAMETERS 構造体へのポインターが含まれています。 この構造体の NicSwitchCapabilities メンバーには NDIS_NIC_SWITCH_CAPABILITIES 構造体へのポインターが含まれています。
NDIS が上にあるプロトコル ドライバーの ProtocolBindAdapterEx 関数を呼び出すと、NDIS は BindParameters パラメーターを介してネットワーク アダプターの NIC スイッチ機能を渡します。 このパラメーターには、NDIS_FILTER_ATTACH_PARAMETERS 構造体へのポインターが含まれています。 この構造体の NicSwitchCapabilities メンバーには NDIS_NIC_SWITCH_CAPABILITIES 構造体へのポインターが含まれています。
NDIS は、上にあるプロトコルまたはフィルター ドライバーによって発行される、OID_NIC_SWITCH_HARDWARE_CAPABILITIES と OID_NIC_SWITCH_CURRENT_CAPABILITIES のオブジェクト識別子 (OID) クエリ要求を処理する場合、NDIS_NIC_SWITCH_CAPABILITIES 構造体も返します。