This patch covers a few scenarios that were missed by the
dynamic-routing route advertisement support:
- "pure" patch ports (between routers and switches) are fully
  distributed hence always local (if the switch/router is a local
  datapath)
- when installing advertised routes do that only for records whose
  'logical_port' is local to the hypervisor (it's not enough to check if
  the 'tracked_port' is local)
- due to the fact that a pure patch port can change to a
  chassis-redirect port (when the associated LRP becomes a DGP) it's
  possible that the route_runtime_data_handler() is not called (no local
  datapath change).  However, the route_sb_port_binding_data_handler()
  does run and it can detect if changes happened to chassis-redirect
  ports for distributed ports that are relevant to routing

The patch also adds a system test to ensure the behavior in the above
scenarios is correct.

Fixes: a3f72e44ddde ("controller: Make sure we will update routes on tracked 
port change.")
Fixes: ccb0b6b9109c ("controller: Introduce route node.")
Fixes: 712fca55b3b1 ("controller: Prioritize host routes.")
Signed-off-by: Dumitru Ceara <[email protected]>
---
 controller/lport.c          |   5 ++
 controller/ovn-controller.c |  14 ++++
 controller/route.c          |  10 +++
 tests/system-ovn.at         | 128 ++++++++++++++++++++++++++++++++----
 4 files changed, 145 insertions(+), 12 deletions(-)

diff --git a/controller/lport.c b/controller/lport.c
index 077e66acff..b30bcd398e 100644
--- a/controller/lport.c
+++ b/controller/lport.c
@@ -107,6 +107,11 @@ lport_is_local(struct ovsdb_idl_index 
*sbrec_port_binding_by_name,
     const struct sbrec_port_binding *cr_pb =
         lport_get_cr_port(sbrec_port_binding_by_name, pb, NULL);
 
+    /* Patch ports that are not redirect ports are always local. */
+    if (!cr_pb && get_lport_type(pb) == LP_PATCH) {
+        return true;
+    }
+
     return lport_pb_is_chassis_resident(chassis, cr_pb);
 }
 
diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index c2dab41c11..5699e29d95 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -5390,6 +5390,20 @@ route_sb_port_binding_data_handler(struct engine_node 
*node, void *data)
              * request recompute. */
             return EN_UNHANDLED;
         }
+
+        const char *dp_name = smap_get(&sbrec_pb->options, "distributed-port");
+        if (dp_name && sset_contains(&re_data->tracked_ports_local,
+                                     dp_name)) {
+            /* XXX: Until we get I-P support for route exchange we need to
+             * request recompute. */
+            return EN_UNHANDLED;
+        }
+        if (dp_name && sset_contains(&re_data->tracked_ports_remote,
+                                     dp_name)) {
+            /* XXX: Until we get I-P support for route exchange we need to
+             * request recompute. */
+            return EN_UNHANDLED;
+        }
     }
 
     return EN_HANDLED_UNCHANGED;
diff --git a/controller/route.c b/controller/route.c
index dded03d352..093306c5b3 100644
--- a/controller/route.c
+++ b/controller/route.c
@@ -284,6 +284,16 @@ route_run(struct route_ctx_in *r_ctx_in,
             continue;
         }
 
+        if (!lport_is_local(r_ctx_in->sbrec_port_binding_by_name,
+                            r_ctx_in->chassis,
+                            route->logical_port->logical_port)) {
+            sset_add(r_ctx_out->tracked_ports_remote,
+                     route->logical_port->logical_port);
+            continue;
+        }
+        sset_add(r_ctx_out->tracked_ports_local,
+                 route->logical_port->logical_port);
+
         unsigned int priority = PRIORITY_DEFAULT;
         if (route->tracked_port) {
             bool redistribute_local_bound_only =
diff --git a/tests/system-ovn.at b/tests/system-ovn.at
index cc672d43a0..8abfb6dfac 100644
--- a/tests/system-ovn.at
+++ b/tests/system-ovn.at
@@ -15932,13 +15932,14 @@ blackhole 198.51.100.0/24 proto ovn metric 1000])
 # * 192.0.2.3/32
 # * 192.0.2.10/32
 # * 192.0.2.20/32
