OVSDVRNeutronAgent 类是本地处理的 agent,启动后会在三个网桥上添加初始化的规则,主要过程如下。

    其中,br-int 是本地交换网桥;br-tun 是跟其它计算节点通信的承载网桥;br-phy 是跟外部公共网络通信的网桥。

    integrate 网桥负责本地同一子网内的网包交换。

    主要过程为

    首先,网桥上采用了多个流表,定义在 openvswitch/common 目录下的 constants.py。主要流表包括:

    • LOCAL_SWITCHING 表:0,顾名思义,用于本地的交换。
    • CANARY 表:23
    • DVR_TO_SRC_MAC 表:1
    • DVR_TO_SRC_MAC_VLAN 表:2

    上面的代码配置 LOCAL_SWITCHING 表默认规则为 NORMAL(作为本地的正常学习交换机),并不允许宿主机本地端口进来的包。配置其它表默认行为为丢弃。

    主要过程为

    • DVR_PROCESS 表:1,顾名思义,用于 DVR 处理。
    • LEARN_FROM_TUN 表:10,学习从 tunnel 收到的网包。
    • PATCH_LV_TO_TUN 表:2。

    所有从 br-int 过来的网包,发到 DVR_PROCESS 表处理。

    DVR_NOT_LEARN 表,默认将网包发给表 LEARN_FROM_TUN。

    DVR_PROCESS 表,默认将网包发给表 PATCH_LV_TO_TUN。

    主要过程为

    对所有的连接到外部的物理网桥都添加类似规则。

    主要流表包括:

    • DVR_PROCESS_VLAN:1
    • LOCAL_VLAN_TRANSLATION:2
    • DVR_NOT_LEARN_VLAN:3。

    默认从 br-int 来的所有网包发送给表 DVR_PROCESS_VLAN。

    LOCAL_VLAN_TRANSLATION 表丢弃从 br-int 来的所有网包。

    其他所有网包发送给表 DVR_NOT_LEARN_VLAN。

    表 DVR_NOT_LEARN_VLAN 默认规则为 NORMAL。

    主要过程为

    这里主要是添加对其他主机上的 DVR 网关发过来的网包的处理。

    外部网络为 vlan 的情况下

    br-int 网桥上,表 LOCAL_SWITCHING 添加优先级为 4 的流,如果从外面过来的网包,MAC 源地址是其他的 DVR 网关地址,则扔给表 DVR_TO_SRC_MAC_VLAN 处理。

    br-eth 网桥上,表 DVR_NOT_LEARN_VLAN 则添加优先级为 2 的规则,MAC 源地址是其他的 DVR 网关地址,则发给 br-int。

    外部网络为 tunnel 的情况下