]> git.feebdaed.xyz Git - 0xmirror/ovs.git/commitdiff
tests: Revalidate on flow change in tunnel-push-pop.
authorIhar Hrachyshka <ihar.hrachyshka@gmail.com>
Mon, 15 Sep 2025 00:50:45 +0000 (20:50 -0400)
committerIlya Maximets <i.maximets@ovn.org>
Fri, 3 Oct 2025 18:26:46 +0000 (20:26 +0200)
The `tunnel_push_pop - action` test case may fail due to a race
condition between the revalidator modifying flows and dummy `receive`
action. Other test cases are also potentially affected.

To fix the race for this test case and other test cases in the same
file, this patch will call revalidator/wait every time a flow is
modified before sending a packet through a bridge using `receive`.

Signed-off-by: Ihar Hrachyshka <ihar.hrachyshka@gmail.com>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
tests/tunnel-push-pop.at

index 8f67eae1e626fa2e148d94f509cf129ffdc7cf0b..38dc56962608b0bcbfc509d5aafa3dc0c0fa1806 100644 (file)
@@ -42,6 +42,7 @@ Cached: 2001:ca00::/24 dev br0 SRC 2001:cafe::88 local
 ])
 
 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
+AT_CHECK([ovs-appctl revalidator/wait])
 
 dnl Check ARP request
 AT_CHECK([ovs-vsctl -- set Interface p0 options:pcap=p0.pcap])
@@ -151,6 +152,7 @@ AT_CHECK([tail -1 stdout], [0],
 ])
 
 AT_CHECK([ovs-ofctl del-flows int-br])
+AT_CHECK([ovs-appctl revalidator/wait])
 
 dnl Check decapsulation of ERSPAN v1
 dnl Hex dump: GRE:(100088be)
@@ -252,6 +254,7 @@ User: 1.1.2.0/24 MARK 1234 dev br0 SRC 1.1.2.88
 ])
 
 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
+AT_CHECK([ovs-appctl revalidator/wait])
 
 dnl Check ARP request
 AT_CHECK([ovs-vsctl -- set Interface p0 options:pcap=p0.pcap])
@@ -513,6 +516,7 @@ AT_CHECK([tail -1 stdout], [0],
   [Datapath actions: pop_eth,tnl_push(tnl_port(2152),header(size=50,type=110,eth(dst=f8:bc:12:44:34:b6,src=aa:55:aa:55:00:00,dl_type=0x0800),ipv4(src=1.1.2.88,dst=1.1.2.92,proto=17,tos=0,ttl=64,frag=0x4000),udp(src=0,dst=2152,csum=0x0),gtpu(flags=0x30,msgtype=255,teid=0x7b)),out_port(100)),1
 ])
 AT_CHECK([ovs-ofctl del-flows int-br])
+AT_CHECK([ovs-appctl revalidator/wait])
 
 dnl Check decapsulation of VXLAN packet
 AT_CHECK([ovs-appctl netdev-dummy/receive p0 'aa55aa550000001b213cab6408004500004e00010000401173e90101025c0101025812b512b5003a00000800000000007b00fe71d883724fbeb6f4e1494a08004500001c0001000040013ede1e0000011e0000020000ffff00000000'])
