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 <[email protected]> --- tests/tunnel-push-pop.at | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/tests/tunnel-push-pop.at b/tests/tunnel-push-pop.at index 8f67eae1e..795817d62 100644 --- a/tests/tunnel-push-pop.at +++ b/tests/tunnel-push-pop.at @@ -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]) @@ -88,7 +89,6 @@ AT_CHECK([tail -1 stdout], [0], dnl Check ERSPAN v2 tunnel push AT_CHECK([ovs-ofctl mod-flows 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=47,tos=0,ttl=64,frag=no)'], [0], [stdout]) AT_CHECK([tail -1 stdout], [0], [Datapath actions: tnl_push(tnl_port(3),header(size=54,type=107,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=47,tos=0,ttl=64,frag=0x4000),erspan(ver=2,sid=0x237,dir=1,hwid=0x7)),out_port(100)),1 @@ -96,7 +96,6 @@ AT_CHECK([tail -1 stdout], [0], dnl Check ERSPAN v2 flow-based tunnel push AT_CHECK([ovs-ofctl mod-flows int-br "action=set_field:1.1.2.94->tun_dst,set_field:1->tun_erspan_dir,set_field:0x1->tun_erspan_hwid,4"]) -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=47,tos=0,ttl=64,frag=no)'], [0], [stdout]) AT_CHECK([tail -1 stdout], [0], [Datapath actions: tnl_push(tnl_port(3),header(size=54,type=107,eth(dst=f8:bc:12:44:34:b8,src=aa:55:aa:55:00:00,dl_type=0x0800),ipv4(src=1.1.2.88,dst=1.1.2.94,proto=47,tos=0,ttl=64,frag=0x4000),erspan(ver=2,sid=0x1c8,dir=1,hwid=0x1)),out_port(100)),1 @@ -105,7 +104,6 @@ AT_CHECK([tail -1 stdout], [0], dnl Check ERSPAN v2 flow-based tunnel push, erspan_ver=flow dnl Dynamically set erspan v2 AT_CHECK([ovs-ofctl mod-flows int-br "action=set_field:1.1.2.94->tun_dst,set_field:2->tun_erspan_ver,set_field:1->tun_erspan_dir,set_field:0x1->tun_erspan_hwid,5"]) -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=47,tos=0,ttl=64,frag=no)'], [0], [stdout]) AT_CHECK([tail -1 stdout], [0], [Datapath actions: tnl_push(tnl_port(3),header(size=54,type=107,eth(dst=f8:bc:12:44:34:b8,src=aa:55:aa:55:00:00,dl_type=0x0800),ipv4(src=1.1.2.88,dst=1.1.2.94,proto=47,tos=0,ttl=64,frag=0x4000),erspan(ver=2,sid=0x38,dir=1,hwid=0x1)),out_port(100)),1 @@ -113,7 +111,6 @@ AT_CHECK([tail -1 stdout], [0], dnl Dynamically set erspan v1 AT_CHECK([ovs-ofctl mod-flows int-br "action=set_field:1.1.2.94->tun_dst,set_field:1->tun_erspan_ver,set_field:1->tun_erspan_idx,5"]) -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=47,tos=0,ttl=64,frag=no)'], [0], [stdout]) AT_CHECK([tail -1 stdout], [0], [Datapath actions: tnl_push(tnl_port(3),header(size=50,type=107,eth(dst=f8:bc:12:44:34:b8,src=aa:55:aa:55:00:00,dl_type=0x0800),ipv4(src=1.1.2.88,dst=1.1.2.94,proto=47,tos=0,ttl=64,frag=0x4000),erspan(ver=1,sid=0x38,idx=0x1)),out_port(100)),1 @@ -121,7 +118,6 @@ AT_CHECK([tail -1 stdout], [0], dnl Check ERSPAN v2 flow-based tunnel push AT_CHECK([ovs-ofctl mod-flows int-br "action=set_field:1.1.2.94->tun_dst,set_field:1->tun_erspan_dir,set_field:0x1->tun_erspan_hwid,4"]) -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=47,tos=0,ttl=64,frag=no)'], [0], [stdout]) AT_CHECK([tail -1 stdout], [0], [Datapath actions: tnl_push(tnl_port(3),header(size=54,type=107,eth(dst=f8:bc:12:44:34:b8,src=aa:55:aa:55:00:00,dl_type=0x0800),ipv4(src=1.1.2.88,dst=1.1.2.94,proto=47,tos=0,ttl=64,frag=0x4000),erspan(ver=2,sid=0x1c8,dir=1,hwid=0x1)),out_port(100)),1 @@ -130,7 +126,6 @@ AT_CHECK([tail -1 stdout], [0], dnl Check ERSPAN v2 flow-based tunnel push, erspan_ver=flow dnl Dynamically set erspan v2 AT_CHECK([ovs-ofctl mod-flows int-br "action=set_field:1.1.2.94->tun_dst,set_field:2->tun_erspan_ver,set_field:1->tun_erspan_dir,set_field:0x1->tun_erspan_hwid,5"]) -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=47,tos=0,ttl=64,frag=no)'], [0], [stdout]) AT_CHECK([tail -1 stdout], [0], [Datapath actions: tnl_push(tnl_port(3),header(size=54,type=107,eth(dst=f8:bc:12:44:34:b8,src=aa:55:aa:55:00:00,dl_type=0x0800),ipv4(src=1.1.2.88,dst=1.1.2.94,proto=47,tos=0,ttl=64,frag=0x4000),erspan(ver=2,sid=0x38,dir=1,hwid=0x1)),out_port(100)),1 @@ -138,7 +133,6 @@ AT_CHECK([tail -1 stdout], [0], dnl Dynamically set erspan v1 AT_CHECK([ovs-ofctl mod-flows int-br "action=set_field:1.1.2.94->tun_dst,set_field:1->tun_erspan_ver,set_field:1->tun_erspan_idx,5"]) -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=47,tos=0,ttl=64,frag=no)'], [0], [stdout]) AT_CHECK([tail -1 stdout], [0], [Datapath actions: tnl_push(tnl_port(3),header(size=50,type=107,eth(dst=f8:bc:12:44:34:b8,src=aa:55:aa:55:00:00,dl_type=0x0800),ipv4(src=1.1.2.88,dst=1.1.2.94,proto=47,tos=0,ttl=64,frag=0x4000),erspan(ver=1,sid=0x38,idx=0x1)),out_port(100)),1 @@ -151,6 +145,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 +247,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 +509,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 +643,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 +669,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 +782,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 +793,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 +824,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 +846,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 +901,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 +983,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 +996,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 +1034,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 +1107,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 +1157,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 +1173,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 +1228,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 +1298,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 +1384,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 -- 2.50.1 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
