On Fri, Jan 23, 2026 at 10:50:42AM +0100, Ales Musil wrote: > On Thu, Jan 22, 2026 at 7:23 PM Mairtin O'Loingsigh via dev < > [email protected]> wrote: > > > 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]> > > --- > > > > Hi Mairtin, > thank you for the v2. There is a couple of small nits below. > > > > 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. > > > > There is an existing dynamic routing section in the NEWS already. > > - 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)); > > > > nit: Formatting > > > > + 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 > > > nit: s/--wait=sb/--wait=hv/ that applies to all additions within this > patch. > > + > > +# 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 > > > > > I took care of all the nits, went ahead and marged this into main. > > Regards, > Ales Thanks for the fixes and merging
Mairtin _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
