支持 QinQ 的 Neutron VLAN 网络

Launchpad Bug: https://bugs.launchpad.net/neutron/+bug/1915151

Neutron 支持 VLAN 透明性网络,但在与 VLAN 网络一起使用时,无法将其用作 QinQ,后者与常规 VLAN ethertype (0x8100) 不同 (例如 0x8a88)。

问题描述

启用 VLAN 透明性的网络可以是 Neutron 中可用的任何类型 (vxlan, vlan, flat 等)。在大多数情况下,从节点发送的具有 ethertype 0x8100 (802.1q) 的数据包是可以的。但如果已经有 2 个 VLAN (S-Tag 和 C-Tag),则在某些用例中,应将其作为 QinQ 发送,这是一种略有不同的标准,具有不同的 ethertype (0x8a88) [1]

提议的变更

添加新的 API 扩展,以扩展 Neutron 中的 network 资源,并添加 qinq 属性。此新属性仅对 vlan 网络有效,并且对于这些网络,其工作方式与当前的 VLAN 透明性 扩展 [2] 类似。VLAN 透明性和新的 qinq 扩展之间的区别在于为从节点发送的此类网络中的数据包配置的 ethertype。在 qinq=True 的情况下,S-Tag 和 C-Tag 的工作方式与启用 VLAN 透明性的网络相同。C-Tag 由用户直接在实例中配置,S-Tag 由 Neutron 配置和控制。区别在于从节点发送的数据包的 ethertype 将为 0x8a88。属性 vlan_transparentqinq 将互斥。网络中只能将其中一个设置为 True

服务器端变更

将添加 Neutron 的一个新的 API 扩展,其中包含 network 资源的新的属性。这个新的属性将被称为 qinq

RESOURCE_ATTRIBUTE_MAP = {
    network.COLLECTION_NAME: {
        "qinq": {
            'allow_post': True,
            'allow_put': False,
            'convert_to': converters.convert_to_boolean,
            'default': constants.ATTR_NOT_SPECIFIED,
            'is_visible': True,
            'is_filter': True
        }
    }
}

注意

属性 qinq 仅对 vlan 网络有效。

注意

属性 vlan_transparentqinq 将互斥。其中只能将一个设置为 True

Agent 端更改

目前 linuxbridgeovnSR-IOV 后端支持 VLAN 透明性,并且相同的后端将支持 QinQ。对于 linuxbridgeovn 后端,需要在节点上设置正确的 ethertype,以便为数据包设置正确的 ethertype。对于 SR-IOV 后端,对该功能的的支持将取决于硬件及其驱动程序,并且需要单独进行测试。

数据库影响

networks 表扩展为包含布尔列 qinq

REST API 影响

无。

客户端影响

在 osc 和 openstacksdk 中进行相关更改,以添加对新网络属性的支持。要为其启用,应该如下所示

openstack network create --qinq

要禁用它

openstack network create --no-qinq

测试

  • 单元测试。

  • 全栈测试。

  • neutron-tempest-plugin 中的 Tempest 测试。

负责人

参考资料