On Mon, Feb 03, 2025 at 04:29:25PM +0100, Dumitru Ceara wrote:
> On 1/29/25 12:16 PM, Felix Huettner via dev wrote:
> > Previously vrf names where generated using "ovnvrf" + datapath id.
> > Now the controller supports the dynamic-routing-vrf-name setting to
> > overwrite this to whatever value the user desires.
> > Note that the vrf ID is still the datapath id.
> >
> > Signed-off-by: Felix Huettner <[email protected]>
> > ---
>
> Hi Felix,
Hi Dumitru,
thanks a lot for the review.
The smaller stuff will all be fixed in the next version.
>
> > controller/route-exchange.c | 14 ++++++--------
> > controller/route.c | 15 +++++++++++++++
> > controller/route.h | 2 ++
> > tests/system-ovn.at | 15 ++++++++++++++-
> > 4 files changed, 37 insertions(+), 9 deletions(-)
> >
> > diff --git a/controller/route-exchange.c b/controller/route-exchange.c
> > index 47ff2350e..79e65280b 100644
> > --- a/controller/route-exchange.c
> > +++ b/controller/route-exchange.c
> > @@ -221,27 +221,25 @@ route_exchange_run(struct route_exchange_ctx_in
> > *r_ctx_in,
> > const struct advertise_datapath_entry *ad;
> > HMAP_FOR_EACH (ad, node, r_ctx_in->announce_routes) {
> > uint32_t table_id = ad->db->tunnel_key;
> > - char vrf_name[IFNAMSIZ + 1];
> > - snprintf(vrf_name, sizeof vrf_name, "ovnvrf%"PRIi32, table_id);
> >
> > if (ad->maintain_vrf) {
> > - if (!sset_contains(&old_maintained_vrfs, vrf_name)) {
> > - int error = re_nl_create_vrf(vrf_name, table_id);
> > + if (!sset_contains(&old_maintained_vrfs, ad->vrf_name)) {
> > + int error = re_nl_create_vrf(ad->vrf_name, table_id);
> > if (error && error != EEXIST) {
> > VLOG_WARN_RL(&rl,
> > "Unable to create VRF %s for datapath "
> > "%"PRIi32": %s.",
> > - vrf_name, table_id,
> > + ad->vrf_name, table_id,
> > ovs_strerror(error));
> > continue;
> > }
> > }
> > - sset_add(&_maintained_vrfs, vrf_name);
> > + sset_add(&_maintained_vrfs, ad->vrf_name);
> > } else {
> > /* a previous maintain-vrf flag was removed. We should therfor
> > * also not delete it even if we created it previously. */
> > - sset_find_and_delete(&_maintained_vrfs, vrf_name);
> > - sset_find_and_delete(&old_maintained_vrfs, vrf_name);
> > + sset_find_and_delete(&_maintained_vrfs, ad->vrf_name);
> > + sset_find_and_delete(&old_maintained_vrfs, ad->vrf_name);
> > }
> >
> > maintained_route_table_add(table_id);
> > diff --git a/controller/route.c b/controller/route.c
> > index 2d86edc97..d513b449e 100644
> > --- a/controller/route.c
> > +++ b/controller/route.c
> > @@ -143,6 +143,21 @@ route_run(struct route_ctx_in *r_ctx_in,
> > char *ifname = nullable_xstrdup(
> > smap_get(&repb->options,
> > "dynamic-routing-ifname"));
> > +
> > + const char *vrf_name = smap_get(&repb->options,
> > + "dynamic-routing-vrf-name");
>
> Indentation is a bit off.
>
> > + if (vrf_name && strlen(vrf_name) >= sizeof ad->vrf_name) {
> > + VLOG_WARN("Ignoring vrf name %s, since it is too long",
> > + vrf_name);
>
> Maybe we should log the maximum here? Also, please rate limit this log.
>
> > + vrf_name = NULL;
> > + }
> > + if (vrf_name) {
> > + memcpy(ad->vrf_name, vrf_name, strlen(vrf_name) + 1);
> > + } else {
> > + snprintf(ad->vrf_name, sizeof ad->vrf_name,
> > "ovnvrf%"PRIi64,
> > + ad->db->tunnel_key);
> > + }
> > +
> > smap_add_nocopy(&ad->bound_ports,
> > xstrdup(local_peer->logical_port), ifname);
> > }
> > diff --git a/controller/route.h b/controller/route.h
> > index 986c35ec0..1afaf0ef6 100644
> > --- a/controller/route.h
> > +++ b/controller/route.h
> > @@ -20,6 +20,7 @@
> >
> > #include <stdbool.h>
> > #include <netinet/in.h>
> > +#include <net/if.h>
> > #include "openvswitch/hmap.h"
> > #include "sset.h"
> > #include "smap.h"
> > @@ -55,6 +56,7 @@ struct advertise_datapath_entry {
> > struct hmap_node node;
> > const struct sbrec_datapath_binding *db;
> > bool maintain_vrf;
> > + char vrf_name[IFNAMSIZ + 1];
> > struct hmap routes;
> >
> > /* The name of the port bindings locally bound for this datapath and
> > diff --git a/tests/system-ovn.at b/tests/system-ovn.at
> > index 963a67e0c..12985edd2 100644
> > --- a/tests/system-ovn.at
> > +++ b/tests/system-ovn.at
> > @@ -14867,6 +14867,7 @@ OVN_FOR_EACH_NORTHD([
> > AT_SETUP([dynamic-routing - DGP])
> >
> > VRF_RESERVE([1337])
> > +VRF_RESERVE([1338])
> >
> > # This test uses dynamic routing on a simulated multi-tenant internet
> > # connection.
> > @@ -15113,10 +15114,22 @@ blackhole 192.0.2.10 proto 84 metric 100
> > blackhole 198.51.100.0/24 proto 84 metric 1000
> > 233.252.0.0/24 via 192.168.10.10 dev lo onlink])
> >
> > +# Changing the vrf name will switch to the new one.
> > +check ovn-nbctl --wait=hv set Logical_Router internet
> > options:dynamic-routing-vrf-name=ovnvrf1338
>
> I had mentioned the misconfig of the dynamic-routing-vrf-name in my
> reply to this patch last week, mentioning it again so the review is
> consolidated. :)
Ah yea i missed that when sending the series. I already changed it
locally, but did not send a new northd version.
I'll send the next patchset as one large one. That should solve the
issue.
Thanks a lot,
Felix
>
> > +check ovn-nbctl --wait=hv set Logical_Router_Port internet-phys \
> > + options:dynamic-routing-maintain-vrf=true
> > +OVS_WAIT_UNTIL_EQUAL([ip route list vrf ovnvrf1338 | awk '{$1=$1};1'], [dnl
> > +blackhole 192.0.2.1 proto 84 metric 1000
> > +blackhole 192.0.2.2 proto 84 metric 100
> > +blackhole 192.0.2.3 proto 84 metric 100
> > +blackhole 192.0.2.10 proto 84 metric 100
> > +blackhole 198.51.100.0/24 proto 84 metric 1000
> > +233.252.0.0/24 via 192.168.10.10 dev lo onlink])
> > +
> > # Stoping with --restart will not touch the routes.
> > check ovn-appctl -t ovn-controller exit --restart
> > OVS_WAIT_UNTIL([test "$(ovn-appctl -t ovn-controller debug/status)" !=
> > "running"])
> > -OVS_WAIT_UNTIL_EQUAL([ip route list vrf ovnvrf1337 | awk '{$1=$1};1'], [dnl
> > +OVS_WAIT_UNTIL_EQUAL([ip route list vrf ovnvrf1338 | awk '{$1=$1};1'], [dnl
> > blackhole 192.0.2.1 proto 84 metric 1000
> > blackhole 192.0.2.2 proto 84 metric 100
> > blackhole 192.0.2.3 proto 84 metric 100
>
> Regards,
> Dumitru
>
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev