注意 本页假定你熟悉 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 结构,以便在可扩展交换机中进行发送或接收操作。
复制网络缓冲区列表信息
将转发上下文从源数据包 的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 成员。 有关详细信息,请参阅排除向可扩展交换机目的端口传送数据包。