Add "dynamic-routing-no-learning" option to router and router port options.
This option will disable learning on a router/router port and remove
existing learned routes. The port option takes priority over the router
option.

Reported-at: https://issues.redhat.com/browse/FDP-2750
Signed-off-by: Mairtin O'Loingsigh <[email protected]>
---
 NEWS                        |  7 +++
 controller/route-exchange.c |  8 ++++
 northd/northd.c             |  8 ++++
 ovn-nb.xml                  | 27 ++++++++++++
 ovn-sb.xml                  | 15 +++++++
 tests/system-ovn.at         | 85 ++++++++++++++++++++++++++++++++++++-
 6 files changed, 149 insertions(+), 1 deletion(-)

diff --git a/NEWS b/NEWS
index dc9d28f2c..93f4c72f0 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,12 @@
 Post v25.09.0
 -------------
+   - Dynamic Routing:
+     * Add the "options:dynamic-routing-no-learning" to Logical Routers. If
+       set to true router will not learn routes and will forget learned
+       routes.
+     * Add the "options:dynamic-routing-no-learning" to Logical Routers ports.
+       If set to true, router port will not learn routes and will forget
+       learned routes. This option has priority over its router counterpart.
    - Added DNS query statistics tracking in ovn-controller using OVS coverage
      counters. Statistics can be queried using "ovn-appctl -t ovn-controller
      coverage/read-counter <counter_name>" or "coverage/show". Tracked metrics