-# The last 3 of them are local to the current chassis so we expect a better
-# prio.
+# All of them are local to the current chassis (the first one is a patch port
+# and the last two are chassis redirect ports bound to the current chassis)
+# so we expect a better prio for all of them.
 check ovn-nbctl --wait=hv set Logical_Router_Port internet-public \
     options:dynamic-routing-redistribute="connected-as-host,static,nat"
 
 OVN_ROUTE_EQUAL([ovnvrf1337], [dnl
-blackhole 192.0.2.1 proto ovn metric 1000
+blackhole 192.0.2.1 proto ovn metric 100
 blackhole 192.0.2.2 proto ovn metric 100
 blackhole 192.0.2.3 proto ovn metric 100
 blackhole 192.0.2.10 proto ovn metric 100
@@ -15951,7 +15952,7 @@ blackhole 198.51.100.0/24 proto ovn metric 1000])
 check ovn-nbctl lrp-del-gateway-chassis pr1-public hv1
 check ovn-nbctl --wait=hv lrp-set-gateway-chassis pr1-public hv123
 OVN_ROUTE_EQUAL([ovnvrf1337], [dnl
-blackhole 192.0.2.1 proto ovn metric 1000
+blackhole 192.0.2.1 proto ovn metric 100
 blackhole 192.0.2.2 proto ovn metric 1000
 blackhole 192.0.2.3 proto ovn metric 100
 blackhole 192.0.2.10 proto ovn metric 1000
@@ -15962,7 +15963,7 @@ blackhole 198.51.100.0/24 proto ovn metric 1000])
 check ovn-nbctl lrp-del-gateway-chassis pr1-public hv123
 check ovn-nbctl --wait=hv lrp-set-gateway-chassis pr1-public hv1
 OVN_ROUTE_EQUAL([ovnvrf1337], [dnl
-blackhole 192.0.2.1 proto ovn metric 1000
+blackhole 192.0.2.1 proto ovn metric 100
 blackhole 192.0.2.2 proto ovn metric 100
 blackhole 192.0.2.3 proto ovn metric 100
 blackhole 192.0.2.10 proto ovn metric 100
@@ -15972,7 +15973,7 @@ blackhole 198.51.100.0/24 proto ovn metric 1000])
 # Moving vif3 away from hv1 will change the route metric to default.
 check ovn-nbctl --wait=hv set Logical_Switch_Port vif3 
options:requested-chassis=thisdoesnotexist
 OVN_ROUTE_EQUAL([ovnvrf1337], [dnl
-blackhole 192.0.2.1 proto ovn metric 1000
+blackhole 192.0.2.1 proto ovn metric 100
 blackhole 192.0.2.2 proto ovn metric 100
 blackhole 192.0.2.3 proto ovn metric 100
 blackhole 192.0.2.10 proto ovn metric 100
@@ -15982,7 +15983,7 @@ blackhole 198.51.100.0/24 proto ovn metric 1000])
 # Bringing vif3 back will change the route metric to local again.
 check ovn-nbctl --wait=hv set Logical_Switch_Port vif3 
