仮想ポートへの受信フィルターの移動

上位のドライバーは、仮想ポート (VPort) から NIC スイッチ上の別の VPort に受信フィルターを移動する OID_RECEIVE_FILTER_MOVE_FILTER のオブジェクト識別子 (OID) セット要求を発行します。 通常、仮想化スタックなど上位のドライバーは、次のいずれかの条件に該当する場合、この OID 要求を発行します。

  • 仮想化スタックは、既定の VPort に受信フィルターを設定します。 このフィルターには、Hyper-V 子パーティションで公開されている仮想マシン (VM) ネットワーク アダプターのメディア アクセス制御 (MAC) アドレスと仮想 LAN (VLAN) パラメーターが含まれます。 これにより、ソフトウェアベースの合成データ パスを介して、VM ネットワーク アダプターと基になるネットワーク アダプター間でパケットを転送できます。

    PCI Express (PCIe) 仮想関数 (VF) のリソースが割り当てられ、VF が子パーティションにアタッチされると、仮想化スタックによって VF に既定以外の VPort が作成されます。 そして仮想化スタックは、VM ネットワーク アダプターの受信フィルターを、既定の VPort から VF にアタッチされている既定以外の VPort に移動します。 これにより、ハードウェアベースの VF データ パスを介して、VM ネットワーク アダプターと基になるネットワーク アダプター間でパケットを転送できます。

    これらのデータ パスの詳細については、「SR-IOV データ パス」を参照してください。

  • VF は、ゲスト オペレーティング システムがまだ実行中の Hyper-V 子パーティションからデタッチされています。 この場合、上位のドライバーは、既定以外の VPort から PF にアタッチされている既定の VPort に VM ネットワーク アダプターの受信フィルターを移動する OID セット要求を発行します。 この場合、パケット トラフィックは合成データ パスに戻ります。

1 つの VPort から別の VPort に受信フィルターを移動するには、上位のドライバーで、OID_RECEIVE_FILTER_MOVE_FILTER の OID セット要求を発行します。 NDIS_OID_REQUEST 構造体の InformationBuffer メンバーは、 NDIS_RECEIVE_FILTER_MOVE_FILTER_PARAMETERS 構造体へのポインターを含みます。

上位のドライバーが OID_RECEIVE_FILTER_MOVE_FILTER 要求を発行する前に、次の方法で NDIS_RECEIVE_FILTER_MOVE_FILTER_PARAMETERS 構造体を初期化する必要があります。

  • ドライバーは、以前割り当てられた受信フィルターの識別子の識別子に FilterId メンバーを設定します。

    上位のドライバーは、OID_RECEIVE_FILTER_SET_FILTER または OID_RECEIVE_FILTER_ENUM_FILTERS の以前の OID メソッド要求からフィルター識別子を取得しました。

  • ドライバーは、SourceQueueId メンバーを NDIS_DEFAULT_RECEIVE_QUEUE_ID に設定します。

  • ドライバーは、このフィルターに以前設定されていた VPort の識別子に SourceVPortId メンバーを設定します。

  • ドライバーは、DestQueueId メンバーを NDIS_DEFAULT_RECEIVE_QUEUE_ID に設定します。

  • ドライバーは、このフィルターの移動先になる VPort の識別子に DestVPortId メンバーを設定します。

NDIS は、PF ミニポート ドライバーに OID セット要求を転送する前に、NDIS_RECEIVE_FILTER_MOVE_FILTER_PARAMETERS 構造体のメンバーを検証します。

PF ミニポート ドライバーは、この OID セット要求を処理するときに、アトミック操作で受信フィルターを移動する必要があります。 ドライバーは、受信キューと VPort からフィルターを同時に削除し、別の受信キューと VPort に設定するようにネットワーク アダプターを構成できる必要があります。