Allow the CMS to explicitly configure nat addresses to use in GARP advertising even if the logical switch port is connected to a distributed gateway router port.
Signed-off-by: Lorenzo Bianconi <[email protected]> --- Changes since v1: - rebase on top of ovn master - add unit test --- northd/northd.c | 15 +++++++++++---- tests/ovn.at | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/northd/northd.c b/northd/northd.c index b264fb850..f94239b45 100644 --- a/northd/northd.c +++ b/northd/northd.c @@ -3385,6 +3385,8 @@ ovn_port_update_sbrec(struct northd_input *input_data, "nat-addresses"); size_t n_nats = 0; char **nats = NULL; + bool l3dgw_ports = op->peer && op->peer->od && + op->peer->od->n_l3dgw_ports; if (nat_addresses && !strcmp(nat_addresses, "router")) { if (op->peer && op->peer->od && (chassis || op->peer->od->n_l3dgw_ports)) { @@ -3393,9 +3395,7 @@ ovn_port_update_sbrec(struct northd_input *input_data, nats = get_nat_addresses(op->peer, &n_nats, false, !exclude_lb_vips); } - /* Only accept manual specification of ethernet address - * followed by IPv4 addresses on type "l3gateway" ports. */ - } else if (nat_addresses && chassis) { + } else if (nat_addresses && (chassis || l3dgw_ports)) { struct lport_addresses laddrs; if (!extract_lsp_addresses(nat_addresses, &laddrs)) { static struct vlog_rate_limit rl = @@ -3405,7 +3405,14 @@ ovn_port_update_sbrec(struct northd_input *input_data, destroy_lport_addresses(&laddrs); n_nats = 1; nats = xcalloc(1, sizeof *nats); - nats[0] = xstrdup(nat_addresses); + struct ds nat_addr = DS_EMPTY_INITIALIZER; + ds_put_format(&nat_addr, "%s", nat_addresses); + if (l3dgw_ports) { + ds_put_format(&nat_addr, " is_chassis_resident(%s)", + op->peer->od->l3dgw_ports[0]->cr_port->json_key); + } + nats[0] = xstrdup(ds_cstr(&nat_addr)); + ds_destroy(&nat_addr); } } diff --git a/tests/ovn.at b/tests/ovn.at index 9b13a980d..32c812caa 100644 --- a/tests/ovn.at +++ b/tests/ovn.at @@ -8642,6 +8642,38 @@ fffffffffffff0000000000108060001080006040001f00000000001c0a80001000000000000c0a8 fffffffffffff0000000000108060001080006040001f00000000001c0a80002000000000000c0a80002 ]) +# Temporarily remove nat-addresses option to avoid race conditions +# due to GARP backoff +ovn-nbctl lsp-set-options lrp0-rp router-port=lrp0 nat-addresses="" +# Let's use gw router port now +hv1_uuid=$(ovn-sbctl --bare --columns _uuid list chassis hv1) +ovn-nbctl remove logical_router lr0 options chassis +ovn-nbctl lrp-set-gateway-chassis lrp0 hv1 20 +OVS_WAIT_UNTIL([ + cr_lrp0_ch=$(ovn-sbctl --bare --columns chassis list port_binding cr-lrp0) + test "$cr_lrp0_ch" = $hv1_uuid +]) +ovn-nbctl lsp-set-options lrp0-rp router-port=lrp0 nat-addresses="f0:00:00:00:00:03 192.168.0.3" + +reset_pcap_file() { + local iface=$1 + local pcap_file=$2 + ovs-vsctl -- set Interface $iface options:tx_pcap=dummy-tx.pcap \ +options:rxq_pcap=dummy-rx.pcap + rm -f ${pcap_file}*.pcap + ovs-vsctl -- set Interface $iface options:tx_pcap=${pcap_file}-tx.pcap \ +options:rxq_pcap=${pcap_file}-rx.pcap +} + +reset_pcap_file snoopvif hv1/snoopvif +OVS_WAIT_UNTIL([test `wc -c < "hv1/snoopvif-tx.pcap"` -ge 140]) + +$PYTHON "$ovs_srcdir/utilities/ovs-pcap.in" hv1/snoopvif-tx.pcap | trim_zeros > packets +AT_CHECK([sort packets], [0], [dnl +fffffffffffff0000000000108060001080006040001f00000000001c0a80001000000000000c0a80001 +fffffffffffff0000000000308060001080006040001f00000000003c0a80003000000000000c0a80003 +]) + OVN_CLEANUP([hv1]) AT_CLEANUP -- 2.35.1 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
