Hyper-V 可扩展交换机端口概述

与 Hyper-V 可扩展交换机的每个网络连接都由一个端口表示。 可扩展交换机接口在建立网络连接之前创建和配置端口。 网络连接中断后,接口可能会删除该端口或将其重新用于其他网络连接。

配置有网络接口的每个 Hyper-V 子分区都会在可扩展交换机上分配一个端口。 启动 Hyper-V 子分区时,可扩展交换机接口会在虚拟机 (VM) 网络适配器在来宾操作系统中公开之前创建一个端口。 VM 网络适配器公开并初始化后,可扩展交换机接口会在 VM 网络适配器和可扩展交换机端口之间创建网络连接。 如果停止子分区,可扩展交换机接口首先删除网络连接,然后删除可扩展交换机端口。

创建可扩展交换机端口时,会为其配置唯一标识符和名称。 创建后,可以使用策略预配可扩展交换机端口,这些策略定义用于管理通过端口的数据包流量的各种属性。 例如,可以为虚拟 LAN (VLAN 定义标准端口策略,) 端口流量的属性和访问限制。 此外,独立软件供应商 (ISV) 可以定义可用于预配单个端口的自定义策略。 有关详细信息,请参阅 端口策略

可扩展交换机端口由以下类型组成:

验证端口
验证端口用于验证和验证端口设置。 这些端口是临时的,是在特定条件下创建的。

例如,创建或重新配置 Hyper-V 子分区进行网络访问时,可扩展交换机接口会创建验证端口。 接口使用此端口来验证与虚拟机 (VM) 分区的网络适配器的网络连接的设置。 验证完成后,将删除验证端口并创建操作端口。

有关详细信息,请参阅 验证端口

操作端口
创建操作端口来托管可扩展的交换机网络适配器连接。 创建操作端口时,会为其分配端口类型。 此端口类型在创建端口后和被拆掉之前生效。 对于分配给 Hyper-V 子分区的端口,操作端口类型在分区正在运行并正常运行时保持有效。

有关详细信息,请参阅 操作端口

可扩展交换机扩展通过以下可扩展交换机对象标识符 (OID) 请求通知端口创建、更新和删除:

OID_SWITCH_PORT_CREATE
可扩展交换机的协议边缘发出 OID_SWITCH_PORT_CREATE 的 OID 集请求,以通知可扩展交换机扩展有关创建可扩展交换机端口的信息。

扩展可以通过返回 OID 请求的STATUS_DATA_NOT_ACCEPTED来否决创建通知。 例如,如果扩展无法分配资源以在端口上强制实施其配置的策略,则扩展会否决创建通知。

如果扩展接受创建通知,则必须将 OID 请求转发到可扩展交换机驱动程序堆栈。 扩展监视此 OID 请求的完成状态,以确定基础扩展是否已否决了端口创建通知。

在创建网络连接之前,扩展无法将数据包转发到新创建的端口。 有关此过程的详细信息,请参阅 Hyper-V 可扩展交换机网络适配器

OID_SWITCH_PORT_UPDATED
可扩展交换机的协议边缘发出 OID_SWITCH_PORT_UPDATED 的 OID 集请求,以通知可扩展交换机扩展可扩展交换机端口的参数正在更新。 OID 将仅针对已创建且尚未开始拆解/删除过程的端口发出。 目前,只有 PortFriendlyName 字段在创建后会更新。

当与端口的先前网络连接已中断且对端口的所有 OID 请求都已完成时,可扩展交换机的协议边缘会发出此 OID 请求。

注意 如果以前未将网络适配器连接到端口,则可能会发出此 OID 请求。

扩展必须始终将此 OID 集请求转发到可扩展交换机驱动程序堆栈。 扩展不得使请求失败。

OID_SWITCH_PORT_TEARDOWN
可扩展交换机的协议边缘发出 OID_SWITCH_PORT_TEARDOWN 的 OID 集请求,以通知可扩展交换机扩展正在删除可扩展交换机端口。 当与端口的先前网络连接已中断且对端口的所有 OID 请求都已完成时,可扩展交换机的协议边缘会发出此 OID 请求。

注意 如果以前未将网络适配器连接到端口,则可能会发出此 OID 请求。

扩展必须始终将此 OID 集请求转发到可扩展交换机驱动程序堆栈。 扩展不得使请求失败。

扩展转发此 OID 请求后,无法再针对要删除的端口发出 OID 请求。

OID_SWITCH_PORT_DELETE
可扩展交换机的协议边缘发出 OID_SWITCH_PORT_DELETE 的 OID 集请求,以通知可扩展交换机扩展已删除可扩展交换机端口。 可扩展交换机的协议边缘在发出 OID_SWITCH_PORT_TEARDOWN 请求和面向端口的 OID 请求已完成后发出此 OID 请求。

