From b4d45961651e5de2e62fb64e941d10e8959da6db Mon Sep 17 00:00:00 2001
From: yatinkarel
-@@ -2056,6 +2056,16 @@ output;
+@@ -1090,24 +1090,28 @@
+
+- For each distributed gateway router port RP attached to
+- the logical switch, a priority-2000 flow is added with the match
+-
+
reg0[14] == 1 && is_chassis_resident(RP)
+-
and action next;
to pass the traffic to the
+- next table to respond to the ARP requests for the router port IPs.
++ If logical switch has attached logical switch port of vtep
++ type, then for each distributed gateway router port RP
++ attached to this logical switch and has chassis redirect port
++ cr-RP, a priority-2000 flow is added with the match
++
++
++ and action reg0[14] == 1 && is_chassis_resident(cr-RP)
++ next;
.
+
+ reg0[14]
register bit is set in the ingress L2 port
+- security check table for traffic received from HW VTEP (ramp)
+- ports.
++ security check table for traffic received from HW VTEP (ramp) ports.
+
reg0[14]
register
+- bit for the traffic received from HW VTEP (ramp) ports. This traffic
+- is passed to ingress table ls_in_l2_lkup.
++ If logical switch has attached logical switch port of vtep
++ type, then a priority-1000 flow that matches on
++ reg0[14]
register bit for the traffic received from HW
++ VTEP (ramp) ports. This traffic is passed to ingress table
++ ls_in_l2_lkup.
+
-@@ -2098,6 +2108,12 @@ output;
+@@ -2098,6 +2112,12 @@ output;
to-lport
ACLs.
In addition, the following flows are added.
-@@ -3066,10 +3082,18 @@ nd.tll = external_mac; +@@ -3066,10 +3086,18 @@ nd.tll = external_mac; broadcast address. By definition this traffic should not be forwarded.@@ -2294,7 +4048,7 @@ index 2eab2c4ae..e16d7d080 100644
-@@ -3349,10 +3354,11 @@ icmp6 {
+@@ -3349,10 +3358,11 @@ icmp6 {
column, that includes a L4 port PORT of protocol
P and IPv4 or IPv6 address VIP, a priority-100
flow that matches on ct.new && ip &&
@@ -2309,7 +4063,7 @@ index 2eab2c4ae..e16d7d080 100644
reg9[6] == 1 && ct.new &&
@@ -2321,7 +4075,7 @@ index 2eab2c4ae..e16d7d080 100644
ct_lb_mark(args)
, where args
contains comma separated IP addresses (and optional port numbers)
to load balance to. The address family of the IP addresses of
-@@ -3410,56 +3415,25 @@ icmp6 {
+@@ -3410,56 +3419,25 @@ icmp6 {
Router with gateway port in OVN_Northbound
database that
includes a L4 port PORT of protocol P and IPv4
or IPv6 address VIP, a priority-120 flow that matches on
@@ -2385,7 +4139,7 @@ index 2eab2c4ae..e16d7d080 100644
OVN_Northbound
database that includes just an IP address
VIP to match on, a priority-110 flow that matches on
@@ -2433,7 +4187,7 @@ index 2eab2c4ae..e16d7d080 100644
-@@ -3529,7 +3478,20 @@ icmp6 {
+@@ -3529,7 +3482,20 @@ icmp6 {
with an action of ct_commit_nat;
, if the router
has load balancer assigned to it. Along with two priority 70 flows
that match skip_snat
and force_snat
@@ -2455,7 +4209,7 @@ index 2eab2c4ae..e16d7d080 100644
flags.loopback = 1; ct_dnat;
.
-@@ -4998,7 +4965,19 @@ nd_ns {
+@@ -4998,7 +4969,19 @@ nd_ns {
For distributed logical routers where one of the logical router -@@ -5070,7 +5049,7 @@ clone { +@@ -5070,7 +5053,7 @@ clone { @@ -2497,10 +4251,42 @@ index 2eab2c4ae..e16d7d080 100644
Packets that reach this table are ready for delivery. It contains: +diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c +index 5f895b053..7d24648ff 100644 +--- a/northd/ovn-northd.c ++++ b/northd/ovn-northd.c +@@ -33,6 +33,7 @@ + #include "lib/ovn-l7.h" + #include "lib/ovn-nb-idl.h" + #include "lib/ovn-sb-idl.h" ++#include "lib/ovs-rcu.h" + #include "openvswitch/poll-loop.h" + #include "simap.h" + #include "stopwatch.h" +@@ -1048,6 +1049,8 @@ main(int argc, char *argv[]) + ovsdb_idl_loop_destroy(&ovnnb_idl_loop); + ovsdb_idl_loop_destroy(&ovnsb_idl_loop); + service_stop(); ++ run_update_worker_pool(0); ++ ovsrcu_exit(); + + exit(res); + } diff --git a/ovn-architecture.7.xml b/ovn-architecture.7.xml -index cb1064f71..86c6258e0 100644 +index cb1064f71..a2a87ec28 100644 --- a/ovn-architecture.7.xml +++ b/ovn-architecture.7.xml +@@ -1233,8 +1233,8 @@ + output port field, and since they do not carry a logical output port + field in the tunnel key, when a packet is received from ramp switch + VXLAN tunnel by an OVN hypervisor, the packet is resubmitted to table 8 +- to determine the output port(s); when the packet reaches table 37, +- these packets are resubmitted to table 38 for local delivery by ++ to determine the output port(s); when the packet reaches table 39, ++ these packets are resubmitted to table 40 for local delivery by + checking a MLF_RCV_FROM_RAMP flag, which is set when the packet + arrives from a ramp tunnel. +
@@ -1318,7 +1318,7 @@ output port is known. These pieces of information are obtained from the tunnel encapsulation metadata (seeTunnel
@@ -2510,6 +4296,210 @@ index cb1064f71..86c6258e0 100644
+@@ -1439,38 +1439,42 @@
+
+
+
+- OpenFlow tables 37 through 39 implement the output
action
+- in the logical ingress pipeline. Specifically, table 37 handles
+- packets to remote hypervisors, table 38 handles packets to the local
+- hypervisor, and table 39 checks whether packets whose logical ingress
+- and egress port are the same should be discarded.
++ OpenFlow tables 37 through 41 implement the output
action
++ in the logical ingress pipeline. Specifically, table 37 serves as an
++ entry point to egress pipeline. Table 37 detects IP packets that are
++ too big for a corresponding interface. Table 38 produces ICMPv4
++ Fragmentation Needed (or ICMPv6 Too Big) errors and deliver them back
++ to the offending port. table 39 handles packets to remote hypervisors,
++ table 40 handles packets to the local hypervisor, and table 41 checks
++ whether packets whose logical ingress and egress port are the same
++ should be discarded.
+
+
+
+ Logical patch ports are a special case. Logical patch ports do not
+ have a physical location and effectively reside on every hypervisor.
+- Thus, flow table 38, for output to ports on the local hypervisor,
++ Thus, flow table 40, for output to ports on the local hypervisor,
+ naturally implements output to unicast logical patch ports too.
+ However, applying the same logic to a logical patch port that is part
+ of a logical multicast group yields packet duplication, because each
+ hypervisor that contains a logical port in the multicast group will
+ also output the packet to the logical patch port. Thus, multicast
+- groups implement output to logical patch ports in table 37.
++ groups implement output to logical patch ports in table 39.
+
+
+
+- Each flow in table 37 matches on a logical output port for unicast or
++ Each flow in table 39 matches on a logical output port for unicast or
+ multicast logical ports that include a logical port on a remote
+ hypervisor. Each flow's actions implement sending a packet to the port
+ it matches. For unicast logical output ports on remote hypervisors,
+ the actions set the tunnel key to the correct value, then send the
+ packet on the tunnel port to the correct hypervisor. (When the remote
+ hypervisor receives the packet, table 0 there will recognize it as a
+- tunneled packet and pass it along to table 38.) For multicast logical
++ tunneled packet and pass it along to table 40.) For multicast logical
+ output ports, the actions send one copy of the packet to each remote
+ hypervisor, in the same way as for unicast destinations. If a
+ multicast group includes a logical port or ports on the local
+- hypervisor, then its actions also resubmit to table 38. Table 37 also
++ hypervisor, then its actions also resubmit to table 40. Table 39 also
+ includes:
+
+
+@@ -1478,7 +1482,7 @@
+
+ A higher-priority rule to match packets received from ramp switch
+ tunnels, based on flag MLF_RCV_FROM_RAMP, and resubmit these packets
+- to table 38 for local delivery. Packets received from ramp switch
++ to table 40 for local delivery. Packets received from ramp switch
+ tunnels reach here because of a lack of logical output port field in
+ the tunnel key and thus these packets needed to be submitted to table
+ 8 to determine the output port.
+@@ -1486,7 +1490,7 @@
+
+ A higher-priority rule to match packets received from ports of type
+ localport
, based on the logical input port, and resubmit
+- these packets to table 38 for local delivery. Ports of type
++ these packets to table 40 for local delivery. Ports of type
+ localport
exist on every hypervisor and by definition
+ their traffic should never go out through a tunnel.
+
+@@ -1501,41 +1505,41 @@
+ packets, the packets only need to be delivered to local ports.
+
+
+- A fallback flow that resubmits to table 38 if there is no other
++ A fallback flow that resubmits to table 40 if there is no other
+ match.
+
+
+
+
+- Flows in table 38 resemble those in table 37 but for logical ports that
++ Flows in table 40 resemble those in table 39 but for logical ports that
+ reside locally rather than remotely. For unicast logical output ports
+- on the local hypervisor, the actions just resubmit to table 39. For
++ on the local hypervisor, the actions just resubmit to table 41. For
+ multicast output ports that include one or more logical ports on the
+ local hypervisor, for each such logical port P, the actions
+ change the logical output port to P, then resubmit to table
+- 39.
++ 41.
+
+
+
+ A special case is that when a localnet port exists on the datapath,
+ remote port is connected by switching to the localnet port. In this
+- case, instead of adding a flow in table 37 to reach the remote port, a
+- flow is added in table 38 to switch the logical outport to the localnet
+- port, and resubmit to table 38 as if it were unicasted to a logical
++ case, instead of adding a flow in table 39 to reach the remote port, a
++ flow is added in table 40 to switch the logical outport to the localnet
++ port, and resubmit to table 40 as if it were unicasted to a logical
+ port on the local hypervisor.
+
+
+
+- Table 39 matches and drops packets for which the logical input and
++ Table 41 matches and drops packets for which the logical input and
+ output ports are the same and the MLF_ALLOW_LOOPBACK flag is not
+ set. It also drops MLF_LOCAL_ONLY packets directed to a localnet port.
+- It resubmits other packets to table 40.
++ It resubmits other packets to table 42.
+
+
+
+
+
+- OpenFlow tables 40 through 63 execute the logical egress pipeline from
++ OpenFlow tables 42 through 62 execute the logical egress pipeline from
+ the Logical_Flow
table in the OVN Southbound database.
+ The egress pipeline can perform a final stage of validation before
+ packet delivery. Eventually, it may execute an output
+@@ -1554,7 +1558,7 @@
+
+
+ Table 64 bypasses OpenFlow loopback when MLF_ALLOW_LOOPBACK is set.
+- Logical loopback was handled in table 39, but OpenFlow by default also
++ Logical loopback was handled in table 41, but OpenFlow by default also
+ prevents loopback to the OpenFlow ingress port. Thus, when
+ MLF_ALLOW_LOOPBACK is set, OpenFlow table 64 saves the OpenFlow ingress
+ port, sets it to zero, resubmits to table 65 for logical-to-physical
+@@ -1592,8 +1596,8 @@
+ traverse tables 0 to 65 as described in the previous section
+ Architectural Physical Life Cycle of a Packet
, using the
+ logical datapath representing the logical switch that the sender is
+- attached to. At table 37, the packet will use the fallback flow that
+- resubmits locally to table 38 on the same hypervisor. In this case,
++ attached to. At table 39, the packet will use the fallback flow that
++ resubmits locally to table 40 on the same hypervisor. In this case,
+ all of the processing from table 0 to table 65 occurs on the hypervisor
+ where the sender resides.
+
+@@ -1624,7 +1628,7 @@
+
+ The packet traverses tables 8 to 65 a third and final time. If the
+ destination VM or container resides on a remote hypervisor, then table
+- 37 will send the packet on a tunnel port from the sender's hypervisor
++ 39 will send the packet on a tunnel port from the sender's hypervisor
+ to the remote hypervisor. Finally table 65 will output the packet
+ directly to the destination VM or container.
+
+@@ -1651,9 +1655,9 @@
+ When a hypervisor processes a packet on a logical datapath
+ representing a logical switch, and the logical egress port is a
+ l3gateway
port representing connectivity to a gateway
+- router, the packet will match a flow in table 37 that sends the
++ router, the packet will match a flow in table 39 that sends the
+ packet on a tunnel port to the chassis where the gateway router
+- resides. This processing in table 37 is done in the same manner as
++ resides. This processing in table 39 is done in the same manner as
+ for VIFs.
+
+
+@@ -1746,21 +1750,21 @@
+ chassis, one additional mechanism is required. When a packet
+ leaves the ingress pipeline and the logical egress port is the
+ distributed gateway port, one of two different sets of actions is
+- required at table 37:
++ required at table 39:
+
+
+
+ -
+ If the packet can be handled locally on the sender's hypervisor
+ (e.g. one-to-one NAT traffic), then the packet should just be
+- resubmitted locally to table 38, in the normal manner for
++ resubmitted locally to table 40, in the normal manner for
+ distributed logical patch ports.
+
+
+ -
+ However, if the packet needs to be handled on the chassis
+ associated with the distributed gateway port (e.g. one-to-many
+- SNAT traffic or non-NAT traffic), then table 37 must send the
++ SNAT traffic or non-NAT traffic), then table 39 must send the
+ packet on a tunnel port to that chassis.
+
+
+@@ -1772,11 +1776,11 @@
+ egress port to the type chassisredirect
logical port is
+ simply a way to indicate that although the packet is destined for
+ the distributed gateway port, it needs to be redirected to a
+- different chassis. At table 37, packets with this logical egress
+- port are sent to a specific chassis, in the same way that table 37
++ different chassis. At table 39, packets with this logical egress
++ port are sent to a specific chassis, in the same way that table 39
+ directs packets whose logical egress port is a VIF or a type
+ l3gateway
port to different chassis. Once the packet
+- arrives at that chassis, table 38 resets the logical egress port to
++ arrives at that chassis, table 40 resets the logical egress port to
+ the value representing the distributed gateway port. For each
+ distributed gateway port, there is one type
+ chassisredirect
port, in addition to the distributed
diff --git a/ovn-nb.xml b/ovn-nb.xml
index 8d56d0c6e..35acda107 100644
--- a/ovn-nb.xml
@@ -2572,7 +4562,7 @@ index d281f861c..6c4c6621c 100644
[Install]
WantedBy=multi-user.target
diff --git a/tests/ovn-controller.at b/tests/ovn-controller.at
-index bbe142ae3..27fc44232 100644
+index bbe142ae3..dd7eda516 100644
--- a/tests/ovn-controller.at
+++ b/tests/ovn-controller.at
@@ -493,7 +493,8 @@ check ovn-nbctl --wait=hv sync
@@ -2616,6 +4606,579 @@ index bbe142ae3..27fc44232 100644
cat hv1/ovn-controller.log
+@@ -868,7 +873,7 @@ meta=$(ovn-sbctl get datapath ls1 tunnel_key)
+ port=$(ovn-sbctl get port_binding ls1-rp tunnel_key)
+ check ovn-nbctl lrp-add lr0 rp-ls1 00:00:01:01:02:03 192.168.1.254/24
+
+-OVS_WAIT_UNTIL([as hv1 ovs-ofctl dump-flows br-int | grep table=38 | grep -q "reg15=0x${port},metadata=0x${meta}"])
++OVS_WAIT_UNTIL([as hv1 ovs-ofctl dump-flows br-int | grep table=40 | grep -q "reg15=0x${port},metadata=0x${meta}"])
+
+ OVN_CLEANUP([hv1])
+ AT_CLEANUP
+@@ -912,14 +917,14 @@ for i in $(seq 10); do
+ check ovn-nbctl add address_set as1 addresses 10.0.0.$i
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 3; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | sort], [0], [dnl
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.1 actions=drop
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.2 actions=drop
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.3 actions=drop
+ ])
+ fi
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$i
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$i
+ ])
+ done
+
+@@ -934,15 +939,15 @@ for i in $(seq 10); do
+ check ovn-nbctl remove address_set as1 addresses 10.0.0.$i
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 9; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}'], [0], [dnl
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.10 actions=drop
+ ])
+ fi
+ if test "$i" = 10; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep "priority=1100"], [1], [ignore])
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep "priority=1100"], [1], [ignore])
+ else
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$((10 - $i))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$((10 - $i))
+ ])
+ fi
+ done
+@@ -960,7 +965,7 @@ for i in $(seq 10); do
+ check ovn-nbctl add address_set as1 addresses 10.0.0.$i,10.0.1.$i
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 3; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | sort], [0], [dnl
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.1 actions=drop
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.2 actions=drop
+@@ -970,7 +975,7 @@ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.1.2 actions=dr
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.1.3 actions=drop
+ ])
+ fi
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$(($i * 2))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$(($i * 2))
+ ])
+ done
+
+@@ -987,11 +992,11 @@ reprocess_count_old=$(read_counter consider_logical_flow)
+ check ovn-nbctl add address_set as1 addresses 10.0.0.21,10.0.0.22 -- \
+ remove address_set as1 addresses 10.0.0.10
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep -c 10\.0\.0\.21], [0], [1
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep -c 10\.0\.0\.21], [0], [1
+ ])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep -c 10\.0\.0\.22], [0], [1
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep -c 10\.0\.0\.22], [0], [1
+ ])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10\.0\.0\.10], [1], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10\.0\.0\.10], [1], [ignore])
+
+ reprocess_count_new=$(read_counter consider_logical_flow)
+ AT_CHECK([echo $(($reprocess_count_new - $reprocess_count_old))], [0], [0
+@@ -1003,9 +1008,9 @@ reprocess_count_old=$(read_counter consider_logical_flow)
+ check ovn-nbctl remove address_set as1 addresses 10.0.0.21,10.0.0.22 -- \
+ add address_set as1 addresses 10.0.0.10
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10\.0\.0\.21], [1], [ignore])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10\.0\.0\.22], [1], [ignore])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep -c 10\.0\.0\.10], [0], [1
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10\.0\.0\.21], [1], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10\.0\.0\.22], [1], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep -c 10\.0\.0\.10], [0], [1
+ ])
+
+ reprocess_count_new=$(read_counter consider_logical_flow)
+@@ -1018,9 +1023,9 @@ reprocess_count_old=$(read_counter consider_logical_flow)
+ check ovn-nbctl add address_set as1 addresses 10.0.0.21 -- \
+ remove address_set as1 addresses 10.0.0.10
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep -c 10\.0\.0\.21], [0], [1
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep -c 10\.0\.0\.21], [0], [1
+ ])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10\.0\.0\.10], [1], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10\.0\.0\.10], [1], [ignore])
+
+ reprocess_count_new=$(read_counter consider_logical_flow)
+ AT_CHECK([echo $(($reprocess_count_new - $reprocess_count_old))], [0], [0
+@@ -1032,12 +1037,12 @@ reprocess_count_old=$(read_counter consider_logical_flow)
+ check ovn-nbctl add address_set as1 addresses 10.0.0.22,10.0.0.23 -- \
+ remove address_set as1 addresses 10.0.0.9,10.0.0.8
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep -c 10\.0\.0\.22], [0], [1
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep -c 10\.0\.0\.22], [0], [1
+ ])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep -c 10\.0\.0\.23], [0], [1
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep -c 10\.0\.0\.23], [0], [1
+ ])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10\.0\.0\.8], [1], [ignore])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10\.0\.0\.9], [1], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10\.0\.0\.8], [1], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10\.0\.0\.9], [1], [ignore])
+
+ reprocess_count_new=$(read_counter consider_logical_flow)
+ AT_CHECK([echo $(($reprocess_count_new - $reprocess_count_old))], [0], [0
+@@ -1085,7 +1090,7 @@ for i in $(seq 10); do
+ check ovn-nbctl add address_set as1 addresses 10.0.0.$i
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 1; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | sort], [0], [dnl
+ priority=1100,tcp,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.1,tp_dst=111 actions=drop
+ priority=1100,tcp,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.1,tp_dst=222 actions=drop
+@@ -1093,12 +1098,12 @@ priority=1100,tcp,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.1,tp_dst=33
+ ])
+ else
+ # (1 conj_id flow + 3 tp_dst flows) = 4 extra flows
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$(($i + 4))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$(($i + 4))
+ ])
+ fi
+
+ if test "$i" = 3; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | \
+ sed -r 's/conjunction.*,/conjunction,/' | \
+ sed -r 's/conj_id=.*,/conj_id=,/' | sort], [0], [dnl
+@@ -1124,17 +1129,17 @@ for i in $(seq 10); do
+ check ovn-nbctl remove address_set as1 addresses 10.0.0.$i
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 10; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep "priority=1100"], [1], [ignore])
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep "priority=1100"], [1], [ignore])
+ elif test "$i" = 9; then
+ # no conjunction left
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | sort], [0], [dnl
+ priority=1100,tcp,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.10,tp_dst=111 actions=drop
+ priority=1100,tcp,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.10,tp_dst=222 actions=drop
+ priority=1100,tcp,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.10,tp_dst=333 actions=drop
+ ])
+ else
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$((14 - $i))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$((14 - $i))
+ ])
+ fi
+ done
+@@ -1150,7 +1155,7 @@ for i in $(seq 10); do
+ check ovn-nbctl add address_set as1 addresses 10.0.0.$i,10.0.1.$i
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 3; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | \
+ sed -r 's/conjunction.*,/conjunction,/' | \
+ sed -r 's/conj_id=.*,/conj_id=,/' | sort], [0], [dnl
+@@ -1166,7 +1171,7 @@ priority=1100,tcp,reg15=0x$port_key,metadata=0x$dp_key,tp_dst=222 actions=conjun
+ priority=1100,tcp,reg15=0x$port_key,metadata=0x$dp_key,tp_dst=333 actions=conjunction,2/2)
+ ])
+ fi
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$(($i * 2 + 4))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$(($i * 2 + 4))
+ ])
+ done
+
+@@ -1182,11 +1187,11 @@ reprocess_count_old=$(read_counter consider_logical_flow)
+ check ovn-nbctl add address_set as1 addresses 10.0.0.21,10.0.0.22 -- \
+ remove address_set as1 addresses 10.0.0.10
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep -c 10\.0\.0\.21], [0], [1
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep -c 10\.0\.0\.21], [0], [1
+ ])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep -c 10\.0\.0\.22], [0], [1
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep -c 10\.0\.0\.22], [0], [1
+ ])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10\.0\.0\.10], [1], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10\.0\.0\.10], [1], [ignore])
+
+ reprocess_count_new=$(read_counter consider_logical_flow)
+ AT_CHECK([echo $(($reprocess_count_new - $reprocess_count_old))], [0], [0
+@@ -1198,9 +1203,9 @@ reprocess_count_old=$(read_counter consider_logical_flow)
+ check ovn-nbctl remove address_set as1 addresses 10.0.0.21,10.0.0.22 -- \
+ add address_set as1 addresses 10.0.0.10
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10\.0\.0\.21], [1], [ignore])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10\.0\.0\.22], [1], [ignore])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep -c 10\.0\.0\.10], [0], [1
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10\.0\.0\.21], [1], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10\.0\.0\.22], [1], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep -c 10\.0\.0\.10], [0], [1
+ ])
+
+ reprocess_count_new=$(read_counter consider_logical_flow)
+@@ -1213,9 +1218,9 @@ reprocess_count_old=$(read_counter consider_logical_flow)
+ check ovn-nbctl add address_set as1 addresses 10.0.0.21 -- \
+ remove address_set as1 addresses 10.0.0.10
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep -c 10\.0\.0\.21], [0], [1
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep -c 10\.0\.0\.21], [0], [1
+ ])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10\.0\.0\.10], [1], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10\.0\.0\.10], [1], [ignore])
+
+ reprocess_count_new=$(read_counter consider_logical_flow)
+ AT_CHECK([echo $(($reprocess_count_new - $reprocess_count_old))], [0], [0
+@@ -1227,12 +1232,12 @@ reprocess_count_old=$(read_counter consider_logical_flow)
+ check ovn-nbctl add address_set as1 addresses 10.0.0.22,10.0.0.23 -- \
+ remove address_set as1 addresses 10.0.0.9,10.0.0.8
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep -c 10\.0\.0\.22], [0], [1
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep -c 10\.0\.0\.22], [0], [1
+ ])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep -c 10\.0\.0\.23], [0], [1
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep -c 10\.0\.0\.23], [0], [1
+ ])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10\.0\.0\.8], [1], [ignore])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10\.0\.0\.9], [1], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10\.0\.0\.8], [1], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10\.0\.0\.9], [1], [ignore])
+
+ reprocess_count_new=$(read_counter consider_logical_flow)
+ AT_CHECK([echo $(($reprocess_count_new - $reprocess_count_old))], [0], [0
+@@ -1282,18 +1287,18 @@ for i in $(seq 10); do
+ add address_set as2 addresses 10.0.0.$j
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 1; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | sort], [0], [dnl
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.1,nw_dst=10.0.0.6 actions=drop
+ ])
+ else
+ # (1 conj_id + nw_src * i + nw_dst * i) = 1 + i*2 flows
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$(($i*2 + 1))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$(($i*2 + 1))
+ ])
+ fi
+
+ if test "$i" = 3; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | \
+ sed -r 's/conjunction.*,/conjunction,/' | \
+ sed -r 's/conj_id=.*,/conj_id=,/' | sort], [0], [dnl
+@@ -1321,15 +1326,15 @@ for i in $(seq 10); do
+ remove address_set as2 addresses 10.0.0.$j
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 10; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep "priority=1100"], [1], [ignore])
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep "priority=1100"], [1], [ignore])
+ elif test "$i" = 9; then
+ # no conjunction left
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | sort], [0], [dnl
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.10,nw_dst=10.0.0.15 actions=drop
+ ])
+ else
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$((21 - $i*2))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$((21 - $i*2))
+ ])
+ fi
+ done
+@@ -1350,14 +1355,14 @@ for i in $(seq 2 10); do
+ check ovn-nbctl add address_set as1 addresses 10.0.0.$i
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 3; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | sort], [0], [dnl
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.1,nw_dst=10.0.0.6 actions=drop
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.2,nw_dst=10.0.0.6 actions=drop
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.3,nw_dst=10.0.0.6 actions=drop
+ ])
+ fi
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$i
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$i
+ ])
+ done
+
+@@ -1376,16 +1381,16 @@ for i in $(seq 10); do
+ check ovn-nbctl remove address_set as1 addresses 10.0.0.$i
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 9; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}'], [0], [dnl
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.10,nw_dst=10.0.0.6 actions=drop
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.10,nw_dst=10.0.0.7 actions=drop
+ ])
+ elif test "$i" = 10; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep "priority=1100"], [1], [ignore])
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep "priority=1100"], [1], [ignore])
+ else
+ # 2 dst + (10 - i) src + 1 conj_id
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$((10 - $i + 3))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$((10 - $i + 3))
+ ])
+ fi
+ done
+@@ -1439,18 +1444,18 @@ for i in $(seq 10); do
+ add address_set as2 addresses 10.0.0.$j
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 1; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | sort], [0], [dnl
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_dst=10.0.0.6 actions=drop
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.1 actions=drop
+ ])
+ else
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$(($i*2))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$(($i*2))
+ ])
+ fi
+
+ if test "$i" = 3; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | \
+ sed -r 's/conjunction.*,/conjunction,/' | \
+ sed -r 's/conj_id=.*,/conj_id=,/' | sort], [0], [dnl
+@@ -1477,9 +1482,9 @@ for i in $(seq 10); do
+ remove address_set as2 addresses 10.0.0.$j
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 10; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep "priority=1100"], [1], [ignore])
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep "priority=1100"], [1], [ignore])
+ else
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$((20 - $i*2))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$((20 - $i*2))
+ ])
+ fi
+ done
+@@ -1535,21 +1540,21 @@ for i in $(seq 10); do
+ add address_set as2 addresses 10.0.0.$j
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 1; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | sort], [0], [dnl
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.1 actions=drop
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.6 actions=drop
+ ])
+ elif test "$i" -lt 6; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$(($i*2))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$(($i*2))
+ ])
+ else
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$((5 + $i))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$((5 + $i))
+ ])
+ fi
+
+ if test "$i" = 3; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | \
+ sed -r 's/conjunction.*,/conjunction,/' | \
+ sed -r 's/conj_id=.*,/conj_id=,/' | sort], [0], [dnl
+@@ -1576,12 +1581,12 @@ for i in $(seq 10); do
+ remove address_set as2 addresses 10.0.0.$j
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 10; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep "priority=1100"], [1], [ignore])
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep "priority=1100"], [1], [ignore])
+ elif test "$i" -lt 6; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$((15 - $i))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$((15 - $i))
+ ])
+ else
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$((10 - ($i - 5)*2))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$((10 - ($i - 5)*2))
+ ])
+ fi
+ done
+@@ -1633,18 +1638,18 @@ for i in $(seq 10); do
+ check ovn-nbctl add address_set as1 addresses 10.0.0.$i
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 1; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | sort], [0], [dnl
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.1,nw_dst=10.0.0.1 actions=drop
+ ])
+ else
+ # (1 conj_id + nw_src * i + nw_dst * i) = 1 + i*2 flows
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$(($i*2 + 1))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$(($i*2 + 1))
+ ])
+ fi
+
+ if test "$i" = 3; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | \
+ sed -r 's/conjunction.*,/conjunction,/' | \
+ sed -r 's/conj_id=.*,/conj_id=,/' | sort], [0], [dnl
+@@ -1670,15 +1675,15 @@ for i in $(seq 10); do
+ check ovn-nbctl remove address_set as1 addresses 10.0.0.$i
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 10; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep "priority=1100"], [1], [ignore])
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep "priority=1100"], [1], [ignore])
+ elif test "$i" = 9; then
+ # no conjunction left
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | sort], [0], [dnl
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.0.10,nw_dst=10.0.0.10 actions=drop
+ ])
+ else
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$((21 - $i*2))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$((21 - $i*2))
+ ])
+ fi
+ done
+@@ -1694,7 +1699,7 @@ for i in $(seq 10); do
+ check ovn-nbctl add address_set as1 addresses 10.0.0.$i,10.0.1.$i
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 3; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | \
+ sed -r 's/conjunction.*,/conjunction,/' | \
+ sed -r 's/conj_id=.*,/conj_id=,/' | sort], [0], [dnl
+@@ -1713,7 +1718,7 @@ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.1.2 actions=co
+ priority=1100,ip,reg15=0x$port_key,metadata=0x$dp_key,nw_src=10.0.1.3 actions=conjunction,2/2)
+ ])
+ fi
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$(($i * 4 + 1))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$(($i * 4 + 1))
+ ])
+ done
+
+@@ -1734,7 +1739,7 @@ check ovn-nbctl --wait=hv sync
+ reprocess_count_old=$(read_counter consider_logical_flow)
+ check ovn-nbctl add address_set as1 addresses 10.0.0.4,10.0.0.5
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | \
+ sed -r 's/conjunction.*,/conjunction,/' | \
+ sed -r 's/conj_id=.*,/conj_id=,/' | sort], [0], [dnl
+@@ -1758,7 +1763,7 @@ AT_CHECK([echo $(($reprocess_count_new - $reprocess_count_old))], [0], [1
+ # Delete 2 IPs
+ reprocess_count_old=$(read_counter consider_logical_flow)
+ check ovn-nbctl --wait=hv remove address_set as1 addresses 10.0.0.4,10.0.0.5
+-AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | \
+ sed -r 's/conjunction.*,/conjunction,/' | \
+ sed -r 's/conj_id=.*,/conj_id=,/' | sort], [0], [dnl
+@@ -1816,7 +1821,7 @@ check ovn-nbctl acl-add ls1 to-lport 100 'outport == "ls1-lp1" && ip4.src == $as
+ check ovn-nbctl acl-add ls1 to-lport 100 'outport == "ls1-lp1" && ip4.src == $as2 && tcp && tcp.dst == {201, 202}' drop
+
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | \
+ sed -r 's/conjunction.[[0-9]]*,/conjunction,/g' | \
+ sed -r 's/conj_id=.*,/conj_id=,/' | sort], [0], [dnl
+@@ -1841,7 +1846,7 @@ reprocess_count_old=$(read_counter consider_logical_flow)
+ check ovn-nbctl add address_set as1 addresses 10.0.0.14,10.0.0.33 -- \
+ add address_set as2 addresses 10.0.0.24,10.0.0.33
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | \
+ sed -r 's/conjunction.[[0-9]]*,/conjunction,/g' | \
+ sed -r 's/conj_id=.*,/conj_id=,/' | sort], [0], [dnl
+@@ -1872,7 +1877,7 @@ reprocess_count_old=$(read_counter consider_logical_flow)
+ check ovn-nbctl remove address_set as1 addresses 10.0.0.14,10.0.0.33 -- \
+ remove address_set as2 addresses 10.0.0.24,10.0.0.33
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | \
+ sed -r 's/conjunction.[[0-9]]*,/conjunction,/g' | \
+ sed -r 's/conj_id=.*,/conj_id=,/' | sort], [0], [dnl
+@@ -1937,14 +1942,14 @@ for i in $(seq 5); do
+ check ovn-nbctl add address_set as1 addresses "aa\:aa\:aa\:aa\:aa\:0$i"
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 3; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | sort], [0], [dnl
+ priority=1100,reg15=0x$port_key,metadata=0x$dp_key,dl_src=aa:aa:aa:aa:aa:01 actions=drop
+ priority=1100,reg15=0x$port_key,metadata=0x$dp_key,dl_src=aa:aa:aa:aa:aa:02 actions=drop
+ priority=1100,reg15=0x$port_key,metadata=0x$dp_key,dl_src=aa:aa:aa:aa:aa:03 actions=drop
+ ])
+ fi
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$i
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$i
+ ])
+ done
+
+@@ -1958,17 +1963,17 @@ reprocess_count_old=$(read_counter consider_logical_flow)
+ for i in $(seq 5); do
+ check ovn-nbctl remove address_set as1 addresses "aa\:aa\:aa\:aa\:aa\:0$i"
+ check ovn-nbctl --wait=hv sync
+- ovs-ofctl dump-flows br-int table=44 | grep "priority=1100"
++ ovs-ofctl dump-flows br-int table=46 | grep "priority=1100"
+ if test "$i" = 4; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}'], [0], [dnl
+ priority=1100,reg15=0x$port_key,metadata=0x$dp_key,dl_src=aa:aa:aa:aa:aa:05 actions=drop
+ ])
+ fi
+ if test "$i" = 5; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep "priority=1100"], [1], [ignore])
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep "priority=1100"], [1], [ignore])
+ else
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$((5 - $i))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$((5 - $i))
+ ])
+ fi
+ done
+@@ -2018,14 +2023,14 @@ for i in $(seq 5); do
+ check ovn-nbctl add address_set as1 addresses "ff\:\:0$i"
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 3; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}' | sort], [0], [dnl
+ priority=1100,ipv6,reg15=0x$port_key,metadata=0x$dp_key,ipv6_src=ff::1 actions=drop
+ priority=1100,ipv6,reg15=0x$port_key,metadata=0x$dp_key,ipv6_src=ff::2 actions=drop
+ priority=1100,ipv6,reg15=0x$port_key,metadata=0x$dp_key,ipv6_src=ff::3 actions=drop
+ ])
+ fi
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$i
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$i
+ ])
+ done
+
+@@ -2040,15 +2045,15 @@ for i in $(seq 5); do
+ check ovn-nbctl remove address_set as1 addresses "ff\:\:0$i"
+ check ovn-nbctl --wait=hv sync
+ if test "$i" = 4; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44,reg15=0x$port_key | \
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46,reg15=0x$port_key | \
+ grep -v reply | awk '{print $7, $8}'], [0], [dnl
+ priority=1100,ipv6,reg15=0x$port_key,metadata=0x$dp_key,ipv6_src=ff::5 actions=drop
+ ])
+ fi
+ if test "$i" = 5; then
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep "priority=1100"], [1], [ignore])
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep "priority=1100"], [1], [ignore])
+ else
+- AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [$((5 - $i))
++ AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [$((5 - $i))
+ ])
+ fi
+ done
@@ -2060,6 +2065,57 @@ AT_CHECK([echo $(($reprocess_count_new - $reprocess_count_old))], [0], [2
OVN_CLEANUP([hv1])
AT_CLEANUP
@@ -2643,7 +5206,7 @@ index bbe142ae3..27fc44232 100644
+ovn-nbctl create address_set name=as1 addresses=8.8.8.8
+check ovn-nbctl acl-add ls1 to-lport 100 'outport == "ls1-lp1" && ip4.src == $as1' drop
+check ovn-nbctl --wait=hv sync
-+AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100"], [0], [1
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100"], [0], [1
+])
+
+# pause ovn-northd
@@ -2659,13 +5222,13 @@ index bbe142ae3..27fc44232 100644
+# undefined. This test runs the scenario ten times to make sure different
+# orders are covered and handled properly.
+
-+flow_count=$(ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100")
++flow_count=$(ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100")
+for i in $(seq 10); do
+ # Delete and recreate the SB address set with same name and an extra IP.
+ addrs_=$(fetch_column address_set addresses name=as1)
+ addrs=${addrs_// /,}
+ AT_CHECK([ovn-sbctl destroy address_set as1 -- create address_set name=as1 addresses=$addrs,1.1.1.$i], [0], [ignore])
-+ OVS_WAIT_UNTIL([test $(as hv1 ovs-ofctl dump-flows br-int table=44 | grep -c "priority=1100") = "$(($i + 1))"])
++ OVS_WAIT_UNTIL([test $(as hv1 ovs-ofctl dump-flows br-int table=46 | grep -c "priority=1100") = "$(($i + 1))"])
+done
+
+OVN_CLEANUP([hv1])
@@ -2772,7 +5335,7 @@ index 2fffe1850..478a32f5a 100644
AT_CHECK([ovsdb-tool create ovn-nb.db $abs_top_srcdir/ovn-nb.ovsschema])
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
-index 3fa02d2b3..846f10e88 100644
+index 3fa02d2b3..93854dfdc 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -2486,6 +2486,7 @@ check ovn-nbctl --wait=sb \
@@ -2796,7 +5359,31 @@ index 3fa02d2b3..846f10e88 100644
table=8 (ls_in_acl ), priority=65535, match=(1), action=(next;)
])
-@@ -3757,18 +3761,18 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
+@@ -2871,7 +2875,6 @@ AT_CHECK([ovn-sbctl lflow-list sw0 | grep ls_in_nat_hairpin | sort | sed 's/tabl
+ AT_CHECK([ovn-sbctl lflow-list sw0 | grep ls_in_hairpin | sort | sed 's/table=../table=??/g'], [0], [dnl
+ table=??(ls_in_hairpin ), priority=0 , match=(1), action=(next;)
+ table=??(ls_in_hairpin ), priority=1 , match=((reg0[[6]] == 1 || reg0[[12]] == 1)), action=(eth.dst <-> eth.src; outport = inport; flags.loopback = 1; output;)
+- table=??(ls_in_hairpin ), priority=1000 , match=(reg0[[14]] == 1), action=(next(pipeline=ingress, table=??);)
+ ])
+
+ check ovn-nbctl -- ls-lb-del sw0 lb0
+@@ -2887,7 +2890,6 @@ AT_CHECK([ovn-sbctl lflow-list sw0 | grep ls_in_nat_hairpin | sort | sed 's/tabl
+
+ AT_CHECK([ovn-sbctl lflow-list sw0 | grep ls_in_hairpin | sort | sed 's/table=../table=??/g'], [0], [dnl
+ table=??(ls_in_hairpin ), priority=0 , match=(1), action=(next;)
+- table=??(ls_in_hairpin ), priority=1000 , match=(reg0[[14]] == 1), action=(next(pipeline=ingress, table=??);)
+ ])
+
+ check ovn-nbctl -- add load_balancer_group $lbg load_balancer $lb0
+@@ -2908,7 +2910,6 @@ AT_CHECK([ovn-sbctl lflow-list sw0 | grep ls_in_nat_hairpin | sort | sed 's/tabl
+ AT_CHECK([ovn-sbctl lflow-list sw0 | grep ls_in_hairpin | sort | sed 's/table=../table=??/g'], [0], [dnl
+ table=??(ls_in_hairpin ), priority=0 , match=(1), action=(next;)
+ table=??(ls_in_hairpin ), priority=1 , match=((reg0[[6]] == 1 || reg0[[12]] == 1)), action=(eth.dst <-> eth.src; outport = inport; flags.loopback = 1; output;)
+- table=??(ls_in_hairpin ), priority=1000 , match=(reg0[[14]] == 1), action=(next(pipeline=ingress, table=??);)
+ ])
+
+ AT_CLEANUP
+@@ -3757,18 +3758,18 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
AT_CHECK([grep "lr_in_defrag" lr0flows | sort], [0], [dnl
table=5 (lr_in_defrag ), priority=0 , match=(1), action=(next;)
@@ -2822,7 +5409,7 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -3788,18 +3792,18 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
+@@ -3788,18 +3789,18 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
AT_CHECK([grep "lr_in_defrag" lr0flows | sort], [0], [dnl
table=5 (lr_in_defrag ), priority=0 , match=(1), action=(next;)
@@ -2848,7 +5435,7 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -3813,6 +3817,7 @@ AT_CHECK([grep "lr_out_snat" lr0flows | sed 's/table=./table=?/' | sort], [0], [
+@@ -3813,6 +3814,7 @@ AT_CHECK([grep "lr_out_snat" lr0flows | sed 's/table=./table=?/' | sort], [0], [
AT_CHECK([grep "lr_out_undnat" lr0flows | sed 's/table=./table=?/' | sort], [0], [dnl
table=? (lr_out_undnat ), priority=0 , match=(1), action=(next;)
@@ -2856,7 +5443,7 @@ index 3fa02d2b3..846f10e88 100644
table=? (lr_out_undnat ), priority=50 , match=(ip), action=(flags.loopback = 1; ct_dnat;)
])
-@@ -3838,18 +3843,18 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
+@@ -3838,18 +3840,18 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
AT_CHECK([grep "lr_in_defrag" lr0flows | sort], [0], [dnl
table=5 (lr_in_defrag ), priority=0 , match=(1), action=(next;)
@@ -2882,7 +5469,7 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -3864,6 +3869,7 @@ AT_CHECK([grep "lr_out_snat" lr0flows | sed 's/table=./table=?/' | sort], [0], [
+@@ -3864,6 +3866,7 @@ AT_CHECK([grep "lr_out_snat" lr0flows | sed 's/table=./table=?/' | sort], [0], [
AT_CHECK([grep "lr_out_undnat" lr0flows | sed 's/table=./table=?/' | sort], [0], [dnl
table=? (lr_out_undnat ), priority=0 , match=(1), action=(next;)
@@ -2890,7 +5477,7 @@ index 3fa02d2b3..846f10e88 100644
table=? (lr_out_undnat ), priority=50 , match=(ip), action=(flags.loopback = 1; ct_dnat;)
])
-@@ -3902,18 +3908,18 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
+@@ -3902,18 +3905,18 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
AT_CHECK([grep "lr_in_defrag" lr0flows | sort], [0], [dnl
table=5 (lr_in_defrag ), priority=0 , match=(1), action=(next;)
@@ -2916,7 +5503,7 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -3929,6 +3935,7 @@ AT_CHECK([grep "lr_out_snat" lr0flows | sed 's/table=./table=?/' | sort], [0], [
+@@ -3929,6 +3932,7 @@ AT_CHECK([grep "lr_out_snat" lr0flows | sed 's/table=./table=?/' | sort], [0], [
AT_CHECK([grep "lr_out_undnat" lr0flows | sed 's/table=./table=?/' | sort], [0], [dnl
table=? (lr_out_undnat ), priority=0 , match=(1), action=(next;)
@@ -2924,7 +5511,7 @@ index 3fa02d2b3..846f10e88 100644
table=? (lr_out_undnat ), priority=50 , match=(ip), action=(flags.loopback = 1; ct_dnat;)
])
-@@ -3953,14 +3960,13 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
+@@ -3953,14 +3957,13 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
AT_CHECK([grep "lr_in_defrag" lr0flows | sort], [0], [dnl
table=5 (lr_in_defrag ), priority=0 , match=(1), action=(next;)
@@ -2943,7 +5530,7 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -3970,6 +3976,7 @@ AT_CHECK([grep "lr_out_snat" lr0flows | grep skip_snat_for_lb | sed 's/table=./t
+@@ -3970,6 +3973,7 @@ AT_CHECK([grep "lr_out_snat" lr0flows | grep skip_snat_for_lb | sed 's/table=./t
AT_CHECK([grep "lr_out_undnat" lr0flows | sed 's/table=./table=?/' | sort], [0], [dnl
table=? (lr_out_undnat ), priority=0 , match=(1), action=(next;)
@@ -2951,7 +5538,7 @@ index 3fa02d2b3..846f10e88 100644
table=? (lr_out_undnat ), priority=50 , match=(ip), action=(flags.loopback = 1; ct_dnat;)
])
-@@ -4111,6 +4118,7 @@ check ovn-nbctl lsp-set-options sw0-lr0 router-port=lr0-sw0
+@@ -4111,6 +4115,7 @@ check ovn-nbctl lsp-set-options sw0-lr0 router-port=lr0-sw0
check ovn-nbctl --wait=sb sync
check_stateful_flows() {
@@ -2959,7 +5546,7 @@ index 3fa02d2b3..846f10e88 100644
ovn-sbctl dump-flows sw0 > sw0flows
AT_CAPTURE_FILE([sw0flows])
-@@ -4144,12 +4152,12 @@ check_stateful_flows() {
+@@ -4144,12 +4149,12 @@ check_stateful_flows() {
table=??(ls_in_stateful ), priority=100 , match=(reg0[[1]] == 1 && reg0[[13]] == 1), action=(ct_commit { ct_mark.blocked = 0; ct_label.label = reg3; }; next;)
])
@@ -2975,7 +5562,7 @@ index 3fa02d2b3..846f10e88 100644
table=1 (ls_out_pre_lb ), priority=110 , match=(nd || nd_rs || nd_ra || mldv1 || mldv2), action=(next;)
table=1 (ls_out_pre_lb ), priority=110 , match=(reg0[[16]] == 1), action=(next;)
])
-@@ -4169,13 +4177,13 @@ check_stateful_flows() {
+@@ -4169,13 +4174,13 @@ check_stateful_flows() {
])
}
@@ -2991,7 +5578,7 @@ index 3fa02d2b3..846f10e88 100644
# Remove load balancers from sw0
check ovn-nbctl ls-lb-del sw0 lb0
-@@ -4231,6 +4239,15 @@ AT_CHECK([grep "ls_out_stateful" sw0flows | sort], [0], [dnl
+@@ -4231,6 +4236,15 @@ AT_CHECK([grep "ls_out_stateful" sw0flows | sort], [0], [dnl
table=7 (ls_out_stateful ), priority=100 , match=(reg0[[1]] == 1 && reg0[[13]] == 1), action=(ct_commit { ct_mark.blocked = 0; ct_label.label = reg3; }; next;)
])
@@ -3007,7 +5594,88 @@ index 3fa02d2b3..846f10e88 100644
AT_CLEANUP
])
-@@ -5211,25 +5228,23 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
+@@ -4871,7 +4885,7 @@ check ovn-nbctl lsp-set-options ls2-ro2 router-port=ro2-ls2
+ ovn-sbctl lflow-list ls1 > ls1_lflows
+ AT_CHECK([grep "ls_in_l2_lkup" ls1_lflows | sed 's/table=../table=??/' | sort], [0], [dnl
+ table=??(ls_in_l2_lkup ), priority=0 , match=(1), action=(outport = get_fdb(eth.dst); next;)
+- table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac), action=(handle_svc_check(inport);)
++ table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:01:01), action=(outport = "ls1-ro1"; output;)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:01:02), action=(outport = "vm1"; output;)
+ table=??(ls_in_l2_lkup ), priority=70 , match=(eth.mcast), action=(outport = "_MC_flood"; output;)
+@@ -4883,7 +4897,7 @@ AT_CHECK([grep "ls_in_l2_lkup" ls1_lflows | sed 's/table=../table=??/' | sort],
+ ovn-sbctl lflow-list ls2 > ls2_lflows
+ AT_CHECK([grep "ls_in_l2_lkup" ls2_lflows | sed 's/table=../table=??/' | sort], [0], [dnl
+ table=??(ls_in_l2_lkup ), priority=0 , match=(1), action=(outport = get_fdb(eth.dst); next;)
+- table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac), action=(handle_svc_check(inport);)
++ table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:02:01), action=(outport = "ls2-ro2"; output;)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:02:02), action=(outport = "vm2"; output;)
+ table=??(ls_in_l2_lkup ), priority=70 , match=(eth.mcast), action=(outport = "_MC_flood"; output;)
+@@ -4903,7 +4917,7 @@ check ovn-nbctl --wait=sb lr-nat-add ro2 snat 20.0.0.200 192.168.2.200/30
+ ovn-sbctl lflow-list ls1 > ls1_lflows
+ AT_CHECK([grep "ls_in_l2_lkup" ls1_lflows | sed 's/table=../table=??/' | sort], [0], [dnl
+ table=??(ls_in_l2_lkup ), priority=0 , match=(1), action=(outport = get_fdb(eth.dst); next;)
+- table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac), action=(handle_svc_check(inport);)
++ table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:01:01), action=(outport = "ls1-ro1"; output;)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:01:02), action=(outport = "vm1"; output;)
+ table=??(ls_in_l2_lkup ), priority=70 , match=(eth.mcast), action=(outport = "_MC_flood"; output;)
+@@ -4916,7 +4930,7 @@ AT_CHECK([grep "ls_in_l2_lkup" ls1_lflows | sed 's/table=../table=??/' | sort],
+ ovn-sbctl lflow-list ls2 > ls2_lflows
+ AT_CHECK([grep "ls_in_l2_lkup" ls2_lflows | sed 's/table=../table=??/' | sort], [0], [dnl
+ table=??(ls_in_l2_lkup ), priority=0 , match=(1), action=(outport = get_fdb(eth.dst); next;)
+- table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac), action=(handle_svc_check(inport);)
++ table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:02:01), action=(outport = "ls2-ro2"; output;)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:02:02), action=(outport = "vm2"; output;)
+ table=??(ls_in_l2_lkup ), priority=70 , match=(eth.mcast), action=(outport = "_MC_flood"; output;)
+@@ -4937,7 +4951,7 @@ check ovn-nbctl --wait=sb lr-nat-add ro2 snat 40.0.0.200 192.168.2.148/30
+ ovn-sbctl lflow-list ls1 > ls1_lflows
+ AT_CHECK([grep "ls_in_l2_lkup" ls1_lflows | sed 's/table=../table=??/' | sort], [0], [dnl
+ table=??(ls_in_l2_lkup ), priority=0 , match=(1), action=(outport = get_fdb(eth.dst); next;)
+- table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac), action=(handle_svc_check(inport);)
++ table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:01:01), action=(outport = "ls1-ro1"; output;)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:01:02), action=(outport = "vm1"; output;)
+ table=??(ls_in_l2_lkup ), priority=70 , match=(eth.mcast), action=(outport = "_MC_flood"; output;)
+@@ -4951,7 +4965,7 @@ AT_CHECK([grep "ls_in_l2_lkup" ls1_lflows | sed 's/table=../table=??/' | sort],
+ ovn-sbctl lflow-list ls2 > ls2_lflows
+ AT_CHECK([grep "ls_in_l2_lkup" ls2_lflows | sed 's/table=../table=??/' | sort], [0], [dnl
+ table=??(ls_in_l2_lkup ), priority=0 , match=(1), action=(outport = get_fdb(eth.dst); next;)
+- table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac), action=(handle_svc_check(inport);)
++ table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:02:01), action=(outport = "ls2-ro2"; output;)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:02:02), action=(outport = "vm2"; output;)
+ table=??(ls_in_l2_lkup ), priority=70 , match=(eth.mcast), action=(outport = "_MC_flood"; output;)
+@@ -4970,7 +4984,7 @@ ovn-nbctl --wait=sb lr-lb-add ro1 lb1
+ ovn-sbctl lflow-list ls1 > ls1_lflows
+ AT_CHECK([grep "ls_in_l2_lkup" ls1_lflows | sed 's/table=../table=??/' | sort], [0], [dnl
+ table=??(ls_in_l2_lkup ), priority=0 , match=(1), action=(outport = get_fdb(eth.dst); next;)
+- table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac), action=(handle_svc_check(inport);)
++ table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:01:01), action=(outport = "ls1-ro1"; output;)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:01:02), action=(outport = "vm1"; output;)
+ table=??(ls_in_l2_lkup ), priority=70 , match=(eth.mcast), action=(outport = "_MC_flood"; output;)
+@@ -4988,7 +5002,7 @@ ovn-nbctl --wait=sb lb-add lb1 192.168.4.100:80 10.0.0.10:80
+ ovn-sbctl lflow-list ls1 > ls1_lflows
+ AT_CHECK([grep "ls_in_l2_lkup" ls1_lflows | sed 's/table=../table=??/' | sort], [0], [dnl
+ table=??(ls_in_l2_lkup ), priority=0 , match=(1), action=(outport = get_fdb(eth.dst); next;)
+- table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac), action=(handle_svc_check(inport);)
++ table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:01:01), action=(outport = "ls1-ro1"; output;)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:01:02), action=(outport = "vm1"; output;)
+ table=??(ls_in_l2_lkup ), priority=70 , match=(eth.mcast), action=(outport = "_MC_flood"; output;)
+@@ -5012,7 +5026,7 @@ ovn-nbctl --wait=sb lrp-set-gateway-chassis ro1-ls1 chassis-1 30
+ ovn-sbctl lflow-list ls1 > ls1_lflows
+ AT_CHECK([grep "ls_in_l2_lkup" ls1_lflows | sed 's/table=../table=??/' | sort], [0], [dnl
+ table=??(ls_in_l2_lkup ), priority=0 , match=(1), action=(outport = get_fdb(eth.dst); next;)
+- table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac), action=(handle_svc_check(inport);)
++ table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:01:01), action=(outport = "ls1-ro1"; output;)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:01:02), action=(outport = "vm1"; output;)
+ table=??(ls_in_l2_lkup ), priority=70 , match=(eth.mcast), action=(outport = "_MC_flood"; output;)
+@@ -5211,25 +5225,23 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
AT_CHECK([grep "lr_in_defrag" lr0flows | sort], [0], [dnl
table=5 (lr_in_defrag ), priority=0 , match=(1), action=(next;)
@@ -3044,7 +5712,7 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -5284,25 +5299,23 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
+@@ -5284,25 +5296,23 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
AT_CHECK([grep "lr_in_defrag" lr0flows | sort], [0], [dnl
table=5 (lr_in_defrag ), priority=0 , match=(1), action=(next;)
@@ -3081,7 +5749,7 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -5314,6 +5327,7 @@ AT_CHECK([grep "lr_out_chk_dnat_local" lr0flows | sed 's/table=./table=?/' | sor
+@@ -5314,6 +5324,7 @@ AT_CHECK([grep "lr_out_chk_dnat_local" lr0flows | sed 's/table=./table=?/' | sor
AT_CHECK([grep "lr_out_undnat" lr0flows | sed 's/table=./table=?/' | sort], [0], [dnl
table=? (lr_out_undnat ), priority=0 , match=(1), action=(next;)
@@ -3089,7 +5757,7 @@ index 3fa02d2b3..846f10e88 100644
table=? (lr_out_undnat ), priority=50 , match=(ip), action=(flags.loopback = 1; ct_dnat;)
])
-@@ -5349,25 +5363,23 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
+@@ -5349,25 +5360,23 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
AT_CHECK([grep "lr_in_defrag" lr0flows | sort], [0], [dnl
table=5 (lr_in_defrag ), priority=0 , match=(1), action=(next;)
@@ -3126,7 +5794,7 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -5379,6 +5391,7 @@ AT_CHECK([grep "lr_out_chk_dnat_local" lr0flows | sed 's/table=./table=?/' | sor
+@@ -5379,6 +5388,7 @@ AT_CHECK([grep "lr_out_chk_dnat_local" lr0flows | sed 's/table=./table=?/' | sor
AT_CHECK([grep "lr_out_undnat" lr0flows | sed 's/table=./table=?/' | sort], [0], [dnl
table=? (lr_out_undnat ), priority=0 , match=(1), action=(next;)
@@ -3134,7 +5802,7 @@ index 3fa02d2b3..846f10e88 100644
table=? (lr_out_undnat ), priority=50 , match=(ip), action=(flags.loopback = 1; ct_dnat;)
])
-@@ -5416,28 +5429,25 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
+@@ -5416,28 +5426,25 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
AT_CHECK([grep "lr_in_defrag" lr0flows | sort], [0], [dnl
table=5 (lr_in_defrag ), priority=0 , match=(1), action=(next;)
@@ -3176,7 +5844,7 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -5449,6 +5459,7 @@ AT_CHECK([grep "lr_out_chk_dnat_local" lr0flows | sed 's/table=./table=?/' | sor
+@@ -5449,6 +5456,7 @@ AT_CHECK([grep "lr_out_chk_dnat_local" lr0flows | sed 's/table=./table=?/' | sor
AT_CHECK([grep "lr_out_undnat" lr0flows | sed 's/table=./table=?/' | sort], [0], [dnl
table=? (lr_out_undnat ), priority=0 , match=(1), action=(next;)
@@ -3184,7 +5852,7 @@ index 3fa02d2b3..846f10e88 100644
table=? (lr_out_undnat ), priority=50 , match=(ip), action=(flags.loopback = 1; ct_dnat;)
])
-@@ -5496,31 +5507,27 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
+@@ -5496,31 +5504,27 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
AT_CHECK([grep "lr_in_defrag" lr0flows | sort], [0], [dnl
table=5 (lr_in_defrag ), priority=0 , match=(1), action=(next;)
@@ -3231,7 +5899,7 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -5532,6 +5539,7 @@ AT_CHECK([grep "lr_out_chk_dnat_local" lr0flows | sed 's/table=./table=?/' | sor
+@@ -5532,6 +5536,7 @@ AT_CHECK([grep "lr_out_chk_dnat_local" lr0flows | sed 's/table=./table=?/' | sor
AT_CHECK([grep "lr_out_undnat" lr0flows | sed 's/table=./table=?/' | sort], [0], [dnl
table=? (lr_out_undnat ), priority=0 , match=(1), action=(next;)
@@ -3239,7 +5907,7 @@ index 3fa02d2b3..846f10e88 100644
table=? (lr_out_undnat ), priority=50 , match=(ip), action=(flags.loopback = 1; ct_dnat;)
])
-@@ -5572,18 +5580,17 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
+@@ -5572,18 +5577,17 @@ AT_CHECK([grep "lr_in_unsnat" lr0flows | sort], [0], [dnl
AT_CHECK([grep "lr_in_defrag" lr0flows | sort], [0], [dnl
table=5 (lr_in_defrag ), priority=0 , match=(1), action=(next;)
@@ -3264,7 +5932,7 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -5594,6 +5601,7 @@ AT_CHECK([grep "lr_out_chk_dnat_local" lr0flows | sed 's/table=./table=?/' | sor
+@@ -5594,6 +5598,7 @@ AT_CHECK([grep "lr_out_chk_dnat_local" lr0flows | sed 's/table=./table=?/' | sor
AT_CHECK([grep "lr_out_undnat" lr0flows | sed 's/table=./table=?/' | sort], [0], [dnl
table=? (lr_out_undnat ), priority=0 , match=(1), action=(next;)
@@ -3272,7 +5940,7 @@ index 3fa02d2b3..846f10e88 100644
table=? (lr_out_undnat ), priority=50 , match=(ip), action=(flags.loopback = 1; ct_dnat;)
])
-@@ -5634,9 +5642,11 @@ ovn-sbctl set service_monitor $sm_vip2 status=offline
+@@ -5634,9 +5639,11 @@ ovn-sbctl set service_monitor $sm_vip2 status=offline
AT_CHECK([ovn-sbctl dump-flows lr0 | grep "lr_in_dnat" | sort], [0], [dnl
table=7 (lr_in_dnat ), priority=0 , match=(1), action=(next;)
@@ -3286,7 +5954,7 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -5646,9 +5656,11 @@ check ovn-nbctl --wait=sb set load_balancer lb5 options:skip_snat=true
+@@ -5646,9 +5653,11 @@ check ovn-nbctl --wait=sb set load_balancer lb5 options:skip_snat=true
AT_CHECK([ovn-sbctl dump-flows lr0 | grep "lr_in_dnat" | sort], [0], [dnl
table=7 (lr_in_dnat ), priority=0 , match=(1), action=(next;)
@@ -3300,7 +5968,7 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -5660,9 +5672,58 @@ check ovn-nbctl --wait=sb set logical_router lr0 options:lb_force_snat_ip="route
+@@ -5660,9 +5669,58 @@ check ovn-nbctl --wait=sb set logical_router lr0 options:lb_force_snat_ip="route
AT_CHECK([ovn-sbctl dump-flows lr0 | grep "lr_in_dnat" | sort], [0], [dnl
table=7 (lr_in_dnat ), priority=0 , match=(1), action=(next;)
@@ -3361,7 +6029,7 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -6692,11 +6753,12 @@ dnl Flows to skip TTL == {0, 1} check for IGMP and MLD packets.
+@@ -6692,11 +6750,12 @@ dnl Flows to skip TTL == {0, 1} check for IGMP and MLD packets.
AT_CHECK([grep -e 'lr_in_ip_input ' lrflows | grep -e 'igmp' -e 'mld' -e 'ip.ttl == {0, 1}' | sed 's/table=../table=??/'], [0], [dnl
table=??(lr_in_ip_input ), priority=120 , match=((mldv1 || mldv2) && ip.ttl == 1), action=(next;)
table=??(lr_in_ip_input ), priority=120 , match=(igmp && ip.ttl == 1), action=(next;)
@@ -3379,7 +6047,7 @@ index 3fa02d2b3..846f10e88 100644
])
dnl Flows to "route" (statically forward) without decrementing TTL for
-@@ -6755,6 +6817,7 @@ AT_CHECK([grep -e "ls_in_acl" lsflows | sed 's/table=../table=??/' | sort], [0],
+@@ -6755,6 +6814,7 @@ AT_CHECK([grep -e "ls_in_acl" lsflows | sed 's/table=../table=??/' | sort], [0],
table=??(ls_in_acl ), priority=65532, match=(ct.inv || (ct.est && ct.rpl && ct_mark.blocked == 1)), action=(drop;)
table=??(ls_in_acl ), priority=65532, match=(nd || nd_ra || nd_rs || mldv1 || mldv2), action=(next;)
table=??(ls_in_acl_after_lb ), priority=0 , match=(1), action=(next;)
@@ -3387,7 +6055,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_in_acl_after_lb ), priority=65532, match=(reg0[[17]] == 1), action=(next;)
table=??(ls_in_acl_hint ), priority=0 , match=(1), action=(next;)
table=??(ls_in_acl_hint ), priority=1 , match=(ct.est && ct_mark.blocked == 0), action=(reg0[[10]] = 1; next;)
-@@ -6809,6 +6872,7 @@ AT_CHECK([grep -e "ls_in_acl" lsflows | sed 's/table=../table=??/' | sort], [0],
+@@ -6809,6 +6869,7 @@ AT_CHECK([grep -e "ls_in_acl" lsflows | sed 's/table=../table=??/' | sort], [0],
table=??(ls_in_acl_after_lb ), priority=2003 , match=(reg0[[8]] == 1 && (ip4 && icmp)), action=(next;)
table=??(ls_in_acl_after_lb ), priority=2004 , match=(reg0[[10]] == 1 && (ip4 && ip4.dst == 10.0.0.2)), action=(ct_commit { ct_mark.blocked = 1; }; /* drop */)
table=??(ls_in_acl_after_lb ), priority=2004 , match=(reg0[[9]] == 1 && (ip4 && ip4.dst == 10.0.0.2)), action=(/* drop */)
@@ -3395,7 +6063,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_in_acl_after_lb ), priority=65532, match=(reg0[[17]] == 1), action=(next;)
table=??(ls_in_acl_hint ), priority=0 , match=(1), action=(next;)
table=??(ls_in_acl_hint ), priority=1 , match=(ct.est && ct_mark.blocked == 0), action=(reg0[[10]] = 1; next;)
-@@ -6863,6 +6927,7 @@ AT_CHECK([grep -e "ls_in_acl" lsflows | sed 's/table=../table=??/' | sort], [0],
+@@ -6863,6 +6924,7 @@ AT_CHECK([grep -e "ls_in_acl" lsflows | sed 's/table=../table=??/' | sort], [0],
table=??(ls_in_acl_after_lb ), priority=2001 , match=(reg0[[9]] == 1 && (ip4)), action=(/* drop */)
table=??(ls_in_acl_after_lb ), priority=2004 , match=(reg0[[10]] == 1 && (ip4 && ip4.dst == 10.0.0.2)), action=(ct_commit { ct_mark.blocked = 1; }; /* drop */)
table=??(ls_in_acl_after_lb ), priority=2004 , match=(reg0[[9]] == 1 && (ip4 && ip4.dst == 10.0.0.2)), action=(/* drop */)
@@ -3403,7 +6071,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_in_acl_after_lb ), priority=65532, match=(reg0[[17]] == 1), action=(next;)
table=??(ls_in_acl_hint ), priority=0 , match=(1), action=(next;)
table=??(ls_in_acl_hint ), priority=1 , match=(ct.est && ct_mark.blocked == 0), action=(reg0[[10]] = 1; next;)
-@@ -7154,11 +7219,14 @@ flow="inport == \"lsp1\" && eth.src == 00:00:00:00:00:01 && eth.dst == 00:00:00:
+@@ -7154,11 +7216,14 @@ flow="inport == \"lsp1\" && eth.src == 00:00:00:00:00:01 && eth.dst == 00:00:00:
AS_BOX([No ACL, default_acl_drop not set])
check ovn-nbctl --wait=sb sync
AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/' | sort], [0], [dnl
@@ -3418,7 +6086,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_out_acl ), priority=65535, match=(1), action=(next;)
table=??(ls_out_acl_hint ), priority=65535, match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=0 , match=(1), action=(next;)
-@@ -7173,11 +7241,14 @@ output("lsp2");
+@@ -7173,11 +7238,14 @@ output("lsp2");
AS_BOX([No ACL, default_acl_drop false])
check ovn-nbctl --wait=sb set NB_Global . options:default_acl_drop=false
AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/' | sort], [0], [dnl
@@ -3433,7 +6101,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_out_acl ), priority=65535, match=(1), action=(next;)
table=??(ls_out_acl_hint ), priority=65535, match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=0 , match=(1), action=(next;)
-@@ -7192,11 +7263,14 @@ output("lsp2");
+@@ -7192,11 +7260,14 @@ output("lsp2");
AS_BOX([No ACL, default_acl_drop true])
check ovn-nbctl --wait=sb set NB_Global . options:default_acl_drop=true
AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/' | sort], [0], [dnl
@@ -3448,7 +6116,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_out_acl ), priority=65535, match=(1), action=(next;)
table=??(ls_out_acl_hint ), priority=65535, match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=0 , match=(1), action=(next;)
-@@ -7218,12 +7292,15 @@ AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/
+@@ -7218,12 +7289,15 @@ AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/
table=??(ls_in_acl ), priority=0 , match=(1), action=(next;)
table=??(ls_in_acl ), priority=1001 , match=(ip4 && tcp), action=(next;)
table=??(ls_in_acl ), priority=34000, match=(eth.dst == $svc_monitor_mac), action=(next;)
@@ -3464,7 +6132,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_out_acl_hint ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=110 , match=(eth.src == $svc_monitor_mac), action=(next;)
-@@ -7240,12 +7317,15 @@ AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/
+@@ -7240,12 +7314,15 @@ AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/
table=??(ls_in_acl ), priority=0 , match=(1), action=(next;)
table=??(ls_in_acl ), priority=1001 , match=(ip4 && tcp), action=(next;)
table=??(ls_in_acl ), priority=34000, match=(eth.dst == $svc_monitor_mac), action=(next;)
@@ -3480,7 +6148,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_out_acl_hint ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=110 , match=(eth.src == $svc_monitor_mac), action=(next;)
-@@ -7262,12 +7342,15 @@ AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/
+@@ -7262,12 +7339,15 @@ AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/
table=??(ls_in_acl ), priority=0 , match=(1), action=(drop;)
table=??(ls_in_acl ), priority=1001 , match=(ip4 && tcp), action=(next;)
table=??(ls_in_acl ), priority=34000, match=(eth.dst == $svc_monitor_mac), action=(next;)
@@ -3496,7 +6164,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_out_acl_hint ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=110 , match=(eth.src == $svc_monitor_mac), action=(next;)
-@@ -7292,6 +7375,7 @@ AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/
+@@ -7292,6 +7372,7 @@ AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/
table=??(ls_in_acl ), priority=65532, match=(ct.inv || (ct.est && ct.rpl && ct_mark.blocked == 1)), action=(drop;)
table=??(ls_in_acl ), priority=65532, match=(nd || nd_ra || nd_rs || mldv1 || mldv2), action=(next;)
table=??(ls_in_acl_after_lb ), priority=0 , match=(1), action=(drop;)
@@ -3504,7 +6172,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_in_acl_after_lb ), priority=65532, match=(reg0[[17]] == 1), action=(next;)
table=??(ls_in_acl_hint ), priority=0 , match=(1), action=(next;)
table=??(ls_in_acl_hint ), priority=1 , match=(ct.est && ct_mark.blocked == 0), action=(reg0[[10]] = 1; next;)
-@@ -7343,13 +7427,16 @@ check ovn-nbctl --wait=sb remove NB_Global . options default_acl_drop
+@@ -7343,13 +7424,16 @@ check ovn-nbctl --wait=sb remove NB_Global . options default_acl_drop
AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/' | sort], [0], [dnl
table=??(ls_in_acl ), priority=0 , match=(1), action=(next;)
table=??(ls_in_acl ), priority=34000, match=(eth.dst == $svc_monitor_mac), action=(next;)
@@ -3521,7 +6189,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_out_acl_hint ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=110 , match=(eth.src == $svc_monitor_mac), action=(next;)
-@@ -7365,13 +7452,16 @@ check ovn-nbctl --wait=sb set NB_Global . options:default_acl_drop=false
+@@ -7365,13 +7449,16 @@ check ovn-nbctl --wait=sb set NB_Global . options:default_acl_drop=false
AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/' | sort], [0], [dnl
table=??(ls_in_acl ), priority=0 , match=(1), action=(next;)
table=??(ls_in_acl ), priority=34000, match=(eth.dst == $svc_monitor_mac), action=(next;)
@@ -3538,7 +6206,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_out_acl_hint ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=110 , match=(eth.src == $svc_monitor_mac), action=(next;)
-@@ -7387,13 +7477,16 @@ check ovn-nbctl --wait=sb set NB_Global . options:default_acl_drop=true
+@@ -7387,13 +7474,16 @@ check ovn-nbctl --wait=sb set NB_Global . options:default_acl_drop=true
AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/' | sort], [0], [dnl
table=??(ls_in_acl ), priority=0 , match=(1), action=(drop;)
table=??(ls_in_acl ), priority=34000, match=(eth.dst == $svc_monitor_mac), action=(next;)
@@ -3555,7 +6223,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_out_acl_hint ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=110 , match=(eth.src == $svc_monitor_mac), action=(next;)
-@@ -7418,6 +7511,7 @@ AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/
+@@ -7418,6 +7508,7 @@ AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/
table=??(ls_in_acl_after_lb ), priority=0 , match=(1), action=(drop;)
table=??(ls_in_acl_after_lb ), priority=1001 , match=(reg0[[7]] == 1 && (ip4 && tcp)), action=(reg0[[1]] = 1; next;)
table=??(ls_in_acl_after_lb ), priority=1001 , match=(reg0[[8]] == 1 && (ip4 && tcp)), action=(next;)
@@ -3563,7 +6231,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_in_acl_after_lb ), priority=65532, match=(reg0[[17]] == 1), action=(next;)
table=??(ls_in_acl_hint ), priority=0 , match=(1), action=(next;)
table=??(ls_in_acl_hint ), priority=1 , match=(ct.est && ct_mark.blocked == 0), action=(reg0[[10]] = 1; next;)
-@@ -7469,13 +7563,16 @@ check ovn-nbctl --wait=sb remove NB_Global . options default_acl_drop
+@@ -7469,13 +7560,16 @@ check ovn-nbctl --wait=sb remove NB_Global . options default_acl_drop
AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/' | sort], [0], [dnl
table=??(ls_in_acl ), priority=0 , match=(1), action=(next;)
table=??(ls_in_acl ), priority=34000, match=(eth.dst == $svc_monitor_mac), action=(next;)
@@ -3580,7 +6248,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_out_acl_hint ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=110 , match=(eth.src == $svc_monitor_mac), action=(next;)
-@@ -7491,13 +7588,16 @@ check ovn-nbctl --wait=sb set NB_Global . options:default_acl_drop=false
+@@ -7491,13 +7585,16 @@ check ovn-nbctl --wait=sb set NB_Global . options:default_acl_drop=false
AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/' | sort], [0], [dnl
table=??(ls_in_acl ), priority=0 , match=(1), action=(next;)
table=??(ls_in_acl ), priority=34000, match=(eth.dst == $svc_monitor_mac), action=(next;)
@@ -3597,7 +6265,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_out_acl_hint ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=110 , match=(eth.src == $svc_monitor_mac), action=(next;)
-@@ -7513,13 +7613,16 @@ check ovn-nbctl --wait=sb set NB_Global . options:default_acl_drop=true
+@@ -7513,13 +7610,16 @@ check ovn-nbctl --wait=sb set NB_Global . options:default_acl_drop=true
AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/' | sort], [0], [dnl
table=??(ls_in_acl ), priority=0 , match=(1), action=(drop;)
table=??(ls_in_acl ), priority=34000, match=(eth.dst == $svc_monitor_mac), action=(next;)
@@ -3614,7 +6282,7 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_out_acl_hint ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=0 , match=(1), action=(next;)
table=??(ls_out_pre_acl ), priority=110 , match=(eth.src == $svc_monitor_mac), action=(next;)
-@@ -7542,6 +7645,7 @@ AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/
+@@ -7542,6 +7642,7 @@ AT_CHECK([ovn-sbctl dump-flows | grep -E "ls_.*_acl" | sed 's/table=../table=??/
table=??(ls_in_acl ), priority=65532, match=(ct.inv || (ct.est && ct.rpl && ct_mark.blocked == 1)), action=(drop;)
table=??(ls_in_acl ), priority=65532, match=(nd || nd_ra || nd_rs || mldv1 || mldv2), action=(next;)
table=??(ls_in_acl_after_lb ), priority=0 , match=(1), action=(drop;)
@@ -3622,7 +6290,61 @@ index 3fa02d2b3..846f10e88 100644
table=??(ls_in_acl_after_lb ), priority=65532, match=(reg0[[17]] == 1), action=(next;)
table=??(ls_in_acl_hint ), priority=0 , match=(1), action=(next;)
table=??(ls_in_acl_hint ), priority=1 , match=(ct.est && ct_mark.blocked == 0), action=(reg0[[10]] = 1; next;)
-@@ -7886,8 +7990,10 @@ check ovn-nbctl \
+@@ -7719,7 +7820,7 @@ sort | sed 's/table=../table=??/' ], [0], [dnl
+ table=??(ls_in_apply_port_sec), priority=0 , match=(1), action=(next;)
+ table=??(ls_in_apply_port_sec), priority=50 , match=(reg0[[15]] == 1), action=(drop;)
+ table=??(ls_in_l2_lkup ), priority=0 , match=(1), action=(outport = get_fdb(eth.dst); next;)
+- table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac), action=(handle_svc_check(inport);)
++ table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
+ table=??(ls_in_l2_lkup ), priority=70 , match=(eth.mcast), action=(outport = "_MC_flood"; output;)
+ table=??(ls_in_l2_unknown ), priority=0 , match=(1), action=(output;)
+ table=??(ls_in_l2_unknown ), priority=50 , match=(outport == "none"), action=(drop;)
+@@ -7744,7 +7845,7 @@ sort | sed 's/table=../table=??/' ], [0], [dnl
+ table=??(ls_in_apply_port_sec), priority=0 , match=(1), action=(next;)
+ table=??(ls_in_apply_port_sec), priority=50 , match=(reg0[[15]] == 1), action=(drop;)
+ table=??(ls_in_l2_lkup ), priority=0 , match=(1), action=(outport = get_fdb(eth.dst); next;)
+- table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac), action=(handle_svc_check(inport);)
++ table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:00:01), action=(outport = "sw0p1"; output;)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:00:02), action=(outport = "sw0p2"; output;)
+ table=??(ls_in_l2_lkup ), priority=70 , match=(eth.mcast), action=(outport = "_MC_flood"; output;)
+@@ -7770,7 +7871,7 @@ sort | sed 's/table=../table=??/' ], [0], [dnl
+ table=??(ls_in_apply_port_sec), priority=0 , match=(1), action=(next;)
+ table=??(ls_in_apply_port_sec), priority=50 , match=(reg0[[15]] == 1), action=(drop;)
+ table=??(ls_in_l2_lkup ), priority=0 , match=(1), action=(outport = get_fdb(eth.dst); next;)
+- table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac), action=(handle_svc_check(inport);)
++ table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:00:01), action=(outport = "sw0p1"; output;)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:00:02), action=(outport = "sw0p2"; output;)
+ table=??(ls_in_l2_lkup ), priority=70 , match=(eth.mcast), action=(outport = "_MC_flood"; output;)
+@@ -7797,7 +7898,7 @@ sort | sed 's/table=../table=??/' ], [0], [dnl
+ table=??(ls_in_apply_port_sec), priority=0 , match=(1), action=(next;)
+ table=??(ls_in_apply_port_sec), priority=50 , match=(reg0[[15]] == 1), action=(drop;)
+ table=??(ls_in_l2_lkup ), priority=0 , match=(1), action=(outport = get_fdb(eth.dst); next;)
+- table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac), action=(handle_svc_check(inport);)
++ table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:00:01), action=(drop;)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:00:02), action=(outport = "sw0p2"; output;)
+ table=??(ls_in_l2_lkup ), priority=70 , match=(eth.mcast), action=(outport = "_MC_flood"; output;)
+@@ -7824,7 +7925,7 @@ sort | sed 's/table=../table=??/' ], [0], [dnl
+ table=??(ls_in_apply_port_sec), priority=0 , match=(1), action=(next;)
+ table=??(ls_in_apply_port_sec), priority=50 , match=(reg0[[15]] == 1), action=(drop;)
+ table=??(ls_in_l2_lkup ), priority=0 , match=(1), action=(outport = get_fdb(eth.dst); next;)
+- table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac), action=(handle_svc_check(inport);)
++ table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:00:01), action=(drop;)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:00:02), action=(outport = "sw0p2"; output;)
+ table=??(ls_in_l2_lkup ), priority=70 , match=(eth.mcast), action=(outport = "_MC_flood"; output;)
+@@ -7854,7 +7955,7 @@ sort | sed 's/table=../table=??/' ], [0], [dnl
+ table=??(ls_in_apply_port_sec), priority=0 , match=(1), action=(next;)
+ table=??(ls_in_apply_port_sec), priority=50 , match=(reg0[[15]] == 1), action=(drop;)
+ table=??(ls_in_l2_lkup ), priority=0 , match=(1), action=(outport = get_fdb(eth.dst); next;)
+- table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac), action=(handle_svc_check(inport);)
++ table=??(ls_in_l2_lkup ), priority=110 , match=(eth.dst == $svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:00:01), action=(outport = "sw0p1"; output;)
+ table=??(ls_in_l2_lkup ), priority=50 , match=(eth.dst == 00:00:00:00:00:02), action=(outport = "sw0p2"; output;)
+ table=??(ls_in_l2_lkup ), priority=70 , match=(eth.mcast), action=(outport = "_MC_flood"; output;)
+@@ -7886,8 +7987,10 @@ check ovn-nbctl \
AS_BOX([No chassis registered - use ct_lb_mark and ct_mark.natted])
check ovn-nbctl --wait=sb sync
AT_CHECK([ovn-sbctl lflow-list | grep -e natted -e ct_lb], [0], [dnl
@@ -3635,7 +6357,7 @@ index 3fa02d2b3..846f10e88 100644
table=6 (ls_in_pre_stateful ), priority=120 , match=(reg0[[2]] == 1 && ip4.dst == 66.66.66.66), action=(reg1 = 66.66.66.66; ct_lb_mark;)
table=6 (ls_in_pre_stateful ), priority=110 , match=(reg0[[2]] == 1), action=(ct_lb_mark;)
table=12(ls_in_lb ), priority=110 , match=(ct.new && ip4.dst == 66.66.66.66), action=(reg0[[1]] = 0; ct_lb_mark(backends=42.42.42.2);)
-@@ -7898,8 +8004,10 @@ AS_BOX([Chassis registered that doesn't support ct_lb_mark - use ct_lb and ct_la
+@@ -7898,8 +8001,10 @@ AS_BOX([Chassis registered that doesn't support ct_lb_mark - use ct_lb and ct_la
check ovn-sbctl chassis-add hv geneve 127.0.0.1
check ovn-nbctl --wait=sb sync
AT_CHECK([ovn-sbctl lflow-list | grep -e natted -e ct_lb], [0], [dnl
@@ -3648,7 +6370,7 @@ index 3fa02d2b3..846f10e88 100644
table=6 (ls_in_pre_stateful ), priority=120 , match=(reg0[[2]] == 1 && ip4.dst == 66.66.66.66), action=(reg1 = 66.66.66.66; ct_lb;)
table=6 (ls_in_pre_stateful ), priority=110 , match=(reg0[[2]] == 1), action=(ct_lb;)
table=12(ls_in_lb ), priority=110 , match=(ct.new && ip4.dst == 66.66.66.66), action=(reg0[[1]] = 0; ct_lb(backends=42.42.42.2);)
-@@ -7910,8 +8018,10 @@ AS_BOX([Chassis upgrades and supports ct_lb_mark - use ct_lb_mark and ct_mark.na
+@@ -7910,8 +8015,10 @@ AS_BOX([Chassis upgrades and supports ct_lb_mark - use ct_lb_mark and ct_mark.na
check ovn-sbctl set chassis hv other_config:ct-no-masked-label=true
check ovn-nbctl --wait=sb sync
AT_CHECK([ovn-sbctl lflow-list | grep -e natted -e ct_lb], [0], [dnl
@@ -3661,7 +6383,7 @@ index 3fa02d2b3..846f10e88 100644
table=6 (ls_in_pre_stateful ), priority=120 , match=(reg0[[2]] == 1 && ip4.dst == 66.66.66.66), action=(reg1 = 66.66.66.66; ct_lb_mark;)
table=6 (ls_in_pre_stateful ), priority=110 , match=(reg0[[2]] == 1), action=(ct_lb_mark;)
table=12(ls_in_lb ), priority=110 , match=(ct.new && ip4.dst == 66.66.66.66), action=(reg0[[1]] = 0; ct_lb_mark(backends=42.42.42.2);)
-@@ -8244,15 +8354,17 @@ AT_CAPTURE_FILE([R1flows])
+@@ -8244,15 +8351,17 @@ AT_CAPTURE_FILE([R1flows])
AT_CHECK([grep "lr_in_lb_aff_check" R1flows | sort], [0], [dnl
table=6 (lr_in_lb_aff_check ), priority=0 , match=(1), action=(next;)
@@ -3682,7 +6404,7 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -8270,11 +8382,13 @@ AT_CAPTURE_FILE([R1flows_skip_snat])
+@@ -8270,11 +8379,13 @@ AT_CAPTURE_FILE([R1flows_skip_snat])
AT_CHECK([grep "lr_in_dnat " R1flows_skip_snat | sort], [0], [dnl
table=7 (lr_in_dnat ), priority=0 , match=(1), action=(next;)
@@ -3698,7 +6420,7 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -8289,11 +8403,13 @@ AT_CAPTURE_FILE([R1flows_force_snat])
+@@ -8289,11 +8400,13 @@ AT_CAPTURE_FILE([R1flows_force_snat])
AT_CHECK([grep "lr_in_dnat " R1flows_force_snat | sort], [0], [dnl
table=7 (lr_in_dnat ), priority=0 , match=(1), action=(next;)
@@ -3714,7 +6436,31 @@ index 3fa02d2b3..846f10e88 100644
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=7 (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -8569,12 +8685,13 @@ ovn-sbctl dump-flows | DUMP_FLOWS_SORTED > lflows0
+@@ -8330,8 +8443,9 @@ rm -f northd/ovn-northd.log
+ check as northd ovn-appctl -t NORTHD_TYPE vlog/reopen
+ check as northd ovn-appctl -t NORTHD_TYPE vlog/set jsonrpc:dbg
+ check as northd ovn-appctl -t NORTHD_TYPE inc-engine/clear-stats
+-check ovn-nbctl add address_set $foo_as_uuid addresses 1.1.1.3
+-wait_column '1.1.1.1 1.1.1.2 1.1.1.3' Address_Set addresses name=foo
++check ovn-nbctl add address_set $foo_as_uuid addresses 1.1.1.3 -- \
++ add address_set $foo_as_uuid addresses 1.1.2.1/4
++wait_column '1.1.1.1 1.1.1.2 1.1.1.3 1.1.2.1/4' Address_Set addresses name=foo
+
+ # There should be no recompute of the sync_to_sb_addr_set engine node .
+ AT_CHECK([as northd ovn-appctl -t NORTHD_TYPE inc-engine/show-stats sync_to_sb_addr_set recompute], [0], [0
+@@ -8341,8 +8455,9 @@ AT_CHECK([grep transact northd/ovn-northd.log | grep Address_Set | \
+ grep -c mutate], [0], [1
+ ])
+
+-check ovn-nbctl add address_set $foo_as_uuid addresses \
+-1.1.1.4 -- remove address_set $foo_as_uuid addresses 1.1.1.1
++check ovn-nbctl add address_set $foo_as_uuid addresses 1.1.1.4 -- \
++ remove address_set $foo_as_uuid addresses 1.1.1.1 -- \
++ remove address_set $foo_as_uuid addresses 1.1.2.1/4
+ wait_column '1.1.1.2 1.1.1.3 1.1.1.4' Address_Set addresses name=foo
+
+ # There should be no recompute of the sync_to_sb_addr_set engine node .
+@@ -8569,12 +8684,13 @@ ovn-sbctl dump-flows | DUMP_FLOWS_SORTED > lflows0
AT_CHECK([grep -e "lr_in_defrag" -e "lr_in_dnat" lflows0], [0], [dnl
table=? (lr_in_defrag ), priority=0 , match=(1), action=(next;)
@@ -3732,7 +6478,7 @@ index 3fa02d2b3..846f10e88 100644
table=? (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=? (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -8588,6 +8705,7 @@ AT_CHECK([grep -e "ls_in_acl" -e "ls_out_acl" lflows0 | grep "priority=65532"],
+@@ -8588,6 +8704,7 @@ AT_CHECK([grep -e "ls_in_acl" -e "ls_out_acl" lflows0 | grep "priority=65532"],
table=? (ls_out_acl ), priority=65532, match=(ct.est && !ct.rel && !ct.new && !ct.inv && ct.rpl && ct_mark.blocked == 0), action=(next;)
table=? (ls_out_acl ), priority=65532, match=(ct.inv || (ct.est && ct.rpl && ct_mark.blocked == 1)), action=(drop;)
table=? (ls_out_acl ), priority=65532, match=(nd || nd_ra || nd_rs || mldv1 || mldv2), action=(next;)
@@ -3740,7 +6486,7 @@ index 3fa02d2b3..846f10e88 100644
table=?(ls_in_acl_after_lb ), priority=65532, match=(reg0[[17]] == 1), action=(next;)
])
-@@ -8599,10 +8717,12 @@ ovn-sbctl dump-flows | DUMP_FLOWS_SORTED > lflows1
+@@ -8599,10 +8716,12 @@ ovn-sbctl dump-flows | DUMP_FLOWS_SORTED > lflows1
AT_CHECK([grep -e "lr_in_defrag" -e "lr_in_dnat" lflows1], [0], [dnl
table=? (lr_in_defrag ), priority=0 , match=(1), action=(next;)
@@ -3756,7 +6502,7 @@ index 3fa02d2b3..846f10e88 100644
])
AT_CHECK([grep -e "ls_in_acl" -e "ls_out_acl" lflows1 | grep "priority=65532"], [0], [dnl
-@@ -8614,6 +8734,7 @@ AT_CHECK([grep -e "ls_in_acl" -e "ls_out_acl" lflows1 | grep "priority=65532"],
+@@ -8614,6 +8733,7 @@ AT_CHECK([grep -e "ls_in_acl" -e "ls_out_acl" lflows1 | grep "priority=65532"],
table=? (ls_out_acl ), priority=65532, match=(ct.est && !ct.rel && !ct.new && !ct.inv && ct.rpl && ct_label.blocked == 0), action=(next;)
table=? (ls_out_acl ), priority=65532, match=(ct.inv || (ct.est && ct.rpl && ct_label.blocked == 1)), action=(drop;)
table=? (ls_out_acl ), priority=65532, match=(nd || nd_ra || nd_rs || mldv1 || mldv2), action=(next;)
@@ -3764,7 +6510,7 @@ index 3fa02d2b3..846f10e88 100644
table=?(ls_in_acl_after_lb ), priority=65532, match=(reg0[[17]] == 1), action=(next;)
])
-@@ -8625,12 +8746,13 @@ ovn-sbctl dump-flows | DUMP_FLOWS_SORTED > lflows2
+@@ -8625,12 +8745,13 @@ ovn-sbctl dump-flows | DUMP_FLOWS_SORTED > lflows2
AT_CHECK([grep -e "lr_in_defrag" -e "lr_in_dnat" lflows2], [0], [dnl
table=? (lr_in_defrag ), priority=0 , match=(1), action=(next;)
@@ -3782,7 +6528,7 @@ index 3fa02d2b3..846f10e88 100644
table=? (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.force_snat == 1), action=(flags.force_snat_for_lb = 1; ct_commit_nat;)
table=? (lr_in_dnat ), priority=70 , match=(ct.rel && !ct.est && !ct.new && ct_mark.skip_snat == 1), action=(flags.skip_snat_for_lb = 1; ct_commit_nat;)
])
-@@ -8644,8 +8766,104 @@ AT_CHECK([grep -e "ls_in_acl" -e "ls_out_acl" lflows2 | grep "priority=65532"],
+@@ -8644,8 +8765,104 @@ AT_CHECK([grep -e "ls_in_acl" -e "ls_out_acl" lflows2 | grep "priority=65532"],
table=? (ls_out_acl ), priority=65532, match=(ct.est && !ct.rel && !ct.new && !ct.inv && ct.rpl && ct_mark.blocked == 0), action=(next;)
table=? (ls_out_acl ), priority=65532, match=(ct.inv || (ct.est && ct.rpl && ct_mark.blocked == 1)), action=(drop;)
table=? (ls_out_acl ), priority=65532, match=(nd || nd_ra || nd_rs || mldv1 || mldv2), action=(next;)
@@ -3888,10 +6634,189 @@ index 3fa02d2b3..846f10e88 100644
+AT_CLEANUP
+])
diff --git a/tests/ovn.at b/tests/ovn.at
-index 55de7c85b..3515a1e3c 100644
+index 55de7c85b..ed91d32d0 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
-@@ -5753,7 +5753,7 @@ check ovn-nbctl --wait=hv sync
+@@ -992,10 +992,10 @@ next(pipeline=ingress, table=11);
+
+ next(pipeline=egress);
+ formats as next(pipeline=egress, table=11);
+- encodes as resubmit(,51)
++ encodes as resubmit(,53)
+
+ next(pipeline=egress, table=5);
+- encodes as resubmit(,45)
++ encodes as resubmit(,47)
+
+ next(table=10);
+ formats as next(10);
+@@ -4414,24 +4414,13 @@ response=${sha}${lrpmac}08060001080006040002${lrpmac}${tpa}${sha}${spa}
+ echo $response >> 3.expected
+
+ # First ensure basic flow contents are as we expect.
+-AT_CHECK([ovn-sbctl lflow-list lsw0 | grep 'reg0[\[14\]]' | sort | sed 's/table=../table=??/g' | sed 's/is_chassis_resident([[^)]]*)/is_chassis_resident("??")/g'], [0], [dnl
++AT_CHECK([ovn-sbctl lflow-list lsw0 | grep 'reg0[\[14\]]' | sort | sed 's/table=../table=??/g'], [0], [dnl
+ table=??(ls_in_check_port_sec), priority=70 , match=(inport == "lp-vtep"), action=(reg0[[14]] = 1; next(pipeline=ingress, table=??);)
+ table=??(ls_in_hairpin ), priority=1000 , match=(reg0[[14]] == 1), action=(next(pipeline=ingress, table=??);)
+- table=??(ls_in_hairpin ), priority=2000 , match=(reg0[[14]] == 1 && (is_chassis_resident("??") || is_chassis_resident("??"))), action=(next;)
++ table=??(ls_in_hairpin ), priority=2000 , match=(reg0[[14]] == 1 && is_chassis_resident("cr-lrp1")), action=(next;)
++ table=??(ls_in_hairpin ), priority=2000 , match=(reg0[[14]] == 1 && is_chassis_resident("cr-lrp2")), action=(next;)
+ ])
+
+-# We've ensured that the expected hairpin flows are present
+-# and that the expected number of "is_chassis_resident" fields are in
+-# the flow. Now we need to ensure the contents are correct.
+-# Unfortunately, the order of the "is_chassis_resident" fields is
+-# unpredictable. Therefore we sort them so the order is predictable.
+-actual_chassis=$(ovn-sbctl lflow-list lsw0 | grep 'ls_in_hairpin' | grep 'priority=2000' | grep -o 'is_chassis_resident([[^)]]*)' | sort)
+-
+-expected_chassis='is_chassis_resident("cr-lrp1")
+-is_chassis_resident("cr-lrp2")'
+-
+-check test "$expected_chassis" = "$actual_chassis"
+-
+ # dump information with counters
+ echo "------ OVN dump ------"
+ ovn-nbctl show
+@@ -5055,6 +5044,7 @@ AT_CLEANUP
+
+ OVN_FOR_EACH_NORTHD([
+ AT_SETUP([IP relocation using GARP request])
++AT_SKIP_IF([test $HAVE_SCAPY = no])
+ ovn_start
+
+ # Logical network:
+@@ -5154,7 +5144,9 @@ done
+ test_ip() {
+ # This packet has bad checksums but logical L3 routing doesn't check.
+ local inport=$1 src_mac=$2 dst_mac=$3 src_ip=$4 dst_ip=$5
+- local packet=${dst_mac}${src_mac}08004500001c0000000040110000${src_ip}${dst_ip}0035111100080000
++ local packet=$(fmt_pkt "Ether(dst='${dst_mac}', src='${src_mac}')/ \
++ IP(dst='${dst_ip}', src='${src_ip}')/ \
++ UDP(sport=53, dport=4369)")
+ shift; shift; shift; shift; shift
+ hv=hv`vif_to_hv $inport`
+ as $hv ovs-appctl netdev-dummy/receive vif$inport $packet
+@@ -5169,7 +5161,9 @@ test_ip() {
+ # Routing decrements TTL and updates source and dest MAC
+ # (and checksum).
+ out_lrp=`vif_to_lrp $outport`
+- echo f000000000${outport}00000000ff0${out_lrp}08004500001c00000000"3f1101"00${src_ip}${dst_ip}0035111100080000
++ echo $(fmt_pkt "Ether(dst='f0:00:00:00:00:${outport}', src='00:00:00:00:ff:${out_lrp}')/ \
++ IP(src='${src_ip}', dst='${dst_ip}', ttl=63)/ \
++ UDP(sport=53, dport=4369)")
+ fi >> $outport.expected
+ done
+ }
+@@ -5185,8 +5179,10 @@ test_ip() {
+ # SHA and REPLY_HA are each 12 hex digits.
+ # SPA and TPA are each 8 hex digits.
+ test_arp() {
+- local inport=$1 sha=$2 spa=$3 tpa=$4 reply_ha=$5
+- local request=ffffffffffff${sha}08060001080006040001${sha}${spa}ffffffffffff${tpa}
++ local inport=$1 sha=$2 spa=$3 tpa=$3
++ local request=$(fmt_pkt "Ether(dst='ff:ff:ff:ff:ff:ff', src='${sha}')/ \
++ ARP(hwsrc='${sha}', hwdst='ff:ff:ff:ff:ff:ff', psrc='${spa}', pdst='${tpa}')")
++
+ hv=hv`vif_to_hv $inport`
+ as $hv ovs-appctl netdev-dummy/receive vif$inport $request
+
+@@ -5199,53 +5195,72 @@ test_arp() {
+ echo $request >> $i$j$k.expected
+ fi
+ done
++}
+
+- # Expect to receive the reply, if any.
+- if test X$reply_ha != X; then
+- lrp=`vif_to_lrp $inport`
+- local reply=${sha}00000000ff0${lrp}08060001080006040002${reply_ha}${tpa}${sha}${spa}
+- echo $reply >> $inport.expected
+- fi
++test_na() {
++ local inport=$1 sha=$2 spa=$3
++ local request=$(fmt_pkt "Ether(dst='ff:ff:ff:ff:ff:ff', src='${sha}')/ \
++ IPv6(dst='ff01::1', src='${spa}')/ \
++ ICMPv6ND_NA(tgt='${spa}')")
++
++ hv=hv`vif_to_hv $inport`
++ as $hv ovs-appctl netdev-dummy/receive vif$inport $request
++
++ # Expect to receive the broadcast ARP on the other logical switch ports if
++ # IP address is not configured to the switch patch port.
++ local i=`vif_to_ls $inport`
++ local j
++ for j in 1 2; do
++ if test $i$j != $inport; then
++ echo $request >> $i$j$k.expected
++ fi
++ done
+ }
+
+-# lp11 send GARP request to announce ownership of 192.168.1.100.
++# lp11 send GARP request to announce ownership of 192.168.1.100 and fe80::abcd:1.
+
+-sha=f00000000011
+-spa=`ip_to_hex 192 168 1 100`
+-tpa=$spa
++sha="f0:00:00:00:00:11"
++spa="192.168.1.100"
++spa6="fe80::abcd:1"
+
+ # When always_learn_from_arp_request=false, the new mac-binding will not be learned
+ # through GARP request.
+ ovn-nbctl --wait=hv set logical_router lr0 options:always_learn_from_arp_request=false
+
+-test_arp 11 $sha $spa $tpa
++test_arp 11 $sha $spa
++test_na 11 $sha $spa6
+ sleep 1
+-check_row_count MAC_Binding 0 ip="192.168.1.100"
++check_row_count MAC_Binding 0 ip="$spa"
++check_row_count MAC_Binding 0 ip=\"$spa6\"
+
+ # When always_learn_from_arp_request=true, the new mac-binding will be learned.
+ ovn-nbctl --wait=hv set logical_router lr0 options:always_learn_from_arp_request=true
+
+-test_arp 11 $sha $spa $tpa
+-OVS_WAIT_UNTIL([test `ovn-sbctl find mac_binding ip="192.168.1.100" | wc -l` -gt 0])
++test_arp 11 $sha $spa
++test_na 11 $sha $spa6
++wait_row_count MAC_Binding 1 ip="$spa" mac=\"$sha\"
++wait_row_count MAC_Binding 1 ip=\"$spa6\" mac=\"$sha\"
+ ovn-nbctl --wait=hv sync
+
+ # Send an IP packet from lp21 to 192.168.1.100, which should go to lp11.
+
+-smac=f00000000021
+-dmac=00000000ff02
+-sip=`ip_to_hex 192 168 2 11`
+-dip=`ip_to_hex 192 168 1 100`
++smac="f0:00:00:00:00:21"
++dmac="00:00:00:00:ff:02"
++sip="192.168.2.11"
++dip="192.168.1.100"
+ test_ip 21 $smac $dmac $sip $dip 11
+
+-# lp12 send GARP request to announce ownership of 192.168.1.100.
++# lp12 send GARP request to announce ownership of 192.168.1.100 and fe80::abcd:1.
+
+ # Even when always_learn_from_arp_request=false, the existing mac-binding should be
+ # updated through GARP request.
+ ovn-nbctl --wait=hv set logical_router lr0 options:always_learn_from_arp_request=false
+
+-sha=f00000000012
+-test_arp 12 $sha $spa $tpa
+-wait_row_count MAC_Binding 1 ip="192.168.1.100" mac='"f0:00:00:00:00:12"'
++sha="f0:00:00:00:00:12"
++test_arp 12 $sha $spa
++test_na 11 $sha $spa6
++wait_row_count MAC_Binding 1 ip="$spa" mac=\"$sha\"
++wait_row_count MAC_Binding 1 ip=\"$spa6\" mac=\"$sha\"
+ ovn-nbctl --wait=hv sync
+ # give to the hv the time to send queued ip packets
+ sleep 1
+@@ -5753,7 +5768,7 @@ check ovn-nbctl --wait=hv sync
packet="inport==\"ls1-lp1\" && eth.src==$ls1_lp1_mac && eth.dst==$rp_ls1_mac &&
ip4 && ip.ttl==64 && ip4.src==$ls1_lp1_ip && ip4.dst==$ls2_lp1_ip &&
udp && udp.src==53 && udp.dst==4369"
@@ -3900,7 +6825,7 @@ index 55de7c85b..3515a1e3c 100644
echo "---------NB dump-----"
-@@ -5803,7 +5803,7 @@ packet="inport==\"ls1-lp1\" && eth.src==$ls1_lp1_mac && eth.dst==$rp_ls1_mac &&
+@@ -5803,7 +5818,7 @@ packet="inport==\"ls1-lp1\" && eth.src==$ls1_lp1_mac && eth.dst==$rp_ls1_mac &&
ip4 && ip.ttl==64 && ip4.src==$ls1_lp1_ip && ip4.dst==$ls2_lp1_ip &&
udp && udp.src==53 && udp.dst==4369"
@@ -3909,7 +6834,7 @@ index 55de7c85b..3515a1e3c 100644
# The 2nd packet sent shound not be received.
OVN_CHECK_PACKETS([hv2/vif1-tx.pcap], [expected])
-@@ -7741,7 +7741,6 @@ ls3_p1_mac=00:00:00:01:02:05
+@@ -7741,7 +7756,6 @@ ls3_p1_mac=00:00:00:01:02:05
check ovn-nbctl --wait=hv lr-policy-add R1 10 "ip4.src==192.168.1.0/24 && ip4.dst==172.16.1.0/24" drop
# Check logical flow
@@ -3917,7 +6842,7 @@ index 55de7c85b..3515a1e3c 100644
AT_CHECK([ovn-sbctl dump-flows | grep lr_in_policy | grep "192.168.1.0" | wc -l], [0], [dnl
1
])
-@@ -7751,15 +7750,12 @@ packet="inport==\"ls1-lp1\" && eth.src==$ls1_p1_mac && eth.dst==$ls1_ro_mac &&
+@@ -7751,15 +7765,12 @@ packet="inport==\"ls1-lp1\" && eth.src==$ls1_p1_mac && eth.dst==$ls1_ro_mac &&
ip4 && ip.ttl==64 && ip4.src==$ls1_p1_ip && ip4.dst==$ls2_p1_ip &&
udp && udp.src==53 && udp.dst==4369"
@@ -3936,7 +6861,7 @@ index 55de7c85b..3515a1e3c 100644
# Expected to drop the packet.
$PYTHON "$ovs_srcdir/utilities/ovs-pcap.in" pbr-hv/vif2-tx.pcap > vif2.packets
-@@ -7770,7 +7766,7 @@ AT_FAIL_IF([test "$rcvd_packet" != ""])
+@@ -7770,7 +7781,7 @@ AT_FAIL_IF([test "$rcvd_packet" != ""])
check ovn-nbctl --wait=hv lr-policy-add R1 20 "ip4.src==192.168.1.0/24 && ip4.dst==172.16.1.0/24" allow
# Check logical flow
@@ -3945,7 +6870,7 @@ index 55de7c85b..3515a1e3c 100644
2
])
-@@ -7778,15 +7774,12 @@ AT_CHECK([ovn-sbctl dump-flows | grep lr_in_policy | grep "192.168.1.0" | wc -l]
+@@ -7778,15 +7789,12 @@ AT_CHECK([ovn-sbctl dump-flows | grep lr_in_policy | grep "192.168.1.0" | wc -l]
packet="inport==\"ls1-lp1\" && eth.src==$ls1_p1_mac && eth.dst==$ls1_ro_mac &&
ip4 && ip.ttl==64 && ip4.src==$ls1_p1_ip && ip4.dst==$ls2_p1_ip &&
udp && udp.src==53 && udp.dst==4369"
@@ -3965,7 +6890,7 @@ index 55de7c85b..3515a1e3c 100644
# Expected packet has TTL decreased by 1
expected="eth.src==$ls2_ro_mac && eth.dst==$ls2_p1_mac &&
-@@ -7802,7 +7795,7 @@ check ovn-nbctl --wait=hv lr-policy-add R1 30 "ip4.src==192.168.1.0/24 && ip4.ds
+@@ -7802,7 +7810,7 @@ check ovn-nbctl --wait=hv lr-policy-add R1 30 "ip4.src==192.168.1.0/24 && ip4.ds
# Check logical flow
AT_CHECK([ovn-sbctl dump-flows | grep lr_in_policy | \
grep "192.168.1.0" | \
@@ -3974,7 +6899,7 @@ index 55de7c85b..3515a1e3c 100644
1
])
-@@ -7810,21 +7803,12 @@ AT_CHECK([ovn-sbctl dump-flows | grep lr_in_policy | \
+@@ -7810,21 +7818,12 @@ AT_CHECK([ovn-sbctl dump-flows | grep lr_in_policy | \
packet="inport==\"ls1-lp1\" && eth.src==$ls1_p1_mac && eth.dst==$ls1_ro_mac &&
ip4 && ip.ttl==64 && ip4.src==$ls1_p1_ip && ip4.dst==$ls2_p1_ip &&
udp && udp.src==53 && udp.dst==4369"
@@ -4000,7 +6925,7 @@ index 55de7c85b..3515a1e3c 100644
echo "packet hit reroute policy"
# Expected packet has TTL decreased by 1
-@@ -7927,9 +7911,7 @@ ls3_p1_mac=00:00:00:01:02:05
+@@ -7927,9 +7926,7 @@ ls3_p1_mac=00:00:00:01:02:05
check ovn-nbctl --wait=sb lr-policy-add R1 10 "ip6.src==2001::/64 && ip6.dst==2002::/64" drop
# Check logical flow
@@ -4011,7 +6936,7 @@ index 55de7c85b..3515a1e3c 100644
1
])
-@@ -7938,15 +7920,12 @@ packet="inport==\"ls1-lp1\" && eth.src==$ls1_p1_mac && eth.dst==$ls1_ro_mac &&
+@@ -7938,15 +7935,12 @@ packet="inport==\"ls1-lp1\" && eth.src==$ls1_p1_mac && eth.dst==$ls1_ro_mac &&
ip6 && ip.ttl==64 && ip6.src==$ls1_p1_ip && ip6.dst==$ls2_p1_ip &&
udp && udp.src==53 && udp.dst==4369"
@@ -4030,7 +6955,7 @@ index 55de7c85b..3515a1e3c 100644
# Expected to drop the packet.
$PYTHON "$ovs_srcdir/utilities/ovs-pcap.in" pbr-hv/vif2-tx.pcap > vif2.packets
-@@ -7956,9 +7935,7 @@ AT_FAIL_IF([test -s vif2.packets])
+@@ -7956,9 +7950,7 @@ AT_FAIL_IF([test -s vif2.packets])
check ovn-nbctl --wait=sb lr-policy-add R1 20 "ip6.src==2001::/64 && ip6.dst==2002::/64" allow
# Check logical flow
@@ -4041,7 +6966,7 @@ index 55de7c85b..3515a1e3c 100644
2
])
-@@ -7966,16 +7943,12 @@ AT_CHECK([grep lr_in_policy sbflows2 | grep "2001" | wc -l], [0], [dnl
+@@ -7966,16 +7958,12 @@ AT_CHECK([grep lr_in_policy sbflows2 | grep "2001" | wc -l], [0], [dnl
packet="inport==\"ls1-lp1\" && eth.src==$ls1_p1_mac && eth.dst==$ls1_ro_mac &&
ip6 && ip.ttl==64 && ip6.src==$ls1_p1_ip && ip6.dst==$ls2_p1_ip &&
udp && udp.src==53 && udp.dst==4369"
@@ -4062,7 +6987,7 @@ index 55de7c85b..3515a1e3c 100644
# Expected packet has TTL decreased by 1
expected="eth.src==$ls2_ro_mac && eth.dst==$ls2_p1_mac &&
-@@ -7989,11 +7962,9 @@ OVN_CHECK_PACKETS([pbr-hv/vif2-tx.pcap], [expected])
+@@ -7989,11 +7977,9 @@ OVN_CHECK_PACKETS([pbr-hv/vif2-tx.pcap], [expected])
check ovn-nbctl --wait=sb lr-policy-add R1 30 "ip6.src==2001::/64 && ip6.dst==2002::/64" reroute 2003::2
# Check logical flow
@@ -4076,7 +7001,7 @@ index 55de7c85b..3515a1e3c 100644
1
])
-@@ -8001,19 +7972,12 @@ AT_CHECK([grep lr_in_policy sbflows4 | \
+@@ -8001,19 +7987,12 @@ AT_CHECK([grep lr_in_policy sbflows4 | \
packet="inport==\"ls1-lp1\" && eth.src==$ls1_p1_mac && eth.dst==$ls1_ro_mac &&
ip6 && ip.ttl==64 && ip6.src==$ls1_p1_ip && ip6.dst==$ls2_p1_ip &&
udp && udp.src==53 && udp.dst==4369"
@@ -4100,7 +7025,7 @@ index 55de7c85b..3515a1e3c 100644
# Expected packet has TTL decreased by 1
expected="eth.src==$ls3_ro_mac && eth.dst==$ls3_p1_mac &&
-@@ -9531,73 +9495,73 @@ AT_CAPTURE_FILE([sbflows])
+@@ -9531,73 +9510,73 @@ AT_CAPTURE_FILE([sbflows])
packet="inport==\"lp1\" && eth.src==$lp1_mac && eth.dst==$lp2_mac &&
ip4 && ip.ttl==64 && ip4.src==$lp1_ip && ip4.dst==$lp2_ip &&
tcp && tcp.flags==2 && tcp.src==4360 && tcp.dst==80"
@@ -4184,9 +7109,86 @@ index 55de7c85b..3515a1e3c 100644
-as hv ovs-appctl -t ovn-controller inject-pkt "$packet"
+OVS_WAIT_UNTIL([as hv ovs-appctl -t ovn-controller inject-pkt "$packet"])
- OVS_WAIT_UNTIL([ test 8 = $(grep -c 'acl_log' hv/ovn-controller.log) ])
+ OVS_WAIT_UNTIL([ test 8 = $(grep -c 'acl_log' hv/ovn-controller.log) ])
+
+@@ -10206,14 +10185,21 @@ AT_CHECK([test ! -z $foo2_zoneid])
+ bar2_zoneid=$(as hv2 ovs-vsctl get bridge br-int external_ids:ct-zone-bar2)
+ AT_CHECK([test ! -z $bar2_zoneid])
+
+-ovn-nbctl lsp-del bar2
++# When a port is removed from a logical switch, the ct-zone is flushed, then
++# the ct-zone-id is removed from external_ids. This is done in two steps(
++# ct-zone-id is removed when the transaction flushing the ct_zone is complete).
++# ovn-nbctl --wait=hv sync does not take this into account, and hence we need
++# two "wait=hv" before we are sure that the ct-zone-id is removed from
++# external_ids.
++ovn-nbctl --wait=hv lsp-del bar2
+ ovn-nbctl --wait=hv sync
+
+ bar2_zoneid=$(as hv2 ovs-vsctl get bridge br-int external_ids:ct-zone-bar2)
+ AT_CHECK([test -z $bar2_zoneid])
+
+ # Add back bar2
+-ovn-nbctl lsp-add bar bar2 vm2 1 \
++# Same comment as above: two "wait=hv" are needed.
++ovn-nbctl --wait=hv lsp-add bar bar2 vm2 1 \
+ -- lsp-set-addresses bar2 "f0:00:00:01:02:08 192.168.2.3"
+ wait_for_ports_up
+ ovn-nbctl --wait=hv sync
+@@ -11214,7 +11200,7 @@ hv1_gw1_ofport=$(as hv1 ovs-vsctl --bare --columns ofport find Interface name=ov
+ hv1_gw2_ofport=$(as hv1 ovs-vsctl --bare --columns ofport find Interface name=ovn-gw2-0)
+
+ OVS_WAIT_UNTIL([
+- test 1 = $(as hv1 ovs-ofctl dump-flows br-int table=37 | grep -c "active_backup,ofport,members:$hv1_gw1_ofport,$hv1_gw2_ofport")
++ test 1 = $(as hv1 ovs-ofctl dump-flows br-int table=39 | grep -c "active_backup,ofport,members:$hv1_gw1_ofport,$hv1_gw2_ofport")
+ ])
+
+ test_ip_packet()
+@@ -11324,7 +11310,7 @@ AT_CHECK(
+ ])
+
+ OVS_WAIT_UNTIL([
+- test 1 = $(as hv1 ovs-ofctl dump-flows br-int table=37 | grep -c "active_backup,ofport,members:$hv1_gw2_ofport,$hv1_gw1_ofport")
++ test 1 = $(as hv1 ovs-ofctl dump-flows br-int table=39 | grep -c "active_backup,ofport,members:$hv1_gw2_ofport,$hv1_gw1_ofport")
+ ])
+
+ test_ip_packet gw2 gw1 0
+@@ -11502,7 +11488,7 @@ hv1_gw1_ofport=$(as hv1 ovs-vsctl --bare --columns ofport find Interface name=ov
+ hv1_gw2_ofport=$(as hv1 ovs-vsctl --bare --columns ofport find Interface name=ovn-gw2-0)
+
+ OVS_WAIT_UNTIL([
+- test 1 = $(as hv1 ovs-ofctl dump-flows br-int table=37 | grep -c "active_backup,ofport,members:$hv1_gw1_ofport,$hv1_gw2_ofport")
++ test 1 = $(as hv1 ovs-ofctl dump-flows br-int table=39 | grep -c "active_backup,ofport,members:$hv1_gw1_ofport,$hv1_gw2_ofport")
+ ])
+
+ test_ip_packet()
+@@ -11582,7 +11568,7 @@ AT_CHECK([ovn-nbctl --wait=hv \
+ ])
+
+ OVS_WAIT_UNTIL([
+- test 1 = $(as hv1 ovs-ofctl dump-flows br-int table=37 | grep -c "active_backup,ofport,members:$hv1_gw2_ofport,$hv1_gw1_ofport")
++ test 1 = $(as hv1 ovs-ofctl dump-flows br-int table=39 | grep -c "active_backup,ofport,members:$hv1_gw2_ofport,$hv1_gw1_ofport")
+ ])
-@@ -12254,7 +12218,7 @@ nexthop_mac="f00000010204"
+ test_ip_packet gw2 gw1
+@@ -11748,12 +11734,12 @@ AT_CAPTURE_FILE([hv2flows])
+
+ AT_CHECK(
+ [# Check that redirect mapping is programmed only on hv2
+- grep table=38 hv1flows | grep =0x3,metadata=0x1 | wc -l
+- grep table=38 hv2flows | grep =0x3,metadata=0x1 | grep load:0x2- | wc -l
++ grep table=40 hv1flows | grep =0x3,metadata=0x1 | wc -l
++ grep table=40 hv2flows | grep =0x3,metadata=0x1 | grep load:0x2- | wc -l
+
+ # Check that hv1 sends chassisredirect port traffic to hv2
+- grep table=37 hv1flows | grep =0x3,metadata=0x1 | grep output | wc -l
+- grep table=37 hv2flows | grep =0x3,metadata=0x1 | wc -l
++ grep table=39 hv1flows | grep =0x3,metadata=0x1 | grep output | wc -l
++ grep table=39 hv2flows | grep =0x3,metadata=0x1 | wc -l
+
+ # Check that arp reply on distributed gateway port is only programmed on hv2
+ grep arp hv1flows | grep load:0x2- | grep =0x2,metadata=0x1 | wc -l
+@@ -12254,7 +12240,7 @@ nexthop_mac="f00000010204"
AS_BOX([Send ip packet from foo1 to 8.8.8.8])
src_mac="f00000010203"
dst_mac="000001010203"
@@ -4195,7 +7197,7 @@ index 55de7c85b..3515a1e3c 100644
AS_BOX([Wait for GARPs announcing gw IP to arrive])
OVS_WAIT_UNTIL([
-@@ -12265,15 +12229,12 @@ grep actions=mod_dl_dst:f0:00:00:01:02:04 | wc -l` -eq 1
+@@ -12265,15 +12251,12 @@ grep actions=mod_dl_dst:f0:00:00:01:02:04 | wc -l` -eq 1
AS_BOX([Verify VLAN tagged packet on bridge connecting hv1 and hv2])
# VLAN tagged packet with router port(192.168.1.1) MAC as destination MAC
# is expected on bridge connecting hv1 and hv2
@@ -4213,7 +7215,18 @@ index 55de7c85b..3515a1e3c 100644
echo $expected > hv3-vif1.expected
check as hv1 ovs-appctl dpctl/del-flows
-@@ -12304,7 +12265,7 @@ cat hv1-br-ex_n2.expected > expout
+@@ -12284,8 +12267,8 @@ as hv1 ovs-appctl netdev-dummy/receive hv1-vif1 $packet
+ as hv1 ovs-appctl ofproto/trace br-int in_port=hv1-vif1 $packet
+ sleep 2
+
+-AS_BOX([On hv1, table 37 check that no packet goes via the tunnel port])
+-OVS_WAIT_FOR_OUTPUT([as hv1 ovs-ofctl dump-flows br-int table=37 \
++AS_BOX([On hv1, table 40 check that no packet goes via the tunnel port])
++OVS_WAIT_FOR_OUTPUT([as hv1 ovs-ofctl dump-flows br-int table=39 \
+ | grep "NXM_NX_TUN_ID" | grep -v n_packets=0 | wc -l], [0], [[0
+ ]])
+
+@@ -12304,7 +12287,7 @@ cat hv1-br-ex_n2.expected > expout
AT_CHECK([sort hv1-br-ex_n2], [0], [expout])
AS_BOX([Check expected packet on nexthop interface])
@@ -4222,20 +7235,30 @@ index 55de7c85b..3515a1e3c 100644
cat hv3-vif1.expected > expout
AT_CHECK([sort hv3-vif1], [0], [expout])
-@@ -13268,30 +13229,27 @@ as hv2 ovs-ofctl dump-flows br-int table=37
+@@ -13260,38 +13243,35 @@ echo $hv2_gw1_ofport
+ echo $hv2_gw2_ofport
+
+ echo "--- hv1 ---"
+-as hv1 ovs-ofctl dump-flows br-int table=37
++as hv1 ovs-ofctl dump-flows br-int table=39
+
+ echo "--- hv2 ---"
+-as hv2 ovs-ofctl dump-flows br-int table=37
++as hv2 ovs-ofctl dump-flows br-int table=39
+
gw1_chassis=$(fetch_column Chassis _uuid name=gw1)
gw2_chassis=$(fetch_column Chassis _uuid name=gw2)
-OVS_WAIT_UNTIL([as hv1 ovs-ofctl dump-flows br-int table=37 | \
-grep active_backup | grep slaves:$hv1_gw1_ofport,$hv1_gw2_ofport \
-+OVS_WAIT_FOR_OUTPUT([as hv1 ovs-ofctl dump-flows br-int table=37 | \
++OVS_WAIT_FOR_OUTPUT([as hv1 ovs-ofctl dump-flows br-int table=39 | \
+grep active_backup | grep members:$hv1_gw1_ofport,$hv1_gw2_ofport \
| wc -l], [0], [1
])
-OVS_WAIT_UNTIL([as hv2 ovs-ofctl dump-flows br-int table=37 | \
-grep active_backup | grep slaves:$hv2_gw1_ofport,$hv2_gw2_ofport \
-+OVS_WAIT_FOR_OUTPUT([as hv2 ovs-ofctl dump-flows br-int table=37 | \
++OVS_WAIT_FOR_OUTPUT([as hv2 ovs-ofctl dump-flows br-int table=39 | \
+grep active_backup | grep members:$hv2_gw1_ofport,$hv2_gw2_ofport \
| wc -l], [0], [1
])
@@ -4265,25 +7288,25 @@ index 55de7c85b..3515a1e3c 100644
# check that the chassis redirect port has been claimed by the gw1 chassis
wait_row_count Port_Binding 1 logical_port=cr-outside chassis=$gw1_chassis
-@@ -13314,13 +13272,13 @@ wait_for_ports_up
+@@ -13314,13 +13294,13 @@ wait_for_ports_up
check ovn-nbctl --wait=hv sync
# we make sure that the hypervisors noticed, and inverted the slave ports
-OVS_WAIT_UNTIL([as hv1 ovs-ofctl dump-flows br-int table=37 | \
-grep active_backup | grep slaves:$hv1_gw2_ofport,$hv1_gw1_ofport \
-+OVS_WAIT_FOR_OUTPUT([as hv1 ovs-ofctl dump-flows br-int table=37 | \
++OVS_WAIT_FOR_OUTPUT([as hv1 ovs-ofctl dump-flows br-int table=39 | \
+grep active_backup | grep members:$hv1_gw2_ofport,$hv1_gw1_ofport \
| wc -l], [0], [1
])
-OVS_WAIT_UNTIL([as hv2 ovs-ofctl dump-flows br-int table=37 | \
-grep active_backup | grep slaves:$hv2_gw2_ofport,$hv2_gw1_ofport \
-+OVS_WAIT_FOR_OUTPUT([as hv2 ovs-ofctl dump-flows br-int table=37 | \
++OVS_WAIT_FOR_OUTPUT([as hv2 ovs-ofctl dump-flows br-int table=39 | \
+grep active_backup | grep members:$hv2_gw2_ofport,$hv2_gw1_ofport \
| wc -l], [0], [1
])
-@@ -13372,11 +13330,11 @@ AT_CHECK([ovs-vsctl --bare --columns bfd find Interface name=ovn-hv1-0],[0],
+@@ -13372,11 +13352,11 @@ AT_CHECK([ovs-vsctl --bare --columns bfd find Interface name=ovn-hv1-0],[0],
]])
# make sure that flows for handling the outside router port reside on gw2 now
@@ -4299,7 +7322,7 @@ index 55de7c85b..3515a1e3c 100644
]])
# disconnect GW2 from the network, GW1 should take over
-@@ -13386,12 +13344,12 @@ as main ovs-vsctl del-port n1 $port
+@@ -13386,12 +13366,12 @@ as main ovs-vsctl del-port n1 $port
bfd_dump
@@ -4317,14 +7340,14 @@ index 55de7c85b..3515a1e3c 100644
]])
# check that the chassis redirect port has been reclaimed by the gw1 chassis
-@@ -13470,45 +13428,16 @@ ovn-nbctl set Logical_Router_Port outside ha_chassis_group=$hagrp1_uuid
+@@ -13470,45 +13450,16 @@ ovn-nbctl set Logical_Router_Port outside ha_chassis_group=$hagrp1_uuid
wait_row_count HA_Chassis_Group 1
wait_row_count HA_Chassis 2
-OVS_WAIT_UNTIL([as hv1 ovs-ofctl dump-flows br-int table=37 | \
-grep active_backup | grep slaves:$hv1_gw1_ofport,$hv1_gw2_ofport \
-| wc -l], [0], [1
-+OVS_WAIT_FOR_OUTPUT([as hv1 ovs-ofctl dump-flows br-int table=37 | \
++OVS_WAIT_FOR_OUTPUT([as hv1 ovs-ofctl dump-flows br-int table=39 | \
+grep active_backup | grep members:$hv1_gw1_ofport,$hv1_gw2_ofport \
+| wc -l], [0], [0
])
@@ -4332,7 +7355,7 @@ index 55de7c85b..3515a1e3c 100644
-OVS_WAIT_UNTIL([as hv2 ovs-ofctl dump-flows br-int table=37 | \
-grep active_backup | grep slaves:$hv2_gw1_ofport,$hv2_gw2_ofport \
-| wc -l], [0], [1
-+OVS_WAIT_FOR_OUTPUT([as hv2 ovs-ofctl dump-flows br-int table=37 | \
++OVS_WAIT_FOR_OUTPUT([as hv2 ovs-ofctl dump-flows br-int table=39 | \
+grep active_backup | grep members:$hv2_gw1_ofport,$hv2_gw2_ofport \
+| wc -l], [0], [0
])
@@ -4369,19 +7392,19 @@ index 55de7c85b..3515a1e3c 100644
# Re add the ovs ports.
for i in 1 2; do
as hv$i
-@@ -13519,6 +13448,34 @@ for i in 1 2; do
+@@ -13519,6 +13470,34 @@ for i in 1 2; do
ofport-request=1
done
+# Re-add gw2
+as gw2 ovn_attach n1 br-phys 192.168.0.1
+
-+OVS_WAIT_FOR_OUTPUT([as hv1 ovs-ofctl dump-flows br-int table=37 | \
++OVS_WAIT_FOR_OUTPUT([as hv1 ovs-ofctl dump-flows br-int table=39 | \
+grep active_backup | grep members:$hv1_gw1_ofport,$hv1_gw2_ofport \
+| wc -l], [0], [1
+])
+
-+OVS_WAIT_FOR_OUTPUT([as hv2 ovs-ofctl dump-flows br-int table=37 | \
++OVS_WAIT_FOR_OUTPUT([as hv2 ovs-ofctl dump-flows br-int table=39 | \
+grep active_backup | grep members:$hv2_gw1_ofport,$hv2_gw2_ofport \
+| wc -l], [0], [1
+])
@@ -4404,20 +7427,20 @@ index 55de7c85b..3515a1e3c 100644
hv1_ch_uuid=$(fetch_column Chassis _uuid name=hv1)
hv2_ch_uuid=$(fetch_column Chassis _uuid name=hv2)
exp_ref_ch_list="$hv1_ch_uuid $hv2_ch_uuid"
-@@ -13527,29 +13484,18 @@ wait_column "$exp_ref_ch_list" HA_Chassis_Group ref_chassis
+@@ -13527,29 +13506,18 @@ wait_column "$exp_ref_ch_list" HA_Chassis_Group ref_chassis
# Increase the priority of gw2
ovn-nbctl --wait=sb ha-chassis-group-add-chassis hagrp1 gw2 40
-OVS_WAIT_UNTIL([as hv1 ovs-ofctl dump-flows br-int table=37 | \
-grep active_backup | grep slaves:$hv1_gw2_ofport,$hv1_gw1_ofport \
-+OVS_WAIT_FOR_OUTPUT([as hv1 ovs-ofctl dump-flows br-int table=37 | \
++OVS_WAIT_FOR_OUTPUT([as hv1 ovs-ofctl dump-flows br-int table=39 | \
+grep active_backup | grep members:$hv1_gw2_ofport,$hv1_gw1_ofport \
| wc -l], [0], [1
])
-OVS_WAIT_UNTIL([as hv2 ovs-ofctl dump-flows br-int table=37 | \
-grep active_backup | grep slaves:$hv2_gw2_ofport,$hv2_gw1_ofport \
-+OVS_WAIT_FOR_OUTPUT([as hv2 ovs-ofctl dump-flows br-int table=37 | \
++OVS_WAIT_FOR_OUTPUT([as hv2 ovs-ofctl dump-flows br-int table=39 | \
+grep active_backup | grep members:$hv2_gw2_ofport,$hv2_gw1_ofport \
| wc -l], [0], [1
])
@@ -4439,7 +7462,7 @@ index 55de7c85b..3515a1e3c 100644
# check BFD enablement on tunnel ports from gw1 #########
as gw1
-@@ -13588,11 +13534,11 @@ AT_CHECK([ovs-vsctl --bare --columns bfd find Interface name=ovn-hv1-0],[0],
+@@ -13588,11 +13556,11 @@ AT_CHECK([ovs-vsctl --bare --columns bfd find Interface name=ovn-hv1-0],[0],
]])
# make sure that flows for handling the outside router port reside on gw2 now
@@ -4455,7 +7478,7 @@ index 55de7c85b..3515a1e3c 100644
]])
# disconnect GW2 from the network, GW1 should take over
-@@ -13603,11 +13549,11 @@ as main ovs-vsctl del-port n1 $port
+@@ -13603,11 +13571,11 @@ as main ovs-vsctl del-port n1 $port
bfd_dump
# make sure that flows for handling the outside router port reside on gw2 now
@@ -4471,7 +7494,7 @@ index 55de7c85b..3515a1e3c 100644
]])
# check that the chassis redirect port has been reclaimed by the gw1 chassis
-@@ -13889,6 +13835,133 @@ OVN_CLEANUP([gw1],[gw2],[hv1])
+@@ -13889,6 +13857,133 @@ OVN_CLEANUP([gw1],[gw2],[hv1])
AT_CLEANUP
])
@@ -4605,7 +7628,390 @@ index 55de7c85b..3515a1e3c 100644
OVN_FOR_EACH_NORTHD([
AT_SETUP([IPv6 Neighbor Solicitation for unknown MAC])
AT_KEYWORDS([ovn-nd_ns for unknown mac])
-@@ -17210,7 +17283,7 @@ test_icmp() {
+@@ -14162,10 +14257,12 @@ wait_column "$hv1_uuid" Port_Binding requested_chassis logical_port=lsp0
+ wait_column "$hv2_uuid" Port_Binding additional_chassis logical_port=lsp0
+ wait_column "$hv2_uuid" Port_Binding requested_additional_chassis logical_port=lsp0
+
+-# Check ovn-installed updated for main chassis
++# Check ovn-installed updated for both chassis
+ wait_for_ports_up
+-OVS_WAIT_UNTIL([test `as hv1 ovs-vsctl get Interface lsp0 external_ids:ovn-installed` = '"true"'])
+-OVS_WAIT_UNTIL([test x`as hv2 ovs-vsctl get Interface lsp0 external_ids:ovn-installed` = x])
++
++for hv in hv1 hv2; do
++ OVS_WAIT_UNTIL([test `as $hv ovs-vsctl get Interface lsp0 external_ids:ovn-installed` = '"true"'])
++done
+
+ # Check that setting iface:encap-ip populates Port_Binding:additional_encap
+ wait_row_count Encap 2 chassis_name=hv1
+@@ -14192,7 +14289,7 @@ wait_column "$hv2_uuid" Port_Binding requested_chassis logical_port=lsp0
+ wait_column "" Port_Binding additional_chassis logical_port=lsp0
+ wait_column "" Port_Binding requested_additional_chassis logical_port=lsp0
+
+-# Check ovn-installed updated for main chassis and not for other chassis
++# Check ovn-installed updated for main chassis and removed from additional chassis
+ wait_for_ports_up
+ OVS_WAIT_UNTIL([test `as hv2 ovs-vsctl get Interface lsp0 external_ids:ovn-installed` = '"true"'])
+ OVS_WAIT_UNTIL([test x`as hv1 ovs-vsctl get Interface lsp0 external_ids:ovn-installed` = x])
+@@ -15071,6 +15168,327 @@ OVN_CLEANUP([hv1],[hv2],[hv3])
+ AT_CLEANUP
+ ])
+
++m4_define([MULTICHASSIS_PATH_MTU_DISCOVERY_TEST],
++ [OVN_FOR_EACH_NORTHD([
++ AT_SETUP([localnet connectivity with multiple requested-chassis, path mtu discovery (ip=$1, tunnel=$2, mtu=$3)])
++ AT_KEYWORDS([multi-chassis])
++ AT_SKIP_IF([test $HAVE_SCAPY = no])
++
++ ovn_start
++
++ net_add n1
++ for i in 1 2; do
++ sim_add hv$i
++ as hv$i
++ check ovs-vsctl add-br br-phys
++ if test "x$1" = "xipv6"; then
++ ovn_attach n1 br-phys fd00::$i 64 $2
++ else
++ ovn_attach n1 br-phys 192.168.0.$i 24 $2
++ fi
++ check ovs-vsctl set open . external-ids:ovn-bridge-mappings=phys:br-phys
++ done
++
++ first_mac=00:00:00:00:00:01
++ second_mac=00:00:00:00:00:02
++ multi1_mac=00:00:00:00:00:f0
++ multi2_mac=00:00:00:00:00:f1
++ first_ip=10.0.0.1
++ second_ip=10.0.0.2
++ multi1_ip=10.0.0.10
++ multi2_ip=10.0.0.20
++ first_ip6=abcd::1
++ second_ip6=abcd::2
++ multi1_ip6=abcd::f0
++ multi2_ip6=abcd::f1
++
++ check ovn-nbctl ls-add ls0
++ check ovn-nbctl lsp-add ls0 first
++ check ovn-nbctl lsp-add ls0 second
++ check ovn-nbctl lsp-add ls0 multi1
++ check ovn-nbctl lsp-add ls0 multi2
++ check ovn-nbctl lsp-set-addresses first "${first_mac} ${first_ip} ${first_ip6}"
++ check ovn-nbctl lsp-set-addresses second "${second_mac} ${second_ip} ${second_ip6}"
++ check ovn-nbctl lsp-set-addresses multi1 "${multi1_mac} ${multi1_ip} ${multi1_ip6}"
++ check ovn-nbctl lsp-set-addresses multi2 "${multi2_mac} ${multi2_ip} ${multi2_ip6}"
++
++ check ovn-nbctl lsp-add ls0 public
++ check ovn-nbctl lsp-set-type public localnet
++ check ovn-nbctl lsp-set-addresses public unknown
++ check ovn-nbctl lsp-set-options public network_name=phys
++
++ check ovn-nbctl lsp-set-options first requested-chassis=hv1
++ check ovn-nbctl lsp-set-options second requested-chassis=hv2
++ check ovn-nbctl lsp-set-options multi1 requested-chassis=hv1,hv2
++ check ovn-nbctl lsp-set-options multi2 requested-chassis=hv1,hv2
++
++ as hv1 check ovs-vsctl -- add-port br-int first -- \
++ set Interface first external-ids:iface-id=first \
++ options:tx_pcap=hv1/first-tx.pcap \
++ options:rxq_pcap=hv1/first-rx.pcap \
++ ofport-request=1
++ as hv2 check ovs-vsctl -- add-port br-int second -- \
++ set Interface second external-ids:iface-id=second \
++ options:tx_pcap=hv2/second-tx.pcap \
++ options:rxq_pcap=hv2/second-rx.pcap \
++ ofport-request=2
++
++ # Create interfaces for multichassis ports on both hv1 and hv2
++ for hv in hv1 hv2; do
++ for i in 1 2; do
++ as $hv check ovs-vsctl -- add-port br-int multi${i} -- \
++ set Interface multi${i} external-ids:iface-id=multi${i} \
++ options:tx_pcap=$hv/multi${i}-tx.pcap \
++ options:rxq_pcap=$hv/multi${i}-rx.pcap \
++ ofport-request=${i}00
++ done
++ done
++
++ send_ip_packet() {
++ local inport=${1} hv=${2} eth_src=${3} eth_dst=${4} ipv4_src=${5} ipv4_dst=${6} data=${7} fail=${8} mtu=${9:-$3}
++ packet=$(fmt_pkt "
++ Ether(dst='${eth_dst}', src='${eth_src}') /
++ IP(src='${ipv4_src}', dst='${ipv4_dst}') /
++ ICMP(type=8) / bytes.fromhex('${data}')
++ ")
++ as hv${hv} ovs-appctl netdev-dummy/receive ${inport} ${packet}
++ if [[ x"${fail}" != x0 ]]; then
++ original_ip_frame=$(fmt_pkt "
++ IP(src='${ipv4_src}', dst='${ipv4_dst}') /
++ ICMP(type=8) / bytes.fromhex('${data}')
++ ")
++ # IP(flags=2) means DF (Don't Fragment) = 1
++ # ICMP(type=3, code=4) means Destination Unreachable, Fragmentation Needed
++ packet=$(fmt_pkt "
++ Ether(dst='${eth_src}', src='${eth_dst}') /
++ IP(src='${ipv4_dst}', dst='${ipv4_src}', ttl=255, flags=2, id=0) /
++ ICMP(type=3, code=4, nexthopmtu=${mtu}) /
++ bytes.fromhex('${original_ip_frame:0:$((534 * 2))}')
++ ")
++ fi
++ echo ${packet}
++ }
++
++ send_ip6_packet() {
++ local inport=${1} hv=${2} eth_src=${3} eth_dst=${4} ipv6_src=${5} ipv6_dst=${6} data=${7} fail=${8} mtu=${9:-$3}
++ packet=$(fmt_pkt "
++ Ether(dst='${eth_dst}', src='${eth_src}') /
++ IPv6(src='${ipv6_src}', dst='${ipv6_dst}') /
++ ICMPv6EchoRequest() / bytes.fromhex('${data}')
++ ")
++ as hv${hv} ovs-appctl netdev-dummy/receive ${inport} ${packet}
++ if [[ x"${fail}" != x0 ]]; then
++ original_ip_frame=$(fmt_pkt "
++ IPv6(src='${ipv6_src}', dst='${ipv6_dst}') /
++ ICMPv6EchoRequest() / bytes.fromhex('${data}')
++ ")
++ packet=$(fmt_pkt "
++ Ether(dst='${eth_src}', src='${eth_dst}') /
++ IPv6(src='${ipv6_dst}', dst='${ipv6_src}', hlim=255) /
++ ICMPv6PacketTooBig(mtu=${mtu}) /
++ bytes.fromhex('${original_ip_frame:0:$((1218 * 2))}')
++ ")
++ fi
++ echo ${packet}
++ }
++
++ reset_env() {
++ for port in first multi1 multi2; do
++ as hv1 reset_pcap_file $port hv1/$port
++ done
++ for port in second multi1 multi2; do
++ as hv2 reset_pcap_file $port hv2/$port
++ done
++ for port in hv1/multi1 hv2/multi1 hv1/multi2 hv2/multi2 hv1/first hv2/second; do
++ : > $port.expected
++ done
++ }
++
++ check_pkts() {
++ for port in hv1/multi1 hv2/multi1 hv1/multi2 hv2/multi2 hv1/first hv2/second; do
++ OVN_CHECK_PACKETS_REMOVE_BROADCAST([${port}-tx.pcap], [${port}.expected])
++ done
++ }
++
++ payload() {
++ echo $(cat /dev/urandom | tr -cd 'a-f0-9' | head -c ${1})
++ }
++
++ wait_for_ports_up
++ OVN_POPULATE_ARP
++
++ reset_env
++
++ AS_BOX([Packets of proper size are delivered from multichassis to regular ports])
++
++ len=1000
++ packet=$(send_ip_packet multi1 1 $multi1_mac $first_mac $multi1_ip $first_ip $(payload $len) 0)
++ echo $packet >> hv1/first.expected
++
++ packet=$(send_ip_packet multi1 1 $multi1_mac $second_mac $multi1_ip $second_ip $(payload $len) 0)
++ echo $packet >> hv2/second.expected
++
++ packet=$(send_ip6_packet multi1 1 $multi1_mac $first_mac $multi1_ip6 $first_ip6 $(payload $len) 0)
++ echo $packet >> hv1/first.expected
++
++ packet=$(send_ip6_packet multi1 1 $multi1_mac $second_mac $multi1_ip6 $second_ip6 $(payload $len) 0)
++ echo $packet >> hv2/second.expected
++
++ check_pkts
++ reset_env
++
++ AS_BOX([Oversized packets are not delivered from multichassis to regular ports])
++
++ len=3000
++ packet=$(send_ip_packet multi1 1 $multi1_mac $first_mac $multi1_ip $first_ip $(payload $len) 1)
++ echo $packet >> hv1/multi1.expected
++
++ packet=$(send_ip_packet multi1 1 $multi1_mac $second_mac $multi1_ip $second_ip $(payload $len) 1)
++ echo $packet >> hv1/multi1.expected
++
++ packet=$(send_ip6_packet multi1 1 $multi1_mac $first_mac $multi1_ip6 $first_ip6 $(payload $len) 1)
++ echo $packet >> hv1/multi1.expected
++
++ packet=$(send_ip6_packet multi1 1 $multi1_mac $second_mac $multi1_ip6 $second_ip6 $(payload $len) 1)
++ echo $packet >> hv1/multi1.expected
++
++ check_pkts
++ reset_env
++
++ AS_BOX([Packets of proper size are delivered from regular to multichassis ports])
++
++ len=1000
++ packet=$(send_ip_packet first 1 $first_mac $multi1_mac $first_ip $multi1_ip $(payload $len) 0)
++ echo $packet >> hv1/multi1.expected
++ echo $packet >> hv2/multi1.expected
++
++ packet=$(send_ip_packet second 2 $second_mac $multi1_mac $second_ip $multi1_ip $(payload $len) 0)
++ echo $packet >> hv1/multi1.expected
++ echo $packet >> hv2/multi1.expected
++
++ packet=$(send_ip6_packet first 1 $first_mac $multi1_mac $first_ip6 $multi1_ip6 $(payload $len) 0)
++ echo $packet >> hv1/multi1.expected
++ echo $packet >> hv2/multi1.expected
++
++ packet=$(send_ip6_packet second 2 $second_mac $multi1_mac $second_ip6 $multi1_ip6 $(payload $len) 0)
++ echo $packet >> hv1/multi1.expected
++ echo $packet >> hv2/multi1.expected
++
++ check_pkts
++ reset_env
++
++ AS_BOX([Oversized packets are not delivered from regular to multichassis ports])
++
++ len=3000
++ packet=$(send_ip_packet first 1 $first_mac $multi1_mac $first_ip $multi1_ip $(payload $len) 1)
++ echo $packet >> hv1/first.expected
++
++ packet=$(send_ip_packet second 2 $second_mac $multi1_mac $second_ip $multi1_ip $(payload $len) 1)
++ echo $packet >> hv2/second.expected
++
++ packet=$(send_ip6_packet first 1 $first_mac $multi1_mac $first_ip6 $multi1_ip6 $(payload $len) 1)
++ echo $packet >> hv1/first.expected
++
++ packet=$(send_ip6_packet second 2 $second_mac $multi1_mac $second_ip6 $multi1_ip6 $(payload $len) 1)
++ echo $packet >> hv2/second.expected
++
++ check_pkts
++ reset_env
++
++ AS_BOX([Packets of proper size are delivered from multichassis to multichassis ports])
++
++ len=1000
++ packet=$(send_ip_packet multi1 1 $multi1_mac $multi2_mac $multi1_ip $multi2_ip $(payload $len) 0)
++ echo $packet >> hv1/multi2.expected
++ echo $packet >> hv2/multi2.expected
++
++ packet=$(send_ip6_packet multi1 1 $multi1_mac $multi2_mac $multi1_ip6 $multi2_ip6 $(payload $len) 0)
++ echo $packet >> hv1/multi2.expected
++ echo $packet >> hv2/multi2.expected
++
++ check_pkts
++ reset_env
++
++ AS_BOX([Oversized packets are not delivered from multichassis to multichassis ports])
++
++ len=3000
++ packet=$(send_ip_packet multi1 1 $multi1_mac $multi2_mac $multi1_ip $multi2_ip $(payload $len) 1)
++ echo $packet >> hv1/multi1.expected
++
++ packet=$(send_ip6_packet multi1 1 $multi1_mac $multi2_mac $multi1_ip6 $multi2_ip6 $(payload $len) 1)
++ echo $packet >> hv1/multi1.expected
++
++ check_pkts
++ reset_env
++
++ AS_BOX([MTU updates are honored in ICMP Path MTU calculation])
++
++ set_mtu() {
++ local hv=${1} iface=${2} new_mtu=${3}
++
++ iface_uuid=$(as ${hv} ovs-vsctl --bare --columns _uuid find Interface name=${iface})
++ check as ${hv} ovs-vsctl set interface ${iface_uuid} mtu_request=${new_mtu}
++ }
++
++ set_mtu_for_all_ports() {
++ for port in multi1 multi2 first; do
++ set_mtu hv1 ${port} ${1}
++ done
++ for port in multi1 multi2 second; do
++ set_mtu hv2 ${port} ${1}
++ done
++ }
++
++ initial_mtu=1500 # all interfaces are 1500 by default
++ new_mtu=1400
++ set_mtu_for_all_ports ${new_mtu}
++ mtu_diff=$((${initial_mtu} - ${new_mtu}))
++
++ len=3000
++ expected_ip_mtu=$(($3 - ${mtu_diff}))
++ packet=$(send_ip_packet first 1 $first_mac $multi1_mac $first_ip $multi1_ip $(payload $len) 1 ${expected_ip_mtu})
++ echo $packet >> hv1/first.expected
++
++ packet=$(send_ip_packet second 2 $second_mac $multi1_mac $second_ip $multi1_ip $(payload $len) 1 ${expected_ip_mtu})
++ echo $packet >> hv2/second.expected
++
++ packet=$(send_ip6_packet first 1 $first_mac $multi1_mac $first_ip6 $multi1_ip6 $(payload $len) 1 ${expected_ip_mtu})
++ echo $packet >> hv1/first.expected
++
++ packet=$(send_ip6_packet second 2 $second_mac $multi1_mac $second_ip6 $multi1_ip6 $(payload $len) 1 ${expected_ip_mtu})
++ echo $packet >> hv2/second.expected
++
++ packet=$(send_ip_packet multi1 1 $multi1_mac $first_mac $multi1_ip $first_ip $(payload $len) 1 ${expected_ip_mtu})
++ echo $packet >> hv1/multi1.expected
++
++ packet=$(send_ip_packet multi1 1 $multi1_mac $second_mac $multi1_ip $second_ip $(payload $len) 1 ${expected_ip_mtu})
++ echo $packet >> hv1/multi1.expected
++
++ packet=$(send_ip6_packet multi1 1 $multi1_mac $first_mac $multi1_ip6 $first_ip6 $(payload $len) 1 ${expected_ip_mtu})
++ echo $packet >> hv1/multi1.expected
++
++ packet=$(send_ip6_packet multi1 1 $multi1_mac $second_mac $multi1_ip6 $second_ip6 $(payload $len) 1 ${expected_ip_mtu})
++ echo $packet >> hv1/multi1.expected
++
++ packet=$(send_ip_packet multi1 1 $multi1_mac $multi2_mac $multi1_ip $multi2_ip $(payload $len) 1 ${expected_ip_mtu})
++ echo $packet >> hv1/multi1.expected
++
++ packet=$(send_ip6_packet multi1 1 $multi1_mac $multi2_mac $multi1_ip6 $multi2_ip6 $(payload $len) 1 ${expected_ip_mtu})
++ echo $packet >> hv1/multi1.expected
++
++ check_pkts
++
++ OVN_CLEANUP([hv1],[hv2])
++
++ AT_CLEANUP
++ ])])
++
++# NOTE(ihar) no STT variants because it's not supported by upstream kernels
++MULTICHASSIS_PATH_MTU_DISCOVERY_TEST([ipv4], [geneve], [1424])
++MULTICHASSIS_PATH_MTU_DISCOVERY_TEST([ipv6], [geneve], [1404])
++MULTICHASSIS_PATH_MTU_DISCOVERY_TEST([ipv4], [vxlan], [1432])
++MULTICHASSIS_PATH_MTU_DISCOVERY_TEST([ipv6], [vxlan], [1412])
++
+ OVN_FOR_EACH_NORTHD([
+ AT_SETUP([options:activation-strategy for logical port])
+ AT_KEYWORDS([multi-chassis])
+@@ -16278,25 +16696,25 @@ sleep 2
+ # Get total number of ipv4 packets that received on ovs
+
+ # sender side
+-flow=$(as hv1 ovs-ofctl dump-flows br-int table=44 | grep priority=2002|grep ip,metadata=0x1)
++flow=$(as hv1 ovs-ofctl dump-flows br-int table=46 | grep priority=2002|grep ip,metadata=0x1)
+ n_pkts="$(echo $flow|awk -F',' '{ print $4 }'|awk -F'=' '{ print $2 }')"
+ check test $n_pkts -eq 1
+
+ # receiver side
+-flow=$(as hv2 ovs-ofctl dump-flows br-int table=44 | grep priority=2002|grep ip,metadata=0x1)
++flow=$(as hv2 ovs-ofctl dump-flows br-int table=46 | grep priority=2002|grep ip,metadata=0x1)
+ n_pkts="$(echo $flow|awk -F',' '{ print $4 }'|awk -F'=' '{ print $2 }')"
+ check test $n_pkts -eq 1
+
+ # Get total number of ipv6 packets that received on ovs
+
+ # sender side
+-flow=$(as hv1 ovs-ofctl dump-flows br-int table=44 | grep priority=2002|grep ipv6,metadata=0x1)
++flow=$(as hv1 ovs-ofctl dump-flows br-int table=46 | grep priority=2002|grep ipv6,metadata=0x1)
+ n_pkts="$(echo $flow|awk -F',' '{ print $4 }'|awk -F'=' '{ print $2 }')"
+ check test $n_pkts -eq 1
+
+
+ # receiver side
+-flow=$(as hv2 ovs-ofctl dump-flows br-int table=44 | grep priority=2002|grep ipv6,metadata=0x1)
++flow=$(as hv2 ovs-ofctl dump-flows br-int table=46 | grep priority=2002|grep ipv6,metadata=0x1)
+ n_pkts="$(echo $flow|awk -F',' '{ print $4 }'|awk -F'=' '{ print $2 }')"
+ check test $n_pkts -eq 1
+
+@@ -17210,7 +17628,7 @@ test_icmp() {
icmp4.code==0"
shift; shift; shift; shift; shift; shift
hv=hv`vif_to_hv $inport`
@@ -4614,7 +8020,165 @@ index 55de7c85b..3515a1e3c 100644
in_ls=`vif_to_ls $inport`
in_lrp=`vif_to_lrp $inport`
for outport; do
-@@ -18276,7 +18349,7 @@ AT_SETUP([TTL exceeded])
+@@ -17856,17 +18274,17 @@ check ovn-nbctl acl-add ls1 to-lport 3 'ip4.src==10.0.0.1' allow
+ check ovn-nbctl --wait=hv sync
+
+ # Check OVS flows, the less restrictive flows should have been installed.
+-AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=44 | ofctl_strip_all | \
++AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=46 | ofctl_strip_all | \
+ grep "priority=1003" | \
+ sed 's/conjunction([[^)]]*)/conjunction()/g' | \
+ sed 's/conj_id=[[0-9]]*,/conj_id=xxx,/g' | sort], [0], [dnl
+- table=44, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,45)
+- table=44, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,45)
+- table=44, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.3 actions=conjunction(),conjunction()
+- table=44, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.4 actions=conjunction(),conjunction()
+- table=44, priority=1003,ip,metadata=0x1,nw_src=10.0.0.1 actions=resubmit(,45)
+- table=44, priority=1003,ip,metadata=0x1,nw_src=10.0.0.2 actions=conjunction()
+- table=44, priority=1003,ip,metadata=0x1,nw_src=10.0.0.42 actions=conjunction()
++ table=46, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,47)
++ table=46, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,47)
++ table=46, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.3 actions=conjunction(),conjunction()
++ table=46, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.4 actions=conjunction(),conjunction()
++ table=46, priority=1003,ip,metadata=0x1,nw_src=10.0.0.1 actions=resubmit(,47)
++ table=46, priority=1003,ip,metadata=0x1,nw_src=10.0.0.2 actions=conjunction()
++ table=46, priority=1003,ip,metadata=0x1,nw_src=10.0.0.42 actions=conjunction()
+ ])
+
+ # Traffic 10.0.0.1, 10.0.0.2 -> 10.0.0.3, 10.0.0.4 should be allowed.
+@@ -17901,17 +18319,17 @@ check ovn-nbctl acl-del ls1 to-lport 3 'ip4.src==10.0.0.1 || ip4.src==10.0.0.1'
+ check ovn-nbctl --wait=hv sync
+
+ # Check OVS flows, the second less restrictive allow ACL should have been installed.
+-AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=44 | ofctl_strip_all | \
++AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=46 | ofctl_strip_all | \
+ grep "priority=1003" | \
+ sed 's/conjunction([[^)]]*)/conjunction()/g' | \
+ sed 's/conj_id=[[0-9]]*,/conj_id=xxx,/g' | sort], [0], [dnl
+- table=44, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,45)
+- table=44, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,45)
+- table=44, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.3 actions=conjunction(),conjunction()
+- table=44, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.4 actions=conjunction(),conjunction()
+- table=44, priority=1003,ip,metadata=0x1,nw_src=10.0.0.1 actions=resubmit(,45)
+- table=44, priority=1003,ip,metadata=0x1,nw_src=10.0.0.2 actions=conjunction()
+- table=44, priority=1003,ip,metadata=0x1,nw_src=10.0.0.42 actions=conjunction()
++ table=46, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,47)
++ table=46, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,47)
++ table=46, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.3 actions=conjunction(),conjunction()
++ table=46, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.4 actions=conjunction(),conjunction()
++ table=46, priority=1003,ip,metadata=0x1,nw_src=10.0.0.1 actions=resubmit(,47)
++ table=46, priority=1003,ip,metadata=0x1,nw_src=10.0.0.2 actions=conjunction()
++ table=46, priority=1003,ip,metadata=0x1,nw_src=10.0.0.42 actions=conjunction()
+ ])
+
+ # Remove the less restrictive allow ACL.
+@@ -17919,17 +18337,17 @@ check ovn-nbctl acl-del ls1 to-lport 3 'ip4.src==10.0.0.1'
+ check ovn-nbctl --wait=hv sync
+
+ # Check OVS flows, the 10.0.0.1 conjunction should have been reinstalled.
+-AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=44 | ofctl_strip_all | \
++AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=46 | ofctl_strip_all | \
+ grep "priority=1003" | \
+ sed 's/conjunction([[^)]]*)/conjunction()/g' | \
+ sed 's/conj_id=[[0-9]]*,/conj_id=xxx,/g' | sort], [0], [dnl
+- table=44, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,45)
+- table=44, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,45)
+- table=44, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.3 actions=conjunction(),conjunction()
+- table=44, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.4 actions=conjunction(),conjunction()
+- table=44, priority=1003,ip,metadata=0x1,nw_src=10.0.0.1 actions=conjunction(),conjunction()
+- table=44, priority=1003,ip,metadata=0x1,nw_src=10.0.0.2 actions=conjunction()
+- table=44, priority=1003,ip,metadata=0x1,nw_src=10.0.0.42 actions=conjunction()
++ table=46, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,47)
++ table=46, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,47)
++ table=46, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.3 actions=conjunction(),conjunction()
++ table=46, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.4 actions=conjunction(),conjunction()
++ table=46, priority=1003,ip,metadata=0x1,nw_src=10.0.0.1 actions=conjunction(),conjunction()
++ table=46, priority=1003,ip,metadata=0x1,nw_src=10.0.0.2 actions=conjunction()
++ table=46, priority=1003,ip,metadata=0x1,nw_src=10.0.0.42 actions=conjunction()
+ ])
+
+ # Traffic 10.0.0.1, 10.0.0.2 -> 10.0.0.3, 10.0.0.4 should be allowed.
+@@ -17959,17 +18377,17 @@ check ovn-nbctl acl-add ls1 to-lport 3 'ip4.src==10.0.0.1' allow
+ check ovn-nbctl --wait=hv sync
+
+ # Check OVS flows, the less restrictive flows should have been installed.
+-AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=44 | ofctl_strip_all | \
++AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=46 | ofctl_strip_all | \
+ grep "priority=1003" | \
+ sed 's/conjunction([[^)]]*)/conjunction()/g' | \
+ sed 's/conj_id=[[0-9]]*,/conj_id=xxx,/g' | sort], [0], [dnl
+- table=44, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,45)
+- table=44, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,45)
+- table=44, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.3 actions=conjunction(),conjunction()
+- table=44, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.4 actions=conjunction(),conjunction()
+- table=44, priority=1003,ip,metadata=0x1,nw_src=10.0.0.1 actions=resubmit(,45)
+- table=44, priority=1003,ip,metadata=0x1,nw_src=10.0.0.2 actions=conjunction()
+- table=44, priority=1003,ip,metadata=0x1,nw_src=10.0.0.42 actions=conjunction()
++ table=46, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,47)
++ table=46, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,47)
++ table=46, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.3 actions=conjunction(),conjunction()
++ table=46, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.4 actions=conjunction(),conjunction()
++ table=46, priority=1003,ip,metadata=0x1,nw_src=10.0.0.1 actions=resubmit(,47)
++ table=46, priority=1003,ip,metadata=0x1,nw_src=10.0.0.2 actions=conjunction()
++ table=46, priority=1003,ip,metadata=0x1,nw_src=10.0.0.42 actions=conjunction()
+ ])
+
+ # Add another ACL that overlaps with the existing less restrictive ones.
+@@ -17980,20 +18398,20 @@ check ovn-nbctl --wait=hv sync
+ # with an additional conjunction action.
+ #
+ # New non-conjunctive flows should be added to match on 'udp'.
+-AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=44 | ofctl_strip_all | \
++AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=46 | ofctl_strip_all | \
+ grep "priority=1003" | \
+ sed 's/conjunction([[^)]]*)/conjunction()/g' | \
+ sed 's/conj_id=[[0-9]]*,/conj_id=xxx,/g' | sort], [0], [dnl
+- table=44, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,45)
+- table=44, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,45)
+- table=44, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,45)
+- table=44, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.3 actions=conjunction(),conjunction(),conjunction()
+- table=44, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.4 actions=conjunction(),conjunction(),conjunction()
+- table=44, priority=1003,ip,metadata=0x1,nw_src=10.0.0.1 actions=resubmit(,45)
+- table=44, priority=1003,ip,metadata=0x1,nw_src=10.0.0.2 actions=conjunction(),conjunction()
+- table=44, priority=1003,ip,metadata=0x1,nw_src=10.0.0.42 actions=conjunction()
+- table=44, priority=1003,udp,metadata=0x1 actions=resubmit(,45)
+- table=44, priority=1003,udp6,metadata=0x1 actions=resubmit(,45)
++ table=46, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,47)
++ table=46, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,47)
++ table=46, priority=1003,conj_id=xxx,ip,metadata=0x1 actions=resubmit(,47)
++ table=46, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.3 actions=conjunction(),conjunction(),conjunction()
++ table=46, priority=1003,ip,metadata=0x1,nw_dst=10.0.0.4 actions=conjunction(),conjunction(),conjunction()
++ table=46, priority=1003,ip,metadata=0x1,nw_src=10.0.0.1 actions=resubmit(,47)
++ table=46, priority=1003,ip,metadata=0x1,nw_src=10.0.0.2 actions=conjunction(),conjunction()
++ table=46, priority=1003,ip,metadata=0x1,nw_src=10.0.0.42 actions=conjunction()
++ table=46, priority=1003,udp,metadata=0x1 actions=resubmit(,47)
++ table=46, priority=1003,udp6,metadata=0x1 actions=resubmit(,47)
+ ])
+
+ OVN_CLEANUP([hv1])
+@@ -18048,17 +18466,17 @@ check ovn-nbctl acl-add pg1 to-lport 100 'outport == @pg1 && ip4.src == $as2' al
+
+ wait_for_ports_up
+ check ovn-nbctl --wait=hv sync
+-ovs-ofctl dump-flows br-int table=44
+-AT_CHECK([test `ovs-ofctl dump-flows br-int table=44 | grep -c conj_id` = 2])
++ovs-ofctl dump-flows br-int table=46
++AT_CHECK([test `ovs-ofctl dump-flows br-int table=46 | grep -c conj_id` = 2])
+
+ echo -------
+ # Add another address in as1, so that the 1st ACL will now generate 2 conjunctions.
+ ovn-nbctl set address_set as1 addresses="10.0.0.1,10.0.0.2"
+ check ovn-nbctl --wait=hv sync
+
+-ovs-ofctl dump-flows br-int table=44
++ovs-ofctl dump-flows br-int table=46
+ # There should be 3 conjunctions in total (2 from 1st ACL + 1 from 2nd ACL)
+-AT_CHECK([test `ovs-ofctl dump-flows br-int table=44 | grep -c conj_id` = 3])
++AT_CHECK([test `ovs-ofctl dump-flows br-int table=46 | grep -c conj_id` = 3])
+
+ OVN_CLEANUP([hv1])
+ AT_CLEANUP
+@@ -18276,7 +18694,7 @@ AT_SETUP([TTL exceeded])
AT_KEYWORDS([ttl-exceeded])
ovn_start
@@ -4623,7 +8187,7 @@ index 55de7c85b..3515a1e3c 100644
#
# Causes a packet to be received on INPORT of the hypervisor HV. The packet is an IPv4 packet with
# ETH_SRC, ETH_DST, IPV4_SRC, IPV4_DST, IP_CHKSUM as specified and TTL set to 1.
-@@ -18292,6 +18365,7 @@ test_ip_packet() {
+@@ -18292,6 +18710,7 @@ test_ip_packet() {
local inport=$1 hv=$2 eth_src=$3 eth_dst=$4 ipv4_src=$5 ipv4_dst=$6 ip_router=$7 ip_chksum=$8
local exp_ip_chksum=$9 exp_icmp_chksum=${10}
shift 10
@@ -4631,7 +8195,7 @@ index 55de7c85b..3515a1e3c 100644
local ip_ttl=01
local packet=${eth_dst}${eth_src}08004500001400004000${ip_ttl}01${ip_chksum}${ipv4_src}${ipv4_dst}
-@@ -18300,27 +18374,31 @@ test_ip_packet() {
+@@ -18300,27 +18719,31 @@ test_ip_packet() {
local icmp_type_code_response=0b00
local icmp_data=00000000
local reply_icmp_payload=${icmp_type_code_response}${exp_icmp_chksum}${icmp_data}
@@ -4669,7 +8233,7 @@ index 55de7c85b..3515a1e3c 100644
as hv$hv ovs-appctl netdev-dummy/receive vif$inport $packet
}
-@@ -18343,6 +18421,8 @@ for i in 1 2; do
+@@ -18343,6 +18766,8 @@ for i in 1 2; do
options:tx_pcap=hv$i/vif$i-tx.pcap \
options:rxq_pcap=hv$i/vif$i-rx.pcap \
ofport-request=$i
@@ -4678,7 +8242,7 @@ index 55de7c85b..3515a1e3c 100644
done
ovn-nbctl lr-add lr0
-@@ -18358,10 +18438,22 @@ OVN_POPULATE_ARP
+@@ -18358,10 +18783,22 @@ OVN_POPULATE_ARP
wait_for_ports_up
ovn-nbctl --wait=hv sync
@@ -4703,7 +8267,7 @@ index 55de7c85b..3515a1e3c 100644
OVN_CLEANUP([hv1], [hv2])
AT_CLEANUP
])
-@@ -18656,7 +18748,7 @@ packet="inport==\"sw1-p1\" && eth.src==$sw1_p1_mac && eth.dst==$sw1_ro_mac &&
+@@ -18656,7 +19093,7 @@ packet="inport==\"sw1-p1\" && eth.src==$sw1_p1_mac && eth.dst==$sw1_ro_mac &&
udp && udp.src==53 && udp.dst==4369"
# Start by Sending the packet and make sure it makes it there as expected
@@ -4712,7 +8276,7 @@ index 55de7c85b..3515a1e3c 100644
# Expected packet has TTL decreased by 1
expected="eth.src==$sw2_ro_mac && eth.dst==$sw2_p1_mac &&
-@@ -18670,7 +18762,7 @@ OVN_CHECK_PACKETS([hv2/vif1-tx.pcap], [expected])
+@@ -18670,7 +19107,7 @@ OVN_CHECK_PACKETS([hv2/vif1-tx.pcap], [expected])
as hv2 ovs-appctl -t ovn-controller exit
# Now send the packet again. This time, it should not arrive.
@@ -4721,7 +8285,7 @@ index 55de7c85b..3515a1e3c 100644
OVN_CHECK_PACKETS([hv2/vif1-tx.pcap], [expected])
-@@ -19552,7 +19644,7 @@ packet="inport==\"sw1-p1\" && eth.src==$sw1_p1_mac && eth.dst==$sw1_ro_mac &&
+@@ -19552,7 +19989,7 @@ packet="inport==\"sw1-p1\" && eth.src==$sw1_p1_mac && eth.dst==$sw1_ro_mac &&
udp && udp.src==53 && udp.dst==4369"
# Start by Sending the packet and make sure it makes it there as expected
@@ -4730,7 +8294,7 @@ index 55de7c85b..3515a1e3c 100644
# Expected packet has TTL decreased by 1
expected="eth.src==$sw2_ro_mac && eth.dst==$sw2_p1_mac &&
-@@ -19566,7 +19658,7 @@ OVN_CHECK_PACKETS([hv2/vif1-tx.pcap], [expected])
+@@ -19566,7 +20003,7 @@ OVN_CHECK_PACKETS([hv2/vif1-tx.pcap], [expected])
as hv2 ovs-appctl -t ovn-controller exit --restart
# Now send the packet again. This time, it should still arrive
@@ -4739,7 +8303,7 @@ index 55de7c85b..3515a1e3c 100644
cat expected expected > expected2
-@@ -19705,7 +19797,7 @@ test_ip_packet_larger() {
+@@ -19705,7 +20142,7 @@ test_ip_packet_larger() {
# Set the packet length to 114.
pkt_len=0072
packet=${dst_mac}${src_mac}08004500${pkt_len}000000004001c3dd
@@ -4748,7 +8312,7 @@ index 55de7c85b..3515a1e3c 100644
orig_packet_l3=${orig_packet_l3}000000000000000000000000000000000000
orig_packet_l3=${orig_packet_l3}000000000000000000000000000000000000
orig_packet_l3=${orig_packet_l3}000000000000000000000000000000000000
-@@ -19729,10 +19821,10 @@ test_ip_packet_larger() {
+@@ -19729,10 +20166,10 @@ test_ip_packet_larger() {
# Packet to expect at br-phys.
src_mac="000020201213"
dst_mac="00000012af11"
@@ -4762,7 +8326,7 @@ index 55de7c85b..3515a1e3c 100644
expected=${expected}000000000000000000000000000000000000
expected=${expected}000000000000000000000000000000000000
expected=${expected}000000000000000000000000000000000000
-@@ -19793,7 +19885,7 @@ test_ip_packet_larger_ext() {
+@@ -19793,7 +20230,7 @@ test_ip_packet_larger_ext() {
# Set the packet length to 114.
pkt_len=0072
packet=${dst_mac}${src_mac}08004500${pkt_len}000000004001${checksum}
@@ -4771,7 +8335,7 @@ index 55de7c85b..3515a1e3c 100644
orig_packet_l3=${orig_packet_l3}000000000000000000000000000000000000
orig_packet_l3=${orig_packet_l3}000000000000000000000000000000000000
orig_packet_l3=${orig_packet_l3}000000000000000000000000000000000000
-@@ -19810,7 +19902,7 @@ test_ip_packet_larger_ext() {
+@@ -19810,7 +20247,7 @@ test_ip_packet_larger_ext() {
dst_ip=`ip_to_hex 172 168 0 4`
# pkt len should be 146 (28 (icmp packet) + 118 (orig ip + payload))
reply_pkt_len=008e
@@ -4780,7 +8344,7 @@ index 55de7c85b..3515a1e3c 100644
icmp_reply=${src_mac}${dst_mac}08004500${reply_pkt_len}00004000fe01${reply_checksum}
icmp_reply=${icmp_reply}${src_ip}${dst_ip}0304${ip_csum}0000$(printf "%04x" $mtu)
icmp_reply=${icmp_reply}4500${pkt_len}000000004001${checksum}
-@@ -19985,10 +20077,10 @@ OVS_WAIT_FOR_OUTPUT([
+@@ -19985,10 +20422,10 @@ OVS_WAIT_FOR_OUTPUT([
])
AS_BOX([testing ingress traffic mtu 100 - IPv4])
@@ -4793,7 +8357,7 @@ index 55de7c85b..3515a1e3c 100644
AS_BOX([testing ingress traffic mtu 100 - IPv6])
test_ip6_packet_larger_ext 1 000020201213 20000000000000000000000000000001 100 cc7a
-@@ -20055,10 +20147,10 @@ OVS_WAIT_FOR_OUTPUT([
+@@ -20055,10 +20492,10 @@ OVS_WAIT_FOR_OUTPUT([
])
AS_BOX([testing ingress traffic mtu 100 for gw router - IPv4])
@@ -4806,7 +8370,29 @@ index 55de7c85b..3515a1e3c 100644
OVN_CLEANUP([hv1])
AT_CLEANUP
-@@ -21116,7 +21208,7 @@ check_virtual_offlows_not_present hv2
+@@ -21012,9 +21449,9 @@ check_virtual_offlows_present() {
+ lr0_dp_key=$(printf "%x" $(fetch_column Datapath_Binding tunnel_key external_ids:name=lr0))
+ lr0_public_dp_key=$(printf "%x" $(fetch_column Port_Binding tunnel_key logical_port=lr0-public))
+
+- AT_CHECK_UNQUOTED([as $hv ovs-ofctl dump-flows br-int table=44 | ofctl_strip_all | grep "priority=2000"], [0], [dnl
+- table=44, priority=2000,ip,metadata=0x$sw0_dp_key actions=resubmit(,45)
+- table=44, priority=2000,ipv6,metadata=0x$sw0_dp_key actions=resubmit(,45)
++ AT_CHECK_UNQUOTED([as $hv ovs-ofctl dump-flows br-int table=46 | ofctl_strip_all | grep "priority=2000"], [0], [dnl
++ table=46, priority=2000,ip,metadata=0x$sw0_dp_key actions=resubmit(,47)
++ table=46, priority=2000,ipv6,metadata=0x$sw0_dp_key actions=resubmit(,47)
+ ])
+
+ AT_CHECK_UNQUOTED([as $hv ovs-ofctl dump-flows br-int table=11 | ofctl_strip_all | \
+@@ -21025,7 +21462,7 @@ check_virtual_offlows_present() {
+
+ check_virtual_offlows_not_present() {
+ hv=$1
+- AT_CHECK([as $hv ovs-ofctl dump-flows br-int table=45 | ofctl_strip_all | grep "priority=2000"], [1], [dnl
++ AT_CHECK([as $hv ovs-ofctl dump-flows br-int table=47 | ofctl_strip_all | grep "priority=2000"], [1], [dnl
+ ])
+
+ AT_CHECK([as $hv ovs-ofctl dump-flows br-int table=11 | ofctl_strip_all | \
+@@ -21116,7 +21553,7 @@ check_virtual_offlows_not_present hv2
send_garp 1 1 $eth_src $eth_dst $spa $tpa
OVS_WAIT_UNTIL([test x$(ovn-sbctl --bare --columns chassis find port_binding \
@@ -4815,7 +8401,7 @@ index 55de7c85b..3515a1e3c 100644
AT_CHECK([test x$(ovn-sbctl --bare --columns virtual_parent find port_binding \
logical_port=sw0-vir) = xsw0-p1])
-@@ -21184,7 +21276,7 @@ tpa=$(ip_to_hex 10 0 0 10)
+@@ -21184,7 +21621,7 @@ tpa=$(ip_to_hex 10 0 0 10)
send_garp 1 2 $eth_src $eth_dst $spa $tpa
OVS_WAIT_UNTIL([test x$(ovn-sbctl --bare --columns chassis find port_binding \
@@ -4824,7 +8410,7 @@ index 55de7c85b..3515a1e3c 100644
OVS_WAIT_UNTIL([test x$(ovn-sbctl --bare --columns virtual_parent find port_binding \
logical_port=sw0-vir) = xsw0-p3])
-@@ -21217,7 +21309,7 @@ tpa=$(ip_to_hex 10 0 0 10)
+@@ -21217,7 +21654,7 @@ tpa=$(ip_to_hex 10 0 0 10)
send_garp 2 1 $eth_src $eth_dst $spa $tpa
OVS_WAIT_UNTIL([test x$(ovn-sbctl --bare --columns chassis find port_binding \
@@ -4833,7 +8419,7 @@ index 55de7c85b..3515a1e3c 100644
AT_CHECK([test x$(ovn-sbctl --bare --columns virtual_parent find port_binding \
logical_port=sw0-vir) = xsw0-p2])
-@@ -21249,7 +21341,7 @@ tpa=$(ip_to_hex 10 0 0 4)
+@@ -21249,7 +21686,7 @@ tpa=$(ip_to_hex 10 0 0 4)
send_arp_reply 1 1 $eth_src $eth_dst $spa $tpa
OVS_WAIT_UNTIL([test x$(ovn-sbctl --bare --columns chassis find port_binding \
@@ -4842,7 +8428,7 @@ index 55de7c85b..3515a1e3c 100644
sleep 1
AT_CHECK([test x$(ovn-sbctl --bare --columns virtual_parent find port_binding \
-@@ -21275,7 +21367,7 @@ check_virtual_offlows_not_present hv2
+@@ -21275,7 +21712,7 @@ check_virtual_offlows_not_present hv2
as hv1 ovs-vsctl del-port hv1-vif1
OVS_WAIT_UNTIL([test x$(ovn-sbctl --bare --columns chassis find port_binding \
@@ -4851,7 +8437,7 @@ index 55de7c85b..3515a1e3c 100644
sleep 1
AT_CHECK([test x$(ovn-sbctl --bare --columns virtual_parent find port_binding \
-@@ -21310,7 +21402,7 @@ send_arp_reply 2 1 $eth_src $eth_dst $spa $tpa
+@@ -21310,7 +21747,7 @@ send_arp_reply 2 1 $eth_src $eth_dst $spa $tpa
sleep 1
OVS_WAIT_UNTIL([test x$(ovn-sbctl --bare --columns chassis find port_binding \
@@ -4860,7 +8446,7 @@ index 55de7c85b..3515a1e3c 100644
sleep 1
AT_CHECK([test x$(ovn-sbctl --bare --columns virtual_parent find port_binding \
logical_port=sw0-vir) = xsw0-p2])
-@@ -21335,7 +21427,7 @@ check_virtual_offlows_not_present hv1
+@@ -21335,7 +21772,7 @@ check_virtual_offlows_not_present hv1
ovn-nbctl lsp-del sw0-p2
OVS_WAIT_UNTIL([test x$(ovn-sbctl --bare --columns chassis find port_binding \
@@ -4869,7 +8455,7 @@ index 55de7c85b..3515a1e3c 100644
AT_CHECK([test x$(ovn-sbctl --bare --columns virtual_parent find port_binding \
logical_port=sw0-vir) = x])
-@@ -21516,7 +21608,7 @@ AT_CAPTURE_FILE([offlows])
+@@ -21516,7 +21953,7 @@ AT_CAPTURE_FILE([offlows])
packet0="inport==\"sw0-p11\" && eth.src==00:00:00:00:00:11 && eth.dst==00:00:00:00:00:21 &&
ip4 && ip.ttl==64 && ip4.src==192.168.1.11 && ip4.dst==192.168.1.100 &&
tcp && tcp.src==10000 && tcp.dst==80"
@@ -4878,7 +8464,7 @@ index 55de7c85b..3515a1e3c 100644
ovn-nbctl --wait=hv
ovn-sbctl list controller_event > events
-@@ -21545,7 +21637,7 @@ packet1="inport==\"sw1-p0\" && eth.src==00:00:00:00:00:33 && eth.dst==00:00:00:0
+@@ -21545,7 +21982,7 @@ packet1="inport==\"sw1-p0\" && eth.src==00:00:00:00:00:33 && eth.dst==00:00:00:0
ip4 && ip.ttl==64 && ip4.src==192.168.2.11 && ip4.dst==192.168.2.100 &&
tcp && tcp.src==10000 && tcp.dst==80"
@@ -4887,7 +8473,7 @@ index 55de7c85b..3515a1e3c 100644
ovn-nbctl --wait=hv
ovn-sbctl list controller_event
uuid=$(ovn-sbctl list controller_event | awk '/_uuid/{print $3}')
-@@ -21561,7 +21653,7 @@ packet2="inport==\"sw0-p11\" && eth.src==00:00:00:00:00:11 && eth.dst==00:00:00:
+@@ -21561,7 +21998,7 @@ packet2="inport==\"sw0-p11\" && eth.src==00:00:00:00:00:11 && eth.dst==00:00:00:
ip6 && ip.ttl==64 && ip6.src==2001::11 && ip6.dst==2001::10 &&
tcp && tcp.src==10000 && tcp.dst==50051"
@@ -4896,7 +8482,16 @@ index 55de7c85b..3515a1e3c 100644
ovn-nbctl --wait=hv
ovn-sbctl list controller_event
uuid=$(ovn-sbctl list controller_event | awk '/_uuid/{print $3}')
-@@ -23744,7 +23836,7 @@ send_garp 1 1 $eth_src $eth_dst $spa $tpa
+@@ -23619,7 +24056,7 @@ m4_define([DVR_N_S_PING],
+ OVN_CHECK_PACKETS_REMOVE_BROADCAST([hv4/vif-north-tx.pcap], [vif-north.expected])
+
+ # Confirm that packets did not go out via tunnel port.
+- AT_CHECK([as hv1 ovs-ofctl dump-flows br-int | grep table=38 | grep NXM_NX_TUN_METADATA0 | grep n_packets=0 | wc -l], [0], [[0
++ AT_CHECK([as hv1 ovs-ofctl dump-flows br-int | grep table=39 | grep NXM_NX_TUN_METADATA0 | grep n_packets=0 | wc -l], [0], [[0
+ ]])
+
+ # Confirm that packet went out via localnet port
+@@ -23744,7 +24181,7 @@ send_garp 1 1 $eth_src $eth_dst $spa $tpa
wait_row_count MAC_Binding 1
@@ -4905,7 +8500,7 @@ index 55de7c85b..3515a1e3c 100644
list mac_binding], [0], [lr0-sw0
10.0.0.30
50:54:00:00:00:03
-@@ -23791,7 +23883,7 @@ grep table_id=10 | wc -l`])
+@@ -23791,7 +24228,7 @@ grep table_id=10 | wc -l`])
check_row_count MAC_Binding 1
@@ -4914,7 +8509,7 @@ index 55de7c85b..3515a1e3c 100644
list mac_binding], [0], [lr0-sw0
10.0.0.30
50:54:00:00:00:13
-@@ -23820,7 +23912,7 @@ OVS_WAIT_UNTIL(
+@@ -23820,7 +24257,7 @@ OVS_WAIT_UNTIL(
| wc -l`]
)
@@ -4923,7 +8518,7 @@ index 55de7c85b..3515a1e3c 100644
find mac_binding ip=10.0.0.50], [0], [lr0-sw0
10.0.0.50
50:54:00:00:00:33
-@@ -24377,7 +24469,7 @@ AT_CAPTURE_FILE([sbflows2])
+@@ -24377,7 +24814,7 @@ AT_CAPTURE_FILE([sbflows2])
OVS_WAIT_FOR_OUTPUT(
[ovn-sbctl dump-flows > sbflows2
ovn-sbctl dump-flows lr0 | grep ct_lb_mark | grep priority=120 | sed 's/table=..//'], 0,
@@ -4932,7 +8527,7 @@ index 55de7c85b..3515a1e3c 100644
])
# get the svc monitor mac.
-@@ -24419,8 +24511,7 @@ AT_CHECK(
+@@ -24419,8 +24856,7 @@ AT_CHECK(
AT_CAPTURE_FILE([sbflows4])
ovn-sbctl dump-flows lr0 > sbflows4
AT_CHECK([grep lr_in_dnat sbflows4 | grep priority=120 | sed 's/table=..//' | sort], [0], [dnl
@@ -4942,7 +8537,7 @@ index 55de7c85b..3515a1e3c 100644
])
# Delete sw0-p1
-@@ -24576,7 +24667,7 @@ AT_CAPTURE_FILE([sbflows2])
+@@ -24576,7 +25012,7 @@ AT_CAPTURE_FILE([sbflows2])
OVS_WAIT_FOR_OUTPUT(
[ovn-sbctl dump-flows > sbflows2
ovn-sbctl dump-flows lr0 | grep ct_lb_mark | grep priority=120 | sed 's/table=..//'], 0,
@@ -4951,7 +8546,7 @@ index 55de7c85b..3515a1e3c 100644
])
# get the svc monitor mac.
-@@ -24618,8 +24709,7 @@ AT_CHECK(
+@@ -24618,8 +25054,7 @@ AT_CHECK(
AT_CAPTURE_FILE([sbflows4])
ovn-sbctl dump-flows lr0 > sbflows4
AT_CHECK([grep lr_in_dnat sbflows4 | grep priority=120 | sed 's/table=..//' | sort], [0], [dnl
@@ -4961,7 +8556,7 @@ index 55de7c85b..3515a1e3c 100644
])
# Delete sw0-p1
-@@ -25447,7 +25537,7 @@ for s_az in $(seq 1 $n_az); do
+@@ -25447,7 +25882,7 @@ for s_az in $(seq 1 $n_az); do
udp && udp.src==53 && udp.dst==4369"
echo "sending: $packet"
AT_CHECK([ovn_trace --ovs "$packet" > ${s_az}-${d_az}-$i.ovn-trace])
@@ -4970,7 +8565,7 @@ index 55de7c85b..3515a1e3c 100644
ovs_inport=$(ovs-vsctl --bare --columns=ofport find Interface external-ids:iface-id="$ovn_inport")
ovs_packet=$(echo $packet | ovstest test-ovn expr-to-packets)
-@@ -26002,7 +26092,7 @@ for i in $(seq 5001 5010); do
+@@ -26002,7 +26437,7 @@ for i in $(seq 5001 5010); do
packet="inport==\"lsp11\" && eth.src==f0:00:00:00:01:11 && eth.dst==00:00:00:01:01:01 &&
ip4 && ip.ttl==64 && ip4.src==192.168.1.11 && ip4.dst==10.0.0.123 &&
tcp && tcp.src==$i && tcp.dst==80"
@@ -4979,7 +8574,7 @@ index 55de7c85b..3515a1e3c 100644
for j in 1 2; do
# Assume all packets go to lsp2${j}.
-@@ -26121,7 +26211,7 @@ wait_for_ports_up
+@@ -26121,7 +26556,7 @@ wait_for_ports_up
# Test 1
packet="inport==\"lsp11\" && eth.src==f0:00:00:00:01:11 && eth.dst==00:00:00:01:01:01 &&
ip4 && ip.ttl==64 && ip4.src==192.168.1.11 && ip4.dst==2.2.2.2 && icmp"
@@ -4988,7 +8583,7 @@ index 55de7c85b..3515a1e3c 100644
# Assume no packets go neither to lsp21 nor to lsp22.
> expected_lsp21
-@@ -26151,7 +26241,7 @@ done
+@@ -26151,7 +26586,7 @@ done
# Test 2
packet="inport==\"lsp11\" && eth.src==f0:00:00:00:01:11 && eth.dst==00:00:00:01:01:01 &&
ip4 && ip.ttl==64 && ip4.src==192.168.1.11 && ip4.dst==1.1.1.1 && icmp"
@@ -4997,7 +8592,7 @@ index 55de7c85b..3515a1e3c 100644
# Assume all packets go to lsp22.
exp_packet="eth.src==00:00:00:01:02:01 && eth.dst==f0:00:00:00:02:22 &&
-@@ -26181,7 +26271,7 @@ done
+@@ -26181,7 +26616,7 @@ done
# Test 3
packet="inport==\"lsp21\" && eth.src==f0:00:00:00:02:21 && eth.dst==00:00:00:01:02:01 &&
ip4 && ip.ttl==64 && ip4.src==192.168.2.21 && ip4.dst==2.2.2.2 && icmp"
@@ -5006,7 +8601,7 @@ index 55de7c85b..3515a1e3c 100644
# Assume all packets go to lsp21.
exp_packet="eth.src==00:00:00:01:02:01 && eth.dst==f0:00:00:00:02:21 &&
-@@ -26278,7 +26368,7 @@ wait_for_ports_up
+@@ -26278,7 +26713,7 @@ wait_for_ports_up
# test 1
packet="inport==\"lsp11\" && eth.src==f0:00:00:00:01:11 && eth.dst==00:00:00:01:01:01 &&
ip4 && ip.ttl==64 && ip4.src==192.168.1.11 && ip4.dst==192.168.2.21 && icmp"
@@ -5015,7 +8610,7 @@ index 55de7c85b..3515a1e3c 100644
# Assume all packets go to lsp21.
exp_packet="eth.src==00:00:00:01:02:01 && eth.dst==f0:00:00:00:02:21 && ip4 &&
-@@ -26312,7 +26402,7 @@ ovs-vsctl set interface hv1-vif2 options:tx_pcap=hv1/vif2-tx.pcap
+@@ -26312,7 +26747,7 @@ ovs-vsctl set interface hv1-vif2 options:tx_pcap=hv1/vif2-tx.pcap
# test 2
packet="inport==\"lsp11\" && eth.src==f0:00:00:00:01:11 && eth.dst==00:00:00:01:01:01 &&
ip4 && ip.ttl==64 && ip4.src==192.168.1.11 && ip4.dst==192.168.2.200 && icmp"
@@ -5024,7 +8619,7 @@ index 55de7c85b..3515a1e3c 100644
# Assume all packets go to lsp11.
exp_packet="eth.src==00:00:00:01:01:01 && eth.dst==f0:00:00:00:01:11 && ip4 &&
-@@ -26417,7 +26507,7 @@ for i in $(seq 1 2); do
+@@ -26417,7 +26852,7 @@ for i in $(seq 1 2); do
packet="inport==\"lsp${i}1\" && eth.src==f0:00:00:00:0${i}:1${i} &&
eth.dst==00:00:00:01:0${i}:01 && ip4 && ip.ttl==64 &&
ip4.src==192.168.${i}.${i}1 && ip4.dst==10.0.0.1 && icmp"
@@ -5033,7 +8628,7 @@ index 55de7c85b..3515a1e3c 100644
# Assume all packets go to lsp${di}1.
exp_packet="eth.src==00:00:00:01:0${di}:01 && eth.dst==f0:00:00:00:0${di}:1${di} &&
-@@ -26530,7 +26620,7 @@ for i in $(seq 1 2); do
+@@ -26530,7 +26965,7 @@ for i in $(seq 1 2); do
packet="inport==\"lsp${i}1\" && eth.src==f0:00:00:00:0${i}:1${i} &&
eth.dst==00:00:00:01:0${i}:01 && ip6 && ip.ttl==64 &&
ip6.src==2001:db8:${i}::${i}1 && ip6.dst==2001:db8:2000::1 && icmp6"
@@ -5042,7 +8637,7 @@ index 55de7c85b..3515a1e3c 100644
# Assume all packets go to lsp${di}1.
exp_packet="eth.src==00:00:00:01:0${di}:01 && eth.dst==f0:00:00:00:0${di}:1${di} && ip6 &&
-@@ -26650,7 +26740,7 @@ dst_ip=172.16.1.11
+@@ -26650,7 +27085,7 @@ dst_ip=172.16.1.11
packet="inport==\"lsp11\" && eth.src==$src_mac && eth.dst==$dst_mac &&
ip4 && ip.ttl==64 && ip4.src==$src_ip && ip4.dst==$dst_ip &&
udp && udp.src==53 && udp.dst==4369"
@@ -5051,7 +8646,7 @@ index 55de7c85b..3515a1e3c 100644
# Check if the packet hit the forwarding group policy
AT_CAPTURE_FILE([offlows2])
-@@ -27173,7 +27263,7 @@ ovn_attach n1 br-phys 192.168.0.1
+@@ -27173,7 +27608,7 @@ ovn_attach n1 br-phys 192.168.0.1
# Chassis hv1 should add flows for the ls1 datapath in table 8 (ls_in_port_sec_l2).
dp_key=$(ovn-sbctl --bare --columns tunnel_key list Datapath_Binding ls1)
@@ -5060,7 +8655,7 @@ index 55de7c85b..3515a1e3c 100644
OVN_CLEANUP([hv1])
AT_CLEANUP
-@@ -27199,7 +27289,7 @@ ovs-vsctl add-br br-phys
+@@ -27199,7 +27634,7 @@ ovs-vsctl add-br br-phys
ovn_attach n1 br-phys 192.168.0.1
# Port_Binding should be released.
@@ -5069,7 +8664,7 @@ index 55de7c85b..3515a1e3c 100644
OVN_CLEANUP([hv1])
AT_CLEANUP
-@@ -27332,22 +27422,24 @@ sleep 5
+@@ -27332,22 +27767,24 @@ sleep 5
send_ipv4_pkt() {
local hv=$1 inport=$2 eth_src=$3 eth_dst=$4
local ip_src=$5 ip_dst=$6
@@ -5099,7 +8694,7 @@ index 55de7c85b..3515a1e3c 100644
AT_CAPTURE_FILE([offlows2])
OVS_WAIT_UNTIL([
-@@ -27364,7 +27456,8 @@ AT_CHECK([
+@@ -27364,7 +27801,8 @@ AT_CHECK([
# Send the pkt from sw0-port2. Packet should not be marked.
send_ipv4_pkt hv1 hv1-vif2 505400000004 00000000ff01 \
@@ -5109,7 +8704,7 @@ index 55de7c85b..3515a1e3c 100644
AT_CHECK([
test 1 -eq $(as hv1 ovs-ofctl dump-flows br-phys table=0 | \
-@@ -27398,7 +27491,8 @@ AT_CHECK([
+@@ -27398,7 +27836,8 @@ AT_CHECK([
ovn-nbctl set logical_router_policy $pol1 options:pkt_mark=2
send_ipv4_pkt hv1 hv1-vif1 505400000003 00000000ff01 \
@@ -5119,7 +8714,7 @@ index 55de7c85b..3515a1e3c 100644
OVS_WAIT_UNTIL([
test 1 -eq $(as hv1 ovs-ofctl dump-flows br-int table=23 | \
-@@ -27431,7 +27525,8 @@ AT_CHECK([
+@@ -27431,7 +27870,8 @@ AT_CHECK([
# Send with src ip 10.0.0.5. The reroute policy should be hit
# and the packet should be marked with 5.
send_ipv4_pkt hv1 hv1-vif1 505400000003 00000000ff01 \
@@ -5129,7 +8724,7 @@ index 55de7c85b..3515a1e3c 100644
OVS_WAIT_UNTIL([
test 1 -eq $(as hv1 ovs-ofctl dump-flows br-phys table=0 | \
-@@ -27443,7 +27538,7 @@ OVS_WAIT_UNTIL([
+@@ -27443,7 +27883,7 @@ OVS_WAIT_UNTIL([
src_ip6=aef00000000000000000000000000004
dst_ip6=bef00000000000000000000000000004
@@ -5138,7 +8733,7 @@ index 55de7c85b..3515a1e3c 100644
OVS_WAIT_UNTIL([
test 1 -eq $(as hv1 ovs-ofctl dump-flows br-phys table=0 | \
-@@ -27463,7 +27558,7 @@ AT_CHECK([
+@@ -27463,7 +27903,7 @@ AT_CHECK([
src_ip6=aef00000000000000000000000000004
dst_ip6=bef00000000000000000000000000005
@@ -5147,7 +8742,64 @@ index 55de7c85b..3515a1e3c 100644
OVS_WAIT_UNTIL([
test 1 -eq $(as hv1 ovs-ofctl dump-flows br-phys table=0 | \
-@@ -28737,7 +28832,7 @@ src_mac="f00000000102"
+@@ -27970,22 +28410,22 @@ AT_CHECK([test ! -z $p1_zoneid])
+ p2_zoneid=$(as hv1 ovs-vsctl get bridge br-int external_ids:ct-zone-sw0-p2 | sed 's/"//g')
+ AT_CHECK([test ! -z $p2_zoneid])
+
+-AT_CHECK([test $(ovs-ofctl dump-flows br-int table=38,metadata=${sw0_dpkey},\
++AT_CHECK([test $(ovs-ofctl dump-flows br-int table=40,metadata=${sw0_dpkey},\
+ reg15=0x${p1_dpkey} | grep REG13 | wc -l) -eq 1])
+
+-AT_CHECK([test $(ovs-ofctl dump-flows br-int table=38,metadata=${sw0_dpkey},\
++AT_CHECK([test $(ovs-ofctl dump-flows br-int table=40,metadata=${sw0_dpkey},\
+ reg15=0x${p1_dpkey} | grep "load:0x${p1_zoneid}->NXM_NX_REG13" | wc -l) -eq 1])
+
+-AT_CHECK([test $(ovs-ofctl dump-flows br-int table=38,metadata=${sw1_dpkey},\
++AT_CHECK([test $(ovs-ofctl dump-flows br-int table=40,metadata=${sw1_dpkey},\
+ reg15=0x${p2_dpkey} | grep REG13 | wc -l) -eq 1])
+
+-AT_CHECK([test $(ovs-ofctl dump-flows br-int table=38,metadata=${sw1_dpkey},\
++AT_CHECK([test $(ovs-ofctl dump-flows br-int table=40,metadata=${sw1_dpkey},\
+ reg15=0x${p2_dpkey} | grep "load:0x${p2_zoneid}->NXM_NX_REG13" | wc -l) -eq 1])
+
+ ovs-vsctl set interface hv1-vif1 external_ids:iface-id=foo
+ OVS_WAIT_UNTIL([test x$(ovn-nbctl lsp-get-up sw0-p1) = xdown])
+
+-AT_CHECK([test $(ovs-ofctl dump-flows br-int table=38,metadata=${sw0_dpkey},\
++AT_CHECK([test $(ovs-ofctl dump-flows br-int table=40,metadata=${sw0_dpkey},\
+ reg15=0x${p1_dpkey} | grep REG13 | wc -l) -eq 0])
+
+ p1_zoneid=$(as hv1 ovs-vsctl get bridge br-int external_ids:ct-zone-sw0-p1 | sed 's/"//g')
+@@ -27997,16 +28437,16 @@ OVS_WAIT_UNTIL([test x$(ovn-nbctl lsp-get-up sw0-p1) = xup])
+ p1_zoneid=$(as hv1 ovs-vsctl get bridge br-int external_ids:ct-zone-sw0-p1 | sed 's/"//g')
+ AT_CHECK([test ! -z $p1_zoneid])
+
+-AT_CHECK([test $(ovs-ofctl dump-flows br-int table=38,metadata=${sw0_dpkey},\
++AT_CHECK([test $(ovs-ofctl dump-flows br-int table=40,metadata=${sw0_dpkey},\
+ reg15=0x${p1_dpkey} | grep REG13 | wc -l) -eq 1])
+
+-AT_CHECK([test $(ovs-ofctl dump-flows br-int table=38,metadata=${sw0_dpkey},\
++AT_CHECK([test $(ovs-ofctl dump-flows br-int table=40,metadata=${sw0_dpkey},\
+ reg15=0x${p1_dpkey} | grep "load:0x${p1_zoneid}->NXM_NX_REG13" | wc -l) -eq 1])
+
+ ovs-vsctl del-port hv1-vif2
+ OVS_WAIT_UNTIL([test x$(ovn-nbctl lsp-get-up sw0-p2) = xdown])
+
+-AT_CHECK([test $(ovs-ofctl dump-flows br-int table=38,metadata=${sw0_dpkey},\
++AT_CHECK([test $(ovs-ofctl dump-flows br-int table=40,metadata=${sw0_dpkey},\
+ reg15=0x${p2_dpkey} | grep REG13 | wc -l) -eq 0])
+
+ p2_zoneid=$(as hv1 ovs-vsctl get bridge br-int external_ids:ct-zone-sw0-p2 | sed 's/"//g')
+@@ -28014,7 +28454,7 @@ AT_CHECK([test -z $p2_zoneid])
+
+ ovn-nbctl lsp-del sw0-p1
+
+-OVS_WAIT_UNTIL([test $(ovs-ofctl dump-flows br-int table=38,metadata=${sw0_dpkey},\
++OVS_WAIT_UNTIL([test $(ovs-ofctl dump-flows br-int table=40,metadata=${sw0_dpkey},\
+ reg15=0x${p1_dpkey} | grep REG13 | wc -l) -eq 0])
+
+ p1_zoneid=$(as hv1 ovs-vsctl get bridge br-int external_ids:ct-zone-sw0-p1 | sed 's/"//g')
+@@ -28737,7 +29177,7 @@ src_mac="f00000000102"
dst_mac="000000000101"
src_ip=`ip_to_hex 10 0 1 2`
dst_ip=`ip_to_hex 10 0 1 1`
@@ -5156,7 +8808,7 @@ index 55de7c85b..3515a1e3c 100644
as hv1 ovs-appctl netdev-dummy/receive hv1-vif1 $packet
# Even after configuring a router owned IP for SNAT, no packet-ins should
-@@ -28763,7 +28858,7 @@ src_mac="f00000000202"
+@@ -28763,7 +29203,7 @@ src_mac="f00000000202"
dst_mac="000000000201"
src_ip=`ip_to_hex 10 0 2 2`
dst_ip=`ip_to_hex 10 0 1 1`
@@ -5165,7 +8817,7 @@ index 55de7c85b..3515a1e3c 100644
as hv1 ovs-appctl netdev-dummy/receive hv1-vif2 $packet
# Still no packet-ins should reach ovn-controller.
-@@ -29548,7 +29643,9 @@ OVS_WAIT_UNTIL([test x$(ovn-nbctl lsp-get-up sw1-p1) = xup])
+@@ -29548,7 +29988,9 @@ OVS_WAIT_UNTIL([test x$(ovn-nbctl lsp-get-up sw1-p1) = xup])
check ovn-nbctl lb-add lb-ipv4-tcp 88.88.88.88:8080 42.42.42.1:4041 tcp
check ovn-nbctl lb-add lb-ipv4-udp 88.88.88.88:4040 42.42.42.1:2021 udp
@@ -5175,7 +8827,7 @@ index 55de7c85b..3515a1e3c 100644
check ovn-nbctl --wait=hv lb-add lb-ipv6-udp [[8800::0088]]:4040 [[4200::1]]:2021 udp
AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=68 | grep -v NXST], [1], [dnl
-@@ -29839,6 +29936,119 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=70 | ofctl_strip_all | grep -
+@@ -29839,6 +30281,119 @@ AT_CHECK([as hv2 ovs-ofctl dump-flows br-int table=70 | ofctl_strip_all | grep -
table=70, priority=100,udp6,reg2=0xfc8/0xffff,reg4=0x88000000,reg5=0,reg6=0,reg7=0x88 actions=ct(commit,zone=NXM_NX_REG12[[0..15]],nat(src=8800::88))
])
@@ -5295,7 +8947,149 @@ index 55de7c85b..3515a1e3c 100644
# Check backwards compatibility with ovn-northd versions that don't store the
# original destination tuple.
#
-@@ -31743,7 +31953,7 @@ packet="inport==\"sw1-lp1\" && eth.src==00:00:04:01:02:03 &&
+@@ -30354,46 +30909,46 @@ AT_CHECK([kill -0 $(cat hv1/ovn-controller.pid)])
+ check ovn-nbctl --wait=hv sync
+
+ # Check OVS flows are installed properly.
+-AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=44 | ofctl_strip_all | \
++AT_CHECK([as hv1 ovs-ofctl dump-flows br-int table=46 | ofctl_strip_all | \
+ grep "priority=2002" | grep conjunction | \
+ sed 's/conjunction([[^)]]*)/conjunction()/g' | \
+ sed 's/reg15=0x[[1-9]]/reg15=0xN/g' | sort], [0], [dnl
+- table=44, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x10/0xfff0 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x100/0xff00 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x1000/0xf000 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x2/0xfffe actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x20/0xffe0 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x200/0xfe00 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x2000/0xe000 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x4/0xfffc actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x40/0xffc0 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x400/0xfc00 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x4000/0xc000 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x8/0xfff8 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x80/0xff80 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x800/0xf800 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x8000/0x8000 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=1 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,reg15=0xN,metadata=0x1,nw_src=192.168.47.4 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x100/0x100,reg15=0xN,metadata=0x1,nw_src=192.168.47.4 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x10/0xfff0 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x100/0xff00 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x1000/0xf000 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x2/0xfffe actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x20/0xffe0 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x200/0xfe00 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x2000/0xe000 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x4/0xfffc actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x40/0xffc0 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x400/0xfc00 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x4000/0xc000 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x8/0xfff8 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x80/0xff80 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x800/0xf800 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x8000/0x8000 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=1 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,reg15=0xN,metadata=0x1,nw_src=192.168.47.4 actions=conjunction()
+- table=44, priority=2002,udp,reg0=0x80/0x80,reg15=0xN,metadata=0x1,nw_src=192.168.47.4 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x10/0xfff0 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x100/0xff00 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x1000/0xf000 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x2/0xfffe actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x20/0xffe0 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x200/0xfe00 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x2000/0xe000 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x4/0xfffc actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x40/0xffc0 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x400/0xfc00 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x4000/0xc000 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x8/0xfff8 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x80/0xff80 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x800/0xf800 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x8000/0x8000 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,metadata=0x1,nw_src=192.168.47.4,tp_dst=1 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,reg15=0xN,metadata=0x1,nw_src=192.168.47.4 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x100/0x100,reg15=0xN,metadata=0x1,nw_src=192.168.47.4 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x10/0xfff0 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x100/0xff00 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x1000/0xf000 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x2/0xfffe actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x20/0xffe0 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x200/0xfe00 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x2000/0xe000 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x4/0xfffc actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x40/0xffc0 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x400/0xfc00 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x4000/0xc000 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x8/0xfff8 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x80/0xff80 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x800/0xf800 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=0x8000/0x8000 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,metadata=0x1,nw_src=192.168.47.4,tp_dst=1 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,reg15=0xN,metadata=0x1,nw_src=192.168.47.4 actions=conjunction()
++ table=46, priority=2002,udp,reg0=0x80/0x80,reg15=0xN,metadata=0x1,nw_src=192.168.47.4 actions=conjunction()
+ ])
+
+ OVN_CLEANUP([hv1])
+@@ -31568,7 +32123,7 @@ ovs-vsctl add-port br-int lsp0-0 -- set interface lsp0-0 external_ids:iface-id=l
+ ovs-vsctl add-port br-int lsp0-1 -- set interface lsp0-1 external_ids:iface-id=lsp0-1
+
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK([test $(ovs-ofctl dump-flows br-int table=44 | grep conjunction | wc -l) == 22])
++AT_CHECK([test $(ovs-ofctl dump-flows br-int table=46 | grep conjunction | wc -l) == 22])
+
+ # Save the current lflow_run counter
+ lflow_run=$(ovn-appctl -t ovn-controller coverage/read-counter lflow_run)
+@@ -31578,7 +32133,7 @@ lflow_run=$(ovn-appctl -t ovn-controller coverage/read-counter lflow_run)
+ # 1. Remove half of the ports from pg1. The excepted conjunction flows should be:
+ # 2 + 10 = 12
+ check ovn-nbctl --wait=hv pg-set-ports pg1 $(for i in 0 1 2 3 4; do for j in 0 1; do echo lsp${i}-${j}; done; done)
+-AT_CHECK([test $(ovs-ofctl dump-flows br-int table=44 | grep conjunction | wc -l) == 12])
++AT_CHECK([test $(ovs-ofctl dump-flows br-int table=46 | grep conjunction | wc -l) == 12])
+
+ # 2. Unbind lsp0-0. The there shouldn't be any conjunction flows because the
+ # port group const set should have only one member (lsp0-1). And the total
+@@ -31586,25 +32141,25 @@ AT_CHECK([test $(ovs-ofctl dump-flows br-int table=44 | grep conjunction | wc -l
+ # 10.
+ ovs-vsctl del-port br-int lsp0-0
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK([test $(ovs-ofctl dump-flows br-int table=44 | grep conjunction | wc -l) == 0])
+-AT_CHECK([test $(ovs-ofctl dump-flows br-int table=44 | grep 192.168 | wc -l) == 10])
++AT_CHECK([test $(ovs-ofctl dump-flows br-int table=46 | grep conjunction | wc -l) == 0])
++AT_CHECK([test $(ovs-ofctl dump-flows br-int table=46 | grep 192.168 | wc -l) == 10])
+
+ # 3. Rebind lsp0-0. The expected conjunction flows are back to 12.
+ ovs-vsctl add-port br-int lsp0-0 -- set interface lsp0-0 external_ids:iface-id=lsp0-0
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK([test $(ovs-ofctl dump-flows br-int table=44 | grep conjunction | wc -l) == 12])
++AT_CHECK([test $(ovs-ofctl dump-flows br-int table=46 | grep conjunction | wc -l) == 12])
+
+ # 4. Bind a lsp (lsp9-0) that doesn't belong to pg1, should not see any change.
+ ovs-vsctl add-port br-int lsp9-0 -- set interface lsp9-0 external_ids:iface-id=lsp9-0
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK([test $(ovs-ofctl dump-flows br-int table=44 | grep conjunction | wc -l) == 12])
++AT_CHECK([test $(ovs-ofctl dump-flows br-int table=46 | grep conjunction | wc -l) == 12])
+
+ # 5. Bind another 2 lsps (lsp1-0 lsp1-1) that belong to pg1 and on a different
+ # LS (ls1), should see conjunction flows doubled (12 x 2 = 24)
+ ovs-vsctl add-port br-int lsp1-0 -- set interface lsp1-0 external_ids:iface-id=lsp1-0
+ ovs-vsctl add-port br-int lsp1-1 -- set interface lsp1-1 external_ids:iface-id=lsp1-1
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK([test $(ovs-ofctl dump-flows br-int table=44 | grep conjunction | wc -l) == 24])
++AT_CHECK([test $(ovs-ofctl dump-flows br-int table=46 | grep conjunction | wc -l) == 24])
+
+ # 6. Simulate a SB port-group "del and add" notification to ovn-controller in the
+ # same IDL iteration. ovn-controller should still program the same flows. In
+@@ -31629,7 +32184,7 @@ for i in $(seq 1 10); do
+ check ovn-nbctl --wait=hv sync
+
+ # Finally check flow count is the same as before.
+- AT_CHECK([test $(ovs-ofctl dump-flows br-int table=44 | grep conjunction | wc -l) == 24])
++ AT_CHECK([test $(ovs-ofctl dump-flows br-int table=46 | grep conjunction | wc -l) == 24])
+ done
+
+ # Make sure all the above was performed with I-P (no recompute)
+@@ -31743,7 +32298,7 @@ packet="inport==\"sw1-lp1\" && eth.src==00:00:04:01:02:03 &&
ip4.src==10.0.0.100 && ip4.dst==20.0.0.200 &&
udp && udp.src==53 && udp.dst==4369"
@@ -5304,7 +9098,7 @@ index 55de7c85b..3515a1e3c 100644
# Check if packet hit the drop rule
AT_CHECK([ovs-ofctl dump-flows br-int | grep "nw_dst=20.0.0.0/24" | \
-@@ -31770,7 +31980,7 @@ packet="inport==\"sw1-lp1\" && eth.src==00:00:04:01:02:03 &&
+@@ -31770,7 +32325,7 @@ packet="inport==\"sw1-lp1\" && eth.src==00:00:04:01:02:03 &&
ip4.src==10.0.0.100 && ip4.dst==20.0.0.200 &&
udp && udp.src==53 && udp.dst==4369"
@@ -5313,7 +9107,7 @@ index 55de7c85b..3515a1e3c 100644
# Check if packet hit the drop rule
AT_CHECK([ovs-ofctl dump-flows br-int "nw_src=10.0.0.0/24" | \
-@@ -31857,7 +32067,7 @@ packet="inport==\"ls1-lp1\" && eth.src==$ls1_p1_mac && eth.dst==$bcast_mac &&
+@@ -31857,7 +32412,7 @@ packet="inport==\"ls1-lp1\" && eth.src==$ls1_p1_mac && eth.dst==$bcast_mac &&
arp.op==1 && arp.sha==$ls1_p1_mac && arp.spa==$ls1_p1_ip &&
arp.tha==$bcast_mac && arp.tpa==$proxy_ip1"
@@ -5322,7 +9116,53 @@ index 55de7c85b..3515a1e3c 100644
as hv1 ovs-ofctl dump-flows br-int| grep 169.254.239.254 | grep priority=50 > debug1
AT_CAPTURE_FILE([debug1])
-@@ -32108,7 +32318,6 @@ ovn-nbctl lrp-set-gateway-chassis DR-S3 hv4
+@@ -31916,8 +32471,8 @@ check ovn-nbctl acl-add lsw0 to-lport 1002 'outport == "lp2" && ip4.src == 10.0.
+
+ # The first ACL should be programmed, but the second one shouldn't.
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10.0.0.111], [0], [ignore])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10.0.0.122], [1], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10.0.0.111], [0], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10.0.0.122], [1], [ignore])
+
+ # Now create the lport lp2.
+ check ovn-nbctl lsp-add lsw0 lp2 \
+@@ -31925,12 +32480,12 @@ check ovn-nbctl lsp-add lsw0 lp2 \
+
+ check ovn-nbctl --wait=hv sync
+ # Now the second ACL should be programmed.
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10.0.0.122], [0], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10.0.0.122], [0], [ignore])
+
+ # Remove the lport lp2 again, the OVS flow for the second ACL should be
+ # removed.
+ check ovn-nbctl --wait=hv lsp-del lp2
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10.0.0.122], [1], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10.0.0.122], [1], [ignore])
+
+ # Test similar scenario but when the referenced lport is not bound locally.
+
+@@ -31944,8 +32499,8 @@ check ovn-nbctl acl-add lsw0 to-lport 1002 'inport == "lp4" && ip4.dst == 10.0.0
+
+ # The ACL for lp3 should be programmed, but the one for lp4 shouldn't.
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10.0.0.133], [0], [ignore])
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10.0.0.144], [1], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10.0.0.133], [0], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10.0.0.144], [1], [ignore])
+
+ # Now create the lport lp4.
+ check ovn-nbctl lsp-add lsw0 lp4 \
+@@ -31953,7 +32508,7 @@ check ovn-nbctl lsp-add lsw0 lp4 \
+
+ # Now the ACL for lp4 should be programmed.
+ check ovn-nbctl --wait=hv sync
+-AT_CHECK([ovs-ofctl dump-flows br-int table=44 | grep 10.0.0.144], [0], [ignore])
++AT_CHECK([ovs-ofctl dump-flows br-int table=46 | grep 10.0.0.144], [0], [ignore])
+
+ OVN_CLEANUP([hv1])
+ AT_CLEANUP
+@@ -32108,7 +32663,6 @@ ovn-nbctl lrp-set-gateway-chassis DR-S3 hv4
ovn-nbctl --wait=sb sync
OVN_POPULATE_ARP
@@ -5330,7 +9170,7 @@ index 55de7c85b..3515a1e3c 100644
vif_to_ls () {
case ${1} in dnl (
vif?[[11]]) echo ls ;; dnl (
-@@ -32222,6 +32431,9 @@ echo "Send Dummy ARP"
+@@ -32222,6 +32776,9 @@ echo "Send Dummy ARP"
sip=`ip_to_hex 172 16 1 10`
tip=`ip_to_hex 172 16 1 50`
test_arp vif-north1 f0f000000011 $sip $tip
@@ -5340,7 +9180,7 @@ index 55de7c85b..3515a1e3c 100644
echo "Send traffic North to South"
sip=`ip_to_hex 172 16 1 10`
-@@ -32242,6 +32454,9 @@ echo "Send Dummy ARP"
+@@ -32242,6 +32799,9 @@ echo "Send Dummy ARP"
sip=`ip_to_hex 10 0 0 10`
tip=`ip_to_hex 10 0 0 50`
test_arp vif-north2 f0f000000022 $sip $tip
@@ -5350,7 +9190,7 @@ index 55de7c85b..3515a1e3c 100644
echo "Send traffic South to North2"
sip=`ip_to_hex 20 0 0 10`
-@@ -32255,6 +32470,9 @@ echo "Send Dummy ARP"
+@@ -32255,6 +32815,9 @@ echo "Send Dummy ARP"
sip=`ip_to_hex 192 168 0 10`
tip=`ip_to_hex 192 168 0 50`
test_arp vif-north3 f0f000000033 $sip $tip
@@ -5360,7 +9200,24 @@ index 55de7c85b..3515a1e3c 100644
echo "Send traffic South to North3"
sip=`ip_to_hex 20 0 0 10`
-@@ -34926,7 +35144,8 @@ check ovs-vsctl add-port br-int p1 -- set interface p1 external_ids:iface-id=lsp
+@@ -33384,7 +33947,7 @@ check ovn-nbctl --wait=hv sync
+ # Use constants so that if tables or registers change, this test can
+ # be updated easily.
+ DNAT_TABLE=15
+-SNAT_TABLE=43
++SNAT_TABLE=45
+ DNAT_ZONE_REG="NXM_NX_REG11[[0..15]]"
+ SNAT_ZONE_REG="NXM_NX_REG12[[0..15]]"
+
+@@ -33929,6 +34492,7 @@ m4_define([MULTIPLE_OVS_INT],
+ ovs-ofctl dump-flows br-int | grep $cookie |
+ sed -e 's/duration=[[0-9.]]*s, //g' |
+ sed -e 's/idle_age=[[0-9]]*, //g' |
++ sed -e 's/hard_age=[[0-9]]*, //g' |
+ sed -e 's/n_packets=[[0-9]]*, //g' |
+ sed -e 's/n_bytes=[[0-9]]*, //g'
+ }
+@@ -34926,7 +35490,8 @@ check ovs-vsctl add-port br-int p1 -- set interface p1 external_ids:iface-id=lsp
wait_for_ports_up
ovn-nbctl --wait=hv sync
@@ -5370,7 +9227,7 @@ index 55de7c85b..3515a1e3c 100644
check ovn-nbctl ls-lb-add sw lb1
# Remove a single backend
-@@ -34949,7 +35168,8 @@ AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.0.10:0, backend=192.168.
+@@ -34949,7 +35514,8 @@ AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.0.10:0, backend=192.168.
AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.0.10:0, backend=192.168.10.30:0, protocol=0" hv1/ovn-controller.log], [0])
# Check flush for LB with port and protocol
@@ -5380,7 +9237,7 @@ index 55de7c85b..3515a1e3c 100644
check ovn-nbctl ls-lb-add sw lb1
check ovn-nbctl lb-del lb1
check ovn-nbctl --wait=hv sync
-@@ -34958,7 +35178,8 @@ AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.30.10:80, backend=192.16
+@@ -34958,7 +35524,8 @@ AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.30.10:80, backend=192.16
AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.30.10:80, backend=192.168.40.20:8090, protocol=17" hv1/ovn-controller.log], [0])
# Check recompute when LB is no longer local
@@ -5390,7 +9247,7 @@ index 55de7c85b..3515a1e3c 100644
check ovn-nbctl ls-lb-add sw lb1
check ovs-vsctl remove interface p1 external_ids iface-id
check ovn-appctl inc-engine/recompute
-@@ -34968,6 +35189,193 @@ AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.50.10:80, backend=192.16
+@@ -34968,6 +35535,193 @@ AT_CHECK([grep -q "Flushing CT for 5-tuple: vip=192.168.50.10:80, backend=192.16
AT_CHECK([test "$(grep -c "Flushing CT for 5-tuple" hv1/ovn-controller.log)" = "6"], [0])
@@ -5684,9 +9541,18 @@ index d65f359a6..b8c5ae9ad 100644
# NETNS_DAEMONIZE([namespace], [command], [pidfile])
#
diff --git a/tests/system-ovn-kmod.at b/tests/system-ovn-kmod.at
-index dd4996041..3c3e5bc61 100644
+index dd4996041..a1aee3313 100644
--- a/tests/system-ovn-kmod.at
+++ b/tests/system-ovn-kmod.at
+@@ -172,7 +172,7 @@ ovn-nbctl set load_balancer $uuid vips:'"30.0.0.2:8000"'='"192.168.1.2:12345,192
+
+ ovn-nbctl list load_balancer
+ ovn-sbctl dump-flows R2
+-OVS_WAIT_UNTIL([ovs-ofctl -O OpenFlow13 dump-flows br-int table=41 | \
++OVS_WAIT_UNTIL([ovs-ofctl -O OpenFlow13 dump-flows br-int table=43 | \
+ grep 'nat(src=20.0.0.2)'])
+
+ dnl Test load-balancing that includes L4 ports in NAT.
@@ -215,3 +215,139 @@ as
OVS_TRAFFIC_VSWITCHD_STOP(["/failed to query port patch-.*/d
/connection dropped.*/d"])
@@ -5828,7 +9694,7 @@ index dd4996041..3c3e5bc61 100644
+AT_CLEANUP
+])
diff --git a/tests/system-ovn.at b/tests/system-ovn.at
-index 84a459d6a..40f808515 100644
+index 84a459d6a..0b6e9f602 100644
--- a/tests/system-ovn.at
+++ b/tests/system-ovn.at
@@ -1569,7 +1569,6 @@ bar3_ct=$(ovs-appctl dpctl/dump-conntrack | grep 30.0.0.2 | grep 172.16.1.4 -c)
@@ -5859,6 +9725,24 @@ index 84a459d6a..40f808515 100644
else
AT_CHECK([test $bar3_ct -eq 0])
fi
+@@ -2246,7 +2243,7 @@ ovn-nbctl set load_balancer $uuid vips:'"30.0.0.2:8000"'='"192.168.1.2:80,192.16
+
+ ovn-nbctl list load_balancer
+ ovn-sbctl dump-flows R2
+-OVS_WAIT_UNTIL([ovs-ofctl -O OpenFlow13 dump-flows br-int table=43 | \
++OVS_WAIT_UNTIL([ovs-ofctl -O OpenFlow13 dump-flows br-int table=45 | \
+ grep 'nat(src=20.0.0.2)'])
+
+ check ovs-appctl dpctl/flush-conntrack
+@@ -2285,7 +2282,7 @@ ovn-nbctl set load_balancer $uuid vips:'"30.0.0.2:8000"'='"192.168.1.2:80,192.16
+
+ ovn-nbctl list load_balancer
+ ovn-sbctl dump-flows R2
+-OVS_WAIT_UNTIL([ovs-ofctl -O OpenFlow13 dump-flows br-int table=43 | \
++OVS_WAIT_UNTIL([ovs-ofctl -O OpenFlow13 dump-flows br-int table=45 | \
+ grep 'nat(src=20.0.0.2)'])
+
+ rm -f wget*.log
@@ -4850,9 +4847,9 @@ NS_CHECK_EXEC([lsp], [tcpdump -l -nn -c 3 -i lsp ${filter} > lsp.pcap 2>tcpdump_
OVS_WAIT_UNTIL([grep "listening" tcpdump_err])
@@ -5885,6 +9769,24 @@ index 84a459d6a..40f808515 100644
# Check hairpin traffic.
OVS_WAIT_UNTIL([
+@@ -5084,7 +5081,7 @@ OVS_WAIT_UNTIL([
+ ])
+
+ OVS_WAIT_UNTIL([
+- n_pkt=$(ovs-ofctl dump-flows br-int table=44 | grep -v n_packets=0 | \
++ n_pkt=$(ovs-ofctl dump-flows br-int table=46 | grep -v n_packets=0 | \
+ grep controller | grep tp_dst=84 -c)
+ test $n_pkt -eq 1
+ ])
+@@ -5334,7 +5331,7 @@ OVS_WAIT_UNTIL([
+ ])
+
+ OVS_WAIT_UNTIL([
+- n_pkt=$(ovs-ofctl dump-flows br-int table=44 | grep -v n_packets=0 | \
++ n_pkt=$(ovs-ofctl dump-flows br-int table=46 | grep -v n_packets=0 | \
+ grep controller | grep tp_dst=84 -c)
+ test $n_pkt -eq 1
+ ])
@@ -7190,7 +7187,7 @@ NS_EXEC([sw01], [tcpdump -l -n -i sw01 icmp -Q in > reject.pcap &])
check ovn-nbctl --may-exist meter-add acl-meter drop 10 pktps 0
ip netns exec sw01 scapy -H <<-EOF
@@ -6146,7 +10048,7 @@ index 84a459d6a..40f808515 100644
OVS_WAIT_FOR_OUTPUT([
for i in `seq 1 20`; do
ip netns exec foo1 wget 30.0.0.2:8000 -t 5 -T 1 --retry-connrefused -v -o wget$i.log;
-@@ -10690,6 +10734,191 @@ check ovn-nbctl lb-del lb2
+@@ -10690,6 +10734,535 @@ check ovn-nbctl lb-del lb2
OVS_WAIT_UNTIL([test "$(ovs-appctl dpctl/dump-conntrack | FORMAT_CT(30.0.0.3) | wc -l)" = "0"])
@@ -6335,13 +10237,22 @@ index 84a459d6a..40f808515 100644
+ test "${total_icmp1_pkts}" -gt "${total_icmp_pkts}"
+])
+
- OVS_APP_EXIT_AND_WAIT([ovn-controller])
-
- as ovn-sb
-@@ -10706,3 +10935,605 @@ OVS_TRAFFIC_VSWITCHD_STOP(["/failed to query port patch-.*/d
- /connection dropped.*/d"])
- AT_CLEANUP
- ])
++OVS_APP_EXIT_AND_WAIT([ovn-controller])
++
++as ovn-sb
++OVS_APP_EXIT_AND_WAIT([ovsdb-server])
++
++as ovn-nb
++OVS_APP_EXIT_AND_WAIT([ovsdb-server])
++
++as northd
++OVS_APP_EXIT_AND_WAIT([NORTHD_TYPE])
++
++as
++OVS_TRAFFIC_VSWITCHD_STOP(["/failed to query port patch-.*/d
++/connection dropped.*/d"])
++AT_CLEANUP
++])
+
+# This tests port->up/down and ovn-installed after adding and removing Ports and Interfaces.
+# 3 Conditions x 3 tests:
@@ -6670,22 +10581,13 @@ index 84a459d6a..40f808515 100644
+check_ports_up
+check_ports_bound
+
-+OVS_APP_EXIT_AND_WAIT([ovn-controller])
-+
-+as ovn-sb
-+OVS_APP_EXIT_AND_WAIT([ovsdb-server])
-+
-+as ovn-nb
-+OVS_APP_EXIT_AND_WAIT([ovsdb-server])
-+
-+as northd
-+OVS_APP_EXIT_AND_WAIT([NORTHD_TYPE])
-+
-+as
-+OVS_TRAFFIC_VSWITCHD_STOP(["/failed to query port patch-.*/d
-+/connection dropped.*/d"])
-+AT_CLEANUP
-+])
+ OVS_APP_EXIT_AND_WAIT([ovn-controller])
+
+ as ovn-sb
+@@ -10706,3 +11279,338 @@ OVS_TRAFFIC_VSWITCHD_STOP(["/failed to query port patch-.*/d
+ /connection dropped.*/d"])
+ AT_CLEANUP
+ ])
+
+OVN_FOR_EACH_NORTHD([
+AT_SETUP([ovn mirroring])
@@ -6744,6 +10646,9 @@ index 84a459d6a..40f808515 100644
+ovn-nbctl mirror-add mirror0 gre 1 to-lport 172.16.0.100
+ovn-nbctl lsp-attach-mirror bar1 mirror0
+
++OVN_POPULATE_ARP
++check ovn-nbctl --wait=hv sync
++
+ADD_NAMESPACES(mirror)
+ADD_VETH(mirror, mirror, br-mirror, "2003::b/64", "f0:00:00:01:07:06", \
+ "2003::1", "nodad", "172.16.0.100/24", "172.16.0.1")
@@ -6767,7 +10672,8 @@ index 84a459d6a..40f808515 100644
+
+ovn-nbctl mirror-del mirror0
+ovn-nbctl mirror-add mirror1 gre 2 to-lport 2003::b
-+ovn-nbctl lsp-attach-mirror bar1 mirror1
++
++ovn-nbctl --wait=hv lsp-attach-mirror bar1 mirror1
+
+NS_CHECK_EXEC([mirror], [tcpdump -l -c 3 -neei mirror proto GRE > gre_mirror6.pcap 2>gre_mirror6_error &])
+OVS_WAIT_UNTIL([grep "listening" gre_mirror6_error])
@@ -6786,7 +10692,7 @@ index 84a459d6a..40f808515 100644
+
+ovn-nbctl mirror-del mirror1
+ovn-nbctl mirror-add mirror2 erspan 3 to-lport 172.16.0.100
-+ovn-nbctl lsp-attach-mirror bar1 mirror2
++ovn-nbctl --wait=hv lsp-attach-mirror bar1 mirror2
+
+NS_CHECK_EXEC([mirror], [tcpdump -l -c 3 -neei mirror ip[[22:2]]=0x88be > erspan_mirror4.pcap 2>erspan_mirror4_error &])
+OVS_WAIT_UNTIL([grep "listening" erspan_mirror4_error])
@@ -6804,7 +10710,7 @@ index 84a459d6a..40f808515 100644
+
+ovn-nbctl mirror-del mirror2
+ovn-nbctl mirror-add mirror3 erspan 4 to-lport 2003::b
-+ovn-nbctl lsp-attach-mirror bar1 mirror3
++ovn-nbctl --wait=hv lsp-attach-mirror bar1 mirror3
+
+NS_CHECK_EXEC([mirror], [tcpdump -l -c 3 -neei mirror ip6[[42:2]]=0x88be > erspan_mirror6.pcap 2>erspan_mirror6_error &])
+OVS_WAIT_UNTIL([grep "listening" erspan_mirror6_error])
@@ -6821,7 +10727,7 @@ index 84a459d6a..40f808515 100644
+killall tcpdump
+
+uuid=$(fetch_column nb:mirror _uuid name="mirror3")
-+ovn-nbctl set mirror $uuid type=gre
++ovn-nbctl --wait=hv set mirror $uuid type=gre
+
+NS_CHECK_EXEC([mirror], [tcpdump -c 3 -l -neei mirror proto GRE > gre_mirror6.pcap 2>gre_mirror6_error &])
+OVS_WAIT_UNTIL([grep "listening" gre_mirror6_error])
@@ -6944,6 +10850,79 @@ index 84a459d6a..40f808515 100644
+
+AT_CLEANUP
+])
++
++OVN_FOR_EACH_NORTHD([
++AT_SETUP([Traffic to router port via LLA])
++ovn_start
++OVS_TRAFFIC_VSWITCHD_START()
++ADD_BR([br-int])
++ADD_BR([br-phys], [set Bridge br-phys fail-mode=standalone])
++
++# Set external-ids in br-int needed for ovn-controller
++ovs-vsctl \
++ -- set Open_vSwitch . external-ids:system-id=hv1 \
++ -- set Open_vSwitch . external-ids:ovn-remote=unix:$ovs_base/ovn-sb/ovn-sb.sock \
++ -- set Open_vSwitch . external-ids:ovn-encap-type=geneve \
++ -- set Open_vSwitch . external-ids:ovn-encap-ip=169.0.0.1 \
++ -- set bridge br-int fail-mode=secure other-config:disable-in-band=true
++
++start_daemon ovn-controller
++
++check ovn-nbctl lr-add lr0
++check ovn-nbctl lrp-add lr0 lr0-ls0 00:00:00:00:00:01 fd00::1/64
++
++check ovn-nbctl ls-add ls0
++check ovn-nbctl lsp-add ls0 vif0 \
++ -- lsp-set-addresses vif0 "00:00:00:00:00:02 fd00::2"
++check ovn-nbctl lsp-add ls0 ls0-lr0 \
++ -- lsp-set-type ls0-lr0 router \
++ -- lsp-set-addresses ls0-lr0 router \
++ -- lsp-set-options ls0-lr0 router-port=lr0-ls0
++
++ADD_NAMESPACES(vif0)
++ADD_VETH(vif0, vif0, br-int, "fd00::2/64", "00:00:00:00:00:02", "fd00::1")
++OVS_WAIT_UNTIL([test "$(ip netns exec vif0 ip a | grep fe80:: | grep tentative)" = ""])
++
++check ovn-nbctl set logical_router lr0 options:always_learn_from_arp_request=false
++
++OVN_POPULATE_ARP
++wait_for_ports_up
++check ovn-nbctl --wait=sb sync
++
++NS_CHECK_EXEC([vif0], [ping -q -c 3 -i 0.3 -w 2 fe80::200:ff:fe00:1 | FORMAT_PING], \
++[0], [dnl
++3 packets transmitted, 3 received, 0% packet loss, time 0ms
++])
++
++check_row_count mac_binding 1 mac=\"00:00:00:00:00:02\"
++ovn-sbctl --all destroy mac_binding
++
++ovn-nbctl --wait=hv set logical_router lr0 options:always_learn_from_arp_request=true
++
++NS_CHECK_EXEC([vif0], [ping -q -c 3 -i 0.3 -w 2 fe80::200:ff:fe00:1 | FORMAT_PING], \
++[0], [dnl
++3 packets transmitted, 3 received, 0% packet loss, time 0ms
++])
++
++check_row_count mac_binding 1 mac=\"00:00:00:00:00:02\"
++
++OVS_APP_EXIT_AND_WAIT([ovn-controller])
++
++as ovn-sb
++OVS_APP_EXIT_AND_WAIT([ovsdb-server])
++
++as ovn-nb
++OVS_APP_EXIT_AND_WAIT([ovsdb-server])
++
++as northd
++OVS_APP_EXIT_AND_WAIT([NORTHD_TYPE])
++
++as
++OVS_TRAFFIC_VSWITCHD_STOP(["/failed to query port patch-.*/d
++/connection dropped.*/d"])
++
++AT_CLEANUP
++])
diff --git a/utilities/containers/py-requirements.txt b/utilities/containers/py-requirements.txt
index d7bd21e0d..0d90765c9 100644
--- a/utilities/containers/py-requirements.txt
diff --git a/SPECS/ovn23.03.spec b/SPECS/ovn23.03.spec
index e3ac702..de8ca26 100644
--- a/SPECS/ovn23.03.spec
+++ b/SPECS/ovn23.03.spec
@@ -51,7 +51,7 @@ Summary: Open Virtual Network support
Group: System Environment/Daemons
URL: http://www.ovn.org/
Version: 23.03.0
-Release: 50%{?commit0:.%{date}git%{shortcommit0}}%{?dist}
+Release: 69%{?commit0:.%{date}git%{shortcommit0}}%{?dist}
Provides: openvswitch%{pkgver}-ovn-common = %{?epoch:%{epoch}:}%{version}-%{release}
Obsoletes: openvswitch%{pkgver}-ovn-common < 2.11.0-1
@@ -524,6 +524,82 @@ fi
%{_unitdir}/ovn-controller-vtep.service
%changelog
+* Fri Jun 09 2023 Igor Zhukov - 23.03.0-69
+- call ovsrcu_exit() before exit in ovn-northd and ovn-controller to make valgrind happy
+[Upstream: a3aba935cda359db5d9c99e8ea9ba688e4f888bc]
+
+* Thu Jun 08 2023 Dumitru Ceara - 23.03.0-68
+- controller: Turn OFTABLE_OUTPUT_INIT into an alias.
+[Upstream: 8c274866a29534c6ecb80f0242798edbb078bfda]
+
+* Thu Jun 08 2023 Ihar Hrachyshka - 23.03.0-67
+- Implement MTU Path Discovery for multichassis ports
+[Upstream: 44e07200a8f04b70bbcba20d2b5346aa840b4f40]
+
+* Thu Jun 08 2023 Ihar Hrachyshka - 23.03.0-66
+- Add new egress tables to accommodate for too-big packets handling
+[Upstream: 44d6692e28478e4e971de09045f42cc5c3000540]
+
+* Thu Jun 08 2023 Ihar Hrachyshka - 23.03.0-65
+- if-status: track interfaces for additional chassis
+[Upstream: 57f15c6d78b4fbcd9ead81328e06a714b75942f0]
+
+* Thu Jun 08 2023 Ihar Hrachyshka - 23.03.0-64
+- Track interface MTU in if-status-mgr
+[Upstream: e6f097fe148deb3f60c2e2fc57e80f91986f248e]
+
+* Thu Jun 08 2023 Ihar Hrachyshka - 23.03.0-63
+- Track ip version of tunnel in chassis_tunnel struct
+[Upstream: c8fccfa720b7d8e176be05bfd37fd6e74764ee3d]
+
+* Thu Jun 08 2023 Ales Musil - 23.03.0-62
+- northd: Add logical flow to skip GARP with LLA (#2211240)
+[Upstream: dc0b0b55d93cb2516f1759b65f198485597d4575]
+
+* Thu Jun 08 2023 Vladislav Odintsov - 23.03.0-61
+- northd: match only on supported protocols to handle_svc_check (#1913162)
+[Upstream: 822861db016d9360d6a88a486d5db8d5936e66fa]
+
+* Thu Jun 08 2023 Xavier Simonart - 23.03.0-60
+- tests: Fixed "nested containers" test
+[Upstream: f914cf2cab4b4a872d246961c6521cd8a48f2bd3]
+
+* Thu Jun 08 2023 Xavier Simonart - 23.03.0-59
+- tests: fix flaky Multiple OVS interfaces bound to same logical ports
+[Upstream: 8f29930c22687c3247a784e1e2fe4a6dc0fdd86c]
+
+* Thu Jun 08 2023 Ales Musil - 23.03.0-58
+- system-tests: Prevent flakiness in ovn mirroring
+[Upstream: 352041d0fa66772d86980f46c63e023c40286723]
+
+* Thu Jun 08 2023 Ales Musil - 23.03.0-57
+- northd: Fix address set incremental processing (#2196885)
+[Upstream: e8baef1c0fc671fe4e2d3af63de979e22a0c899d]
+
+* Tue May 30 2023 Brian Haley - 23.03.0-56
+- controller: Ignore DNS queries with RRs
+[Upstream: 529ea698f5d1d2b7083210318cfc0a64b701ca62]
+
+* Tue May 30 2023 Ales Musil - 23.03.0-55
+- ci: ovn-kubernetes: Align the timeouts with u/s ovnk
+[Upstream: ecc0a06af3bb47fe49ee897896af35a0efe33486]
+
+* Tue May 30 2023 Dumitru Ceara - 23.03.0-54
+- controller: Handle OpenFlow errors. (#2134880)
+[Upstream: 158463b94f5b6c37a37d9755ba9d5ef7473d35d3]
+
+* Tue May 30 2023 Vladislav Odintsov - 23.03.0-53
+- controller: fix typo in comments
+[Upstream: f24e9bf7b4b5822e0d37a4382fe49607c132a3ee]
+
+* Tue May 30 2023 Vladislav Odintsov - 23.03.0-52
+- northd: build vtep hairpin lflows only for lswitches with vtep lports
+[Upstream: 222f74acea04c9ae46bb3767ff256f8249ee7ab8]
+
+* Tue May 30 2023 Vladislav Odintsov - 23.03.0-51
+- northd: fix ls_in_hairpin l3dgw flow generation
+[Upstream: e4f8547be8774c085ef212fbed3e5e76e77d661c]
+
* Fri May 26 2023 Han Zhou - 23.03.0-50
- ovn-controller.c: Fix assertion failure during address set update.
[Upstream: 777786f38a61041898891ccbb3f139b0552e5794]