When a binding switches to another chassis via requested-chassis option, controller should stop sending periodic garps for the port.
Signed-off-by: Ihar Hrachyshka <ihrac...@redhat.com> --- controller/pinctrl.c | 9 ++++- tests/ovn.at | 93 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/controller/pinctrl.c b/controller/pinctrl.c index 25b37ee88..486c1d6f8 100644 --- a/controller/pinctrl.c +++ b/controller/pinctrl.c @@ -5781,8 +5781,13 @@ send_garp_rarp_prepare(struct ovsdb_idl_txn *ovnsb_idl_txn, const struct sbrec_port_binding *pb = lport_lookup_by_name( sbrec_port_binding_by_name, iface_id); if (pb) { - send_garp_rarp_update(ovnsb_idl_txn, sbrec_mac_binding_by_lport_ip, - local_datapaths, pb, &nat_addresses); + if (!pb->chassis || pb->chassis == chassis) { + send_garp_rarp_update(ovnsb_idl_txn, + sbrec_mac_binding_by_lport_ip, + local_datapaths, pb, &nat_addresses); + } else { + send_garp_rarp_delete(iface_id); + } } } diff --git a/tests/ovn.at b/tests/ovn.at index 0c2fe9f97..f443b9101 100644 --- a/tests/ovn.at +++ b/tests/ovn.at @@ -14097,6 +14097,99 @@ OVN_CLEANUP([hv1],[hv2]) AT_CLEANUP ]) +OVN_FOR_EACH_NORTHD([ +AT_SETUP([garps disabled when port no longer bound to chassis]) +ovn_start + +net_add n1 +for i in 1 2; do + sim_add hv$i + as hv$i + check ovs-vsctl add-br br-phys + ovn_attach n1 br-phys 192.168.0.$i + check ovs-vsctl set open . external-ids:ovn-bridge-mappings=phys:br-phys +done + +check ovn-nbctl ls-add ls0 +check ovn-nbctl lsp-add ls0 port +check ovn-nbctl lsp-set-addresses port "00:00:00:00:00:01 10.0.0.1" + +check ovn-nbctl lsp-add ls0 public +check ovn-nbctl lsp-set-addresses public unknown +check ovn-nbctl lsp-set-type public localnet +check ovn-nbctl lsp-set-options public network_name=phys + +for hv in hv1 hv2; do + as $hv check ovs-vsctl -- add-port br-int port -- \ + set Interface port external-ids:iface-id=port \ + options:tx_pcap=$hv/port-tx.pcap \ + options:rxq_pcap=$hv/port-rx.pcap +done + +reset_pcap_file() { + local hv=$1 + local iface=$2 + local pcap_file=$3 + as $hv check ovs-vsctl -- set Interface $iface options:tx_pcap=dummy-tx.pcap \ + options:rxq_pcap=dummy-rx.pcap + check rm -f ${pcap_file}*.pcap + as $hv check ovs-vsctl -- set Interface $iface options:tx_pcap=${pcap_file}-tx.pcap \ + options:rxq_pcap=${pcap_file}-rx.pcap +} + +reset_env() { + reset_pcap_file hv1 br-phys_n1 hv1/br-phys_n1 + reset_pcap_file hv2 br-phys_n1 hv2/br-phys_n1 + + for port in hv1/n1 hv2/n1; do + : > $port.expected + done +} + +for hv in hv1 hv2; do + wait_row_count Chassis 1 name=$hv +done +hv1_uuid=$(fetch_column Chassis _uuid name=hv1) +hv2_uuid=$(fetch_column Chassis _uuid name=hv2) + +OVN_POPULATE_ARP + +# Activate port on each hv giving a chance to each chassis to enable garps +check ovn-nbctl lsp-set-options port requested-chassis=hv1 +wait_column "$hv1_uuid" Port_Binding chassis logical_port=port +wait_column "$hv1_uuid" Port_Binding requested_chassis logical_port=port +wait_for_ports_up +reset_env + +# give chassis some time to generate garps +sleep 2 + +expected_garp=ffffffffffff000000000001080600010800060400010000000000010a0000010000000000000a000001 + +# check hv1 sends garps and hv2 doesn't +echo $expected_garp >> hv1/n1.expected +OVN_CHECK_PACKETS_CONTAIN([hv1/br-phys_n1-tx.pcap], [hv1/n1.expected]) +OVN_CHECK_PACKETS([hv2/br-phys_n1-tx.pcap], [hv2/n1.expected]) + +check ovn-nbctl lsp-set-options port requested-chassis=hv2 +wait_column "$hv2_uuid" Port_Binding chassis logical_port=port +wait_column "$hv2_uuid" Port_Binding requested_chassis logical_port=port +wait_for_ports_up +reset_env + +# give chassis some time to generate garps +sleep 2 + +# check hv2 sends garps and hv1 doesn't +echo $expected_garp >> hv2/n1.expected +OVN_CHECK_PACKETS([hv1/br-phys_n1-tx.pcap], [hv1/n1.expected]) +OVN_CHECK_PACKETS_CONTAIN([hv2/br-phys_n1-tx.pcap], [hv2/n1.expected]) + +OVN_CLEANUP([hv1],[hv2]) + +AT_CLEANUP +]) + OVN_FOR_EACH_NORTHD([ AT_SETUP([IPv6 periodic RA disabled for localnet adjacent switch ports]) ovn_start -- 2.34.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev