物理ネットワーク アダプターへの OID 要求の転送
このトピックでは、Hyper-V 拡張可能スイッチ拡張機能が、基になる物理アダプターのオブジェクト識別子 (OID) 要求を Hyper-V 拡張可能スイッチ制御パス経由で転送する方法について説明します。 この拡張機能は、このトピックで説明されている方法に従い、OID 要求を基になる物理ネットワーク アダプターに送信することもできます。
たとえば、外部ネットワーク アダプターは、NDIS マルチプレクサー (MUX) 中間ドライバーの仮想ミニポート エッジにバインドできます。 MUX ドライバーは、ホスト上の 1 つ以上の物理ネットワークのチームにバインドされます。 この構成は拡張可能スイッチ チームと呼ばれています。
この構成では、拡張可能スイッチ拡張機能がチーム内のすべてのネットワーク アダプターに公開されます。 これにより、拡張機能は、チーム内の個々のネットワーク アダプターの構成と使用を管理できます。 たとえば、転送拡張機能では、送信パケットを個々のアダプターに転送することで、チーム経由の負荷分散フェールオーバー (LBFO) ソリューションのサポートを提供できます。 拡張可能スイッチ チームを管理する転送拡張機能は、チーミング プロバイダーと呼ばれます。 チーミング プロバイダーの詳細については、「チーミング プロバイダー拡張機能」を参照してください。
次の図は、NDIS 6.40 (Windows Server 2012 R2) 以降の拡張可能スイッチ チームの例を示しています。
次の図は、NDIS 6.30 (Windows Server 2012) の拡張可能スイッチ チームの例を示しています。
注: Hyper-V 拡張可能スイッチ インターフェイスでは、NDIS フィルター ドライバーは拡張可能スイッチ拡張機能と呼ばれ、ドライバー スタックは拡張可能スイッチ ドライバー スタックと呼ばれます。
OID 要求は、基になる物理ネットワーク アダプターに要求を転送するためにカプセル化する必要があります。 OID 要求は、最初に NDIS_SWITCH_NIC_OID_REQUEST 構造内にカプセル化されます。 次に、OID要求は、OID_SWITCH_NIC_REQUESTの OID セット要求によって拡張可能スイッチ制御パスを介して転送されます。
基礎となる物理アダプターへの OID 要求は、以下によって発行されます。
拡張可能なスイッチ インターフェイス。
ハードウェア オフロードの要求などの OID 要求は、次のいずれかで実行される、上位のプロトコル、または、フィルター ドライバーによって発行されます。
Hyper-V 親パーティションで実行される管理オペレーティング システム。
Hyper-V 子パーティションで実行される、ゲスト オペレーティング システム。
これらの OID 要求が拡張可能スイッチによって受信されると、カプセル化され、拡張可能スイッチ制御パスを介して転送されます。 転送拡張機能は、カプセル化された OID 要求を受信すると、基になる物理アダプターに要求を転送できます。 この機能は、ハードウェア オフロード用に拡張可能スイッチ チームを構成する場合に特に役立ちます。
たとえば、MUX ドライバーは、拡張可能なスイッチ チーム全体の共通の機能をアドバタイズします。 ただし、転送拡張機能は、OID 要求を発行して、チーム内のアダプターの個々の機能を照会または設定できます。 その後、転送拡張機能は、外部ネットワーク アダプターから NDIS 状態表示を発信し、チーム全体に適用される機能について、上にあるドライバーに通知できます。 この手順の詳細については、「物理ネットワーク アダプターからの NDIS 状態表示の発生」を参照してください。
転送拡張機能が、制御パス経由で OID 要求を転送すると、外部ネットワーク アダプターによって受信されます。 この時点で、OID 要求は、カプセル化解除され、指定された物理ネットワーク アダプターに転送されます。
注: Windows Server 2012 以降では、ハードウェア オフロード OID 要求のみがカプセル化され、この方法で転送されます。 たとえば、仮想マシン キュー (VMQ)、または、インターネット プロトコル セキュリティ (IPsec) のオフロード OID 要求は、カプセル化され、拡張可能なスイッチ制御パスを介して転送されます。 詳細については、「物理ネットワーク アダプタへのハードウェア オフロード OID 要求の管理」を参照してください。
転送内線番号。
転送拡張機能は、それぞれ固有の、カプセル化された OID 要求を発信し、基になる物理ネットワーク アダプターに転送できます。 転送拡張機能は、標準の NDIS OID 要求をカプセル化することができます。 転送拡張機能は、物理ネットワーク アダプター独立系ハードウェア ベンダー (IHV) が定義したプライベート OID 要求をカプセル化することもできます。 これにより、IHV が開発した転送拡張機能を使用して、チーム内の個々の物理アダプターで、独自の属性を有効または無効にすることができます。
さらに、転送拡張機能は、カプセル化されたハードウェア オフロード OID 要求を発信して、指定した Hyper-V 子パーティションにリソースを割り当てることができます。 たとえば、転送拡張機能は、OID_RECEIVE_FILTER_ALLOCATE_QUEUE のカプセル化された OID 要求を発信して、指定した子パーティションに VMQ を割り当てることができます。 この場合、拡張機能は、パーティションに関連付けられている拡張可能スイッチ ポートとネットワーク アダプター接続から発信された要求として、要求をカプセル化します。
注: 転送拡張機能は、上にあるドライバーによって発行されたのと同じ OID 要求をフィルター処理している場合にのみ、独自のカプセル化されたハードウェア オフロード OID 要求を発信できます。 この場合、拡張機能は、元の OID 要求を転送してはなりません。 代わりに、NDIS が FilterOidRequestComplete を呼び出して、元の OID 要求を完了するときに、拡張機能は NdisFOidRequestComplete を呼び出してこの要求を完了する必要があります。
拡張機能のフィルタリングまたはキャプチャ
フィルター処理またはキャプチャ拡張機能は、独自のカプセル化された OID クエリ要求を発信して、基になる物理ネットワーク アダプターに転送できます。 これらの拡張機能は、物理ネットワーク アダプターの独立系ハードウェア ベンダー (IHV) によって定義された標準の NDIS OID クエリ要求またはプライベート OID クエリ要求をカプセル化できます。
注: 転送拡張機能のみが、カプセル化された OID セット要求を基になる物理アダプターに発信できます。
転送拡張機能は、基になる物理アダプターの、カプセル化された OID 要求を、転送、リダイレクト、発信するときに、次の手順に従う必要があります。
転送拡張機能が OID 要求を発信している場合は、要求に関連する情報を使用して、拡張機能が割り当てられた NDIS_OID_REQUEST 構造体を初期化する必要があります。
拡張機能が OID 要求を転送している場合は、FilterOidRequest 関数の OidRequest パラメーターによって参照される既存の NDIS_OID_REQUEST 構造体を変更しないでください。 代わりに、拡張機能は NdisAllocateCloneOidRequest を呼び出して、新しい NDIS_OID_REQUEST 構造体にメモリを割り当て、既存の NDIS_OID_REQUEST 構造体からすべての情報をコピーする必要があります。
拡張機能は、拡張機能によって割り当てられた NDIS_SWITCH_NIC_OID_REQUEST 構造体のメンバーを次の値に設定します。
この DestinationPortId メンバーは、外部ネットワーク アダプターが接続されている拡張可能スイッチ ポートの識別子に設定する必要があります。
この DestinationNicIndex メンバーは、基になる物理ネットワーク アダプターの 0 以外のインデックス値に設定する必要があります。
これらのインデックス値の詳細は、「ネットワーク アダプターのインデックス値」を参照してください。
転送拡張機能が Hyper-V 子パーティションのハードウェア オフロード OID 要求を発信している場合は、SourcePortId メンバーを、パーティションで使用されるポートの識別子に設定する必要があります。 また、SourceNicIndex メンバーは、そのポートへのネットワーク接続のネットワーク アダプター インデックスに設定する必要があります。
転送拡張機能が、固有の目的で、標準またはプライベート OID 要求を発信する場合は、SourcePortId および SourceNicIndex メンバーを 0 に設定する必要があります。
転送拡張機能がハードウェア オフロード OID 要求を転送またはリダイレクトする場合は、拡張可能スイッチ インターフェイスによって設定された SourcePortId およびSourceNicIndex メンバーの値を保持する必要があります。
OidRequest メンバーは、カプセル化された OID 要求の初期化された NDIS_OID_REQUEST 構造体へのポインターに設定する必要があります。 転送拡張機能は、この構造体を割り当てて初期化するか、構造体の複製コピーを使用します。
拡張機能は、拡張機能によって割り当てられた NDIS_OID_REQUEST 構造体のメンバーを次の値に設定します。
Oid メンバーを OID_SWITCH_NIC_REQUEST に設定する必要があります。
InformationBuffer メンバーには、生成またはフィルター処理された OID 要求データを含む、バッファーへのポインターが含まれている必要があります。
InformationBufferLength メンバーには、生成またはフィルターに掛けられた OID 要求データを含むバッファーの長さ (バイト単位) が含まれている必要があります。
拡張機能は、他のメンバーを NDIS_OID_REQUEST 構造体に有効な値に設定します。
拡張機能は ReferenceSwitchNic を呼び出して、宛先物理ネットワーク アダプターのインデックスの参照カウンターをインクリメントします。 これにより、拡張可能スイッチ インターフェイスは、参照カウンターが 0 以外の間に、物理ネットワーク アダプター接続を削除しないことが保証されます。
拡張機能が ReferenceSwitchNic を呼び出すと、SwitchPortId パラメーターが SourcePortId メンバーに指定された値に設定されます。 また、拡張機能は SwitchNicIndex パラメーターを DestinationNicIndex メンバーに指定された値に設定します。
注: ReferenceSwitchNic がNDIS_STATUS_SUCCESS を返さない場合、OID 要求を、宛先の物理ネットワーク アダプターに転送できません。
転送拡張機能が Hyper-V 子パーティションのハードウェア オフロード OID 要求を発信している場合は、ReferenceSwitchNic も呼び出して、パーティションに関連付けられているソース ネットワーク アダプター接続のインデックスの参照カウンターをインクリメントします。 これにより、拡張可能スイッチ インターフェイスは、参照カウンターが 0 以外の間に、物理ネットワーク アダプター接続を削除しないことが保証されます。
拡張機能が ReferenceSwitchNic を呼び出すときに、SwitchPortId パラメーターを SourcePortId メンバーに指定された値に設定します。 また、この拡張機能は SwitchNicIndex パラメーターを SourceNicIndex メンバーに指定された値に設定します。
注: ReferenceSwitchNic がNDIS_STATUS_SUCCESS を返さない場合、OID 要求を、宛先の物理ネットワーク アダプターに転送できません。
拡張機能は NdisFOidRequest を呼び出して、カプセル化された OID 要求を指定された宛先拡張可能スイッチ ポートとネットワーク アダプターに転送します。
注: 拡張機能がフィルター処理された OID 要求を転送している場合は、FilterOidRequest 関数の呼び出しのコンテキスト内で NdisFOidRequest を呼び出す必要があります。 拡張機能が生成した OID 要求を転送している場合は、Running、Restarting、Paused、Pausing 状態にあるときに NdisFIndicateStatus を呼び出します。 これらの状態の詳細については、「モジュールの状態と操作のフィルター処理」を参照してください。
NDIS が FilterOidRequestComplete 関数を呼び出すと、拡張機能は、 DereferenceSwitchNic を呼び出して、宛先の物理ネットワーク アダプターのインデックスの参照カウンターをクリアします。
転送拡張機能が Hyper-V 子パーティションのハードウェア オフロード OID 要求を発信した場合は、DereferenceSwitchNic も呼び出して、アダプターのソース ネットワーク アダプター接続のインデックスの参照カウンターをクリアします。
どちらの場合も、拡張機能は SwitchPortId パラメーターと SwitchNicIndex パラメーターを、ReferenceSwitchNic の呼び出しで使用したのと同じ値に設定します。
拡張機能が OID 要求を発行する方法の詳細は、「NDIS フィルター ドライバーからの OID 要求の生成」を参照してください。
MUX ドライバーの詳細については、「NDIS MUX 中間ドライバー」を参照してください。