このトピックでは、拡張可能スイッチ のデータ パス Hyper-V 経由で拡張可能スイッチ ポート間でパケットがどのように移動されるかについて説明します。
注 拡張可能スイッチ インターフェイスでは、NDIS フィルター ドライバーは拡張可能スイッチ拡張機能 と呼ばれ、ドライバー スタックは、拡張可能スイッチ ドライバー スタックと呼ばれます。 拡張機能の詳細については、「 Hyper-V 拡張可能スイッチ拡張機能」を参照してください。
手記 このページでは、「 Hyper-V 拡張可能スイッチ と ハイブリッド転送の概要」の情報を理解していることを前提としています。
そのポートから拡張可能スイッチに到着するすべてのパケット トラフィックは、拡張可能スイッチ ドライバー スタックを経由して同じパスに従います。 たとえば、外部ネットワーク アダプター接続から受信したパケット トラフィックや、仮想マシン (VM) ネットワーク アダプター接続から送信されたパケット トラフィックは、同じデータ パスを通過します。
次の図は、NDIS 6.40 (Windows Server 2012 R2) 以降の拡張可能スイッチのデータ パスを示しています。
次の図は、NDIS 6.30 (Windows Server 2012) の拡張可能スイッチのデータ パスを示しています。
拡張可能スイッチ インターフェイスのコンポーネントの詳細については、「Hyper-V 拡張可能スイッチ アーキテクチャ」を参照してください。
拡張可能スイッチのデータ パスには、パケットがそれらのパスを通過する順序で一覧表示される次の部分があります。
上にあるプロトコル エッジ
パケットは、スイッチ ポートに接続されているネットワーク アダプターから拡張可能スイッチに到着します。 これらのパケットは、まず、拡張可能スイッチのイングレス データ パスを下げる拡張可能スイッチのプロトコル エッジからの送信要求として発行されます。
拡張可能スイッチのプロトコル エッジは、イングレス データ パスのパケットを準備します。 プロトコル エッジは、帯域外 (OOB) 拡張可能スイッチ転送コンテキストを含むこれらのパケットにコンテキスト領域を割り当てます。 OOB データに、パケットが拡張可能スイッチに配信されたソース ポートとネットワーク アダプター接続に関する情報が設定されます。
転送コンテキストの詳細については、「Hyper-V 拡張可能スイッチ転送コンテキストの」を参照してください。
NDIS 6.40 (Windows Server 2012 R2) 以降では、パケットが外部ネットワーク アダプターからの NVGRE パケットである場合、拡張可能スイッチは、パケットの帯域外 (OOB) 情報に NativeForwardingRequired フラグを 設定します。 詳細については、「ハイブリッド転送 を参照してください。
トラフィックに仮想サブネットがあるポートにパケットが到着した場合、拡張可能スイッチはパケットのNDIS_NET_BUFFER_LIST_VIRTUAL_SUBNET_INFO構造の VirtualSubnetId メンバーを設定します。
手記 仮想サブネットには、HNV サブネットまたはサード パーティの仮想サブネットを指定できます。
インバウンドデータ経路
拡張機能は、 FilterSendNetBufferLists 関数が呼び出されたときに、イングレス データ パスからパケットを取得します。 拡張機能は、 NdisFSendNetBufferLists を呼び出すことによって、イングレス データ パス上の基になる拡張機能にパケットを転送します。 拡張機能のフィルター処理と転送は、 NdisFSendNetBufferListsComplete を呼び出すことによって、イングレス データ パスからパケットをドロップすることもできます。
拡張機能によってイングレスデータパス上でパケットを取得する際には、パケットデータを検査することができます。 ただし、拡張機能によるキャプチャーは、イングレスデータパス上のパケットに対する送信要求を完了してはなりません。 これらの拡張機能は、拡張可能スイッチ ドライバー スタック内の基になる拡張機能に常にパケットを転送する必要があります。
キャプチャ拡張機能は、イングレス データ パス上のパケットを発信することもできます。 たとえば、この拡張機能は、トラフィックの状態をリモート監視アプリケーションに報告するためにパケットを送信する場合があります。
拡張機能による送信元パケットの詳細については、「 送信元パケット トラフィック」を参照してください。
拡張機能をフィルター処理してイングレス データ パスのパケットを取得する場合、次の操作を実行できます。
カスタム拡張可能スイッチまたはポート ポリシーに基づいてパケットをドロップします。
これらのポリシーの詳細については、「 Hyper-V 拡張可能スイッチ ポリシー」を参照してください。
手記 イングレス データ パスで取得されたパケットには、パケットの OOB データで定義された宛先ポートがありません。 その結果、フィルター拡張機能では、パケット データまたはパケットのソース ポートまたはネットワーク アダプター接続に基づいてカスタム ポリシーのみを適用する必要があります。
イングレス データ パスから取得したパケットを複製または変更します。
イングレス データ パスに新しいパケットを挿入します。
NDIS 6.40 以降では、キャプチャとフィルター処理の拡張機能の後、イングレス データ パスの転送拡張機能の前に、拡張可能スイッチは次の処理を行います。
拡張可能スイッチ ドライバー スタックで転送拡張機能が有効になっていない場合、パケットの宛先ポート配列は拡張可能スイッチによって決定されます。
転送拡張機能が有効になっている場合は、イングレス データ パスでパケットを取得するときに、次の操作を行う必要があります。
NDIS 6.40 以降では、パケットが NVGRE パケットの場合 ( ハイブリッド転送を参照)、転送拡張機能は、受信データ パス内のパケットの OOB データ内の宛先ポート配列を変更できません。 ただし、パケットを破棄することがあります。
パケットが NVGRE パケットでない場合、転送拡張機能はパケットの OOB データの宛先ポート 配列に宛先ポートを追加する必要があります。
転送拡張機能では、標準またはカスタムの拡張可能スイッチまたはポート ポリシーに基づいてパケットをドロップする必要があります。 標準のスイッチまたはポート ポリシーには、セキュリティと仮想 LAN (VLAN) のプロパティが含まれます。 拡張可能スイッチ ドライバー スタックで転送拡張機能が有効になっていない場合、これらのポリシーは拡張可能スイッチによって適用されます。
手記 転送拡張機能は、イングレス データ パス内のパケットをフィルター処理するときに、送信元ポートと、拡張機能がパケットに割り当てる宛先ポートに基づいてフィルター規則を適用します。
さらに、転送拡張機能では、次の操作を行うことができます。
イングレス データ パスから取得したパケットを複製または変更します。
イングレス データ パスに新しいパケットを挿入します。
基になるミニポートのエッジ
パケットが拡張可能スイッチの基になるミニポート 端に到着すると、拡張可能スイッチは、その組み込みのポリシーをパケットに適用します。 これらのポリシーには、アクセス制御リスト (ACL) とサービス品質 (QoS) プロパティが含まれます。 これらのポリシーが原因でパケットが破棄されない場合、拡張可能スイッチはパケットの受信指示を送信し、パケットをエグレス データ パスに転送します。
手記 パケットが配信されるポートでポート ミラーリングが有効になっている場合、ミニポート エッジは、ミラー ポートのパケットの OOB データに宛先ポートを追加します。 ミニポート エッジは、転送拡張機能がインストールされ、拡張可能スイッチ ドライバー スタックで有効になっているかどうかに関係なくこれを行います。 ミニポート エッジは、パケットの宛先ポートの配列でまだ指定されていない場合にのみ、ミラー ポートを追加します。
転送拡張機能が有効になっていない場合、拡張可能スイッチはパケットの宛先ポートを決定し、これらの宛先ポートをパケットの OOB データに追加してから、パケットをエグレス データ パスに転送します。
NDIS 6.40 以降では、HNV コンポーネントは、イングレス後とエグレス前に必要な NVGRE カプセル化またはカプセル化解除を実行し、転送拡張機能がカプセル化およびカプセル化解除された形式でパケットを確認できるようにします。 たとえば、パケットが外部ネットワーク アダプターから到着し、内部 VM 宛ての場合、転送拡張機能は受信時にカプセル化されたパケットを取得し、エグレスではカプセル化解除されたパケットを取得します。
手記 カプセル化されたパケットでは、パケット ヘッダー内のアドレスはプロバイダー アドレス (PA) 空間アドレスです。 カプセル化解除されたパケットでは、顧客アドレス (CA) 空間アドレスです。
パケットが外部ネットワーク アダプターから到着した NVGRE パケットの場合、拡張可能スイッチの Hyper-V ネットワーク仮想化 (HNV) コンポーネントは、パケットに対して NVGRE カプセル化解除を実行します。 HNV コンポーネントは、HNV ポリシーに従ってパケットの宛先を決定し、拡張可能スイッチはパケットをエグレス データ パスに転送します。
パケットが内部 VM から到着した場合、HNV ポリシーがパケットに設定されている場合、HNV コンポーネントはパケットに対して NVGRE カプセル化を実行します。 HNV コンポーネントは、HNV ポリシーに従ってパケットの宛先を決定し、拡張可能スイッチはパケットをエグレス データ パスに転送します。
それ以外の場合、転送拡張機能はパケットをエグレス データ パスの上に転送します。
NDIS 6.30 では、転送拡張機能が有効になっている場合は、パケットをエグレス データ パスに転送する必要があります。
データの出力経路
拡張機能は、 FilterReceiveNetBufferLists 関数が呼び出されたときにエグレス データ パスからパケットを取得します。 拡張機能は、 NdisFIndicateReceiveNetBufferLists を呼び出すことによって、エグレス データ パス上の上にある拡張機能にパケットを転送します。 拡張機能のフィルター処理と転送は、 NdisFReturnNetBufferLists を呼び出すことによって、エグレス データ パスからパケットをドロップすることもできます。
転送拡張機能は、エグレス データ パスでパケットを取得するときに、OOB データ内のパケットの宛先ポート情報を調べることができます。
手記 拡張機能は、 GetNetBufferListDestinations を呼び出して OOB データからこの情報を取得します。
標準またはカスタムのスイッチまたはポート ポリシーに基づいて、拡張機能は OOB データに含まれる 1 つ以上の宛先ポートへのパケットの配信を除外できます。
NDIS 6.40 (Windows Server 2012 R2) 以降では、転送拡張機能の後、エグレス データ パスでの拡張機能のフィルター処理とキャプチャの前に、拡張可能スイッチは組み込みのエグレス ポリシーをパケットに適用します。 これらのポリシーには、トランク モード、監視モード、エグレス ACL、サービス品質 (QoS) プロパティが含まれる場合があります。
フィルター拡張機能は、エグレス データ パスでパケットを取得するときに、OOB データ内のパケットの宛先ポート情報を検査できます。 カスタム スイッチまたはポート ポリシーに基づいて、拡張機能は OOB データに含まれている 1 つ以上の宛先ポートへのパケットの配信を除外できます。
フィルタリング拡張機能がパケット内のデータを変更する必要がある場合は、まずポート宛先を保持せずにパケットを複製する必要があります。 その後、拡張機能は、変更されたパケットをイングレス データ パスに挿入する必要があります。 これにより、基になる拡張機能は変更されたパケットにポリシーを適用でき、転送拡張機能はポート宛先を追加できます。
詳細については、「 クローン作成またはパケットトラフィック」を参照してください。
拡張機能がエグレスデータパスでパケットをキャプチャする際、パケットデータを検査できます。 ただし、キャプチャ拡張機能がトラフィック状態をリモート監視アプリケーションに報告するためにパケットを発信する必要がある場合は、 NdisFSendNetBufferLists を呼び出してイングレス データ パスに対する送信操作を開始することで、このパケット トラフィックを発信する必要があります。
パケットが拡張可能スイッチの上にあるプロトコル エッジに到着すると、拡張可能スイッチ インターフェイスは、指定されたすべての宛先ポートにパケットを転送します。
パケットが転送されると、インターフェイスは逆に同じパスを介してパケットを完了します。 最初に、インターフェイスは拡張機能の FilterReturnNetBufferLists 関数を呼び出して、エグレス データ パスで転送されたパケットを完了します。 次に、インターフェイスは拡張機能の FilterSendNetBufferListsComplete 関数を呼び出して、イングレス データ パスで転送されたパケットを完了します。
エグレス データ パスとイングレス データ パスの両方でパケットが完了すると、拡張機能は必要なパケット クリーンアップと後処理を実行します。