WIP: Make ovs-taas start in VLAN only env

In case of tunneling is not enabled make OvsTaasDriver skip br-tun
related actions, and make mirroring work in this case.

TODO:
* tests? not sure if unit tests are available and helpful.
* Documentation, like what is the packet flow to make debugging easier.

Change-Id: I2f5e2254801e9a554926eb645cfee8b07475a19e
Closes-Bug: #1950179
This commit is contained in:
elajkat 2021-11-09 12:10:37 +01:00
parent 351c1fbed5
commit bfcdd71acd
1 changed files with 212 additions and 130 deletions

View File

@ -48,6 +48,9 @@ class OvsTaasDriver(taas_base.TaasAgentDriver):
self.int_br = self.agent_api.request_int_br()
self.tun_br = self.agent_api.request_tun_br()
self.tap_br = OVSBridge_tap_extension('br-tap', self.root_helper)
self.phy_brs = []
for phy_br in self.agent_api.request_phy_brs():
self.phy_brs.append(phy_br)
# Prepare OVS bridges for TaaS
self.setup_ovs_bridges()
@ -56,38 +59,14 @@ class OvsTaasDriver(taas_base.TaasAgentDriver):
self.bcmc_kvm = taas_ovs_utils.key_value_mgr(4096)
def periodic_tasks(self, args=None):
#
# Regenerate the flow in br-tun's TAAS_SEND_FLOOD table
# to ensure all existing tunnel ports are included.
#
self.update_tunnel_flood_flow()
def setup_ovs_bridges(self):
#
# br-int : Integration Bridge
# br-tap : Tap Bridge
# br-tun : Tunnel Bridge
#
# Create br-tap
self.tap_br.create()
# Connect br-tap to br-int and br-tun
self.int_br.add_patch_port('patch-int-tap', 'patch-tap-int')
self.tap_br.add_patch_port('patch-tap-int', 'patch-int-tap')
self.tun_br.add_patch_port('patch-tun-tap', 'patch-tap-tun')
self.tap_br.add_patch_port('patch-tap-tun', 'patch-tun-tap')
# Get patch port IDs
patch_tap_int_id = self.tap_br.get_port_ofport('patch-tap-int')
patch_tap_tun_id = self.tap_br.get_port_ofport('patch-tap-tun')
patch_tun_tap_id = self.tun_br.get_port_ofport('patch-tun-tap')
# Purge all existing Taas flows from br-tap and br-tun
self.tap_br.delete_flows(table=0)
self.tap_br.delete_flows(table=taas_ovs_consts.TAAS_RECV_LOC)
self.tap_br.delete_flows(table=taas_ovs_consts.TAAS_RECV_REM)
if self.tun_br:
#
# Regenerate the flow in br-tun's TAAS_SEND_FLOOD table
# to ensure all existing tunnel ports are included.
#
self.update_tunnel_flood_flow()
def _clean_tun_bridge_flows(self, patch_tun_tap_id):
self.tun_br.delete_flows(table=0,
in_port=patch_tun_tap_id)
self.tun_br.delete_flows(table=taas_ovs_consts.TAAS_SEND_UCAST)
@ -98,33 +77,7 @@ class OvsTaasDriver(taas_base.TaasAgentDriver):
self.tun_br.delete_flows(table=taas_ovs_consts.TAAS_DST_RESPOND)
self.tun_br.delete_flows(table=taas_ovs_consts.TAAS_SRC_RESPOND)
#
# Configure standard TaaS flows in br-tap
#
self.tap_br.add_flow(table=0,
priority=1,
in_port=patch_tap_int_id,
actions="resubmit(,%s)" %
taas_ovs_consts.TAAS_RECV_LOC)
self.tap_br.add_flow(table=0,
priority=1,
in_port=patch_tap_tun_id,
actions="resubmit(,%s)" %
taas_ovs_consts.TAAS_RECV_REM)
self.tap_br.add_flow(table=0,
priority=0,
actions="drop")
self.tap_br.add_flow(table=taas_ovs_consts.TAAS_RECV_LOC,
priority=0,
actions="output:%s" % str(patch_tap_tun_id))
self.tap_br.add_flow(table=taas_ovs_consts.TAAS_RECV_REM,
priority=0,
actions="drop")
def _setup_tun_bridge_flows(self, patch_tun_tap_id):
#
# Configure standard Taas flows in br-tun
#
@ -132,12 +85,12 @@ class OvsTaasDriver(taas_base.TaasAgentDriver):
priority=1,
in_port=patch_tun_tap_id,
actions="resubmit(,%s)" %
taas_ovs_consts.TAAS_SEND_UCAST)
taas_ovs_consts.TAAS_SEND_UCAST)
self.tun_br.add_flow(table=taas_ovs_consts.TAAS_SEND_UCAST,
priority=0,
actions="resubmit(,%s)" %
taas_ovs_consts.TAAS_SEND_FLOOD)
taas_ovs_consts.TAAS_SEND_FLOOD)
flow_action = self._create_tunnel_flood_flow_action()
if flow_action != "":
@ -149,19 +102,19 @@ class OvsTaasDriver(taas_base.TaasAgentDriver):
priority=2,
reg0=0,
actions="resubmit(,%s)" %
taas_ovs_consts.TAAS_DST_CHECK)
taas_ovs_consts.TAAS_DST_CHECK)
self.tun_br.add_flow(table=taas_ovs_consts.TAAS_CLASSIFY,
priority=1,
reg0=1,
actions="resubmit(,%s)" %
taas_ovs_consts.TAAS_DST_CHECK)
taas_ovs_consts.TAAS_DST_CHECK)
self.tun_br.add_flow(table=taas_ovs_consts.TAAS_CLASSIFY,
priority=1,
reg0=2,
actions="resubmit(,%s)" %
taas_ovs_consts.TAAS_SRC_CHECK)
taas_ovs_consts.TAAS_SRC_CHECK)
self.tun_br.add_flow(table=taas_ovs_consts.TAAS_DST_CHECK,
priority=0,
@ -176,24 +129,101 @@ class OvsTaasDriver(taas_base.TaasAgentDriver):
reg0=0,
actions="output:%s" % str(patch_tun_tap_id))
self.tun_br.add_flow(table=taas_ovs_consts.TAAS_DST_RESPOND,
priority=1,
reg0=1,
actions=(
"output:%s,"
"move:NXM_OF_VLAN_TCI[0..11]->NXM_NX_TUN_ID"
"[0..11],mod_vlan_vid:2,output:in_port" %
str(patch_tun_tap_id)))
self.tun_br.add_flow(
table=taas_ovs_consts.TAAS_DST_RESPOND,
priority=1,
reg0=1,
actions=("output:%s,move:NXM_OF_VLAN_TCI[0..11]->NXM_NX_TUN_ID"
"[0..11],mod_vlan_vid:2,output:in_port" %
str(patch_tun_tap_id)))
self.tun_br.add_flow(table=taas_ovs_consts.TAAS_SRC_RESPOND,
self.tun_br.add_flow(
table=taas_ovs_consts.TAAS_SRC_RESPOND,
priority=1,
actions=("learn(table=%s,hard_timeout=60,priority=1,"
"NXM_OF_VLAN_TCI[0..11],"
"load:NXM_OF_VLAN_TCI[0..11]->NXM_NX_TUN_ID[0..11],"
"load:0->NXM_OF_VLAN_TCI[0..11],"
"output:NXM_OF_IN_PORT[])" %
taas_ovs_consts.TAAS_SEND_UCAST))
def setup_ovs_bridges(self):
#
# br-int : Integration Bridge
# br-tap : Tap Bridge
# br-tun : Tunnel Bridge
#
# Create br-tap
self.tap_br.create()
# Connect br-tap to br-int and br-tun
self.int_br.add_patch_port('patch-int-tap', 'patch-tap-int')
self.tap_br.add_patch_port('patch-tap-int', 'patch-int-tap')
if self.tun_br:
self.tun_br.add_patch_port('patch-tun-tap', 'patch-tap-tun')
self.tap_br.add_patch_port('patch-tap-tun', 'patch-tun-tap')
# Get patch port IDs
patch_tap_tun_id = self.tap_br.get_port_ofport('patch-tap-tun')
patch_tun_tap_id = self.tun_br.get_port_ofport('patch-tun-tap')
# Setup phy_brs:
for phybr in self.phy_brs:
LOG.debug('BBBB0 phybr=%s ###', phybr.br_name)
phybr.add_patch_port('patch-%s-tap' % phybr.br_name,
'patch-tap-%s' % phybr.br_name)
self.tap_br.add_patch_port('patch-tap-%s' % phybr.br_name,
'patch-%s-tap' % phybr.br_name)
patch_tap_int_id = self.tap_br.get_port_ofport('patch-tap-int')
# Purge all existing Taas flows from br-tap and br-tun
self.tap_br.delete_flows(table=0)
self.tap_br.delete_flows(table=taas_ovs_consts.TAAS_RECV_LOC)
self.tap_br.delete_flows(table=taas_ovs_consts.TAAS_RECV_REM)
if self.tun_br:
self._clean_tun_bridge_flows(patch_tun_tap_id)
#
# Configure standard TaaS flows in br-tap
#
self.tap_br.add_flow(table=0,
priority=1,
actions=(
"learn(table=%s,hard_timeout=60,"
"priority=1,NXM_OF_VLAN_TCI[0..11],"
"load:NXM_OF_VLAN_TCI[0..11]->NXM_NX_TUN_ID"
"[0..11],load:0->NXM_OF_VLAN_TCI[0..11],"
"output:NXM_OF_IN_PORT[])" %
taas_ovs_consts.TAAS_SEND_UCAST))
in_port=patch_tap_int_id,
actions="resubmit(,%s)" %
taas_ovs_consts.TAAS_RECV_LOC)
if self.tun_br:
self.tap_br.add_flow(table=0,
priority=1,
in_port=patch_tap_tun_id,
actions="resubmit(,%s)" %
taas_ovs_consts.TAAS_RECV_REM)
self.tap_br.add_flow(table=0,
priority=0,
actions="drop")
if self.tun_br:
self.tap_br.add_flow(table=taas_ovs_consts.TAAS_RECV_LOC,
priority=0,
actions="output:%s" % str(patch_tap_tun_id))
else:
# resubmit(,2) TAAS_RECV_REM
self.tap_br.add_flow(table=taas_ovs_consts.TAAS_RECV_LOC,
priority=0,
actions="resubmit(,%s)" %
taas_ovs_consts.TAAS_RECV_REM)
self.tap_br.add_flow(table=taas_ovs_consts.TAAS_RECV_REM,
priority=0,
actions="drop")
if self.tun_br:
self._setup_tun_bridge_flows(patch_tun_tap_id)
return
@ -231,27 +261,27 @@ class OvsTaasDriver(taas_base.TaasAgentDriver):
actions="output:in_port")
self.tap_br.add_flow(table=taas_ovs_consts.TAAS_RECV_REM,
priority=1,
priority=11,
dl_vlan=taas_id,
actions="output:%s" % str(patch_tap_int_id))
# Add flow(s) in br-tun
for tunnel_type in n_consts.TUNNEL_NETWORK_TYPES:
self.tun_br.add_flow(table=n_consts.TUN_TABLE[tunnel_type],
priority=1,
tun_id=taas_id,
actions=(
"move:NXM_OF_VLAN_TCI[0..11]->"
"NXM_NX_REG0[0..11],move:NXM_NX_TUN_ID"
"[0..11]->NXM_OF_VLAN_TCI[0..11],"
"resubmit(,%s)" %
taas_ovs_consts.TAAS_CLASSIFY))
if self.tun_br:
# Add flow(s) in br-tun
for tunnel_type in n_consts.TUNNEL_NETWORK_TYPES:
self.tun_br.add_flow(
table=n_consts.TUN_TABLE[tunnel_type],
priority=1,
tun_id=taas_id,
actions=("move:NXM_OF_VLAN_TCI[0..11]->NXM_NX_REG0"
"[0..11],move:NXM_NX_TUN_ID[0..11]->"
"NXM_OF_VLAN_TCI[0..11],resubmit(,%s)" %
taas_ovs_consts.TAAS_CLASSIFY))
self.tun_br.add_flow(table=taas_ovs_consts.TAAS_DST_CHECK,
priority=1,
tun_id=taas_id,
actions="resubmit(,%s)" %
taas_ovs_consts.TAAS_DST_RESPOND)
self.tun_br.add_flow(
table=taas_ovs_consts.TAAS_DST_CHECK,
priority=1,
tun_id=taas_id,
actions="resubmit(,%s)" % taas_ovs_consts.TAAS_DST_RESPOND)
#
# Disable mac-address learning in the Linux bridge to which
@ -273,6 +303,20 @@ class OvsTaasDriver(taas_base.TaasAgentDriver):
utils.execute(['brctl', 'setageing', linux_br_name, 0],
run_as_root=True, privsep_exec=True)
for phybr in self.phy_brs:
patch_phys_tap = phybr.get_port_ofport(
'patch-%s-tap' % phybr.br_name)
phybr.add_flow(table=0, priority=10,
dl_vlan=taas_id,
actions='output:%s' % str(patch_phys_tap))
patch_tap_phys = phybr.get_port_ofport(
'patch-tap-%s' % phybr.br_name)
self.tap_br.add_flow(table=0,
priority=1,
in_port=patch_tap_phys,
actions='resubmit(,%s)' %
taas_ovs_consts.TAAS_RECV_REM)
return
def delete_tap_service(self, tap_service):
@ -293,16 +337,23 @@ class OvsTaasDriver(taas_base.TaasAgentDriver):
self.tap_br.delete_flows(table=taas_ovs_consts.TAAS_RECV_REM,
dl_vlan=taas_id)
# Delete flow(s) from br-tun
for tunnel_type in n_consts.TUNNEL_NETWORK_TYPES:
self.tun_br.delete_flows(table=n_consts.TUN_TABLE[tunnel_type],
if self.tun_br:
# Delete flow(s) from br-tun
for tunnel_type in n_consts.TUNNEL_NETWORK_TYPES:
self.tun_br.delete_flows(
table=n_consts.TUN_TABLE[tunnel_type], tun_id=taas_id)
self.tun_br.delete_flows(table=taas_ovs_consts.TAAS_DST_CHECK,
tun_id=taas_id)
self.tun_br.delete_flows(table=taas_ovs_consts.TAAS_DST_CHECK,
tun_id=taas_id)
self.tun_br.delete_flows(table=taas_ovs_consts.TAAS_SRC_CHECK,
tun_id=taas_id)
self.tun_br.delete_flows(table=taas_ovs_consts.TAAS_SRC_CHECK,
tun_id=taas_id)
for phybr in self.phy_brs:
phybr.delete_flows(table=0, dl_vlan=taas_id)
patch_tap_phys = phybr.get_port_ofport(
'patch-tap-%s' % phybr.br_name)
self.tap_br.delete_flows(table=0, in_port=patch_tap_phys,)
return
@ -317,6 +368,7 @@ class OvsTaasDriver(taas_base.TaasAgentDriver):
# Get patch port ID
patch_int_tap_id = self.int_br.get_port_ofport('patch-int-tap')
patch_tap_int_id = self.tap_br.get_port_ofport('patch-tap-int')
# Add flow(s) in br-int
if direction == 'OUT' or direction == 'BOTH':
@ -348,42 +400,60 @@ class OvsTaasDriver(taas_base.TaasAgentDriver):
#
# Get VLAN id for tap flow port
# port_dict = self.int_br.get_port_tag_dict()
# port_vlan_id = port_dict[ovs_port.port_name]
port_dict = self.int_br.get_port_tag_dict()
port_vlan_id = port_dict[ovs_port.port_name]
self.int_br.add_flow(table=0,
priority=20,
# dl_vlan=port_vlan_id,
dl_vlan=port_vlan_id,
dl_dst=port_mac,
actions="normal,mod_vlan_vid:%s,output:%s" %
(str(taas_id), str(patch_int_tap_id)))
# self._add_update_ingress_bcmc_flow(port_vlan_id,
# taas_id,
# patch_int_tap_id)
self._add_update_ingress_bcmc_flow(port_vlan_id,
taas_id,
patch_int_tap_id)
# Add flow(s) in br-tun
for tunnel_type in n_consts.TUNNEL_NETWORK_TYPES:
self.tun_br.add_flow(table=n_consts.TUN_TABLE[tunnel_type],
if self.tun_br:
# Add flow(s) in br-tun
for tunnel_type in n_consts.TUNNEL_NETWORK_TYPES:
self.tun_br.add_flow(
table=n_consts.TUN_TABLE[tunnel_type],
priority=1,
tun_id=taas_id,
actions=("move:NXM_OF_VLAN_TCI[0..11]->"
"NXM_NX_REG0[0..11],move:NXM_NX_TUN_ID"
"[0..11]->NXM_OF_VLAN_TCI[0..11],resubmit(,%s)" %
taas_ovs_consts.TAAS_CLASSIFY))
self.tun_br.add_flow(table=taas_ovs_consts.TAAS_SRC_CHECK,
priority=1,
tun_id=taas_id,
actions=(
"move:NXM_OF_VLAN_TCI[0..11]->"
"NXM_NX_REG0[0..11],move:NXM_NX_TUN_ID"
"[0..11]->NXM_OF_VLAN_TCI[0..11],"
"resubmit(,%s)" %
taas_ovs_consts.TAAS_CLASSIFY))
actions="resubmit(,%s)" %
taas_ovs_consts.TAAS_SRC_RESPOND)
self.tun_br.add_flow(table=taas_ovs_consts.TAAS_SRC_CHECK,
priority=1,
tun_id=taas_id,
actions="resubmit(,%s)" %
taas_ovs_consts.TAAS_SRC_RESPOND)
# Add flows to physical bridges:
for phybr in self.phy_brs:
# from br-tap to brphys
patch_tap_phys = self.tap_br.get_port_ofport(
'patch-tap-%s' % phybr.br_name)
patch_phys_tap = phybr.get_port_ofport(
'patch-%s-tap' % phybr.br_name)
self.tap_br.add_flow(table=taas_ovs_consts.TAAS_RECV_REM,
priority=10,
dl_vlan=taas_id,
actions='output:%s' % str(patch_tap_phys))
# add flow to phybr:
phybr.add_flow(table=0, priority=10,
in_port=patch_phys_tap,
dl_vlan=taas_id,
actions='normal')
return
def delete_tap_flow(self, tap_flow):
port = tap_flow['port']
taas_id = tap_flow['taas_id']
direction = tap_flow['tap_flow']['direction']
# Get OVS port id for tap flow port
@ -403,23 +473,35 @@ class OvsTaasDriver(taas_base.TaasAgentDriver):
# Please see comment in create_tap_flow() for details.
#
# taas_id = tap_flow['taas_id']
taas_id = tap_flow['taas_id']
# Get VLAN id for tap flow port
# port_dict = self.int_br.get_port_tag_dict()
# port_vlan_id = port_dict[ovs_port.port_name]
port_dict = self.int_br.get_port_tag_dict()
port_vlan_id = port_dict[ovs_port.port_name]
# Get patch port ID
# patch_int_tap_id = self.int_br.get_port_ofport('patch-int-tap')
patch_int_tap_id = self.int_br.get_port_ofport('patch-int-tap')
self.int_br.delete_flows(table=0,
# dl_vlan=port_vlan_id,
dl_dst=port_mac)
# self._del_update_ingress_bcmc_flow(port_vlan_id,
# taas_id,
# patch_int_tap_id)
self._del_update_ingress_bcmc_flow(port_vlan_id,
taas_id,
patch_int_tap_id)
for phybr in self.phy_brs:
patch_tap_phys = self.tap_br.get_port_ofport(
'patch-tap-%s' % phybr.br_name)
patch_phys_tap = phybr.get_port_ofport(
'patch-%s-tap' % phybr.br_name)
self.tap_br.delete_flows(table=taas_ovs_consts.TAAS_RECV_REM,
dl_vlan=taas_id,
actions='output:%s' % str(patch_tap_phys))
phybr.delete_flows(table=0,
in_port=patch_phys_tap,
dl_vlan=taas_id,
actions='normal')
return
def update_tunnel_flood_flow(self):