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 <[email protected]> --- 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 --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 -- 2.47.0 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
