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

Reply via email to