@@ -646,6 +650,7 @@ AT_CHECK([ovs-ofctl dump-ports int-br | grep 'port  [[37]]' | sort], [0], [dnl
 dnl Send out packets received from L3GRE tunnel back to L3GRE tunnel
 AT_CHECK([ovs-ofctl del-flows int-br])
 AT_CHECK([ovs-ofctl add-flow int-br "in_port=7,actions=set_field:3->in_port,7"])
+AT_CHECK([ovs-appctl revalidator/wait])
 AT_CHECK([ovs-vsctl -- set Interface br0 options:pcap=br0.pcap])
 
 AT_CHECK([ovs-appctl netdev-dummy/receive p0 'aa55aa550000001b213cab6408004500007079464000402fba630101025c0101025820000800000001c845000054ba200000400184861e0000011e00000200004227e75400030af3195500000000f265010000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637'])
@@ -671,6 +676,7 @@ AT_CHECK([ovs-ofctl monitor int-br 65534 --detach --no-chdir --pidfile 2> ofctl_
 
 AT_CHECK([ovs-ofctl del-flows int-br])
 AT_CHECK([ovs-ofctl add-flow int-br "tun_metadata0=0xa/0xf,actions=5,controller"])
+AT_CHECK([ovs-appctl revalidator/wait])
 AT_CHECK([ovs-appctl netdev-dummy/receive p0 'aa55aa550000001b213cab64080045000096794640004011ba5b0101025c01010258308817c1008200000400655800007b00ffff80010000000affff00010000000bfe71d883724fbeb6f4e1494a080045000054ba200000400184861e0000011e00000200004227e75400030af3195500000000f265010000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637'])
 
 OVS_WAIT_UNTIL([test `wc -l < ofctl_monitor.log` -ge 2])
@@ -783,6 +789,7 @@ Cached: 1.1.2.0/24 dev br0 SRC 1.1.2.88 local
 ])
 
 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
+AT_CHECK([ovs-appctl revalidator/wait])
 
 dnl This ARP reply from p0 has two effects:
 dnl 1. The ARP cache will learn that 1.1.2.92 is at f8:bc:12:44:34:b6.
@@ -793,6 +800,7 @@ AT_CHECK([ovs-vsctl -- set Interface p0 options:tx_pcap=p0.pcap])
 
 dnl Output to tunnel from a int-br internal port
 AT_CHECK([ovs-ofctl add-flow int-br "in_port=LOCAL,actions=output:2"])
+AT_CHECK([ovs-appctl revalidator/wait])
 AT_CHECK([ovs-appctl netdev-dummy/receive int-br '50540000000a5054000000091234'])
 OVS_WAIT_UNTIL([test `ovs-pcap p0.pcap | grep 50540000000a5054000000091234 | wc -l` -ge 1])
 
@@ -823,6 +831,7 @@ AT_CHECK([ovs-appctl ovs/route/show | grep Cached], [0], [dnl
 Cached: 1.1.2.0/24 dev br0 SRC 1.1.2.88 local
 ])
 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
+AT_CHECK([ovs-appctl revalidator/wait])
 
 dnl This ARP reply from p0 has two effects:
 dnl 1. The ARP cache will learn that 1.1.2.92 is at f8:bc:12:44:34:b6.
@@ -844,6 +853,7 @@ encap=f8bc124434b6aa55aa5500000800450000320000400040113406010102580101025c....17
 dnl Output to tunnel from a int-br internal port.
 dnl Checking that the packet arrived and it was correctly encapsulated.
 AT_CHECK([ovs-ofctl add-flow int-br "in_port=LOCAL,actions=debug_slow,output:2"])
+AT_CHECK([ovs-appctl revalidator/wait])
 AT_CHECK([ovs-appctl netdev-dummy/receive int-br "${packet}4"])
 OVS_WAIT_UNTIL([test `ovs-pcap p0.pcap | grep -E "${encap}${packet}4" | wc -l` -ge 1])
 dnl Sending again to exercise the non-miss upcall path.
@@ -898,6 +908,7 @@ Cached: 2.2.2.0/24 dev br0 SRC 2.2.2.88 local
 ])
 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
 AT_CHECK([ovs-ofctl add-flow int-br action=normal])
+AT_CHECK([ovs-appctl revalidator/wait])
 
 dnl This ARP reply from p0 has two effects:
 dnl 1. The ARP cache will learn that 1.1.2.92 is at f8:bc:12:44:34:b6.
@@ -979,6 +990,7 @@ Cached: 1.1.2.0/24 dev br0 SRC 1.1.2.88 local
 ])
 
 AT_CHECK([ovs-ofctl add-flow br0 'arp,priority=1,action=normal'])
+AT_CHECK([ovs-appctl revalidator/wait])
 
 dnl Use arp reply to achieve tunnel next hop mac binding
 AT_CHECK([ovs-appctl netdev-dummy/receive p0 'recirc_id(0),in_port(1),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x0806),arp(sip=1.1.2.92,tip=1.1.2.88,op=2,sha=f8:bc:12:44:34:b6,tha=00:00:00:00:00:00)'])
