]> git.proxmox.com Git - ovs.git/blame - tests/system-traffic.at
lib: add to ovsdb-idl monitor_id
[ovs.git] / tests / system-traffic.at
CommitLineData
d7c5426b 1AT_BANNER([datapath-sanity])
69c2bdfe 2
d7c5426b 3AT_SETUP([datapath - ping between two ports])
cf7659b6
JR
4OVS_TRAFFIC_VSWITCHD_START()
5
6AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
69c2bdfe
AZ
7
8ADD_NAMESPACES(at_ns0, at_ns1)
9
10ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
11ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
12
de22d08f 13NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
cfe17b43 143 packets transmitted, 3 received, 0% packet loss, time 0ms
de22d08f
JS
15])
16NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
cfe17b43 173 packets transmitted, 3 received, 0% packet loss, time 0ms
de22d08f
JS
18])
19NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
cfe17b43
JS
203 packets transmitted, 3 received, 0% packet loss, time 0ms
21])
22
d7c5426b 23OVS_TRAFFIC_VSWITCHD_STOP
cfe17b43
JS
24AT_CLEANUP
25
e0b92701
DDP
26AT_SETUP([datapath - http between two ports])
27OVS_TRAFFIC_VSWITCHD_START()
28
29AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
30
31ADD_NAMESPACES(at_ns0, at_ns1)
32
33ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
34ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
35
36NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
373 packets transmitted, 3 received, 0% packet loss, time 0ms
38])
39
40NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
41NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
42
43OVS_TRAFFIC_VSWITCHD_STOP
44AT_CLEANUP
45
d7c5426b 46AT_SETUP([datapath - ping between two ports on vlan])
cf7659b6
JR
47OVS_TRAFFIC_VSWITCHD_START()
48
49AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
cfe17b43
JS
50
51ADD_NAMESPACES(at_ns0, at_ns1)
52
53ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
54ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
55
56ADD_VLAN(p0, at_ns0, 100, "10.2.2.1/24")
57ADD_VLAN(p1, at_ns1, 100, "10.2.2.2/24")
58
de22d08f 59NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
cfe17b43 603 packets transmitted, 3 received, 0% packet loss, time 0ms
de22d08f
JS
61])
62NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
cfe17b43 633 packets transmitted, 3 received, 0% packet loss, time 0ms
de22d08f
JS
64])
65NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
cfe17b43
JS
663 packets transmitted, 3 received, 0% packet loss, time 0ms
67])
68
d7c5426b 69OVS_TRAFFIC_VSWITCHD_STOP
cfe17b43
JS
70AT_CLEANUP
71
d7c5426b 72AT_SETUP([datapath - ping6 between two ports])
cf7659b6
JR
73OVS_TRAFFIC_VSWITCHD_START()
74
75AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
cfe17b43
JS
76
77ADD_NAMESPACES(at_ns0, at_ns1)
78
79ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
80ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
81
c10840ff
JS
82dnl Linux seems to take a little time to get its IPv6 stack in order. Without
83dnl waiting, we get occasional failures due to the following error:
cfe17b43 84dnl "connect: Cannot assign requested address"
c10840ff 85OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
cfe17b43 86
de22d08f 87NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
cfe17b43 883 packets transmitted, 3 received, 0% packet loss, time 0ms
de22d08f
JS
89])
90NS_CHECK_EXEC([at_ns0], [ping6 -s 1600 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
cfe17b43 913 packets transmitted, 3 received, 0% packet loss, time 0ms
de22d08f
JS
92])
93NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
cfe17b43
JS
943 packets transmitted, 3 received, 0% packet loss, time 0ms
95])
96
d7c5426b 97OVS_TRAFFIC_VSWITCHD_STOP
cfe17b43
JS
98AT_CLEANUP
99
d7c5426b 100AT_SETUP([datapath - ping6 between two ports on vlan])
cf7659b6
JR
101OVS_TRAFFIC_VSWITCHD_START()
102
103AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
cfe17b43
JS
104
105ADD_NAMESPACES(at_ns0, at_ns1)
106
107ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
108ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
109
110ADD_VLAN(p0, at_ns0, 100, "fc00:1::1/96")
111ADD_VLAN(p1, at_ns1, 100, "fc00:1::2/96")
112
c10840ff
JS
113dnl Linux seems to take a little time to get its IPv6 stack in order. Without
114dnl waiting, we get occasional failures due to the following error:
cfe17b43 115dnl "connect: Cannot assign requested address"
c10840ff 116OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
cfe17b43 117
de22d08f 118NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00:1::2 | FORMAT_PING], [0], [dnl
cfe17b43 1193 packets transmitted, 3 received, 0% packet loss, time 0ms
de22d08f
JS
120])
121NS_CHECK_EXEC([at_ns0], [ping6 -s 1600 -q -c 3 -i 0.3 -w 2 fc00:1::2 | FORMAT_PING], [0], [dnl
cfe17b43 1223 packets transmitted, 3 received, 0% packet loss, time 0ms
de22d08f
JS
123])
124NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00:1::2 | FORMAT_PING], [0], [dnl
cfe17b43
JS
1253 packets transmitted, 3 received, 0% packet loss, time 0ms
126])
127
d7c5426b 128OVS_TRAFFIC_VSWITCHD_STOP
69c2bdfe 129AT_CLEANUP
810e1785
JS
130
131AT_SETUP([datapath - ping over vxlan tunnel])
dfb21e96 132OVS_CHECK_VXLAN()
810e1785 133
cf7659b6
JR
134OVS_TRAFFIC_VSWITCHD_START()
135ADD_BR([br-underlay])
136
137AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
138AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
139
810e1785
JS
140ADD_NAMESPACES(at_ns0)
141
142dnl Set up underlay link from host into the namespace using veth pair.
143ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24")
144AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
145AT_CHECK([ip link set dev br-underlay up])
146
147dnl Set up tunnel endpoints on OVS outside the namespace and with a native
148dnl linux device inside the namespace.
149ADD_OVS_TUNNEL([vxlan], [br0], [at_vxlan0], [172.31.1.1], [10.1.1.100/24])
150ADD_NATIVE_TUNNEL([vxlan], [at_vxlan1], [at_ns0], [172.31.1.100], [10.1.1.1/24],
151 [id 0 dstport 4789])
152
153dnl First, check the underlay
154NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [0], [dnl
1553 packets transmitted, 3 received, 0% packet loss, time 0ms
156])
157
158dnl Okay, now check the overlay with different packet sizes
159NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
1603 packets transmitted, 3 received, 0% packet loss, time 0ms
161])
162NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
1633 packets transmitted, 3 received, 0% packet loss, time 0ms
164])
165NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
523256cc
JS
1663 packets transmitted, 3 received, 0% packet loss, time 0ms
167])
168
169OVS_TRAFFIC_VSWITCHD_STOP
170AT_CLEANUP
171
172AT_SETUP([datapath - ping over gre tunnel])
173OVS_CHECK_GRE()
174
175OVS_TRAFFIC_VSWITCHD_START()
176ADD_BR([br-underlay])
177
178AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
179AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
180
181ADD_NAMESPACES(at_ns0)
182
183dnl Set up underlay link from host into the namespace using veth pair.
184ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24")
185AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
186AT_CHECK([ip link set dev br-underlay up])
187
188dnl Set up tunnel endpoints on OVS outside the namespace and with a native
189dnl linux device inside the namespace.
190ADD_OVS_TUNNEL([gre], [br0], [at_gre0], [172.31.1.1], [10.1.1.100/24])
191ADD_NATIVE_TUNNEL([gretap], [ns_gre0], [at_ns0], [172.31.1.100], [10.1.1.1/24])
192
193dnl First, check the underlay
194NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [0], [dnl
1953 packets transmitted, 3 received, 0% packet loss, time 0ms
196])
197
198dnl Okay, now check the overlay with different packet sizes
199NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
2003 packets transmitted, 3 received, 0% packet loss, time 0ms
201])
202NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
2033 packets transmitted, 3 received, 0% packet loss, time 0ms
204])
205NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
92b8af2c
JS
2063 packets transmitted, 3 received, 0% packet loss, time 0ms
207])
208
209OVS_TRAFFIC_VSWITCHD_STOP
210AT_CLEANUP
211
212AT_SETUP([datapath - ping over geneve tunnel])
213OVS_CHECK_GENEVE()
214
215OVS_TRAFFIC_VSWITCHD_START()
216ADD_BR([br-underlay])
217
218AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
219AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
220
221ADD_NAMESPACES(at_ns0)
222
223dnl Set up underlay link from host into the namespace using veth pair.
224ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24")
225AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
226AT_CHECK([ip link set dev br-underlay up])
227
228dnl Set up tunnel endpoints on OVS outside the namespace and with a native
229dnl linux device inside the namespace.
230ADD_OVS_TUNNEL([geneve], [br0], [at_gnv0], [172.31.1.1], [10.1.1.100/24])
231ADD_NATIVE_TUNNEL([geneve], [ns_gnv0], [at_ns0], [172.31.1.100], [10.1.1.1/24],
232 [vni 0])
233
234dnl First, check the underlay
235NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [0], [dnl
2363 packets transmitted, 3 received, 0% packet loss, time 0ms
237])
238
239dnl Okay, now check the overlay with different packet sizes
240NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
2413 packets transmitted, 3 received, 0% packet loss, time 0ms
242])
243NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
2443 packets transmitted, 3 received, 0% packet loss, time 0ms
245])
246NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
810e1785
JS
2473 packets transmitted, 3 received, 0% packet loss, time 0ms
248])
249
250OVS_TRAFFIC_VSWITCHD_STOP
251AT_CLEANUP
07659514 252
aaca4fe0
WT
253AT_SETUP([datapath - basic truncate action])
254OVS_TRAFFIC_VSWITCHD_START()
255AT_CHECK([ovs-ofctl del-flows br0])
256
257dnl Create p0 and ovs-p0(1)
258ADD_NAMESPACES(at_ns0)
259ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
260NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address e6:66:c1:11:11:11])
261NS_CHECK_EXEC([at_ns0], [arp -s 10.1.1.2 e6:66:c1:22:22:22])
262
263dnl Create p1(3) and ovs-p1(2), packets received from ovs-p1 will appear in p1
264AT_CHECK([ip link add p1 type veth peer name ovs-p1])
265on_exit 'ip link del ovs-p1'
266AT_CHECK([ip link set dev ovs-p1 up])
267AT_CHECK([ip link set dev p1 up])
268AT_CHECK([ovs-vsctl add-port br0 ovs-p1 -- set interface ovs-p1 ofport_request=2])
269dnl Use p1 to check the truncated packet
270AT_CHECK([ovs-vsctl add-port br0 p1 -- set interface p1 ofport_request=3])
271
272dnl Create p2(5) and ovs-p2(4)
273AT_CHECK([ip link add p2 type veth peer name ovs-p2])
274on_exit 'ip link del ovs-p2'
275AT_CHECK([ip link set dev ovs-p2 up])
276AT_CHECK([ip link set dev p2 up])
277AT_CHECK([ovs-vsctl add-port br0 ovs-p2 -- set interface ovs-p2 ofport_request=4])
278dnl Use p2 to check the truncated packet
279AT_CHECK([ovs-vsctl add-port br0 p2 -- set interface p2 ofport_request=5])
280
281dnl basic test
282AT_CHECK([ovs-ofctl del-flows br0])
283AT_DATA([flows.txt], [dnl
284in_port=3 dl_dst=e6:66:c1:22:22:22 actions=drop
285in_port=5 dl_dst=e6:66:c1:22:22:22 actions=drop
286in_port=1 dl_dst=e6:66:c1:22:22:22 actions=output(port=2,max_len=100),output:4
287])
288AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
289
290dnl use this file as payload file for ncat
291AT_CHECK([dd if=/dev/urandom of=payload200.bin bs=200 count=1 2> /dev/null])
292on_exit 'rm -f payload200.bin'
a037f175 293NS_CHECK_EXEC([at_ns0], [nc $NC_EOF_OPT -u 10.1.1.2 1234 < payload200.bin])
aaca4fe0
WT
294
295dnl packet with truncated size
296AT_CHECK([ovs-appctl revalidator/purge], [0])
297AT_CHECK([ovs-ofctl dump-flows br0 table=0 | grep "in_port=3" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
298n_bytes=100
299])
300dnl packet with original size
301AT_CHECK([ovs-appctl revalidator/purge], [0])
302AT_CHECK([ovs-ofctl dump-flows br0 table=0 | grep "in_port=5" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
303n_bytes=242
304])
305
306dnl more complicated output actions
307AT_CHECK([ovs-ofctl del-flows br0])
308AT_DATA([flows.txt], [dnl
309in_port=3 dl_dst=e6:66:c1:22:22:22 actions=drop
310in_port=5 dl_dst=e6:66:c1:22:22:22 actions=drop
311in_port=1 dl_dst=e6:66:c1:22:22:22 actions=output(port=2,max_len=100),output:4,output(port=2,max_len=100),output(port=4,max_len=100),output:2,output(port=4,max_len=200),output(port=2,max_len=65535)
312])
313AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
314
a037f175 315NS_CHECK_EXEC([at_ns0], [nc $NC_EOF_OPT -u 10.1.1.2 1234 < payload200.bin])
aaca4fe0
WT
316
317dnl 100 + 100 + 242 + min(65535,242) = 684
318AT_CHECK([ovs-appctl revalidator/purge], [0])
319AT_CHECK([ovs-ofctl dump-flows br0 table=0 | grep "in_port=3" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
320n_bytes=684
321])
322dnl 242 + 100 + min(242,200) = 542
323AT_CHECK([ovs-ofctl dump-flows br0 table=0 | grep "in_port=5" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
324n_bytes=542
325])
326
327dnl SLOW_ACTION: disable kernel datapath truncate support
328dnl Repeat the test above, but exercise the SLOW_ACTION code path
329AT_CHECK([ovs-appctl dpif/disable-truncate], [0],
330[Datapath truncate action diabled
331])
332
333dnl SLOW_ACTION test1: check datapatch actions
334AT_CHECK([ovs-ofctl del-flows br0])
335AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
336
3041e1fc 337AT_CHECK([ovs-appctl ofproto/trace br0 "in_port=1,dl_type=0x800,dl_src=e6:66:c1:11:11:11,dl_dst=e6:66:c1:22:22:22,nw_src=192.168.0.1,nw_dst=192.168.0.2,nw_proto=6,tp_src=8,tp_dst=9"], [0], [stdout])
aaca4fe0
WT
338AT_CHECK([tail -3 stdout], [0],
339[Datapath actions: trunc(100),3,5,trunc(100),3,trunc(100),5,3,trunc(200),5,trunc(65535),3
340This flow is handled by the userspace slow path because it:
341 - Uses action(s) not supported by datapath.
342])
aaca4fe0
WT
343
344dnl SLOW_ACTION test2: check actual packet truncate
345AT_CHECK([ovs-ofctl del-flows br0])
346AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
a037f175 347NS_CHECK_EXEC([at_ns0], [nc $NC_EOF_OPT -u 10.1.1.2 1234 < payload200.bin])
aaca4fe0
WT
348
349dnl 100 + 100 + 242 + min(65535,242) = 684
350AT_CHECK([ovs-appctl revalidator/purge], [0])
351AT_CHECK([ovs-ofctl dump-flows br0 table=0 | grep "in_port=3" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
352n_bytes=684
353])
354
355dnl 242 + 100 + min(242,200) = 542
356AT_CHECK([ovs-ofctl dump-flows br0 table=0 | grep "in_port=5" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
357n_bytes=542
358])
359
360OVS_TRAFFIC_VSWITCHD_STOP
361AT_CLEANUP
362
363dnl Create 2 bridges and 2 namespaces to test truncate over
364dnl GRE tunnel:
365dnl br0: overlay bridge
366dnl ns1: connect to br0, with IP:10.1.1.2
367dnl br-underlay: with IP: 172.31.1.100
368dnl ns0: connect to br-underlay, with IP: 10.1.1.1
369AT_SETUP([datapath - truncate and output to gre tunnel])
370OVS_CHECK_GRE()
371OVS_TRAFFIC_VSWITCHD_START()
372
373ADD_BR([br-underlay])
374ADD_NAMESPACES(at_ns0)
375ADD_NAMESPACES(at_ns1)
376AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
377AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
378
379dnl Set up underlay link from host into the namespace using veth pair.
380ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24")
381AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
382AT_CHECK([ip link set dev br-underlay up])
383
384dnl Set up tunnel endpoints on OVS outside the namespace and with a native
385dnl linux device inside the namespace.
386ADD_OVS_TUNNEL([gre], [br0], [at_gre0], [172.31.1.1], [10.1.1.100/24])
387ADD_NATIVE_TUNNEL([gretap], [ns_gre0], [at_ns0], [172.31.1.100], [10.1.1.1/24])
388AT_CHECK([ovs-vsctl -- set interface at_gre0 ofport_request=1])
389NS_CHECK_EXEC([at_ns0], [ip link set dev ns_gre0 address e6:66:c1:11:11:11])
390NS_CHECK_EXEC([at_ns0], [arp -s 10.1.1.2 e6:66:c1:22:22:22])
391
392dnl Set up (p1 and ovs-p1) at br0
393ADD_VETH(p1, at_ns1, br0, '10.1.1.2/24')
394AT_CHECK([ovs-vsctl -- set interface ovs-p1 ofport_request=2])
395NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address e6:66:c1:22:22:22])
396NS_CHECK_EXEC([at_ns1], [arp -s 10.1.1.1 e6:66:c1:11:11:11])
397
398dnl Set up (p2 and ovs-p2) as loopback for verifying packet size
399AT_CHECK([ip link add p2 type veth peer name ovs-p2])
400on_exit 'ip link del ovs-p2'
401AT_CHECK([ip link set dev ovs-p2 up])
402AT_CHECK([ip link set dev p2 up])
403AT_CHECK([ovs-vsctl add-port br0 ovs-p2 -- set interface ovs-p2 ofport_request=3])
404AT_CHECK([ovs-vsctl add-port br0 p2 -- set interface p2 ofport_request=4])
405
406dnl use this file as payload file for ncat
407AT_CHECK([dd if=/dev/urandom of=payload200.bin bs=200 count=1 2> /dev/null])
408on_exit 'rm -f payload200.bin'
409
410AT_CHECK([ovs-ofctl del-flows br0])
411AT_DATA([flows.txt], [dnl
412priority=99,in_port=1,actions=output(port=2,max_len=100),output(port=3,max_len=100)
413priority=99,in_port=2,udp,actions=output(port=1,max_len=100)
414priority=1,in_port=4,ip,actions=drop
415priority=1,actions=drop
416])
417AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
418
419AT_CHECK([ovs-ofctl del-flows br-underlay])
420AT_DATA([flows-underlay.txt], [dnl
421priority=99,dl_type=0x0800,nw_proto=47,in_port=1,actions=LOCAL
422priority=99,dl_type=0x0800,nw_proto=47,in_port=LOCAL,ip_dst=172.31.1.1/24,actions=1
423priority=1,actions=drop
424])
425
426AT_CHECK([ovs-ofctl add-flows br-underlay flows-underlay.txt])
427
428dnl check tunnel push path, from at_ns1 to at_ns0
a037f175 429NS_CHECK_EXEC([at_ns1], [nc $NC_EOF_OPT -u 10.1.1.1 1234 < payload200.bin])
aaca4fe0
WT
430AT_CHECK([ovs-appctl revalidator/purge], [0])
431
432dnl Before truncation = ETH(14) + IP(20) + UDP(8) + 200 = 242B
433AT_CHECK([ovs-ofctl dump-flows br0 | grep "in_port=2" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
434n_bytes=242
435])
436dnl After truncation = outer ETH(14) + outer IP(20) + GRE(4) + 100 = 138B
437AT_CHECK([ovs-ofctl dump-flows br-underlay | grep "in_port=LOCAL" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
438n_bytes=138
439])
440
441dnl check tunnel pop path, from at_ns0 to at_ns1
a037f175 442NS_CHECK_EXEC([at_ns0], [nc $NC_EOF_OPT -u 10.1.1.2 5678 < payload200.bin])
aaca4fe0
WT
443dnl After truncation = 100 byte at loopback device p2(4)
444AT_CHECK([ovs-appctl revalidator/purge], [0])
445AT_CHECK([ovs-ofctl dump-flows br0 | grep "in_port=4" | awk --field-separator=', ' '{print $5}'], [0], [dnl
446n_bytes=100
447])
448
449dnl SLOW_ACTION: disable datapath truncate support
450dnl Repeat the test above, but exercise the SLOW_ACTION code path
451AT_CHECK([ovs-appctl dpif/disable-truncate], [0],
452[Datapath truncate action diabled
453])
454
455dnl SLOW_ACTION test1: check datapatch actions
456AT_CHECK([ovs-ofctl del-flows br0])
457AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
458
aaca4fe0
WT
459dnl SLOW_ACTION test2: check actual packet truncate
460AT_CHECK([ovs-ofctl del-flows br0])
461AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
462AT_CHECK([ovs-ofctl del-flows br-underlay])
463AT_CHECK([ovs-ofctl add-flows br-underlay flows-underlay.txt])
464
465dnl check tunnel push path, from at_ns1 to at_ns0
a037f175 466NS_CHECK_EXEC([at_ns1], [nc $NC_EOF_OPT -u 10.1.1.1 1234 < payload200.bin])
aaca4fe0
WT
467AT_CHECK([ovs-appctl revalidator/purge], [0])
468
469dnl Before truncation = ETH(14) + IP(20) + UDP(8) + 200 = 242B
470AT_CHECK([ovs-ofctl dump-flows br0 | grep "in_port=2" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
471n_bytes=242
472])
473dnl After truncation = outer ETH(14) + outer IP(20) + GRE(4) + 100 = 138B
474AT_CHECK([ovs-ofctl dump-flows br-underlay | grep "in_port=LOCAL" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
475n_bytes=138
476])
477
478dnl check tunnel pop path, from at_ns0 to at_ns1
a037f175 479NS_CHECK_EXEC([at_ns0], [nc $NC_EOF_OPT -u 10.1.1.2 5678 < payload200.bin])
aaca4fe0
WT
480dnl After truncation = 100 byte at loopback device p2(4)
481AT_CHECK([ovs-appctl revalidator/purge], [0])
482AT_CHECK([ovs-ofctl dump-flows br0 | grep "in_port=4" | awk --field-separator=', ' '{print $5}'], [0], [dnl
483n_bytes=100
484])
485
486OVS_TRAFFIC_VSWITCHD_STOP
487AT_CLEANUP
488
07659514
JS
489AT_SETUP([conntrack - controller])
490CHECK_CONNTRACK()
cf7659b6 491OVS_TRAFFIC_VSWITCHD_START()
07659514
JS
492
493ADD_NAMESPACES(at_ns0, at_ns1)
494
495ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
496ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
497
498dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
499AT_DATA([flows.txt], [dnl
500priority=1,action=drop
501priority=10,arp,action=normal
502priority=100,in_port=1,udp,action=ct(commit),controller
503priority=100,in_port=2,ct_state=-trk,udp,action=ct(table=0)
504priority=100,in_port=2,ct_state=+trk+est,udp,action=controller
505])
506
6cfa8ec3 507AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
07659514
JS
508
509AT_CAPTURE_FILE([ofctl_monitor.log])
510AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
511
512dnl Send an unsolicited reply from port 2. This should be dropped.
513AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 2 ct\(table=0\) '50540000000a50540000000908004500001c00000000001100000a0101020a0101010002000100080000'])
514
515dnl OK, now start a new connection from port 1.
516AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 1 ct\(commit\),controller '50540000000a50540000000908004500001c00000000001100000a0101010a0101020001000200080000'])
517
518dnl Now try a reply from port 2.
519AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 2 ct\(table=0\) '50540000000a50540000000908004500001c00000000001100000a0101020a0101010002000100080000'])
520
521dnl Check this output. We only see the latter two packets, not the first.
522AT_CHECK([cat ofctl_monitor.log], [0], [dnl
f274a047 523NXT_PACKET_IN2 (xid=0x0): total_len=42 in_port=1 (via action) data_len=42 (unbuffered)
07659514 524udp,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.1.1.1,nw_dst=10.1.1.2,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=1,tp_dst=2 udp_csum:0
f274a047 525NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=42 ct_state=est|rpl|trk,in_port=2 (via action) data_len=42 (unbuffered)
07659514
JS
526udp,vlan_tci=0x0000,dl_src=50:54:00:00:00:09,dl_dst=50:54:00:00:00:0a,nw_src=10.1.1.2,nw_dst=10.1.1.1,nw_tos=0,nw_ecn=0,nw_ttl=0,tp_src=2,tp_dst=1 udp_csum:0
527])
528
529OVS_TRAFFIC_VSWITCHD_STOP
530AT_CLEANUP
531
532AT_SETUP([conntrack - IPv4 HTTP])
533CHECK_CONNTRACK()
cf7659b6 534OVS_TRAFFIC_VSWITCHD_START()
07659514
JS
535
536ADD_NAMESPACES(at_ns0, at_ns1)
537
538ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
539ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
540
541dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
542AT_DATA([flows.txt], [dnl
543priority=1,action=drop
544priority=10,arp,action=normal
545priority=10,icmp,action=normal
546priority=100,in_port=1,tcp,action=ct(commit),2
547priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=0)
548priority=100,in_port=2,ct_state=+trk+est,tcp,action=1
549])
550
6cfa8ec3 551AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
07659514 552
07659514
JS
553dnl HTTP requests from ns0->ns1 should work fine.
554NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
555NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
556
ec3aa16c 557AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
420c73b2 558tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>)
07659514
JS
559])
560
561dnl HTTP requests from ns1->ns0 should fail due to network failure.
562dnl Try 3 times, in 1 second intervals.
563NETNS_DAEMONIZE([at_ns0], [[$PYTHON $srcdir/test-l7.py]], [http1.pid])
564NS_CHECK_EXEC([at_ns1], [wget 10.1.1.1 -t 3 -T 1 -v -o wget1.log], [4])
565
566OVS_TRAFFIC_VSWITCHD_STOP
567AT_CLEANUP
568
569AT_SETUP([conntrack - IPv6 HTTP])
570CHECK_CONNTRACK()
cf7659b6 571OVS_TRAFFIC_VSWITCHD_START()
07659514
JS
572
573ADD_NAMESPACES(at_ns0, at_ns1)
574
575ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
576ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
577
578dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
579AT_DATA([flows.txt], [dnl
580priority=1,action=drop
581priority=10,icmp6,action=normal
582priority=100,in_port=1,tcp6,action=ct(commit),2
583priority=100,in_port=2,ct_state=-trk,tcp6,action=ct(table=0)
584priority=100,in_port=2,ct_state=+trk+est,tcp6,action=1
585])
586
6cfa8ec3 587AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
07659514 588
c10840ff
JS
589dnl Linux seems to take a little time to get its IPv6 stack in order. Without
590dnl waiting, we get occasional failures due to the following error:
07659514 591dnl "connect: Cannot assign requested address"
c10840ff 592OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
07659514
JS
593
594dnl HTTP requests from ns0->ns1 should work fine.
595NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py http6]], [http0.pid])
596
597NS_CHECK_EXEC([at_ns0], [wget http://[[fc00::2]] -t 3 -T 1 --retry-connrefused -v -o wget0.log])
598
ec3aa16c 599AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
420c73b2 600tcp,orig=(src=fc00::1,dst=fc00::2,sport=<cleared>,dport=<cleared>),reply=(src=fc00::2,dst=fc00::1,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>)
ec3aa16c
DDP
601])
602
07659514
JS
603dnl HTTP requests from ns1->ns0 should fail due to network failure.
604dnl Try 3 times, in 1 second intervals.
605NETNS_DAEMONIZE([at_ns0], [[$PYTHON $srcdir/test-l7.py http6]], [http1.pid])
606NS_CHECK_EXEC([at_ns1], [wget http://[[fc00::1]] -t 3 -T 1 -v -o wget1.log], [4])
607
608OVS_TRAFFIC_VSWITCHD_STOP
609AT_CLEANUP
610
611AT_SETUP([conntrack - commit, recirc])
612CHECK_CONNTRACK()
cf7659b6 613OVS_TRAFFIC_VSWITCHD_START()
07659514
JS
614
615ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
616
617ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
618ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
619ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24")
620ADD_VETH(p3, at_ns3, br0, "10.1.1.4/24")
621
622dnl Allow any traffic from ns0->ns1, ns2->ns3.
623AT_DATA([flows.txt], [dnl
624priority=1,action=drop
625priority=10,arp,action=normal
626priority=10,icmp,action=normal
627priority=100,in_port=1,tcp,ct_state=-trk,action=ct(commit,table=0)
628priority=100,in_port=1,tcp,ct_state=+trk,action=2
629priority=100,in_port=2,tcp,ct_state=-trk,action=ct(table=0)
630priority=100,in_port=2,tcp,ct_state=+trk,action=1
631priority=100,in_port=3,tcp,ct_state=-trk,action=set_field:0->metadata,ct(table=0)
632priority=100,in_port=3,tcp,ct_state=+trk,metadata=0,action=set_field:1->metadata,ct(commit,table=0)
633priority=100,in_port=3,tcp,ct_state=+trk,metadata=1,action=4
634priority=100,in_port=4,tcp,ct_state=-trk,action=ct(commit,table=0)
635priority=100,in_port=4,tcp,ct_state=+trk,action=3
636])
637
6cfa8ec3 638AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
07659514
JS
639
640dnl HTTP requests from p0->p1 should work fine.
641NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
642NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
643
644dnl HTTP requests from p2->p3 should work fine.
645NETNS_DAEMONIZE([at_ns3], [[$PYTHON $srcdir/test-l7.py]], [http1.pid])
646NS_CHECK_EXEC([at_ns2], [wget 10.1.1.4 -t 3 -T 1 --retry-connrefused -v -o wget1.log])
647
648OVS_TRAFFIC_VSWITCHD_STOP
649AT_CLEANUP
650
651AT_SETUP([conntrack - preserve registers])
652CHECK_CONNTRACK()
cf7659b6 653OVS_TRAFFIC_VSWITCHD_START()
07659514
JS
654
655ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
656
657ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
658ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
659ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24")
660ADD_VETH(p3, at_ns3, br0, "10.1.1.4/24")
661
662dnl Allow any traffic from ns0->ns1, ns2->ns3.
663AT_DATA([flows.txt], [dnl
664priority=1,action=drop
665priority=10,arp,action=normal
666priority=10,icmp,action=normal
667priority=100,in_port=1,tcp,ct_state=-trk,action=ct(commit,table=0)
668priority=100,in_port=1,tcp,ct_state=+trk,action=2
669priority=100,in_port=2,tcp,ct_state=-trk,action=ct(table=0)
670priority=100,in_port=2,tcp,ct_state=+trk,action=1
671priority=100,in_port=3,tcp,ct_state=-trk,action=load:0->NXM_NX_REG0[[]],ct(table=0)
672priority=100,in_port=3,tcp,ct_state=+trk,reg0=0,action=load:1->NXM_NX_REG0[[]],ct(commit,table=0)
673priority=100,in_port=3,tcp,ct_state=+trk,reg0=1,action=4
674priority=100,in_port=4,tcp,ct_state=-trk,action=ct(commit,table=0)
675priority=100,in_port=4,tcp,ct_state=+trk,action=3
676])
677
6cfa8ec3 678AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
07659514
JS
679
680dnl HTTP requests from p0->p1 should work fine.
681NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
682NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
683
684dnl HTTP requests from p2->p3 should work fine.
685NETNS_DAEMONIZE([at_ns3], [[$PYTHON $srcdir/test-l7.py]], [http1.pid])
686NS_CHECK_EXEC([at_ns2], [wget 10.1.1.4 -t 3 -T 1 --retry-connrefused -v -o wget1.log])
687
688OVS_TRAFFIC_VSWITCHD_STOP
689AT_CLEANUP
690
691AT_SETUP([conntrack - invalid])
692CHECK_CONNTRACK()
cf7659b6 693OVS_TRAFFIC_VSWITCHD_START()
07659514
JS
694
695ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
696
697ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
698ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
699ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24")
700ADD_VETH(p3, at_ns3, br0, "10.1.1.4/24")
701
702dnl Pass traffic from ns0->ns1 without committing, but attempt to track in
703dnl the opposite direction. This should fail.
704dnl Pass traffic from ns3->ns4 without committing, and this time match
705dnl invalid traffic and allow it through.
706AT_DATA([flows.txt], [dnl
707priority=1,action=drop
708priority=10,arp,action=normal
709priority=10,icmp,action=normal
710priority=100,in_port=1,tcp,action=ct(),2
711priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=0)
712priority=100,in_port=2,ct_state=+trk+new,tcp,action=1
713priority=100,in_port=3,tcp,action=ct(),4
714priority=100,in_port=4,ct_state=-trk,tcp,action=ct(table=0)
715priority=100,in_port=4,ct_state=+trk+inv,tcp,action=3
716priority=100,in_port=4,ct_state=+trk+new,tcp,action=3
717])
718
6cfa8ec3 719AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
07659514
JS
720
721dnl We set up our rules to allow the request without committing. The return
722dnl traffic can't be identified, because the initial request wasn't committed.
723dnl For the first pair of ports, this means that the connection fails.
724NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
725NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log], [4])
726
727dnl For the second pair, we allow packets from invalid connections, so it works.
728NETNS_DAEMONIZE([at_ns3], [[$PYTHON $srcdir/test-l7.py]], [http1.pid])
729NS_CHECK_EXEC([at_ns2], [wget 10.1.1.4 -t 3 -T 1 --retry-connrefused -v -o wget1.log])
730
731OVS_TRAFFIC_VSWITCHD_STOP
732AT_CLEANUP
733
734AT_SETUP([conntrack - zones])
735CHECK_CONNTRACK()
cf7659b6 736OVS_TRAFFIC_VSWITCHD_START()
07659514
JS
737
738ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
739
740ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
741ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
742ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24")
743ADD_VETH(p3, at_ns3, br0, "10.1.1.4/24")
744
745dnl Allow any traffic from ns0->ns1. Allow return traffic, matching on zone.
746dnl For ns2->ns3, use a different zone and see that the match fails.
747AT_DATA([flows.txt], [dnl
748priority=1,action=drop
749priority=10,arp,action=normal
750priority=10,icmp,action=normal
751priority=100,in_port=1,tcp,action=ct(commit,zone=1),2
752priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=0,zone=1)
753priority=100,in_port=2,ct_state=+trk,ct_zone=1,tcp,action=1
754priority=100,in_port=3,tcp,action=ct(commit,zone=2),4
755priority=100,in_port=4,ct_state=-trk,tcp,action=ct(table=0,zone=2)
756priority=100,in_port=4,ct_state=+trk,ct_zone=1,tcp,action=3
757])
758
6cfa8ec3 759AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
07659514
JS
760
761dnl HTTP requests from p0->p1 should work fine.
762NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
763NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
764
ec3aa16c 765AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
420c73b2 766tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>)
07659514
JS
767])
768
769dnl HTTP requests from p2->p3 should fail due to network failure.
770dnl Try 3 times, in 1 second intervals.
771NETNS_DAEMONIZE([at_ns3], [[$PYTHON $srcdir/test-l7.py]], [http1.pid])
772NS_CHECK_EXEC([at_ns2], [wget 10.1.1.4 -t 3 -T 1 -v -o wget1.log], [4])
773
ec3aa16c 774AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.4)], [0], [dnl
420c73b2 775tcp,orig=(src=10.1.1.3,dst=10.1.1.4,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.4,dst=10.1.1.3,sport=<cleared>,dport=<cleared>),zone=2,protoinfo=(state=<cleared>)
07659514
JS
776])
777
778OVS_TRAFFIC_VSWITCHD_STOP
779AT_CLEANUP
780
781AT_SETUP([conntrack - zones from field])
782CHECK_CONNTRACK()
cf7659b6 783OVS_TRAFFIC_VSWITCHD_START()
07659514
JS
784
785ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
786
787ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
788ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
789ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24")
790ADD_VETH(p3, at_ns3, br0, "10.1.1.4/24")
791
792dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
793AT_DATA([flows.txt], [dnl
794priority=1,action=drop
795priority=10,arp,action=normal
796priority=10,icmp,action=normal
797priority=100,in_port=1,tcp,action=load:0x1001->NXM_NX_REG0[[0..15]],ct(commit,zone=NXM_NX_REG0[[0..15]]),2
798priority=100,in_port=2,ct_state=-trk,tcp,action=load:0x1001->NXM_NX_REG0[[0..15]],ct(table=0,zone=NXM_NX_REG0[[0..15]])
799priority=100,in_port=2,ct_state=+trk,ct_zone=0x1001,tcp,action=1
800priority=100,in_port=3,tcp,action=load:0x1002->NXM_NX_REG0[[0..15]],ct(commit,zone=NXM_NX_REG0[[0..15]]),4
801priority=100,in_port=4,ct_state=-trk,tcp,action=load:0x1002->NXM_NX_REG0[[0..15]],ct(table=0,zone=NXM_NX_REG0[[0..15]])
802priority=100,in_port=4,ct_state=+trk,ct_zone=0x1001,tcp,action=3
803])
804
6cfa8ec3 805AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
07659514
JS
806
807dnl HTTP requests from p0->p1 should work fine.
808NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
809NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
810
ec3aa16c 811AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
420c73b2 812tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=4097,protoinfo=(state=<cleared>)
07659514
JS
813])
814
815dnl HTTP requests from p2->p3 should fail due to network failure.
816dnl Try 3 times, in 1 second intervals.
817NETNS_DAEMONIZE([at_ns3], [[$PYTHON $srcdir/test-l7.py]], [http1.pid])
818NS_CHECK_EXEC([at_ns2], [wget 10.1.1.4 -t 3 -T 1 -v -o wget1.log], [4])
819
ec3aa16c 820AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.4)], [0], [dnl
420c73b2 821tcp,orig=(src=10.1.1.3,dst=10.1.1.4,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.4,dst=10.1.1.3,sport=<cleared>,dport=<cleared>),zone=4098,protoinfo=(state=<cleared>)
07659514
JS
822])
823
824OVS_TRAFFIC_VSWITCHD_STOP
825AT_CLEANUP
826
827AT_SETUP([conntrack - multiple bridges])
828CHECK_CONNTRACK()
829OVS_TRAFFIC_VSWITCHD_START(
cf7659b6 830 [_ADD_BR([br1]) --\
07659514
JS
831 add-port br0 patch+ -- set int patch+ type=patch options:peer=patch- --\
832 add-port br1 patch- -- set int patch- type=patch options:peer=patch+ --])
833
834ADD_NAMESPACES(at_ns0, at_ns1)
835
836ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
837ADD_VETH(p1, at_ns1, br1, "10.1.1.2/24")
838
839dnl Allow any traffic from ns0->br1, allow established in reverse.
840AT_DATA([flows-br0.txt], [dnl
841priority=1,action=drop
842priority=10,arp,action=normal
843priority=10,icmp,action=normal
844priority=100,in_port=2,tcp,ct_state=-trk,action=ct(commit,zone=1),1
845priority=100,in_port=1,tcp,ct_state=-trk,action=ct(table=0,zone=1)
846priority=100,in_port=1,tcp,ct_state=+trk+est,ct_zone=1,action=2
847])
848
849dnl Allow any traffic from br0->ns1, allow established in reverse.
850AT_DATA([flows-br1.txt], [dnl
851priority=1,action=drop
852priority=10,arp,action=normal
853priority=10,icmp,action=normal
854priority=100,in_port=1,tcp,ct_state=-trk,action=ct(table=0,zone=2)
855priority=100,in_port=1,tcp,ct_state=+trk+new,ct_zone=2,action=ct(commit,zone=2),2
856priority=100,in_port=1,tcp,ct_state=+trk+est,ct_zone=2,action=2
857priority=100,in_port=2,tcp,ct_state=-trk,action=ct(table=0,zone=2)
858priority=100,in_port=2,tcp,ct_state=+trk+est,ct_zone=2,action=ct(commit,zone=2),1
859])
860
6cfa8ec3
JR
861AT_CHECK([ovs-ofctl --bundle add-flows br0 flows-br0.txt])
862AT_CHECK([ovs-ofctl --bundle add-flows br1 flows-br1.txt])
07659514
JS
863
864dnl HTTP requests from p0->p1 should work fine.
865NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
866NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
867
868OVS_TRAFFIC_VSWITCHD_STOP
869AT_CLEANUP
870
871AT_SETUP([conntrack - multiple zones])
872CHECK_CONNTRACK()
cf7659b6 873OVS_TRAFFIC_VSWITCHD_START()
07659514
JS
874
875ADD_NAMESPACES(at_ns0, at_ns1)
876
877ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
878ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
879
880dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
881AT_DATA([flows.txt], [dnl
882priority=1,action=drop
883priority=10,arp,action=normal
884priority=10,icmp,action=normal
885priority=100,in_port=1,tcp,action=ct(commit,zone=1),ct(commit,zone=2),2
886priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=0,zone=2)
887priority=100,in_port=2,ct_state=+trk,ct_zone=2,tcp,action=1
888])
889
6cfa8ec3 890AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
07659514
JS
891
892dnl HTTP requests from p0->p1 should work fine.
893NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
894NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
895
896dnl (again) HTTP requests from p0->p1 should work fine.
897NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
898
ec3aa16c 899AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
420c73b2
JR
900tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>)
901tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=2,protoinfo=(state=<cleared>)
07659514
JS
902])
903
904OVS_TRAFFIC_VSWITCHD_STOP
905AT_CLEANUP
906
c2926d6d
JS
907AT_SETUP([conntrack - multiple zones, local])
908CHECK_CONNTRACK()
cf7659b6 909OVS_TRAFFIC_VSWITCHD_START()
c2926d6d
JS
910
911ADD_NAMESPACES(at_ns0)
912
913AT_CHECK([ip addr add dev br0 "10.1.1.1/24"])
914AT_CHECK([ip link set dev br0 up])
915on_exit 'ip addr del dev br0 "10.1.1.1/24"'
916ADD_VETH(p0, at_ns0, br0, "10.1.1.2/24")
917
918dnl Allow traffic from local stack to ns0. Only allow neighbour discovery,
919dnl return traffic from ns0 back to the local stack.
920AT_DATA([flows.txt], [dnl
921priority=1,action=drop
922priority=10,arp,action=normal
923priority=100,in_port=LOCAL,ip,ct_state=-trk,action=drop
924priority=100,in_port=LOCAL,ip,ct_state=+trk+new,action=ct(commit,zone=1),ct(commit,zone=2),1
925priority=100,in_port=LOCAL,ip,ct_state=+trk+est,action=ct(commit,zone=1),ct(commit,zone=2),1
926priority=100,in_port=1,ip,ct_state=-trk,action=ct(table=1,zone=1)
927table=1,priority=100,in_port=1,ip,ct_state=+trk+est,ct_zone=1,action=ct(table=2,zone=2)
928table=2,priority=100,in_port=1,ip,ct_state=+trk+est,ct_zone=2,action=LOCAL
929])
930
6cfa8ec3 931AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
c2926d6d
JS
932
933AT_CHECK([ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
9343 packets transmitted, 3 received, 0% packet loss, time 0ms
935])
936
937dnl HTTP requests from root namespace to p0 should work fine.
938NETNS_DAEMONIZE([at_ns0], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
939AT_CHECK([wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
940
941dnl (again) HTTP requests from root namespace to p0 should work fine.
942AT_CHECK([wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
943
ec3aa16c
DDP
944AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2) | grep "zone"], [0], [dnl
945icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,id=<cleared>),zone=1
946icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,id=<cleared>),zone=2
420c73b2
JR
947tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>)
948tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=2,protoinfo=(state=<cleared>)
c2926d6d
JS
949])
950
951OVS_TRAFFIC_VSWITCHD_STOP
952AT_CLEANUP
953
0e27c629
JS
954AT_SETUP([conntrack - multiple namespaces, internal ports])
955CHECK_CONNTRACK()
956OVS_TRAFFIC_VSWITCHD_START(
957 [set-fail-mode br0 secure -- ])
958
959ADD_NAMESPACES(at_ns0, at_ns1)
960
961ADD_INT(p0, at_ns0, br0, "10.1.1.1/24")
962ADD_INT(p1, at_ns1, br0, "10.1.1.2/24")
963
964dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
965dnl
966dnl If skb->nfct is leaking from inside the namespace, this test will fail.
967AT_DATA([flows.txt], [dnl
968priority=1,action=drop
969priority=10,arp,action=normal
970priority=10,icmp,action=normal
971priority=100,in_port=1,tcp,ct_state=-trk,action=ct(commit,zone=1),2
972priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=0,zone=1)
973priority=100,in_port=2,ct_state=+trk,ct_zone=1,tcp,action=1
974])
975
976AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
977
978dnl HTTP requests from p0->p1 should work fine.
979NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
980NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
981
982dnl (again) HTTP requests from p0->p1 should work fine.
983NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
984
ec3aa16c 985AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
420c73b2 986tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>)
0e27c629
JS
987])
988
989OVS_TRAFFIC_VSWITCHD_STOP(["dnl
990/ioctl(SIOCGIFINDEX) on .* device failed: No such device/d
991/removing policing failed: No such device/d"])
992AT_CLEANUP
993
c2926d6d
JS
994AT_SETUP([conntrack - multi-stage pipeline, local])
995CHECK_CONNTRACK()
cf7659b6 996OVS_TRAFFIC_VSWITCHD_START()
c2926d6d
JS
997
998ADD_NAMESPACES(at_ns0)
999
1000AT_CHECK([ip addr add dev br0 "10.1.1.1/24"])
1001AT_CHECK([ip link set dev br0 up])
1002on_exit 'ip addr del dev br0 "10.1.1.1/24"'
1003ADD_VETH(p0, at_ns0, br0, "10.1.1.2/24")
1004
1005dnl Allow traffic from local stack to ns0. Only allow neighbour discovery,
1006dnl return traffic from ns0 back to the local stack.
1007AT_DATA([flows.txt], [dnl
1008dnl default
1009table=0,priority=1,action=drop
1010table=0,priority=10,arp,action=normal
1011
1012dnl Load the output port to REG0
1013table=0,priority=100,ip,in_port=LOCAL,action=load:1->NXM_NX_REG0[[0..15]],goto_table:1
1014table=0,priority=100,ip,in_port=1,action=load:65534->NXM_NX_REG0[[0..15]],goto_table:1
1015
1016dnl Ingress pipeline
1017dnl - Allow all connections from LOCAL port (commit and proceed to egress)
1018dnl - All other connections go through conntracker using the input port as
1019dnl a connection tracking zone.
1020table=1,priority=150,in_port=LOCAL,ip,ct_state=+trk+new,action=ct(commit,zone=OXM_OF_IN_PORT[[0..15]]),goto_table:2
1021table=1,priority=100,ip,action=ct(table=2,zone=OXM_OF_IN_PORT[[0..15]])
1022table=1,priority=1,action=drop
1023
1024dnl Egress pipeline
1025dnl - Allow all connections from LOCAL port (commit and skip to output)
1026dnl - Allow other established connections to go through conntracker using
1027dnl output port as a connection tracking zone.
1028table=2,priority=150,in_port=LOCAL,ip,ct_state=+trk+new,action=ct(commit,zone=NXM_NX_REG0[[0..15]]),goto_table:4
1029table=2,priority=100,ip,ct_state=+trk+est,action=ct(table=3,zone=NXM_NX_REG0[[0..15]])
1030table=2,priority=1,action=drop
1031
1032dnl Only allow established traffic from egress ct lookup
1033table=3,priority=100,ip,ct_state=+trk+est,action=goto_table:4
1034table=3,priority=1,action=drop
1035
1036dnl output table
1037table=4,priority=100,ip,action=output:NXM_NX_REG0[[]]
1038])
1039
6cfa8ec3 1040AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
c2926d6d
JS
1041
1042AT_CHECK([ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
10433 packets transmitted, 3 received, 0% packet loss, time 0ms
1044])
1045
1046dnl HTTP requests from root namespace to p0 should work fine.
1047NETNS_DAEMONIZE([at_ns0], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
1048AT_CHECK([wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
1049
1050dnl (again) HTTP requests from root namespace to p0 should work fine.
1051AT_CHECK([wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
1052
ec3aa16c
DDP
1053AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2) | grep "zone"], [0], [dnl
1054icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,id=<cleared>),zone=1
1055icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,id=<cleared>),zone=65534
420c73b2
JR
1056tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>)
1057tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=65534,protoinfo=(state=<cleared>)
c2926d6d
JS
1058])
1059
1060OVS_TRAFFIC_VSWITCHD_STOP
1061AT_CLEANUP
1062
8e53fe8c
JS
1063AT_SETUP([conntrack - ct_mark])
1064CHECK_CONNTRACK()
cf7659b6 1065OVS_TRAFFIC_VSWITCHD_START()
8e53fe8c
JS
1066
1067ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
1068
1069ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1070ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1071ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24")
1072ADD_VETH(p3, at_ns3, br0, "10.1.1.4/24")
1073
1074dnl Allow traffic between ns0<->ns1 using the ct_mark.
1075dnl Check that different marks do not match for traffic between ns2<->ns3.
1076AT_DATA([flows.txt], [dnl
1077priority=1,action=drop
1078priority=10,arp,action=normal
1079priority=10,icmp,action=normal
1080priority=100,in_port=1,tcp,action=ct(commit,exec(set_field:1->ct_mark)),2
1081priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=0)
1082priority=100,in_port=2,ct_state=+trk,ct_mark=1,tcp,action=1
1083priority=100,in_port=3,tcp,action=ct(commit,exec(set_field:2->ct_mark)),4
1084priority=100,in_port=4,ct_state=-trk,tcp,action=ct(table=0)
1085priority=100,in_port=4,ct_state=+trk,ct_mark=1,tcp,action=3
1086])
1087
6cfa8ec3 1088AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
8e53fe8c
JS
1089
1090dnl HTTP requests from p0->p1 should work fine.
1091NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
1092NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
1093
420c73b2
JR
1094AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
1095tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),mark=1,protoinfo=(state=<cleared>)
8e53fe8c
JS
1096])
1097
1098dnl HTTP requests from p2->p3 should fail due to network failure.
1099dnl Try 3 times, in 1 second intervals.
1100NETNS_DAEMONIZE([at_ns3], [[$PYTHON $srcdir/test-l7.py]], [http1.pid])
1101NS_CHECK_EXEC([at_ns2], [wget 10.1.1.4 -t 3 -T 1 -v -o wget1.log], [4])
1102
ec3aa16c 1103AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.4)], [0], [dnl
420c73b2 1104tcp,orig=(src=10.1.1.3,dst=10.1.1.4,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.4,dst=10.1.1.3,sport=<cleared>,dport=<cleared>),mark=2,protoinfo=(state=<cleared>)
8e53fe8c
JS
1105])
1106
1107OVS_TRAFFIC_VSWITCHD_STOP
1108AT_CLEANUP
1109
4d182934
JS
1110AT_SETUP([conntrack - ct_mark bit-fiddling])
1111CHECK_CONNTRACK()
1112OVS_TRAFFIC_VSWITCHD_START()
1113
1114ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
1115
1116ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1117ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1118
1119dnl Allow traffic between ns0<->ns1 using the ct_mark. Return traffic should
1120dnl cause an additional bit to be set in the connection (and be allowed).
1121AT_DATA([flows.txt], [dnl
1122table=0,priority=1,action=drop
1123table=0,priority=10,arp,action=normal
1124table=0,priority=10,icmp,action=normal
1125table=0,priority=100,in_port=1,tcp,action=ct(table=1)
1126table=0,priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=1,commit,exec(set_field:0x2/0x6->ct_mark))
1127table=1,priority=100,in_port=1,ct_state=+new,tcp,action=ct(commit,exec(set_field:0x5/0x5->ct_mark)),2
1128table=1,priority=100,in_port=1,ct_state=-new,tcp,action=2
1129table=1,priority=100,in_port=2,ct_state=+trk,ct_mark=3,tcp,action=1
1130])
1131
1132AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
1133
1134dnl HTTP requests from p0->p1 should work fine.
1135NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
1136NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
1137
420c73b2
JR
1138AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
1139tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),mark=3,protoinfo=(state=<cleared>)
4d182934
JS
1140])
1141
1142OVS_TRAFFIC_VSWITCHD_STOP
1143AT_CLEANUP
1144
8e53fe8c
JS
1145AT_SETUP([conntrack - ct_mark from register])
1146CHECK_CONNTRACK()
cf7659b6 1147OVS_TRAFFIC_VSWITCHD_START()
8e53fe8c
JS
1148
1149ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
1150
1151ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1152ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1153ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24")
1154ADD_VETH(p3, at_ns3, br0, "10.1.1.4/24")
1155
1156dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
1157AT_DATA([flows.txt], [dnl
1158priority=1,action=drop
1159priority=10,arp,action=normal
1160priority=10,icmp,action=normal
1161priority=100,in_port=1,tcp,action=load:1->NXM_NX_REG0[[0..31]],ct(commit,exec(move:NXM_NX_REG0[[0..31]]->NXM_NX_CT_MARK[[]])),2
1162priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=0)
1163priority=100,in_port=2,ct_state=+trk,ct_mark=1,tcp,action=1
1164priority=100,in_port=3,tcp,action=load:2->NXM_NX_REG0[[0..31]],ct(commit,exec(move:NXM_NX_REG0[[0..31]]->NXM_NX_CT_MARK[[]])),4
1165priority=100,in_port=4,ct_state=-trk,tcp,action=ct(table=0)
1166priority=100,in_port=4,ct_state=+trk,ct_mark=1,tcp,action=3
1167])
1168
6cfa8ec3 1169AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
8e53fe8c
JS
1170
1171dnl HTTP requests from p0->p1 should work fine.
1172NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
1173NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
1174
420c73b2
JR
1175AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
1176tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),mark=1,protoinfo=(state=<cleared>)
8e53fe8c
JS
1177])
1178
1179dnl HTTP requests from p2->p3 should fail due to network failure.
1180dnl Try 3 times, in 1 second intervals.
1181NETNS_DAEMONIZE([at_ns3], [[$PYTHON $srcdir/test-l7.py]], [http1.pid])
1182NS_CHECK_EXEC([at_ns2], [wget 10.1.1.4 -t 3 -T 1 -v -o wget1.log], [4])
1183
ec3aa16c 1184AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.4)], [0], [dnl
420c73b2 1185tcp,orig=(src=10.1.1.3,dst=10.1.1.4,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.4,dst=10.1.1.3,sport=<cleared>,dport=<cleared>),mark=2,protoinfo=(state=<cleared>)
8e53fe8c
JS
1186])
1187
1188OVS_TRAFFIC_VSWITCHD_STOP
1189AT_CLEANUP
1190
9daf2348
JS
1191AT_SETUP([conntrack - ct_label])
1192CHECK_CONNTRACK()
cf7659b6 1193OVS_TRAFFIC_VSWITCHD_START()
9daf2348
JS
1194
1195ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
1196
1197ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1198ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1199ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24")
1200ADD_VETH(p3, at_ns3, br0, "10.1.1.4/24")
1201
1202dnl Allow traffic between ns0<->ns1 using the ct_label.
1203dnl Check that different labels do not match for traffic between ns2<->ns3.
1204AT_DATA([flows.txt], [dnl
1205priority=1,action=drop
1206priority=10,arp,action=normal
1207priority=10,icmp,action=normal
1208priority=100,in_port=1,tcp,action=ct(commit,exec(set_field:0x0a000d000005000001->ct_label)),2
1209priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=0)
1210priority=100,in_port=2,ct_state=+trk,ct_label=0x0a000d000005000001,tcp,action=1
1211priority=100,in_port=3,tcp,action=ct(commit,exec(set_field:0x2->ct_label)),4
1212priority=100,in_port=4,ct_state=-trk,tcp,action=ct(table=0)
1213priority=100,in_port=4,ct_state=+trk,ct_label=0x0a000d000005000001,tcp,action=3
1214])
1215
6cfa8ec3 1216AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
9daf2348
JS
1217
1218dnl HTTP requests from p0->p1 should work fine.
1219NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
1220NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
1221
1222dnl HTTP requests from p2->p3 should fail due to network failure.
1223dnl Try 3 times, in 1 second intervals.
1224NETNS_DAEMONIZE([at_ns3], [[$PYTHON $srcdir/test-l7.py]], [http1.pid])
1225NS_CHECK_EXEC([at_ns2], [wget 10.1.1.4 -t 3 -T 1 -v -o wget1.log], [4])
1226
1227OVS_TRAFFIC_VSWITCHD_STOP
1228AT_CLEANUP
1229
4d182934
JS
1230AT_SETUP([conntrack - ct_label bit-fiddling])
1231CHECK_CONNTRACK()
1232OVS_TRAFFIC_VSWITCHD_START()
1233
1234ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
1235
1236ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1237ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1238
1239dnl Allow traffic between ns0<->ns1 using the ct_labels. Return traffic should
1240dnl cause an additional bit to be set in the connection labels (and be allowed)
1241AT_DATA([flows.txt], [dnl
1242table=0,priority=1,action=drop
1243table=0,priority=10,arp,action=normal
1244table=0,priority=10,icmp,action=normal
1245table=0,priority=100,in_port=1,tcp,action=ct(table=1)
1246table=0,priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=1,commit,exec(set_field:0x200000000/0x200000004->ct_label))
1247table=1,priority=100,in_port=1,tcp,ct_state=+new,action=ct(commit,exec(set_field:0x5/0x5->ct_label)),2
1248table=1,priority=100,in_port=1,tcp,ct_state=-new,action=2
1249table=1,priority=100,in_port=2,ct_state=+trk,ct_label=0x200000001,tcp,action=1
1250])
1251
1252AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
1253
1254dnl HTTP requests from p0->p1 should work fine.
1255NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
1256NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
1257
420c73b2
JR
1258AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
1259tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),labels=0x200000001,protoinfo=(state=<cleared>)
4d182934
JS
1260])
1261
1262OVS_TRAFFIC_VSWITCHD_STOP
1263AT_CLEANUP
1264
f2d105b5
JS
1265AT_SETUP([conntrack - ct metadata, multiple zones])
1266CHECK_CONNTRACK()
1267OVS_TRAFFIC_VSWITCHD_START()
1268
1269ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
1270
1271ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1272ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1273
1274dnl Allow traffic between ns0<->ns1 using the ct_mark and ct_labels in zone=1,
1275dnl but do *not* set any of these for the ct() in zone=2. Traffic should pass,
1276dnl and we should see that the conntrack entries only apply the ct_mark and
1277dnl ct_labels to the connection in zone=1.
1278AT_DATA([flows.txt], [dnl
1279table=0,priority=1,action=drop
1280table=0,priority=10,arp,action=normal
1281table=0,priority=10,icmp,action=normal
1282table=0,priority=100,in_port=1,tcp,action=ct(zone=1,table=1)
1283table=0,priority=100,in_port=2,ct_state=-trk,tcp,action=ct(zone=1,table=1,commit,exec(set_field:0x200000000/0x200000004->ct_label,set_field:0x2/0x6->ct_mark))
1284table=1,priority=100,in_port=1,tcp,ct_state=+new,action=ct(zone=1,commit,exec(set_field:0x5/0x5->ct_label,set_field:0x5/0x5->ct_mark)),ct(commit,zone=2),2
1285table=1,priority=100,in_port=1,tcp,ct_state=-new,action=ct(zone=2),2
1286table=1,priority=100,in_port=2,tcp,action=ct(zone=2),1
1287])
1288
1289AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
1290
1291dnl HTTP requests from p0->p1 should work fine.
1292NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
1293NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
1294
420c73b2
JR
1295AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
1296tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=1,mark=3,labels=0x200000001,protoinfo=(state=<cleared>)
1297tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=2,protoinfo=(state=<cleared>)
f2d105b5
JS
1298])
1299
1300OVS_TRAFFIC_VSWITCHD_STOP
1301AT_CLEANUP
1302
8e53fe8c
JS
1303AT_SETUP([conntrack - ICMP related])
1304CHECK_CONNTRACK()
cf7659b6 1305OVS_TRAFFIC_VSWITCHD_START()
8e53fe8c
JS
1306
1307ADD_NAMESPACES(at_ns0, at_ns1)
1308
1309ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1310ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1311
1312dnl Allow UDP traffic from ns0->ns1. Only allow related ICMP responses back.
1313AT_DATA([flows.txt], [dnl
1314priority=1,action=drop
1315priority=10,arp,action=normal
1316priority=100,in_port=1,udp,action=ct(commit,exec(set_field:1->ct_mark)),2
1317priority=100,in_port=2,icmp,ct_state=-trk,action=ct(table=0)
1318priority=100,in_port=2,icmp,ct_state=+trk+rel,ct_mark=1,action=1
1319])
1320
6cfa8ec3 1321AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
8e53fe8c 1322
bde2e7b5 1323dnl UDP packets from ns0->ns1 should solicit "destination unreachable" response.
b54971f7 1324NS_CHECK_EXEC([at_ns0], [bash -c "echo a | nc $NC_EOF_OPT -u 10.1.1.2 10000"])
8e53fe8c
JS
1325
1326AT_CHECK([ovs-appctl revalidator/purge], [0])
1327AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort | grep -v drop], [0], [dnl
1328 n_packets=1, n_bytes=44, priority=100,udp,in_port=1 actions=ct(commit,exec(load:0x1->NXM_NX_CT_MARK[[]])),output:2
1329 n_packets=1, n_bytes=72, priority=100,ct_state=+rel+trk,ct_mark=0x1,icmp,in_port=2 actions=output:1
1330 n_packets=1, n_bytes=72, priority=100,ct_state=-trk,icmp,in_port=2 actions=ct(table=0)
bde2e7b5 1331 n_packets=2, n_bytes=84, priority=10,arp actions=NORMAL
8e53fe8c
JS
1332NXST_FLOW reply:
1333])
1334
1335OVS_TRAFFIC_VSWITCHD_STOP
1336AT_CLEANUP
1337
07659514
JS
1338AT_SETUP([conntrack - ICMP related 2])
1339CHECK_CONNTRACK()
cf7659b6 1340OVS_TRAFFIC_VSWITCHD_START()
07659514
JS
1341
1342ADD_NAMESPACES(at_ns0, at_ns1)
1343
1344ADD_VETH(p0, at_ns0, br0, "172.16.0.1/24")
1345ADD_VETH(p1, at_ns1, br0, "172.16.0.2/24")
1346
1347dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
1348AT_DATA([flows.txt], [dnl
1349priority=1,action=drop
1350priority=10,arp,action=normal
6cfa8ec3
JR
1351priority=100,in_port=1,udp,ct_state=-trk,action=ct(commit,table=0)
1352priority=100,in_port=1,ip,ct_state=+trk,actions=controller
1353priority=100,in_port=2,ip,ct_state=-trk,action=ct(table=0)
1354priority=100,in_port=2,ip,ct_state=+trk+rel+rpl,action=controller
07659514
JS
1355])
1356
6cfa8ec3 1357AT_CHECK([ovs-ofctl --bundle replace-flows br0 flows.txt])
07659514
JS
1358
1359AT_CAPTURE_FILE([ofctl_monitor.log])
1360AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
1361
1362dnl 1. Send an ICMP port unreach reply for port 8738, without any previous request
1363AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 2 ct\(table=0\) 'f64c473528c9c6f54ecb72db080045c0003d2e8700004001f355ac100004ac1000030303553f0000000045000021317040004011b138ac100003ac10000411112222000d20966369616f0a'])
1364
1365dnl 2. Send and UDP packet to port 5555
1366AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 1 ct\(commit,table=0\) 'c6f94ecb72dbe64c473528c9080045000021317040004011b138ac100001ac100002a28e15b3000d20966369616f0a'])
1367
1368dnl 3. Send an ICMP port unreach reply for port 5555, related to the first packet
1369AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 2 ct\(table=0\) 'e64c473528c9c6f94ecb72db080045c0003d2e8700004001f355ac100002ac1000010303553f0000000045000021317040004011b138ac100001ac100002a28e15b3000d20966369616f0a'])
1370
1371dnl Check this output. We only see the latter two packets, not the first.
1372AT_CHECK([cat ofctl_monitor.log], [0], [dnl
f274a047 1373NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=47 ct_state=new|trk,in_port=1 (via action) data_len=47 (unbuffered)
07659514 1374udp,vlan_tci=0x0000,dl_src=e6:4c:47:35:28:c9,dl_dst=c6:f9:4e:cb:72:db,nw_src=172.16.0.1,nw_dst=172.16.0.2,nw_tos=0,nw_ecn=0,nw_ttl=64,tp_src=41614,tp_dst=5555 udp_csum:2096
f274a047 1375NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=75 ct_state=rel|rpl|trk,in_port=2 (via action) data_len=75 (unbuffered)
07659514
JS
1376icmp,vlan_tci=0x0000,dl_src=c6:f9:4e:cb:72:db,dl_dst=e6:4c:47:35:28:c9,nw_src=172.16.0.2,nw_dst=172.16.0.1,nw_tos=192,nw_ecn=0,nw_ttl=64,icmp_type=3,icmp_code=3 icmp_csum:553f
1377])
1378
1379OVS_TRAFFIC_VSWITCHD_STOP
1380AT_CLEANUP
d787ad39
JS
1381
1382AT_SETUP([conntrack - FTP])
1383AT_SKIP_IF([test $HAVE_PYFTPDLIB = no])
1384CHECK_CONNTRACK()
cf7659b6 1385OVS_TRAFFIC_VSWITCHD_START()
d787ad39
JS
1386
1387ADD_NAMESPACES(at_ns0, at_ns1)
1388
1389ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1390ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1391
1392dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
1393AT_DATA([flows1.txt], [dnl
1394priority=1,action=drop
1395priority=10,arp,action=normal
1396priority=10,icmp,action=normal
1397priority=100,in_port=1,tcp,action=ct(alg=ftp,commit),2
1398priority=100,in_port=2,tcp,ct_state=-trk,action=ct(table=0)
1399priority=100,in_port=2,tcp,ct_state=+trk+est,action=1
1400priority=100,in_port=2,tcp,ct_state=+trk+rel,action=1
1401])
1402
1403dnl Similar policy but without allowing all traffic from ns0->ns1.
1404AT_DATA([flows2.txt], [dnl
1405priority=1,action=drop
1406priority=10,arp,action=normal
1407priority=10,icmp,action=normal
1408priority=100,in_port=1,tcp,ct_state=-trk,action=ct(table=0)
1409priority=100,in_port=1,tcp,ct_state=+trk+new,action=ct(commit,alg=ftp),2
1410priority=100,in_port=1,tcp,ct_state=+trk+est,action=2
1411priority=100,in_port=2,tcp,ct_state=-trk,action=ct(table=0)
1412priority=100,in_port=2,tcp,ct_state=+trk+new+rel,action=ct(commit),1
1413priority=100,in_port=2,tcp,ct_state=+trk+est,action=1
1414priority=100,in_port=2,tcp,ct_state=+trk-new+rel,action=1
1415])
1416
6cfa8ec3 1417AT_CHECK([ovs-ofctl --bundle replace-flows br0 flows1.txt])
d787ad39
JS
1418
1419NETNS_DAEMONIZE([at_ns0], [[$PYTHON $srcdir/test-l7.py ftp]], [ftp1.pid])
1420NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py ftp]], [ftp0.pid])
20322d4b 1421OVS_WAIT_UNTIL([ip netns exec at_ns1 netstat -l | grep ftp])
d787ad39
JS
1422
1423dnl FTP requests from p1->p0 should fail due to network failure.
1424dnl Try 3 times, in 1 second intervals.
1425NS_CHECK_EXEC([at_ns1], [wget ftp://10.1.1.1 --no-passive-ftp -t 3 -T 1 -v -o wget1.log], [4])
ec3aa16c 1426AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.1)], [0], [dnl
d787ad39
JS
1427])
1428
1429dnl FTP requests from p0->p1 should work fine.
1430NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v -o wget0.log])
420c73b2
JR
1431AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
1432tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>),helper=ftp
d787ad39
JS
1433])
1434
1435dnl Try the second set of flows.
6cfa8ec3 1436AT_CHECK([ovs-ofctl --bundle replace-flows br0 flows2.txt])
ec3aa16c 1437AT_CHECK([ovs-appctl dpctl/flush-conntrack])
d787ad39
JS
1438
1439dnl FTP requests from p1->p0 should fail due to network failure.
1440dnl Try 3 times, in 1 second intervals.
1441NS_CHECK_EXEC([at_ns1], [wget ftp://10.1.1.1 --no-passive-ftp -t 3 -T 1 -v -o wget1.log], [4])
ec3aa16c 1442AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.1)], [0], [dnl
d787ad39
JS
1443])
1444
1445dnl Active FTP requests from p0->p1 should work fine.
9ac0aada 1446NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v -o wget0-1.log])
420c73b2
JR
1447AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
1448tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>),helper=ftp
1449tcp,orig=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>)
d787ad39
JS
1450])
1451
ec3aa16c 1452AT_CHECK([ovs-appctl dpctl/flush-conntrack])
d787ad39
JS
1453
1454dnl Passive FTP requests from p0->p1 should work fine.
9ac0aada 1455NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0-2.log])
420c73b2
JR
1456AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
1457tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>)
1458tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>),helper=ftp
d787ad39
JS
1459])
1460
1461OVS_TRAFFIC_VSWITCHD_STOP
1462AT_CLEANUP
1463
2fa3e06d
JR
1464
1465AT_SETUP([conntrack - IPv6 FTP])
1466AT_SKIP_IF([test $HAVE_PYFTPDLIB = no])
1467CHECK_CONNTRACK()
1468OVS_TRAFFIC_VSWITCHD_START()
1469
1470ADD_NAMESPACES(at_ns0, at_ns1)
1471
1472ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
1473ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
1474
1475dnl Allow any traffic from ns0->ns1.
1476dnl Only allow nd, return traffic from ns1->ns0.
1477AT_DATA([flows.txt], [dnl
1478dnl Track all IPv6 traffic and drop the rest.
1479dnl Allow ICMPv6 both ways. No commit, so pings will not be tracked.
1480table=0 priority=100 in_port=1 icmp6, action=2
1481table=0 priority=100 in_port=2 icmp6, action=1
1482table=0 priority=10 ip6, action=ct(table=1)
1483table=0 priority=0 action=drop
1484dnl
1485dnl Table 1
1486dnl
1487dnl Allow new TCPv6 FTP control connections from port 1.
1488table=1 in_port=1 ct_state=+new, tcp6, tp_dst=21, action=ct(alg=ftp,commit),2
1489dnl Allow related TCPv6 connections from port 2.
1490table=1 in_port=2 ct_state=+new+rel, tcp6, action=ct(commit),1
1491dnl Allow established TCPv6 connections both ways.
1492table=1 in_port=1 ct_state=+est, tcp6, action=2
1493table=1 in_port=2 ct_state=+est, tcp6, action=1
1494dnl Drop everything else.
1495table=1 priority=0, action=drop
1496])
1497
1498AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
1499
c10840ff
JS
1500dnl Linux seems to take a little time to get its IPv6 stack in order. Without
1501dnl waiting, we get occasional failures due to the following error:
1502dnl "connect: Cannot assign requested address"
1503OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2 >/dev/null])
1504
2fa3e06d 1505NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py ftp]], [ftp0.pid])
20322d4b 1506OVS_WAIT_UNTIL([ip netns exec at_ns1 netstat -l | grep ftp])
2fa3e06d
JR
1507
1508dnl FTP requests from p0->p1 should work fine.
1509NS_CHECK_EXEC([at_ns0], [wget ftp://[[fc00::2]] -6 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v --server-response --no-proxy --no-remove-listing -o wget0.log -d])
1510
ec3aa16c 1511dnl Discards CLOSE_WAIT and CLOSING
420c73b2
JR
1512AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
1513tcp,orig=(src=fc00::1,dst=fc00::2,sport=<cleared>,dport=<cleared>),reply=(src=fc00::2,dst=fc00::1,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>),helper=ftp
1514tcp,orig=(src=fc00::2,dst=fc00::1,sport=<cleared>,dport=<cleared>),reply=(src=fc00::1,dst=fc00::2,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>)
2fa3e06d
JR
1515])
1516
1517OVS_TRAFFIC_VSWITCHD_STOP
1518AT_CLEANUP
1519
1520
d787ad39
JS
1521AT_SETUP([conntrack - FTP with multiple expectations])
1522AT_SKIP_IF([test $HAVE_PYFTPDLIB = no])
1523CHECK_CONNTRACK()
cf7659b6 1524OVS_TRAFFIC_VSWITCHD_START()
d787ad39
JS
1525
1526ADD_NAMESPACES(at_ns0, at_ns1)
1527
1528ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1529ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1530
1531dnl Dual-firewall, allow all from ns1->ns2, allow established and ftp ns2->ns1.
1532AT_DATA([flows.txt], [dnl
1533priority=1,action=drop
1534priority=10,arp,action=normal
1535priority=10,icmp,action=normal
1536priority=100,in_port=1,tcp,ct_state=-trk,action=ct(table=0,zone=1)
1537priority=100,in_port=1,tcp,ct_zone=1,ct_state=+trk+new,action=ct(commit,alg=ftp,zone=1),ct(commit,alg=ftp,zone=2),2
1538priority=100,in_port=1,tcp,ct_zone=1,ct_state=+trk+est,action=ct(table=0,zone=2)
1539priority=100,in_port=1,tcp,ct_zone=2,ct_state=+trk+new,action=ct(commit,alg=ftp,zone=2)
1540priority=100,in_port=1,tcp,ct_zone=2,ct_state=+trk+est,action=2
1541priority=100,in_port=2,tcp,ct_state=-trk,action=ct(table=0,zone=2)
1542priority=100,in_port=2,tcp,ct_zone=2,ct_state=+trk+rel,action=ct(commit,zone=2),ct(commit,zone=1),1
1543priority=100,in_port=2,tcp,ct_zone=2,ct_state=+trk+est,action=ct(table=0,zone=1)
1544priority=100,in_port=2,tcp,ct_zone=1,ct_state=+trk+rel,action=ct(commit,zone=2),ct(commit,zone=1),1
1545priority=100,in_port=2,tcp,ct_zone=1,ct_state=+trk+est,action=1
1546])
1547
6cfa8ec3 1548AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
d787ad39
JS
1549
1550NETNS_DAEMONIZE([at_ns0], [[$PYTHON $srcdir/test-l7.py ftp]], [ftp1.pid])
1551NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py ftp]], [ftp0.pid])
1552
1553dnl FTP requests from p1->p0 should fail due to network failure.
1554dnl Try 3 times, in 1 second intervals.
1555NS_CHECK_EXEC([at_ns1], [wget ftp://10.1.1.1 --no-passive-ftp -t 3 -T 1 -v -o wget1.log], [4])
ec3aa16c 1556AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.1)], [0], [dnl
d787ad39
JS
1557])
1558
1559dnl Active FTP requests from p0->p1 should work fine.
1560NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v -o wget0.log])
420c73b2
JR
1561AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
1562tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>),helper=ftp
1563tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=2,protoinfo=(state=<cleared>),helper=ftp
1564tcp,orig=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>)
1565tcp,orig=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),zone=2,protoinfo=(state=<cleared>)
d787ad39
JS
1566])
1567
ec3aa16c 1568AT_CHECK([ovs-appctl dpctl/flush-conntrack])
d787ad39
JS
1569
1570dnl Passive FTP requests from p0->p1 should work fine.
1571NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
420c73b2
JR
1572AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
1573tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>)
1574tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>),helper=ftp
1575tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=2,protoinfo=(state=<cleared>)
1576tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=2,protoinfo=(state=<cleared>),helper=ftp
d787ad39
JS
1577])
1578
1579OVS_TRAFFIC_VSWITCHD_STOP
1580AT_CLEANUP
27130224
AZ
1581
1582AT_SETUP([conntrack - IPv4 fragmentation ])
1583CHECK_CONNTRACK()
cf7659b6 1584OVS_TRAFFIC_VSWITCHD_START()
27130224
AZ
1585
1586ADD_NAMESPACES(at_ns0, at_ns1)
1587
1588ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1589ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1590
1591dnl Sending ping through conntrack
1592AT_DATA([flows.txt], [dnl
1593priority=1,action=drop
1594priority=10,arp,action=normal
1595priority=100,in_port=1,icmp,action=ct(commit,zone=9),2
1596priority=100,in_port=2,ct_state=-trk,icmp,action=ct(table=0,zone=9)
1597priority=100,in_port=2,ct_state=+trk+est-new,icmp,action=1
1598])
1599
6cfa8ec3 1600AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
27130224 1601
27130224
AZ
1602dnl Ipv4 fragmentation connectivity check.
1603NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
16043 packets transmitted, 3 received, 0% packet loss, time 0ms
1605])
1606
1607dnl Ipv4 larger fragmentation connectivity check.
1608NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
16093 packets transmitted, 3 received, 0% packet loss, time 0ms
1610])
1611
1612OVS_TRAFFIC_VSWITCHD_STOP
1613AT_CLEANUP
1614
0cf28088
JS
1615AT_SETUP([conntrack - IPv4 fragmentation expiry])
1616CHECK_CONNTRACK()
1617OVS_TRAFFIC_VSWITCHD_START()
1618
1619ADD_NAMESPACES(at_ns0, at_ns1)
1620
1621ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1622ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1623
1624AT_DATA([flows.txt], [dnl
1625priority=1,action=drop
1626priority=10,arp,action=normal
1627
1628dnl Only allow non-fragmented messages and 1st fragments of each message
1629priority=100,in_port=1,icmp,ip_frag=no,action=ct(commit,zone=9),2
1630priority=100,in_port=1,icmp,ip_frag=firstaction=ct(commit,zone=9),2
1631priority=100,in_port=2,ct_state=-trk,icmp,action=ct(table=0,zone=9)
1632priority=100,in_port=2,ct_state=+trk+est-new,icmp,action=1
1633])
1634
1635AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
1636
0cf28088
JS
1637dnl Ipv4 fragmentation connectivity check.
1638NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 1 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
16397 packets transmitted, 0 received, 100% packet loss, time 0ms
1640])
1641
1642OVS_TRAFFIC_VSWITCHD_STOP
1643AT_CLEANUP
1644
27130224
AZ
1645AT_SETUP([conntrack - IPv4 fragmentation + vlan])
1646CHECK_CONNTRACK()
cf7659b6 1647OVS_TRAFFIC_VSWITCHD_START()
27130224
AZ
1648
1649ADD_NAMESPACES(at_ns0, at_ns1)
1650
1651ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1652ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1653ADD_VLAN(p0, at_ns0, 100, "10.2.2.1/24")
1654ADD_VLAN(p1, at_ns1, 100, "10.2.2.2/24")
1655
1656dnl Sending ping through conntrack
1657AT_DATA([flows.txt], [dnl
1658priority=1,action=drop
1659priority=10,arp,action=normal
1660priority=100,in_port=1,icmp,action=ct(commit,zone=9),2
1661priority=100,in_port=2,ct_state=-trk,icmp,action=ct(table=0,zone=9)
1662priority=100,in_port=2,ct_state=+trk+est-new,icmp,action=1
1663])
1664
6cfa8ec3 1665AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
27130224 1666
27130224
AZ
1667dnl Ipv4 fragmentation connectivity check.
1668NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
16693 packets transmitted, 3 received, 0% packet loss, time 0ms
1670])
1671
1672dnl Ipv4 larger fragmentation connectivity check.
1673NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
16743 packets transmitted, 3 received, 0% packet loss, time 0ms
1675])
1676
1677OVS_TRAFFIC_VSWITCHD_STOP
1678AT_CLEANUP
1679
1680AT_SETUP([conntrack - IPv6 fragmentation])
1681CHECK_CONNTRACK()
cf7659b6 1682OVS_TRAFFIC_VSWITCHD_START()
27130224
AZ
1683
1684ADD_NAMESPACES(at_ns0, at_ns1)
1685
1686ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
1687ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
1688
1689dnl Sending ping through conntrack
1690AT_DATA([flows.txt], [dnl
1691priority=1,action=drop
1692priority=10,in_port=1,ipv6,action=ct(commit,zone=9),2
1693priority=10,in_port=2,ct_state=-trk,ipv6,action=ct(table=0,zone=9)
1694priority=10,in_port=2,ct_state=+trk+est-new,ipv6,action=1
1695priority=100,icmp6,icmp_type=135,action=normal
1696priority=100,icmp6,icmp_type=136,action=normal
1697])
1698
6cfa8ec3 1699AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
27130224 1700
c10840ff
JS
1701dnl Linux seems to take a little time to get its IPv6 stack in order. Without
1702dnl waiting, we get occasional failures due to the following error:
27130224 1703dnl "connect: Cannot assign requested address"
c10840ff 1704OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
27130224 1705
221a2668 1706dnl Ipv6 fragmentation connectivity check.
27130224
AZ
1707NS_CHECK_EXEC([at_ns0], [ping6 -s 1600 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
17083 packets transmitted, 3 received, 0% packet loss, time 0ms
1709])
1710
221a2668 1711dnl Ipv6 larger fragmentation connectivity check.
27130224
AZ
1712NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
17133 packets transmitted, 3 received, 0% packet loss, time 0ms
1714])
1715
1716OVS_TRAFFIC_VSWITCHD_STOP
1717AT_CLEANUP
1718
0cf28088
JS
1719AT_SETUP([conntrack - IPv6 fragmentation expiry])
1720CHECK_CONNTRACK()
1721OVS_TRAFFIC_VSWITCHD_START()
1722
1723ADD_NAMESPACES(at_ns0, at_ns1)
1724
1725ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
1726ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
1727
1728AT_DATA([flows.txt], [dnl
1729priority=1,action=drop
1730
1731dnl Only allow non-fragmented messages and 1st fragments of each message
1732priority=10,in_port=1,ipv6,ip_frag=first,action=ct(commit,zone=9),2
1733priority=10,in_port=1,ipv6,ip_frag=no,action=ct(commit,zone=9),2
1734priority=10,in_port=2,ct_state=-trk,ipv6,action=ct(table=0,zone=9)
1735priority=10,in_port=2,ct_state=+trk+est-new,ipv6,action=1
1736
1737dnl Neighbour Discovery
1738priority=100,icmp6,icmp_type=135,action=normal
1739priority=100,icmp6,icmp_type=136,action=normal
1740])
1741
1742AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
1743
c10840ff
JS
1744dnl Linux seems to take a little time to get its IPv6 stack in order. Without
1745dnl waiting, we get occasional failures due to the following error:
0cf28088 1746dnl "connect: Cannot assign requested address"
c10840ff 1747OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
0cf28088 1748
0cf28088
JS
1749dnl Send an IPv6 fragment. Some time later, it should expire.
1750NS_CHECK_EXEC([at_ns0], [ping6 -s 1600 -q -c 1 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
17517 packets transmitted, 0 received, 100% packet loss, time 0ms
1752])
1753
1754dnl At this point, the kernel will either crash or everything is OK.
1755
1756OVS_TRAFFIC_VSWITCHD_STOP
1757AT_CLEANUP
1758
27130224
AZ
1759AT_SETUP([conntrack - IPv6 fragmentation + vlan])
1760CHECK_CONNTRACK()
cf7659b6 1761OVS_TRAFFIC_VSWITCHD_START()
27130224
AZ
1762
1763ADD_NAMESPACES(at_ns0, at_ns1)
1764
1765ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
1766ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
1767
1768ADD_VLAN(p0, at_ns0, 100, "fc00:1::3/96")
1769ADD_VLAN(p1, at_ns1, 100, "fc00:1::4/96")
1770
1771dnl Sending ping through conntrack
1772AT_DATA([flows.txt], [dnl
1773priority=1,action=drop
1774priority=10,in_port=1,ipv6,action=ct(commit,zone=9),2
1775priority=10,in_port=2,ct_state=-trk,ipv6,action=ct(table=0,zone=9)
1776priority=10,in_port=2,ct_state=+trk+est-new,ipv6,action=1
1777priority=100,icmp6,icmp_type=135,action=normal
1778priority=100,icmp6,icmp_type=136,action=normal
1779])
1780
6cfa8ec3 1781AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
27130224 1782
c10840ff
JS
1783dnl Linux seems to take a little time to get its IPv6 stack in order. Without
1784dnl waiting, we get occasional failures due to the following error:
27130224 1785dnl "connect: Cannot assign requested address"
c10840ff 1786OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
27130224 1787
27130224
AZ
1788dnl Ipv4 fragmentation connectivity check.
1789NS_CHECK_EXEC([at_ns0], [ping6 -s 1600 -q -c 3 -i 0.3 -w 2 fc00:1::4 | FORMAT_PING], [0], [dnl
17903 packets transmitted, 3 received, 0% packet loss, time 0ms
1791])
1792
1793dnl Ipv4 larger fragmentation connectivity check.
1794NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00:1::4 | FORMAT_PING], [0], [dnl
17953 packets transmitted, 3 received, 0% packet loss, time 0ms
1796])
1797
1798OVS_TRAFFIC_VSWITCHD_STOP
1799AT_CLEANUP
1800
1801AT_SETUP([conntrack - Fragmentation over vxlan])
dfb21e96 1802OVS_CHECK_VXLAN()
27130224
AZ
1803CHECK_CONNTRACK()
1804
cf7659b6
JR
1805OVS_TRAFFIC_VSWITCHD_START()
1806ADD_BR([br-underlay])
1807AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
1808
27130224
AZ
1809ADD_NAMESPACES(at_ns0)
1810
1811dnl Sending ping through conntrack
1812AT_DATA([flows.txt], [dnl
1813priority=1,action=drop
1814priority=10,arp,action=normal
1815priority=100,in_port=1,icmp,action=ct(commit,zone=9),LOCAL
3a9eb803
JS
1816priority=100,in_port=LOCAL,icmp,action=ct(table=1,zone=9)
1817table=1,priority=100,in_port=LOCAL,ct_state=+trk+est,icmp,action=1
27130224
AZ
1818])
1819
6cfa8ec3 1820AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
27130224
AZ
1821
1822dnl Set up underlay link from host into the namespace using veth pair.
1823ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24")
1824AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
1825AT_CHECK([ip link set dev br-underlay up])
1826
1827dnl Set up tunnel endpoints on OVS outside the namespace and with a native
1828dnl linux device inside the namespace.
6e3a764c 1829ADD_OVS_TUNNEL([vxlan], [br0], [at_vxlan0], [172.31.1.1], [10.1.1.100/24])
27130224
AZ
1830ADD_NATIVE_TUNNEL([vxlan], [at_vxlan1], [at_ns0], [172.31.1.100], [10.1.1.1/24],
1831 [id 0 dstport 4789])
1832
1833dnl First, check the underlay
1834NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [0], [dnl
18353 packets transmitted, 3 received, 0% packet loss, time 0ms
1836])
1837
1838dnl Okay, now check the overlay with different packet sizes
1839NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
18403 packets transmitted, 3 received, 0% packet loss, time 0ms
1841])
1842NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
18433 packets transmitted, 3 received, 0% packet loss, time 0ms
1844])
1845NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
18463 packets transmitted, 3 received, 0% packet loss, time 0ms
1847])
1848
1849OVS_TRAFFIC_VSWITCHD_STOP
1850AT_CLEANUP
c4e34c61 1851
84f646df 1852AT_SETUP([conntrack - IPv6 Fragmentation over vxlan])
a9f70f3d 1853OVS_CHECK_VXLAN()
84f646df
JS
1854CHECK_CONNTRACK()
1855
1856OVS_TRAFFIC_VSWITCHD_START()
1857ADD_BR([br-underlay])
1858AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
1859
1860ADD_NAMESPACES(at_ns0)
1861
1862dnl Sending ping through conntrack
1863AT_DATA([flows.txt], [dnl
1864priority=1,action=drop
1865priority=100,in_port=1,ipv6,action=ct(commit,zone=9),LOCAL
1866priority=100,in_port=LOCAL,ipv6,action=ct(table=1,zone=9)
1867table=1,priority=100,in_port=LOCAL,ct_state=+trk+est,ipv6,action=1
1868
1869dnl Neighbour Discovery
1870priority=1000,icmp6,icmp_type=135,action=normal
1871priority=1000,icmp6,icmp_type=136,action=normal
1872])
1873
1874AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
1875
1876dnl Set up underlay link from host into the namespace using veth pair.
1877ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24")
1878AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
1879AT_CHECK([ip link set dev br-underlay up])
1880
1881dnl Set up tunnel endpoints on OVS outside the namespace and with a native
1882dnl linux device inside the namespace.
6e3a764c 1883ADD_OVS_TUNNEL([vxlan], [br0], [at_vxlan0], [172.31.1.1], ["fc00::2/96"])
84f646df
JS
1884ADD_NATIVE_TUNNEL([vxlan], [at_vxlan1], [at_ns0], [172.31.1.100], ["fc00::1/96"],
1885 [id 0 dstport 4789])
1886
c10840ff
JS
1887dnl Linux seems to take a little time to get its IPv6 stack in order. Without
1888dnl waiting, we get occasional failures due to the following error:
84f646df 1889dnl "connect: Cannot assign requested address"
c10840ff 1890OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
84f646df
JS
1891
1892dnl First, check the underlay
1893NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [0], [dnl
18943 packets transmitted, 3 received, 0% packet loss, time 0ms
1895])
1896
1897dnl Okay, now check the overlay with different packet sizes
1898NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
18993 packets transmitted, 3 received, 0% packet loss, time 0ms
1900])
1901NS_CHECK_EXEC([at_ns0], [ping6 -s 1600 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
19023 packets transmitted, 3 received, 0% packet loss, time 0ms
1903])
1904NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
19053 packets transmitted, 3 received, 0% packet loss, time 0ms
1906])
1907
1908OVS_TRAFFIC_VSWITCHD_STOP
1909AT_CLEANUP
9ac0aada 1910
c4e34c61
RB
1911AT_SETUP([conntrack - resubmit to ct multiple times])
1912CHECK_CONNTRACK()
1913
1914OVS_TRAFFIC_VSWITCHD_START(
1915 [set-fail-mode br0 secure -- ])
1916
1917ADD_NAMESPACES(at_ns0, at_ns1)
1918
1919ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1920ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1921
1922AT_DATA([flows.txt], [dnl
1923table=0,priority=150,arp,action=normal
1924table=0,priority=100,ip,in_port=1,action=resubmit(,1),resubmit(,2)
1925
1926table=1,priority=100,ip,action=ct(table=3)
1927table=2,priority=100,ip,action=ct(table=3)
1928
1929table=3,ip,action=drop
1930])
1931
1932AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1933
1934NS_CHECK_EXEC([at_ns0], [ping -q -c 1 10.1.1.2 | FORMAT_PING], [0], [dnl
19351 packets transmitted, 0 received, 100% packet loss, time 0ms
1936])
1937
1938AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
1939 n_packets=1, n_bytes=98, priority=100,ip,in_port=1 actions=resubmit(,1),resubmit(,2)
1940 n_packets=2, n_bytes=84, priority=150,arp actions=NORMAL
1941 table=1, n_packets=1, n_bytes=98, priority=100,ip actions=ct(table=3)
1942 table=2, n_packets=1, n_bytes=98, priority=100,ip actions=ct(table=3)
1943 table=3, n_packets=2, n_bytes=196, ip actions=drop
1944NXST_FLOW reply:
1945])
1946
1947OVS_TRAFFIC_VSWITCHD_STOP
1948AT_CLEANUP
9ac0aada
JR
1949
1950
1951AT_SETUP([conntrack - simple SNAT])
1952CHECK_CONNTRACK()
1953OVS_TRAFFIC_VSWITCHD_START()
1954
1955ADD_NAMESPACES(at_ns0, at_ns1)
1956
1957ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1958NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
1959ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1960
1961dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
1962AT_DATA([flows.txt], [dnl
1963in_port=1,ip,action=ct(commit,zone=1,nat(src=10.1.1.240-10.1.1.255)),2
1964in_port=2,ct_state=-trk,ip,action=ct(table=0,zone=1,nat)
1965in_port=2,ct_state=+trk,ct_zone=1,ip,action=1
1966dnl
1967dnl ARP
1968priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
1969priority=10 arp action=normal
1970priority=0,action=drop
1971dnl
1972dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
1973table=8,reg2=0x0a0101f0/0xfffffff0,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
1974table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
1975dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
1976dnl TPA IP in reg2.
1977dnl Swaps the fields of the ARP message to turn a query to a response.
1978table=10 priority=100 arp xreg0=0 action=normal
1979table=10 priority=10,arp,arp_op=1,action=load:2->OXM_OF_ARP_OP[[]],move:OXM_OF_ARP_SHA[[]]->OXM_OF_ARP_THA[[]],move:OXM_OF_PKT_REG0[[0..47]]->OXM_OF_ARP_SHA[[]],move:OXM_OF_ARP_SPA[[]]->OXM_OF_ARP_TPA[[]],move:NXM_NX_REG2[[]]->OXM_OF_ARP_SPA[[]],move:NXM_OF_ETH_SRC[[]]->NXM_OF_ETH_DST[[]],move:OXM_OF_PKT_REG0[[0..47]]->NXM_OF_ETH_SRC[[]],move:NXM_OF_IN_PORT[[]]->NXM_NX_REG3[[0..15]],load:0->NXM_OF_IN_PORT[[]],output:NXM_NX_REG3[[0..15]]
1980table=10 priority=0 action=drop
1981])
1982
1983AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
1984
1985dnl HTTP requests from p0->p1 should work fine.
1986NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
1987NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 5 -T 1 --retry-connrefused -v -o wget0.log])
1988
a857bb69 1989AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2) | sed -e 's/dst=10.1.1.2[[45]][[0-9]]/dst=10.1.1.2XX/'], [0], [dnl
420c73b2 1990tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.2XX,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>)
9ac0aada
JR
1991])
1992
1993OVS_TRAFFIC_VSWITCHD_STOP
1994AT_CLEANUP
1995
1996
1997AT_SETUP([conntrack - SNAT with port range])
1998CHECK_CONNTRACK()
1999OVS_TRAFFIC_VSWITCHD_START()
2000
2001ADD_NAMESPACES(at_ns0, at_ns1)
2002
2003ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2004NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
2005ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2006
2007dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
2008AT_DATA([flows.txt], [dnl
2009in_port=1,tcp,action=ct(commit,zone=1,nat(src=10.1.1.240-10.1.1.255:34567-34568,random)),2
2010in_port=2,ct_state=-trk,tcp,tp_dst=34567,action=ct(table=0,zone=1,nat)
2011in_port=2,ct_state=-trk,tcp,tp_dst=34568,action=ct(table=0,zone=1,nat)
2012in_port=2,ct_state=+trk,ct_zone=1,tcp,action=1
2013dnl
2014dnl ARP
2015priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
2016priority=10 arp action=normal
2017priority=0,action=drop
2018dnl
2019dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
2020table=8,reg2=0x0a0101f0/0xfffffff0,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
2021table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
2022dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
2023dnl TPA IP in reg2.
2024dnl Swaps the fields of the ARP message to turn a query to a response.
2025table=10 priority=100 arp xreg0=0 action=normal
2026table=10 priority=10,arp,arp_op=1,action=load:2->OXM_OF_ARP_OP[[]],move:OXM_OF_ARP_SHA[[]]->OXM_OF_ARP_THA[[]],move:OXM_OF_PKT_REG0[[0..47]]->OXM_OF_ARP_SHA[[]],move:OXM_OF_ARP_SPA[[]]->OXM_OF_ARP_TPA[[]],move:NXM_NX_REG2[[]]->OXM_OF_ARP_SPA[[]],move:NXM_OF_ETH_SRC[[]]->NXM_OF_ETH_DST[[]],move:OXM_OF_PKT_REG0[[0..47]]->NXM_OF_ETH_SRC[[]],move:NXM_OF_IN_PORT[[]]->NXM_NX_REG3[[0..15]],load:0->NXM_OF_IN_PORT[[]],output:NXM_NX_REG3[[0..15]]
2027table=10 priority=0 action=drop
2028])
2029
2030AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2031
2032dnl HTTP requests from p0->p1 should work fine.
2033NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
2034NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 5 -T 1 --retry-connrefused -v -o wget0.log])
2035
a857bb69 2036AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2) | sed -e 's/dst=10.1.1.2[[45]][[0-9]]/dst=10.1.1.2XX/'], [0], [dnl
420c73b2 2037tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.2XX,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>)
9ac0aada
JR
2038])
2039
2040OVS_TRAFFIC_VSWITCHD_STOP
2041AT_CLEANUP
2042
2043
2044AT_SETUP([conntrack - more complex SNAT])
2045CHECK_CONNTRACK()
2046OVS_TRAFFIC_VSWITCHD_START()
2047
2048ADD_NAMESPACES(at_ns0, at_ns1)
2049
2050ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2051NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
2052ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2053
2054AT_DATA([flows.txt], [dnl
2055dnl Track all IP traffic, NAT existing connections.
2056priority=100 ip action=ct(table=1,zone=1,nat)
2057dnl
2058dnl Allow ARP, but generate responses for NATed addresses
2059priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
2060priority=10 arp action=normal
2061priority=0 action=drop
2062dnl
2063dnl Allow any traffic from ns0->ns1. SNAT ns0 to 10.1.1.240-10.1.1.255
2064table=1 priority=100 in_port=1 ip ct_state=+trk+new-est action=ct(commit,zone=1,nat(src=10.1.1.240-10.1.1.255)),2
2065table=1 priority=100 in_port=1 ip ct_state=+trk-new+est action=2
2066dnl Only allow established traffic from ns1->ns0.
2067table=1 priority=100 in_port=2 ip ct_state=+trk-new+est action=1
2068table=1 priority=0 action=drop
2069dnl
2070dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
2071table=8 priority=100 reg2=0x0a0101f0/0xfffffff0 action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
2072dnl Zero result means not found.
2073table=8 priority=0 action=load:0->OXM_OF_PKT_REG0[[]]
2074dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
2075dnl ARP TPA IP in reg2.
2076table=10 priority=100 arp xreg0=0 action=normal
2077dnl Swaps the fields of the ARP message to turn a query to a response.
2078table=10 priority=10 arp arp_op=1 action=load:2->OXM_OF_ARP_OP[[]],move:OXM_OF_ARP_SHA[[]]->OXM_OF_ARP_THA[[]],move:OXM_OF_PKT_REG0[[0..47]]->OXM_OF_ARP_SHA[[]],move:OXM_OF_ARP_SPA[[]]->OXM_OF_ARP_TPA[[]],move:NXM_NX_REG2[[]]->OXM_OF_ARP_SPA[[]],move:NXM_OF_ETH_SRC[[]]->NXM_OF_ETH_DST[[]],move:OXM_OF_PKT_REG0[[0..47]]->NXM_OF_ETH_SRC[[]],move:NXM_OF_IN_PORT[[]]->NXM_NX_REG3[[0..15]],load:0->NXM_OF_IN_PORT[[]],output:NXM_NX_REG3[[0..15]]
2079table=10 priority=0 action=drop
2080])
2081
2082AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2083
2084dnl HTTP requests from p0->p1 should work fine.
2085NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
2086NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 5 -T 1 --retry-connrefused -v -o wget0.log])
2087
a857bb69 2088AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2) | sed -e 's/dst=10.1.1.2[[45]][[0-9]]/dst=10.1.1.2XX/'], [0], [dnl
420c73b2 2089tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.2XX,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>)
9ac0aada
JR
2090])
2091
2092OVS_TRAFFIC_VSWITCHD_STOP
2093AT_CLEANUP
2094
2095AT_SETUP([conntrack - simple DNAT])
2096CHECK_CONNTRACK()
2097OVS_TRAFFIC_VSWITCHD_START()
2098
2099ADD_NAMESPACES(at_ns0, at_ns1)
2100
2101ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2102ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2103NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address 80:88:88:88:88:88])
2104
2105dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
2106AT_DATA([flows.txt], [dnl
2107priority=100 in_port=1,ip,nw_dst=10.1.1.64,action=ct(zone=1,nat(dst=10.1.1.2),commit),2
2108priority=10 in_port=1,ip,action=ct(commit,zone=1),2
2109priority=100 in_port=2,ct_state=-trk,ip,action=ct(table=0,nat,zone=1)
2110priority=100 in_port=2,ct_state=+trk+est,ct_zone=1,ip,action=1
2111dnl
2112dnl ARP
2113priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
2114priority=10 arp action=normal
2115priority=0,action=drop
2116dnl
2117dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
2118table=8,reg2=0x0a010140,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
2119dnl Zero result means not found.
2120table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
2121dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
2122dnl TPA IP in reg2.
2123table=10 priority=100 arp xreg0=0 action=normal
2124dnl Swaps the fields of the ARP message to turn a query to a response.
2125table=10 priority=10,arp,arp_op=1,action=load:2->OXM_OF_ARP_OP[[]],move:OXM_OF_ARP_SHA[[]]->OXM_OF_ARP_THA[[]],move:OXM_OF_PKT_REG0[[0..47]]->OXM_OF_ARP_SHA[[]],move:OXM_OF_ARP_SPA[[]]->OXM_OF_ARP_TPA[[]],move:NXM_NX_REG2[[]]->OXM_OF_ARP_SPA[[]],move:NXM_OF_ETH_SRC[[]]->NXM_OF_ETH_DST[[]],move:OXM_OF_PKT_REG0[[0..47]]->NXM_OF_ETH_SRC[[]],move:NXM_OF_IN_PORT[[]]->NXM_NX_REG3[[0..15]],load:0->NXM_OF_IN_PORT[[]],output:NXM_NX_REG3[[0..15]]
2126table=10 priority=0 action=drop
2127])
2128
2129AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2130
2131dnl Should work with the virtual IP address through NAT
2132NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
2133NS_CHECK_EXEC([at_ns0], [wget 10.1.1.64 -t 5 -T 1 --retry-connrefused -v -o wget0.log])
2134
420c73b2
JR
2135AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.64)], [0], [dnl
2136tcp,orig=(src=10.1.1.1,dst=10.1.1.64,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>)
9ac0aada
JR
2137])
2138
2139dnl Should work with the assigned IP address as well
2140NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
2141
420c73b2
JR
2142AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
2143tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>)
9ac0aada
JR
2144])
2145
2146OVS_TRAFFIC_VSWITCHD_STOP
2147AT_CLEANUP
2148
2149AT_SETUP([conntrack - more complex DNAT])
2150CHECK_CONNTRACK()
2151OVS_TRAFFIC_VSWITCHD_START()
2152
2153ADD_NAMESPACES(at_ns0, at_ns1)
2154
2155ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2156ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2157NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address 80:88:88:88:88:88])
2158
2159dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
2160AT_DATA([flows.txt], [dnl
2161dnl Track all IP traffic
2162table=0 priority=100 ip action=ct(table=1,zone=1,nat)
2163dnl
2164dnl Allow ARP, but generate responses for NATed addresses
2165table=0 priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
2166table=0 priority=10 arp action=normal
2167table=0 priority=0 action=drop
2168dnl
2169dnl Allow any IP traffic from ns0->ns1. DNAT ns0 from 10.1.1.64 to 10.1.1.2
2170table=1 priority=100 in_port=1 ct_state=+new ip nw_dst=10.1.1.64 action=ct(zone=1,nat(dst=10.1.1.2),commit),2
2171table=1 priority=10 in_port=1 ct_state=+new ip action=ct(commit,zone=1),2
2172table=1 priority=100 in_port=1 ct_state=+est ct_zone=1 action=2
2173dnl Only allow established traffic from ns1->ns0.
2174table=1 priority=100 in_port=2 ct_state=+est ct_zone=1 action=1
2175table=1 priority=0 action=drop
2176dnl
2177dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
2178table=8,reg2=0x0a010140,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
2179dnl Zero result means not found.
2180table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
2181dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
2182dnl TPA IP in reg2.
2183table=10 priority=100 arp xreg0=0 action=normal
2184dnl Swaps the fields of the ARP message to turn a query to a response.
2185table=10 priority=10,arp,arp_op=1,action=load:2->OXM_OF_ARP_OP[[]],move:OXM_OF_ARP_SHA[[]]->OXM_OF_ARP_THA[[]],move:OXM_OF_PKT_REG0[[0..47]]->OXM_OF_ARP_SHA[[]],move:OXM_OF_ARP_SPA[[]]->OXM_OF_ARP_TPA[[]],move:NXM_NX_REG2[[]]->OXM_OF_ARP_SPA[[]],move:NXM_OF_ETH_SRC[[]]->NXM_OF_ETH_DST[[]],move:OXM_OF_PKT_REG0[[0..47]]->NXM_OF_ETH_SRC[[]],move:NXM_OF_IN_PORT[[]]->NXM_NX_REG3[[0..15]],load:0->NXM_OF_IN_PORT[[]],output:NXM_NX_REG3[[0..15]]
2186table=10 priority=0 action=drop
2187])
2188
2189AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2190
2191dnl Should work with the virtual IP address through NAT
2192NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py]], [http0.pid])
2193NS_CHECK_EXEC([at_ns0], [wget 10.1.1.64 -t 5 -T 1 --retry-connrefused -v -o wget0.log])
2194
420c73b2
JR
2195AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.64)], [0], [dnl
2196tcp,orig=(src=10.1.1.1,dst=10.1.1.64,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>)
9ac0aada
JR
2197])
2198
2199dnl Should work with the assigned IP address as well
2200NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
2201
420c73b2
JR
2202AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
2203tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>)
9ac0aada
JR
2204])
2205
2206OVS_TRAFFIC_VSWITCHD_STOP
2207AT_CLEANUP
2208
2209AT_SETUP([conntrack - ICMP related with NAT])
2210CHECK_CONNTRACK()
2211OVS_TRAFFIC_VSWITCHD_START()
2212
2213ADD_NAMESPACES(at_ns0, at_ns1)
2214
2215ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2216NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
2217ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2218
2219dnl Allow UDP traffic from ns0->ns1. Only allow related ICMP responses back.
2220dnl Make sure ICMP responses are reverse-NATted.
2221AT_DATA([flows.txt], [dnl
2222in_port=1,udp,action=ct(commit,nat(src=10.1.1.240-10.1.1.255),exec(set_field:1->ct_mark)),2
2223in_port=2,icmp,ct_state=-trk,action=ct(table=0,nat)
2224in_port=2,icmp,nw_dst=10.1.1.1,ct_state=+trk+rel,ct_mark=1,action=1
2225dnl
2226dnl ARP
2227priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
2228priority=10 arp action=normal
2229priority=0,action=drop
2230dnl
2231dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
2232table=8,reg2=0x0a0101f0/0xfffffff0,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
2233table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
2234dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
2235dnl TPA IP in reg2.
2236dnl Swaps the fields of the ARP message to turn a query to a response.
2237table=10 priority=100 arp xreg0=0 action=normal
2238table=10 priority=10,arp,arp_op=1,action=load:2->OXM_OF_ARP_OP[[]],move:OXM_OF_ARP_SHA[[]]->OXM_OF_ARP_THA[[]],move:OXM_OF_PKT_REG0[[0..47]]->OXM_OF_ARP_SHA[[]],move:OXM_OF_ARP_SPA[[]]->OXM_OF_ARP_TPA[[]],move:NXM_NX_REG2[[]]->OXM_OF_ARP_SPA[[]],move:NXM_OF_ETH_SRC[[]]->NXM_OF_ETH_DST[[]],move:OXM_OF_PKT_REG0[[0..47]]->NXM_OF_ETH_SRC[[]],move:NXM_OF_IN_PORT[[]]->NXM_NX_REG3[[0..15]],load:0->NXM_OF_IN_PORT[[]],output:NXM_NX_REG3[[0..15]]
2239table=10 priority=0 action=drop
2240])
2241
2242AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2243
2244dnl UDP packets from ns0->ns1 should solicit "destination unreachable" response.
b54971f7 2245NS_CHECK_EXEC([at_ns0], [bash -c "echo a | nc $NC_EOF_OPT -u 10.1.1.2 10000"])
9ac0aada
JR
2246
2247AT_CHECK([ovs-appctl revalidator/purge], [0])
2248AT_CHECK([ovs-ofctl -O OpenFlow15 dump-flows br0 | ofctl_strip | sort | grep -v drop], [0], [dnl
2249 n_packets=1, n_bytes=42, priority=10,arp actions=NORMAL
2250 n_packets=1, n_bytes=44, udp,in_port=1 actions=ct(commit,nat(src=10.1.1.240-10.1.1.255),exec(set_field:0x1->ct_mark)),output:2
2251 n_packets=1, n_bytes=72, ct_state=+rel+trk,ct_mark=0x1,icmp,in_port=2,nw_dst=10.1.1.1 actions=output:1
2252 n_packets=1, n_bytes=72, ct_state=-trk,icmp,in_port=2 actions=ct(table=0,nat)
2253 n_packets=2, n_bytes=84, priority=100,arp,arp_op=1 actions=move:NXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
2254 table=10, n_packets=1, n_bytes=42, priority=10,arp,arp_op=1 actions=set_field:2->arp_op,move:NXM_NX_ARP_SHA[[]]->NXM_NX_ARP_THA[[]],move:OXM_OF_PKT_REG0[[0..47]]->NXM_NX_ARP_SHA[[]],move:NXM_OF_ARP_SPA[[]]->NXM_OF_ARP_TPA[[]],move:NXM_NX_REG2[[]]->NXM_OF_ARP_SPA[[]],move:NXM_OF_ETH_SRC[[]]->NXM_OF_ETH_DST[[]],move:OXM_OF_PKT_REG0[[0..47]]->NXM_OF_ETH_SRC[[]],move:NXM_OF_IN_PORT[[]]->NXM_NX_REG3[[0..15]],set_field:0->in_port,output:NXM_NX_REG3[[0..15]]
2255 table=10, n_packets=1, n_bytes=42, priority=100,arp,reg0=0,reg1=0 actions=NORMAL
2256 table=8, n_packets=1, n_bytes=42, priority=0 actions=set_field:0->xreg0
2257 table=8, n_packets=1, n_bytes=42, reg2=0xa0101f0/0xfffffff0 actions=set_field:0x808888888888->xreg0
2258OFPST_FLOW reply (OF1.5):
2259])
2260
a857bb69
DDP
2261AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2) | sed -e 's/dst=10.1.1.2[[45]][[0-9]]/dst=10.1.1.2XX/'], [0], [dnl
2262udp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.2XX,sport=<cleared>,dport=<cleared>),mark=1
9ac0aada
JR
2263])
2264
2265OVS_TRAFFIC_VSWITCHD_STOP
2266AT_CLEANUP
2267
2268
2269AT_SETUP([conntrack - FTP with NAT])
2270AT_SKIP_IF([test $HAVE_PYFTPDLIB = no])
2271CHECK_CONNTRACK()
2272
2273OVS_TRAFFIC_VSWITCHD_START()
2274
2275ADD_NAMESPACES(at_ns0, at_ns1)
2276
2277ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2278NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
2279ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2280
2281dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
2282
2283AT_DATA([flows.txt], [dnl
2284dnl track all IP traffic, de-mangle non-NEW connections
2285table=0 in_port=1, ip, action=ct(table=1,nat)
2286table=0 in_port=2, ip, action=ct(table=2,nat)
2287dnl
2288dnl ARP
2289dnl
2290table=0 priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
2291table=0 priority=10 arp action=normal
2292table=0 priority=0 action=drop
2293dnl
2294dnl Table 1: port 1 -> 2
2295dnl
2296dnl Allow new FTP connections. These need to be commited.
2297table=1 ct_state=+new, tcp, tp_dst=21, nw_src=10.1.1.1, action=ct(alg=ftp,commit,nat(src=10.1.1.240)),2
2298dnl Allow established TCP connections, make sure they are NATted already.
2299table=1 ct_state=+est, tcp, nw_src=10.1.1.240, action=2
2300dnl
2301dnl Table 1: droppers
2302dnl
2303table=1 priority=10, tcp, action=drop
2304table=1 priority=0,action=drop
2305dnl
2306dnl Table 2: port 2 -> 1
2307dnl
2308dnl Allow established TCP connections, make sure they are reverse NATted
2309table=2 ct_state=+est, tcp, nw_dst=10.1.1.1, action=1
2310dnl Allow (new) related (data) connections. These need to be commited.
2311table=2 ct_state=+new+rel, tcp, nw_dst=10.1.1.240, action=ct(commit,nat),1
2312dnl Allow related ICMP packets, make sure they are reverse NATted
2313table=2 ct_state=+rel, icmp, nw_dst=10.1.1.1, action=1
2314dnl
2315dnl Table 2: droppers
2316dnl
2317table=2 priority=10, tcp, action=drop
2318table=2 priority=0, action=drop
2319dnl
2320dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
2321dnl
2322table=8,reg2=0x0a0101f0/0xfffffff0,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
2323table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
2324dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
2325dnl TPA IP in reg2.
2326dnl Swaps the fields of the ARP message to turn a query to a response.
2327table=10 priority=100 arp xreg0=0 action=normal
2328table=10 priority=10,arp,arp_op=1,action=load:2->OXM_OF_ARP_OP[[]],move:OXM_OF_ARP_SHA[[]]->OXM_OF_ARP_THA[[]],move:OXM_OF_PKT_REG0[[0..47]]->OXM_OF_ARP_SHA[[]],move:OXM_OF_ARP_SPA[[]]->OXM_OF_ARP_TPA[[]],move:NXM_NX_REG2[[]]->OXM_OF_ARP_SPA[[]],move:NXM_OF_ETH_SRC[[]]->NXM_OF_ETH_DST[[]],move:OXM_OF_PKT_REG0[[0..47]]->NXM_OF_ETH_SRC[[]],move:NXM_OF_IN_PORT[[]]->NXM_NX_REG3[[0..15]],load:0->NXM_OF_IN_PORT[[]],output:NXM_NX_REG3[[0..15]]
2329table=10 priority=0 action=drop
2330])
2331
2332AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2333
2334dnl NETNS_DAEMONIZE([at_ns0], [[$PYTHON $srcdir/test-l7.py ftp]], [ftp1.pid])
2335NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py ftp]], [ftp0.pid])
20322d4b 2336OVS_WAIT_UNTIL([ip netns exec at_ns1 netstat -l | grep ftp])
9ac0aada
JR
2337
2338dnl FTP requests from p0->p1 should work fine.
2339NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 -4 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v --server-response --no-proxy --no-remove-listing -o wget0.log -d])
2340
420c73b2
JR
2341AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
2342tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.240,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>),helper=ftp
2343tcp,orig=(src=10.1.1.2,dst=10.1.1.240,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>)
9ac0aada
JR
2344])
2345
2346OVS_TRAFFIC_VSWITCHD_STOP
2347AT_CLEANUP
2348
2349
2350AT_SETUP([conntrack - FTP with NAT 2])
2351AT_SKIP_IF([test $HAVE_PYFTPDLIB = no])
2352CHECK_CONNTRACK()
2353OVS_TRAFFIC_VSWITCHD_START()
2354
2355ADD_NAMESPACES(at_ns0, at_ns1)
2356
2357ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2358NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
2359ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2360
2361dnl Allow any traffic from ns0->ns1.
2362dnl Only allow nd, return traffic from ns1->ns0.
2363AT_DATA([flows.txt], [dnl
2364dnl track all IP traffic (this includes a helper call to non-NEW packets.)
2365table=0 ip, action=ct(table=1)
2366dnl
2367dnl ARP
2368dnl
2369table=0 priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
2370table=0 priority=10 arp action=normal
2371table=0 priority=0 action=drop
2372dnl
2373dnl Table 1
2374dnl
2375dnl Allow new FTP connections. These need to be commited.
2376dnl This does helper for new packets.
2377table=1 in_port=1 ct_state=+new, tcp, tp_dst=21, action=ct(alg=ftp,commit,nat(src=10.1.1.240)),2
2378dnl Allow and NAT established TCP connections
2379table=1 in_port=1 ct_state=+est, tcp, action=ct(nat),2
2380table=1 in_port=2 ct_state=+est, tcp, action=ct(nat),1
2381dnl Allow and NAT (new) related active (data) connections.
2382dnl These need to be commited.
2383table=1 in_port=2 ct_state=+new+rel, tcp, action=ct(commit,nat),1
2384dnl Allow related ICMP packets.
2385table=1 in_port=2 ct_state=+rel, icmp, action=ct(nat),1
2386dnl Drop everything else.
2387table=1 priority=0, action=drop
2388dnl
2389dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
2390dnl
2391table=8,reg2=0x0a0101f0/0xfffffff0,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
2392table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
2393dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
2394dnl TPA IP in reg2.
2395dnl Swaps the fields of the ARP message to turn a query to a response.
2396table=10 priority=100 arp xreg0=0 action=normal
2397table=10 priority=10,arp,arp_op=1,action=load:2->OXM_OF_ARP_OP[[]],move:OXM_OF_ARP_SHA[[]]->OXM_OF_ARP_THA[[]],move:OXM_OF_PKT_REG0[[0..47]]->OXM_OF_ARP_SHA[[]],move:OXM_OF_ARP_SPA[[]]->OXM_OF_ARP_TPA[[]],move:NXM_NX_REG2[[]]->OXM_OF_ARP_SPA[[]],move:NXM_OF_ETH_SRC[[]]->NXM_OF_ETH_DST[[]],move:OXM_OF_PKT_REG0[[0..47]]->NXM_OF_ETH_SRC[[]],move:NXM_OF_IN_PORT[[]]->NXM_NX_REG3[[0..15]],load:0->NXM_OF_IN_PORT[[]],output:NXM_NX_REG3[[0..15]]
2398table=10 priority=0 action=drop
2399])
2400
2401AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2402
2403NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py ftp]], [ftp0.pid])
20322d4b 2404OVS_WAIT_UNTIL([ip netns exec at_ns1 netstat -l | grep ftp])
9ac0aada
JR
2405
2406dnl FTP requests from p0->p1 should work fine.
2407NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 -4 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v --server-response --no-proxy --no-remove-listing -o wget0.log -d])
2408
a857bb69 2409dnl Discards CLOSE_WAIT and CLOSING
420c73b2
JR
2410AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
2411tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.240,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>),helper=ftp
2412tcp,orig=(src=10.1.1.2,dst=10.1.1.240,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>)
9ac0aada
JR
2413])
2414
2415OVS_TRAFFIC_VSWITCHD_STOP
2416AT_CLEANUP
2417
2418AT_SETUP([conntrack - IPv6 HTTP with NAT])
2419CHECK_CONNTRACK()
2420OVS_TRAFFIC_VSWITCHD_START()
2421
2422ADD_NAMESPACES(at_ns0, at_ns1)
2423
2424ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
2425NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
2426ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
2427NS_CHECK_EXEC([at_ns1], [ip -6 neigh add fc00::240 lladdr 80:88:88:88:88:88 dev p1])
2428
2429dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
2430AT_DATA([flows.txt], [dnl
2431priority=1,action=drop
2432priority=10,icmp6,action=normal
2433priority=100,in_port=1,ip6,action=ct(commit,nat(src=fc00::240)),2
2434priority=100,in_port=2,ct_state=-trk,ip6,action=ct(nat,table=0)
2435priority=100,in_port=2,ct_state=+trk+est,ip6,action=1
2436priority=200,in_port=2,ct_state=+trk+new,icmp6,icmpv6_code=0,icmpv6_type=135,nd_target=fc00::240,action=ct(commit,nat(dst=fc00::1)),1
2437])
2438
2439AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2440
c10840ff
JS
2441dnl Linux seems to take a little time to get its IPv6 stack in order. Without
2442dnl waiting, we get occasional failures due to the following error:
9ac0aada 2443dnl "connect: Cannot assign requested address"
c10840ff 2444OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
9ac0aada
JR
2445
2446dnl HTTP requests from ns0->ns1 should work fine.
2447NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py http6]], [http0.pid])
2448
2449NS_CHECK_EXEC([at_ns0], [wget http://[[fc00::2]] -t 3 -T 1 --retry-connrefused -v -o wget0.log])
2450
2451dnl HTTP requests from ns1->ns0 should fail due to network failure.
2452dnl Try 3 times, in 1 second intervals.
2453NETNS_DAEMONIZE([at_ns0], [[$PYTHON $srcdir/test-l7.py http6]], [http1.pid])
2454NS_CHECK_EXEC([at_ns1], [wget http://[[fc00::1]] -t 3 -T 1 -v -o wget1.log], [4])
2455
2456OVS_TRAFFIC_VSWITCHD_STOP
2457AT_CLEANUP
2458
2459
2460AT_SETUP([conntrack - IPv6 FTP with NAT])
2461AT_SKIP_IF([test $HAVE_PYFTPDLIB = no])
2462CHECK_CONNTRACK()
2463OVS_TRAFFIC_VSWITCHD_START()
2464
2465ADD_NAMESPACES(at_ns0, at_ns1)
2466
2467ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
2468NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
2469ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
2470dnl Would be nice if NAT could translate neighbor discovery messages, too.
2471NS_CHECK_EXEC([at_ns1], [ip -6 neigh add fc00::240 lladdr 80:88:88:88:88:88 dev p1])
2472
2473dnl Allow any traffic from ns0->ns1.
2474dnl Only allow nd, return traffic from ns1->ns0.
2475AT_DATA([flows.txt], [dnl
2476dnl Allow other ICMPv6 both ways (without commit).
2477table=1 priority=100 in_port=1 icmp6, action=2
2478table=1 priority=100 in_port=2 icmp6, action=1
2479dnl track all IPv6 traffic (this includes NAT & help to non-NEW packets.)
2480table=0 priority=10 ip6, action=ct(nat,table=1)
2481table=0 priority=0 action=drop
2482dnl
2483dnl Table 1
2484dnl
2485dnl Allow new TCPv6 FTP control connections.
2486table=1 in_port=1 ct_state=+new tcp6 ipv6_src=fc00::1 tp_dst=21 action=ct(alg=ftp,commit,nat(src=fc00::240)),2
2487dnl Allow related TCPv6 connections from port 2 to the NATted address.
2488table=1 in_port=2 ct_state=+new+rel tcp6 ipv6_dst=fc00::240 action=ct(commit,nat),1
2489dnl Allow established TCPv6 connections both ways, enforce NATting
2490table=1 in_port=1 ct_state=+est tcp6 ipv6_src=fc00::240 action=2
2491table=1 in_port=2 ct_state=+est tcp6 ipv6_dst=fc00::1 action=1
2492dnl Drop everything else.
2493table=1 priority=0, action=drop
2494])
2495
2496AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2497
c10840ff
JS
2498dnl Linux seems to take a little time to get its IPv6 stack in order. Without
2499dnl waiting, we get occasional failures due to the following error:
2500dnl "connect: Cannot assign requested address"
2501OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2 >/dev/null])
2502
9ac0aada 2503NETNS_DAEMONIZE([at_ns1], [[$PYTHON $srcdir/test-l7.py ftp]], [ftp0.pid])
20322d4b 2504OVS_WAIT_UNTIL([ip netns exec at_ns1 netstat -l | grep ftp])
9ac0aada
JR
2505
2506dnl FTP requests from p0->p1 should work fine.
2507NS_CHECK_EXEC([at_ns0], [wget ftp://[[fc00::2]] -6 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v --server-response --no-proxy --no-remove-listing -o wget0.log -d])
2508
a857bb69 2509dnl Discards CLOSE_WAIT and CLOSING
420c73b2
JR
2510AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
2511tcp,orig=(src=fc00::1,dst=fc00::2,sport=<cleared>,dport=<cleared>),reply=(src=fc00::2,dst=fc00::240,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>),helper=ftp
2512tcp,orig=(src=fc00::2,dst=fc00::240,sport=<cleared>,dport=<cleared>),reply=(src=fc00::1,dst=fc00::2,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>)
9ac0aada
JR
2513])
2514
2515OVS_TRAFFIC_VSWITCHD_STOP
2516AT_CLEANUP
2c66ebe4
JR
2517
2518AT_SETUP([conntrack - DNAT load balancing])
2519CHECK_CONNTRACK()
2520OVS_TRAFFIC_VSWITCHD_START()
2521
2522ADD_NAMESPACES(at_ns1, at_ns2, at_ns3, at_ns4)
2523
2524ADD_VETH(p1, at_ns1, br0, "10.1.1.1/24")
2525ADD_VETH(p2, at_ns2, br0, "10.1.1.2/24")
2526ADD_VETH(p3, at_ns3, br0, "10.1.1.3/24")
2527ADD_VETH(p4, at_ns4, br0, "10.1.1.4/24")
2528NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address 80:88:88:88:88:11])
2529NS_CHECK_EXEC([at_ns2], [ip link set dev p2 address 80:88:88:88:88:22])
2530NS_CHECK_EXEC([at_ns3], [ip link set dev p3 address 80:88:88:88:88:33])
2531NS_CHECK_EXEC([at_ns4], [ip link set dev p4 address 80:88:88:88:88:44])
2532
2533dnl Select group for load balancing. One bucket per server. Each bucket
2534dnl tracks and NATs the connection and recirculates to table 4 for egress
2535dnl routing. Packets of existing connections are always NATted based on
2536dnl connection state, only new connections are NATted according to the
2537dnl specific NAT parameters in each bucket.
2538AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn add-group br0 "group_id=234,type=select,bucket=weight=100,ct(nat(dst=10.1.1.2),commit,table=4),bucket=weight=100,ct(nat(dst=10.1.1.3),commit,table=4),bucket=weight=100,ct(nat(dst=10.1.1.4),commit,table=4)"])
2539
2540AT_DATA([flows.txt], [dnl
2541dnl Track connections to the virtual IP address.
2542table=0 priority=100 ip nw_dst=10.1.1.64 action=group:234
2543dnl All other IP traffic is allowed but the connection state is no commited.
2544table=0 priority=90 ip action=ct(table=4,nat)
2545dnl
2546dnl Allow ARP, but generate responses for virtual addresses
2547table=0 priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
2548table=0 priority=10 arp action=normal
2549table=0 priority=0 action=drop
2550dnl
2551dnl Routing table
2552dnl
2553table=4,ip,nw_dst=10.1.1.1 action=mod_dl_dst:80:88:88:88:88:11,output:1
2554table=4,ip,nw_dst=10.1.1.2 action=mod_dl_dst:80:88:88:88:88:22,output:2
2555table=4,ip,nw_dst=10.1.1.3 action=mod_dl_dst:80:88:88:88:88:33,output:3
2556table=4,ip,nw_dst=10.1.1.4 action=mod_dl_dst:80:88:88:88:88:44,output:4
2557table=4 priority=0 action=drop
2558dnl
2559dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
2560table=8,reg2=0x0a010140,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
2561dnl Zero result means not found.
2562table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
2563dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
2564dnl TPA IP in reg2.
2565table=10 priority=100 arp xreg0=0 action=normal
2566dnl Swaps the fields of the ARP message to turn a query to a response.
2567table=10 priority=10,arp,arp_op=1,action=load:2->OXM_OF_ARP_OP[[]],move:OXM_OF_ARP_SHA[[]]->OXM_OF_ARP_THA[[]],move:OXM_OF_PKT_REG0[[0..47]]->OXM_OF_ARP_SHA[[]],move:OXM_OF_ARP_SPA[[]]->OXM_OF_ARP_TPA[[]],move:NXM_NX_REG2[[]]->OXM_OF_ARP_SPA[[]],move:NXM_OF_ETH_SRC[[]]->NXM_OF_ETH_DST[[]],move:OXM_OF_PKT_REG0[[0..47]]->NXM_OF_ETH_SRC[[]],move:NXM_OF_IN_PORT[[]]->NXM_NX_REG3[[0..15]],load:0->NXM_OF_IN_PORT[[]],output:NXM_NX_REG3[[0..15]]
2568table=10 priority=0 action=controller
2569])
2570
2571AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2572
2573dnl Start web servers
2574NETNS_DAEMONIZE([at_ns2], [[$PYTHON $srcdir/test-l7.py]], [http2.pid])
2575NETNS_DAEMONIZE([at_ns3], [[$PYTHON $srcdir/test-l7.py]], [http3.pid])
2576NETNS_DAEMONIZE([at_ns4], [[$PYTHON $srcdir/test-l7.py]], [http4.pid])
2577
2578on_exit 'ovs-ofctl -O OpenFlow15 dump-flows br0'
2579on_exit 'ovs-appctl revalidator/purge'
2580on_exit 'ovs-appctl dpif/dump-flows br0'
2581
2582dnl Should work with the virtual IP address through NAT
2583for i in 1 2 3 4 5 6 7 8 9 10 11 12; do
2584 echo Request $i
2585 NS_CHECK_EXEC([at_ns1], [wget 10.1.1.64 -t 5 -T 1 --retry-connrefused -v -o wget$i.log])
2586done
2587
2588dnl Each server should have at least one connection.
420c73b2
JR
2589AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.64)], [0], [dnl
2590tcp,orig=(src=10.1.1.1,dst=10.1.1.64,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>)
2591tcp,orig=(src=10.1.1.1,dst=10.1.1.64,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.3,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>)
2592tcp,orig=(src=10.1.1.1,dst=10.1.1.64,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.4,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>)
2c66ebe4
JR
2593])
2594
2595ovs-appctl dpif/dump-flows br0
2596ovs-appctl revalidator/purge
2597ovs-ofctl -O OpenFlow15 dump-flows br0
2598ovs-ofctl -O OpenFlow15 dump-group-stats br0
2599
2600OVS_TRAFFIC_VSWITCHD_STOP
2601AT_CLEANUP
2602
2603
2604AT_SETUP([conntrack - DNAT load balancing with NC])
2605CHECK_CONNTRACK()
2606OVS_TRAFFIC_VSWITCHD_START()
2607
2608ADD_NAMESPACES(at_ns1, at_ns2, at_ns3, at_ns4, at_ns5)
2609
2610ADD_VETH(p1, at_ns1, br0, "10.1.1.1/24")
2611ADD_VETH(p2, at_ns2, br0, "10.1.1.2/24")
2612ADD_VETH(p3, at_ns3, br0, "10.1.1.3/24")
2613ADD_VETH(p4, at_ns4, br0, "10.1.1.4/24")
2614ADD_VETH(p5, at_ns5, br0, "10.1.1.5/24")
2615NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address 80:88:88:88:88:11])
2616NS_CHECK_EXEC([at_ns2], [ip link set dev p2 address 80:88:88:88:88:22])
2617NS_CHECK_EXEC([at_ns3], [ip link set dev p3 address 80:88:88:88:88:33])
2618NS_CHECK_EXEC([at_ns4], [ip link set dev p4 address 80:88:88:88:88:44])
2619NS_CHECK_EXEC([at_ns5], [ip link set dev p5 address 80:88:88:88:88:55])
2620
2621dnl Select group for load balancing. One bucket per server. Each bucket
2622dnl tracks and NATs the connection and recirculates to table 4 for egress
2623dnl routing. Packets of existing connections are always NATted based on
2624dnl connection state, only new connections are NATted according to the
2625dnl specific NAT parameters in each bucket.
2626AT_CHECK([ovs-ofctl -O OpenFlow15 -vwarn add-group br0 "group_id=234,type=select,bucket=weight=100,ct(nat(dst=10.1.1.2),commit,table=4),bucket=weight=100,ct(nat(dst=10.1.1.3),commit,table=4),bucket=weight=100,ct(nat(dst=10.1.1.4),commit,table=4)"])
2627
2628AT_DATA([flows.txt], [dnl
2629dnl Track connections to the virtual IP address.
2630table=0 priority=100 ip nw_dst=10.1.1.64 action=group:234
2631dnl All other IP traffic is allowed but the connection state is no commited.
2632table=0 priority=90 ip action=ct(table=4,nat)
2633dnl
2634dnl Allow ARP, but generate responses for virtual addresses
2635table=0 priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
2636table=0 priority=10 arp action=normal
2637table=0 priority=0 action=drop
2638dnl
2639dnl Routing table
2640dnl
2641table=4,ip,nw_dst=10.1.1.1 action=mod_dl_dst:80:88:88:88:88:11,output:1
2642table=4,ip,nw_dst=10.1.1.2 action=mod_dl_dst:80:88:88:88:88:22,output:2
2643table=4,ip,nw_dst=10.1.1.3 action=mod_dl_dst:80:88:88:88:88:33,output:3
2644table=4,ip,nw_dst=10.1.1.4 action=mod_dl_dst:80:88:88:88:88:44,output:4
2645table=4,ip,nw_dst=10.1.1.5 action=mod_dl_dst:80:88:88:88:88:55,output:5
2646table=4 priority=0 action=drop
2647dnl
2648dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
2649table=8,reg2=0x0a010140,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
2650dnl Zero result means not found.
2651table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
2652dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
2653dnl TPA IP in reg2.
2654table=10 priority=100 arp xreg0=0 action=normal
2655dnl Swaps the fields of the ARP message to turn a query to a response.
2656table=10 priority=10,arp,arp_op=1,action=load:2->OXM_OF_ARP_OP[[]],move:OXM_OF_ARP_SHA[[]]->OXM_OF_ARP_THA[[]],move:OXM_OF_PKT_REG0[[0..47]]->OXM_OF_ARP_SHA[[]],move:OXM_OF_ARP_SPA[[]]->OXM_OF_ARP_TPA[[]],move:NXM_NX_REG2[[]]->OXM_OF_ARP_SPA[[]],move:NXM_OF_ETH_SRC[[]]->NXM_OF_ETH_DST[[]],move:OXM_OF_PKT_REG0[[0..47]]->NXM_OF_ETH_SRC[[]],move:NXM_OF_IN_PORT[[]]->NXM_NX_REG3[[0..15]],load:0->NXM_OF_IN_PORT[[]],output:NXM_NX_REG3[[0..15]]
2657table=10 priority=0 action=controller
2658])
2659
2660AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2661
2662dnl Start web servers
2663NETNS_DAEMONIZE([at_ns2], [[$PYTHON $srcdir/test-l7.py]], [http2.pid])
2664NETNS_DAEMONIZE([at_ns3], [[$PYTHON $srcdir/test-l7.py]], [http3.pid])
2665NETNS_DAEMONIZE([at_ns4], [[$PYTHON $srcdir/test-l7.py]], [http4.pid])
2666
2667on_exit 'ovs-ofctl -O OpenFlow15 dump-flows br0'
2668on_exit 'ovs-appctl revalidator/purge'
2669on_exit 'ovs-appctl dpif/dump-flows br0'
2670
2671sleep 5
2672
2673dnl Should work with the virtual IP address through NAT
2674for i in 1 2 3 4 5 6 7 8 9; do
2675 echo Request $i
2676 NS_CHECK_EXEC([at_ns1], [echo "TEST1" | nc -p 4100$i 10.1.1.64 80 > nc-1-$i.log])
2677 NS_CHECK_EXEC([at_ns5], [echo "TEST5" | nc -p 4100$i 10.1.1.64 80 > nc-5-$i.log])
2678done
2679
2680conntrack -L 2>&1
2681
2682ovs-appctl dpif/dump-flows br0
2683ovs-appctl revalidator/purge
2684ovs-ofctl -O OpenFlow15 dump-flows br0
2685ovs-ofctl -O OpenFlow15 dump-group-stats br0
2686
2687OVS_TRAFFIC_VSWITCHD_STOP
2688AT_CLEANUP