Hyper-V 拡張可能スイッチ転送コンテキストの管理
注: このページは、Hyper-V 拡張可能スイッチの概要とハイブリッド転送に関する情報と図を理解していることを前提とします。
Hyper-V 拡張可能スイッチのデータ パスを走査する各パケットの NET_BUFFER_LIST 構造体には、帯域外 (OOB) データが含まれています。 このデータは、パケットが生成されたソース ポートと、パケット配信用の 1 つ以上の宛先ポートを指定します。 この OOB データは、拡張可能スイッチ転送コンテキストと呼ばれます。
注: 拡張可能スイッチ転送コンテキストは、NET_BUFFER_LIST_CONTEXT 構造体とは異なります。 これにより、拡張機能は転送コンテキストに影響を与えることなく、自らのコンテキスト構造を割り当てることができます。
拡張可能スイッチ転送コンテキストは、次の方法で割り当てられ、解放されます。
パケットがネットワーク アダプターから拡張可能スイッチに到着すると、拡張可能スイッチ インターフェイスによって転送コンテキストが割り当てられ、パケットの NET_BUFFER_LIST 構造体に関連付けられます。
パケットが宛先ポートに配信されると、インターフェイスはパケットの NET_BUFFER_LIST 構造体から転送コンテキストを解放します。
拡張可能スイッチ拡張機能は、新しいパケットや複製されたパケットを拡張可能スイッチのデータ パスに挿入する場合、NdisFSendNetBufferLists を呼び出す前に転送コンテキストを割り当てる必要があります。
拡張機能は、新しいパケットまたは複製されたパケットに NET_BUFFER_LIST 構造体を割り当てた後、AllocateNetBufferListForwardingContext 関数を呼び出してパケットの転送コンテキストを割り当てる必要があります。 パケット送信要求が完了したら、拡張機能は、FreeNetBufferListForwardingContext の呼び出しを、NET_BUFFER_LIST 構造体を解放または再利用する前に行う必要があります。
注: 拡張機能が AllocateNetBufferListForwardingContext を呼び出すと、パケットのソース ポートは NDIS_SWITCH_DEFAULT_PORT_ID に設定されます。 これは、パケットが拡張可能スイッチ ポートへ到着したのではなく、拡張機能で生成されたことを指定します。 特定の条件下では、拡張機能でパケットのソース ポートを変更することが必要になる場合があります。 詳細については、「パケットの拡張可能スイッチ ソース ポート データの変更」を参照してください。
詳細については、「Hyper-V 拡張可能スイッチの送受信オペレーション」を参照してください。
すべての拡張可能スイッチ拡張機能は、次の拡張可能スイッチ ハンドラー関数を呼び出して、パケットの転送コンテキスト内のデータにアクセスできます。
AllocateNetBufferListForwardingContext
拡張可能スイッチ転送コンテキストを割り当て、拡張可能スイッチ内の送受信オペレーション用のNET_BUFFER_LIST 構造体を準備します。
CopyNetBufferListInfo
ソース パケットの NET_BUFFER_LIST 構造体から宛先 パケットの NET_BUFFER_LIST 構造体に転送コンテキストをコピーします。 このデータには、拡張可能スイッチのソース ポートとネットワーク アダプターの情報が含まれます。 拡張可能スイッチの宛先ポート情報を宛先パケットにコピーすることもできます。
FreeNetBufferListForwardingContext
NET_BUFFER_LIST 構造体の拡張可能スイッチ転送コンテキスト内のリソースを解放します。 このデータは、Hyper-V 拡張可能スイッチの送受信オペレーションに使用され、AllocateNetBufferListForwardingContext 関数を呼び出すことによって以前に割り当てられました。
GetNetBufferListDestinations
パケットの NET_BUFFER_LIST 構造体の転送コンテキストから宛先ポートを返します。
パケットが NVGRE パケットでない限り、転送拡張機能はパケットの宛先ポートを追加する役割を担います。 (詳細については、 ハイブリッド転送を参照してください。) この拡張機能は、次の拡張可能スイッチ ハンドラー関数を呼び出して、パケットの転送コンテキスト内で宛先ポートを追加または更新します。
AddNetBufferListDestination
NET_BUFFER_LIST 構造体で指定されたパケットの拡張可能スイッチ転送コンテキスト領域に 1 つの宛先を追加します。
注: この呼び出しは、転送コンテキスト領域への変更をコミットします。 この場合、転送拡張機能は UpdateNetBufferListDestinations を呼び出す必要はありません。
GrowNetBufferListDestinations
パケットの NET_BUFFER_LIST 構造体の転送コンテキスト領域の宛先ポート配列のサイズを大きくします。
UpdateNetBufferListDestinations
拡張機能がパケットの 1 つ以上の拡張可能スイッチ宛先ポートに対して行った変更をコミットします。 この関数は、パケットの NET_BUFFER_LIST 構造の転送コンテキストをこれらの変更で更新します。
Note 転送拡張機能が転送コンテキストに宛先ポートの変更をコミットした後、宛先ポートを削除することはできず、IsExcluded メンバー (宛先ポートの NDIS_SWITCH_PORT_DESTINATION 構造体) のみを変更できます。 詳細については、「拡張可能スイッチの宛先ポートへのパケット配信の除外」を参照してください。