扩展必须始终将此 OID 集请求转发到可扩展交换机驱动程序堆栈。 扩展不得使请求失败。

为网络连接创建的所有可扩展交换机端口分配的标识符大于 NDIS_SWITCH_DEFAULT_PORT_ID保留NDIS_SWITCH_DEFAULT_PORT_ID标识符,并通过以下方式使用:

  • 数据包的源端口标识符存储在数据包的带外 (OOB) 转发上下文中,该上下文与其 NET_BUFFER_LIST 结构相关联。 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 可扩展交换机转发上下文

  • OID_SWITCH_NIC_REQUEST (OID) 请求的对象标识符由可扩展交换机接口发出,用于封装向可扩展交换机外部网络适配器发出的 OID 请求。 例如,硬件卸载 OID 请求在发出可扩展交换机驱动程序堆栈之前,由接口封装。

    扩展还可以发出封装的 OID 请求,以便将请求转发到可扩展开关控制路径。 这允许扩展查询或配置基础物理网络适配器的功能。

    此 OID 请求的 NDIS_OID_REQUEST 结构的 InformationBuffer 成员包含指向 NDIS_SWITCH_NIC_OID_REQUEST 结构的指针。 如果 SourcePortId 成员设置为 NDIS_SWITCH_DEFAULT_PORT_ID,则指定 OID 请求由可扩展交换机接口发起。 如果将 DestinationPortId 设置为 NDIS_SWITCH_DEFAULT_PORT_ID,则指定 OID 请求的目标由可扩展交换机驱动程序堆栈中的扩展进行处理。

    有关 OID 请求的控制路径的详细信息,请参阅 OID 请求的 Hyper-V 可扩展交换机控制路径

  • NDIS_STATUS_SWITCH_NIC_STATUS的 NDIS 状态指示由可扩展交换机的微型端口边缘发出,以封装来自可扩展交换机外部网络适配器的状态指示。

    扩展还可以发出封装的 NDIS 状态指示,以便转发可扩展交换机控制路径的指示。 这允许扩展更改基础物理网络适配器的报告功能。

    此指示的 NDIS_STATUS_INDICATION 结构的 StatusBuffer 成员包含指向NDIS_SWITCH_NIC_STATUS_INDICATION结构的指针。 如果 SourcePortId 成员设置为 NDIS_SWITCH_DEFAULT_PORT_ID,则指定状态指示由可扩展交换机接口发起。 如果将 DestinationPortId 设置为 NDIS_SWITCH_DEFAULT_PORT_ID,则指定 OID 请求的目标由可扩展交换机驱动程序堆栈中的扩展进行处理。

    有关 NDIS 状态指示的控制路径的详细信息,请参阅 NDIS 状态指示的 Hyper-V 可扩展交换机控制路径

可扩展交换机接口维护已创建的每个端口的引用计数器。 如果端口的引用计数器具有非零值,则不会删除该端口。 接口提供以下处理程序函数,用于递增或递减可扩展交换机端口的引用计数器:

ReferenceSwitchPort
可扩展交换机扩展调用此函数来递增端口的引用计数器。 虽然引用计数器具有非零值,但可扩展交换机的协议边缘不会发出对象标识符 (OID) OID_SWITCH_PORT_DELETE 的一组请求来删除可扩展交换机端口。

扩展必须先调用 ReferenceSwitchPort ,然后才能执行任何要求端口处于活动状态的操作。 例如,扩展必须先调用 ReferenceSwitchPort ,然后才能发出 OID_SWITCH_PORT_PROPERTY_ENUM的 OID 方法请求。

注意扩展在收到针对该端口的 OID 集OID_SWITCH_PORT_TEARDOWN请求后,不得为端口调用 ReferenceSwitchPort

DereferenceSwitchPort
可扩展交换机扩展调用此函数来递减端口的引用计数器。

在端口上执行的操作完成后,扩展必须调用 DereferenceSwitchPort 。 例如,如果扩展在发出OID_SWITCH_PORT_PROPERTY_ENUM请求之前调用了 ReferenceSwitchPort,则扩展必须在 OID 请求完成后调用 DereferenceSwitchPort

注意 NDIS 端口和可扩展交换机端口是不同的对象。 通过可扩展交换机数据路径移动的数据包始终分配给 NDIS_DEFAULT_PORT_NUMBER的 NDIS 端口号。 但是,数据包的源和目标可扩展交换机端口号可以是 NDIS_SWITCH_DEFAULT_PORT_ID 或更大的值。 有关详细信息,请参阅 Hyper-V 可扩展交换机数据路径