On Thu, Sep 10, 2026 at 7:20 PM Jacob Tanenbaum <[email protected]> wrote:
> > > On Thu, Sep 10, 2026 at 4:52 AM Ales Musil via dev < > [email protected]> wrote: > >> The mac_cache_use would have flows for ARP replies to bump the >> timestamp when we receive a reply to our probe. However, simple >> ARP request from the MAC binding IP+MAC should be enough to indicate >> that the entry is alive. Remove the response match and use plain >> ARP with proper source MAC address and SPA. >> >> Fixes: 9fc291c889bb ("controller: Update OFTABLE_MAC_CACHE_USE for ARP >> reply generated by the tracked device.") >> Fixes: c23059318cb7 ("northd, controller: Use the MAC cache table") >> Signed-off-by: Ales Musil <[email protected]> >> --- >> controller/neighbor-of.c | 1 - >> tests/ovn.at | 42 +++++++++++++++++++++++++++------------- >> tests/system-ovn.at | 30 ++++++++++++++-------------- >> 3 files changed, 44 insertions(+), 29 deletions(-) >> >> diff --git a/controller/neighbor-of.c b/controller/neighbor-of.c >> index 5985114ba..d48fe4422 100644 >> --- a/controller/neighbor-of.c >> +++ b/controller/neighbor-of.c >> @@ -50,7 +50,6 @@ consider_neighbor_flow(const struct sbrec_port_binding >> *pb, >> match_set_dl_type(&mb_cache_use_match, htons(ETH_TYPE_IP)); >> match_set_nw_src(&mb_cache_use_match, ip_addr); >> >> - match_set_arp_opcode_masked(&lookup_arp_for_stats_match, 2, >> 0xff); >> match_set_arp_spa_masked(&lookup_arp_for_stats_match, ip_addr, >> htonl(0xffffffff)); >> } else { >> diff --git a/tests/ovn.at b/tests/ovn.at >> index c8a27fcf6..024f56e02 100644 >> --- a/tests/ovn.at >> +++ b/tests/ovn.at >> @@ -37006,10 +37006,10 @@ port_key_1=$(printf "0x%x" $(as hv1 >> fetch_column port_binding tunnel_key logical >> dp_key_2=$(printf "0x%x" $(as hv1 fetch_column datapath tunnel_key >> external_ids:name=gw-2)) >> port_key_2=$(printf "0x%x" $(as hv1 fetch_column port_binding tunnel_key >> logical_port=gw-2-public)) >> >> -table=" table=OFTABLE_MAC_CACHE_USE, >> priority=100,arp,reg14=${port_key_1},metadata=${dp_key_1},dl_src=00:00:00:00:10:10,arp_spa=192.168.10.10,arp_op=2 >> actions=drop >> - table=OFTABLE_MAC_CACHE_USE, >> priority=100,arp,reg14=${port_key_1},metadata=${dp_key_1},dl_src=00:00:00:00:10:20,arp_spa=192.168.10.20,arp_op=2 >> actions=drop >> - table=OFTABLE_MAC_CACHE_USE, >> priority=100,arp,reg14=${port_key_2},metadata=${dp_key_2},dl_src=00:00:00:00:10:10,arp_spa=192.168.10.10,arp_op=2 >> actions=drop >> - table=OFTABLE_MAC_CACHE_USE, >> priority=100,arp,reg14=${port_key_2},metadata=${dp_key_2},dl_src=00:00:00:00:10:20,arp_spa=192.168.10.20,arp_op=2 >> actions=drop >> +table=" table=OFTABLE_MAC_CACHE_USE, >> priority=100,arp,reg14=${port_key_1},metadata=${dp_key_1},dl_src=00:00:00:00:10:10,arp_spa=192.168.10.10 >> actions=drop >> + table=OFTABLE_MAC_CACHE_USE, >> priority=100,arp,reg14=${port_key_1},metadata=${dp_key_1},dl_src=00:00:00:00:10:20,arp_spa=192.168.10.20 >> actions=drop >> + table=OFTABLE_MAC_CACHE_USE, >> priority=100,arp,reg14=${port_key_2},metadata=${dp_key_2},dl_src=00:00:00:00:10:10,arp_spa=192.168.10.10 >> actions=drop >> + table=OFTABLE_MAC_CACHE_USE, >> priority=100,arp,reg14=${port_key_2},metadata=${dp_key_2},dl_src=00:00:00:00:10:20,arp_spa=192.168.10.20 >> actions=drop >> table=OFTABLE_MAC_CACHE_USE, >> priority=100,ip,reg14=${port_key_1},metadata=${dp_key_1},dl_src=00:00:00:00:10:10,nw_src=192.168.10.10 >> actions=drop >> table=OFTABLE_MAC_CACHE_USE, >> priority=100,ip,reg14=${port_key_1},metadata=${dp_key_1},dl_src=00:00:00:00:10:20,nw_src=192.168.10.20 >> actions=drop >> table=OFTABLE_MAC_CACHE_USE, >> priority=100,ip,reg14=${port_key_2},metadata=${dp_key_2},dl_src=00:00:00:00:10:10,nw_src=192.168.10.10 >> actions=drop >> @@ -37058,8 +37058,8 @@ OVS_WAIT_UNTIL([ >> ]) >> >> AT_CHECK_UNQUOTED([as hv1 ovs-ofctl dump-flows br-int >> table=OFTABLE_MAC_CACHE_USE --no-stats | strip_cookie | sort], [0], [dnl >> - table=OFTABLE_MAC_CACHE_USE, >> priority=100,arp,reg14=${port_key_2},metadata=${dp_key_2},dl_src=00:00:00:00:10:10,arp_spa=192.168.10.10,arp_op=2 >> actions=drop >> - table=OFTABLE_MAC_CACHE_USE, >> priority=100,arp,reg14=${port_key_2},metadata=${dp_key_2},dl_src=00:00:00:00:10:20,arp_spa=192.168.10.20,arp_op=2 >> actions=drop >> + table=OFTABLE_MAC_CACHE_USE, >> priority=100,arp,reg14=${port_key_2},metadata=${dp_key_2},dl_src=00:00:00:00:10:10,arp_spa=192.168.10.10 >> actions=drop >> + table=OFTABLE_MAC_CACHE_USE, >> priority=100,arp,reg14=${port_key_2},metadata=${dp_key_2},dl_src=00:00:00:00:10:20,arp_spa=192.168.10.20 >> actions=drop >> table=OFTABLE_MAC_CACHE_USE, >> priority=100,ip,reg14=${port_key_2},metadata=${dp_key_2},dl_src=00:00:00:00:10:10,nw_src=192.168.10.10 >> actions=drop >> table=OFTABLE_MAC_CACHE_USE, >> priority=100,ip,reg14=${port_key_2},metadata=${dp_key_2},dl_src=00:00:00:00:10:20,nw_src=192.168.10.20 >> actions=drop >> ]) >> @@ -37282,22 +37282,29 @@ ovn-appctl -t ovn-controller vlog/set >> mac_cache:file:dbg pinctrl:file:dbg >> check ovn-nbctl \ >> -- ls-add ls1 \ >> -- ls-add ls2 \ >> + -- ls-add ls3 \ >> -- lr-add lr \ >> -- set logical_router lr options:mac_binding_age_threshold=4 \ >> -- lrp-add lr lr-ls1 00:00:00:00:10:00 192.168.10.1/24 \ >> -- lrp-add lr lr-ls2 00:00:00:00:20:00 192.168.20.1/24 \ >> + -- lrp-add lr lr-ls3 00:00:00:00:30:00 192.168.30.1/24 \ >> -- lsp-add-router-port ls1 ls1-lr lr-ls1 \ >> -- lsp-add ls1 vif1 \ >> -- lsp-set-addresses vif1 "00:00:00:00:10:10 192.168.10.10" \ >> -- lsp-add-router-port ls2 ls2-lr lr-ls2 \ >> -- lsp-add ls2 vif2 \ >> - -- lsp-set-addresses vif2 "00:00:00:00:20:10 192.168.20.10" >> + -- lsp-set-addresses vif2 "00:00:00:00:20:10 192.168.20.10" \ >> + -- lsp-add-router-port ls3 ls3-lr lr-ls3 \ >> + -- lsp-add ls3 vif3 \ >> + -- lsp-set-addresses vif3 "00:00:00:00:30:10 192.168.30.10" >> >> check ovs-vsctl \ >> -- add-port br-int vif1 \ >> -- set interface vif1 external-ids:iface-id=vif1 \ >> -- add-port br-int vif2 \ >> - -- set interface vif2 external-ids:iface-id=vif2 >> + -- set interface vif2 external-ids:iface-id=vif2 \ >> + -- add-port br-int vif3 \ >> + -- set interface vif3 external-ids:iface-id=vif3 >> >> OVN_POPULATE_ARP >> wait_for_ports_up >> @@ -37314,23 +37321,32 @@ sleep 2 >> send_garp hv1 vif1 2 00:00:00:00:10:10 ff:ff:ff:ff:ff:ff 192.168.10.10 >> 192.168.10.10 >> wait_row_count mac_binding 1 ip="192.168.10.10" logical_port="lr-ls1" >> >> -uuid=$(fetch_column mac_binding _uuid ip="192.168.10.10" >> logical_port="lr-ls1") >> +send_garp hv1 vif3 2 00:00:00:00:30:10 ff:ff:ff:ff:ff:ff 192.168.30.10 >> 192.168.30.10 >> +wait_row_count mac_binding 1 ip="192.168.30.10" logical_port="lr-ls3" >> + >> +uuid_ls1=$(fetch_column mac_binding _uuid ip="192.168.10.10" >> logical_port="lr-ls1") >> +uuid_ls3=$(fetch_column mac_binding _uuid ip="192.168.30.10" >> logical_port="lr-ls3") >> for i in $(seq 12); do >> - # Keep one entry alive by sending traffic that uses it. >> + # Keep two entries alive by sending traffic that uses them. >> send_udp hv1 vif1 00:00:00:00:10:00 00:00:00:00:10:10 192.168.20.10 >> 192.168.10.10 >> + send_garp hv1 vif3 1 00:00:00:00:30:10 ff:ff:ff:ff:ff:ff >> 192.168.30.10 192.168.20.100 >> sleep 1 >> # The entry must not expire. >> check_row_count mac_binding 1 ip="192.168.10.10" >> logical_port="lr-ls1" >> + check_row_count mac_binding 1 ip="192.168.30.10" >> logical_port="lr-ls3" >> as hv1 ovs-ofctl dump-flows br-int table=OFTABLE_MAC_CACHE_USE >> done >> # Check that it's the same entry. >> -uuid2=$(fetch_column mac_binding _uuid ip="192.168.10.10" >> logical_port="lr-ls1") >> -check test "$uuid" = "$uuid2" >> +uuid2_ls1=$(fetch_column mac_binding _uuid ip="192.168.10.10" >> logical_port="lr-ls1") >> +uuid2_ls3=$(fetch_column mac_binding _uuid ip="192.168.30.10" >> logical_port="lr-ls3") >> +check test "$uuid_ls1" = "$uuid2_ls1" >> +check test "$uuid_ls3" = "$uuid2_ls3" >> >> # The other entry must have expired by now. >> check_row_count mac_binding 0 ip="192.168.20.10" logical_port="lr-ls2" >> -# Wait for the alive one to expire as well. >> +# Wait for the alive ones to expire as well. >> wait_row_count mac_binding 0 ip="192.168.10.10" logical_port="lr-ls1" >> +wait_row_count mac_binding 0 ip="192.168.30.10" logical_port="lr-ls3" >> >> OVN_CLEANUP([hv1]) >> AT_CLEANUP >> diff --git a/tests/system-ovn.at b/tests/system-ovn.at >> index 799779276..26b56ac3b 100644 >> --- a/tests/system-ovn.at >> +++ b/tests/system-ovn.at >> @@ -18643,10 +18643,10 @@ >> priority=100,icmp6,reg0=0x1720016,reg1=0,reg2=0,reg3=0x70,reg14=0x$rtr_port_key, >> >> AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int >> table=OFTABLE_MAC_CACHE_USE | grep priority | \ >> awk '{print $[7], $[8]}' | sort], [0], [dnl >> -priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,arp_spa=172.16.1.10,arp_op=2 >> actions=drop >> -priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:50,arp_spa=172.16.1.50,arp_op=2 >> actions=drop >> -priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:60,arp_spa=172.16.1.60,arp_op=2 >> actions=drop >> -priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:70,arp_spa=172.16.1.70,arp_op=2 >> actions=drop >> +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,arp_spa=172.16.1.10 >> actions=drop >> +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:50,arp_spa=172.16.1.50 >> actions=drop >> +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:60,arp_spa=172.16.1.60 >> actions=drop >> +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:70,arp_spa=172.16.1.70 >> actions=drop >> >> priority=100,ip,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,nw_src=172.16.1.10 >> actions=drop >> >> priority=100,ip,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:50,nw_src=172.16.1.50 >> actions=drop >> >> priority=100,ip,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:60,nw_src=172.16.1.60 >> actions=drop >> @@ -18840,7 +18840,7 @@ >> priority=100,arp,reg0=0xac10010a,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl >> >> AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int >> table=OFTABLE_MAC_CACHE_USE | grep priority | \ >> awk '{print $[7], $[8]}' | sort], [0], [dnl >> -priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,arp_spa=172.16.1.10,arp_op=2 >> actions=drop >> +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,arp_spa=172.16.1.10 >> actions=drop >> >> priority=100,ip,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,nw_src=172.16.1.10 >> actions=drop >> ]) >> >> @@ -19322,10 +19322,10 @@ >> priority=100,icmp6,reg0=0x1720016,reg1=0,reg2=0,reg3=0x70,reg14=0x$rtr_port_key, >> >> AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int >> table=OFTABLE_MAC_CACHE_USE | grep priority | \ >> awk '{print $[7], $[8]}' | sort], [0], [dnl >> -priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,arp_spa=172.16.1.10,arp_op=2 >> actions=drop >> -priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:50,arp_spa=172.16.1.50,arp_op=2 >> actions=drop >> -priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:60,arp_spa=172.16.1.60,arp_op=2 >> actions=drop >> -priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:70,arp_spa=172.16.1.70,arp_op=2 >> actions=drop >> +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,arp_spa=172.16.1.10 >> actions=drop >> +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:50,arp_spa=172.16.1.50 >> actions=drop >> +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:60,arp_spa=172.16.1.60 >> actions=drop >> +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:70,arp_spa=172.16.1.70 >> actions=drop >> >> priority=100,ip,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,nw_src=172.16.1.10 >> actions=drop >> >> priority=100,ip,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:50,nw_src=172.16.1.50 >> actions=drop >> >> priority=100,ip,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:60,nw_src=172.16.1.60 >> actions=drop >> @@ -19377,7 +19377,7 @@ >> priority=100,arp,reg0=0xac10010a,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl >> >> AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int >> table=OFTABLE_MAC_CACHE_USE | grep priority | \ >> awk '{print $[7], $[8]}' | sort], [0], [dnl >> -priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,arp_spa=172.16.1.10,arp_op=2 >> actions=drop >> +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,arp_spa=172.16.1.10 >> actions=drop >> >> priority=100,ip,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,nw_src=172.16.1.10 >> actions=drop >> ]) >> >> @@ -19898,10 +19898,10 @@ >> priority=100,icmp6,reg0=0x1720016,reg1=0,reg2=0,reg3=0x70,reg14=0x$rtr_port_key, >> >> AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int >> table=OFTABLE_MAC_CACHE_USE | grep priority | \ >> awk '{print $[7], $[8]}' | sort], [0], [dnl >> -priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,arp_spa=172.16.1.10,arp_op=2 >> actions=drop >> -priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:50,arp_spa=172.16.1.50,arp_op=2 >> actions=drop >> -priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:60,arp_spa=172.16.1.60,arp_op=2 >> actions=drop >> -priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:70,arp_spa=172.16.1.70,arp_op=2 >> actions=drop >> +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,arp_spa=172.16.1.10 >> actions=drop >> +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:50,arp_spa=172.16.1.50 >> actions=drop >> +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:60,arp_spa=172.16.1.60 >> actions=drop >> +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:70,arp_spa=172.16.1.70 >> actions=drop >> >> priority=100,ip,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,nw_src=172.16.1.10 >> actions=drop >> >> priority=100,ip,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:50,nw_src=172.16.1.50 >> actions=drop >> >> priority=100,ip,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:10:60,nw_src=172.16.1.60 >> actions=drop >> @@ -19953,7 +19953,7 @@ >> priority=100,arp,reg0=0xac10010a,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl >> >> AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int >> table=OFTABLE_MAC_CACHE_USE | grep priority | \ >> awk '{print $[7], $[8]}' | sort], [0], [dnl >> -priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,arp_spa=172.16.1.10,arp_op=2 >> actions=drop >> +priority=100,arp,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,arp_spa=172.16.1.10 >> actions=drop >> >> priority=100,ip,reg14=0x$rtr_port_key,metadata=0x$rtr_dp_key,dl_src=f0:00:0f:16:01:10,nw_src=172.16.1.10 >> actions=drop >> ]) >> >> -- >> 2.55.0 >> >> _______________________________________________ >> dev mailing list >> [email protected] >> https://mail.openvswitch.org/mailman/listinfo/ovs-dev >> >> > This change looks good to me > Acked-by: Jacob Tanenbaum <[email protected] <[email protected]>> > Thank you Jacob, applied to main and backported down to 26.03. Regards, Ales _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