@@ -991,6 +1003,7 @@ AT_CHECK([ovs-ofctl add-flow br0 'ip,ip_proto=47,nw_tos=0,eth_src=aa:55:aa:55:00
 
 dnl Direct traffic from the integration bridge to the GRE tunnel
 AT_CHECK([ovs-ofctl add-flow int-br action=3])
+AT_CHECK([ovs-appctl revalidator/wait])
 
 AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(2),eth(src=f8:bc:12:44:34:b6,dst=aa:55:aa:55:00:00),eth_type(0x0800),ipv4(src=1.1.3.88,dst=1.1.3.112,proto=17,tos=0,ttl=64,frag=no),udp(src=51283,dst=4789)'], [0], [stdout])
 AT_CHECK([tail -1 stdout], [0],
@@ -1028,6 +1041,7 @@ AT_CHECK([ovs-appctl ovs/route/show | grep Cached], [0], [dnl
 Cached: 1.1.2.0/24 dev br0 SRC 1.1.2.88 local
 ])
 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
+AT_CHECK([ovs-appctl revalidator/wait])
 
 dnl This ARP reply from p0 has two effects:
 dnl 1. The ARP cache will learn that 1.1.2.92 is at f8:bc:12:44:34:b6.
@@ -1100,6 +1114,7 @@ Cached: 10.0.0.0/24 dev br0 SRC 10.0.0.2 local
 dnl Send an ARP reply to port b8 on br0, so that packets will be forwarded
 dnl to learned port.
 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
+AT_CHECK([ovs-appctl revalidator/wait])
 
 AT_CHECK([ovs-appctl netdev-dummy/receive p8 'in_port(8),dnl
    eth(src=aa:55:aa:66:00:00,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),dnl
@@ -1149,6 +1164,7 @@ dnl to learned port.
 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
 AT_CHECK([ovs-ofctl del-flows ovs-tun0])
 AT_CHECK([ovs-ofctl add-flow ovs-tun0 "in_port=p7,actions=tun0"])
+AT_CHECK([ovs-appctl revalidator/wait])
 AT_CHECK([ovs-appctl netdev-dummy/receive p8 'in_port(8),dnl
    eth(src=aa:55:aa:66:00:00,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),dnl
    arp(sip=10.0.0.11,tip=10.0.0.2,op=2,sha=aa:55:aa:66:00:00,tha=00:00:00:00:00:00)'])
@@ -1164,6 +1180,7 @@ udp(src=0,dst=4789,csum=0x0),vxlan(flags=0x8000000,vni=0x0)),out_port(100)),8
 dnl Perform a negative check to make sure clone is still present.
 AT_CHECK([ovs-ofctl del-flows ovs-tun0])
 AT_CHECK([ovs-ofctl add-flow ovs-tun0 "in_port=p7,actions=tun0,in_port"])
+AT_CHECK([ovs-appctl revalidator/wait])
 AT_CHECK([ovs-appctl netdev-dummy/receive p8 'in_port(8),dnl
    eth(src=aa:55:aa:66:00:00,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),dnl
    arp(sip=10.0.0.11,tip=10.0.0.2,op=2,sha=aa:55:aa:66:00:00,tha=00:00:00:00:00:00)'])
@@ -1218,6 +1235,7 @@ Cached: 1.1.2.0/24 dev vtep0 SRC 1.1.2.88 local
 
 AT_CHECK([ovs-ofctl add-flow br0 action=normal])
 AT_CHECK([ovs-ofctl add-flow int-br action=normal])
+AT_CHECK([ovs-appctl revalidator/wait])
 
 dnl Use arp request and reply to achieve tunnel next hop mac binding.
 dnl By default, vtep0's MAC address is aa:55:aa:55:00:03.
@@ -1287,6 +1305,7 @@ AT_CHECK([ovs-ofctl add-flow br0 in_port=br0,action=group:1234])
 AT_CHECK([ovs-ofctl add-flow br0 in_port=p0,action=normal])
 
 AT_CHECK([ovs-ofctl add-flow int-br action=normal])
+AT_CHECK([ovs-appctl revalidator/wait])
 
 dnl This ARP reply from p0 has two effects:
 dnl 1. The ARP cache will learn that 1.1.2.92 is at f8:bc:12:44:34:b6.
@@ -1372,6 +1391,7 @@ AT_CHECK([dnl
 
 AT_CHECK([ovs-ofctl add-flow br-ext actions=normal])
 AT_CHECK([ovs-ofctl add-flow br0 actions=normal])
+AT_CHECK([ovs-appctl revalidator/wait])
 
 dnl Make sure ephemeral ports stay static across tests.
 AT_CHECK([ovs-appctl tnl/egress_port_range 35190 35190], [0], [OK