OVS-on-Hyper-V 设计

209 阅读4分钟

微软的管理程序解决方案——Hyper-V1实现了一个可扩展的虚拟交换机,并为其他供应商提供了实现功能扩展的机会2。扩展需要作为NDIS驱动程序来实现,这些NDIS驱动程序绑定在所提供的可扩展交换机驱动程序堆栈中。这些扩展可以广泛地提供监控、修改和转发数据包到Hyper-V可扩展交换机的目的端口的功能。相应地,扩展可以分为以下类型,并提供所述的功能:

•抓包扩展:监控报文 •过滤扩展:监控、修改包 •转发扩展:监控、修改、转发报文

正如预期的那样,Hyper-V解决方案上OVS的内核部分(数据路径)将作为转发扩展实现。

在 Hyper-V 中,虚拟机称为子分区。Hyper-V 可扩展交换机上的每个 VIF 或物理网卡都通过一个端口连接。每个端口既在交换机的入口路径上,也在交换机的出口路径上。入路径用于端口发送数据包,出路径用于端口接收数据包。通过设计,NDIS 提供了一个分层的接口。在这个分层接口中,高层在入口路径中调用低层。在出口路径中,情况正好相反。此外,还有一个对象标识符(OID)接口,用于控制操作。添加端口。调用的工作流本质上类似于数据包,其中较高层调用较低层。下图是该体系结构的一个很好的表示图。

Windows Filtering Platform (WFP)是一个基于Hyper-V实现的平台,提供了过滤数据包的api和服务。已利用粮食计划署对OVS没有能力直接处理的一些包裹进行过滤。后面的部分将提供更多细节。

IIP Helper6 是 Hyper-V 上可用的一组 API,用于检索与主机上的网络配置信息相关的信息。IP Helper 用于检索 OVS 需要的一些配置信息。

image.png

image.png

image.png

该图显示了 OVS Windows 实现中涉及的各种块,以及 NDIS 堆栈中可用的一些组件和虚拟机。数据包从一个 VIF传输到另一个 VIF 和物理网卡的工作流程也被显示出来。

该图大致说明了 OVS 用户空间和内核组件的位置,以及它们如何相互连接。

在 Hyper-V 解决方案上,OVS 的内核部分(数据路径)已经被实现为一个转发扩展,大致实现了以下子模块/功能。 内核中每个子组件的详细信息将在后面的部分中介绍:

  • 与 NDIS 堆栈接口
  • Netlink 消息解析器
  • Netlink socket
  • 交换机/数据路径管理
  • 与 OVS 解决方案的用户空间部分接口,以实现用户空间的必要功能 需要
  • port 管理
  • 流表/动作/包转发
  • 隧道
  • 事件通知

Linux 上 OVS 的数据路径是一个内核模块,不能直接移植,因为尽管提供的最终功能是相似的,但体系结构中存在显著差异。这些差异的一些例子如下:

  • 与 NDIS 堆栈接口,以挂钩到 NDIS 回调函数,以实现诸如接收和发送数据包、数据包完成、用于事件(如虚拟交换机上出现新端口)的 OIDs 等功能。

  • 用户空间和内核模块之间的接口。

  • 事件通知有很大的不同。

  • DPIF 和内核模块之间的通信接口不需要像 Linux 上的 OVS 那样实现。也就是说,出于可读性和可维护性的考虑,拥有与内核模块相似的接口将是有利的。

  • 直接使用 Linux 内核代码的任何许可问题。

由于这些差异,在 Hyper-V 上从头开始为 OVS 开发数据路径是一个直接的决定,而不是在 Linux 上移植数据路径。一次 “重新开发” 的重点是以下目标:

  • 坚持 OVS 用户空间部分的现有需求(如OVS -vswitchd),以尽量减少用户空间工作流中的更改。
  • 很好地适应了Hyper-V可扩展交换机转发扩展的典型工作流程。

OVS 解决方案的用户空间部分主要是 POSIX 代码,而不是非常特定于 Linux。大多数用户空间代码不直接与内核数据路径接口,并且是独立于内核数据路径进行移植的。

正如 OVS 移植设计文档中所解释的那样,DPIF 是与 OVS 内核部分接口的用户空间部分。每个 DPIF 提供程序必须实现的接口在 DPIF provider.h 中定义。尽管允许每个平台拥有自己的 DPIF 提供程序实现,但通过社区反馈发现,希望尽可能共享代码。因此,Hyper-V 上 OVS 的 DPIF 提供程序与 Linux上 的 DPIF 提供程序共享代码。该接口在 dpif-netlink.c 中实现。

我们将在后续的专门章节中详细阐述内核-用户空间接口。这里只需说明,Windows 的 DPIF提供程序实现是基于网络链接的,并且与 Linux 提供程序共享代码。