仮想ポートの作成
仮想ポート (VPort) は、単一ルート I/O 仮想化 (SR-IOV) をサポートするネットワーク アダプターの NIC スイッチの内部ポートを表すデータ オブジェクトです。 各 NIC スイッチには、ネットワーク接続用の次のポートがあります。
外部物理ネットワークに接続するための 1 つの外部物理ポート。
PCI Express(PCIe)物理機能(PF)または仮想機能(VF)に接続されている1つ以上の内部VPort。
PF は Hyper-V 親パーティションにアタッチされ、そのパーティションで実行される管理オペレーティング システムの仮想ネットワーク アダプターとして公開されます。
VF は Hyper-V 子パーティションにアタッチされ、そのパーティションで実行されるゲスト オペレーティング システムの仮想ネットワーク アダプターとして公開されます。
VPort には 2 つのタイプがあります。
デフォルトVPort
既定の VPort は、管理オペレーティング システムで実行されるネットワーク コンポーネントへのネットワーク接続を提供します。 既定の VPort には、NDIS_DEFAULT_VPORT_ID の識別子が含まれています。
PF ミニポート ドライバーが既定の NIC スイッチを作成して構成すると、ドライバーは既定の VPort を暗黙的に作成し、PF にアタッチします。 デフォルトの VPort を VF にアタッチすることはできません。
デフォルトの VPort は常にアクティブ化された状態であり、明示的に削除することはできません。 PF ミニポート ドライバーは、既定の NIC スイッチを削除する場合にのみ、既定の VPort を暗黙的に削除します。
NIC スイッチとスイッチの既定の VPort を作成する方法の詳細については、「NIC スイッチの作成」を参照してください。
既定以外の VPort
デフォルト以外の VPort は、NIC スイッチの作成時に暗黙的に作成されません。 仮想化スタックなどの基になるドライバーは、OID_NIC_SWITCH_CREATE_VPORTの OID メソッド要求を発行することによって、これらのポートを明示的に作成します。 デフォルト以外の VPort は PF または VF に接続でき、NIC スイッチの作成後にのみ作成できます。
VF にアタッチされたデフォルト以外の VPort は、ゲスト OS で実行されるネットワーク コンポーネントへのネットワーク接続を提供します。 作成して VF にアタッチすると、デフォルト以外の VPort はアクティブ化された状態になります。
PF に接続されているデフォルト以外の VPort は、管理オペレーティング システムで実行されるネットワーク コンポーネントに追加のネットワーク オフロード機能を提供します。 たとえば、PF のデフォルト以外の VPort を使用して、仮想マシン キュー (VMQ) インターフェイスと同様のオフロード機能を提供できます。
既定 デフォルト以外の VPort は、NIC スイッチの作成後にのみ作成できます。
上にあるドライバーは、指定された NIC スイッチに既定以外の VPort を作成するOID_NIC_SWITCH_CREATE_VPORTのオブジェクト識別子 (OID) メソッド要求を発行します。 この OID 要求は、作成された VPort をネットワーク アダプターの PF または以前に割り当てられた VF にもアタッチします。
NDIS_OID_REQUEST 構造体の InformationBuffer メンバーには、NDIS_NIC_SWITCH_VPORT_PARAMETERS 構造体を指すポインターが含まれています。 OID_NIC_SWITCH_CREATE_VPORT要求から正常に戻った後、NDIS_NIC_SWITCH_VPORT_PARAMETERS構造体の VPortId メンバーには、NIC スイッチの VPort 間で一意の VPort 識別子があります。
上部のドライバーは、作成する 既定以外の VPort に関する構成情報を使用して、NDIS_NIC_SWITCH_VPORT_PARAMETERS 構造体を初期化します。 構成情報には、既定以外の VPort がアタッチされている PCIe 機能と、既定以外の VPort のキュー ペアの数が含まれます。
NDIS_NIC_SWITCH_VPORT_PARAMETERS構造体を初期化するときは、上にあるドライバーで次の操作を行う必要があります。
SwitchId メンバーは、OID_NIC_SWITCH_CREATE_SWITCHの OID メソッド要求を通じてネットワーク アダプター上に以前に作成された NIC スイッチの識別子に設定する必要があります。
注 Windows Server 2012 以降では、SR-IOV インターフェイスは、ネットワーク アダプターの既定の NIC スイッチを1つのみサポートします。 このスイッチは、既定の NIC スイッチと呼ばれます。 既定以外の VPort を作成する場合、上にあるドライバーは、SwitchId メンバーをNDIS_DEFAULT_SWITCH_ID識別子に設定する必要があります。
VPortId メンバーは、NDIS_DEFAULT_VPORT_IDに設定する必要があります。
AttachedFunctionId メンバーは、既定以外の VPort をアタッチする VF または PF の識別子に設定する必要があります。
値 NDIS_PF_FUNCTION_ID は PF を指定します。 それ以外の場合、値は、 OID_NIC_SWITCH_ALLOCATE_VFの OID メソッド要求によって以前にリソースが割り当てられた VF の識別子に設定する必要があります。
注: デフォルト以外の VPort の VF または PF へのアタッチメントは、デフォルト以外の VPort の作成後に変更することはできません。
また、上にあるドライバーは、VPort に割り当てられたキュー ペアの数を指定することもできます。 キュー ペアは、VPort に割り当てられているネットワーク アダプター上の送受信キューです。 ネットワーク アダプターが既定以外の VPort の非対称キュー ペアをサポートしている場合、ドライバーが作成する VPort ごとに異なる数のキュー ペアを指定する可能性があります。 詳細については、「キュー ペアの対称および非対称割り当て」を参照してください。
上にあるドライバーは NdisOidRequest を呼び出して、基になる PF ミニポート ドライバーに OID_NIC_SWITCH_CREATE_VPORT 要求を発行します。 NDIS は、ミニポート ドライバーに OID メソッド要求を転送する前に、次の操作を行います。
NDIS は、NDIS_NIC_SWITCH_VPORT_PARAMETERS構造体内のパラメーターを検証します。 パラメーターにエラーがある場合、NDIS は OID メソッド要求に失敗し、PF ミニポート ドライバーに要求を渡しません。
NDIS は、1 から (NumVPorts– 1) の範囲内の既定以外の VPort の識別子を割り当てます。NumVPorts は、ミニポート ドライバーがネットワーク アダプターで構成した VPort の数です。 ドライバーは、NDIS_NIC_SWITCH_INFO構造体の NumVPorts メンバーでこの番号を指定します。 ドライバーは、OID_NIC_SWITCH_ENUM_SWITCHES の OID クエリ要求を通じてこの構造体を返します。
注: NDIS_DEFAULT_VPORT_IDの VPort 識別子は、既定の NIC スイッチの PF に接続されている既定の VPort 用に予約されています。
割り当てられた VPort 識別子は、ネットワーク アダプタの NIC スイッチ上の既定以外の VPort を一意に識別します。
- NDIS は、 割り当てられた VPort 識別子を持つNDIS_NIC_SWITCH_VPORT_PARAMETERS構造体の VPortId メンバーを設定します。
PF ミニポート ドライバーは、OID 要求を発行するとき、指定された既定以外の VPort に関連付けられているハードウェアおよびソフトウェア リソースを割り当てます。 すべてのリソースが正常に割り当てられた後、PF ミニポート ドライバーは、MiniportOidRequest から NDIS_STATUS_SUCCESS を返すことによって OID を正常に完了します。
OID_NIC_SWITCH_CREATE_VPORT 要求が正常に完了した場合、PF ミニポート ドライバーと上にあるドライバーは、連続する操作に対して既定以外の VPort の VPortId値を保持する必要があります。 VPortId 値は、次のように操作中に使用されます。
NDIS と上部のドライバーは、VPortId 値を使用して、OID_NIC_SWITCH_VPORT_PARAMETERS and OID_NIC_SWITCH_DELETE_VPORT など、この VPort に関連する連続する OID 要求の既定以外の VPort を識別します。
送信操作中、NDIS は、VPortId 値を指定して、パケットの送信元の VPort を識別します。 この値は、NET_BUFFER_LIST 構造体の帯域外 (OOB) NDIS_NET_BUFFER_LIST_FILTERING_INFO データ内で指定されます。
受信操作中、PF ミニポート ドライバーは、パケットを転送する VPortId 値を指定します。 この値は、NET_BUFFER_LIST 構造体の OOB NDIS_NET_BUFFER_LIST_FILTERING_INFO データでも指定されます。
既定以外の VPort の作成には、次の点が適用されます。
メディア アクセス制御 (MAC) 識別子と仮想 LAN (VLAN) 識別子の受信フィルターは、VPort の作成後に構成されます。 基になるドライバーは、OID_RECEIVE_FILTER_Standard Edition T_FILTERの OID メソッド要求を発行することによって、これらの受信フィルターを動的に設定します。 受信フィルターは、OID_RECEIVE_FILTER_MOVE_FILTERの OID セット要求を通じて、ある VPort から別の VPort に移動することもできます。
VF にアタッチされたデフォルト以外の VPort は、作成時にアクティブ化された状態になります。 VPortがVFに接続されている場合、VPortを非アクティブ化することはできません。
PF にアタッチされているデフォルト以外の VPort は、作成時に非アクティブな状態になります。 Hyper-V 拡張可能スイッチ モジュールなどの上にあるドライバーは、VPort が正常に作成された後、PF にアタッチされている既定以外の VPort を明示的にアクティブ化します。 これは、PF ミニポート ドライバーにOID_NIC_SWITCH_VPORT_PARAMETERSの OID メソッド要求を発行することによって行われます。
上にあるドライバーがこの OID 要求を発行すると、VPortState メンバーが NdisNicSwitchVPortStateActivated に設定されたNDIS_NIC_SWITCH_VPORT_PARAMETERS構造体が渡されます。
既定以外の VPort がアクティブ化された状態になると、PF ミニポート ドライバーは NdisAllocateSharedMemory を呼び出すことによって、VPort の共有メモリを割り当てることができます。 ドライバーは、NDIS_SHARED_MEMORY_PARAMETERS構造体の VPortId メンバーを VPort の識別子の値に設定する必要があります。
注: 既定以外の VPort がアクティブ化状態にある場合、OID_NIC_SWITCH_DELETE_VPORTの OID セット要求を通じて削除された場合にのみ非アクティブ状態に設定されます。