拡張可能スイッチ データ パスのパケット管理ガイドライン

このトピックでは、拡張可能スイッチのデータ パスで取得されたパケットを管理するために Hyper-V 拡張可能スイッチ拡張機能が従う必要があるガイドラインについて説明します。

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

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

拡張機能は、拡張可能スイッチのデータパスでのパケット管理について、次のガイドラインに従う必要があります。

  • パケットを発信する拡張機能は、NdisFSendNetBufferLists を呼び出して、イングレス データ パスで送信要求を開始する必要があります。 これは、拡張可能スイッチを介したパケットの適切な転送を可能にするために、この方法で行う必要があります。

  • キャプチャ拡張機能では、拡張可能スイッチのイングレスおよびエグレス データ パスのパケットを監視できます。 ただし、この種類の拡張機能は常にパケットを転送する必要があり、パケットをドロップしてはなりません。 また、キャプチャ拡張機能は、パケットを転送する前にパケット データを変更してはなりません。

  • 拡張可能スイッチのイングレス データ パスで、拡張機能のフィルター処理と転送を行うと、次のことができます。

    • フィルター拡張機能では、パケット トラフィックをフィルター処理し、拡張可能スイッチを介したパケット配信用のカスタム ポートまたはスイッチ ポリシーのみを適用できます。 拡張機能は、イングレス データ パス内のパケットをフィルター処理する場合、パケットの送信元のソース ポートとネットワーク アダプター接続のみに基づいてフィルター処理規則を適用できます。 この情報はパケットの NET_BUFFER_LIST 構造体の OOB データに格納され、NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL マクロを使用して取得できます。

      注: イングレス データ パスで取得されたパケットには、宛先ポートが含まれていません。 宛先ポートに基づくパケットのフィルター処理は、エグレス データ パスで取得されたパケットでのみ実行できます。

    • 転送拡張機能では、パケット トラフィックをフィルター処理し、拡張可能スイッチを介したパケット配信用にカスタムおよび標準のポートまたはスイッチ ポリシーを適用できます。 転送拡張機能は、イングレス データ パス内のパケットをフィルター処理するときに、転送拡張機能がパケットに割り当てる送信元ポートと宛先ポートに基づいてフィルター規則を適用します。

  • 拡張可能スイッチのエグレス データ パスで、拡張機能のフィルター処理と転送を行うと、次のことができます。

    • フィルター拡張機能では、パケット トラフィックをフィルター処理し、拡張可能スイッチを介したパケット配信用のカスタム ポートまたはスイッチ ポリシーのみを適用できます。 フィルター拡張機能は、エグレス データ パス内のパケットをフィルター処理するときに、パケットの宛先ポートのみに基づいてフィルター処理規則を適用できます。

      宛先ポート データは、パケットの NET_BUFFER_LIST 構造体の OOB データに格納されます。 拡張機能は、 GetNetBufferListDestinations 関数を呼び出すことによってこの情報を取得します。

    • 転送拡張機能では、パケット トラフィックをフィルター処理し、拡張可能スイッチを介したパケット配信用にカスタムおよび標準のポートまたはスイッチ ポリシーを適用できます。 転送拡張機能は、エグレス データ パス内のパケットをフィルター処理するときに、パケットの送信元または宛先ポートに基づいてフィルター処理規則を適用できます。

    • パケットに適用されるポリシーに基づいて、フィルター処理または転送拡張機能は、1 つ以上の宛先へのパケットの配信を除外できます。 この手順の詳細については、拡張可能スイッチ宛先ポートへのパケット配信の除外を参照してください。

      パケットに適用されるポリシーに基づいて、転送拡張機能は、1 つ以上の宛先へのパケットの配信を除外できます。 詳細については、「ハイブリッド転送」を参照してください。

  • 拡張可能スイッチのエグレス データ パスで、拡張機能のフィルター処理と転送では、次のことを行ってはなりません。

    • エグレス データ パスでパケットを転送する前に、パケット データを変更します。

      フィルター処理拡張機能がパケット内のデータを変更する必要がある場合は、まずポート宛先を保持せずにパケットを複製する必要があります。 その後、拡張機能は、変更されたパケットをイングレス データ パスに挿入する必要があります。 これにより、基になる拡張機能は変更されたパケットにポリシーを適用でき、転送拡張機能はポート宛先を追加できます。

      転送拡張機能がパケット内のデータを変更する必要がある場合は、ポート宛先を割り当てる前に、まずパケットを複製する必要があります。 パケットが変更され、ポート宛先が割り当てられた後、拡張機能は変更されたパケットをイングレス データ パスに挿入する必要があります。

      詳細については、「パケット トラフィックの複製」を参照してください。

      注: 拡張機能がエグレス データ パスで取得されたパケットを複製する場合、パケット データを変更せず、元の宛先ポート データを保持している場合にのみ、新しいパケットをエグレス データ パスに挿入できます。

    • パケットを転送する前に、宛先ポートをパケットに追加します。

      注: 転送拡張機能では、イングレス データ パスで取得されたパケットに宛先ポートを追加できます。

    • エグレス データ パスに新しいデータ パケットまたは複製されたデータ パケットを挿入します。

  • 標準 NDIS データ パスでは、拡張可能スイッチ以外の OOB データは、多くの場合、パケットが送信または受信として示されているかどうかに応じて異なる形式を持ちます。 たとえば、NDIS_IPSEC_OFFLOAD_V2_HEADER_NET_BUFFER_LIST_INFO の OOB データは、送受信固有の構造の共用体です。

    拡張可能スイッチのデータ パスでは、送信と受信の両方で、すべてのパケットが拡張ドライバー スタックを通過します。 このため、パケットの NET_BUFFER_LIST 構造体内の拡張可能スイッチ以外の OOB データは、ドライバー スタックを通過するフローの期間を通じて送受信形式になります。

    この OOB データの形式は、パケットが拡張可能スイッチに到着した送信元拡張可能スイッチ ポートによって異なります。 送信元ポートが外部ネットワーク アダプターに接続されている場合、拡張可能スイッチ以外の OOB データは受信形式になります。 その他のポートの場合、この OOB データは送信形式になります。

    注: 拡張機能がパケットの NET_BUFFER_LIST 構造体を複製する場合は、OOB データを追加または変更する際に拡張可能スイッチ以外の OOB データを考慮する必要があります。 拡張機能は CopyNetBufferListInfo を呼び出して、拡張可能スイッチのデータ パスに関連付けられている OOB データをソース パケットから複製されたパケットにコピーする必要があります。 この関数は、データが複製されたパケットにコピーされるときに OOB の送受信形式を保持します。

  • 拡張機能がエグレス データ パスのイングレスからパケットをドロップする場合は、ReportFilteredNetBufferLists を呼び出す必要があります。 この関数が呼び出されると、拡張可能スイッチ インターフェイスはカウンターをインクリメントし、ドロップされたパケットまたは除外されたパケットのイベントをログに記録します。