diff mbox series

[ovs-dev,v3,32/33] northd: Support filter routes on active-active.

Message ID 34648587cad68ab8bf78b9d8d020e6f12fd9873a.1732630355.git.felix.huettner@stackit.cloud
State Changes Requested
Headers show
Series OVN Fabric integration | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success

Commit Message

Felix Huettner Nov. 26, 2024, 2:38 p.m. UTC
This change now allows the user to specify interface names to be used
for route learning directly in ovn-active-active-mappings.

Signed-off-by: Felix Huettner <felix.huettner@stackit.cloud>
---
v3: reworked based on the previous change to allow filtering on ifname

 lib/ovn-util.c  | 16 +++++++++++++---
 lib/ovn-util.h  |  3 ++-
 northd/northd.c | 12 ++++++++++--
 northd/northd.h |  4 +++-
 tests/ovn.at    | 10 +++++++++-
 5 files changed, 37 insertions(+), 8 deletions(-)
diff mbox series

Patch

diff --git a/lib/ovn-util.c b/lib/ovn-util.c
index c86f6f209..eb2197b28 100644
--- a/lib/ovn-util.c
+++ b/lib/ovn-util.c
@@ -1089,7 +1089,8 @@  chassis_find_active_active_networks(const struct sbrec_chassis *chassis,
     /* Structure
      * ovn-active-active-mappings="<network>|<network>"
      * network="<network_name>;<port>;<port>"
-     * port="<mac>,<ip>" */
+     * port="<mac>,<ip>,<ifname>"
+     * name is optional */
     nextnet = start = xstrdup(aa_ports);
     while ((curnet = strsep(&nextnet, "|")) && *curnet) {
         nextport = curnet;
@@ -1101,10 +1102,11 @@  chassis_find_active_active_networks(const struct sbrec_chassis *chassis,
         chassis_aa_network->network_name = xstrdup(network);
         chassis_aa_network->n_addresses = 0;
         while ((curport = strsep(&nextport, ";")) && *curport) {
-            char *mac, *ip;
+            char *mac, *ip, *ifname;
 
             mac = strsep(&curport, ",");
-            ip = curport;
+            ip = strsep(&curport, ",");
+            ifname = curport;
 
             if (!mac || !ip || !*mac || !*ip) {
                 VLOG_ERR("Invalid format for "
@@ -1163,6 +1165,14 @@  chassis_find_active_active_networks(const struct sbrec_chassis *chassis,
                     continue;
                 }
             }
+
+            chassis_aa_network->ifnames = xrealloc(
+                chassis_aa_network->ifnames,
+                (chassis_aa_network->n_addresses + 1
+                 ) * sizeof *chassis_aa_network->ifnames);
+            chassis_aa_network->ifnames[
+                chassis_aa_network->n_addresses] = nullable_xstrdup(ifname);
+
             chassis_aa_network->n_addresses++;
         }
     }
diff --git a/lib/ovn-util.h b/lib/ovn-util.h
index b4151e99e..e065911b3 100644
--- a/lib/ovn-util.h
+++ b/lib/ovn-util.h
@@ -354,8 +354,9 @@  char *lr_lb_address_set_ref(uint32_t lr_tunnel_key, int addr_family);
 
 struct chassis_aa_network {
     char *network_name;
-    struct lport_addresses *addresses;
     size_t n_addresses;
+    struct lport_addresses *addresses;
+    char **ifnames;
 };
 
 bool chassis_find_active_active_networks(const struct sbrec_chassis *,
diff --git a/northd/northd.c b/northd/northd.c
index ff665d187..6b8bbf4bb 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -1259,6 +1259,7 @@  ovn_port_cleanup(struct ovn_port *port)
         ovs_assert(port->aa_chassis_name);
         free(port->aa_mac);
         free(port->aa_chassis_name);
+        free(port->aa_ifname);
     }
 
     destroy_lport_addresses(&port->lrp_networks);
@@ -2625,6 +2626,7 @@  join_logical_ports(const struct sbrec_port_binding_table *sbrec_pb_table,
                 lsp->aa_chassis_name = xstrdup(chassis->name);
                 lrp->aa_chassis_index = j;
                 lsp->aa_chassis_index = j;
+                lrp->aa_ifname = networks.ifnames[j];
 
                 if (nbsp_rpr) {
                     char *lsp_rpr_name = xasprintf("%s-%s-%"PRIuSIZE,
@@ -2640,6 +2642,7 @@  join_logical_ports(const struct sbrec_port_binding_table *sbrec_pb_table,
             }
             free(networks.network_name);
             free(networks.addresses);
+            free(networks.ifnames);
         }
     }
 
@@ -4342,8 +4345,13 @@  sync_pb_for_lrp(struct ovn_port *op,
         if (smap_get_bool(&op->od->nbr->options, "dynamic-routing", false)) {
             smap_add(&new, "dynamic-routing", "true");
         }
-        const char *ifname = smap_get(&op->nbrp->options,
-                                      "dynamic-routing-ifname");
+        const char *ifname = op->aa_ifname;
+        if (!ifname && op->primary_port) {
+            ifname = op->primary_port->aa_ifname;
+        }
+        if (!ifname) {
+            ifname = smap_get(&op->nbrp->options, "dynamic-routing-ifname");
+        }
         if (ifname) {
             smap_add(&new, "dynamic-routing-ifname", ifname);
         }
diff --git a/northd/northd.h b/northd/northd.h
index 530b850b5..d4325e31c 100644
--- a/northd/northd.h
+++ b/northd/northd.h
@@ -669,9 +669,11 @@  struct ovn_port {
     bool is_active_active;
     char *aa_chassis_name;
     size_t aa_chassis_index;
-    /* The following value is only set on the lrp side of an
+    /* The following two values are only set on the lrp side of an
      * active-active port binding */
     char *aa_mac;
+    /* This is NULL if not set by the user */
+    char *aa_ifname;
 
     /* Reference of lflows generated for this ovn_port.
      *
diff --git a/tests/ovn.at b/tests/ovn.at
index ecdb50816..76eb0ff46 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -39516,7 +39516,7 @@  as hv1 ovs-appctl fdb/add br-phys patch-br-phys-to-br-phys2 0 00:cc:cc:cc:cc:11
 
 # active-active mappings
 
-as hv1 ovs-vsctl set open . external_ids:ovn-active-active-mappings="phys;00:01:01:00:00:01,192.168.10.10/24;00:01:02:00:00:01,192.168.11.10/24"
+as hv1 ovs-vsctl set open . external_ids:ovn-active-active-mappings="phys;00:01:01:00:00:01,192.168.10.10/24,interface1;00:01:02:00:00:01,192.168.11.10/24,interface2"
 as hv2 ovs-vsctl set open . external_ids:ovn-active-active-mappings="phys;00:02:01:00:00:01,192.168.20.10/24"
 
 # LS setup
@@ -39759,6 +39759,14 @@  outside_to_bgp 1 br-phys_hv1-1 0 00:01:01:00:00:01 192.168.10.10
 outside_to_bgp 1 br-phys2_hv1-2 1 00:01:02:00:00:01 192.168.11.10
 outside_to_bgp 2 br-phys_hv2-1 0 00:02:01:00:00:01 192.168.20.10
 
+# the LRPs of hv1 should both have an dynamic-routing-ifname set
+AT_CHECK([ovn-sbctl --bare --columns=options list Port_Binding cr-internet-phys-hv1-0], [0], [dnl
+always-redirect=true distributed-port=internet-phys-hv1-0 dynamic-routing-ifname=interface1
+])
+AT_CHECK([ovn-sbctl --bare --columns=options list Port_Binding cr-internet-phys-hv1-1], [0], [dnl
+always-redirect=true distributed-port=internet-phys-hv1-1 dynamic-routing-ifname=interface2
+])
+
 OVN_CLEANUP([hv1],[hv2
 /Couldn't parse MAC binding/d])
 AT_CLEANUP