パケットへの拡張可能スイッチ宛先ポート データの追加

このトピックでは、Hyper-V 拡張可能スイッチ転送拡張機能で、1 つ以上の宛先ポートへのパケットの配信を指定する方法について説明します。 これらの拡張機能は、拡張可能スイッチ外部ネットワーク アダプターにバインドされている個々の物理ネットワーク アダプターにパケットを転送することもできます。

注: パケットを拡張可能スイッチ ポートまたは個々のネットワーク アダプターに転送できるのは、転送拡張機能またはスイッチ自体だけです。

次の図は、NDIS 6.40 (Windows Server 2012 R2) 以降の拡張可能スイッチ ドライバー スタックを介したパケット トラフィックのデータ パスを示しています。 どちらの図も、拡張可能スイッチ ポートに接続されているネットワーク アダプターとの間のパケット トラフィックのデータ パスを示しています。

Flowchart that shows the data path for packet traffic to or from network adapters connected to extensible switch ports for NDIS 6.40 (Windows Server 2012 R2) and later.

次の図は、NDIS 6.30 (Windows Server 2012 R2) 以降の拡張可能スイッチ ドライバー スタックを介したパケット トラフィックのデータ パスを示しています。

Flowchart that shows the data path for packet traffic to or from network adapters connected to extensible switch ports for NDIS 6.30 (Windows Server 2012).

各拡張可能スイッチの宛先ポートは、NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 構造体内の NDIS_SWITCH_PORT_DESTINATION 要素によって指定されます。 この配列は、パケットの NET_BUFFER_LIST 構造体の帯域外 (OOB) 転送コンテキストに含まれます。 このコンテキストの詳細については、「Hyper-V 拡張可能スイッチ転送コンテキスト」を参照してください。

転送拡張機能が拡張可能スイッチ ドライバー スタックでバインドされて有効になっている場合、パケットが NVGRE パケットでない限り、拡張可能スイッチのイングレス データ パスから取得されたすべてのパケットの宛先ポートを決定する必要があります。 このデータ パスの詳細については、「Hyper-V 拡張可能スイッチのデータ パスの概要」を参照してください。 NVGRE パケットの詳細については、「ハイブリッド転送」を参照してください。

注: 転送拡張機能がバインドされていないか、ドライバー スタックで有効になっていない場合、拡張可能スイッチは、イングレス データ パスから取得するパケットの宛先ポートを決定します。

