拡張可能スイッチ宛先ポートへのパケット配信の除外

このトピックでは、Hyper-V 拡張可能スイッチ拡張機能が拡張可能スイッチ ポートへのパケットの配信を除外する方法について説明します。 パケットの宛先ポートは、パケットのNET_BUFFER_LIST構造内の帯域外 (OOB) 転送コンテキスト内 で 指定します。 このコンテキストの詳細については、「Hyper-V 拡張可能スイッチ転送コンテキスト」を参照してください。

注: このページは、Hyper-V 拡張可能スイッチの概要ハイブリッド転送に関する情報と図を理解していることを前提とします。

注: 拡張可能スイッチ インターフェイスで、NDIS フィルター ドライバーは 拡張可能スイッチ拡張機能 と呼ばれ、ドライバー スタックは 拡張可能スイッチ ドライバー スタック と呼ばれます。 拡張機能の詳細については、Hyper-V 拡張可能スイッチ拡張機能を参照してください。

拡張機能のフィルター処理と転送では、拡張可能スイッチのイングレスまたはエグレス データ パスで取得したパケットの配信を除外することができます。 パケット配信を除外するのは、次の方法で行うことができます。

  • 拡張機能は、パケットリクエストまたは指示を完了してパケットをドロップできます。 これにより、拡張可能スイッチ ポートへのパケットの配信は除外されます。 このメソッドは、宛先ポートを1つ以上持つパケットで使用できます。

    拡張可能スイッチのイングレス データ パスで取得されたパケットの場合、拡張機能は NdisFSendNetBufferListsComplete を呼び出してパケット送信リクエストを完了します。

    拡張可能スイッチエグレス データ パスで取得されたパケットの場合、拡張機能は NdisFReturnNetBufferLists を呼び出 してパケット受信通知を完了します。

  • 複数の宛先ポートを持つエグレス データ パスで取得されたパケットの場合、拡張機能は、 1 つ以上の宛先ポートのデータを変更することで、パケット配信を除外できます。 拡張機能は、IsExcluded メンバーを宛先ポートの NDIS_SWITCH_PORT_DESTINATION 構造で 1 の値に設定することでこれを行います。 このメソッドを使用すると、IsExcluded 値が 0 に設定されているポート に パケットを配信することができます。

    注: イングレス データ パス上で取得されたパケットには宛先ポートが含まれていません。 このデータが使用できるのは、拡張可能スイッチがパケットをエグレス データ パスに転送した後のみです。

拡張機能は、宛先ポートの IsExcluded 値を変更した 後、エグレス データ パス内のパケットを、上の拡張機能に転送する必要があります。 ただし、すべてのパケットの 宛先ポートの IsExcluded データが 1 に設定されている場合、拡張機能はパケットを転送するのではなく、パケット受信表示を完了してパケットをドロップしてください。

: 拡張機能で宛先ポートの IsExcluded 値を 1 に設定した 後、エグレス データ パスの上にある拡張機能でこの値を 0 に変更することはできません。

拡張機能をキャプチャしても、拡張可能スイッチ ポートへのパケットの配信を除外することはできません。

拡張可能スイッチ ポートへのパケット配信を除外するため、拡張のフィルター処理と転送の際は、次のガイドラインに従う必要があります。

  • 拡張可能スイッチのイングレス データ パスでは、拡張機能のフィルター処理と転送によって、パケットのソース ポートまたはデータのポリシー条件に基づいてパケット配信を除外できます。

    ソース ポート情報は、NDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO 共用体(そのパケットの NET_BUFFER_LIST 構造の OOB データ内)に格納されます。 拡張機能は NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL マクロを使用してデータを取得します。

    拡張機能がイングレス データ パスから取得したパケットの配信を除外する場合は、パケット送信リクエストを完了してパケットをドロップする必要があります。

  • 拡張可能スイッチのイングレス データ パスでは、転送拡張機能によってパケットの宛先ポートを決定し、この情報をパケットの OOB データに追加します。 拡張機能によって適用されるポリシー条件に基づいて、OOB データに宛先ポート情報を追加せずにポートへのパケット配信を除外できます。

    この手順の詳細については、拡張可能スイッチの宛先ポート データをパケットに追加するをご覧ください。

  • 拡張可能スイッチエグレス データ パスでは、フィルター処理と転送の拡張機能によって、ポリシー条件に基づいてパケットの配信を除外できます。 たとえば、フィルター拡張機能では、パケットの送信元ポートまたは宛先ポートのポリシー条件に基づきパケット配信を除外できます。

    拡張機能で宛先ポートへのパケットの配信を除外するには次の手順に従います。

    1. この拡張機能は、GetNetBufferListDestinations を呼び出 して、パケットの宛先ポートを取得します。 呼び出しがNDIS_STATUS_SUCCESSを返す場合、Destinations パラメーターには、NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY構造体へのポインターが含まれています。 この構造体では、パケットの拡張可能スイッチの宛先ポートを指定します。 各宛先ポートでは、NDIS_SWITCH_PORT_DESTINATION構造体として書式設定します。

      : NDIS_SWITCH_FORWARDING_DESTINATION_ARRAY構造体の NumDestinations メンバーに 0 の値が含まれている場合、パケットには宛先ポートのデータがありません。

  1. 拡張機能では、宛先ポートのNDIS_SWITCH_PORT_DESTINATION構造体の IsExcluded メンバーを 1 の値に設定することで、拡張可能スイッチ ポートへのパケット配信を除外します。

    注: 拡張機能がすべての宛先ポートへのパケットの配信を除外する場合、拡張機能でパケットの受信表示を完了してパケットをドロップしてください。

  2. 拡張機能でパケット内の 1 つまたはすべての宛先ポートへの配信を除外する場合は、次の操作を行ってください。

    • 拡張機能で、パケットの OOB データにこれらの変更をコミットするために UpdateNetBufferListDestinations を呼び出してください。

    • 拡張機能で ReportFilteredNetBufferLists を呼び出してください。 この関数が呼び出されると、拡張可能スイッチ インターフェイスはカウンターをインクリメントし、除外されたパケットのイベントをログに記録します。 拡張機能で、パケットを取得した拡張可能スイッチのデータ パスでパケットを転送する前に、この呼び出しを行ってください。

    同様に、拡張機能がパケット送信要求を完了した場合、またはパケットのすべてのポートへの配信を除外することを示す場合は、ReportFilteredNetBufferLists も呼び出す必要があります。

    拡張機能 は、拡張機能が除外されているパケットの NET_BUFFER_LIST 構造のリンクされたリストを作成できます。 拡張機能が ReportFilteredNetBufferLists を呼び出すと、NetBufferLists パラメーターがリンク リストへのポインターに設定されます。

拡張可能スイッチのイングレスおよびエグレス データ パスの詳細については、Hyper-V 拡張可能スイッチのデータ パスを参照してください。