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

Reply via email to