管理 Hyper-V 可扩展交换机转发上下文
注意 本页假定你熟悉 Hyper-V 可扩展交换机 和 混合转发概述中的信息和关系图。
遍历 Hyper-V 可扩展交换机数据路径的每个数据包的 NET_BUFFER_LIST 结构包含带外 (OOB) 数据。 此数据指定数据包的源端口,以及一个或多个用于数据包传送的目标端口。 此 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 结构指定的数据包的可扩展交换机转发上下文区域。
注意 此调用会将更改提交到转发上下文区域。 在这种情况下,转发扩展不需要调用 UpdateNetBufferListDestinations。
GrowNetBufferListDestinations
增加数据包 NET_BUFFER_LIST结构的转发 上下文区域中的目标端口数组的大小。
UpdateNetBufferListDestinations
提交扩展对数据包的一个或多个可扩展交换机目标端口所做的修改。 此函数使用这些更改更新数据包 NET_BUFFER_LIST 结构的转发上下文。
注意转发扩展将目标端口的更改提交到转发上下文后,无法删除目标端口,并且只能更改目标端口NDIS_SWITCH_PORT_DESTINATION结构的 IsExcluded 成员。 有关详细信息,请参阅 排除到可扩展交换机目标端口的数据包传送。