diff --git a/controller/route-exchange.c b/controller/route-exchange.c
index 8fced5f3c..ae44ffe69 100644
--- a/controller/route-exchange.c
+++ b/controller/route-exchange.c
@@ -187,6 +187,14 @@ sb_sync_learned_routes(const struct vector *learned_routes,
             if (!logical_port) {
                 continue;
             }
+
+            bool no_learning = smap_get_bool(&logical_port->options,
+                                             "dynamic-routing-no-learning",
+                                             false);
+            if (no_learning) {
+                continue;
+            }
+
             route_e = route_lookup(&sync_routes, datapath,
                                    logical_port, ip_prefix, nexthop);
             if (route_e) {
diff --git a/northd/northd.c b/northd/northd.c
index d79fe40c9..3c31a4345 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -3919,6 +3919,14 @@ sync_pb_for_lrp(struct ovn_port *op,
         if (redistribute_local_only_val) {
             smap_add(&new, redistribute_local_only_name, "true");
         }
+
+        /* Set no-learning on ports based on NB router/router port config */
+        const char *no_learn_name = "dynamic-routing-no-learning";
+        bool no_learning = smap_get_bool(&op->nbrp->options, no_learn_name,
+            smap_get_bool(&op->od->nbr->options, no_learn_name, false));
+        if (no_learning) {
+            smap_add(&new, "dynamic-routing-no-learning", "true");
+        }
     }
 
     const char *ipv6_pd_list = smap_get(&op->sb->options, "ipv6_ra_pd_list");
diff --git a/ovn-nb.xml b/ovn-nb.xml
index e74c0d010..e9ca27413 100644
--- a/ovn-nb.xml
+++ b/ovn-nb.xml
@@ -3442,6 +3442,19 @@ or
         </p>
       </column>
 
+      <column name="options" key="dynamic-routing-no-learning"
+              type='{"type": "boolean"}'>
+        <p>
+          Only relevant if <ref column="options" key="dynamic-routing"/>
+          is set to <code>true</code>.
+        </p>
+
+        <p>
+          This option disables route learning on a specific router and will
+          also remove learned routes.
+        </p>
+      </column>
+
       <column name="options" key="dynamic-routing-v4-prefix-nexthop"
               type='{"type": "string"}'>
         <p>
@@ -4582,6 +4595,20 @@ or
           routes in <code>ovn-ic</code> daemon.
         </p>
       </column>
+
+      <column name="options" key="dynamic-routing-no-learning"
+              type='{"type": "boolean"}'>
+        <p>
+          Only relevant if <ref column="options" key="dynamic-routing"/>
+          is set to <code>true</code>.
+        </p>
+
+        <p>
+          This option disables route learning on a specific router port and
+          will also remove learned routes. It also has priority over the
+          router version of this option.
+        </p>
+      </column>
     </group>
 
     <group title="Attachment">
diff --git a/ovn-sb.xml b/ovn-sb.xml
index 623aaeffd..00bae26bf 100644
--- a/ovn-sb.xml
+++ b/ovn-sb.xml
@@ -3925,6 +3925,21 @@ tcp.flags = RST;
           bound.  Default: <code>false</code>.
         </p>
       </column>
+
+      <column name="options" key="dynamic-routing-no-learning"
+              type='{"type": "boolean"}'>
+        <p>
+          Only relevant if <ref column="options" key="dynamic-routing"/>
+          is set to <code>true</code>.
+        </p>
+
+        <p>
+          This option disables adding routes to
+          <ref table="Learned_Route" db="OVN_Southbound"/> and will also
+          remove learned routes.
+        </p>
+      </column>
+
     </group>
 
     <group title="Nested Containers">
diff --git a/tests/system-ovn.at b/tests/system-ovn.at
index 59701d41b..b74df2d74 100644
--- a/tests/system-ovn.at
+++ b/tests/system-ovn.at
@@ -19954,11 +19954,94 @@ AT_CHECK([ip route del 10.10.3.1 via 20.0.0.25 vrf 
vrf-$vni])
 OVS_WAIT_FOR_OUTPUT([ovn-sbctl list Learned_Route | grep ip_prefix | sort], 
[0], [dnl
 ])
 
+# Disable learning on router
+AS_BOX([$(date +%H:%M:%S.%03N) Disable dynamic-route learning])
+
+# Add a route to the VRF (simulating BGP learning a route)
+AT_CHECK([ip route add 10.10.3.1 via 20.0.0.25 vrf vrf-$vni proto zebra])
+
+# Verify learned route appears in SB database
+wait_row_count Learned_Route 1 ip_prefix=10.10.3.1
+
+check ovn-nbctl --wait=sb set Logical_Router lr-frr 
options:dynamic-routing-no-learning=true
+
+# Verify routes do not appear in SB database.
+wait_row_count Learned_Route 0
+
+check ovn-nbctl --wait=sb set Logical_Router lr-frr 
options:dynamic-routing-no-learning=false
+
+# Verify learned route appears in SB database
+wait_row_count Learned_Route 1 ip_prefix=10.10.3.1
+
+AT_CHECK([ip route del 10.10.3.1 via 20.0.0.25 vrf vrf-$vni])
+
+# Verify all routes removed from SB database.
+wait_row_count Learned_Route 0
+
+# Disable learning on router then attempt to add route
+AS_BOX([$(date +%H:%M:%S.%03N) Disable dynamic-route learning 2])
+
+check ovn-nbctl --wait=sb set Logical_Router lr-frr 
options:dynamic-routing-no-learning=true
+
+# Add a route to the VRF (simulating BGP learning a route)
+AT_CHECK([ip route add 10.10.3.1 via 20.0.0.25 vrf vrf-$vni proto zebra])
+
+# Verify routes do not appear in SB database.
+wait_row_count Learned_Route 0
+
+check ovn-nbctl --wait=sb set Logical_Router lr-frr 
options:dynamic-routing-no-learning=false
+
+# Verify learned route appears in SB database
+wait_row_count Learned_Route 1 ip_prefix=10.10.3.1
+
+AT_CHECK([ip route del 10.10.3.1 via 20.0.0.25 vrf vrf-$vni])
+
+# Verify all routes removed from SB database.
+wait_row_count Learned_Route 0
+
+# Disable learning on router port
+AS_BOX([$(date +%H:%M:%S.%03N) Disable dynamic-route learning on port])
+check ovn-nbctl --wait=sb set Logical_Router_Port lrp-local-bgp-port 
options:dynamic-routing-no-learning=true
+
+# Add a route to the VRF (simulating BGP learning a route)
+AT_CHECK([ip route add 10.10.3.1 via 20.0.0.25 vrf vrf-$vni proto zebra])
+
+# Verify routes do not appear in SB database.
+wait_row_count Learned_Route 0
+
+AT_CHECK([ip route del 10.10.3.1 via 20.0.0.25 vrf vrf-$vni])
+check ovn-nbctl --wait=sb set Logical_Router_Port lrp-local-bgp-port 
options:dynamic-routing-no-learning=false
+
 # Add again a route to the VRF (simulating BGP learning a route)
 AT_CHECK([ip route add 10.10.3.1 via 20.0.0.25 vrf vrf-$vni proto zebra])
 
 # Verify learned route appears in SB database
-OVS_WAIT_UNTIL([ovn-sbctl list Learned_Route | grep ip_prefix | grep -Fe 
10.10.3.1])
+wait_row_count Learned_Route 1 ip_prefix=10.10.3.1
+
+AT_CHECK([ip route del 10.10.3.1 via 20.0.0.25 vrf vrf-$vni])
+
+# Verify all routes removed from SB database.
+wait_row_count Learned_Route 0
+
+# Disable learning on router and enable on port
+AS_BOX([$(date +%H:%M:%S.%03N) Disable dynamic-route learning on router, but 
not port])
+check ovn-nbctl --wait=sb set Logical_Router lr-frr 
options:dynamic-routing-no-learning=true
+check ovn-nbctl --wait=sb set Logical_Router_Port lrp-local-bgp-port 
options:dynamic-routing-no-learning=false
+
+# Add a route to the VRF (simulating BGP learning a route)
+AT_CHECK([ip route add 10.10.3.1 via 20.0.0.25 vrf vrf-$vni proto zebra])
+
+# Verify routes do not appear in SB database.
+wait_row_count Learned_Route 1
+
+AT_CHECK([ip route del 10.10.3.1 via 20.0.0.25 vrf vrf-$vni])
+check ovn-nbctl --wait=sb set Logical_Router lr-frr 
options:dynamic-routing-no-learning=false
+
+# Add again a route to the VRF (simulating BGP learning a route)
+AT_CHECK([ip route add 10.10.3.1 via 20.0.0.25 vrf vrf-$vni proto zebra])
+
+# Verify learned route appears in SB database
+wait_row_count Learned_Route 1 ip_prefix=10.10.3.1
 
 # Disable dynamic routing
 AS_BOX([$(date +%H:%M:%S.%03N) Disable dynamic-routing])
-- 
2.52.0

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

Reply via email to