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