転送拡張機能は、イングレス データ パスで取得されたパケットの宛先ポートを決定するときに、次のガイドラインに従う必要があります。

  • 拡張機能は、宛先ポート情報を使用して、NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 構造体内の NDIS_SWITCH_PORT_DESTINATION 構造体を初期化する必要があります。

    宛先ポートが外部ネットワーク アダプターに接続されていない場合、拡張機能は、NDIS_SWITCH_PORT_DESTINATION 構造体の NicIndex メンバーを NDIS_SWITCH_DEFAULT_NIC_INDEX に設定する必要があります。

    宛先ポートが拡張可能スイッチ外部ネットワーク アダプターに接続されている場合、拡張機能は、送信要求を転送する基になる物理ネットワーク アダプターのインデックスを指定できます。 拡張機能は、NicIndex メンバーを、外部ネットワーク アダプターにバインドされている宛先ネットワーク アダプターの 0 以外の NDIS_SWITCH_NIC_INDEX 値に設定することでこれを行います。

    詳細については、「物理ネットワーク アダプターへのパケットの転送」を参照してください。

  • 拡張機能は、アクティブなネットワーク アダプター接続を持つポートに対してのみ、宛先ポートをパケットの OOB データに追加する必要があります。 拡張機能が OID_SWITCH_NIC_DISCONNECT 要求を転送した場合は、切断されたネットワーク アダプターに関連付けられている宛先ポートを追加することはできません。

  • パフォーマンスを向上させるには、拡張機能でパケット配信に有効なポート宛先のみを追加する必要があります。 この場合、拡張機能は、宛先ポートの NDIS_SWITCH_PORT_DESTINATION 構造体の IsExcluded メンバーを FALSE に設定する必要があります。

  • ポートに配信される前に 802.1Q 仮想ローカル エリア ネットワーク (VLAN) データをパケットに保持するために、拡張機能は PreserveVLAN メンバーを TRUE に設定します。

    ポートに配信される前にパケットの 802.1Q 仮想ローカル エリア ネットワーク (VLAN) データを削除するために、拡張機能は PreserveVLAN メンバーを FALSE に設定します。

  • ポートに配信される前に 802.1Q 優先度データをパケットに保持するために、拡張機能は PreservePriority メンバーを TRUE に設定します。

    ポートに配信される前にパケットの 802.1Q 優先度データを削除するために、拡張機能は PreservePriority メンバーを FALSE に設定します。

  • 転送拡張機能がパケットに複数の宛先ポートを追加する場合は、次の手順に従う必要があります。

    1. まず、拡張機能は、NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL マクロを使用してパケットのNDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO 構造にアクセスします。 その後、拡張機能は NumAvailableDestinations メンバーを読み取り、宛先ポート配列で使用できる未使用の宛先ポート要素の数を決定します。 拡張機能で、配列で使用できるよりも多くの宛先ポートが必要な場合は、GrowNetBufferListDestinations 関数を呼び出して、配列内の追加の宛先ポート用に領域を割り当てる必要があります。

      拡張機能が GrowNetBufferListDestinations を呼び出すときに、NumberOfNewDestinations パラメーターに、パケットに追加する新しい宛先ポートの数を設定します。

      また、この拡張機能は、NetBufferLists パラメーターをパケットの NET_BUFFER_LIST 構造体へのポインターに設定します。

      : 配列に使用可能な宛先ポートがある場合、拡張機能は GrowNetBufferListDestinations を呼び出さないでください。

    2. GrowNetBufferListDestinations 関数が正常に返された場合、NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 構造体の宛先配列の末尾に追加の宛先ポートが追加されています。 Destinations パラメーターには、この構造体へのポインターが返されます。

      : GrowNetBufferListDestinations 関数は、要求された数の宛先ポートを割り当てることができない場合、NDIS_STATUS_RESOURCES を返します。

    3. 拡張機能は、NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 構造体の新しい宛先ポート要素を指定します。 拡張機能は、新しい各宛先ポートを NDIS_SWITCH_PORT_DESTINATION 構造体として初期化します。

      拡張機能は、NumDestinations オフセットから始まる配列への新しい宛先ポートを 初期化します。 NumDestinations は、NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 構造体のメンバーです。

    4. 拡張機能が宛先ポート要素の追加または変更を完了したら、UpdateNetBufferListDestinations を呼び出してそれらの変更をコミットする必要があります。

  • 拡張機能がパケットの 1 つの宛先ポートを追加する場合は、次の手順に従う必要があります。

    1. 拡張機能は、拡張機能によって割り当てられた NDIS_SWITCH_PORT_DESTINATION 構造体内のパケットの宛先ポート情報を初期化します。

    2. 拡張機能は、AddNetBufferListDestination を呼び出して、パケットの NET_BUFFER_LIST 構造体への変更をコミットします。 拡張機能は、Destination パラメーターで NDIS_SWITCH_PORT_DESTINATION 構造体のアドレスを渡します。

      注: この拡張機能は、UpdateNetBufferListDestinations 関数を呼び出して、宛先ポートが 1 つだけのパケットに変更をコミットすることはできません。

  • 転送拡張機能が AddNetBufferListDestination または UpdateNetBufferListDestinations を呼び出して宛先ポートの変更をコミットする場合、拡張可能スイッチ インターフェイスは、NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY 構造体の要素で指定されている拡張可能スイッチ ポートを削除しません。 パケット送受信操作が完了すると、インターフェイスは必要に応じてポートを自由に削除できます。

    Note 転送拡張機能が転送コンテキストに宛先ポートの変更をコミットした後、宛先ポートを削除することはできず、IsExcluded メンバー (宛先ポートの NDIS_SWITCH_PORT_DESTINATION 構造体) のみを変更できます。 詳細については、「拡張可能スイッチの宛先ポートへのパケット配信の除外」を参照してください。

  • 転送拡張機能は、OID_SWITCH_NIC_DISCONNECT のオブジェクト識別子 (OID) セット要求の処理を、切断されたネットワーク アダプターの宛先ポートを追加するコードと同期する必要があります。

    転送拡張機能の FilterOidRequestOID_SWITCH_NIC_DISCONNECT 要求に対して呼び出された場合、拡張機能は次のいずれかを実行できます。

    • この OID 要求を転送するために NdisFOidRequest という拡張機能が呼び出された場合、パケットの宛先ポートとして、切断されたネットワーク アダプターを持つポートを指定することはできません。

      注: パケットの唯一の宛先ポートが、切断されたネットワーク アダプターを持つポートである場合、拡張機能はパケットをドロップする必要があります。

    • 拡張機能は NDIS_STATUS_PENDING を返して、要求を非同期的に完了できます。 これにより、拡張機能は、切断されたネットワーク アダプターを持つポートをパケットの宛先ポートとして追加できます。 これにより、拡張機能は AddNetBufferListDestination または UpdateNetBufferListDestinations を呼び出し、パケットへの宛先ポートの追加を完了することもできます。

      この拡張機能は、ポートが破棄される前にポートに転送する必要があるパケットに対してこれを行う必要がある場合があります。

      注: 拡張機能が NDIS_STATUS_PENDING を返す場合は、接続されていないネットワーク アダプターを使用してポートの参照カウンターをインクリメントする ReferenceSwitchPort を呼び出すこともできます。 ただし、DereferenceSwitchPort を呼び出してポートの参照カウンターをデクリメントするまで、拡張機能は OID 要求を転送できません。

  • 宛先ポートの数が 0 の場合、転送拡張機能は NdisMSendNetBufferListsComplete を呼び出してパケットを破棄する必要があります。 また、この拡張機能は ReportFilteredNetBufferLists を呼び出して、破棄されたパケットについて拡張可能スイッチ インターフェイスに通知する必要があります。

    : 転送拡張機能が、イングレス データ パスから複数のパケットの NET_BUFFER_LIST 構造のリンク リストを取得した場合は、破棄されたパケットの個別のリストを作成する必要があります。 これにより、拡張機能は NdisMSendNetBufferListsCompleteReportFilteredNetBufferLists を 1 回だけ呼び出すことができます。

  • 宛先ポートの数が 0 より大きい場合、転送拡張機能は NdisFSendNetBufferLists を呼び出して、イングレス データ パス経由でパケットを拡張可能スイッチのミニポート エッジに転送する必要があります。

    : 転送拡張機能が、イングレス データ パスから複数のパケットの NET_BUFFER_LIST 構造体のリンク リストを取得した場合は、転送されたパケットの個別のリストを作成する必要があります。 これにより、拡張機能は NdisFSendNetBufferLists を 1 回だけ呼び出して、パケットの一覧を転送できます。 さらに、拡張機能は、同じ宛先ポートを持つパケットを転送する個別のリストを保持する必要があります。 詳細については、「Hyper-V 拡張可能スイッチの送受信操作フラグ」を参照してください。