@@ -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++;
}
}
@@ -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 *,
@@ -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);
}
@@ -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.
*
@@ -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
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(-)