options:requested-chassis=hv1
 OVN_ROUTE_EQUAL([ovnvrf1337], [dnl
-blackhole 192.0.2.1 proto ovn metric 1000
+blackhole 192.0.2.1 proto ovn metric 100
 blackhole 192.0.2.2 proto ovn metric 100
 blackhole 192.0.2.3 proto ovn metric 100
 blackhole 192.0.2.10 proto ovn metric 100
@@ -16050,7 +16051,7 @@ OVN_ROUTE_EQUAL([ovnvrf1337], [dnl
 start_daemon ovn-controller
 OVS_WAIT_UNTIL([test "$(ovn-appctl -t ovn-controller debug/status)" == 
"running"])
 OVN_ROUTE_EQUAL([ovnvrf1337], [dnl
-blackhole 192.0.2.1 proto ovn metric 1000
+blackhole 192.0.2.1 proto ovn metric 100
 blackhole 192.0.2.2 proto ovn metric 100
 blackhole 192.0.2.3 proto ovn metric 100
 blackhole 192.0.2.10 proto ovn metric 100
@@ -16067,7 +16068,7 @@ check ovn-nbctl --wait=hv set Logical_Router internet \
     options:dynamic-routing-vrf-name=ovnvrf1338
 AT_CHECK([ip vrf | grep -q ovnvrf1337], [1], [])
 OVN_ROUTE_EQUAL([ovnvrf1338], [dnl
-blackhole 192.0.2.1 proto ovn metric 1000
+blackhole 192.0.2.1 proto ovn metric 100
 blackhole 192.0.2.2 proto ovn metric 100
 blackhole 192.0.2.3 proto ovn metric 100
 blackhole 192.0.2.10 proto ovn metric 100
@@ -16079,7 +16080,7 @@ blackhole 198.51.100.0/24 proto ovn metric 1000
 # Stopping with --restart will not touch the routes.
 OVN_CONTROLLER_EXIT([],[--restart])
 OVN_ROUTE_EQUAL([ovnvrf1338], [dnl
-blackhole 192.0.2.1 proto ovn metric 1000
+blackhole 192.0.2.1 proto ovn metric 100
 blackhole 192.0.2.2 proto ovn metric 100
 blackhole 192.0.2.3 proto ovn metric 100
 blackhole 192.0.2.10 proto ovn metric 100
@@ -16109,6 +16110,7 @@ check ovn-nbctl lsp-add public vip \
 check ovn-nbctl --wait=hv sync
 
 OVN_ROUTE_EQUAL([ovnvrf1338], [dnl
+blackhole 192.0.2.1 proto ovn metric 100
 blackhole 192.0.2.2 proto ovn metric 100
 blackhole 192.0.2.3 proto ovn metric 100
 blackhole 192.0.2.10 proto ovn metric 100
@@ -16123,6 +16125,7 @@ NS_EXEC([vif4], [arping -U -c 1 -w 2 -I vif4 
192.0.2.30])
 wait_column "vif4" Port_Binding virtual_parent logical_port=vip
 wait_for_ports_up vip
 OVN_ROUTE_EQUAL([ovnvrf1338], [dnl
+blackhole 192.0.2.1 proto ovn metric 100
 blackhole 192.0.2.2 proto ovn metric 100
 blackhole 192.0.2.3 proto ovn metric 100
 blackhole 192.0.2.10 proto ovn metric 100
@@ -16135,6 +16138,7 @@ blackhole 198.51.100.0/24 proto ovn metric 1000
 
 check ovn-sbctl clear Port_Binding vip virtual-parent
 OVN_ROUTE_EQUAL([ovnvrf1338], [dnl
+blackhole 192.0.2.1 proto ovn metric 100
 blackhole 192.0.2.2 proto ovn metric 100
 blackhole 192.0.2.3 proto ovn metric 100
 blackhole 192.0.2.10 proto ovn metric 100
@@ -16149,6 +16153,7 @@ NS_EXEC([vif4], [arping -U -c 1 -w 2 -I vif4 
192.0.2.30])
 wait_column "vif4" Port_Binding virtual_parent logical_port=vip
 wait_for_ports_up vip
 OVN_ROUTE_EQUAL([ovnvrf1338], [dnl
+blackhole 192.0.2.1 proto ovn metric 100
 blackhole 192.0.2.2 proto ovn metric 100
 blackhole 192.0.2.3 proto ovn metric 100
 blackhole 192.0.2.10 proto ovn metric 100
@@ -16164,6 +16169,7 @@ check ovn-sbctl clear Port_Binding vip virtual-parent
 wait_column "" Port_Binding chassis logical_port=vip
 check ovn-sbctl set Port_Binding vip virtual_parent=vif5
 OVN_ROUTE_EQUAL([ovnvrf1338], [dnl
+blackhole 192.0.2.1 proto ovn metric 100
 blackhole 192.0.2.2 proto ovn metric 100
 blackhole 192.0.2.3 proto ovn metric 100
 blackhole 192.0.2.10 proto ovn metric 100
@@ -16177,7 +16183,7 @@ blackhole 198.51.100.0/24 proto ovn metric 1000
 check ovn-nbctl --wait=hv set logical_router_port internet-public \
     options:dynamic-routing-redistribute-local-only=false
 OVN_ROUTE_EQUAL([ovnvrf1338], [dnl
-blackhole 192.0.2.1 proto ovn metric 1000
+blackhole 192.0.2.1 proto ovn metric 100
 blackhole 192.0.2.2 proto ovn metric 100
 blackhole 192.0.2.3 proto ovn metric 100
 blackhole 192.0.2.10 proto ovn metric 100
@@ -16194,7 +16200,7 @@ NS_EXEC([vif4], [arping -U -c 1 -w 2 -I vif4 
192.0.2.30])
 wait_column "vif4" Port_Binding virtual_parent logical_port=vip
 wait_for_ports_up vip
 OVN_ROUTE_EQUAL([ovnvrf1338], [dnl
-blackhole 192.0.2.1 proto ovn metric 1000
+blackhole 192.0.2.1 proto ovn metric 100
 blackhole 192.0.2.2 proto ovn metric 100
 blackhole 192.0.2.3 proto ovn metric 100
 blackhole 192.0.2.10 proto ovn metric 100
@@ -17601,6 +17607,104 @@ OVS_TRAFFIC_VSWITCHD_STOP(["/failed to query port 
patch-.*/d
 AT_CLEANUP
 ])
 
+OVN_FOR_EACH_NORTHD([
+AT_SETUP([dynamic-routing - multiple DGP])
+
+VRF_RESERVE([1337])
+
+ovn_start
+OVS_TRAFFIC_VSWITCHD_START()
+
+ADD_BR([br-int])
+check 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 lr                                                              \
+      -- set logical_router lr options:dynamic-routing=true                   \
+                               options:dynamic-routing-vrf-id=1337            \
+      -- lrp-add lr lr-gw1 00:00:00:01:00:10 42.10.10.12/24                   \
+        -- lrp-set-gateway-chassis lr-gw1 hv1 10                              \
+        -- lrp-set-options lr-gw1 dynamic-routing-redistribute=nat,lb         \
+                                  dynamic-routing-maintain-vrf=true           \
+      -- lrp-add lr lr-gw2 00:00:00:02:00:10 42.20.10.22/24                   \
+        -- lrp-set-gateway-chassis lr-gw2 hv2 10                              \
+        -- lrp-set-options lr-gw2 dynamic-routing-redistribute=nat,lb         \
+                                  dynamic-routing-maintain-vrf=true           \
+      -- lrp-add lr lr-int1 00:00:00:00:01:02 30.0.1.1/24                     \
+        -- lrp-set-options lr-int1 dynamic-routing-redistribute=connected     \
+      -- lrp-add lr lr-int2 00:00:00:00:01:02 30.0.2.1/24                     \
+        -- lrp-set-options lr-int2 dynamic-routing-redistribute=connected     \
+    -- ls-add ls                                                              \
+      -- lsp-add-router-port ls ls-lr-gw1 lr-gw1                              \
+      -- lsp-add-router-port ls ls-lr-gw2 lr-gw2                              \
+    -- ls-add ls-int1                                                         \
+      -- lsp-add-router-port ls-int1 ls-int1-lr lr-int1                       \
+      -- lsp-add ls-int1 w1                                                   \
+        -- lsp-set-addresses w1 "00:00:00:00:00:01 30.0.1.11"                 \
+    -- ls-add ls-int2                                                         \
+      -- lsp-add-router-port ls-int2 ls-int2-lr lr-int2                       \
+      -- lsp-add ls-int2 w2                                                   \
+        -- lsp-set-addresses w2 "00:00:00:00:00:02 30.0.2.11"                 \
+    -- lr-nat-add lr dnat_and_snat 42.10.10.23 30.0.1.11 w1 00:00:00:00:01:11 \
+    -- lb-add lb1 42.10.10.14 30.0.1.11                                       \
+    -- lr-lb-add lr lb1                                                       \
+    -- lr-nat-add lr dnat_and_snat 42.20.10.23 30.0.2.11 w2 00:00:00:00:02:11 \
+    -- lb-add lb2 42.20.10.24 30.0.2.11                                       \
+    -- lr-lb-add lr lb2
+
+check ovs-vsctl add-port br-int w1 \
+    -- set interface w1 type=internal external_ids:iface-id=w1
+check ovs-vsctl add-port br-int w2 \
+    -- set interface w2 type=internal external_ids:iface-id=w2
+check ovn-nbctl --wait=hv sync
+wait_for_ports_up w1 w2
+
+lrp1=$(fetch_column port_binding _uuid logical_port="lrp1")
+lrp2=$(fetch_column port_binding _uuid logical_port="lrp2")
+
+AT_CHECK([ip vrf show ovnvrf1337], [0], [dnl
+ovnvrf1337 1337
+])
+
+OVN_ROUTE_EQUAL([ovnvrf1337], [dnl
+blackhole 30.0.1.0/24 proto ovn metric 1000
+blackhole 30.0.2.0/24 proto ovn metric 1000
+blackhole 42.10.10.14 proto ovn metric 100
+blackhole 42.10.10.14 proto ovn metric 1000
+blackhole 42.10.10.23 proto ovn metric 100
+blackhole 42.20.10.23 proto ovn metric 100
+blackhole 42.20.10.24 proto ovn metric 100
+blackhole 42.20.10.24 proto ovn metric 1000])
+
+check ovn-nbctl --wait=hv ls-del ls-int1
+check ovn-nbctl --wait=hv ls-del ls-int2
+check ovn-nbctl --wait=hv ls-del ls
+check ovn-nbctl --wait=hv lr-del lr
+
+OVN_CLEANUP_CONTROLLER([hv1])
+
+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([ovn-northd])
+
+as
+OVS_TRAFFIC_VSWITCHD_STOP(["/failed to query port patch-.*/d
+/connection dropped.*/d"])
+
+AT_CLEANUP
+])
+
 OVN_FOR_EACH_NORTHD([
 AT_SETUP([Mac binding aging - Probing])
 AT_KEYWORDS([mac_binding_probing])
-- 
2.51.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to