パケット トラフィックの生成
このトピックでは、Hyper-V 拡張機能が新しいパケットを生成し、拡張可能スイッチのデータ パスに挿入する方法について説明します。
注: このページは、Hyper-V 拡張可能スイッチの概要とハイブリッド転送に関する情報と図を理解していることを前提とします。
注: 拡張可能スイッチ インターフェイスで、NDIS フィルター ドライバーは 拡張可能スイッチ拡張機能 と呼ばれ、ドライバー スタックは 拡張可能スイッチ ドライバー スタック と呼ばれます。 拡張機能の詳細については、「Hyper-V 拡張可能スイッチ拡張機能」を参照してください。
拡張可能スイッチ拡張機能は、拡張可能スイッチのイングレス データ パスにのみ新しいパケットを挿入できます。 これにより、拡張可能スイッチ インターフェイスでこれらのパケットをフィルター処理して正しく転送できるようになります。 拡張機能は、イングレス データ パスに新しいパケットを挿入するために、次のガイドラインに従う必要があります。
拡張機能は、まず新しいパケットに NET_BUFFER_LIST 構造を割り当てる必要があります。
拡張機能は、新しいパケットに NET_BUFFER_LIST 構造を割り当てた後、AllocateNetBufferListForwardingContext ハンドラー関数を呼び出してパケットの拡張可能スイッチ転送コンテキストを割り当てる必要があります。
転送コンテキストは、パケットの帯域外 (OOB) データに存在します。 送信元ポートや 1 つ以上の宛先ポートの配列など、パケットの転送情報が含まれます。
転送コンテキストの詳細については、「Hyper-V 拡張可能スイッチ転送コンテキスト」を参照してください。
拡張機能が AllocateNetBufferListForwardingContext を呼び出すと、パケットのソース ポートは NDIS_SWITCH_DEFAULT_PORT_ID に設定されます。 NDIS_SWITCH_DEFAULT_PORT_ID 送信元ポート識別子を持つパケットは信頼され、アクセス制御リスト (ACL) やサービス品質 (QoS) などの拡張可能スイッチ ポート ポリシーをバイパスします。
拡張機能では、パケットを特定のポートから送信されたかのように扱う必要がある場合があります。 これにより、そのポートのポリシーをパケットに適用できます。 拡張機能は SetNetBufferListSource を呼び出して、パケットのソース ポートを変更します。
ただし、拡張機能がパケットのソース ポート識別子を NDIS_SWITCH_DEFAULT_PORT_ID に割り当てたい場合もあります。 たとえば、拡張機能では、外部ネットワーク上のデバイスに送信される独自の制御パケットの NDIS_SWITCH_DEFAULT_PORT_ID にソース ポート識別子を設定したい場合があります。
転送拡張機能がイングレス データ パスで新しいパケットを送信する場合は、パケットの宛先ポートを決定する必要があります。 この手順の詳細については、拡張可能スイッチの宛先ポート データをパケットに追加するを参照してください。
注: キャプチャ拡張機能またはフィルター処理拡張機能では、新しいパケットに新しい宛先ポートを追加できません。
拡張機能が新しいパケットを作成すると、パケット データは、Hyper-V 親パーティションの親オペレーティング システムのローカルまたは高信頼メモリに配置されます。 このメモリは、子パーティションからアクセスできません。 そのため、そのパーティションで実行されているゲスト オペレーティング システムによる非同期の更新から「安全」と見なされます。
拡張機能は、新しいパケットのNDIS_SWITCH_FORWARDING_DETAIL_NET_BUFFER_LIST_INFO 共用体を取得するために NET_BUFFER_LIST_SWITCH_FORWARDING_DETAIL マクロを使用する必要があります。 拡張機能では、 IsPacketDataSafe メンバーを TRUE に設定する必要があります。 これは、すべてのパケット データが信頼されたメモリに配置されることを指定します。
拡張機能が NdisFSendNetBufferLists を呼び出して、パケットをイングレス データ パスに挿入する場合は、適切な拡張可能スイッチ フラグ設定で Flags パラメーターを設定する必要があります。 これらのフラグ設定の詳細については、 Hyper-V 拡張可能スイッチの送受信フラグを参照してください。
NDIS は、拡張機能の FilterSendNetBufferListsComplete関数を呼び出して、新しいパケットの送信要求を完了する場合、割り当てられた転送コンテキストを解放するために FreeNetBufferListForwardingContextを呼び出す必要があります。 拡張機能は、パケットの NET_BUFFER_LIST 構造を解放または再利用する前に、これを行う必要があります。
拡張可能スイッチのイングレスおよびエグレス データ パスの詳細については、Hyper-V 拡張可能スイッチのデータ パスを参照してください。