]> git.proxmox.com Git - ovs.git/blame - tests/system-traffic.at
Merge tag '2.15.0+ds1' into debian/victoria
[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
7ed40afe 40OVS_START_L7([at_ns1], [http])
e0b92701
DDP
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
c5abeef4
EG
72AT_SETUP([datapath - ping between two ports on cvlan])
73OVS_TRAFFIC_VSWITCHD_START()
0de1b425 74OVS_CHECK_8021AD()
c5abeef4
EG
75
76AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
77
78ADD_NAMESPACES(at_ns0, at_ns1)
79
80ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
81ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
82
83ADD_SVLAN(p0, at_ns0, 4094, "10.255.2.1/24")
84ADD_SVLAN(p1, at_ns1, 4094, "10.255.2.2/24")
85
86ADD_CVLAN(p0.4094, at_ns0, 100, "10.2.2.1/24")
87ADD_CVLAN(p1.4094, at_ns1, 100, "10.2.2.2/24")
88
89OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.2.2.2])
90
91NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
923 packets transmitted, 3 received, 0% packet loss, time 0ms
93])
94NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
953 packets transmitted, 3 received, 0% packet loss, time 0ms
96])
97NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
983 packets transmitted, 3 received, 0% packet loss, time 0ms
99])
100
101OVS_TRAFFIC_VSWITCHD_STOP
102AT_CLEANUP
103
d7c5426b 104AT_SETUP([datapath - ping6 between two ports])
cf7659b6
JR
105OVS_TRAFFIC_VSWITCHD_START()
106
107AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
cfe17b43
JS
108
109ADD_NAMESPACES(at_ns0, at_ns1)
110
111ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
112ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
113
c10840ff
JS
114dnl Linux seems to take a little time to get its IPv6 stack in order. Without
115dnl waiting, we get occasional failures due to the following error:
cfe17b43 116dnl "connect: Cannot assign requested address"
c10840ff 117OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
cfe17b43 118
de22d08f 119NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
cfe17b43 1203 packets transmitted, 3 received, 0% packet loss, time 0ms
de22d08f
JS
121])
122NS_CHECK_EXEC([at_ns0], [ping6 -s 1600 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
cfe17b43 1233 packets transmitted, 3 received, 0% packet loss, time 0ms
de22d08f
JS
124])
125NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
cfe17b43
JS
1263 packets transmitted, 3 received, 0% packet loss, time 0ms
127])
128
d7c5426b 129OVS_TRAFFIC_VSWITCHD_STOP
cfe17b43
JS
130AT_CLEANUP
131
d7c5426b 132AT_SETUP([datapath - ping6 between two ports on vlan])
cf7659b6
JR
133OVS_TRAFFIC_VSWITCHD_START()
134
135AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
cfe17b43
JS
136
137ADD_NAMESPACES(at_ns0, at_ns1)
138
139ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
140ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
141
142ADD_VLAN(p0, at_ns0, 100, "fc00:1::1/96")
143ADD_VLAN(p1, at_ns1, 100, "fc00:1::2/96")
144
c10840ff
JS
145dnl Linux seems to take a little time to get its IPv6 stack in order. Without
146dnl waiting, we get occasional failures due to the following error:
cfe17b43 147dnl "connect: Cannot assign requested address"
68ffb694 148OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00:1::2])
cfe17b43 149
de22d08f 150NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00:1::2 | FORMAT_PING], [0], [dnl
cfe17b43 1513 packets transmitted, 3 received, 0% packet loss, time 0ms
de22d08f
JS
152])
153NS_CHECK_EXEC([at_ns0], [ping6 -s 1600 -q -c 3 -i 0.3 -w 2 fc00:1::2 | FORMAT_PING], [0], [dnl
cfe17b43 1543 packets transmitted, 3 received, 0% packet loss, time 0ms
de22d08f
JS
155])
156NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00:1::2 | FORMAT_PING], [0], [dnl
cfe17b43
JS
1573 packets transmitted, 3 received, 0% packet loss, time 0ms
158])
159
d7c5426b 160OVS_TRAFFIC_VSWITCHD_STOP
69c2bdfe 161AT_CLEANUP
810e1785 162
c5abeef4
EG
163AT_SETUP([datapath - ping6 between two ports on cvlan])
164OVS_TRAFFIC_VSWITCHD_START()
0de1b425 165OVS_CHECK_8021AD()
c5abeef4
EG
166
167AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
168
169ADD_NAMESPACES(at_ns0, at_ns1)
170
171ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
172ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
173
174ADD_SVLAN(p0, at_ns0, 4094, "fc00:ffff::1/96")
175ADD_SVLAN(p1, at_ns1, 4094, "fc00:ffff::2/96")
176
177ADD_CVLAN(p0.4094, at_ns0, 100, "fc00:1::1/96")
178ADD_CVLAN(p1.4094, at_ns1, 100, "fc00:1::2/96")
179
180OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00:1::2])
181
182NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00:1::2 | FORMAT_PING], [0], [dnl
1833 packets transmitted, 3 received, 0% packet loss, time 0ms
184])
185NS_CHECK_EXEC([at_ns0], [ping6 -s 1600 -q -c 3 -i 0.3 -w 2 fc00:1::2 | FORMAT_PING], [0], [dnl
1863 packets transmitted, 3 received, 0% packet loss, time 0ms
187])
188NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00:1::2 | FORMAT_PING], [0], [dnl
1893 packets transmitted, 3 received, 0% packet loss, time 0ms
190])
191
192OVS_TRAFFIC_VSWITCHD_STOP
193AT_CLEANUP
194
ddb5f937
LR
195AT_SETUP([datapath - ping over bond])
196OVS_TRAFFIC_VSWITCHD_START()
197
198AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
199
200ADD_NAMESPACES(at_ns0, at_ns1)
201
202ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
203ADD_VETH_BOND(p1 p2, at_ns1, br0, bond0, lacp=active bond_mode=balance-tcp, "10.1.1.2/24")
204
205OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.1.1.2])
206
207NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
2083 packets transmitted, 3 received, 0% packet loss, time 0ms
209])
210NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
2113 packets transmitted, 3 received, 0% packet loss, time 0ms
212])
213NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
2143 packets transmitted, 3 received, 0% packet loss, time 0ms
215])
216
217OVS_TRAFFIC_VSWITCHD_STOP
218AT_CLEANUP
219
810e1785 220AT_SETUP([datapath - ping over vxlan tunnel])
dfb21e96 221OVS_CHECK_VXLAN()
810e1785 222
cf7659b6
JR
223OVS_TRAFFIC_VSWITCHD_START()
224ADD_BR([br-underlay])
225
226AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
227AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
228
810e1785
JS
229ADD_NAMESPACES(at_ns0)
230
231dnl Set up underlay link from host into the namespace using veth pair.
232ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24")
233AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
234AT_CHECK([ip link set dev br-underlay up])
235
236dnl Set up tunnel endpoints on OVS outside the namespace and with a native
237dnl linux device inside the namespace.
238ADD_OVS_TUNNEL([vxlan], [br0], [at_vxlan0], [172.31.1.1], [10.1.1.100/24])
239ADD_NATIVE_TUNNEL([vxlan], [at_vxlan1], [at_ns0], [172.31.1.100], [10.1.1.1/24],
240 [id 0 dstport 4789])
241
242dnl First, check the underlay
243NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [0], [dnl
2443 packets transmitted, 3 received, 0% packet loss, time 0ms
245])
246
247dnl Okay, now check the overlay with different packet sizes
248NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
2493 packets transmitted, 3 received, 0% packet loss, time 0ms
250])
251NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
2523 packets transmitted, 3 received, 0% packet loss, time 0ms
253])
254NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
d5f2dd0b
EG
2553 packets transmitted, 3 received, 0% packet loss, time 0ms
256])
257
258OVS_TRAFFIC_VSWITCHD_STOP
259AT_CLEANUP
260
261AT_SETUP([datapath - ping over vxlan6 tunnel])
67e3ddf1 262OVS_CHECK_VXLAN_UDP6ZEROCSUM()
d5f2dd0b
EG
263
264OVS_TRAFFIC_VSWITCHD_START()
265ADD_BR([br-underlay])
266
267AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
268AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
269
270ADD_NAMESPACES(at_ns0)
271
272dnl Set up underlay link from host into the namespace using veth pair.
273ADD_VETH(p0, at_ns0, br-underlay, "fc00::1/64", [], [], "nodad")
274AT_CHECK([ip addr add dev br-underlay "fc00::100/64" nodad])
275AT_CHECK([ip link set dev br-underlay up])
276
277dnl Set up tunnel endpoints on OVS outside the namespace and with a native
278dnl linux device inside the namespace.
279ADD_OVS_TUNNEL6([vxlan], [br0], [at_vxlan0], [fc00::1], [10.1.1.100/24])
280ADD_NATIVE_TUNNEL6([vxlan], [at_vxlan1], [at_ns0], [fc00::100], [10.1.1.1/24],
281 [id 0 dstport 4789 udp6zerocsumtx udp6zerocsumrx])
282
283OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::100])
284
285dnl First, check the underlay
286NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00::100 | FORMAT_PING], [0], [dnl
2873 packets transmitted, 3 received, 0% packet loss, time 0ms
288])
289
290dnl Okay, now check the overlay with different packet sizes
291NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
2923 packets transmitted, 3 received, 0% packet loss, time 0ms
293])
294NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
2953 packets transmitted, 3 received, 0% packet loss, time 0ms
296])
297NS_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
2983 packets transmitted, 3 received, 0% packet loss, time 0ms
299])
300
301OVS_TRAFFIC_VSWITCHD_STOP
302AT_CLEANUP
303
304AT_SETUP([datapath - ping over gre tunnel])
cae92b42 305OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
523256cc
JS
306OVS_CHECK_GRE()
307
308OVS_TRAFFIC_VSWITCHD_START()
309ADD_BR([br-underlay])
310
311AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
312AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
313
314ADD_NAMESPACES(at_ns0)
315
316dnl Set up underlay link from host into the namespace using veth pair.
317ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24")
318AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
319AT_CHECK([ip link set dev br-underlay up])
320
321dnl Set up tunnel endpoints on OVS outside the namespace and with a native
322dnl linux device inside the namespace.
323ADD_OVS_TUNNEL([gre], [br0], [at_gre0], [172.31.1.1], [10.1.1.100/24])
324ADD_NATIVE_TUNNEL([gretap], [ns_gre0], [at_ns0], [172.31.1.100], [10.1.1.1/24])
325
326dnl First, check the underlay
327NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [0], [dnl
3283 packets transmitted, 3 received, 0% packet loss, time 0ms
329])
330
331dnl Okay, now check the overlay with different packet sizes
332NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
3333 packets transmitted, 3 received, 0% packet loss, time 0ms
334])
335NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
3363 packets transmitted, 3 received, 0% packet loss, time 0ms
337])
338NS_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
3393 packets transmitted, 3 received, 0% packet loss, time 0ms
340])
341
342OVS_TRAFFIC_VSWITCHD_STOP
343AT_CLEANUP
344
a3173ee1
WT
345AT_SETUP([datapath - ping over ip6gre L2 tunnel])
346OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
347OVS_CHECK_GRE()
348OVS_CHECK_ERSPAN()
349
350OVS_TRAFFIC_VSWITCHD_START()
351ADD_BR([br-underlay])
352
353AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
354AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
355
356ADD_NAMESPACES(at_ns0)
357
358dnl Set up underlay link from host into the namespace using veth pair.
359ADD_VETH(p0, at_ns0, br-underlay, "fc00:100::1/96", [], [], nodad)
360AT_CHECK([ip addr add dev br-underlay "fc00:100::100/96" nodad])
361AT_CHECK([ip link set dev br-underlay up])
362
363dnl Set up tunnel endpoints on OVS outside the namespace and with a native
364dnl linux device inside the namespace.
365ADD_OVS_TUNNEL6([ip6gre], [br0], [at_gre0], [fc00:100::1], [10.1.1.100/24],
366 [options:packet_type=legacy_l2])
367ADD_NATIVE_TUNNEL6([ip6gretap], [ns_gretap0], [at_ns0], [fc00:100::100],
368 [10.1.1.1/24], [local fc00:100::1])
369
370OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 2 fc00:100::100])
371
372dnl First, check the underlay
373NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00:100::100 | FORMAT_PING], [0], [dnl
3743 packets transmitted, 3 received, 0% packet loss, time 0ms
375])
376
377dnl Okay, now check the overlay with different packet sizes
378NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
3793 packets transmitted, 3 received, 0% packet loss, time 0ms
380])
381OVS_TRAFFIC_VSWITCHD_STOP
382AT_CLEANUP
383
384
98514eea 385AT_SETUP([datapath - ping over erspan v1 tunnel])
cae92b42 386OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
98514eea
WT
387OVS_CHECK_GRE()
388OVS_CHECK_ERSPAN()
389
390OVS_TRAFFIC_VSWITCHD_START()
391ADD_BR([br-underlay])
392
393AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
394AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
395
396ADD_NAMESPACES(at_ns0)
397
398dnl Set up underlay link from host into the namespace using veth pair.
399ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24")
400AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
401AT_CHECK([ip link set dev br-underlay up])
402
403dnl Set up tunnel endpoints on OVS outside the namespace and with a native
404dnl linux device inside the namespace.
405ADD_OVS_TUNNEL([erspan], [br0], [at_erspan0], [172.31.1.1], [10.1.1.100/24], [options:key=1 options:erspan_ver=1 options:erspan_idx=7])
406ADD_NATIVE_TUNNEL([erspan], [ns_erspan0], [at_ns0], [172.31.1.100], [10.1.1.1/24], [seq key 1 erspan_ver 1 erspan 7])
407
408dnl First, check the underlay
409NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [0], [dnl
4103 packets transmitted, 3 received, 0% packet loss, time 0ms
411])
412
413dnl Okay, now check the overlay with different packet sizes
414dnl NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
415NS_CHECK_EXEC([at_ns0], [ping -s 1200 -i 0.3 -c 3 10.1.1.100 | FORMAT_PING], [0], [dnl
4163 packets transmitted, 3 received, 0% packet loss, time 0ms
417])
418OVS_TRAFFIC_VSWITCHD_STOP
419AT_CLEANUP
420
421AT_SETUP([datapath - ping over erspan v2 tunnel])
cae92b42 422OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
98514eea
WT
423OVS_CHECK_GRE()
424OVS_CHECK_ERSPAN()
425
426OVS_TRAFFIC_VSWITCHD_START()
427ADD_BR([br-underlay])
428
429AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
430AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
431
432ADD_NAMESPACES(at_ns0)
433
434dnl Set up underlay link from host into the namespace using veth pair.
435ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24")
436AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
437AT_CHECK([ip link set dev br-underlay up])
438
439dnl Set up tunnel endpoints on OVS outside the namespace and with a native
440dnl linux device inside the namespace.
441ADD_OVS_TUNNEL([erspan], [br0], [at_erspan0], [172.31.1.1], [10.1.1.100/24], [options:key=1 options:erspan_ver=2 options:erspan_dir=1 options:erspan_hwid=0x7])
442ADD_NATIVE_TUNNEL([erspan], [ns_erspan0], [at_ns0], [172.31.1.100], [10.1.1.1/24], [seq key 1 erspan_ver 2 erspan_dir egress erspan_hwid 7])
443
444dnl First, check the underlay
445NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [0], [dnl
4463 packets transmitted, 3 received, 0% packet loss, time 0ms
447])
448
449dnl Okay, now check the overlay with different packet sizes
450dnl NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
451NS_CHECK_EXEC([at_ns0], [ping -s 1200 -i 0.3 -c 3 10.1.1.100 | FORMAT_PING], [0], [dnl
4523 packets transmitted, 3 received, 0% packet loss, time 0ms
453])
454OVS_TRAFFIC_VSWITCHD_STOP
455AT_CLEANUP
456
457AT_SETUP([datapath - ping over ip6erspan v1 tunnel])
cae92b42 458OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
98514eea
WT
459OVS_CHECK_GRE()
460OVS_CHECK_ERSPAN()
461
462OVS_TRAFFIC_VSWITCHD_START()
463ADD_BR([br-underlay])
464
465AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
466AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
467
468ADD_NAMESPACES(at_ns0)
469
470dnl Set up underlay link from host into the namespace using veth pair.
471ADD_VETH(p0, at_ns0, br-underlay, "fc00:100::1/96", [], [], nodad)
472AT_CHECK([ip addr add dev br-underlay "fc00:100::100/96" nodad])
473AT_CHECK([ip link set dev br-underlay up])
474
475dnl Set up tunnel endpoints on OVS outside the namespace and with a native
476dnl linux device inside the namespace.
477ADD_OVS_TUNNEL6([ip6erspan], [br0], [at_erspan0], [fc00:100::1], [10.1.1.100/24],
478 [options:key=123 options:erspan_ver=1 options:erspan_idx=0x7])
479ADD_NATIVE_TUNNEL6([ip6erspan], [ns_erspan0], [at_ns0], [fc00:100::100],
480 [10.1.1.1/24], [local fc00:100::1 seq key 123 erspan_ver 1 erspan 7])
481
482OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 2 fc00:100::100])
483
484dnl First, check the underlay
485NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00:100::100 | FORMAT_PING], [0], [dnl
4863 packets transmitted, 3 received, 0% packet loss, time 0ms
487])
488
489dnl Okay, now check the overlay with different packet sizes
490NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
4913 packets transmitted, 3 received, 0% packet loss, time 0ms
492])
493OVS_TRAFFIC_VSWITCHD_STOP
494AT_CLEANUP
495
496AT_SETUP([datapath - ping over ip6erspan v2 tunnel])
cae92b42 497OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
98514eea
WT
498OVS_CHECK_GRE()
499OVS_CHECK_ERSPAN()
500
501OVS_TRAFFIC_VSWITCHD_START()
502ADD_BR([br-underlay])
503
504AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
505AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
506
507ADD_NAMESPACES(at_ns0)
508
509dnl Set up underlay link from host into the namespace using veth pair.
510ADD_VETH(p0, at_ns0, br-underlay, "fc00:100::1/96", [], [], nodad)
511AT_CHECK([ip addr add dev br-underlay "fc00:100::100/96" nodad])
512AT_CHECK([ip link set dev br-underlay up])
513
514dnl Set up tunnel endpoints on OVS outside the namespace and with a native
515dnl linux device inside the namespace.
516ADD_OVS_TUNNEL6([ip6erspan], [br0], [at_erspan0], [fc00:100::1], [10.1.1.100/24],
517 [options:key=121 options:erspan_ver=2 options:erspan_dir=0 options:erspan_hwid=0x7])
518ADD_NATIVE_TUNNEL6([ip6erspan], [ns_erspan0], [at_ns0], [fc00:100::100],
519 [10.1.1.1/24],
520 [local fc00:100::1 seq key 121 erspan_ver 2 erspan_dir ingress erspan_hwid 0x7])
521
522OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 2 fc00:100::100])
523
524dnl First, check the underlay
525NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00:100::100 | FORMAT_PING], [0], [dnl
5263 packets transmitted, 3 received, 0% packet loss, time 0ms
527])
528
529dnl Okay, now check the overlay with different packet sizes
530NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
5313 packets transmitted, 3 received, 0% packet loss, time 0ms
532])
533OVS_TRAFFIC_VSWITCHD_STOP
534AT_CLEANUP
535
92b8af2c
JS
536AT_SETUP([datapath - ping over geneve tunnel])
537OVS_CHECK_GENEVE()
538
539OVS_TRAFFIC_VSWITCHD_START()
540ADD_BR([br-underlay])
541
542AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
543AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
544
545ADD_NAMESPACES(at_ns0)
546
547dnl Set up underlay link from host into the namespace using veth pair.
548ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24")
549AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
550AT_CHECK([ip link set dev br-underlay up])
551
552dnl Set up tunnel endpoints on OVS outside the namespace and with a native
553dnl linux device inside the namespace.
554ADD_OVS_TUNNEL([geneve], [br0], [at_gnv0], [172.31.1.1], [10.1.1.100/24])
555ADD_NATIVE_TUNNEL([geneve], [ns_gnv0], [at_ns0], [172.31.1.100], [10.1.1.1/24],
556 [vni 0])
557
558dnl First, check the underlay
559NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [0], [dnl
5603 packets transmitted, 3 received, 0% packet loss, time 0ms
561])
562
563dnl Okay, now check the overlay with different packet sizes
564NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
5653 packets transmitted, 3 received, 0% packet loss, time 0ms
566])
567NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
5683 packets transmitted, 3 received, 0% packet loss, time 0ms
569])
570NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
b31f1b04
EG
5713 packets transmitted, 3 received, 0% packet loss, time 0ms
572])
573
574OVS_TRAFFIC_VSWITCHD_STOP
575AT_CLEANUP
576
bed941ba
YHW
577AT_SETUP([datapath - flow resume with geneve tun_metadata])
578OVS_CHECK_GENEVE()
579
580OVS_TRAFFIC_VSWITCHD_START()
581ADD_BR([br-underlay])
582
fcfd14ce
YS
583AT_CHECK([ovs-ofctl monitor br0 resume --detach --no-chdir --pidfile 2> /dev/null])
584
bed941ba
YHW
585ADD_NAMESPACES(at_ns0)
586
587dnl Set up underlay link from host into the namespace using veth pair.
588ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24")
589AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
590AT_CHECK([ip link set dev br-underlay up])
591
592dnl Set up tunnel endpoints on OVS outside the namespace and with a native
593dnl linux device inside the namespace.
594ADD_OVS_TUNNEL([geneve], [br0], [at_gnv0], [172.31.1.1], [10.1.1.100/24])
595ADD_NATIVE_TUNNEL([geneve], [ns_gnv0], [at_ns0], [172.31.1.100], [10.1.1.1/24],
596 [vni 0])
597
598dnl Set up flows
599AT_DATA([flows.txt], [dnl
600table=0, arp action=NORMAL
601table=0, in_port=LOCAL icmp action=output:at_gnv0
602table=0, in_port=at_gnv0 icmp action=set_field:0xa->tun_metadata0,resubmit(,1)
603table=1, icmp action=controller(pause), resubmit(,2)
604table=2, tun_metadata0=0xa, icmp action=output:LOCAL
605])
606AT_CHECK([ovs-ofctl add-tlv-map br0 "{class=0xffff,type=0,len=4}->tun_metadata0"])
607AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
608AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
609
bed941ba
YHW
610NS_CHECK_EXEC([at_ns0], [ping -q -c 3 10.1.1.100 | FORMAT_PING], [0], [dnl
6113 packets transmitted, 3 received, 0% packet loss, time 0ms
612])
613
134e6831
YS
614dnl Test OVS handles TLV map modifictions properly when restores frozen state.
615NS_CHECK_EXEC([at_ns0], [ping 10.1.1.100 > /dev/null &])
616
617AT_CHECK([ovs-ofctl add-tlv-map br0 "{class=0xffff,type=0x88,len=4}->tun_metadata1"])
618sleep 1
619AT_CHECK([ovs-ofctl add-tlv-map br0 "{class=0xffff,type=0x99,len=4}->tun_metadata2"])
620sleep 1
621AT_CHECK([ovs-ofctl add-tlv-map br0 "{class=0xffff,type=0xaa,len=4}->tun_metadata3"])
622sleep 1
623
fcfd14ce 624OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
bed941ba
YHW
625OVS_TRAFFIC_VSWITCHD_STOP
626AT_CLEANUP
627
b31f1b04 628AT_SETUP([datapath - ping over geneve6 tunnel])
67e3ddf1 629OVS_CHECK_GENEVE_UDP6ZEROCSUM()
b31f1b04
EG
630
631OVS_TRAFFIC_VSWITCHD_START()
632ADD_BR([br-underlay])
633
634AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
635AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
636
637ADD_NAMESPACES(at_ns0)
638
639dnl Set up underlay link from host into the namespace using veth pair.
640ADD_VETH(p0, at_ns0, br-underlay, "fc00::1/64", [], [], "nodad")
641AT_CHECK([ip addr add dev br-underlay "fc00::100/64" nodad])
642AT_CHECK([ip link set dev br-underlay up])
643
644dnl Set up tunnel endpoints on OVS outside the namespace and with a native
645dnl linux device inside the namespace.
646ADD_OVS_TUNNEL6([geneve], [br0], [at_gnv0], [fc00::1], [10.1.1.100/24])
647ADD_NATIVE_TUNNEL6([geneve], [ns_gnv0], [at_ns0], [fc00::100], [10.1.1.1/24],
648 [vni 0 udp6zerocsumtx udp6zerocsumrx])
649
650OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::100])
651
652dnl First, check the underlay
653NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00::100 | FORMAT_PING], [0], [dnl
6543 packets transmitted, 3 received, 0% packet loss, time 0ms
655])
656
657dnl Okay, now check the overlay with different packet sizes
658NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
6593 packets transmitted, 3 received, 0% packet loss, time 0ms
660])
661NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
6623 packets transmitted, 3 received, 0% packet loss, time 0ms
663])
664NS_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
6653 packets transmitted, 3 received, 0% packet loss, time 0ms
666])
667
668OVS_TRAFFIC_VSWITCHD_STOP
669AT_CLEANUP
07659514 670
eb27d96b 671AT_SETUP([datapath - ping over gre tunnel by simulated packets])
e06c44a8 672OVS_CHECK_MIN_KERNEL(3, 10)
eb27d96b
YS
673
674OVS_TRAFFIC_VSWITCHD_START()
675AT_CHECK([ovs-vsctl -- set bridge br0 other-config:hwaddr=\"f2:ff:00:00:00:01\"])
676ADD_BR([br-underlay], [set bridge br-underlay other-config:hwaddr=\"f2:ff:00:00:00:02\"])
677
678AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
679AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
680
681ADD_NAMESPACES(at_ns0)
682
683dnl Set up underlay link from host into the namespace using veth pair.
684ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24", f2:ff:00:00:00:03)
685AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
686AT_CHECK([ip link set dev br-underlay up])
687
688dnl Set up tunnel endpoints on OVS outside the namespace.
689ADD_OVS_TUNNEL([gre], [br0], [at_gre0], [172.31.1.1], [10.1.1.100/24])
690
5e06e7ac 691IPTABLES_ACCEPT([br-underlay])
eb27d96b
YS
692
693ip netns exec at_ns0 tcpdump -n -i p0 dst host 172.31.1.1 -l > p0.pcap &
694sleep 1
695
696dnl First, check the underlay.
697NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [0], [dnl
6983 packets transmitted, 3 received, 0% packet loss, time 0ms
699])
700
701dnl We don't actually add gretap port as below, instead, we will
702dnl emulate one that sends packets. Suppose its mac address is f2:ff:00:00:00:04.
703dnl ADD_NATIVE_TUNNEL([gretap], [ns_gre0], [at_ns0], [172.31.1.100], [10.1.1.1/24])
704
705dnl Now, check the overlay by sending out raw arp and icmp packets.
706ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=f2ff00000002f2ff00000003080045000042ec2c4000402ff3bcac1f0101ac1f016400006558fffffffffffff2ff0000000408060001080006040001f2ff000000040a0101010000000000000a010164 actions=NORMAL"
707
708OVS_WAIT_UNTIL([cat p0.pcap | egrep "IP 172.31.1.100 > 172.31.1.1: GREv0, length 46: ARP, Reply 10.1.1.100 is-at f2:ff:00:00:00:01.* length 28" 2>&1 1>/dev/null])
709
710ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=f2ff00000002f2ff0000000308004500007aec8e4000402ff322ac1f0101ac1f016400006558f2ff00000001f2ff00000004080045000054548f40004001cfb30a0101010a0101640800e6e829270003e1a3435b00000000ff1a050000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637 actions=NORMAL"
711
712OVS_WAIT_UNTIL([cat p0.pcap | egrep "IP 172.31.1.100 > 172.31.1.1: GREv0, length 102: IP 10.1.1.100 > 10.1.1.1: ICMP echo reply,.* length 64$" 2>&1 1>/dev/null])
713
714OVS_TRAFFIC_VSWITCHD_STOP
715AT_CLEANUP
716
717AT_SETUP([datapath - ping over erspan v1 tunnel by simulated packets])
e06c44a8 718OVS_CHECK_MIN_KERNEL(3, 10)
eb27d96b
YS
719
720OVS_TRAFFIC_VSWITCHD_START()
721AT_CHECK([ovs-vsctl -- set bridge br0 other-config:hwaddr=\"f2:ff:00:00:00:01\"])
722ADD_BR([br-underlay], [set bridge br-underlay other-config:hwaddr=\"f2:ff:00:00:00:02\"])
723
724AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
725AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
726
727ADD_NAMESPACES(at_ns0)
728
729dnl Set up underlay link from host into the namespace using veth pair.
730ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24", f2:ff:00:00:00:03)
731AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
732AT_CHECK([ip link set dev br-underlay up])
733
734dnl Set up tunnel endpoints on OVS outside the namespace and emulate a native
735dnl linux device inside the namespace.
736ADD_OVS_TUNNEL([erspan], [br0], [at_erspan0], [172.31.1.1], [10.1.1.100/24], [options:key=1 options:erspan_ver=1 options:erspan_idx=7])
737
5e06e7ac 738IPTABLES_ACCEPT([br-underlay])
eb27d96b
YS
739
740ip netns exec at_ns0 tcpdump -n -x -i p0 dst host 172.31.1.1 -l > p0.pcap &
741sleep 1
742
743dnl First, check the underlay
744NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [0], [dnl
7453 packets transmitted, 3 received, 0% packet loss, time 0ms
746])
747
748dnl Okay, now send out an arp request from 10.1.1.1 for 10.1.1.100 in erspan.
749ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=f2ff00000002f2ff0000000308004500004e151d4000402fcac0ac1f0101ac1f0164100088be000000061000000100000007fffffffffffff2ff0000000408060001080006040001f2ff000000040a0101010000000000000a010164 actions=normal"
750
751dnl 0002 is arp reply, followed by mac address of 10.1.1.100.
752OVS_WAIT_UNTIL([cat p0.pcap | egrep "0x0030: 0806 0001 0800 0604 0002 f2ff 0000 0001" 2>&1 1>/dev/null])
753OVS_WAIT_UNTIL([cat p0.pcap | egrep "0x0040: 0a01 0164 f2ff 0000 0004 0a01 0101" 2>&1 1>/dev/null])
754
755dnl Okay, now check the overlay with raw icmp packets.
756AT_FAIL_IF([cat p0.pcap | egrep "IP 172.31.1.100 > 172.31.1.1: GREv0,.* length 122" 2>&1 1>/dev/null])
757
758ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=f2ff00000002f2ff0000000308004500008e70cb4000402f6ed2ac1f0101ac1f0164100088be000000051000000100000007f2ff00000001f2ff0000000408004500005c4a3340004001da070a0101010a010164080084f238fb0001f36a6b5b0000000021870e0000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f actions=normal"
759
760OVS_WAIT_UNTIL([cat p0.pcap | egrep "IP 172.31.1.100 > 172.31.1.1: GREv0,.* length 122" 2>&1 1>/dev/null])
761
762OVS_TRAFFIC_VSWITCHD_STOP
763AT_CLEANUP
764
765AT_SETUP([datapath - ping over erspan v2 tunnel by simulated packets])
e06c44a8 766OVS_CHECK_MIN_KERNEL(3, 10)
eb27d96b
YS
767
768OVS_TRAFFIC_VSWITCHD_START()
769AT_CHECK([ovs-vsctl -- set bridge br0 other-config:hwaddr=\"f2:ff:00:00:00:01\"])
770ADD_BR([br-underlay], [set bridge br-underlay other-config:hwaddr=\"f2:ff:00:00:00:02\"])
771
772AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
773AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
774
775ADD_NAMESPACES(at_ns0)
776
777dnl Set up underlay link from host into the namespace using veth pair.
778ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24", f2:ff:00:00:00:03)
779AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
780AT_CHECK([ip link set dev br-underlay up])
781
782dnl Set up tunnel endpoints on OVS outside the namespace and simulate a native
783dnl linux device inside the namespace.
784ADD_OVS_TUNNEL([erspan], [br0], [at_erspan0], [172.31.1.1], [10.1.1.100/24], [options:key=1 options:erspan_ver=2 options:erspan_dir=1 options:erspan_hwid=0x7])
785
786dnl Certain Linux distributions, like CentOS, have default iptable rules
787dnl to reject input traffic from br-underlay. Here we add a rule to walk
788dnl around it.
789iptables -I INPUT 1 -i br-underlay -j ACCEPT
790on_exit 'iptables -D INPUT 1'
791
792ip netns exec at_ns0 tcpdump -n -x -i p0 dst host 172.31.1.1 -l > p0.pcap &
793sleep 1
794
795dnl First, check the underlay.
796NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [0], [dnl
7973 packets transmitted, 3 received, 0% packet loss, time 0ms
798])
799
800dnl Okay, send raw arp request and icmp echo request.
801ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=f2ff00000002f2ff00000003080045000052373d4000402fa89cac1f0101ac1f0164100088be00000006200000016f54b41700008078fffffffffffff2ff0000000408060001080006040001f2ff000000040a0101010000000000000a010164 actions=normal"
802
803OVS_WAIT_UNTIL([cat p0.pcap | egrep "0x0030: 0000 0001 0806 0001 0800 0604 0002 f2ff" 2>&1 1>/dev/null])
804OVS_WAIT_UNTIL([cat p0.pcap | egrep "0x0040: 0000 0001 0a01 0164 f2ff 0000 0004 0a01" 2>&1 1>/dev/null])
805OVS_WAIT_UNTIL([cat p0.pcap | egrep "0x0050: 0101" 2>&1 1>/dev/null])
806
807dnl Because tcpdump might not be able to parse erspan headers, we check icmp echo reply
808dnl by packet length.
809AT_FAIL_IF([cat p0.pcap | egrep "IP 172.31.1.100 > 172.31.1.1: GREv0,.* length 126" 2>&1 1>/dev/null])
810
811ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=f2ff00000002f2ff0000000308004500009287e14000402f57b8ac1f0101ac1f0164100088be0000000520000001144cd5a400008078f2ff00000001f2ff0000000408004500005c38d640004001eb640a0101010a01016408005e57585f0001df6c6b5b0000000045bc050000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f actions=normal"
812
813OVS_WAIT_UNTIL([cat p0.pcap | egrep "IP 172.31.1.100 > 172.31.1.1: GREv0,.* length 126" 2>&1 1>/dev/null])
814
815OVS_TRAFFIC_VSWITCHD_STOP
816AT_CLEANUP
817
818AT_SETUP([datapath - ping over ip6erspan v1 tunnel by simulated packets])
e06c44a8 819OVS_CHECK_MIN_KERNEL(3, 10)
eb27d96b
YS
820
821OVS_TRAFFIC_VSWITCHD_START()
822AT_CHECK([ovs-vsctl -- set bridge br0 other-config:hwaddr=\"f2:ff:00:00:00:01\"])
823ADD_BR([br-underlay], [set bridge br-underlay other-config:hwaddr=\"f2:ff:00:00:00:02\"])
824
825AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
826AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
827
828ADD_NAMESPACES(at_ns0)
829
830dnl Set up underlay link from host into the namespace using veth pair.
831ADD_VETH(p0, at_ns0, br-underlay, "fc00:100::1/96", f2:ff:00:00:00:03, [], nodad)
832AT_CHECK([ip addr add dev br-underlay "fc00:100::100/96" nodad])
833AT_CHECK([ip link set dev br-underlay up])
834
835dnl Set up tunnel endpoints on OVS outside the namespace and simulate a native
836dnl linux device inside the namespace.
837ADD_OVS_TUNNEL6([ip6erspan], [br0], [at_erspan0], [fc00:100::1], [10.1.1.100/24],
838 [options:key=123 options:erspan_ver=1 options:erspan_idx=0x7])
839
840OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 2 fc00:100::100])
841
842dnl Certain Linux distributions, like CentOS, have default iptable rules
843dnl to reject input traffic from br-underlay. Here we add a rule to walk
844dnl around it.
845ip6tables -I INPUT 1 -i br-underlay -j ACCEPT
846on_exit 'ip6tables -D INPUT 1'
847
848ip netns exec at_ns0 tcpdump -n -x -i p0 dst host fc00:100::1 -l > p0.pcap &
849sleep 1
850
851dnl First, check the underlay.
852NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00:100::100 | FORMAT_PING], [0], [dnl
8533 packets transmitted, 3 received, 0% packet loss, time 0ms
854])
855
856dnl Okay, now send raw arp request and icmp echo request.
857ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=f2ff00000002f2ff0000000386dd60008531003a2f40fc000100000000000000000000000001fc000100000000000000000000000100100088be000000051000007b00000007fffffffffffff2ff0000000408060001080006040001f2ff000000040a0101010000000000000a010164 actions=normal"
858
859dnl Check arp reply.
860OVS_WAIT_UNTIL([cat p0.pcap | egrep "0x0040: 0000 0001 0806 0001 0800 0604 0002 f2ff" 2>&1 1>/dev/null])
861OVS_WAIT_UNTIL([cat p0.pcap | egrep "0x0050: 0000 0001 0a01 0164 f2ff 0000 0004 0a01" 2>&1 1>/dev/null])
862OVS_WAIT_UNTIL([cat p0.pcap | egrep "0x0060: 0101" 2>&1 1>/dev/null])
863
864AT_FAIL_IF([cat p0.pcap | egrep "IP6 fc00:100::100 > fc00:100::1: GREv0,.* length 114" 2>&1 1>/dev/null])
865
866ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=f2ff00000002f2ff0000000386dd60008531007a3c40fc000100000000000000000000000001fc0001000000000000000000000001002f00040104010100100088be000000061000407b00000007f2ff00000001f2ff0000000408004500005429b640004001fa8c0a0101010a01016408005c2c7526000118d3685b00000000e4aa020000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637 actions=normal"
867
868OVS_WAIT_UNTIL([cat p0.pcap | egrep "IP6 fc00:100::100 > fc00:100::1: GREv0,.* length 114" 2>&1 1>/dev/null])
869
870OVS_TRAFFIC_VSWITCHD_STOP
871AT_CLEANUP
872
873AT_SETUP([datapath - ping over ip6erspan v2 tunnel by simulated packets])
e06c44a8 874OVS_CHECK_MIN_KERNEL(3, 10)
eb27d96b
YS
875
876OVS_TRAFFIC_VSWITCHD_START()
877AT_CHECK([ovs-vsctl -- set bridge br0 other-config:hwaddr=\"f2:ff:00:00:00:01\"])
878ADD_BR([br-underlay], [set bridge br-underlay other-config:hwaddr=\"f2:ff:00:00:00:02\"])
879
880AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
881AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
882
883ADD_NAMESPACES(at_ns0)
884
885dnl Set up underlay link from host into the namespace using veth pair.
886ADD_VETH(p0, at_ns0, br-underlay, "fc00:100::1/96", f2:ff:00:00:00:03, [], nodad)
887AT_CHECK([ip addr add dev br-underlay "fc00:100::100/96" nodad])
888AT_CHECK([ip link set dev br-underlay up])
889
890dnl Set up tunnel endpoints on OVS outside the namespace and simulate a native
891dnl linux device inside the namespace.
892ADD_OVS_TUNNEL6([ip6erspan], [br0], [at_erspan0], [fc00:100::1], [10.1.1.100/24],
893 [options:key=121 options:erspan_ver=2 options:erspan_dir=0 options:erspan_hwid=0x7])
894
895OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 2 fc00:100::100])
896
897dnl Certain Linux distributions, like CentOS, have default iptable rules
898dnl to reject input traffic from br-underlay. Here we add a rule to walk
899dnl around it.
900ip6tables -I INPUT 1 -i br-underlay -j ACCEPT
901on_exit 'ip6tables -D INPUT 1'
902
903ip netns exec at_ns0 tcpdump -n -x -i p0 dst host fc00:100::1 -l > p0.pcap &
904sleep 1
905
906dnl First, check the underlay.
907NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00:100::100 | FORMAT_PING], [0], [dnl
9083 packets transmitted, 3 received, 0% packet loss, time 0ms
909])
910
911dnl Okay, now send raw arp request and icmp echo request.
912ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=f2ff00000002f2ff0000000386dd60008531003e2f40fc000100000000000000000000000001fc000100000000000000000000000100100088be0000000620000079af514f9900008070fffffffffffff2ff0000000408060001080006040001f2ff000000040a0101010000000000000a010164 actions=normal"
913
914OVS_WAIT_UNTIL([cat p0.pcap | egrep "0x0040: 0004 f2ff 0000 0001 0806 0001 0800 0604" 2>&1 1>/dev/null])
915OVS_WAIT_UNTIL([cat p0.pcap | egrep "0x0050: 0002 f2ff 0000 0001 0a01 0164 f2ff 0000" 2>&1 1>/dev/null])
916OVS_WAIT_UNTIL([cat p0.pcap | egrep "0x0060: 0004 0a01 0101" 2>&1 1>/dev/null])
917
918AT_FAIL_IF([cat p0.pcap | egrep "IP6 fc00:100::100 > fc00:100::1: GREv0, .* length 118" 2>&1 1>/dev/null])
919
920ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=f2ff00000002f2ff0000000386dd60008531007e3c40fc000100000000000000000000000001fc0001000000000000000000000001002f00040104010100100088be0000000720004079af514f9b00008070f2ff00000001f2ff00000004080045000054ffcb4000400124770a0101010a0101640800419e23ac000112d7685b000000004caf0c0000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637 actions=normal"
921
922OVS_WAIT_UNTIL([cat p0.pcap | egrep "IP6 fc00:100::100 > fc00:100::1: GREv0, .* length 118" 2>&1 1>/dev/null])
923
924OVS_TRAFFIC_VSWITCHD_STOP
925AT_CLEANUP
926
7ae62a67
WT
927AT_SETUP([datapath - clone action])
928OVS_TRAFFIC_VSWITCHD_START()
929
930ADD_NAMESPACES(at_ns0, at_ns1, at_ns2)
931
932ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
933ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
7ae62a67 934
88b5874e
WT
935AT_CHECK([ovs-vsctl -- set interface ovs-p0 ofport_request=1 \
936 -- set interface ovs-p1 ofport_request=2])
7ae62a67 937
88b5874e
WT
938AT_DATA([flows.txt], [dnl
939priority=1 actions=NORMAL
940priority=10 in_port=1,ip,actions=clone(mod_dl_dst(50:54:00:00:00:0a),set_field:192.168.3.3->ip_dst), output:2
941priority=10 in_port=2,ip,actions=clone(mod_dl_src(ae:c6:7e:54:8d:4d),mod_dl_dst(50:54:00:00:00:0b),set_field:192.168.4.4->ip_dst, controller), output:1
942])
943AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
7ae62a67 944
88b5874e 945AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
7ae62a67
WT
946NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
9473 packets transmitted, 3 received, 0% packet loss, time 0ms
948])
949
e8833217
DM
950OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
951
88b5874e
WT
952AT_CHECK([cat ofctl_monitor.log | STRIP_MONITOR_CSUM], [0], [dnl
953icmp,vlan_tci=0x0000,dl_src=ae:c6:7e:54:8d:4d,dl_dst=50:54:00:00:00:0b,nw_src=10.1.1.2,nw_dst=192.168.4.4,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=0,icmp_code=0 icmp_csum: <skip>
954icmp,vlan_tci=0x0000,dl_src=ae:c6:7e:54:8d:4d,dl_dst=50:54:00:00:00:0b,nw_src=10.1.1.2,nw_dst=192.168.4.4,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=0,icmp_code=0 icmp_csum: <skip>
955icmp,vlan_tci=0x0000,dl_src=ae:c6:7e:54:8d:4d,dl_dst=50:54:00:00:00:0b,nw_src=10.1.1.2,nw_dst=192.168.4.4,nw_tos=0,nw_ecn=0,nw_ttl=64,icmp_type=0,icmp_code=0 icmp_csum: <skip>
956])
7ae62a67
WT
957
958OVS_TRAFFIC_VSWITCHD_STOP
959AT_CLEANUP
960
457402dc
YHW
961AT_SETUP([datapath - mpls actions])
962OVS_TRAFFIC_VSWITCHD_START([_ADD_BR([br1])])
963
964ADD_NAMESPACES(at_ns0, at_ns1)
965
966ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
967ADD_VETH(p1, at_ns1, br1, "10.1.1.2/24")
968
969AT_CHECK([ip link add patch0 type veth peer name patch1])
970on_exit 'ip link del patch0'
971
972AT_CHECK([ip link set dev patch0 up])
973AT_CHECK([ip link set dev patch1 up])
974AT_CHECK([ovs-vsctl add-port br0 patch0])
975AT_CHECK([ovs-vsctl add-port br1 patch1])
976
977AT_DATA([flows.txt], [dnl
978table=0,priority=100,dl_type=0x0800 actions=push_mpls:0x8847,set_mpls_label:3,resubmit(,1)
979table=0,priority=100,dl_type=0x8847,mpls_label=3 actions=pop_mpls:0x0800,resubmit(,1)
980table=0,priority=10 actions=resubmit(,1)
981table=1,priority=10 actions=normal
982])
983
984AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
985AT_CHECK([ovs-ofctl add-flows br1 flows.txt])
986
987NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
9883 packets transmitted, 3 received, 0% packet loss, time 0ms
989])
990
991NS_CHECK_EXEC([at_ns1], [ping -q -c 3 -i 0.3 -w 2 10.1.1.1 | FORMAT_PING], [0], [dnl
9923 packets transmitted, 3 received, 0% packet loss, time 0ms
993])
994
995OVS_TRAFFIC_VSWITCHD_STOP
996AT_CLEANUP
df711aae
MV
997
998AT_SETUP([datapath - multiple mpls label pop])
999OVS_TRAFFIC_VSWITCHD_START([_ADD_BR([br1])])
1000
1001ADD_NAMESPACES(at_ns0, at_ns1)
1002
1003ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1004ADD_VETH(p1, at_ns1, br1, "10.1.1.2/24")
1005
1006AT_CHECK([ip link add patch0 type veth peer name patch1])
1007on_exit 'ip link del patch0'
1008
1009AT_CHECK([ip link set dev patch0 up])
1010AT_CHECK([ip link set dev patch1 up])
1011AT_CHECK([ovs-vsctl add-port br0 patch0])
1012AT_CHECK([ovs-vsctl add-port br1 patch1])
1013
1014AT_DATA([flows.txt], [dnl
1015table=0,priority=100,dl_type=0x0800 actions=push_mpls:0x8847,set_mpls_label:3,push_mpls:0x8847,set_mpls_label:2,push_mpls:0x8847,set_mpls_label:1,resubmit(,3)
1016table=0,priority=100,dl_type=0x8847,mpls_label=1 actions=pop_mpls:0x8847,resubmit(,1)
1017table=1,priority=100,dl_type=0x8847,mpls_label=2 actions=pop_mpls:0x8847,resubmit(,2)
1018table=2,priority=100,dl_type=0x8847,mpls_label=3 actions=pop_mpls:0x0800,resubmit(,3)
1019table=0,priority=10 actions=resubmit(,3)
1020table=3,priority=10 actions=normal
1021])
1022
1023AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1024AT_CHECK([ovs-ofctl add-flows br1 flows.txt])
1025
1026NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
10273 packets transmitted, 3 received, 0% packet loss, time 0ms
1028])
1029
1030NS_CHECK_EXEC([at_ns1], [ping -q -c 3 -i 0.3 -w 2 10.1.1.1 | FORMAT_PING], [0], [dnl
10313 packets transmitted, 3 received, 0% packet loss, time 0ms
1032])
1033OVS_TRAFFIC_VSWITCHD_STOP
1034AT_CLEANUP
1035
aaca4fe0 1036AT_SETUP([datapath - basic truncate action])
9c1ab985 1037AT_SKIP_IF([test $HAVE_NC = no])
aaca4fe0
WT
1038OVS_TRAFFIC_VSWITCHD_START()
1039AT_CHECK([ovs-ofctl del-flows br0])
1040
1041dnl Create p0 and ovs-p0(1)
1042ADD_NAMESPACES(at_ns0)
1043ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1044NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address e6:66:c1:11:11:11])
1045NS_CHECK_EXEC([at_ns0], [arp -s 10.1.1.2 e6:66:c1:22:22:22])
1046
1047dnl Create p1(3) and ovs-p1(2), packets received from ovs-p1 will appear in p1
1048AT_CHECK([ip link add p1 type veth peer name ovs-p1])
1049on_exit 'ip link del ovs-p1'
1050AT_CHECK([ip link set dev ovs-p1 up])
1051AT_CHECK([ip link set dev p1 up])
1052AT_CHECK([ovs-vsctl add-port br0 ovs-p1 -- set interface ovs-p1 ofport_request=2])
1053dnl Use p1 to check the truncated packet
1054AT_CHECK([ovs-vsctl add-port br0 p1 -- set interface p1 ofport_request=3])
1055
1056dnl Create p2(5) and ovs-p2(4)
1057AT_CHECK([ip link add p2 type veth peer name ovs-p2])
1058on_exit 'ip link del ovs-p2'
1059AT_CHECK([ip link set dev ovs-p2 up])
1060AT_CHECK([ip link set dev p2 up])
1061AT_CHECK([ovs-vsctl add-port br0 ovs-p2 -- set interface ovs-p2 ofport_request=4])
1062dnl Use p2 to check the truncated packet
1063AT_CHECK([ovs-vsctl add-port br0 p2 -- set interface p2 ofport_request=5])
1064
1065dnl basic test
1066AT_CHECK([ovs-ofctl del-flows br0])
1067AT_DATA([flows.txt], [dnl
1068in_port=3 dl_dst=e6:66:c1:22:22:22 actions=drop
1069in_port=5 dl_dst=e6:66:c1:22:22:22 actions=drop
1070in_port=1 dl_dst=e6:66:c1:22:22:22 actions=output(port=2,max_len=100),output:4
1071])
1072AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1073
1074dnl use this file as payload file for ncat
1075AT_CHECK([dd if=/dev/urandom of=payload200.bin bs=200 count=1 2> /dev/null])
1076on_exit 'rm -f payload200.bin'
a037f175 1077NS_CHECK_EXEC([at_ns0], [nc $NC_EOF_OPT -u 10.1.1.2 1234 < payload200.bin])
aaca4fe0
WT
1078
1079dnl packet with truncated size
1080AT_CHECK([ovs-appctl revalidator/purge], [0])
1081AT_CHECK([ovs-ofctl dump-flows br0 table=0 | grep "in_port=3" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
1082n_bytes=100
1083])
1084dnl packet with original size
1085AT_CHECK([ovs-appctl revalidator/purge], [0])
1086AT_CHECK([ovs-ofctl dump-flows br0 table=0 | grep "in_port=5" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
1087n_bytes=242
1088])
1089
1090dnl more complicated output actions
1091AT_CHECK([ovs-ofctl del-flows br0])
1092AT_DATA([flows.txt], [dnl
1093in_port=3 dl_dst=e6:66:c1:22:22:22 actions=drop
1094in_port=5 dl_dst=e6:66:c1:22:22:22 actions=drop
1095in_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)
1096])
1097AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1098
a037f175 1099NS_CHECK_EXEC([at_ns0], [nc $NC_EOF_OPT -u 10.1.1.2 1234 < payload200.bin])
aaca4fe0
WT
1100
1101dnl 100 + 100 + 242 + min(65535,242) = 684
1102AT_CHECK([ovs-appctl revalidator/purge], [0])
1103AT_CHECK([ovs-ofctl dump-flows br0 table=0 | grep "in_port=3" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
1104n_bytes=684
1105])
1106dnl 242 + 100 + min(242,200) = 542
1107AT_CHECK([ovs-ofctl dump-flows br0 table=0 | grep "in_port=5" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
1108n_bytes=542
1109])
1110
1111dnl SLOW_ACTION: disable kernel datapath truncate support
1112dnl Repeat the test above, but exercise the SLOW_ACTION code path
c7eca965 1113AT_CHECK([ovs-appctl dpif/set-dp-features br0 trunc false], [0])
aaca4fe0
WT
1114
1115dnl SLOW_ACTION test1: check datapatch actions
1116AT_CHECK([ovs-ofctl del-flows br0])
1117AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1118
3041e1fc 1119AT_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
1120AT_CHECK([tail -3 stdout], [0],
1121[Datapath actions: trunc(100),3,5,trunc(100),3,trunc(100),5,3,trunc(200),5,trunc(65535),3
1122This flow is handled by the userspace slow path because it:
393e9f7c 1123 - Uses action(s) not supported by datapath.
aaca4fe0 1124])
aaca4fe0
WT
1125
1126dnl SLOW_ACTION test2: check actual packet truncate
1127AT_CHECK([ovs-ofctl del-flows br0])
1128AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
a037f175 1129NS_CHECK_EXEC([at_ns0], [nc $NC_EOF_OPT -u 10.1.1.2 1234 < payload200.bin])
aaca4fe0
WT
1130
1131dnl 100 + 100 + 242 + min(65535,242) = 684
1132AT_CHECK([ovs-appctl revalidator/purge], [0])
1133AT_CHECK([ovs-ofctl dump-flows br0 table=0 | grep "in_port=3" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
1134n_bytes=684
1135])
1136
1137dnl 242 + 100 + min(242,200) = 542
1138AT_CHECK([ovs-ofctl dump-flows br0 table=0 | grep "in_port=5" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
1139n_bytes=542
1140])
1141
1142OVS_TRAFFIC_VSWITCHD_STOP
1143AT_CLEANUP
1144
348f1f67
YS
1145dnl Create 2 bridges and 2 namespaces to test truncate over
1146dnl GRE tunnel:
1147dnl br0: overlay bridge
1148dnl ns1: connect to br0, with IP:10.1.1.2
1149dnl br-underlay: with IP: 172.31.1.100
1150dnl ns0: connect to br-underlay, with IP: 10.1.1.1
1151AT_SETUP([datapath - truncate and output to gre tunnel by simulated packets])
e06c44a8 1152OVS_CHECK_MIN_KERNEL(3, 10)
348f1f67
YS
1153AT_SKIP_IF([test $HAVE_NC = no])
1154OVS_TRAFFIC_VSWITCHD_START()
1155
1156ADD_BR([br-underlay], [set bridge br-underlay other-config:hwaddr=\"02:90:8c:a8:a1:49\"])
1157ADD_NAMESPACES(at_ns0)
1158ADD_NAMESPACES(at_ns1)
1159AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
1160AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
1161
1162dnl Set up underlay link from host into the namespace using veth pair.
1163ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24", fa:ad:fa:25:05:60)
1164AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
1165AT_CHECK([ip link set dev br-underlay up])
1166
1167dnl Set up tunnel endpoints on OVS outside the namespace and with a native
1168dnl linux device inside the namespace.
1169ADD_OVS_TUNNEL([gre], [br0], [at_gre0], [172.31.1.1], [10.1.1.100/24])
1170
1171dnl The below native tunnel isn't actually added. We simulate it to send
1172dnl and receive packets.
1173dnl ADD_NATIVE_TUNNEL([gretap], [ns_gre0], [at_ns0], [172.31.1.100], [10.1.1.1/24],
1174dnl [], [address e6:66:c1:11:11:11])
1175dnl AT_CHECK([ovs-vsctl -- set interface at_gre0 ofport_request=1])
1176dnl NS_CHECK_EXEC([at_ns0], [arp -s 10.1.1.2 e6:66:c1:22:22:22])
1177
1178dnl Set up (p1 and ovs-p1) at br0
1179ADD_VETH(p1, at_ns1, br0, '10.1.1.2/24')
1180AT_CHECK([ovs-vsctl -- set interface ovs-p1 ofport_request=2])
1181NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address e6:66:c1:22:22:22])
1182NS_CHECK_EXEC([at_ns1], [arp -s 10.1.1.1 e6:66:c1:11:11:11])
1183
1184dnl Set up (p2 and ovs-p2) as loopback for verifying packet size
1185AT_CHECK([ip link add p2 type veth peer name ovs-p2])
1186on_exit 'ip link del ovs-p2'
1187AT_CHECK([ip link set dev ovs-p2 up])
1188AT_CHECK([ip link set dev p2 up])
1189AT_CHECK([ovs-vsctl add-port br0 ovs-p2 -- set interface ovs-p2 ofport_request=3])
1190AT_CHECK([ovs-vsctl add-port br0 p2 -- set interface p2 ofport_request=4])
1191
1192dnl use this file as payload file for ncat
1193AT_CHECK([dd if=/dev/urandom of=payload200.bin bs=200 count=1 2> /dev/null])
1194on_exit 'rm -f payload200.bin'
1195
1196AT_CHECK([ovs-ofctl del-flows br0])
1197AT_DATA([flows.txt], [dnl
1198priority=99,in_port=1,actions=output(port=2,max_len=100),output(port=3,max_len=100)
1199priority=99,in_port=2,udp,actions=output(port=1,max_len=100)
1200priority=1,in_port=4,ip,actions=drop
1201priority=1,actions=drop
1202])
1203AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1204
1205AT_CHECK([ovs-ofctl del-flows br-underlay])
1206AT_DATA([flows-underlay.txt], [dnl
1207priority=99,dl_type=0x0800,nw_proto=47,in_port=1,actions=LOCAL
1208priority=99,dl_type=0x0800,nw_proto=47,in_port=LOCAL,ip_dst=172.31.1.1/24,actions=1
1209priority=1,actions=drop
1210])
1211
1212AT_CHECK([ovs-ofctl add-flows br-underlay flows-underlay.txt])
1213
1214dnl check tunnel push path, from at_ns1 to at_ns0
1215NS_CHECK_EXEC([at_ns1], [nc $NC_EOF_OPT -u 10.1.1.1 1234 < payload200.bin])
1216AT_CHECK([ovs-appctl revalidator/purge], [0])
1217
1218dnl Before truncation = ETH(14) + IP(20) + UDP(8) + 200 = 242B
1219AT_CHECK([ovs-ofctl dump-flows br0 | grep "in_port=2" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
1220n_bytes=242
1221])
1222dnl After truncation = outer ETH(14) + outer IP(20) + GRE(4) + 100 = 138B
1223AT_CHECK([ovs-ofctl dump-flows br-underlay | grep "in_port=LOCAL" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
1224n_bytes=138
1225])
1226
1227dnl check tunnel pop path, from at_ns0 to at_ns1
1228dnl This 200-byte packet is simulated on behalf of ns_gre0
1229ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=02908ca8a149faadfa25056008004500010a9e9d4000402f4084ac1f0101ac1f016400006558e666c1222222e666c11111110800450000e46f8e40004011b4760a0101010a010102e026162e00d016e6a366ebf904c74132c6fed42a9e9e46240b4d9fd13c9b47d9704a388e70a5e77db16934a6188dc01d86aa20007ace2cf9cdb111f208474b88ffc851c871f0e3fb4fff138c1d288d437efff487e2b86a9c99fbf4229a6485e133bcf3e16f6e345207fda0932d9eeb602740456fd077b4847d25481337bd716155cc245be129ccc11bf82b834767b3760b52fe913c0e24f31c0e1b27f88acf7bba6b985fb64ee2cd6fc6bba1a9c1f021e253e1728b046fd4d023307e3296361a37ea2617ebcb2537e0284a81050dd0ee actions=LOCAL"
1230
1231dnl After truncation = 100 byte at loopback device p2(4)
1232AT_CHECK([ovs-appctl revalidator/purge], [0])
1233AT_CHECK([ovs-ofctl dump-flows br0 | grep "in_port=4" | ofctl_strip], [0], [dnl
1234 n_packets=1, n_bytes=100, priority=1,ip,in_port=4 actions=drop
1235])
1236
1237dnl SLOW_ACTION: disable datapath truncate support
1238dnl Repeat the test above, but exercise the SLOW_ACTION code path
1239AT_CHECK([ovs-appctl dpif/set-dp-features br0 trunc false], [0])
1240
1241dnl SLOW_ACTION test1: check datapatch actions
1242AT_CHECK([ovs-ofctl del-flows br0])
1243AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1244
1245dnl SLOW_ACTION test2: check actual packet truncate
1246AT_CHECK([ovs-ofctl del-flows br0])
1247AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1248AT_CHECK([ovs-ofctl del-flows br-underlay])
1249AT_CHECK([ovs-ofctl add-flows br-underlay flows-underlay.txt])
1250
1251dnl check tunnel push path, from at_ns1 to at_ns0
1252NS_CHECK_EXEC([at_ns1], [nc $NC_EOF_OPT -u 10.1.1.1 1234 < payload200.bin])
1253AT_CHECK([ovs-appctl revalidator/purge], [0])
1254
1255dnl Before truncation = ETH(14) + IP(20) + UDP(8) + 200 = 242B
1256AT_CHECK([ovs-ofctl dump-flows br0 | grep "in_port=2" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
1257n_bytes=242
1258])
1259dnl After truncation = outer ETH(14) + outer IP(20) + GRE(4) + 100 = 138B
1260AT_CHECK([ovs-ofctl dump-flows br-underlay | grep "in_port=LOCAL" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
1261n_bytes=138
1262])
1263
1264dnl check tunnel pop path, from at_ns0 to at_ns1
1265dnl This 200-byte packet is simulated on behalf of ns_gre0
1266ovs-ofctl -O OpenFlow13 packet-out br-underlay "in_port=1 packet=02908ca8a149faadfa25056008004500010a9e9d4000402f4084ac1f0101ac1f016400006558e666c1222222e666c11111110800450000e46f8e40004011b4760a0101010a010102e026162e00d016e6a366ebf904c74132c6fed42a9e9e46240b4d9fd13c9b47d9704a388e70a5e77db16934a6188dc01d86aa20007ace2cf9cdb111f208474b88ffc851c871f0e3fb4fff138c1d288d437efff487e2b86a9c99fbf4229a6485e133bcf3e16f6e345207fda0932d9eeb602740456fd077b4847d25481337bd716155cc245be129ccc11bf82b834767b3760b52fe913c0e24f31c0e1b27f88acf7bba6b985fb64ee2cd6fc6bba1a9c1f021e253e1728b046fd4d023307e3296361a37ea2617ebcb2537e0284a81050dd0ee actions=LOCAL"
1267
1268dnl After truncation = 100 byte at loopback device p2(4)
1269AT_CHECK([ovs-appctl revalidator/purge], [0])
1270AT_CHECK([ovs-ofctl dump-flows br0 | grep "in_port=4" | ofctl_strip], [0], [dnl
1271 n_packets=1, n_bytes=100, priority=1,ip,in_port=4 actions=drop
1272])
1273
1274OVS_TRAFFIC_VSWITCHD_STOP
1275AT_CLEANUP
1276
aaca4fe0
WT
1277dnl Create 2 bridges and 2 namespaces to test truncate over
1278dnl GRE tunnel:
1279dnl br0: overlay bridge
1280dnl ns1: connect to br0, with IP:10.1.1.2
1281dnl br-underlay: with IP: 172.31.1.100
1282dnl ns0: connect to br-underlay, with IP: 10.1.1.1
1283AT_SETUP([datapath - truncate and output to gre tunnel])
9c1ab985 1284AT_SKIP_IF([test $HAVE_NC = no])
348f1f67 1285OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
aaca4fe0
WT
1286OVS_CHECK_GRE()
1287OVS_TRAFFIC_VSWITCHD_START()
1288
1289ADD_BR([br-underlay])
1290ADD_NAMESPACES(at_ns0)
1291ADD_NAMESPACES(at_ns1)
1292AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
1293AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
1294
1295dnl Set up underlay link from host into the namespace using veth pair.
1296ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24")
1297AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
1298AT_CHECK([ip link set dev br-underlay up])
1299
1300dnl Set up tunnel endpoints on OVS outside the namespace and with a native
1301dnl linux device inside the namespace.
1302ADD_OVS_TUNNEL([gre], [br0], [at_gre0], [172.31.1.1], [10.1.1.100/24])
2b9f3924
WT
1303ADD_NATIVE_TUNNEL([gretap], [ns_gre0], [at_ns0], [172.31.1.100], [10.1.1.1/24],
1304 [], [address e6:66:c1:11:11:11])
aaca4fe0 1305AT_CHECK([ovs-vsctl -- set interface at_gre0 ofport_request=1])
aaca4fe0
WT
1306NS_CHECK_EXEC([at_ns0], [arp -s 10.1.1.2 e6:66:c1:22:22:22])
1307
1308dnl Set up (p1 and ovs-p1) at br0
1309ADD_VETH(p1, at_ns1, br0, '10.1.1.2/24')
1310AT_CHECK([ovs-vsctl -- set interface ovs-p1 ofport_request=2])
1311NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address e6:66:c1:22:22:22])
1312NS_CHECK_EXEC([at_ns1], [arp -s 10.1.1.1 e6:66:c1:11:11:11])
1313
1314dnl Set up (p2 and ovs-p2) as loopback for verifying packet size
1315AT_CHECK([ip link add p2 type veth peer name ovs-p2])
1316on_exit 'ip link del ovs-p2'
1317AT_CHECK([ip link set dev ovs-p2 up])
1318AT_CHECK([ip link set dev p2 up])
1319AT_CHECK([ovs-vsctl add-port br0 ovs-p2 -- set interface ovs-p2 ofport_request=3])
1320AT_CHECK([ovs-vsctl add-port br0 p2 -- set interface p2 ofport_request=4])
1321
1322dnl use this file as payload file for ncat
1323AT_CHECK([dd if=/dev/urandom of=payload200.bin bs=200 count=1 2> /dev/null])
1324on_exit 'rm -f payload200.bin'
1325
1326AT_CHECK([ovs-ofctl del-flows br0])
1327AT_DATA([flows.txt], [dnl
1328priority=99,in_port=1,actions=output(port=2,max_len=100),output(port=3,max_len=100)
1329priority=99,in_port=2,udp,actions=output(port=1,max_len=100)
1330priority=1,in_port=4,ip,actions=drop
1331priority=1,actions=drop
1332])
1333AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1334
1335AT_CHECK([ovs-ofctl del-flows br-underlay])
1336AT_DATA([flows-underlay.txt], [dnl
1337priority=99,dl_type=0x0800,nw_proto=47,in_port=1,actions=LOCAL
1338priority=99,dl_type=0x0800,nw_proto=47,in_port=LOCAL,ip_dst=172.31.1.1/24,actions=1
1339priority=1,actions=drop
1340])
1341
1342AT_CHECK([ovs-ofctl add-flows br-underlay flows-underlay.txt])
1343
1344dnl check tunnel push path, from at_ns1 to at_ns0
a037f175 1345NS_CHECK_EXEC([at_ns1], [nc $NC_EOF_OPT -u 10.1.1.1 1234 < payload200.bin])
aaca4fe0
WT
1346AT_CHECK([ovs-appctl revalidator/purge], [0])
1347
1348dnl Before truncation = ETH(14) + IP(20) + UDP(8) + 200 = 242B
1349AT_CHECK([ovs-ofctl dump-flows br0 | grep "in_port=2" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
1350n_bytes=242
1351])
1352dnl After truncation = outer ETH(14) + outer IP(20) + GRE(4) + 100 = 138B
1353AT_CHECK([ovs-ofctl dump-flows br-underlay | grep "in_port=LOCAL" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
1354n_bytes=138
1355])
1356
1357dnl check tunnel pop path, from at_ns0 to at_ns1
a037f175 1358NS_CHECK_EXEC([at_ns0], [nc $NC_EOF_OPT -u 10.1.1.2 5678 < payload200.bin])
aaca4fe0
WT
1359dnl After truncation = 100 byte at loopback device p2(4)
1360AT_CHECK([ovs-appctl revalidator/purge], [0])
32b0cc65
JS
1361AT_CHECK([ovs-ofctl dump-flows br0 | grep "in_port=4" | ofctl_strip], [0], [dnl
1362 n_packets=1, n_bytes=100, priority=1,ip,in_port=4 actions=drop
aaca4fe0
WT
1363])
1364
1365dnl SLOW_ACTION: disable datapath truncate support
1366dnl Repeat the test above, but exercise the SLOW_ACTION code path
c7eca965 1367AT_CHECK([ovs-appctl dpif/set-dp-features br0 trunc false], [0])
aaca4fe0
WT
1368
1369dnl SLOW_ACTION test1: check datapatch actions
1370AT_CHECK([ovs-ofctl del-flows br0])
1371AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1372
aaca4fe0
WT
1373dnl SLOW_ACTION test2: check actual packet truncate
1374AT_CHECK([ovs-ofctl del-flows br0])
1375AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
1376AT_CHECK([ovs-ofctl del-flows br-underlay])
1377AT_CHECK([ovs-ofctl add-flows br-underlay flows-underlay.txt])
1378
1379dnl check tunnel push path, from at_ns1 to at_ns0
a037f175 1380NS_CHECK_EXEC([at_ns1], [nc $NC_EOF_OPT -u 10.1.1.1 1234 < payload200.bin])
aaca4fe0
WT
1381AT_CHECK([ovs-appctl revalidator/purge], [0])
1382
1383dnl Before truncation = ETH(14) + IP(20) + UDP(8) + 200 = 242B
1384AT_CHECK([ovs-ofctl dump-flows br0 | grep "in_port=2" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
1385n_bytes=242
1386])
1387dnl After truncation = outer ETH(14) + outer IP(20) + GRE(4) + 100 = 138B
1388AT_CHECK([ovs-ofctl dump-flows br-underlay | grep "in_port=LOCAL" | sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
1389n_bytes=138
1390])
1391
1392dnl check tunnel pop path, from at_ns0 to at_ns1
a037f175 1393NS_CHECK_EXEC([at_ns0], [nc $NC_EOF_OPT -u 10.1.1.2 5678 < payload200.bin])
aaca4fe0
WT
1394dnl After truncation = 100 byte at loopback device p2(4)
1395AT_CHECK([ovs-appctl revalidator/purge], [0])
32b0cc65
JS
1396AT_CHECK([ovs-ofctl dump-flows br0 | grep "in_port=4" | ofctl_strip], [0], [dnl
1397 n_packets=1, n_bytes=100, priority=1,ip,in_port=4 actions=drop
aaca4fe0
WT
1398])
1399
1400OVS_TRAFFIC_VSWITCHD_STOP
1401AT_CLEANUP
1402
ee8941ab
JS
1403AT_BANNER([conntrack])
1404
07659514
JS
1405AT_SETUP([conntrack - controller])
1406CHECK_CONNTRACK()
cf7659b6 1407OVS_TRAFFIC_VSWITCHD_START()
daf4d3c1 1408AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg ofproto_dpif_upcall:dbg])
07659514
JS
1409
1410ADD_NAMESPACES(at_ns0, at_ns1)
1411
1412ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1413ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1414
1415dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
1416AT_DATA([flows.txt], [dnl
1417priority=1,action=drop
1418priority=10,arp,action=normal
1419priority=100,in_port=1,udp,action=ct(commit),controller
1420priority=100,in_port=2,ct_state=-trk,udp,action=ct(table=0)
1421priority=100,in_port=2,ct_state=+trk+est,udp,action=controller
1422])
1423
6cfa8ec3 1424AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
07659514
JS
1425
1426AT_CAPTURE_FILE([ofctl_monitor.log])
1427AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
1428
1429dnl Send an unsolicited reply from port 2. This should be dropped.
4573c42e 1430AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 2 ct\(table=0\) '50540000000a50540000000908004500001c000000000011a4cd0a0101020a0101010002000100080000'])
07659514
JS
1431
1432dnl OK, now start a new connection from port 1.
4573c42e 1433AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 1 ct\(commit\),controller '50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000200080000'])
07659514
JS
1434
1435dnl Now try a reply from port 2.
4573c42e 1436AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 2 ct\(table=0\) '50540000000a50540000000908004500001c000000000011a4cd0a0101020a0101010002000100080000'])
07659514 1437
e8833217
DM
1438OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
1439
07659514
JS
1440dnl Check this output. We only see the latter two packets, not the first.
1441AT_CHECK([cat ofctl_monitor.log], [0], [dnl
f274a047 1442NXT_PACKET_IN2 (xid=0x0): total_len=42 in_port=1 (via action) data_len=42 (unbuffered)
07659514 1443udp,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
45e46e92 1444NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=42 ct_state=est|rpl|trk,ct_nw_src=10.1.1.1,ct_nw_dst=10.1.1.2,ct_nw_proto=17,ct_tp_src=1,ct_tp_dst=2,ip,in_port=2 (via action) data_len=42 (unbuffered)
07659514
JS
1445udp,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
1446])
1447
1448OVS_TRAFFIC_VSWITCHD_STOP
1449AT_CLEANUP
1450
a76a37ef
JR
1451AT_SETUP([conntrack - force commit])
1452CHECK_CONNTRACK()
1453OVS_TRAFFIC_VSWITCHD_START()
1454AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg ofproto_dpif_upcall:dbg])
1455
1456ADD_NAMESPACES(at_ns0, at_ns1)
1457
1458ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1459ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1460
1461AT_DATA([flows.txt], [dnl
1462priority=1,action=drop
1463priority=10,arp,action=normal
68c94b1a 1464priority=100,in_port=1,udp,action=ct(force,commit),controller
a76a37ef
JR
1465priority=100,in_port=2,ct_state=-trk,udp,action=ct(table=0)
1466priority=100,in_port=2,ct_state=+trk+est,udp,action=ct(force,commit,table=1)
1467table=1,in_port=2,ct_state=+trk,udp,action=controller
1468])
1469
1470AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
1471
1472AT_CAPTURE_FILE([ofctl_monitor.log])
1473AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
1474
1475dnl Send an unsolicited reply from port 2. This should be dropped.
1476AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=2 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101020a0101010002000100080000 actions=resubmit(,0)"])
1477
1478dnl OK, now start a new connection from port 1.
1479AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000200080000 actions=resubmit(,0)"])
1480
1481dnl Now try a reply from port 2.
1482AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=2 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101020a0101010002000100080000 actions=resubmit(,0)"])
1483
1484AT_CHECK([ovs-appctl revalidator/purge], [0])
1485
e8833217
DM
1486OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
1487
a76a37ef
JR
1488dnl Check this output. We only see the latter two packets, not the first.
1489AT_CHECK([cat ofctl_monitor.log], [0], [dnl
1490NXT_PACKET_IN2 (xid=0x0): cookie=0x0 total_len=42 in_port=1 (via action) data_len=42 (unbuffered)
1491udp,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
45e46e92 1492NXT_PACKET_IN2 (xid=0x0): table_id=1 cookie=0x0 total_len=42 ct_state=new|trk,ct_nw_src=10.1.1.2,ct_nw_dst=10.1.1.1,ct_nw_proto=17,ct_tp_src=2,ct_tp_dst=1,ip,in_port=2 (via action) data_len=42 (unbuffered)
a76a37ef
JR
1493udp,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
1494])
1495
1496dnl
1497dnl Check that the directionality has been changed by force commit.
1498dnl
1499AT_CHECK([ovs-appctl dpctl/dump-conntrack | grep "orig=.src=10\.1\.1\.2,"], [], [dnl
1500udp,orig=(src=10.1.1.2,dst=10.1.1.1,sport=2,dport=1),reply=(src=10.1.1.1,dst=10.1.1.2,sport=1,dport=2)
1501])
1502
68c94b1a
JS
1503dnl OK, now send another packet from port 1 and see that it switches again
1504AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000200080000 actions=resubmit(,0)"])
1505AT_CHECK([ovs-appctl revalidator/purge], [0])
1506
1507AT_CHECK([ovs-appctl dpctl/dump-conntrack | grep "orig=.src=10\.1\.1\.1,"], [], [dnl
1508udp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=1,dport=2),reply=(src=10.1.1.2,dst=10.1.1.1,sport=2,dport=1)
1509])
1510
a76a37ef
JR
1511OVS_TRAFFIC_VSWITCHD_STOP
1512AT_CLEANUP
1513
c43a1331
YHW
1514AT_SETUP([conntrack - ct flush by 5-tuple])
1515CHECK_CONNTRACK()
c43a1331
YHW
1516OVS_TRAFFIC_VSWITCHD_START()
1517
1518ADD_NAMESPACES(at_ns0, at_ns1)
1519
1520ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1521ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1522
1523AT_DATA([flows.txt], [dnl
1524priority=1,action=drop
1525priority=10,arp,action=normal
1526priority=100,in_port=1,udp,action=ct(commit),2
1527priority=100,in_port=2,udp,action=ct(zone=5,commit),1
1528priority=100,in_port=1,icmp,action=ct(commit),2
1529priority=100,in_port=2,icmp,action=ct(zone=5,commit),1
1530])
1531
1532AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
1533
1534dnl Test UDP from port 1
1535AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000200080000 actions=resubmit(,0)"])
1536
1537AT_CHECK([ovs-appctl dpctl/dump-conntrack | grep "orig=.src=10\.1\.1\.1,"], [], [dnl
1538udp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=1,dport=2),reply=(src=10.1.1.2,dst=10.1.1.1,sport=2,dport=1)
1539])
1540
1541AT_CHECK([ovs-appctl dpctl/flush-conntrack 'ct_nw_src=10.1.1.2,ct_nw_dst=10.1.1.1,ct_nw_proto=17,ct_tp_src=2,ct_tp_dst=1'])
1542
1543AT_CHECK([ovs-appctl dpctl/dump-conntrack | grep "orig=.src=10\.1\.1\.1,"], [1], [dnl
1544])
1545
1546dnl Test UDP from port 2
1547AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=2 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101020a0101010002000100080000 actions=resubmit(,0)"])
1548
1549AT_CHECK([ovs-appctl dpctl/dump-conntrack | grep "orig=.src=10\.1\.1\.2,"], [0], [dnl
1550udp,orig=(src=10.1.1.2,dst=10.1.1.1,sport=2,dport=1),reply=(src=10.1.1.1,dst=10.1.1.2,sport=1,dport=2),zone=5
1551])
1552
1553AT_CHECK([ovs-appctl dpctl/flush-conntrack zone=5 'ct_nw_src=10.1.1.1,ct_nw_dst=10.1.1.2,ct_nw_proto=17,ct_tp_src=1,ct_tp_dst=2'])
1554
1555AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
1556])
1557
1558dnl Test ICMP traffic
1559NS_CHECK_EXEC([at_ns1], [ping -q -c 3 -i 0.3 -w 2 10.1.1.1 | FORMAT_PING], [0], [dnl
15603 packets transmitted, 3 received, 0% packet loss, time 0ms
1561])
1562
1563AT_CHECK([ovs-appctl dpctl/dump-conntrack | grep "orig=.src=10\.1\.1\.2,"], [0], [stdout])
1564AT_CHECK([cat stdout | FORMAT_CT(10.1.1.1)], [0],[dnl
1565icmp,orig=(src=10.1.1.2,dst=10.1.1.1,id=<cleared>,type=8,code=0),reply=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>,type=0,code=0),zone=5
1566])
1567
1568ICMP_ID=`cat stdout | cut -d ',' -f4 | cut -d '=' -f2`
1569ICMP_TUPLE=ct_nw_src=10.1.1.2,ct_nw_dst=10.1.1.1,ct_nw_proto=1,icmp_id=$ICMP_ID,icmp_type=8,icmp_code=0
1570AT_CHECK([ovs-appctl dpctl/flush-conntrack zone=5 $ICMP_TUPLE])
1571
1572AT_CHECK([ovs-appctl dpctl/dump-conntrack | grep "orig=.src=10\.1\.1\.2,"], [1], [dnl
1573])
1574
ffdcd110 1575OVS_TRAFFIC_VSWITCHD_STOP
c43a1331
YHW
1576AT_CLEANUP
1577
e5cf8cce
DDP
1578AT_SETUP([conntrack - IPv4 ping])
1579CHECK_CONNTRACK()
1580OVS_TRAFFIC_VSWITCHD_START()
1581
1582ADD_NAMESPACES(at_ns0, at_ns1)
1583
1584ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1585ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1586
1587dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
1588AT_DATA([flows.txt], [dnl
1589priority=1,action=drop
1590priority=10,arp,action=normal
1591priority=100,in_port=1,icmp,action=ct(commit),2
1592priority=100,in_port=2,icmp,ct_state=-trk,action=ct(table=0)
1593priority=100,in_port=2,icmp,ct_state=+trk+est,action=1
1594])
1595
1596AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
1597
1598dnl Pings from ns0->ns1 should work fine.
1599NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
16003 packets transmitted, 3 received, 0% packet loss, time 0ms
1601])
1602
1603AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
1604icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>,type=8,code=0),reply=(src=10.1.1.2,dst=10.1.1.1,id=<cleared>,type=0,code=0)
1605])
1606
1607AT_CHECK([ovs-appctl dpctl/flush-conntrack])
1608
1609dnl Pings from ns1->ns0 should fail.
1610NS_CHECK_EXEC([at_ns1], [ping -q -c 3 -i 0.3 -w 2 10.1.1.1 | FORMAT_PING], [0], [dnl
16117 packets transmitted, 0 received, 100% packet loss, time 0ms
1612])
1613
1614OVS_TRAFFIC_VSWITCHD_STOP
1615AT_CLEANUP
1616
26509f88
DB
1617AT_SETUP([conntrack - get_nconns and get/set_maxconns])
1618CHECK_CONNTRACK()
1619CHECK_CT_DPIF_SET_GET_MAXCONNS()
1620CHECK_CT_DPIF_GET_NCONNS()
1621OVS_TRAFFIC_VSWITCHD_START()
1622
1623ADD_NAMESPACES(at_ns0, at_ns1)
1624
1625ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1626ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1627
1628dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
1629AT_DATA([flows.txt], [dnl
1630priority=1,action=drop
1631priority=10,arp,action=normal
1632priority=100,in_port=1,icmp,action=ct(commit),2
1633priority=100,in_port=2,icmp,ct_state=-trk,action=ct(table=0)
1634priority=100,in_port=2,icmp,ct_state=+trk+est,action=1
1635])
1636
1637AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
1638
1639dnl Pings from ns0->ns1 should work fine.
1640NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
16413 packets transmitted, 3 received, 0% packet loss, time 0ms
1642])
1643
1644AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
1645icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>,type=8,code=0),reply=(src=10.1.1.2,dst=10.1.1.1,id=<cleared>,type=0,code=0)
1646])
1647
1648AT_CHECK([ovs-appctl dpctl/ct-set-maxconns one-bad-dp], [2], [], [dnl
1649ovs-vswitchd: maxconns missing or malformed (Invalid argument)
1650ovs-appctl: ovs-vswitchd: server returned an error
1651])
1652
1653AT_CHECK([ovs-appctl dpctl/ct-set-maxconns a], [2], [], [dnl
1654ovs-vswitchd: maxconns missing or malformed (Invalid argument)
1655ovs-appctl: ovs-vswitchd: server returned an error
1656])
1657
1658AT_CHECK([ovs-appctl dpctl/ct-set-maxconns one-bad-dp 10], [2], [], [dnl
ffdcd110 1659ovs-vswitchd: datapath not found (Invalid argument)
26509f88
DB
1660ovs-appctl: ovs-vswitchd: server returned an error
1661])
1662
1663AT_CHECK([ovs-appctl dpctl/ct-get-maxconns one-bad-dp], [2], [], [dnl
ffdcd110 1664ovs-vswitchd: datapath not found (Invalid argument)
26509f88
DB
1665ovs-appctl: ovs-vswitchd: server returned an error
1666])
1667
1668AT_CHECK([ovs-appctl dpctl/ct-get-nconns one-bad-dp], [2], [], [dnl
ffdcd110 1669ovs-vswitchd: datapath not found (Invalid argument)
26509f88
DB
1670ovs-appctl: ovs-vswitchd: server returned an error
1671])
1672
1673AT_CHECK([ovs-appctl dpctl/ct-get-nconns], [], [dnl
16741
1675])
1676
1677AT_CHECK([ovs-appctl dpctl/ct-get-maxconns], [], [dnl
16783000000
1679])
1680
1681AT_CHECK([ovs-appctl dpctl/ct-set-maxconns 10], [], [dnl
1682setting maxconns successful
1683])
1684
1685AT_CHECK([ovs-appctl dpctl/ct-get-maxconns], [], [dnl
168610
1687])
1688
1689AT_CHECK([ovs-appctl dpctl/flush-conntrack])
1690
1691AT_CHECK([ovs-appctl dpctl/ct-get-nconns], [], [dnl
16920
1693])
1694
1695AT_CHECK([ovs-appctl dpctl/ct-get-maxconns], [], [dnl
169610
1697])
1698
ffdcd110 1699OVS_TRAFFIC_VSWITCHD_STOP
26509f88
DB
1700AT_CLEANUP
1701
e5cf8cce
DDP
1702AT_SETUP([conntrack - IPv6 ping])
1703CHECK_CONNTRACK()
1704OVS_TRAFFIC_VSWITCHD_START()
1705
1706ADD_NAMESPACES(at_ns0, at_ns1)
1707
1708ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
1709ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
1710
1711AT_DATA([flows.txt], [dnl
1712
1713dnl ICMPv6 echo request and reply go to table 1. The rest of the traffic goes
1714dnl through normal action.
1715table=0,priority=10,icmp6,icmp_type=128,action=goto_table:1
1716table=0,priority=10,icmp6,icmp_type=129,action=goto_table:1
1717table=0,priority=1,action=normal
1718
1719dnl Allow everything from ns0->ns1. Only allow return traffic from ns1->ns0.
1720table=1,priority=100,in_port=1,icmp6,action=ct(commit),2
1721table=1,priority=100,in_port=2,icmp6,ct_state=-trk,action=ct(table=0)
1722table=1,priority=100,in_port=2,icmp6,ct_state=+trk+est,action=1
1723table=1,priority=1,action=drop
1724])
1725
1726AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
1727
1728OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
1729
027f7e84
DDP
1730dnl The above ping creates state in the connection tracker. We're not
1731dnl interested in that state.
1732AT_CHECK([ovs-appctl dpctl/flush-conntrack])
1733
e5cf8cce
DDP
1734dnl Pings from ns1->ns0 should fail.
1735NS_CHECK_EXEC([at_ns1], [ping6 -q -c 3 -i 0.3 -w 2 fc00::1 | FORMAT_PING], [0], [dnl
17367 packets transmitted, 0 received, 100% packet loss, time 0ms
1737])
1738
1739dnl Pings from ns0->ns1 should work fine.
1740NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
17413 packets transmitted, 3 received, 0% packet loss, time 0ms
1742])
1743
1744AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
1745icmpv6,orig=(src=fc00::1,dst=fc00::2,id=<cleared>,type=128,code=0),reply=(src=fc00::2,dst=fc00::1,id=<cleared>,type=129,code=0)
1746])
1747
1748OVS_TRAFFIC_VSWITCHD_STOP
1749AT_CLEANUP
1750
07659514
JS
1751AT_SETUP([conntrack - preserve registers])
1752CHECK_CONNTRACK()
cf7659b6 1753OVS_TRAFFIC_VSWITCHD_START()
07659514
JS
1754
1755ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
1756
1757ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1758ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1759ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24")
1760ADD_VETH(p3, at_ns3, br0, "10.1.1.4/24")
1761
1762dnl Allow any traffic from ns0->ns1, ns2->ns3.
1763AT_DATA([flows.txt], [dnl
1764priority=1,action=drop
1765priority=10,arp,action=normal
1766priority=10,icmp,action=normal
1767priority=100,in_port=1,tcp,ct_state=-trk,action=ct(commit,table=0)
1768priority=100,in_port=1,tcp,ct_state=+trk,action=2
1769priority=100,in_port=2,tcp,ct_state=-trk,action=ct(table=0)
1770priority=100,in_port=2,tcp,ct_state=+trk,action=1
1771priority=100,in_port=3,tcp,ct_state=-trk,action=load:0->NXM_NX_REG0[[]],ct(table=0)
1772priority=100,in_port=3,tcp,ct_state=+trk,reg0=0,action=load:1->NXM_NX_REG0[[]],ct(commit,table=0)
1773priority=100,in_port=3,tcp,ct_state=+trk,reg0=1,action=4
1774priority=100,in_port=4,tcp,ct_state=-trk,action=ct(commit,table=0)
1775priority=100,in_port=4,tcp,ct_state=+trk,action=3
1776])
1777
6cfa8ec3 1778AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
07659514 1779
7ed40afe
JS
1780OVS_START_L7([at_ns1], [http])
1781OVS_START_L7([at_ns3], [http])
1782
07659514 1783dnl HTTP requests from p0->p1 should work fine.
07659514
JS
1784NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
1785
1786dnl HTTP requests from p2->p3 should work fine.
07659514
JS
1787NS_CHECK_EXEC([at_ns2], [wget 10.1.1.4 -t 3 -T 1 --retry-connrefused -v -o wget1.log])
1788
1789OVS_TRAFFIC_VSWITCHD_STOP
1790AT_CLEANUP
1791
1792AT_SETUP([conntrack - invalid])
1793CHECK_CONNTRACK()
cf7659b6 1794OVS_TRAFFIC_VSWITCHD_START()
07659514
JS
1795
1796ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
1797
1798ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1799ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1800ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24")
1801ADD_VETH(p3, at_ns3, br0, "10.1.1.4/24")
1802
1803dnl Pass traffic from ns0->ns1 without committing, but attempt to track in
1804dnl the opposite direction. This should fail.
1805dnl Pass traffic from ns3->ns4 without committing, and this time match
1806dnl invalid traffic and allow it through.
1807AT_DATA([flows.txt], [dnl
1808priority=1,action=drop
1809priority=10,arp,action=normal
1810priority=10,icmp,action=normal
1811priority=100,in_port=1,tcp,action=ct(),2
1812priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=0)
1813priority=100,in_port=2,ct_state=+trk+new,tcp,action=1
1814priority=100,in_port=3,tcp,action=ct(),4
1815priority=100,in_port=4,ct_state=-trk,tcp,action=ct(table=0)
1816priority=100,in_port=4,ct_state=+trk+inv,tcp,action=3
1817priority=100,in_port=4,ct_state=+trk+new,tcp,action=3
1818])
1819
6cfa8ec3 1820AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
07659514
JS
1821
1822dnl We set up our rules to allow the request without committing. The return
1823dnl traffic can't be identified, because the initial request wasn't committed.
1824dnl For the first pair of ports, this means that the connection fails.
7ed40afe
JS
1825OVS_START_L7([at_ns1], [http])
1826OVS_START_L7([at_ns3], [http])
07659514
JS
1827NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log], [4])
1828
1829dnl For the second pair, we allow packets from invalid connections, so it works.
07659514
JS
1830NS_CHECK_EXEC([at_ns2], [wget 10.1.1.4 -t 3 -T 1 --retry-connrefused -v -o wget1.log])
1831
1832OVS_TRAFFIC_VSWITCHD_STOP
1833AT_CLEANUP
1834
1835AT_SETUP([conntrack - zones])
1836CHECK_CONNTRACK()
cf7659b6 1837OVS_TRAFFIC_VSWITCHD_START()
07659514
JS
1838
1839ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
1840
1841ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1842ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1843ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24")
1844ADD_VETH(p3, at_ns3, br0, "10.1.1.4/24")
1845
1846dnl Allow any traffic from ns0->ns1. Allow return traffic, matching on zone.
1847dnl For ns2->ns3, use a different zone and see that the match fails.
1848AT_DATA([flows.txt], [dnl
1849priority=1,action=drop
1850priority=10,arp,action=normal
1851priority=10,icmp,action=normal
1852priority=100,in_port=1,tcp,action=ct(commit,zone=1),2
1853priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=0,zone=1)
1854priority=100,in_port=2,ct_state=+trk,ct_zone=1,tcp,action=1
1855priority=100,in_port=3,tcp,action=ct(commit,zone=2),4
1856priority=100,in_port=4,ct_state=-trk,tcp,action=ct(table=0,zone=2)
1857priority=100,in_port=4,ct_state=+trk,ct_zone=1,tcp,action=3
1858])
1859
6cfa8ec3 1860AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
07659514 1861
7ed40afe
JS
1862OVS_START_L7([at_ns1], [http])
1863OVS_START_L7([at_ns3], [http])
1864
07659514 1865dnl HTTP requests from p0->p1 should work fine.
07659514
JS
1866NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
1867
ec3aa16c 1868AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
420c73b2 1869tcp,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
1870])
1871
1872dnl HTTP requests from p2->p3 should fail due to network failure.
1873dnl Try 3 times, in 1 second intervals.
07659514
JS
1874NS_CHECK_EXEC([at_ns2], [wget 10.1.1.4 -t 3 -T 1 -v -o wget1.log], [4])
1875
ec3aa16c 1876AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.4)], [0], [dnl
420c73b2 1877tcp,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
1878])
1879
1880OVS_TRAFFIC_VSWITCHD_STOP
1881AT_CLEANUP
1882
1883AT_SETUP([conntrack - zones from field])
1884CHECK_CONNTRACK()
cf7659b6 1885OVS_TRAFFIC_VSWITCHD_START()
07659514
JS
1886
1887ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
1888
1889ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1890ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1891ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24")
1892ADD_VETH(p3, at_ns3, br0, "10.1.1.4/24")
1893
1894dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
1895AT_DATA([flows.txt], [dnl
1896priority=1,action=drop
1897priority=10,arp,action=normal
1898priority=10,icmp,action=normal
1899priority=100,in_port=1,tcp,action=load:0x1001->NXM_NX_REG0[[0..15]],ct(commit,zone=NXM_NX_REG0[[0..15]]),2
1900priority=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]])
1901priority=100,in_port=2,ct_state=+trk,ct_zone=0x1001,tcp,action=1
1902priority=100,in_port=3,tcp,action=load:0x1002->NXM_NX_REG0[[0..15]],ct(commit,zone=NXM_NX_REG0[[0..15]]),4
1903priority=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]])
1904priority=100,in_port=4,ct_state=+trk,ct_zone=0x1001,tcp,action=3
1905])
1906
6cfa8ec3 1907AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
07659514 1908
7ed40afe
JS
1909OVS_START_L7([at_ns1], [http])
1910OVS_START_L7([at_ns3], [http])
1911
07659514 1912dnl HTTP requests from p0->p1 should work fine.
07659514
JS
1913NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
1914
ec3aa16c 1915AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
420c73b2 1916tcp,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
1917])
1918
1919dnl HTTP requests from p2->p3 should fail due to network failure.
1920dnl Try 3 times, in 1 second intervals.
07659514
JS
1921NS_CHECK_EXEC([at_ns2], [wget 10.1.1.4 -t 3 -T 1 -v -o wget1.log], [4])
1922
ec3aa16c 1923AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.4)], [0], [dnl
420c73b2 1924tcp,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
1925])
1926
1927OVS_TRAFFIC_VSWITCHD_STOP
1928AT_CLEANUP
1929
1930AT_SETUP([conntrack - multiple bridges])
1931CHECK_CONNTRACK()
1932OVS_TRAFFIC_VSWITCHD_START(
cf7659b6 1933 [_ADD_BR([br1]) --\
07659514
JS
1934 add-port br0 patch+ -- set int patch+ type=patch options:peer=patch- --\
1935 add-port br1 patch- -- set int patch- type=patch options:peer=patch+ --])
1936
1937ADD_NAMESPACES(at_ns0, at_ns1)
1938
1939ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1940ADD_VETH(p1, at_ns1, br1, "10.1.1.2/24")
1941
1942dnl Allow any traffic from ns0->br1, allow established in reverse.
1943AT_DATA([flows-br0.txt], [dnl
1944priority=1,action=drop
1945priority=10,arp,action=normal
1946priority=10,icmp,action=normal
1947priority=100,in_port=2,tcp,ct_state=-trk,action=ct(commit,zone=1),1
1948priority=100,in_port=1,tcp,ct_state=-trk,action=ct(table=0,zone=1)
1949priority=100,in_port=1,tcp,ct_state=+trk+est,ct_zone=1,action=2
1950])
1951
1952dnl Allow any traffic from br0->ns1, allow established in reverse.
1953AT_DATA([flows-br1.txt], [dnl
1954priority=1,action=drop
1955priority=10,arp,action=normal
1956priority=10,icmp,action=normal
1957priority=100,in_port=1,tcp,ct_state=-trk,action=ct(table=0,zone=2)
1958priority=100,in_port=1,tcp,ct_state=+trk+new,ct_zone=2,action=ct(commit,zone=2),2
1959priority=100,in_port=1,tcp,ct_state=+trk+est,ct_zone=2,action=2
1960priority=100,in_port=2,tcp,ct_state=-trk,action=ct(table=0,zone=2)
1961priority=100,in_port=2,tcp,ct_state=+trk+est,ct_zone=2,action=ct(commit,zone=2),1
1962])
1963
6cfa8ec3
JR
1964AT_CHECK([ovs-ofctl --bundle add-flows br0 flows-br0.txt])
1965AT_CHECK([ovs-ofctl --bundle add-flows br1 flows-br1.txt])
07659514
JS
1966
1967dnl HTTP requests from p0->p1 should work fine.
7ed40afe 1968OVS_START_L7([at_ns1], [http])
07659514
JS
1969NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
1970
1971OVS_TRAFFIC_VSWITCHD_STOP
1972AT_CLEANUP
1973
1974AT_SETUP([conntrack - multiple zones])
1975CHECK_CONNTRACK()
cf7659b6 1976OVS_TRAFFIC_VSWITCHD_START()
07659514
JS
1977
1978ADD_NAMESPACES(at_ns0, at_ns1)
1979
1980ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
1981ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
1982
1983dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
1984AT_DATA([flows.txt], [dnl
1985priority=1,action=drop
1986priority=10,arp,action=normal
1987priority=10,icmp,action=normal
1988priority=100,in_port=1,tcp,action=ct(commit,zone=1),ct(commit,zone=2),2
1989priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=0,zone=2)
1990priority=100,in_port=2,ct_state=+trk,ct_zone=2,tcp,action=1
1991])
1992
6cfa8ec3 1993AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
07659514 1994
7ed40afe
JS
1995OVS_START_L7([at_ns1], [http])
1996
07659514 1997dnl HTTP requests from p0->p1 should work fine.
07659514
JS
1998NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
1999
2000dnl (again) HTTP requests from p0->p1 should work fine.
2001NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
2002
ec3aa16c 2003AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
420c73b2
JR
2004tcp,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>)
2005tcp,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
2006])
2007
2008OVS_TRAFFIC_VSWITCHD_STOP
2009AT_CLEANUP
2010
0e27c629
JS
2011AT_SETUP([conntrack - multiple namespaces, internal ports])
2012CHECK_CONNTRACK()
4573c42e 2013CHECK_CONNTRACK_LOCAL_STACK()
0e27c629
JS
2014OVS_TRAFFIC_VSWITCHD_START(
2015 [set-fail-mode br0 secure -- ])
2016
2017ADD_NAMESPACES(at_ns0, at_ns1)
2018
2019ADD_INT(p0, at_ns0, br0, "10.1.1.1/24")
2020ADD_INT(p1, at_ns1, br0, "10.1.1.2/24")
2021
2022dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
2023dnl
2024dnl If skb->nfct is leaking from inside the namespace, this test will fail.
2025AT_DATA([flows.txt], [dnl
2026priority=1,action=drop
2027priority=10,arp,action=normal
2028priority=10,icmp,action=normal
2029priority=100,in_port=1,tcp,ct_state=-trk,action=ct(commit,zone=1),2
2030priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=0,zone=1)
2031priority=100,in_port=2,ct_state=+trk,ct_zone=1,tcp,action=1
2032])
2033
2034AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
2035
7ed40afe
JS
2036OVS_START_L7([at_ns1], [http])
2037
0e27c629 2038dnl HTTP requests from p0->p1 should work fine.
0e27c629
JS
2039NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
2040
2041dnl (again) HTTP requests from p0->p1 should work fine.
2042NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
2043
ec3aa16c 2044AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
420c73b2 2045tcp,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
2046])
2047
2048OVS_TRAFFIC_VSWITCHD_STOP(["dnl
2049/ioctl(SIOCGIFINDEX) on .* device failed: No such device/d
2050/removing policing failed: No such device/d"])
2051AT_CLEANUP
2052
8e53fe8c
JS
2053AT_SETUP([conntrack - ct_mark])
2054CHECK_CONNTRACK()
cf7659b6 2055OVS_TRAFFIC_VSWITCHD_START()
8e53fe8c
JS
2056
2057ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
2058
2059ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2060ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2061ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24")
2062ADD_VETH(p3, at_ns3, br0, "10.1.1.4/24")
2063
2064dnl Allow traffic between ns0<->ns1 using the ct_mark.
2065dnl Check that different marks do not match for traffic between ns2<->ns3.
2066AT_DATA([flows.txt], [dnl
2067priority=1,action=drop
2068priority=10,arp,action=normal
2069priority=10,icmp,action=normal
2070priority=100,in_port=1,tcp,action=ct(commit,exec(set_field:1->ct_mark)),2
2071priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=0)
2072priority=100,in_port=2,ct_state=+trk,ct_mark=1,tcp,action=1
2073priority=100,in_port=3,tcp,action=ct(commit,exec(set_field:2->ct_mark)),4
2074priority=100,in_port=4,ct_state=-trk,tcp,action=ct(table=0)
2075priority=100,in_port=4,ct_state=+trk,ct_mark=1,tcp,action=3
2076])
2077
6cfa8ec3 2078AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
8e53fe8c 2079
7ed40afe
JS
2080OVS_START_L7([at_ns1], [http])
2081OVS_START_L7([at_ns3], [http])
2082
8e53fe8c 2083dnl HTTP requests from p0->p1 should work fine.
8e53fe8c 2084NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
420c73b2
JR
2085AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
2086tcp,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
2087])
2088
2089dnl HTTP requests from p2->p3 should fail due to network failure.
2090dnl Try 3 times, in 1 second intervals.
8e53fe8c 2091NS_CHECK_EXEC([at_ns2], [wget 10.1.1.4 -t 3 -T 1 -v -o wget1.log], [4])
ec3aa16c 2092AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.4)], [0], [dnl
420c73b2 2093tcp,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
2094])
2095
2096OVS_TRAFFIC_VSWITCHD_STOP
2097AT_CLEANUP
2098
4d182934
JS
2099AT_SETUP([conntrack - ct_mark bit-fiddling])
2100CHECK_CONNTRACK()
2101OVS_TRAFFIC_VSWITCHD_START()
2102
2103ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
2104
2105ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2106ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2107
2108dnl Allow traffic between ns0<->ns1 using the ct_mark. Return traffic should
2109dnl cause an additional bit to be set in the connection (and be allowed).
2110AT_DATA([flows.txt], [dnl
2111table=0,priority=1,action=drop
2112table=0,priority=10,arp,action=normal
2113table=0,priority=10,icmp,action=normal
2114table=0,priority=100,in_port=1,tcp,action=ct(table=1)
2115table=0,priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=1,commit,exec(set_field:0x2/0x6->ct_mark))
723af132
JS
2116table=1,in_port=1,ct_state=+new,tcp,action=ct(commit,exec(set_field:0x5/0x5->ct_mark)),2
2117table=1,in_port=1,ct_state=-new,tcp,action=2
2118table=1,in_port=2,ct_state=+trk,ct_mark=3,tcp,action=1
4d182934
JS
2119])
2120
2121AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2122
7ed40afe
JS
2123OVS_START_L7([at_ns1], [http])
2124
4d182934 2125dnl HTTP requests from p0->p1 should work fine.
4d182934
JS
2126NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
2127
420c73b2
JR
2128AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
2129tcp,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
2130])
2131
2132OVS_TRAFFIC_VSWITCHD_STOP
2133AT_CLEANUP
2134
8e53fe8c
JS
2135AT_SETUP([conntrack - ct_mark from register])
2136CHECK_CONNTRACK()
cf7659b6 2137OVS_TRAFFIC_VSWITCHD_START()
8e53fe8c
JS
2138
2139ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
2140
2141ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2142ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2143ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24")
2144ADD_VETH(p3, at_ns3, br0, "10.1.1.4/24")
2145
2146dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
2147AT_DATA([flows.txt], [dnl
2148priority=1,action=drop
2149priority=10,arp,action=normal
2150priority=10,icmp,action=normal
2151priority=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
2152priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=0)
2153priority=100,in_port=2,ct_state=+trk,ct_mark=1,tcp,action=1
2154priority=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
2155priority=100,in_port=4,ct_state=-trk,tcp,action=ct(table=0)
2156priority=100,in_port=4,ct_state=+trk,ct_mark=1,tcp,action=3
2157])
2158
6cfa8ec3 2159AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
8e53fe8c 2160
7ed40afe
JS
2161OVS_START_L7([at_ns1], [http])
2162OVS_START_L7([at_ns3], [http])
2163
8e53fe8c 2164dnl HTTP requests from p0->p1 should work fine.
8e53fe8c 2165NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
420c73b2
JR
2166AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
2167tcp,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
2168])
2169
2170dnl HTTP requests from p2->p3 should fail due to network failure.
2171dnl Try 3 times, in 1 second intervals.
8e53fe8c 2172NS_CHECK_EXEC([at_ns2], [wget 10.1.1.4 -t 3 -T 1 -v -o wget1.log], [4])
ec3aa16c 2173AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.4)], [0], [dnl
420c73b2 2174tcp,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
2175])
2176
2177OVS_TRAFFIC_VSWITCHD_STOP
2178AT_CLEANUP
2179
9daf2348
JS
2180AT_SETUP([conntrack - ct_label])
2181CHECK_CONNTRACK()
cf7659b6 2182OVS_TRAFFIC_VSWITCHD_START()
9daf2348
JS
2183
2184ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
2185
2186ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2187ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2188ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24")
2189ADD_VETH(p3, at_ns3, br0, "10.1.1.4/24")
2190
2191dnl Allow traffic between ns0<->ns1 using the ct_label.
2192dnl Check that different labels do not match for traffic between ns2<->ns3.
2193AT_DATA([flows.txt], [dnl
2194priority=1,action=drop
2195priority=10,arp,action=normal
2196priority=10,icmp,action=normal
2197priority=100,in_port=1,tcp,action=ct(commit,exec(set_field:0x0a000d000005000001->ct_label)),2
2198priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=0)
2199priority=100,in_port=2,ct_state=+trk,ct_label=0x0a000d000005000001,tcp,action=1
2200priority=100,in_port=3,tcp,action=ct(commit,exec(set_field:0x2->ct_label)),4
2201priority=100,in_port=4,ct_state=-trk,tcp,action=ct(table=0)
2202priority=100,in_port=4,ct_state=+trk,ct_label=0x0a000d000005000001,tcp,action=3
2203])
2204
6cfa8ec3 2205AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
9daf2348 2206
7ed40afe
JS
2207OVS_START_L7([at_ns1], [http])
2208OVS_START_L7([at_ns3], [http])
2209
9daf2348 2210dnl HTTP requests from p0->p1 should work fine.
9daf2348
JS
2211NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
2212
2213dnl HTTP requests from p2->p3 should fail due to network failure.
2214dnl Try 3 times, in 1 second intervals.
9daf2348
JS
2215NS_CHECK_EXEC([at_ns2], [wget 10.1.1.4 -t 3 -T 1 -v -o wget1.log], [4])
2216
2217OVS_TRAFFIC_VSWITCHD_STOP
2218AT_CLEANUP
2219
4d182934
JS
2220AT_SETUP([conntrack - ct_label bit-fiddling])
2221CHECK_CONNTRACK()
2222OVS_TRAFFIC_VSWITCHD_START()
2223
2224ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
2225
2226ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2227ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2228
2229dnl Allow traffic between ns0<->ns1 using the ct_labels. Return traffic should
2230dnl cause an additional bit to be set in the connection labels (and be allowed)
2231AT_DATA([flows.txt], [dnl
2232table=0,priority=1,action=drop
2233table=0,priority=10,arp,action=normal
2234table=0,priority=10,icmp,action=normal
2235table=0,priority=100,in_port=1,tcp,action=ct(table=1)
2236table=0,priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=1,commit,exec(set_field:0x200000000/0x200000004->ct_label))
723af132
JS
2237table=1,in_port=1,tcp,ct_state=+new,action=ct(commit,exec(set_field:0x5/0x5->ct_label)),2
2238table=1,in_port=1,tcp,ct_state=-new,action=2
2239table=1,in_port=2,ct_state=+trk,ct_label=0x200000001,tcp,action=1
4d182934
JS
2240])
2241
2242AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2243
7ed40afe
JS
2244OVS_START_L7([at_ns1], [http])
2245
4d182934 2246dnl HTTP requests from p0->p1 should work fine.
4d182934
JS
2247NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
2248
420c73b2
JR
2249AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
2250tcp,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
2251])
2252
2253OVS_TRAFFIC_VSWITCHD_STOP
2254AT_CLEANUP
2255
f2d105b5
JS
2256AT_SETUP([conntrack - ct metadata, multiple zones])
2257CHECK_CONNTRACK()
2258OVS_TRAFFIC_VSWITCHD_START()
2259
2260ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
2261
2262ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2263ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2264
2265dnl Allow traffic between ns0<->ns1 using the ct_mark and ct_labels in zone=1,
2266dnl but do *not* set any of these for the ct() in zone=2. Traffic should pass,
2267dnl and we should see that the conntrack entries only apply the ct_mark and
2268dnl ct_labels to the connection in zone=1.
2269AT_DATA([flows.txt], [dnl
2270table=0,priority=1,action=drop
2271table=0,priority=10,arp,action=normal
2272table=0,priority=10,icmp,action=normal
2273table=0,priority=100,in_port=1,tcp,action=ct(zone=1,table=1)
2274table=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))
723af132
JS
2275table=1,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
2276table=1,in_port=1,tcp,ct_state=-new,action=ct(zone=2),2
2277table=1,in_port=2,tcp,action=ct(zone=2),1
f2d105b5
JS
2278])
2279
2280AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2281
7ed40afe
JS
2282OVS_START_L7([at_ns1], [http])
2283
f2d105b5 2284dnl HTTP requests from p0->p1 should work fine.
f2d105b5
JS
2285NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
2286
420c73b2
JR
2287AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
2288tcp,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>)
2289tcp,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
2290])
2291
2292OVS_TRAFFIC_VSWITCHD_STOP
2293AT_CLEANUP
2294
a867c010
YHW
2295AT_SETUP([conntrack - new connections])
2296CHECK_CONNTRACK()
2297OVS_TRAFFIC_VSWITCHD_START()
2298
2299ADD_NAMESPACES(at_ns0, at_ns1)
2300
2301ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2302ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2303
2304AT_DATA([flows1.txt], [dnl
2305table=0, priority=1,action=drop
2306table=0, priority=10,arp,action=normal
2307table=0, priority=100,tcp,action=ct(table=1)
2308table=0, priority=100,udp,action=ct(table=1)
2309table=1, priority=100,in_port=1,tcp,ct_state=+trk+new,action=ct(commit)
2310table=1, priority=100,in_port=1,udp,ct_state=+trk+new,action=ct(commit)
2311table=1, priority=100,in_port=1,ct_state=+trk+est,action=2
2312table=1, priority=100,in_port=2,ct_state=+trk+est,action=1
2313])
2314
2315ovs-appctl vlog/set dbg
2316
2317AT_CHECK([ovs-ofctl --bundle add-flows br0 flows1.txt])
2318
2319dnl TCP traffic from ns0 to ns1 should fail.
2320OVS_START_L7([at_ns1], [http])
2321NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log], [4])
2322
2323dnl Send UDP packet on port 1 twice.
2324AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000200080000 actions=resubmit(,0)"])
2325AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000200080000 actions=resubmit(,0)"])
2326
2327dnl There should not be any packet that matches the established ct_state.
2328AT_CHECK([ovs-ofctl dump-flows br0 "table=1 in_port=1,ct_state=+trk+est" | ofctl_strip], [0], [dnl
2329NXST_FLOW reply:
2330 table=1, priority=100,ct_state=+est+trk,in_port=1 actions=output:2
2331])
2332
2333OVS_TRAFFIC_VSWITCHD_STOP
a27d70a8
EC
2334AT_CLEANUP
2335
2336AT_SETUP([conntrack - generic IP protocol])
2337CHECK_CONNTRACK()
2338OVS_TRAFFIC_VSWITCHD_START()
2339AT_CHECK([ovs-appctl vlog/set dpif:dbg dpif_netdev:dbg ofproto_dpif_upcall:dbg])
2340
2341ADD_NAMESPACES(at_ns0, at_ns1)
2342
2343ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2344ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2345
2346AT_DATA([flows.txt], [dnl
2347table=0, priority=1,action=drop
2348table=0, priority=10,arp,action=normal
2349table=0, priority=100,ip,action=ct(table=1)
2350table=1, priority=100,in_port=1,ip,ct_state=+trk+new,action=ct(commit)
2351table=1, priority=100,in_port=1,ct_state=+trk+est,action=normal
2352])
2353
2354AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2355
2356AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=01005e00001200005e000101080045c0002800000000ff7019cdc0a8001ee0000012210164010001ba52c0a800010000000000000000000000000000 actions=resubmit(,0)"])
2357
2358AT_CHECK([ovs-appctl dpctl/dump-conntrack | grep "orig=.src=192\.168\.0\.30,"], [], [dnl
2359112,orig=(src=192.168.0.30,dst=224.0.0.18,sport=0,dport=0),reply=(src=224.0.0.18,dst=192.168.0.30,sport=0,dport=0)
2360])
2361
2362OVS_TRAFFIC_VSWITCHD_STOP
a867c010
YHW
2363AT_CLEANUP
2364
8e53fe8c 2365AT_SETUP([conntrack - ICMP related])
9c1ab985 2366AT_SKIP_IF([test $HAVE_NC = no])
8e53fe8c 2367CHECK_CONNTRACK()
cf7659b6 2368OVS_TRAFFIC_VSWITCHD_START()
8e53fe8c
JS
2369
2370ADD_NAMESPACES(at_ns0, at_ns1)
2371
2372ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2373ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2374
2375dnl Allow UDP traffic from ns0->ns1. Only allow related ICMP responses back.
2376AT_DATA([flows.txt], [dnl
2377priority=1,action=drop
2378priority=10,arp,action=normal
2379priority=100,in_port=1,udp,action=ct(commit,exec(set_field:1->ct_mark)),2
2380priority=100,in_port=2,icmp,ct_state=-trk,action=ct(table=0)
2381priority=100,in_port=2,icmp,ct_state=+trk+rel,ct_mark=1,action=1
2382])
2383
6cfa8ec3 2384AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
8e53fe8c 2385
bde2e7b5 2386dnl UDP packets from ns0->ns1 should solicit "destination unreachable" response.
b54971f7 2387NS_CHECK_EXEC([at_ns0], [bash -c "echo a | nc $NC_EOF_OPT -u 10.1.1.2 10000"])
8e53fe8c
JS
2388
2389AT_CHECK([ovs-appctl revalidator/purge], [0])
2390AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort | grep -v drop], [0], [dnl
2391 n_packets=1, n_bytes=44, priority=100,udp,in_port=1 actions=ct(commit,exec(load:0x1->NXM_NX_CT_MARK[[]])),output:2
2392 n_packets=1, n_bytes=72, priority=100,ct_state=+rel+trk,ct_mark=0x1,icmp,in_port=2 actions=output:1
2393 n_packets=1, n_bytes=72, priority=100,ct_state=-trk,icmp,in_port=2 actions=ct(table=0)
bde2e7b5 2394 n_packets=2, n_bytes=84, priority=10,arp actions=NORMAL
8e53fe8c
JS
2395NXST_FLOW reply:
2396])
2397
2398OVS_TRAFFIC_VSWITCHD_STOP
2399AT_CLEANUP
2400
d0e42062
JR
2401AT_SETUP([conntrack - ICMP related to original direction])
2402AT_SKIP_IF([test $HAVE_NC = no])
2403CHECK_CONNTRACK()
2404OVS_TRAFFIC_VSWITCHD_START()
2405
2406ADD_NAMESPACES(at_ns0, at_ns1)
2407
2408ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2409ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2410
2411dnl Allow UDP traffic from ns0->ns1. Only allow related ICMP responses back.
2412AT_DATA([flows.txt], [dnl
2413priority=1000,arp,action=normal
2414priority=100,ip,action=ct(table=1)
2415priority=1,action=drop
2416table=1,ip,action=ct(zone=34673,table=2)
2417table=2,in_port=2,udp,action=ct(commit,zone=34673),1
2418table=2,in_port=1,udp,action=ct(commit,zone=34673),2
2419table=2,in_port=2,ct_state=+rel,icmp,action=1
2420])
2421
2422AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2423
2424dnl 1. Send and UDP packet to port 53 (src=192.100.1.8,dst=192.100.2.5)
2425AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 2 resubmit\(,0\) '00010200020400232211223308004500001c000100004011f6fac0640108c06402050035003500087b9e'])
2426
2427dnl 2. Send and UDP packet to port 53 (src=192.100.2.5,dst=192.100.1.8)
2428AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 1 resubmit\(,0\) '00232211223300010200020408004500001c000100004011f6fac0640205c06401080035003500087b9e'])
2429
2430dnl 3. Send an ICMP port unreach reply for port 53, related to the 2nd
2431dnl packet, but in the original direction of the conntrack entry created
2432dnl for the 1st packet.
2433AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 2 resubmit\(,0\) '000102000204002322112233080045000038000100003f01f7eec0640108c0640205030a80e5ffffffff4500001c000100003f11f7fac0640205c06401080035003500087b9e'])
2434
2435AT_CHECK([ovs-appctl revalidator/purge], [0])
2436
2437dnl 4. Repeat 3.
2438AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 2 resubmit\(,0\) '000102000204002322112233080045000038000100003f01f7eec0640108c0640205030a80e5ffffffff4500001c000100003f11f7fac0640205c06401080035003500087b9e'])
2439
2440AT_CHECK([ovs-appctl revalidator/purge], [0])
2441
2442AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort | grep -v drop], [0], [dnl
2443 n_packets=4, n_bytes=224, priority=100,ip actions=ct(table=1)
2444 priority=1000,arp actions=NORMAL
2445 table=1, n_packets=4, n_bytes=224, ip actions=ct(table=2,zone=34673)
2446 table=2, n_packets=1, n_bytes=42, udp,in_port=1 actions=ct(commit,zone=34673),output:2
2447 table=2, n_packets=1, n_bytes=42, udp,in_port=2 actions=ct(commit,zone=34673),output:1
2448 table=2, n_packets=2, n_bytes=140, ct_state=+rel,icmp,in_port=2 actions=output:1
2449NXST_FLOW reply:
2450])
2451
2452AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(192.100.1.8)], [0], [dnl
2453udp,orig=(src=192.100.1.8,dst=192.100.2.5,sport=<cleared>,dport=<cleared>),reply=(src=192.100.2.5,dst=192.100.1.8,sport=<cleared>,dport=<cleared>),zone=34673
2454])
2455
2456OVS_TRAFFIC_VSWITCHD_STOP
2457AT_CLEANUP
2458
07659514
JS
2459AT_SETUP([conntrack - ICMP related 2])
2460CHECK_CONNTRACK()
cf7659b6 2461OVS_TRAFFIC_VSWITCHD_START()
07659514
JS
2462
2463ADD_NAMESPACES(at_ns0, at_ns1)
2464
2465ADD_VETH(p0, at_ns0, br0, "172.16.0.1/24")
2466ADD_VETH(p1, at_ns1, br0, "172.16.0.2/24")
2467
2468dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
2469AT_DATA([flows.txt], [dnl
5c2e106b
DDP
2470table=0,ip,action=ct(commit,table=1)
2471table=1,ip,action=controller
07659514
JS
2472])
2473
6cfa8ec3 2474AT_CHECK([ovs-ofctl --bundle replace-flows br0 flows.txt])
07659514
JS
2475
2476AT_CAPTURE_FILE([ofctl_monitor.log])
2477AT_CHECK([ovs-ofctl monitor br0 65534 invalid_ttl --detach --no-chdir --pidfile 2> ofctl_monitor.log])
2478
2479dnl 1. Send an ICMP port unreach reply for port 8738, without any previous request
5c2e106b 2480AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 2 resubmit\(,0\) 'f64c473528c9c6f54ecb72db080045c0003d2e8700004001f351ac100004ac1000030303da490000000045000021317040004011b138ac100003ac10000411112222000d20966369616f0a'])
07659514
JS
2481
2482dnl 2. Send and UDP packet to port 5555
5c2e106b 2483AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 1 resubmit\(,0\) 'c6f94ecb72dbe64c473528c9080045000021317040004011b138ac100001ac100002a28e15b3000d20966369616f0a'])
07659514 2484
a81da080
DB
2485dnl 3. Send an ICMP port unreach reply from a path midpoint for port 5555, related to the first packet
2486AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 2 resubmit\(,0\) 'e64c473528c9c6f94ecb72db080045c0003d2e8700004001f354ac100003ac1000010303553f0000000045000021317040004011b138ac100001ac100002a28e15b3000d20966369616f0a'])
07659514 2487
e8833217
DM
2488OVS_APP_EXIT_AND_WAIT([ovs-ofctl])
2489
07659514 2490dnl Check this output. We only see the latter two packets, not the first.
c2fcc6fc 2491AT_CHECK([cat ofctl_monitor.log | grep -v ff02 | grep -v fe80 | grep -v no_match], [0], [dnl
45e46e92 2492NXT_PACKET_IN2 (xid=0x0): table_id=1 cookie=0x0 total_len=75 ct_state=inv|trk,ip,in_port=2 (via action) data_len=75 (unbuffered)
5c2e106b 2493icmp,vlan_tci=0x0000,dl_src=c6:f5:4e:cb:72:db,dl_dst=f6:4c:47:35:28:c9,nw_src=172.16.0.4,nw_dst=172.16.0.3,nw_tos=192,nw_ecn=0,nw_ttl=64,icmp_type=3,icmp_code=3 icmp_csum:da49
45e46e92 2494NXT_PACKET_IN2 (xid=0x0): table_id=1 cookie=0x0 total_len=47 ct_state=new|trk,ct_nw_src=172.16.0.1,ct_nw_dst=172.16.0.2,ct_nw_proto=17,ct_tp_src=41614,ct_tp_dst=5555,ip,in_port=1 (via action) data_len=47 (unbuffered)
07659514 2495udp,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
45e46e92 2496NXT_PACKET_IN2 (xid=0x0): table_id=1 cookie=0x0 total_len=75 ct_state=rel|rpl|trk,ct_nw_src=172.16.0.1,ct_nw_dst=172.16.0.2,ct_nw_proto=17,ct_tp_src=41614,ct_tp_dst=5555,ip,in_port=2 (via action) data_len=75 (unbuffered)
a81da080 2497icmp,vlan_tci=0x0000,dl_src=c6:f9:4e:cb:72:db,dl_dst=e6:4c:47:35:28:c9,nw_src=172.16.0.3,nw_dst=172.16.0.1,nw_tos=192,nw_ecn=0,nw_ttl=64,icmp_type=3,icmp_code=3 icmp_csum:553f
07659514
JS
2498])
2499
5c2e106b
DDP
2500AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(172.16.0.1)], [0], [dnl
2501udp,orig=(src=172.16.0.1,dst=172.16.0.2,sport=<cleared>,dport=<cleared>),reply=(src=172.16.0.2,dst=172.16.0.1,sport=<cleared>,dport=<cleared>)
2502])
2503
2504AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(172.16.0.3)], [0], [dnl
2505])
2506
07659514
JS
2507OVS_TRAFFIC_VSWITCHD_STOP
2508AT_CLEANUP
d787ad39 2509
daf4d3c1 2510AT_SETUP([conntrack - IPv4 fragmentation])
d787ad39 2511CHECK_CONNTRACK()
cf7659b6 2512OVS_TRAFFIC_VSWITCHD_START()
27130224
AZ
2513
2514ADD_NAMESPACES(at_ns0, at_ns1)
2515
2516ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2517ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2518
2519dnl Sending ping through conntrack
2520AT_DATA([flows.txt], [dnl
2521priority=1,action=drop
2522priority=10,arp,action=normal
2523priority=100,in_port=1,icmp,action=ct(commit,zone=9),2
2524priority=100,in_port=2,ct_state=-trk,icmp,action=ct(table=0,zone=9)
2525priority=100,in_port=2,ct_state=+trk+est-new,icmp,action=1
2526])
2527
6cfa8ec3 2528AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
27130224 2529
4ea96698
DB
2530dnl Modify userspace conntrack fragmentation handling.
2531DPCTL_MODIFY_FRAGMENTATION()
2532
27130224
AZ
2533dnl Ipv4 fragmentation connectivity check.
2534NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
25353 packets transmitted, 3 received, 0% packet loss, time 0ms
2536])
2537
2538dnl Ipv4 larger fragmentation connectivity check.
2539NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
25403 packets transmitted, 3 received, 0% packet loss, time 0ms
2541])
2542
4ea96698
DB
2543dnl Check userspace conntrack fragmentation counters.
2544DPCTL_CHECK_FRAGMENTATION_PASS()
2545
27130224
AZ
2546OVS_TRAFFIC_VSWITCHD_STOP
2547AT_CLEANUP
2548
0cf28088
JS
2549AT_SETUP([conntrack - IPv4 fragmentation expiry])
2550CHECK_CONNTRACK()
2551OVS_TRAFFIC_VSWITCHD_START()
2552
2553ADD_NAMESPACES(at_ns0, at_ns1)
2554
2555ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2556ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2557
2558AT_DATA([flows.txt], [dnl
2559priority=1,action=drop
2560priority=10,arp,action=normal
2561
2562dnl Only allow non-fragmented messages and 1st fragments of each message
2563priority=100,in_port=1,icmp,ip_frag=no,action=ct(commit,zone=9),2
2564priority=100,in_port=1,icmp,ip_frag=firstaction=ct(commit,zone=9),2
2565priority=100,in_port=2,ct_state=-trk,icmp,action=ct(table=0,zone=9)
2566priority=100,in_port=2,ct_state=+trk+est-new,icmp,action=1
2567])
2568
2569AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2570
4ea96698
DB
2571dnl Modify userspace conntrack fragmentation handling.
2572DPCTL_MODIFY_FRAGMENTATION()
2573
0cf28088
JS
2574dnl Ipv4 fragmentation connectivity check.
2575NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 1 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
25767 packets transmitted, 0 received, 100% packet loss, time 0ms
2577])
2578
4ea96698
DB
2579dnl Check userspace conntrack fragmentation counters.
2580DPCTL_CHECK_FRAGMENTATION_FAIL()
2581
0cf28088
JS
2582OVS_TRAFFIC_VSWITCHD_STOP
2583AT_CLEANUP
2584
27130224
AZ
2585AT_SETUP([conntrack - IPv4 fragmentation + vlan])
2586CHECK_CONNTRACK()
cf7659b6 2587OVS_TRAFFIC_VSWITCHD_START()
27130224
AZ
2588
2589ADD_NAMESPACES(at_ns0, at_ns1)
2590
2591ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2592ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2593ADD_VLAN(p0, at_ns0, 100, "10.2.2.1/24")
2594ADD_VLAN(p1, at_ns1, 100, "10.2.2.2/24")
2595
2596dnl Sending ping through conntrack
2597AT_DATA([flows.txt], [dnl
2598priority=1,action=drop
2599priority=10,arp,action=normal
2600priority=100,in_port=1,icmp,action=ct(commit,zone=9),2
2601priority=100,in_port=2,ct_state=-trk,icmp,action=ct(table=0,zone=9)
2602priority=100,in_port=2,ct_state=+trk+est-new,icmp,action=1
2603])
2604
6cfa8ec3 2605AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
27130224 2606
4ea96698
DB
2607dnl Modify userspace conntrack fragmentation handling.
2608DPCTL_MODIFY_FRAGMENTATION()
2609
27130224
AZ
2610dnl Ipv4 fragmentation connectivity check.
2611NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
26123 packets transmitted, 3 received, 0% packet loss, time 0ms
2613])
2614
2615dnl Ipv4 larger fragmentation connectivity check.
2616NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
26173 packets transmitted, 3 received, 0% packet loss, time 0ms
2618])
2619
4ea96698
DB
2620dnl Check userspace conntrack fragmentation counters.
2621DPCTL_CHECK_FRAGMENTATION_PASS()
2622
27130224
AZ
2623OVS_TRAFFIC_VSWITCHD_STOP
2624AT_CLEANUP
2625
2526a3dc
EG
2626AT_SETUP([conntrack - IPv4 fragmentation + cvlan])
2627CHECK_CONNTRACK()
2526a3dc
EG
2628OVS_TRAFFIC_VSWITCHD_START([set Open_vSwitch . other_config:vlan-limit=0])
2629OVS_CHECK_8021AD()
2630
2631ADD_NAMESPACES(at_ns0, at_ns1)
2632
2633ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2634ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2635
2636ADD_SVLAN(p0, at_ns0, 4094, "10.255.2.1/24")
2637ADD_SVLAN(p1, at_ns1, 4094, "10.255.2.2/24")
2638
2639ADD_CVLAN(p0.4094, at_ns0, 100, "10.2.2.1/24")
2640ADD_CVLAN(p1.4094, at_ns1, 100, "10.2.2.2/24")
2641
2642dnl Sending ping through conntrack
2643AT_DATA([flows.txt], [dnl
2644priority=1,action=drop
2645priority=10,arp,action=normal
2646priority=100,in_port=1,icmp,action=ct(commit,zone=9),2
2647priority=100,in_port=2,ct_state=-trk,icmp,action=ct(table=0,zone=9)
2648priority=100,in_port=2,ct_state=+trk+est-new,icmp,action=1
2649])
2650
2651AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2652
2653OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.2.2.2])
2654
2655dnl Ipv4 fragmentation connectivity check.
2656NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
26573 packets transmitted, 3 received, 0% packet loss, time 0ms
2658])
2659
2660dnl Ipv4 fragmentation connectivity check. (outer svlan)
2661NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.255.2.2 | FORMAT_PING], [0], [dnl
26623 packets transmitted, 3 received, 0% packet loss, time 0ms
2663])
2664
2665dnl Ipv4 larger fragmentation connectivity check.
2666NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
26673 packets transmitted, 3 received, 0% packet loss, time 0ms
2668])
2669
2670dnl Ipv4 larger fragmentation connectivity check. (outer svlan)
2671NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.255.2.2 | FORMAT_PING], [0], [dnl
26723 packets transmitted, 3 received, 0% packet loss, time 0ms
2673])
2674
2675OVS_TRAFFIC_VSWITCHD_STOP
2676AT_CLEANUP
2677
e917d3ee
DB
2678AT_SETUP([conntrack - IPv4 fragmentation incomplete reassembled packet])
2679CHECK_CONNTRACK()
2680OVS_TRAFFIC_VSWITCHD_START()
4ea96698
DB
2681DPCTL_SET_MIN_FRAG_SIZE()
2682
e917d3ee
DB
2683
2684ADD_NAMESPACES(at_ns0, at_ns1)
2685
2686ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2687ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2688
2689AT_DATA([bundle.txt], [dnl
2690packet-out in_port=1, packet=50540000000a5054000000090800450001a400012000001183440a0101010a01010200010002000800000304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809, actions=ct(commit)
2691])
2692
2693AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
2694
2695AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
2696])
2697
2698OVS_TRAFFIC_VSWITCHD_STOP
2699AT_CLEANUP
2700
2701dnl Uses same first fragment as above 'incomplete reassembled packet' test.
2702AT_SETUP([conntrack - IPv4 fragmentation with fragments specified])
2703CHECK_CONNTRACK()
e917d3ee 2704OVS_TRAFFIC_VSWITCHD_START()
4ea96698 2705DPCTL_SET_MIN_FRAG_SIZE()
e917d3ee
DB
2706
2707ADD_NAMESPACES(at_ns0, at_ns1)
2708
2709ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2710ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2711
2712AT_DATA([bundle.txt], [dnl
2713packet-out in_port=1, packet=50540000000a5054000000090800450001a400012000001183440a0101010a01010200010002000800000304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809, actions=ct(commit)
2714packet-out in_port=1, packet=50540000000a505400000009080045000030000100320011a4860a0101010a01010200010002000800000010203040506070809000010203040506070809, actions=ct(commit)
2715])
2716
2717AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
2718
2719AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
2720udp,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>)
2721])
2722
2723OVS_TRAFFIC_VSWITCHD_STOP
2724AT_CLEANUP
2725
b21ac618
DB
2726AT_SETUP([conntrack - IPv4 fragmentation out of order])
2727CHECK_CONNTRACK()
b21ac618 2728OVS_TRAFFIC_VSWITCHD_START()
4ea96698 2729DPCTL_SET_MIN_FRAG_SIZE()
b21ac618
DB
2730
2731ADD_NAMESPACES(at_ns0, at_ns1)
2732
2733ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2734ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2735
2736AT_DATA([bundle.txt], [dnl
2737packet-out in_port=1, packet=50540000000a505400000009080045000030000100320011a4860a0101010a01010200010002000800000010203040506070809000010203040506070809, actions=ct(commit)
2738packet-out in_port=1, packet=50540000000a5054000000090800450001a400012000001183440a0101010a01010200010002000800000304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809, actions=ct(commit)
2739])
2740
2741AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
2742
2743AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
2744udp,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>)
2745])
2746
2747OVS_TRAFFIC_VSWITCHD_STOP
2748AT_CLEANUP
2749
2750AT_SETUP([conntrack - IPv4 fragmentation overlapping fragments by 1 octet])
2751CHECK_CONNTRACK()
b21ac618
DB
2752CHECK_CONNTRACK_FRAG_OVERLAP()
2753OVS_TRAFFIC_VSWITCHD_START()
4ea96698 2754DPCTL_SET_MIN_FRAG_SIZE()
b21ac618
DB
2755
2756ADD_NAMESPACES(at_ns0, at_ns1)
2757
2758ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2759ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2760
2761AT_DATA([bundle.txt], [dnl
2762packet-out in_port=1, packet=50540000000a5054000000090800450001a400012000001183440a0101010a01010200010002000800000304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809, actions=ct(commit)
2763packet-out in_port=1, packet=50540000000a505400000009080045000030000100310011a4870a0101010a01010200010002000800000010203040506070809000010203040506070809, actions=ct(commit)
2764])
2765
2766AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
df0ecb2e 2767dnl There is one byte of overlap, hence no packet gets thru. conntrack.
b21ac618
DB
2768AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
2769])
2770
2771OVS_TRAFFIC_VSWITCHD_STOP
2772AT_CLEANUP
2773
2774AT_SETUP([conntrack - IPv4 fragmentation overlapping fragments by 1 octet out of order])
2775CHECK_CONNTRACK()
b21ac618
DB
2776CHECK_CONNTRACK_FRAG_OVERLAP()
2777OVS_TRAFFIC_VSWITCHD_START()
4ea96698 2778DPCTL_SET_MIN_FRAG_SIZE()
b21ac618
DB
2779
2780ADD_NAMESPACES(at_ns0, at_ns1)
2781
2782ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
2783ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
2784
2785AT_DATA([bundle.txt], [dnl
2786packet-out in_port=1, packet=50540000000a505400000009080045000030000100310011a4870a0101010a01010200010002000800000010203040506070809000010203040506070809, actions=ct(commit)
2787packet-out in_port=1, packet=50540000000a5054000000090800450001a400012000001183440a0101010a01010200010002000800000304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809, actions=ct(commit)
2788])
2789
2790AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
df0ecb2e 2791dnl There is one byte of overlap, hence no packet gets thru. conntrack.
b21ac618
DB
2792AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
2793])
2794
2795OVS_TRAFFIC_VSWITCHD_STOP
2796AT_CLEANUP
2797
27130224
AZ
2798AT_SETUP([conntrack - IPv6 fragmentation])
2799CHECK_CONNTRACK()
cf7659b6 2800OVS_TRAFFIC_VSWITCHD_START()
27130224
AZ
2801
2802ADD_NAMESPACES(at_ns0, at_ns1)
2803
2804ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
2805ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
2806
2807dnl Sending ping through conntrack
2808AT_DATA([flows.txt], [dnl
2809priority=1,action=drop
2810priority=10,in_port=1,ipv6,action=ct(commit,zone=9),2
2811priority=10,in_port=2,ct_state=-trk,ipv6,action=ct(table=0,zone=9)
2812priority=10,in_port=2,ct_state=+trk+est-new,ipv6,action=1
2813priority=100,icmp6,icmp_type=135,action=normal
2814priority=100,icmp6,icmp_type=136,action=normal
2815])
2816
6cfa8ec3 2817AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
27130224 2818
c10840ff
JS
2819dnl Linux seems to take a little time to get its IPv6 stack in order. Without
2820dnl waiting, we get occasional failures due to the following error:
27130224 2821dnl "connect: Cannot assign requested address"
c10840ff 2822OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
27130224 2823
221a2668 2824dnl Ipv6 fragmentation connectivity check.
27130224
AZ
2825NS_CHECK_EXEC([at_ns0], [ping6 -s 1600 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
28263 packets transmitted, 3 received, 0% packet loss, time 0ms
2827])
2828
221a2668 2829dnl Ipv6 larger fragmentation connectivity check.
27130224
AZ
2830NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
28313 packets transmitted, 3 received, 0% packet loss, time 0ms
2832])
2833
2834OVS_TRAFFIC_VSWITCHD_STOP
2835AT_CLEANUP
2836
0cf28088
JS
2837AT_SETUP([conntrack - IPv6 fragmentation expiry])
2838CHECK_CONNTRACK()
2839OVS_TRAFFIC_VSWITCHD_START()
2840
2841ADD_NAMESPACES(at_ns0, at_ns1)
2842
2843ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
2844ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
2845
2846AT_DATA([flows.txt], [dnl
2847priority=1,action=drop
2848
2849dnl Only allow non-fragmented messages and 1st fragments of each message
2850priority=10,in_port=1,ipv6,ip_frag=first,action=ct(commit,zone=9),2
2851priority=10,in_port=1,ipv6,ip_frag=no,action=ct(commit,zone=9),2
2852priority=10,in_port=2,ct_state=-trk,ipv6,action=ct(table=0,zone=9)
2853priority=10,in_port=2,ct_state=+trk+est-new,ipv6,action=1
2854
2855dnl Neighbour Discovery
2856priority=100,icmp6,icmp_type=135,action=normal
2857priority=100,icmp6,icmp_type=136,action=normal
2858])
2859
2860AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2861
c10840ff
JS
2862dnl Linux seems to take a little time to get its IPv6 stack in order. Without
2863dnl waiting, we get occasional failures due to the following error:
0cf28088 2864dnl "connect: Cannot assign requested address"
c10840ff 2865OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
0cf28088 2866
0cf28088
JS
2867dnl Send an IPv6 fragment. Some time later, it should expire.
2868NS_CHECK_EXEC([at_ns0], [ping6 -s 1600 -q -c 1 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
28697 packets transmitted, 0 received, 100% packet loss, time 0ms
2870])
2871
2872dnl At this point, the kernel will either crash or everything is OK.
2873
2874OVS_TRAFFIC_VSWITCHD_STOP
2875AT_CLEANUP
2876
27130224
AZ
2877AT_SETUP([conntrack - IPv6 fragmentation + vlan])
2878CHECK_CONNTRACK()
cf7659b6 2879OVS_TRAFFIC_VSWITCHD_START()
27130224
AZ
2880
2881ADD_NAMESPACES(at_ns0, at_ns1)
2882
2883ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
2884ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
2885
2886ADD_VLAN(p0, at_ns0, 100, "fc00:1::3/96")
2887ADD_VLAN(p1, at_ns1, 100, "fc00:1::4/96")
2888
2889dnl Sending ping through conntrack
2890AT_DATA([flows.txt], [dnl
2891priority=1,action=drop
2892priority=10,in_port=1,ipv6,action=ct(commit,zone=9),2
2893priority=10,in_port=2,ct_state=-trk,ipv6,action=ct(table=0,zone=9)
2894priority=10,in_port=2,ct_state=+trk+est-new,ipv6,action=1
2895priority=100,icmp6,icmp_type=135,action=normal
2896priority=100,icmp6,icmp_type=136,action=normal
2897])
2898
6cfa8ec3 2899AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
27130224 2900
c10840ff
JS
2901dnl Linux seems to take a little time to get its IPv6 stack in order. Without
2902dnl waiting, we get occasional failures due to the following error:
27130224 2903dnl "connect: Cannot assign requested address"
c10840ff 2904OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
27130224 2905
27130224
AZ
2906dnl Ipv4 fragmentation connectivity check.
2907NS_CHECK_EXEC([at_ns0], [ping6 -s 1600 -q -c 3 -i 0.3 -w 2 fc00:1::4 | FORMAT_PING], [0], [dnl
29083 packets transmitted, 3 received, 0% packet loss, time 0ms
2909])
2910
2911dnl Ipv4 larger fragmentation connectivity check.
2912NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00:1::4 | FORMAT_PING], [0], [dnl
29133 packets transmitted, 3 received, 0% packet loss, time 0ms
2914])
2915
2916OVS_TRAFFIC_VSWITCHD_STOP
2917AT_CLEANUP
2918
2526a3dc
EG
2919AT_SETUP([conntrack - IPv6 fragmentation + cvlan])
2920CHECK_CONNTRACK()
2526a3dc
EG
2921OVS_TRAFFIC_VSWITCHD_START([set Open_vSwitch . other_config:vlan-limit=0])
2922OVS_CHECK_8021AD()
2923
2924ADD_NAMESPACES(at_ns0, at_ns1)
2925
2926ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
2927ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
2928
2929ADD_SVLAN(p0, at_ns0, 4094, "fc00:ffff::3/96")
2930ADD_SVLAN(p1, at_ns1, 4094, "fc00:ffff::4/96")
2931
2932ADD_CVLAN(p0.4094, at_ns0, 100, "fc00:1::3/96")
2933ADD_CVLAN(p1.4094, at_ns1, 100, "fc00:1::4/96")
2934
2935dnl Sending ping through conntrack
2936AT_DATA([flows.txt], [dnl
2937priority=1,action=drop
2938priority=10,in_port=1,ipv6,action=ct(commit,zone=9),2
2939priority=10,in_port=2,ct_state=-trk,ipv6,action=ct(table=0,zone=9)
2940priority=10,in_port=2,ct_state=+trk+est-new,ipv6,action=1
2941priority=100,icmp6,icmp_type=135,action=normal
2942priority=100,icmp6,icmp_type=136,action=normal
2943])
2944
2945AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
2946
2947OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00:1::4])
2948
2949dnl Ipv6 fragmentation connectivity check.
2950NS_CHECK_EXEC([at_ns0], [ping6 -s 1600 -q -c 3 -i 0.3 -w 2 fc00:1::4 | FORMAT_PING], [0], [dnl
29513 packets transmitted, 3 received, 0% packet loss, time 0ms
2952])
2953
2954dnl Ipv6 fragmentation connectivity check. (outer svlan)
2955NS_CHECK_EXEC([at_ns0], [ping6 -s 1600 -q -c 3 -i 0.3 -w 2 fc00:ffff::4 | FORMAT_PING], [0], [dnl
29563 packets transmitted, 3 received, 0% packet loss, time 0ms
2957])
2958
2959dnl Ipv6 larger fragmentation connectivity check.
2960NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00:1::4 | FORMAT_PING], [0], [dnl
29613 packets transmitted, 3 received, 0% packet loss, time 0ms
2962])
2963
2964dnl Ipv6 larger fragmentation connectivity check. (outer svlan)
2965NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00:ffff::4 | FORMAT_PING], [0], [dnl
29663 packets transmitted, 3 received, 0% packet loss, time 0ms
2967])
2968
2969OVS_TRAFFIC_VSWITCHD_STOP
2970AT_CLEANUP
2971
e917d3ee
DB
2972AT_SETUP([conntrack - IPv6 fragmentation incomplete reassembled packet])
2973CHECK_CONNTRACK()
2974OVS_TRAFFIC_VSWITCHD_START()
4ea96698 2975DPCTL_SET_MIN_FRAG_SIZE()
e917d3ee
DB
2976
2977ADD_NAMESPACES(at_ns0, at_ns1)
2978
2979ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
2980ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
2981
2982AT_DATA([bundle.txt], [dnl
df0ecb2e 2983packet-out in_port=1, packet=50540000000a50540000000986dd6000000005002cfffc000000000000000000000000000001fc0000000000000000000000000000021100000100000001000100020008f62900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090010203040506070809001020304050607080900102030405060708090010203040506070809001020304050607080900102030405060708090010203040506070, actions=ct(commit)
e917d3ee
DB
2984])
2985
2986AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
2987
2988AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
2989])
2990
2991OVS_TRAFFIC_VSWITCHD_STOP
2992AT_CLEANUP
2993
2994AT_SETUP([conntrack - IPv6 fragmentation with fragments specified])
2995CHECK_CONNTRACK()
e917d3ee 2996OVS_TRAFFIC_VSWITCHD_START()
4ea96698 2997DPCTL_SET_MIN_FRAG_SIZE()
e917d3ee
DB
2998
2999ADD_NAMESPACES(at_ns0, at_ns1)
3000
3001ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
3002ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
3003
3004AT_DATA([bundle.txt], [dnl
df0ecb2e
YS
3005packet-out in_port=1, packet=50540000000A50540000000986DD6000000005002CFFFC000000000000000000000000000001FC0000000000000000000000000000021100000100000001000100020008267100010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090010203040506070809001020304050607080900102030405060708090010203040506070809001020304050607080900102030405060708090010203040506070, actions=ct(commit)
3006packet-out in_port=1, packet=50540000000A50540000000986DD6000000000242CFFFC000000000000000000000000000001FC000000000000000000000000000002110004F80000000100010002000800000001020304050607080900010203040506070809, actions=ct(commit)
e917d3ee
DB
3007])
3008
3009AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
3010
3011AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
3012udp,orig=(src=fc00::1,dst=fc00::2,sport=<cleared>,dport=<cleared>),reply=(src=fc00::2,dst=fc00::1,sport=<cleared>,dport=<cleared>)
3013])
3014
3015OVS_TRAFFIC_VSWITCHD_STOP
3016AT_CLEANUP
3017
b21ac618
DB
3018AT_SETUP([conntrack - IPv6 fragmentation out of order])
3019CHECK_CONNTRACK()
b21ac618 3020OVS_TRAFFIC_VSWITCHD_START()
4ea96698 3021DPCTL_SET_MIN_FRAG_SIZE()
b21ac618
DB
3022
3023ADD_NAMESPACES(at_ns0, at_ns1)
3024
3025ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
3026ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
3027
3028AT_DATA([bundle.txt], [dnl
df0ecb2e
YS
3029packet-out in_port=1, packet=50540000000A50540000000986DD6000000000242CFFFC000000000000000000000000000001FC000000000000000000000000000002110004F80000000100010002000800000001020304050607080900010203040506070809, actions=ct(commit)
3030packet-out in_port=1, packet=50540000000A50540000000986DD6000000005002CFFFC000000000000000000000000000001FC0000000000000000000000000000021100000100000001000100020008267100010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090010203040506070809001020304050607080900102030405060708090010203040506070809001020304050607080900102030405060708090010203040506070, actions=ct(commit)
b21ac618
DB
3031])
3032
3033AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
3034
3035AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
3036udp,orig=(src=fc00::1,dst=fc00::2,sport=<cleared>,dport=<cleared>),reply=(src=fc00::2,dst=fc00::1,sport=<cleared>,dport=<cleared>)
3037])
3038
3039OVS_TRAFFIC_VSWITCHD_STOP
3040AT_CLEANUP
3041
3042AT_SETUP([conntrack - IPv6 fragmentation, multiple extension headers])
3043CHECK_CONNTRACK()
b21ac618 3044OVS_TRAFFIC_VSWITCHD_START()
4ea96698 3045DPCTL_SET_MIN_FRAG_SIZE()
b21ac618
DB
3046
3047ADD_NAMESPACES(at_ns0, at_ns1)
3048
3049ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
3050ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
3051
3052# Add different extension headers
3053AT_DATA([bundle.txt], [dnl
df0ecb2e
YS
3054packet-out in_port=1, packet=50540000000A50540000000986DD60000000050800FFFC000000000000000000000000000001FC0000000000000000000000000000022C000000000000001100000100000001000100020008267100010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090010203040506070809001020304050607080900102030405060708090010203040506070809001020304050607080900102030405060708090010203040506070, actions=ct(commit)
3055packet-out in_port=1, packet=50540000000a50540000000986dd60000000002c00fffc000000000000000000000000000001fc0000000000000000000000000000022c00000000000000110004f80000000100010002000800000001020304050607080900010203040506070809, actions=ct(commit)
b21ac618
DB
3056])
3057
3058AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
3059
3060AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
3061udp,orig=(src=fc00::1,dst=fc00::2,sport=<cleared>,dport=<cleared>),reply=(src=fc00::2,dst=fc00::1,sport=<cleared>,dport=<cleared>)
3062])
3063
3064OVS_TRAFFIC_VSWITCHD_STOP
3065AT_CLEANUP
3066
3067AT_SETUP([conntrack - IPv6 fragmentation, multiple extension headers + out of order])
3068CHECK_CONNTRACK()
b21ac618 3069OVS_TRAFFIC_VSWITCHD_START()
4ea96698 3070DPCTL_SET_MIN_FRAG_SIZE()
b21ac618
DB
3071
3072ADD_NAMESPACES(at_ns0, at_ns1)
3073
3074ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
3075ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
3076
3077# Add different extension headers
3078AT_DATA([bundle.txt], [dnl
df0ecb2e
YS
3079packet-out in_port=1, packet=50540000000a50540000000986dd60000000002c00fffc000000000000000000000000000001fc0000000000000000000000000000022c00000000000000110004f80000000100010002000800000001020304050607080900010203040506070809, actions=ct(commit)
3080packet-out in_port=1, packet=50540000000A50540000000986DD60000000050800FFFC000000000000000000000000000001FC0000000000000000000000000000022C000000000000001100000100000001000100020008267100010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090010203040506070809001020304050607080900102030405060708090010203040506070809001020304050607080900102030405060708090010203040506070, actions=ct(commit)
b21ac618
DB
3081])
3082
3083AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
3084
3085AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
3086udp,orig=(src=fc00::1,dst=fc00::2,sport=<cleared>,dport=<cleared>),reply=(src=fc00::2,dst=fc00::1,sport=<cleared>,dport=<cleared>)
3087])
3088
3089OVS_TRAFFIC_VSWITCHD_STOP
3090AT_CLEANUP
3091
3092AT_SETUP([conntrack - IPv6 fragmentation, multiple extension headers 2])
3093CHECK_CONNTRACK()
b21ac618 3094OVS_TRAFFIC_VSWITCHD_START()
4ea96698 3095DPCTL_SET_MIN_FRAG_SIZE()
b21ac618
DB
3096
3097ADD_NAMESPACES(at_ns0, at_ns1)
3098
3099ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
3100ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
3101
3102# Add different extension headers
3103AT_DATA([bundle.txt], [dnl
df0ecb2e
YS
3104packet-out in_port=1, packet=50540000000A50540000000986DD60000000050800FFFC000000000000000000000000000001FC0000000000000000000000000000022C000000050200001100000100000001000100020008267100010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090010203040506070809001020304050607080900102030405060708090010203040506070809001020304050607080900102030405060708090010203040506070, actions=ct(commit)
3105packet-out in_port=1, packet=50540000000a50540000000986dd60000000002c00fffc000000000000000000000000000001fc0000000000000000000000000000022c00000005020000110004f80000000100010002000800000001020304050607080900010203040506070809, actions=ct(commit)
b21ac618
DB
3106])
3107
3108AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
3109
3110AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
3111udp,orig=(src=fc00::1,dst=fc00::2,sport=<cleared>,dport=<cleared>),reply=(src=fc00::2,dst=fc00::1,sport=<cleared>,dport=<cleared>)
3112])
3113
3114OVS_TRAFFIC_VSWITCHD_STOP
3115AT_CLEANUP
3116
3117AT_SETUP([conntrack - IPv6 fragmentation, multiple extension headers 2 + out of order])
3118CHECK_CONNTRACK()
b21ac618 3119OVS_TRAFFIC_VSWITCHD_START()
4ea96698 3120DPCTL_SET_MIN_FRAG_SIZE()
b21ac618
DB
3121
3122ADD_NAMESPACES(at_ns0, at_ns1)
3123
3124ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
3125ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
3126
3127# Add different extension headers
3128AT_DATA([bundle.txt], [dnl
df0ecb2e
YS
3129packet-out in_port=1, packet=50540000000a50540000000986dd60000000002c00fffc000000000000000000000000000001fc0000000000000000000000000000022c00000005020000110004f80000000100010002000800000001020304050607080900010203040506070809, actions=ct(commit)
3130packet-out in_port=1, packet=50540000000A50540000000986DD60000000050800FFFC000000000000000000000000000001FC0000000000000000000000000000022C000000050200001100000100000001000100020008267100010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090001020304050607080900010203040506070809000102030405060708090010203040506070809001020304050607080900102030405060708090010203040506070809001020304050607080900102030405060708090010203040506070, actions=ct(commit)
b21ac618
DB
3131])
3132
3133AT_CHECK([ovs-ofctl bundle br0 bundle.txt])
3134
3135AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
3136udp,orig=(src=fc00::1,dst=fc00::2,sport=<cleared>,dport=<cleared>),reply=(src=fc00::2,dst=fc00::1,sport=<cleared>,dport=<cleared>)
3137])
3138
3139OVS_TRAFFIC_VSWITCHD_STOP
3140AT_CLEANUP
3141
27130224 3142AT_SETUP([conntrack - Fragmentation over vxlan])
dfb21e96 3143OVS_CHECK_VXLAN()
27130224 3144CHECK_CONNTRACK()
c6fb6677 3145CHECK_CONNTRACK_LOCAL_STACK()
27130224 3146
cf7659b6
JR
3147OVS_TRAFFIC_VSWITCHD_START()
3148ADD_BR([br-underlay])
3149AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
3150
27130224
AZ
3151ADD_NAMESPACES(at_ns0)
3152
3153dnl Sending ping through conntrack
3154AT_DATA([flows.txt], [dnl
3155priority=1,action=drop
3156priority=10,arp,action=normal
3157priority=100,in_port=1,icmp,action=ct(commit,zone=9),LOCAL
3a9eb803 3158priority=100,in_port=LOCAL,icmp,action=ct(table=1,zone=9)
723af132 3159table=1,in_port=LOCAL,ct_state=+trk+est,icmp,action=1
27130224
AZ
3160])
3161
6cfa8ec3 3162AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
27130224
AZ
3163
3164dnl Set up underlay link from host into the namespace using veth pair.
3165ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24")
3166AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
3167AT_CHECK([ip link set dev br-underlay up])
3168
3169dnl Set up tunnel endpoints on OVS outside the namespace and with a native
3170dnl linux device inside the namespace.
6e3a764c 3171ADD_OVS_TUNNEL([vxlan], [br0], [at_vxlan0], [172.31.1.1], [10.1.1.100/24])
27130224
AZ
3172ADD_NATIVE_TUNNEL([vxlan], [at_vxlan1], [at_ns0], [172.31.1.100], [10.1.1.1/24],
3173 [id 0 dstport 4789])
3174
3175dnl First, check the underlay
3176NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [0], [dnl
31773 packets transmitted, 3 received, 0% packet loss, time 0ms
3178])
3179
3180dnl Okay, now check the overlay with different packet sizes
3181NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
31823 packets transmitted, 3 received, 0% packet loss, time 0ms
3183])
3184NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
31853 packets transmitted, 3 received, 0% packet loss, time 0ms
3186])
3187NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
31883 packets transmitted, 3 received, 0% packet loss, time 0ms
3189])
3190
3191OVS_TRAFFIC_VSWITCHD_STOP
3192AT_CLEANUP
c4e34c61 3193
84f646df 3194AT_SETUP([conntrack - IPv6 Fragmentation over vxlan])
a9f70f3d 3195OVS_CHECK_VXLAN()
84f646df 3196CHECK_CONNTRACK()
c6fb6677 3197CHECK_CONNTRACK_LOCAL_STACK()
84f646df
JS
3198
3199OVS_TRAFFIC_VSWITCHD_START()
3200ADD_BR([br-underlay])
3201AT_CHECK([ovs-ofctl add-flow br-underlay "actions=normal"])
3202
3203ADD_NAMESPACES(at_ns0)
3204
3205dnl Sending ping through conntrack
3206AT_DATA([flows.txt], [dnl
3207priority=1,action=drop
3208priority=100,in_port=1,ipv6,action=ct(commit,zone=9),LOCAL
3209priority=100,in_port=LOCAL,ipv6,action=ct(table=1,zone=9)
723af132 3210table=1,in_port=LOCAL,ct_state=+trk+est,ipv6,action=1
84f646df
JS
3211
3212dnl Neighbour Discovery
3213priority=1000,icmp6,icmp_type=135,action=normal
3214priority=1000,icmp6,icmp_type=136,action=normal
3215])
3216
3217AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
3218
3219dnl Set up underlay link from host into the namespace using veth pair.
3220ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24")
3221AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
3222AT_CHECK([ip link set dev br-underlay up])
3223
3224dnl Set up tunnel endpoints on OVS outside the namespace and with a native
3225dnl linux device inside the namespace.
6e3a764c 3226ADD_OVS_TUNNEL([vxlan], [br0], [at_vxlan0], [172.31.1.1], ["fc00::2/96"])
84f646df
JS
3227ADD_NATIVE_TUNNEL([vxlan], [at_vxlan1], [at_ns0], [172.31.1.100], ["fc00::1/96"],
3228 [id 0 dstport 4789])
3229
c10840ff
JS
3230dnl Linux seems to take a little time to get its IPv6 stack in order. Without
3231dnl waiting, we get occasional failures due to the following error:
84f646df 3232dnl "connect: Cannot assign requested address"
c10840ff 3233OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
84f646df
JS
3234
3235dnl First, check the underlay
3236NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [0], [dnl
32373 packets transmitted, 3 received, 0% packet loss, time 0ms
3238])
3239
3240dnl Okay, now check the overlay with different packet sizes
3241NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
32423 packets transmitted, 3 received, 0% packet loss, time 0ms
3243])
3244NS_CHECK_EXEC([at_ns0], [ping6 -s 1600 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
32453 packets transmitted, 3 received, 0% packet loss, time 0ms
3246])
3247NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING], [0], [dnl
32483 packets transmitted, 3 received, 0% packet loss, time 0ms
3249])
3250
3251OVS_TRAFFIC_VSWITCHD_STOP
3252AT_CLEANUP
9ac0aada 3253
c4e34c61
RB
3254AT_SETUP([conntrack - resubmit to ct multiple times])
3255CHECK_CONNTRACK()
3256
3257OVS_TRAFFIC_VSWITCHD_START(
3258 [set-fail-mode br0 secure -- ])
3259
3260ADD_NAMESPACES(at_ns0, at_ns1)
3261
3262ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
3263ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
3264
3265AT_DATA([flows.txt], [dnl
3266table=0,priority=150,arp,action=normal
3267table=0,priority=100,ip,in_port=1,action=resubmit(,1),resubmit(,2)
3268
723af132
JS
3269table=1,ip,action=ct(table=3)
3270table=2,ip,action=ct(table=3)
c4e34c61
RB
3271
3272table=3,ip,action=drop
3273])
3274
3275AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
3276
3277NS_CHECK_EXEC([at_ns0], [ping -q -c 1 10.1.1.2 | FORMAT_PING], [0], [dnl
32781 packets transmitted, 0 received, 100% packet loss, time 0ms
3279])
3280
3281AT_CHECK([ovs-ofctl dump-flows br0 | ofctl_strip | sort], [0], [dnl
3282 n_packets=1, n_bytes=98, priority=100,ip,in_port=1 actions=resubmit(,1),resubmit(,2)
3283 n_packets=2, n_bytes=84, priority=150,arp actions=NORMAL
723af132
JS
3284 table=1, n_packets=1, n_bytes=98, ip actions=ct(table=3)
3285 table=2, n_packets=1, n_bytes=98, ip actions=ct(table=3)
c4e34c61
RB
3286 table=3, n_packets=2, n_bytes=196, ip actions=drop
3287NXST_FLOW reply:
3288])
3289
3290OVS_TRAFFIC_VSWITCHD_STOP
3291AT_CLEANUP
9ac0aada 3292
187bb41f
YHW
3293AT_SETUP([conntrack - zone-based timeout policy])
3294CHECK_CONNTRACK()
3295CHECK_CONNTRACK_TIMEOUT()
3296OVS_TRAFFIC_VSWITCHD_START()
3297
3298ADD_NAMESPACES(at_ns0, at_ns1)
3299
3300ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
3301ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
3302
3303AT_DATA([flows.txt], [dnl
3304priority=1,action=drop
3305priority=10,arp,action=normal
3306priority=100,in_port=1,ip,action=ct(zone=5, table=1)
3307priority=100,in_port=2,ip,action=ct(zone=5, table=1)
3308table=1,in_port=2,ip,ct_state=+trk+est,action=1
3309table=1,in_port=1,ip,ct_state=+trk+new,action=ct(commit,zone=5),2
3310table=1,in_port=1,ip,ct_state=+trk+est,action=2
3311])
3312
3313AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
3314
3315dnl Test with default timeout
3316dnl The default udp_single and icmp_first timeouts are 30 seconds in
3317dnl kernel DP, and 60 seconds in userspace DP.
3318
3319dnl Send ICMP and UDP traffic
3320NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
33213 packets transmitted, 3 received, 0% packet loss, time 0ms
3322])
3323AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000200080000 actions=resubmit(,0)"])
3324
3325sleep 4
3326
3327AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2) | sort], [0], [dnl
3328icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>,type=8,code=0),reply=(src=10.1.1.2,dst=10.1.1.1,id=<cleared>,type=0,code=0),zone=5
3329udp,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=5
3330])
3331
3332AT_CHECK([ovs-appctl dpctl/flush-conntrack])
3333
3334dnl Shorten the udp_single and icmp_first timeout in zone 5
2078901a
WT
3335dnl Userspace datapath uses udp_first and icmp_reply, and
3336dnl kernel datapath uses udp_single and icmp_first
187bb41f 3337VSCTL_ADD_DATAPATH_TABLE()
2078901a
WT
3338
3339dnl Creating more timeout policies
3340for i in `seq 1 255`; do
3341ovs-vsctl --may-exist add-zone-tp $DP_TYPE zone=$i udp_first=$i udp_single=$i icmp_first=$i icmp_reply=$i;
3342done
3343AT_CHECK([ovs-vsctl --may-exist add-zone-tp $DP_TYPE zone=5 udp_first=1 udp_single=1 icmp_first=1 icmp_reply=1])
187bb41f
YHW
3344
3345dnl Send ICMP and UDP traffic
3346NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
33473 packets transmitted, 3 received, 0% packet loss, time 0ms
3348])
3349AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000200080000 actions=resubmit(,0)"])
3350
3351AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2) | sort], [0], [dnl
3352icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>,type=8,code=0),reply=(src=10.1.1.2,dst=10.1.1.1,id=<cleared>,type=0,code=0),zone=5
3353udp,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=5
47d76e9f
YHW
3354])
3355
3356dnl Wait until the timeout expire.
3357dnl We intend to wait a bit longer, because conntrack does not recycle the entry right after it is expired.
2078901a 3358sleep 6
47d76e9f
YHW
3359
3360AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
3361])
3362
3363dnl Re-send ICMP and UDP traffic to test conntrack cache
3364NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
33653 packets transmitted, 3 received, 0% packet loss, time 0ms
3366])
3367AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000200080000 actions=resubmit(,0)"])
3368
3369AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2) | sort], [0], [dnl
3370icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>,type=8,code=0),reply=(src=10.1.1.2,dst=10.1.1.1,id=<cleared>,type=0,code=0),zone=5
3371udp,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=5
187bb41f
YHW
3372])
3373
3374dnl Wait until the timeout expire.
3375dnl We intend to wait a bit longer, because conntrack does not recycle the entry right after it is expired.
2078901a 3376sleep 6
187bb41f
YHW
3377
3378AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
3379])
3380
2078901a
WT
3381dnl Set the timeout policy to default again.
3382AT_CHECK([ovs-vsctl del-zone-tp $DP_TYPE zone=5])
3383
3384dnl Send ICMP and UDP traffic
3385NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
33863 packets transmitted, 3 received, 0% packet loss, time 0ms
3387])
3388AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000200080000 actions=resubmit(,0)"])
3389
3390sleep 1
3391
3392AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2) | sort], [0], [dnl
3393icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>,type=8,code=0),reply=(src=10.1.1.2,dst=10.1.1.1,id=<cleared>,type=0,code=0),zone=5
3394udp,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=5
3395])
3396
187bb41f
YHW
3397OVS_TRAFFIC_VSWITCHD_STOP
3398AT_CLEANUP
3399
ae05d681
GR
3400dnl Check kernel datapath to make sure conntrack fills in L3 and L4
3401dnl protocol information
3402AT_SETUP([conntrack - fragment reassembly with L3 L4 protocol information])
d7fd61ae 3403CHECK_CONNTRACK()
ae05d681 3404CHECK_L3L4_CONNTRACK_REASM()
d7fd61ae
GR
3405OVS_TRAFFIC_VSWITCHD_START()
3406
3407AT_DATA([flows.txt], [dnl
3408action=normal
3409])
3410
3411AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
3412
3413AT_CHECK([ovs-ofctl packet-out br0 "packet=52540003287c525400444ab586dd6006f70605b02c4020010001000000000000000000000020200100010000000000000000000000101100000134e88deb13891389080803136161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616"dnl
3414"16161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161"dnl
3415"61616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616"dnl
3416"1616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161, actions=ct(table=1)"])
3417
3418AT_CHECK([ovs-ofctl packet-out br0 "packet=52540003287c525400444ab586dd6006f70602682c402001000100000000000000000000002020010001000000000000000000000010110005a834e88deb6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616"dnl
3419"161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161, actions=ct(table=1)"])
3420
3421AT_CHECK([ovs-ofctl packet-out br0 "packet=52540003287c525400444ab586dd6006f706033d1140200100010000000000000000000000202001000100000000000000000000001013891389033d923861616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616"dnl
3422"1616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161610a, actions=ct(table=1)"])
3423
3424AT_CHECK([ovs-appctl dpctl/dump-flows | head -2 | tail -1 | grep -q -e ["]udp[(]src=5001["]])
3425
3426OVS_TRAFFIC_VSWITCHD_STOP
3427AT_CLEANUP
3428
1d768544
JS
3429AT_BANNER([conntrack - L7])
3430
3431AT_SETUP([conntrack - IPv4 HTTP])
3432CHECK_CONNTRACK()
3433OVS_TRAFFIC_VSWITCHD_START()
3434
3435ADD_NAMESPACES(at_ns0, at_ns1)
3436
3437ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
3438ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
3439
3440dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
3441AT_DATA([flows.txt], [dnl
3442priority=1,action=drop
3443priority=10,arp,action=normal
3444priority=10,icmp,action=normal
3445priority=100,in_port=1,tcp,action=ct(commit),2
3446priority=100,in_port=2,ct_state=-trk,tcp,action=ct(table=0)
3447priority=100,in_port=2,ct_state=+trk+est,tcp,action=1
3448])
3449
3450AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
3451
3452OVS_START_L7([at_ns0], [http])
3453OVS_START_L7([at_ns1], [http])
3454
3455dnl HTTP requests from ns0->ns1 should work fine.
3456NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
3457AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
3458tcp,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>)
3459])
3460
3461dnl HTTP requests from ns1->ns0 should fail due to network failure.
3462dnl Try 3 times, in 1 second intervals.
3463NS_CHECK_EXEC([at_ns1], [wget 10.1.1.1 -t 3 -T 1 --retry-connrefused -v -o wget1.log], [4])
3464
3465OVS_TRAFFIC_VSWITCHD_STOP
3466AT_CLEANUP
3467
3468AT_SETUP([conntrack - IPv6 HTTP])
3469CHECK_CONNTRACK()
3470OVS_TRAFFIC_VSWITCHD_START()
3471
3472ADD_NAMESPACES(at_ns0, at_ns1)
3473
3474ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
3475ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
3476
3477dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
3478AT_DATA([flows.txt], [dnl
3479priority=1,action=drop
3480priority=10,icmp6,action=normal
3481priority=100,in_port=1,tcp6,action=ct(commit),2
3482priority=100,in_port=2,ct_state=-trk,tcp6,action=ct(table=0)
3483priority=100,in_port=2,ct_state=+trk+est,tcp6,action=1
3484])
3485
3486AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
3487
3488dnl Linux seems to take a little time to get its IPv6 stack in order. Without
3489dnl waiting, we get occasional failures due to the following error:
3490dnl "connect: Cannot assign requested address"
3491OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
3492
3493OVS_START_L7([at_ns0], [http6])
3494OVS_START_L7([at_ns1], [http6])
3495
3496dnl HTTP requests from ns0->ns1 should work fine.
3497NS_CHECK_EXEC([at_ns0], [wget http://[[fc00::2]] -t 3 -T 1 --retry-connrefused -v -o wget0.log])
3498AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
3499tcp,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>)
3500])
3501
3502dnl HTTP requests from ns1->ns0 should fail due to network failure.
3503dnl Try 3 times, in 1 second intervals.
3504NS_CHECK_EXEC([at_ns1], [wget http://[[fc00::1]] -t 3 -T 1 --retry-connrefused -v -o wget1.log], [4])
3505
3506OVS_TRAFFIC_VSWITCHD_STOP
3507AT_CLEANUP
3508
3509AT_SETUP([conntrack - commit, recirc])
3510CHECK_CONNTRACK()
3511OVS_TRAFFIC_VSWITCHD_START()
3512
3513ADD_NAMESPACES(at_ns0, at_ns1, at_ns2, at_ns3)
3514
3515ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
3516ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
3517ADD_VETH(p2, at_ns2, br0, "10.1.1.3/24")
3518ADD_VETH(p3, at_ns3, br0, "10.1.1.4/24")
3519
3520dnl Allow any traffic from ns0->ns1, ns2->ns3.
3521AT_DATA([flows.txt], [dnl
3522priority=1,action=drop
3523priority=10,arp,action=normal
3524priority=10,icmp,action=normal
3525priority=100,in_port=1,tcp,ct_state=-trk,action=ct(commit,table=0)
3526priority=100,in_port=1,tcp,ct_state=+trk,action=2
3527priority=100,in_port=2,tcp,ct_state=-trk,action=ct(table=0)
3528priority=100,in_port=2,tcp,ct_state=+trk,action=1
3529priority=100,in_port=3,tcp,ct_state=-trk,action=set_field:0->metadata,ct(table=0)
3530priority=100,in_port=3,tcp,ct_state=+trk,metadata=0,action=set_field:1->metadata,ct(commit,table=0)
3531priority=100,in_port=3,tcp,ct_state=+trk,metadata=1,action=4
3532priority=100,in_port=4,tcp,ct_state=-trk,action=ct(commit,table=0)
3533priority=100,in_port=4,tcp,ct_state=+trk,action=3
3534])
3535
3536AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
3537
3538OVS_START_L7([at_ns1], [http])
3539OVS_START_L7([at_ns3], [http])
3540
3541dnl HTTP requests from p0->p1 should work fine.
3542NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
3543
3544dnl HTTP requests from p2->p3 should work fine.
3545NS_CHECK_EXEC([at_ns2], [wget 10.1.1.4 -t 3 -T 1 --retry-connrefused -v -o wget1.log])
3546
3547OVS_TRAFFIC_VSWITCHD_STOP
3548AT_CLEANUP
3549
3550AT_SETUP([conntrack - multiple zones, local])
3551CHECK_CONNTRACK()
3552CHECK_CONNTRACK_LOCAL_STACK()
3553OVS_TRAFFIC_VSWITCHD_START()
3554
3555ADD_NAMESPACES(at_ns0)
3556
3557AT_CHECK([ip addr add dev br0 "10.1.1.1/24"])
3558AT_CHECK([ip link set dev br0 up])
3559on_exit 'ip addr del dev br0 "10.1.1.1/24"'
3560ADD_VETH(p0, at_ns0, br0, "10.1.1.2/24")
3561
3562dnl Allow traffic from local stack to ns0. Only allow neighbour discovery,
3563dnl return traffic from ns0 back to the local stack.
3564AT_DATA([flows.txt], [dnl
3565priority=1,action=drop
3566priority=10,arp,action=normal
3567priority=100,in_port=LOCAL,ip,ct_state=-trk,action=drop
3568priority=100,in_port=LOCAL,ip,ct_state=+trk+new,action=ct(commit,zone=1),ct(commit,zone=2),1
3569priority=100,in_port=LOCAL,ip,ct_state=+trk+est,action=ct(commit,zone=1),ct(commit,zone=2),1
3570priority=100,in_port=1,ip,ct_state=-trk,action=ct(table=1,zone=1)
3571table=1,in_port=1,ip,ct_state=+trk+est,ct_zone=1,action=ct(table=2,zone=2)
3572table=2,in_port=1,ip,ct_state=+trk+est,ct_zone=2,action=LOCAL
3573])
3574
3575AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
3576
3577AT_CHECK([ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
35783 packets transmitted, 3 received, 0% packet loss, time 0ms
3579])
3580
3581OVS_START_L7([at_ns0], [http])
3582
3583dnl HTTP requests from root namespace to p0 should work fine.
3584AT_CHECK([wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
3585
3586dnl (again) HTTP requests from root namespace to p0 should work fine.
3587AT_CHECK([wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
3588
3589AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2) | grep "zone"], [0], [dnl
3590icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>,type=8,code=0),reply=(src=10.1.1.2,dst=10.1.1.1,id=<cleared>,type=0,code=0),zone=1
3591icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>,type=8,code=0),reply=(src=10.1.1.2,dst=10.1.1.1,id=<cleared>,type=0,code=0),zone=2
3592tcp,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>)
3593tcp,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>)
3594])
3595
3596OVS_TRAFFIC_VSWITCHD_STOP
3597AT_CLEANUP
3598
3599AT_SETUP([conntrack - multi-stage pipeline, local])
3600CHECK_CONNTRACK()
3601CHECK_CONNTRACK_LOCAL_STACK()
3602OVS_TRAFFIC_VSWITCHD_START()
3603
3604ADD_NAMESPACES(at_ns0)
3605
3606AT_CHECK([ip addr add dev br0 "10.1.1.1/24"])
3607AT_CHECK([ip link set dev br0 up])
3608on_exit 'ip addr del dev br0 "10.1.1.1/24"'
3609ADD_VETH(p0, at_ns0, br0, "10.1.1.2/24")
3610
3611dnl Allow traffic from local stack to ns0. Only allow neighbour discovery,
3612dnl return traffic from ns0 back to the local stack.
3613AT_DATA([flows.txt], [dnl
3614dnl default
3615table=0,priority=1,action=drop
3616table=0,priority=10,arp,action=normal
3617
3618dnl Load the output port to REG0
3619table=0,priority=100,ip,in_port=LOCAL,action=load:1->NXM_NX_REG0[[0..15]],goto_table:1
3620table=0,priority=100,ip,in_port=1,action=load:65534->NXM_NX_REG0[[0..15]],goto_table:1
3621
3622dnl Ingress pipeline
3623dnl - Allow all connections from LOCAL port (commit and proceed to egress)
3624dnl - All other connections go through conntracker using the input port as
3625dnl a connection tracking zone.
f6fabcc6 3626table=1,priority=150,in_port=LOCAL,ip,ct_state=+trk+new,action=ct(commit,table=2,zone=OXM_OF_IN_PORT[[0..15]])
1d768544
JS
3627table=1,priority=100,ip,action=ct(table=2,zone=OXM_OF_IN_PORT[[0..15]])
3628table=1,priority=1,action=drop
3629
3630dnl Egress pipeline
3631dnl - Allow all connections from LOCAL port (commit and skip to output)
3632dnl - Allow other established connections to go through conntracker using
3633dnl output port as a connection tracking zone.
f6fabcc6 3634table=2,priority=150,in_port=LOCAL,ip,ct_state=+trk+new,action=ct(commit,table=4,zone=NXM_NX_REG0[[0..15]])
1d768544
JS
3635table=2,priority=100,ip,ct_state=+trk+est,action=ct(table=3,zone=NXM_NX_REG0[[0..15]])
3636table=2,priority=1,action=drop
3637
3638dnl Only allow established traffic from egress ct lookup
3639table=3,priority=100,ip,ct_state=+trk+est,action=goto_table:4
3640table=3,priority=1,action=drop
3641
3642dnl output table
3643table=4,priority=100,ip,action=output:NXM_NX_REG0[[]]
3644])
3645
3646AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
3647
3648AT_CHECK([ping -q -c 3 -i 0.3 -w 2 10.1.1.2 | FORMAT_PING], [0], [dnl
36493 packets transmitted, 3 received, 0% packet loss, time 0ms
3650])
3651
3652OVS_START_L7([at_ns0], [http])
3653
3654dnl HTTP requests from root namespace to p0 should work fine.
3655AT_CHECK([wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
3656
3657dnl (again) HTTP requests from root namespace to p0 should work fine.
3658AT_CHECK([wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
3659
3660AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2) | grep "zone"], [0], [dnl
3661icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>,type=8,code=0),reply=(src=10.1.1.2,dst=10.1.1.1,id=<cleared>,type=0,code=0),zone=1
3662icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>,type=8,code=0),reply=(src=10.1.1.2,dst=10.1.1.1,id=<cleared>,type=0,code=0),zone=65534
3663tcp,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>)
3664tcp,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>)
3665])
3666
3667OVS_TRAFFIC_VSWITCHD_STOP
3668AT_CLEANUP
3669
3f1087c7
YHW
3670AT_SETUP([conntrack - limit by zone])
3671CHECK_CONNTRACK()
3f1087c7
YHW
3672OVS_TRAFFIC_VSWITCHD_START()
3673
3674ADD_NAMESPACES(at_ns0, at_ns1)
3675
3676ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
3677ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
3678
3679AT_DATA([flows.txt], [dnl
3680priority=1,action=drop
3681priority=10,arp,action=normal
3682priority=100,in_port=1,udp,action=ct(commit),2
3683priority=100,in_port=2,udp,action=ct(zone=3,commit),1
3684])
3685
3686AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
3687
3688AT_CHECK([ovs-appctl dpctl/ct-set-limits default=10 zone=0,limit=5 zone=1,limit=15 zone=2,limit=3 zone=3,limit=3])
3689AT_CHECK([ovs-appctl dpctl/ct-del-limits zone=1,2,4])
3690AT_CHECK([ovs-appctl dpctl/ct-get-limits zone=0,1,2,3], [],[dnl
3691default limit=10
3692zone=0,limit=5,count=0
3693zone=1,limit=10,count=0
3694zone=2,limit=10,count=0
3695zone=3,limit=3,count=0
3696])
3697
3698dnl Test UDP from port 1
3699AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000200080000 actions=resubmit(,0)"])
3700AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000300080000 actions=resubmit(,0)"])
3701AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000400080000 actions=resubmit(,0)"])
3702AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000500080000 actions=resubmit(,0)"])
3703AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000600080000 actions=resubmit(,0)"])
3704AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000700080000 actions=resubmit(,0)"])
3705AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000800080000 actions=resubmit(,0)"])
3706AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000900080000 actions=resubmit(,0)"])
3707AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=1 packet=50540000000a50540000000908004500001c000000000011a4cd0a0101010a0101020001000a00080000 actions=resubmit(,0)"])
3708
3709AT_CHECK([ovs-appctl dpctl/ct-get-limits zone=0,1,2,3,4,5], [0], [dnl
3710default limit=10
3711zone=0,limit=5,count=5
3712zone=1,limit=10,count=0
3713zone=2,limit=10,count=0
3714zone=3,limit=3,count=0
3715zone=4,limit=10,count=0
3716zone=5,limit=10,count=0
3717])
3718
3719dnl Test ct-get-limits for all zoens
3720AT_CHECK([ovs-appctl dpctl/ct-get-limits], [0], [dnl
3721default limit=10
3722zone=0,limit=5,count=5
3723zone=3,limit=3,count=0
3724])
3725
3726AT_CHECK([ovs-appctl dpctl/dump-conntrack | grep "orig=.src=10\.1\.1\.1," | sort ], [0], [dnl
3727udp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=1,dport=2),reply=(src=10.1.1.2,dst=10.1.1.1,sport=2,dport=1)
3728udp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=1,dport=3),reply=(src=10.1.1.2,dst=10.1.1.1,sport=3,dport=1)
3729udp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=1,dport=4),reply=(src=10.1.1.2,dst=10.1.1.1,sport=4,dport=1)
3730udp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=1,dport=5),reply=(src=10.1.1.2,dst=10.1.1.1,sport=5,dport=1)
3731udp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=1,dport=6),reply=(src=10.1.1.2,dst=10.1.1.1,sport=6,dport=1)
3732])
3733
3734dnl Test UDP from port 2
e2603f61
DB
3735AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=2 packet=50540000000a50540000000908004500001c000000000011a4c90a0101030a0101040001000200080000 actions=resubmit(,0)"])
3736AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=2 packet=50540000000a50540000000908004500001c000000000011a4c90a0101030a0101040001000300080000 actions=resubmit(,0)"])
3737AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=2 packet=50540000000a50540000000908004500001c000000000011a4c90a0101030a0101040001000400080000 actions=resubmit(,0)"])
3738AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=2 packet=50540000000a50540000000908004500001c000000000011a4c90a0101030a0101040001000500080000 actions=resubmit(,0)"])
3739AT_CHECK([ovs-ofctl -O OpenFlow13 packet-out br0 "in_port=2 packet=50540000000a50540000000908004500001c000000000011a4c90a0101030a0101040001000600080000 actions=resubmit(,0)"])
3f1087c7
YHW
3740
3741AT_CHECK([ovs-appctl dpctl/ct-get-limits zone=0,3], [0], [dnl
3742default limit=10
3743zone=0,limit=5,count=5
3744zone=3,limit=3,count=3
3745])
3746
3747AT_CHECK([ovs-appctl dpctl/dump-conntrack | grep "orig=.src=10\.1\.1\.3," | sort ], [0], [dnl
3748udp,orig=(src=10.1.1.3,dst=10.1.1.4,sport=1,dport=2),reply=(src=10.1.1.4,dst=10.1.1.3,sport=2,dport=1),zone=3
3749udp,orig=(src=10.1.1.3,dst=10.1.1.4,sport=1,dport=3),reply=(src=10.1.1.4,dst=10.1.1.3,sport=3,dport=1),zone=3
3750udp,orig=(src=10.1.1.3,dst=10.1.1.4,sport=1,dport=4),reply=(src=10.1.1.4,dst=10.1.1.3,sport=4,dport=1),zone=3
3751])
3752
3753OVS_TRAFFIC_VSWITCHD_STOP(["dnl
3754/could not create datapath/d
3755/(Cannot allocate memory) on packet/d"])
3756AT_CLEANUP
3757
9d3e0e5c
JR
3758AT_SETUP([FTP - no conntrack])
3759AT_SKIP_IF([test $HAVE_FTP = no])
3760OVS_TRAFFIC_VSWITCHD_START()
3761
3762ADD_NAMESPACES(at_ns0, at_ns1)
3763
3764ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
3765ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
3766
3767AT_DATA([flows.txt], [dnl
3768table=0,action=normal
3769])
3770
3771AT_CHECK([ovs-ofctl --bundle replace-flows br0 flows.txt])
3772
1ca0323e
BP
3773NETNS_DAEMONIZE([at_ns0], [[$PYTHON3 $srcdir/test-l7.py ftp]], [ftp1.pid])
3774NETNS_DAEMONIZE([at_ns1], [[$PYTHON3 $srcdir/test-l7.py ftp]], [ftp0.pid])
9d3e0e5c
JR
3775OVS_WAIT_UNTIL([ip netns exec at_ns1 netstat -l | grep ftp])
3776
3777dnl FTP requests from p0->p1 should work fine.
3778NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v -o wget0.log])
3779
3780AT_CHECK([find -name index.html], [0], [dnl
3781./index.html
3782])
3783
3784OVS_TRAFFIC_VSWITCHD_STOP
3785AT_CLEANUP
3786
1d768544 3787AT_SETUP([conntrack - FTP])
40c7b2fc 3788AT_SKIP_IF([test $HAVE_FTP = no])
1d768544
JS
3789CHECK_CONNTRACK()
3790CHECK_CONNTRACK_ALG()
3791OVS_TRAFFIC_VSWITCHD_START()
3792
3793ADD_NAMESPACES(at_ns0, at_ns1)
3794
3795ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
3796ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
3797
3798dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
3799AT_DATA([flows1.txt], [dnl
3800table=0,priority=1,action=drop
3801table=0,priority=10,arp,action=normal
3802table=0,priority=10,icmp,action=normal
3803table=0,priority=100,in_port=1,tcp,action=ct(alg=ftp,commit),2
3804table=0,priority=100,in_port=2,tcp,action=ct(table=1)
3805table=1,in_port=2,tcp,ct_state=+trk+est,action=1
3806table=1,in_port=2,tcp,ct_state=+trk+rel,action=1
3807])
3808
3809dnl Similar policy but without allowing all traffic from ns0->ns1.
3810AT_DATA([flows2.txt], [dnl
3811table=0,priority=1,action=drop
3812table=0,priority=10,arp,action=normal
3813table=0,priority=10,icmp,action=normal
3814
3815dnl Allow outgoing TCP connections, and treat them as FTP
3816table=0,priority=100,in_port=1,tcp,action=ct(table=1)
3817table=1,in_port=1,tcp,ct_state=+trk+new,action=ct(commit,alg=ftp),2
3818table=1,in_port=1,tcp,ct_state=+trk+est,action=2
3819
3820dnl Allow incoming FTP data connections and responses to existing connections
3821table=0,priority=100,in_port=2,tcp,action=ct(table=1)
3822table=1,in_port=2,tcp,ct_state=+trk+new+rel,action=ct(commit),1
3823table=1,in_port=2,tcp,ct_state=+trk+est,action=1
3824table=1,in_port=2,tcp,ct_state=+trk-new+rel,action=1
3825])
3826
3a2a425b
DB
3827dnl flows3 is same as flows1, except no ALG is specified.
3828AT_DATA([flows3.txt], [dnl
3829table=0,priority=1,action=drop
3830table=0,priority=10,arp,action=normal
3831table=0,priority=10,icmp,action=normal
3832table=0,priority=100,in_port=1,tcp,action=ct(commit),2
3833table=0,priority=100,in_port=2,tcp,action=ct(table=1)
3834table=1,in_port=2,tcp,ct_state=+trk+est,action=1
3835table=1,in_port=2,tcp,ct_state=+trk+rel,action=1
3836])
3837
1d768544
JS
3838AT_CHECK([ovs-ofctl --bundle replace-flows br0 flows1.txt])
3839
3840OVS_START_L7([at_ns0], [ftp])
3841OVS_START_L7([at_ns1], [ftp])
3842
3843dnl FTP requests from p1->p0 should fail due to network failure.
3844dnl Try 3 times, in 1 second intervals.
3845NS_CHECK_EXEC([at_ns1], [wget ftp://10.1.1.1 --no-passive-ftp -t 3 -T 1 -v -o wget1.log], [4])
3846AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.1)], [0], [dnl
3847])
3848
3849dnl FTP requests from p0->p1 should work fine.
3850NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v -o wget0.log])
3851AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
3852tcp,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
3853])
3854
3855dnl Try the second set of flows.
3856AT_CHECK([ovs-ofctl --bundle replace-flows br0 flows2.txt])
3857AT_CHECK([ovs-appctl dpctl/flush-conntrack])
3858
3859dnl FTP requests from p1->p0 should fail due to network failure.
3860dnl Try 3 times, in 1 second intervals.
3861NS_CHECK_EXEC([at_ns1], [wget ftp://10.1.1.1 --no-passive-ftp -t 3 -T 1 -v -o wget1.log], [4])
3862AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.1)], [0], [dnl
3863])
3864
3865dnl Active FTP requests from p0->p1 should work fine.
3866NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v -o wget0-1.log])
3867AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
3868tcp,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
3869tcp,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>)
3870])
3871
3872AT_CHECK([ovs-appctl dpctl/flush-conntrack])
3873
3874dnl Passive FTP requests from p0->p1 should work fine.
3875NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0-2.log])
3876AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
3877tcp,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
3878])
3879
3a2a425b
DB
3880dnl Try the third set of flows, without alg specifier.
3881AT_CHECK([ovs-ofctl --bundle replace-flows br0 flows3.txt])
3882AT_CHECK([ovs-appctl dpctl/flush-conntrack])
3883
3884dnl FTP control requests from p0->p1 should work fine, but helper will not be assigned.
3885NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v -o wget0-3.log], [4])
3886AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
3887tcp,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>)
3888])
3889
1d768544
JS
3890OVS_TRAFFIC_VSWITCHD_STOP
3891AT_CLEANUP
3892
3893AT_SETUP([conntrack - FTP over IPv6])
40c7b2fc 3894AT_SKIP_IF([test $HAVE_FTP = no])
1d768544
JS
3895CHECK_CONNTRACK()
3896CHECK_CONNTRACK_ALG()
3897OVS_TRAFFIC_VSWITCHD_START()
3898
3899ADD_NAMESPACES(at_ns0, at_ns1)
3900
3901ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
3902ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
3903
3904dnl Allow any traffic from ns0->ns1.
3905dnl Only allow nd, return traffic from ns1->ns0.
3906AT_DATA([flows.txt], [dnl
3907dnl Track all IPv6 traffic and drop the rest.
3908dnl Allow ICMPv6 both ways. No commit, so pings will not be tracked.
3909table=0 priority=100 in_port=1 icmp6, action=2
3910table=0 priority=100 in_port=2 icmp6, action=1
3911table=0 priority=10 ip6, action=ct(table=1)
3912table=0 priority=0 action=drop
3913dnl
3914dnl Table 1
3915dnl
3916dnl Allow new TCPv6 FTP control connections from port 1.
3917table=1 in_port=1 ct_state=+new, tcp6, tp_dst=21, action=ct(alg=ftp,commit),2
3918dnl Allow related TCPv6 connections from port 2.
3919table=1 in_port=2 ct_state=+new+rel, tcp6, action=ct(commit),1
3920dnl Allow established TCPv6 connections both ways.
3921table=1 in_port=1 ct_state=+est, tcp6, action=2
3922table=1 in_port=2 ct_state=+est, tcp6, action=1
3923dnl Drop everything else.
3924table=1 priority=0, action=drop
3925])
3926
3927AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
3928
3929dnl Linux seems to take a little time to get its IPv6 stack in order. Without
3930dnl waiting, we get occasional failures due to the following error:
3931dnl "connect: Cannot assign requested address"
3932OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2 >/dev/null])
3933
3934OVS_START_L7([at_ns1], [ftp])
3935
3936dnl FTP requests from p0->p1 should work fine.
3937NS_CHECK_EXEC([at_ns0], [wget ftp://[[fc00::2]] -6 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v --server-response --no-remove-listing -o wget0.log -d])
3938
3939dnl Discards CLOSE_WAIT and CLOSING
3940AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
3941tcp,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
3942tcp,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>)
3943])
3944
3945OVS_TRAFFIC_VSWITCHD_STOP
3946AT_CLEANUP
3947
200a9af9
DB
3948AT_SETUP([conntrack - IPv6 FTP Passive])
3949AT_SKIP_IF([test $HAVE_FTP = no])
3950CHECK_CONNTRACK()
3951CHECK_CONNTRACK_ALG()
3952OVS_TRAFFIC_VSWITCHD_START()
3953
3954ADD_NAMESPACES(at_ns0, at_ns1)
3955
3956ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
3957NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
3958ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
3959NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address 80:88:88:88:88:99])
3960NS_CHECK_EXEC([at_ns0], [ip -6 neigh add fc00::2 lladdr 80:88:88:88:88:99 dev p0])
3961NS_CHECK_EXEC([at_ns1], [ip -6 neigh add fc00::1 lladdr 80:88:88:88:88:88 dev p1])
3962
3963dnl Allow any traffic from ns0->ns1.
3964dnl Only allow nd, return traffic from ns1->ns0.
3965AT_DATA([flows.txt], [dnl
3966dnl Track all IPv6 traffic and drop the rest.
3967dnl Allow ICMPv6 both ways. No commit, so pings will not be tracked.
3968table=0 priority=100 in_port=1 icmp6, action=2
3969table=0 priority=100 in_port=2 icmp6, action=1
3970table=0 priority=10 ip6, action=ct(table=1)
3971table=0 priority=0 action=drop
3972dnl
3973dnl Table 1
3974dnl
3975dnl Allow new TCPv6 FTP control connections from port 1.
3976table=1 in_port=1 ct_state=+new, tcp6, tp_dst=21, action=ct(alg=ftp,commit),2
3977dnl Allow related TCPv6 connections from port 1.
3978table=1 in_port=1 ct_state=+new+rel, tcp6, action=ct(commit),2
3979dnl Allow established TCPv6 connections both ways.
3980table=1 in_port=1 ct_state=+est, tcp6, action=2
3981table=1 in_port=2 ct_state=+est, tcp6, action=1
3982dnl Drop everything else.
3983table=1 priority=0, action=drop
3984])
3985
3986AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
3987
3988dnl Linux seems to take a little time to get its IPv6 stack in order. Without
3989dnl waiting, we get occasional failures due to the following error:
3990dnl "connect: Cannot assign requested address"
3991OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2 >/dev/null])
3992
3993OVS_START_L7([at_ns1], [ftp])
3994
3995dnl FTP passive requests from p0->p1 should work fine.
3996NS_CHECK_EXEC([at_ns0], [wget ftp://[[fc00::2]] -6 -t 3 -T 1 --retry-connrefused -v --server-response --no-remove-listing -o wget0.log -d])
3997
3998dnl Discards CLOSE_WAIT and CLOSING
3999AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
4000tcp,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>)
4001tcp,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
4002])
4003
4004OVS_TRAFFIC_VSWITCHD_STOP
4005AT_CLEANUP
4006
1d768544 4007AT_SETUP([conntrack - FTP with multiple expectations])
40c7b2fc 4008AT_SKIP_IF([test $HAVE_FTP = no])
1d768544
JS
4009CHECK_CONNTRACK()
4010CHECK_CONNTRACK_ALG()
4011OVS_TRAFFIC_VSWITCHD_START()
4012
4013ADD_NAMESPACES(at_ns0, at_ns1)
4014
4015ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
4016ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
4017
4018dnl Dual-firewall, allow all from ns1->ns2, allow established and ftp ns2->ns1.
4019AT_DATA([flows.txt], [dnl
4020table=0,priority=1,action=drop
4021table=0,priority=10,arp,action=normal
4022table=0,priority=10,icmp,action=normal
4023
4024dnl Traffic from ns1
4025table=0,priority=100,in_port=1,tcp,action=ct(table=1,zone=1)
4026table=1,in_port=1,tcp,ct_zone=1,ct_state=+trk+new-rel,action=ct(commit,alg=ftp,zone=1),ct(commit,alg=ftp,zone=2),2
4027table=1,in_port=1,tcp,ct_zone=1,ct_state=+trk+new+rel,action=ct(commit,zone=1),ct(commit,zone=2),2
4028table=1,in_port=1,tcp,ct_zone=1,ct_state=+trk+est,action=ct(table=2,zone=2)
4029table=2,in_port=1,tcp,ct_zone=2,ct_state=+trk+est,action=2
4030
4031dnl Traffic from ns2
4032table=0,priority=100,in_port=2,tcp,action=ct(table=1,zone=2)
4033table=1,in_port=2,tcp,ct_zone=2,ct_state=+trk+rel,action=ct(commit,zone=2),ct(commit,zone=1),1
4034table=1,in_port=2,tcp,ct_zone=2,ct_state=+trk+est,action=ct(table=2,zone=1)
4035table=2,in_port=2,tcp,ct_zone=1,ct_state=+trk+rel,action=ct(commit,zone=2),ct(commit,zone=1),1
4036table=2,in_port=2,tcp,ct_zone=1,ct_state=+trk+est,action=1
4037])
4038
4039AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
4040
4041OVS_START_L7([at_ns0], [ftp])
4042OVS_START_L7([at_ns1], [ftp])
4043
4044dnl FTP requests from p1->p0 should fail due to network failure.
4045dnl Try 3 times, in 1 second intervals.
4046NS_CHECK_EXEC([at_ns1], [wget ftp://10.1.1.1 --no-passive-ftp -t 3 -T 1 -v -o wget1.log], [4])
4047AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.1)], [0], [dnl
4048])
4049
4050dnl Active FTP requests from p0->p1 should work fine.
4051NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v -o wget0.log])
4052AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
4053tcp,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
4054tcp,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
4055tcp,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>)
4056tcp,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>)
4057])
4058
4059AT_CHECK([ovs-appctl dpctl/flush-conntrack])
4060
4061dnl Passive FTP requests from p0->p1 should work fine.
4062NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
4063AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
4064tcp,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>)
4065tcp,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
4066tcp,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>)
4067tcp,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
4068])
4069
4070OVS_TRAFFIC_VSWITCHD_STOP
4071AT_CLEANUP
4072
40c7b2fc
JS
4073AT_SETUP([conntrack - TFTP])
4074AT_SKIP_IF([test $HAVE_TFTP = no])
4075CHECK_CONNTRACK()
4076CHECK_CONNTRACK_ALG()
4077OVS_TRAFFIC_VSWITCHD_START()
4078
4079ADD_NAMESPACES(at_ns0, at_ns1)
4080
4081ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
4082ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
4083
4084dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
4085AT_DATA([flows1.txt], [dnl
4086table=0,priority=1,action=drop
4087table=0,priority=10,arp,action=normal
4088table=0,priority=10,icmp,action=normal
4089table=0,priority=100,in_port=1,udp,action=ct(alg=tftp,commit),2
4090table=0,priority=100,in_port=2,udp,action=ct(table=1)
4091table=1,in_port=2,udp,ct_state=+trk+est,action=1
4092table=1,in_port=2,udp,ct_state=+trk+rel,action=1
4093])
4094
4095dnl Similar policy but without allowing all traffic from ns0->ns1.
4096AT_DATA([flows2.txt], [dnl
4097table=0,priority=1,action=drop
4098table=0,priority=10,arp,action=normal
4099table=0,priority=10,icmp,action=normal
4100
4101dnl Allow outgoing UDP connections, and treat them as TFTP
4102table=0,priority=100,in_port=1,udp,action=ct(table=1)
4103table=1,in_port=1,udp,ct_state=+trk+new-rel,action=ct(commit,alg=tftp),2
4104table=1,in_port=1,udp,ct_state=+trk+new+rel,action=ct(commit),2
4105table=1,in_port=1,udp,ct_state=+trk+est,action=2
4106
4107dnl Allow incoming TFTP data connections and responses to existing connections
4108table=0,priority=100,in_port=2,udp,action=ct(table=1)
4109table=1,in_port=2,udp,ct_state=+trk+est,action=1
4110table=1,in_port=2,udp,ct_state=+trk+new+rel,action=1
4111])
4112
4113AT_CHECK([ovs-ofctl --bundle replace-flows br0 flows1.txt])
4114
4115OVS_START_L7([at_ns0], [tftp])
4116OVS_START_L7([at_ns1], [tftp])
4117
4118dnl TFTP requests from p1->p0 should fail due to network failure.
4119NS_CHECK_EXEC([at_ns1], [[curl $CURL_OPT tftp://10.1.1.1/flows1.txt -o foo 2>curl0.log]], [28])
4120AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.1)], [0], [dnl
4121])
4122
4123dnl TFTP requests from p0->p1 should work fine.
4124NS_CHECK_EXEC([at_ns0], [[curl $CURL_OPT tftp://10.1.1.2/flows1.txt -o foo 2>curl1.log]])
4125AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
4126udp,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>),helper=tftp
4127])
4128
4129dnl Try the second set of flows.
4130AT_CHECK([ovs-ofctl --bundle replace-flows br0 flows2.txt])
4131AT_CHECK([ovs-appctl dpctl/flush-conntrack])
4132
4133dnl TFTP requests from p1->p0 should fail due to network failure.
4134NS_CHECK_EXEC([at_ns1], [[curl $CURL_OPT tftp://10.1.1.1/flows1.txt -o foo 2>curl2.log]], [28])
4135AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.1)], [0], [dnl
4136])
4137
4138dnl TFTP requests from p0->p1 should work fine.
4139NS_CHECK_EXEC([at_ns0], [[curl $CURL_OPT tftp://10.1.1.2/flows1.txt -o foo 2>curl3.log]])
4140AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
4141udp,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>),helper=tftp
4142])
4143
4144OVS_TRAFFIC_VSWITCHD_STOP
4145AT_CLEANUP
4146
ee8941ab 4147AT_BANNER([conntrack - NAT])
9ac0aada
JR
4148
4149AT_SETUP([conntrack - simple SNAT])
4150CHECK_CONNTRACK()
4573c42e 4151CHECK_CONNTRACK_NAT()
9ac0aada
JR
4152OVS_TRAFFIC_VSWITCHD_START()
4153
4154ADD_NAMESPACES(at_ns0, at_ns1)
4155
4156ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
4157NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
4158ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
4159
4160dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
4161AT_DATA([flows.txt], [dnl
4162in_port=1,ip,action=ct(commit,zone=1,nat(src=10.1.1.240-10.1.1.255)),2
4163in_port=2,ct_state=-trk,ip,action=ct(table=0,zone=1,nat)
4164in_port=2,ct_state=+trk,ct_zone=1,ip,action=1
4165dnl
4166dnl ARP
4167priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
4168priority=10 arp action=normal
4169priority=0,action=drop
4170dnl
4171dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
4172table=8,reg2=0x0a0101f0/0xfffffff0,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
4173table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
4174dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
4175dnl TPA IP in reg2.
4176dnl Swaps the fields of the ARP message to turn a query to a response.
4177table=10 priority=100 arp xreg0=0 action=normal
4178table=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]]
4179table=10 priority=0 action=drop
4180])
4181
4182AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
4183
4184dnl HTTP requests from p0->p1 should work fine.
7ed40afe 4185OVS_START_L7([at_ns1], [http])
9ac0aada
JR
4186NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 5 -T 1 --retry-connrefused -v -o wget0.log])
4187
13c10e56 4188AT_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/' | uniq], [0], [dnl
420c73b2 4189tcp,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
4190])
4191
4192OVS_TRAFFIC_VSWITCHD_STOP
4193AT_CLEANUP
4194
c0324e37
JR
4195AT_SETUP([conntrack - SNAT with ct_mark change on reply])
4196CHECK_CONNTRACK()
4197CHECK_CONNTRACK_NAT()
4198OVS_TRAFFIC_VSWITCHD_START()
4199
4200ADD_NAMESPACES(at_ns0, at_ns1)
4201
4202ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
ed307567
DB
4203NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address e6:66:c1:11:11:11])
4204NS_CHECK_EXEC([at_ns0], [arp -s 10.1.1.2 e6:66:c1:22:22:22])
4205
c0324e37 4206ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
ed307567
DB
4207NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address e6:66:c1:22:22:22])
4208NS_CHECK_EXEC([at_ns1], [arp -s 10.1.1.240 e6:66:c1:11:11:11])
c0324e37
JR
4209
4210dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
4211AT_DATA([flows.txt], [dnl
ed307567 4212in_port=1,ip,action=ct(commit,zone=1,nat(src=10.1.1.240)),2
c0324e37
JR
4213in_port=2,ct_state=-trk,ip,action=ct(table=0,zone=1,nat)
4214dnl
4215dnl Setting the mark fails if the datapath can't find the existing conntrack
4216dnl entry after NAT has been reversed and the skb was lost due to an upcall.
4217dnl
4218in_port=2,ct_state=+trk,ct_zone=1,ip,action=ct(table=1,commit,zone=1,exec(set_field:1->ct_mark)),1
4219table=1,in_port=2,ct_mark=1,ct_state=+rpl,ct_zone=1,ip,action=1
4220dnl
c0324e37 4221priority=0,action=drop
c0324e37
JR
4222])
4223
4224AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
4225
aeae4330 4226dnl ICMP requests from p0->p1 should work fine.
c0324e37
JR
4227NS_CHECK_EXEC([at_ns0], [ping -c 1 10.1.1.2 | FORMAT_PING], [0], [dnl
42281 packets transmitted, 1 received, 0% packet loss, time 0ms
4229])
4230
4231AT_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
4232icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>,type=8,code=0),reply=(src=10.1.1.2,dst=10.1.1.2XX,id=<cleared>,type=0,code=0),zone=1,mark=1
4233])
4234
4235OVS_TRAFFIC_VSWITCHD_STOP
4236AT_CLEANUP
9ac0aada
JR
4237
4238AT_SETUP([conntrack - SNAT with port range])
4239CHECK_CONNTRACK()
4573c42e 4240CHECK_CONNTRACK_NAT()
9ac0aada
JR
4241OVS_TRAFFIC_VSWITCHD_START()
4242
4243ADD_NAMESPACES(at_ns0, at_ns1)
4244
4245ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
4246NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
4247ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
4248
4249dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
4250AT_DATA([flows.txt], [dnl
4251in_port=1,tcp,action=ct(commit,zone=1,nat(src=10.1.1.240-10.1.1.255:34567-34568,random)),2
4252in_port=2,ct_state=-trk,tcp,tp_dst=34567,action=ct(table=0,zone=1,nat)
4253in_port=2,ct_state=-trk,tcp,tp_dst=34568,action=ct(table=0,zone=1,nat)
4254in_port=2,ct_state=+trk,ct_zone=1,tcp,action=1
4255dnl
4256dnl ARP
4257priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
4258priority=10 arp action=normal
4259priority=0,action=drop
4260dnl
4261dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
4262table=8,reg2=0x0a0101f0/0xfffffff0,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
4263table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
4264dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
4265dnl TPA IP in reg2.
4266dnl Swaps the fields of the ARP message to turn a query to a response.
4267table=10 priority=100 arp xreg0=0 action=normal
4268table=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]]
4269table=10 priority=0 action=drop
4270])
4271
4272AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
4273
4274dnl HTTP requests from p0->p1 should work fine.
7ed40afe 4275OVS_START_L7([at_ns1], [http])
9ac0aada
JR
4276NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 5 -T 1 --retry-connrefused -v -o wget0.log])
4277
13c10e56 4278AT_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/' | uniq], [0], [dnl
420c73b2 4279tcp,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
4280])
4281
4282OVS_TRAFFIC_VSWITCHD_STOP
4283AT_CLEANUP
4284
e32cd4c6 4285AT_SETUP([conntrack - SNAT with port range using ICMP])
4286dnl Check PAT is not attempted on ICMP packets causing corrupted packets.
4287CHECK_CONNTRACK()
4288CHECK_CONNTRACK_NAT()
4289OVS_TRAFFIC_VSWITCHD_START()
4290
4291ADD_NAMESPACES(at_ns0, at_ns1)
4292
4293ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
4294NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
4295ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
4296
4297dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
4298AT_DATA([flows.txt], [dnl
4299in_port=1,ip,action=ct(commit,zone=1,nat(src=10.1.1.240-10.1.1.255:20000)),2
4300in_port=2,ct_state=-trk,ip,action=ct(table=0,zone=1,nat)
4301in_port=2,ct_state=+trk,ct_zone=1,action=1
4302dnl
4303dnl ARP
4304priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
4305priority=10 arp action=normal
4306priority=0,action=drop
4307dnl
4308dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
4309table=8,reg2=0x0a0101f0/0xfffffff0,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
4310table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
4311dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
4312dnl TPA IP in reg2.
4313dnl Swaps the fields of the ARP message to turn a query to a response.
4314table=10 priority=100 arp xreg0=0 action=normal
4315table=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]]
4316table=10 priority=0 action=drop
4317])
4318
4319AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
4320
4321dnl ICMP requests from p0->p1 should work fine.
4322NS_CHECK_EXEC([at_ns0], [ping -c 1 10.1.1.2 | FORMAT_PING], [0], [dnl
43231 packets transmitted, 1 received, 0% packet loss, time 0ms
4324])
4325
4326AT_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
4327icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>,type=8,code=0),reply=(src=10.1.1.2,dst=10.1.1.2XX,id=<cleared>,type=0,code=0),zone=1
4328])
4329
4330OVS_TRAFFIC_VSWITCHD_STOP
4331AT_CLEANUP
4332
32b2c81f
DB
4333AT_SETUP([conntrack - SNAT with port range with exhaustion])
4334CHECK_CONNTRACK()
4335CHECK_CONNTRACK_NAT()
4336OVS_TRAFFIC_VSWITCHD_START()
4337
4338ADD_NAMESPACES(at_ns0, at_ns1)
4339
4340ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
4341NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
4342ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
4343
4344dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
4345AT_DATA([flows.txt], [dnl
4346in_port=1,tcp,action=ct(commit,zone=1,nat(src=10.1.1.240:34568,random)),2
4347in_port=2,ct_state=-trk,tcp,tp_dst=34567,action=ct(table=0,zone=1,nat)
4348in_port=2,ct_state=-trk,tcp,tp_dst=34568,action=ct(table=0,zone=1,nat)
4349in_port=2,ct_state=+trk,ct_zone=1,tcp,action=1
4350dnl
4351dnl ARP
4352priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
4353priority=10 arp action=normal
4354priority=0,action=drop
4355dnl
4356dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
4357table=8,reg2=0x0a0101f0/0xfffffff0,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
4358table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
4359dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
4360dnl TPA IP in reg2.
4361dnl Swaps the fields of the ARP message to turn a query to a response.
4362table=10 priority=100 arp xreg0=0 action=normal
4363table=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]]
4364table=10 priority=0 action=drop
4365])
4366
4367AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
4368
4369dnl HTTP requests from p0->p1 should work fine.
4370OVS_START_L7([at_ns1], [http])
4371NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 1 -T 1 --retry-connrefused -v -o wget0.log])
4372
4373NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 1 -T 1 --retry-connrefused -v -o wget0.log], [4])
4374
4375AT_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/' | uniq], [0], [dnl
4376tcp,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>)
4377])
4378
4379OVS_TRAFFIC_VSWITCHD_STOP(["dnl
4380/Unable to NAT due to tuple space exhaustion - if DoS attack, use firewalling and\/or zone partitioning./d
4381/Dropped .* log messages in last .* seconds \(most recently, .* seconds ago\) due to excessive rate/d"])
4382AT_CLEANUP
9ac0aada
JR
4383
4384AT_SETUP([conntrack - more complex SNAT])
4385CHECK_CONNTRACK()
4573c42e 4386CHECK_CONNTRACK_NAT()
9ac0aada
JR
4387OVS_TRAFFIC_VSWITCHD_START()
4388
4389ADD_NAMESPACES(at_ns0, at_ns1)
4390
4391ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
4392NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
4393ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
4394
4395AT_DATA([flows.txt], [dnl
4396dnl Track all IP traffic, NAT existing connections.
4397priority=100 ip action=ct(table=1,zone=1,nat)
4398dnl
4399dnl Allow ARP, but generate responses for NATed addresses
4400priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
4401priority=10 arp action=normal
4402priority=0 action=drop
4403dnl
4404dnl Allow any traffic from ns0->ns1. SNAT ns0 to 10.1.1.240-10.1.1.255
4405table=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
4406table=1 priority=100 in_port=1 ip ct_state=+trk-new+est action=2
4407dnl Only allow established traffic from ns1->ns0.
4408table=1 priority=100 in_port=2 ip ct_state=+trk-new+est action=1
4409table=1 priority=0 action=drop
4410dnl
4411dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
4412table=8 priority=100 reg2=0x0a0101f0/0xfffffff0 action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
4413dnl Zero result means not found.
4414table=8 priority=0 action=load:0->OXM_OF_PKT_REG0[[]]
4415dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
4416dnl ARP TPA IP in reg2.
4417table=10 priority=100 arp xreg0=0 action=normal
4418dnl Swaps the fields of the ARP message to turn a query to a response.
4419table=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]]
4420table=10 priority=0 action=drop
4421])
4422
4423AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
4424
4425dnl HTTP requests from p0->p1 should work fine.
7ed40afe 4426OVS_START_L7([at_ns1], [http])
9ac0aada
JR
4427NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 5 -T 1 --retry-connrefused -v -o wget0.log])
4428
13c10e56 4429AT_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/' | uniq], [0], [dnl
420c73b2 4430tcp,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
4431])
4432
4433OVS_TRAFFIC_VSWITCHD_STOP
4434AT_CLEANUP
4435
4436AT_SETUP([conntrack - simple DNAT])
4437CHECK_CONNTRACK()
4573c42e 4438CHECK_CONNTRACK_NAT()
9ac0aada
JR
4439OVS_TRAFFIC_VSWITCHD_START()
4440
4441ADD_NAMESPACES(at_ns0, at_ns1)
4442
4443ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
4444ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
4445NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address 80:88:88:88:88:88])
4446
4447dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
4448AT_DATA([flows.txt], [dnl
4449priority=100 in_port=1,ip,nw_dst=10.1.1.64,action=ct(zone=1,nat(dst=10.1.1.2),commit),2
4450priority=10 in_port=1,ip,action=ct(commit,zone=1),2
4451priority=100 in_port=2,ct_state=-trk,ip,action=ct(table=0,nat,zone=1)
4452priority=100 in_port=2,ct_state=+trk+est,ct_zone=1,ip,action=1
4453dnl
4454dnl ARP
4455priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
4456priority=10 arp action=normal
4457priority=0,action=drop
4458dnl
4459dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
4460table=8,reg2=0x0a010140,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
4461dnl Zero result means not found.
4462table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
4463dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
4464dnl TPA IP in reg2.
4465table=10 priority=100 arp xreg0=0 action=normal
4466dnl Swaps the fields of the ARP message to turn a query to a response.
4467table=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]]
4468table=10 priority=0 action=drop
4469])
4470
4471AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
4472
4473dnl Should work with the virtual IP address through NAT
7ed40afe 4474OVS_START_L7([at_ns1], [http])
9ac0aada
JR
4475NS_CHECK_EXEC([at_ns0], [wget 10.1.1.64 -t 5 -T 1 --retry-connrefused -v -o wget0.log])
4476
420c73b2
JR
4477AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.64)], [0], [dnl
4478tcp,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
4479])
4480
4481dnl Should work with the assigned IP address as well
4482NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
4483
420c73b2
JR
4484AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
4485tcp,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
4486])
4487
4488OVS_TRAFFIC_VSWITCHD_STOP
4489AT_CLEANUP
4490
4491AT_SETUP([conntrack - more complex DNAT])
4492CHECK_CONNTRACK()
4573c42e 4493CHECK_CONNTRACK_NAT()
9ac0aada
JR
4494OVS_TRAFFIC_VSWITCHD_START()
4495
4496ADD_NAMESPACES(at_ns0, at_ns1)
4497
4498ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
4499ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
4500NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address 80:88:88:88:88:88])
4501
4502dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
4503AT_DATA([flows.txt], [dnl
4504dnl Track all IP traffic
4505table=0 priority=100 ip action=ct(table=1,zone=1,nat)
4506dnl
4507dnl Allow ARP, but generate responses for NATed addresses
4508table=0 priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
4509table=0 priority=10 arp action=normal
4510table=0 priority=0 action=drop
4511dnl
4512dnl Allow any IP traffic from ns0->ns1. DNAT ns0 from 10.1.1.64 to 10.1.1.2
4513table=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
4514table=1 priority=10 in_port=1 ct_state=+new ip action=ct(commit,zone=1),2
4515table=1 priority=100 in_port=1 ct_state=+est ct_zone=1 action=2
4516dnl Only allow established traffic from ns1->ns0.
4517table=1 priority=100 in_port=2 ct_state=+est ct_zone=1 action=1
4518table=1 priority=0 action=drop
4519dnl
4520dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
4521table=8,reg2=0x0a010140,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
4522dnl Zero result means not found.
4523table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
4524dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
4525dnl TPA IP in reg2.
4526table=10 priority=100 arp xreg0=0 action=normal
4527dnl Swaps the fields of the ARP message to turn a query to a response.
4528table=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]]
4529table=10 priority=0 action=drop
4530])
4531
4532AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
4533
4534dnl Should work with the virtual IP address through NAT
7ed40afe 4535OVS_START_L7([at_ns1], [http])
9ac0aada
JR
4536NS_CHECK_EXEC([at_ns0], [wget 10.1.1.64 -t 5 -T 1 --retry-connrefused -v -o wget0.log])
4537
420c73b2
JR
4538AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.64)], [0], [dnl
4539tcp,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
4540])
4541
4542dnl Should work with the assigned IP address as well
4543NS_CHECK_EXEC([at_ns0], [wget 10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
4544
420c73b2
JR
4545AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
4546tcp,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
4547])
4548
4549OVS_TRAFFIC_VSWITCHD_STOP
4550AT_CLEANUP
4551
4552AT_SETUP([conntrack - ICMP related with NAT])
9c1ab985 4553AT_SKIP_IF([test $HAVE_NC = no])
b020a416 4554AT_SKIP_IF([test $HAVE_TCPDUMP = no])
9ac0aada 4555CHECK_CONNTRACK()
4573c42e 4556CHECK_CONNTRACK_NAT()
9ac0aada
JR
4557OVS_TRAFFIC_VSWITCHD_START()
4558
4559ADD_NAMESPACES(at_ns0, at_ns1)
4560
4561ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
4562NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
4563ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
4564
4565dnl Allow UDP traffic from ns0->ns1. Only allow related ICMP responses back.
4566dnl Make sure ICMP responses are reverse-NATted.
4567AT_DATA([flows.txt], [dnl
4568in_port=1,udp,action=ct(commit,nat(src=10.1.1.240-10.1.1.255),exec(set_field:1->ct_mark)),2
4569in_port=2,icmp,ct_state=-trk,action=ct(table=0,nat)
4570in_port=2,icmp,nw_dst=10.1.1.1,ct_state=+trk+rel,ct_mark=1,action=1
4571dnl
4572dnl ARP
4573priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
4574priority=10 arp action=normal
4575priority=0,action=drop
4576dnl
4577dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
4578table=8,reg2=0x0a0101f0/0xfffffff0,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
4579table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
4580dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
4581dnl TPA IP in reg2.
4582dnl Swaps the fields of the ARP message to turn a query to a response.
4583table=10 priority=100 arp xreg0=0 action=normal
4584table=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]]
4585table=10 priority=0 action=drop
4586])
4587
4588AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
4589
b020a416
DB
4590rm p0.pcap
4591tcpdump -U -i ovs-p0 -w p0.pcap &
4592sleep 1
4593
9ac0aada 4594dnl UDP packets from ns0->ns1 should solicit "destination unreachable" response.
b54971f7 4595NS_CHECK_EXEC([at_ns0], [bash -c "echo a | nc $NC_EOF_OPT -u 10.1.1.2 10000"])
9ac0aada
JR
4596
4597AT_CHECK([ovs-appctl revalidator/purge], [0])
4598AT_CHECK([ovs-ofctl -O OpenFlow15 dump-flows br0 | ofctl_strip | sort | grep -v drop], [0], [dnl
4599 n_packets=1, n_bytes=42, priority=10,arp actions=NORMAL
4600 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
4601 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
4602 n_packets=1, n_bytes=72, ct_state=-trk,icmp,in_port=2 actions=ct(table=0,nat)
4603 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
4604 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]]
4605 table=10, n_packets=1, n_bytes=42, priority=100,arp,reg0=0,reg1=0 actions=NORMAL
4606 table=8, n_packets=1, n_bytes=42, priority=0 actions=set_field:0->xreg0
4607 table=8, n_packets=1, n_bytes=42, reg2=0xa0101f0/0xfffffff0 actions=set_field:0x808888888888->xreg0
4608OFPST_FLOW reply (OF1.5):
4609])
4610
a857bb69
DDP
4611AT_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
4612udp,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
4613])
4614
b020a416
DB
4615AT_CHECK([tcpdump -v "icmp" -r p0.pcap 2>/dev/null | egrep 'wrong|bad'], [1], [ignore-nolog])
4616
9ac0aada
JR
4617OVS_TRAFFIC_VSWITCHD_STOP
4618AT_CLEANUP
4619
2cd20955 4620dnl CHECK_FTP_NAT(TITLE, IP_ADDR, FLOWS, CT_DUMP)
019c73ac 4621dnl
74f205f6
JS
4622dnl Checks the implementation of conntrack with FTP ALGs in combination with
4623dnl NAT, using the provided flow table.
4624m4_define([CHECK_FTP_NAT],
efa29a89 4625 [AT_SETUP([conntrack - FTP $1])
40c7b2fc 4626 AT_SKIP_IF([test $HAVE_FTP = no])
253e4dc0 4627 AT_SKIP_IF([test $HAVE_LFTP = no])
74f205f6
JS
4628 CHECK_CONNTRACK()
4629 CHECK_CONNTRACK_NAT()
fc9a5ee1 4630 CHECK_CONNTRACK_ALG()
019c73ac 4631
74f205f6 4632 OVS_TRAFFIC_VSWITCHD_START()
019c73ac 4633
74f205f6 4634 ADD_NAMESPACES(at_ns0, at_ns1)
019c73ac 4635
74f205f6
JS
4636 ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
4637 NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
4638 ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
019c73ac 4639
74f205f6 4640 dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
2cd20955 4641 AT_DATA([flows.txt], [$3])
019c73ac 4642
74f205f6 4643 AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
019c73ac 4644
7ed40afe 4645 OVS_START_L7([at_ns1], [ftp])
019c73ac 4646
74f205f6 4647 dnl FTP requests from p0->p1 should work fine.
253e4dc0
DM
4648 AT_DATA([ftp.cmd], [dnl
4649set net:max-retries 1
4650set net:timeout 1
4651set ftp:passive-mode off
4652cache off
4653connect ftp://anonymous:@10.1.1.2
4654ls
4655ls
4656ls
4657ls
4658])
4659 NS_CHECK_EXEC([at_ns0], [lftp -f ftp.cmd > lftp.log])
019c73ac 4660
74f205f6 4661 dnl Discards CLOSE_WAIT and CLOSING
2cd20955 4662 AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [$4])
019c73ac 4663
74f205f6
JS
4664 OVS_TRAFFIC_VSWITCHD_STOP
4665 AT_CLEANUP])
019c73ac 4666
efa29a89 4667dnl CHECK_FTP_SNAT_PRE_RECIRC(TITLE, IP_ADDR, IP_ADDR_AS_HEX)
74f205f6
JS
4668dnl
4669dnl Checks the implementation of conntrack with FTP ALGs in combination with
4670dnl NAT, with flow tables that implement the NATing as part of handling of
4671dnl initial incoming packets - ie, the first flow is ct(nat,table=foo).
4672dnl
4673dnl IP_ADDR must specify the NAT address in standard "10.1.1.x" format,
4674dnl and IP_ADDR_AS_HEX must specify the same address as hex, eg 0x0a0101xx.
efa29a89
DM
4675m4_define([CHECK_FTP_SNAT_PRE_RECIRC], [dnl
4676 CHECK_FTP_NAT([SNAT prerecirc $1], [$2], [dnl
9ac0aada
JR
4677dnl track all IP traffic, de-mangle non-NEW connections
4678table=0 in_port=1, ip, action=ct(table=1,nat)
4679table=0 in_port=2, ip, action=ct(table=2,nat)
4680dnl
4681dnl ARP
4682dnl
4683table=0 priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
4684table=0 priority=10 arp action=normal
4685table=0 priority=0 action=drop
4686dnl
4687dnl Table 1: port 1 -> 2
4688dnl
4689dnl Allow new FTP connections. These need to be commited.
74f205f6 4690table=1 ct_state=+new, tcp, tp_dst=21, nw_src=10.1.1.1, action=ct(alg=ftp,commit,nat(src=$2)),2
9ac0aada 4691dnl Allow established TCP connections, make sure they are NATted already.
74f205f6 4692table=1 ct_state=+est, tcp, nw_src=$2, action=2
9ac0aada
JR
4693dnl
4694dnl Table 1: droppers
4695dnl
4696table=1 priority=10, tcp, action=drop
4697table=1 priority=0,action=drop
4698dnl
4699dnl Table 2: port 2 -> 1
4700dnl
4701dnl Allow established TCP connections, make sure they are reverse NATted
4702table=2 ct_state=+est, tcp, nw_dst=10.1.1.1, action=1
4703dnl Allow (new) related (data) connections. These need to be commited.
74f205f6 4704table=2 ct_state=+new+rel, tcp, nw_dst=$2, action=ct(commit,nat),1
9ac0aada
JR
4705dnl Allow related ICMP packets, make sure they are reverse NATted
4706table=2 ct_state=+rel, icmp, nw_dst=10.1.1.1, action=1
4707dnl
4708dnl Table 2: droppers
4709dnl
4710table=2 priority=10, tcp, action=drop
4711table=2 priority=0, action=drop
4712dnl
4713dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
4714dnl
74f205f6 4715table=8,reg2=$3/0xffffffff,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
9ac0aada
JR
4716table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
4717dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
4718dnl TPA IP in reg2.
4719dnl Swaps the fields of the ARP message to turn a query to a response.
4720table=10 priority=100 arp xreg0=0 action=normal
4721table=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]]
4722table=10 priority=0 action=drop
2cd20955
JR
4723], [dnl
4724tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=$2,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>),helper=ftp
4725tcp,orig=(src=10.1.1.2,dst=$2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>)
4726])
9ac0aada
JR
4727])
4728
74f205f6 4729dnl Check that ct(nat,table=foo) works without TCP sequence adjustment.
efa29a89 4730CHECK_FTP_SNAT_PRE_RECIRC([], [10.1.1.9], [0x0a010109])
9ac0aada 4731
74f205f6
JS
4732dnl Check that ct(nat,table=foo) works with TCP sequence adjustment.
4733dnl
4734dnl The FTP PORT command includes the ASCII representation of the address,
4735dnl so when these messages need to be NATed between addresses that have
4736dnl different lengths when represented in ASCII (such as the original address
4737dnl of 10.1.1.1 used in the test and 10.1.1.240 here), the FTP NAT ALG must
4738dnl resize the packet and adjust TCP sequence numbers. This test is kept
4739dnl separate from the above to easier identify issues in this code on different
4740dnl kernels.
efa29a89 4741CHECK_FTP_SNAT_PRE_RECIRC([seqadj], [10.1.1.240], [0x0a0101f0])
74f205f6 4742
efa29a89 4743dnl CHECK_FTP_SNAT_POST_RECIRC(TITLE, IP_ADDR, IP_ADDR_AS_HEX)
74f205f6
JS
4744dnl
4745dnl Checks the implementation of conntrack with FTP ALGs in combination with
4746dnl NAT, with flow tables that implement the NATing after the first round
4747dnl of recirculation - that is, the first flow ct(table=foo) then a subsequent
4748dnl flow will implement the NATing with ct(nat..),output:foo.
4749dnl
4750dnl IP_ADDR must specify the NAT address in standard "10.1.1.x" format,
4751dnl and IP_ADDR_AS_HEX must specify the same address as hex, eg 0x0a0101xx.
efa29a89
DM
4752m4_define([CHECK_FTP_SNAT_POST_RECIRC], [dnl
4753 CHECK_FTP_NAT([SNAT postrecirc $1], [$2], [dnl
9ac0aada
JR
4754dnl track all IP traffic (this includes a helper call to non-NEW packets.)
4755table=0 ip, action=ct(table=1)
4756dnl
4757dnl ARP
4758dnl
4759table=0 priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
4760table=0 priority=10 arp action=normal
4761table=0 priority=0 action=drop
4762dnl
4763dnl Table 1
4764dnl
4765dnl Allow new FTP connections. These need to be commited.
4766dnl This does helper for new packets.
74f205f6 4767table=1 in_port=1 ct_state=+new, tcp, tp_dst=21, action=ct(alg=ftp,commit,nat(src=$2)),2
9ac0aada
JR
4768dnl Allow and NAT established TCP connections
4769table=1 in_port=1 ct_state=+est, tcp, action=ct(nat),2
4770table=1 in_port=2 ct_state=+est, tcp, action=ct(nat),1
4771dnl Allow and NAT (new) related active (data) connections.
4772dnl These need to be commited.
4773table=1 in_port=2 ct_state=+new+rel, tcp, action=ct(commit,nat),1
4774dnl Allow related ICMP packets.
4775table=1 in_port=2 ct_state=+rel, icmp, action=ct(nat),1
4776dnl Drop everything else.
4777table=1 priority=0, action=drop
4778dnl
4779dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
4780dnl
74f205f6 4781table=8,reg2=$3/0xffffffff,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
9ac0aada
JR
4782table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
4783dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
4784dnl TPA IP in reg2.
4785dnl Swaps the fields of the ARP message to turn a query to a response.
4786table=10 priority=100 arp xreg0=0 action=normal
4787table=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]]
4788table=10 priority=0 action=drop
2cd20955
JR
4789], [dnl
4790tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=$2,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>),helper=ftp
4791tcp,orig=(src=10.1.1.2,dst=$2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>)
4792])
9ac0aada
JR
4793])
4794
74f205f6 4795dnl Check that ct(nat,table=foo) works without TCP sequence adjustment.
efa29a89 4796CHECK_FTP_SNAT_POST_RECIRC([], [10.1.1.9], [0x0a010109])
9ac0aada 4797
74f205f6
JS
4798dnl Check that ct(nat,table=foo) works with TCP sequence adjustment.
4799dnl
4800dnl The FTP PORT command includes the ASCII representation of the address,
4801dnl so when these messages need to be NATed between addresses that have
4802dnl different lengths when represented in ASCII (such as the original address
4803dnl of 10.1.1.1 used in the test and 10.1.1.240 here), the FTP NAT ALG must
4804dnl resize the packet and adjust TCP sequence numbers. This test is kept
4805dnl separate from the above to easier identify issues in this code on different
4806dnl kernels.
efa29a89 4807CHECK_FTP_SNAT_POST_RECIRC([seqadj], [10.1.1.240], [0x0a0101f0])
9ac0aada 4808
daf4d3c1 4809
efa29a89 4810dnl CHECK_FTP_SNAT_ORIG_TUPLE(TITLE, IP_ADDR, IP_ADDR_AS_HEX)
daf4d3c1
JR
4811dnl
4812dnl Checks the implementation of conntrack original direction tuple matching
4813dnl with FTP ALGs in combination with NAT, with flow tables that implement
4814dnl the NATing before the first round of recirculation - that is, the first
4815dnl flow ct(nat, table=foo) then a subsequent flow will implement the
4816dnl commiting of NATed and other connections with ct(nat..),output:foo.
4817dnl
4818dnl IP_ADDR must specify the NAT address in standard "10.1.1.x" format,
4819dnl and IP_ADDR_AS_HEX must specify the same address as hex, eg 0x0a0101xx.
efa29a89
DM
4820m4_define([CHECK_FTP_SNAT_ORIG_TUPLE], [dnl
4821 CHECK_FTP_NAT([SNAT orig tuple $1], [$2], [dnl
2cd20955
JR
4822dnl Store zone in reg4 and packet direction in reg3 (IN=1, OUT=2).
4823dnl NAT is only applied to OUT-direction packets, so that ACL
4824dnl processing can be done with non-NATted headers.
4825dnl
4826dnl Track all IP traffic in the IN-direction (IN from Port 1).
4827table=0 in_port=1, ip, action=set_field:1->reg4,set_field:1->reg3,ct(zone=NXM_NX_REG4[[0..15]],table=1)
4828dnl Track all IP traffic in the OUT-direction (OUT to the Port 1).
4829table=0 in_port=2, ip, action=set_field:1->reg4,set_field:2->reg3,ct(zone=NXM_NX_REG4[[0..15]],nat,table=1)
daf4d3c1
JR
4830dnl
4831dnl ARP
4832dnl
4833table=0 priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
4834table=0 priority=10 arp action=normal
4835table=0 priority=0 action=drop
4836dnl
2cd20955
JR
4837dnl Pass tracked traffic through ACL, drop everything else.
4838dnl Non-REPLY/RELATED packets get the ACL lookup with the packet headers
4839dnl in the actual packet direction in reg0 (IN=1, OUT=2). REPLY packets
4840dnl get the ACL lookup using the conntrack tuple and the inverted direction.
4841dnl RELATED packets get ACL lookup using the conntrack tuple in the direction
f51cf36d 4842dnl of the parent connection, as stored in ct_label[0].
2cd20955
JR
4843dnl
4844dnl Incoming non-related packet in the original direction (ACL IN)
4845table=1 reg3=1, ip, ct_state=-rel-rpl+trk-inv action=set_field:1->reg0,resubmit(,3),goto_table:5
4846dnl Incoming non-related reply packet (CT ACL OUT)
4847table=1 reg3=1, ip, ct_state=-rel+rpl+trk-inv action=set_field:2->reg0,resubmit(,3,ct),goto_table:4
4848dnl Outgoing non-related packet (ACL OUT)
4849table=1 reg3=2, ip, ct_state=-rel-rpl+trk-inv action=set_field:2->reg0,resubmit(,3),goto_table:5
4850dnl Outgoing non-related reply packet (CT ACL IN)
4851table=1 reg3=2, ip, ct_state=-rel+rpl+trk-inv action=set_field:1->reg0,resubmit(,3,ct),goto_table:4
daf4d3c1 4852dnl
f51cf36d 4853dnl Related packet (CT ACL in the direction of the parent connection.)
28033773 4854table=1 ip, ct_state=+rel+trk-inv, action=move:NXM_NX_CT_LABEL[[0]]->NXM_NX_REG0[[0]],resubmit(,3,ct),goto_table:4
daf4d3c1
JR
4855dnl Drop everything else.
4856table=1 priority=0, action=drop
4857dnl
2cd20955
JR
4858dnl "ACL table"
4859dnl
4860dnl Stateful accept (1->reg2) all incoming (reg0=1) IP connections with
4861dnl IP source address '10.1.1.1'. Store rule ID (1234) in reg1, verdict
4862dnl in reg2.
4863table=3 priority=10, reg0=1, ip, nw_src=10.1.1.1 action=set_field:1234->reg1,set_field:1->reg2
4864dnl Stateless drop (0->reg2) everything else in both directions. (Rule ID: 1235)
4865table=3 priority=0, action=set_field:1235->reg1,set_field:0->reg2
4866dnl
4867dnl Re-process stateful traffic that was not accepted by a stateful rule as
4868dnl normal traffic in the current direction. This should also delete the
4869dnl now stale conntrack state, so that new state can be created in it's place.
4870dnl
4871dnl Stateful accepts go to next table.
4872table=4 priority=100 reg2=1, action=goto_table:5
4873dnl Everything else is reprocessed disregarding the CT state, using the actual
4874dnl packet direction.
4875table=4 priority=0 action=move:NXM_NX_REG3[[]]->NXM_NX_REG0[[]],resubmit(,3),goto_table:5
4876dnl
4877dnl "ACL verdict processing table."
4878dnl
4879dnl Handle stateful (reg2=1) / stateless (reg2=2) accepts and drops (reg2=0)
4880dnl
4881dnl Drop all non-accepted packets.
4882table=5 reg2=0 priority=1000 action=drop
daf4d3c1 4883dnl
2cd20955
JR
4884dnl Commit new incoming FTP control connections with SNAT range. Must match on
4885dnl 'tcp' when setting 'alg=ftp'. Store the directionality of non-related
28033773
JR
4886dnl connections to ct_label[0] Store the rule ID to ct_label[96..127].
4887table=5 priority=100 reg2=1 reg3=1 ct_state=+new-rel, tcp, tp_dst=21, action=ct(zone=NXM_NX_REG4[[0..15]],alg=ftp,commit,nat(src=$2),exec(move:NXM_NX_REG3[[0]]->NXM_NX_CT_LABEL[[0]],move:NXM_NX_REG1[[0..31]]->NXM_NX_CT_LABEL[[96..127]])),goto_table:6
2cd20955 4888dnl Commit other new incoming non-related IP connections with SNAT range.
28033773 4889table=5 priority=10 reg2=1 reg3=1 ct_state=+new-rel, ip, action=ct(zone=NXM_NX_REG4[[0..15]],commit,nat(src=$2),exec(move:NXM_NX_REG3[[0]]->NXM_NX_CT_LABEL[[0]],move:NXM_NX_REG1[[0..31]]->NXM_NX_CT_LABEL[[96..127]])),goto_table:6
2cd20955
JR
4890dnl Commit non-related outgoing new IP connections with DNAT range.
4891dnl (This should not get any packets in this test.)
28033773 4892table=5 priority=10 reg2=1 reg3=2 ct_state=+new-rel, ip, action=ct(zone=NXM_NX_REG4[[0..15]],commit,nat(dst=$2),exec(move:NXM_NX_REG3[[0]]->NXM_NX_CT_LABEL[[0]],move:NXM_NX_REG1[[0..31]]->NXM_NX_CT_LABEL[[96..127]])),goto_table:6
2cd20955 4893dnl Commit new related connections in either direction, which need 'nat'
28033773 4894dnl and which inherit the label (the direction of the original direction
f51cf36d 4895dnl parent tuple) from the parent connection.
2cd20955
JR
4896table=5 priority=10 reg2=1 ct_state=+new+rel, ip, action=ct(zone=NXM_NX_REG4[[0..15]],commit,nat,exec(move:NXM_NX_REG1[[0..31]]->NXM_NX_CT_LABEL[[96..127]])),goto_table:6
4897dnl
4898dnl NAT incoming non-NEW packets. Outgoing packets were NATted in table 0.
4899dnl
4900table=5 priority=10 ct_state=-new+trk-inv reg3=1 ip, action=ct(zone=NXM_NX_REG4[[0..15]],nat),goto_table:6
4901dnl Forward everything else, including stateless accepts.
4902table=5 priority=0 action=goto_table:6
4903dnl
4904dnl "Forwarding table"
4905dnl
4906table=6 in_port=1 action=2
4907table=6 in_port=2 action=1
daf4d3c1
JR
4908dnl
4909dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
4910dnl
2cd20955 4911table=8,reg2=$3,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
daf4d3c1
JR
4912table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
4913dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
4914dnl TPA IP in reg2.
4915dnl Swaps the fields of the ARP message to turn a query to a response.
4916table=10 priority=100 arp xreg0=0 action=normal
4917table=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]]
4918table=10 priority=0 action=drop
2cd20955 4919], [dnl
28033773
JR
4920tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=$2,sport=<cleared>,dport=<cleared>),zone=1,labels=0x4d2000000000000000000000001,protoinfo=(state=<cleared>),helper=ftp
4921tcp,orig=(src=10.1.1.2,dst=$2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),zone=1,labels=0x4d2000000000000000000000001,protoinfo=(state=<cleared>)
2cd20955 4922])
daf4d3c1
JR
4923])
4924
4925dnl Check that ct(nat,table=foo) works without TCP sequence adjustment with
4926dnl an ACL table based on matching on conntrack original direction tuple only.
efa29a89 4927CHECK_FTP_SNAT_ORIG_TUPLE([], [10.1.1.9], [0x0a010109])
daf4d3c1
JR
4928
4929dnl Check that ct(nat,table=foo) works with TCP sequence adjustment with
4930dnl an ACL table based on matching on conntrack original direction tuple only.
efa29a89 4931CHECK_FTP_SNAT_ORIG_TUPLE([seqadj], [10.1.1.240], [0x0a0101f0])
daf4d3c1 4932
efa29a89 4933AT_SETUP([conntrack - IPv4 FTP Passive with SNAT])
200a9af9
DB
4934AT_SKIP_IF([test $HAVE_FTP = no])
4935CHECK_CONNTRACK()
4936CHECK_CONNTRACK_NAT()
4937CHECK_CONNTRACK_ALG()
4938
4939OVS_TRAFFIC_VSWITCHD_START()
4940
4941ADD_NAMESPACES(at_ns0, at_ns1)
4942
4943ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
4944NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address e6:66:c1:11:11:11])
4945NS_CHECK_EXEC([at_ns0], [arp -s 10.1.1.2 e6:66:c1:22:22:22])
4946
4947ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
4948NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address e6:66:c1:22:22:22])
4949NS_CHECK_EXEC([at_ns1], [arp -s 10.1.1.1 e6:66:c1:11:11:11])
4950NS_CHECK_EXEC([at_ns1], [arp -s 10.1.1.240 e6:66:c1:11:11:11])
4951
4952dnl Allow any traffic from ns0->ns1.
4953AT_DATA([flows.txt], [dnl
4954dnl track all IPv4 traffic and NAT any established traffic.
4955table=0 priority=10 ip, action=ct(nat,table=1)
4956table=0 priority=0 action=drop
4957dnl
4958dnl Table 1
4959dnl
4960dnl Allow new FTP control connections.
4961table=1 in_port=1 ct_state=+new tcp nw_src=10.1.1.1 tp_dst=21 action=ct(alg=ftp,commit,nat(src=10.1.1.240)),2
4962dnl Allow related TCP connections from port 1.
4963table=1 in_port=1 ct_state=+new+rel tcp nw_src=10.1.1.1 action=ct(commit,nat),2
4964dnl Allow established TCP connections both ways, post-NAT match.
4965table=1 in_port=1 ct_state=+est tcp nw_src=10.1.1.240 action=2
4966table=1 in_port=2 ct_state=+est tcp nw_dst=10.1.1.1 action=1
4967
4968dnl Allow ICMP both ways.
4969table=1 priority=100 in_port=1 icmp, action=2
4970table=1 priority=100 in_port=2 icmp, action=1
4971table=1 priority=0, action=drop
4972])
4973
4974AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
4975
4976dnl Check that the stacks working to avoid races.
4977OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.1.1.2 >/dev/null])
4978
4979OVS_START_L7([at_ns1], [ftp])
4980
4981dnl FTP requests from p0->p1 should work fine.
4982NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
4983
4984dnl Discards CLOSE_WAIT and CLOSING
4985AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
4986tcp,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>)
4987tcp,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
4988])
4989
4990OVS_TRAFFIC_VSWITCHD_STOP
4991AT_CLEANUP
4992
efa29a89
DM
4993AT_SETUP([conntrack - IPv4 FTP Passive with DNAT])
4994AT_SKIP_IF([test $HAVE_FTP = no])
4995CHECK_CONNTRACK()
4996CHECK_CONNTRACK_NAT()
4997CHECK_CONNTRACK_ALG()
4998
4999OVS_TRAFFIC_VSWITCHD_START()
5000
5001ADD_NAMESPACES(at_ns0, at_ns1)
5002
5003ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
5004NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address e6:66:c1:11:11:11])
5005NS_CHECK_EXEC([at_ns0], [arp -s 10.1.1.2 e6:66:c1:22:22:22])
5006NS_CHECK_EXEC([at_ns0], [arp -s 10.1.1.240 e6:66:c1:22:22:22])
5007
5008ADD_VETH(p1, at_ns1, br0, "10.1.1.240/24")
5009NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address e6:66:c1:22:22:22])
5010NS_CHECK_EXEC([at_ns1], [arp -s 10.1.1.1 e6:66:c1:11:11:11])
5011
5012dnl Allow any traffic from ns0->ns1.
5013AT_DATA([flows.txt], [dnl
5014dnl track all IPv4 traffic and NAT any established traffic.
5015table=0 priority=10 ip, action=ct(nat,table=1)
5016table=0 priority=0 action=drop
5017dnl
5018dnl Table 1
5019dnl
5020dnl Allow new FTP control connections.
5021table=1 in_port=1 ct_state=+new tcp nw_src=10.1.1.1 tp_dst=21 action=ct(alg=ftp,commit,nat(dst=10.1.1.240)),2
5022dnl Allow related TCP connections from port 1.
5023table=1 in_port=1 ct_state=+new+rel tcp nw_src=10.1.1.1 action=ct(commit,nat),2
5024dnl Allow established TCP connections both ways, post-NAT match.
5025table=1 in_port=1 ct_state=+est tcp nw_dst=10.1.1.240 action=2
5026table=1 in_port=2 ct_state=+est tcp nw_dst=10.1.1.1 action=1
5027
5028dnl Allow ICMP both ways.
5029table=1 priority=100 in_port=1 icmp, action=2
5030table=1 priority=100 in_port=2 icmp, action=1
5031table=1 priority=0, action=drop
5032])
5033
5034AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
5035
5036dnl Check that the stacks working to avoid races.
5037OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.1.1.240 >/dev/null])
5038
5039OVS_START_L7([at_ns1], [ftp])
5040
5041dnl FTP requests from p0->p1 should work fine.
5042NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
5043
5044dnl Discards CLOSE_WAIT and CLOSING
5045AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
5046tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.240,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>)
5047tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.240,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>),helper=ftp
5048])
5049
5050OVS_TRAFFIC_VSWITCHD_STOP
5051AT_CLEANUP
5052
cd7c99a6
DB
5053AT_SETUP([conntrack - IPv4 FTP Passive with DNAT 2])
5054AT_SKIP_IF([test $HAVE_FTP = no])
5055CHECK_CONNTRACK()
5056CHECK_CONNTRACK_NAT()
5057CHECK_CONNTRACK_ALG()
5058
5059OVS_TRAFFIC_VSWITCHD_START()
5060
5061ADD_NAMESPACES(at_ns0, at_ns1)
5062
5063ADD_VETH(p0, at_ns0, br0, "10.1.1.1/16")
5064NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address e6:66:c1:11:11:11])
5065NS_CHECK_EXEC([at_ns0], [arp -s 10.1.1.200 e6:66:c1:22:22:22])
5066NS_CHECK_EXEC([at_ns0], [arp -s 10.1.100.1 e6:66:c1:22:22:22])
5067
5068ADD_VETH(p1, at_ns1, br0, "10.1.100.1/16")
5069NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address e6:66:c1:22:22:22])
5070NS_CHECK_EXEC([at_ns1], [arp -s 10.1.1.1 e6:66:c1:11:11:11])
5071
5072dnl Allow any traffic from ns0->ns1.
5073AT_DATA([flows.txt], [dnl
5074dnl track all IPv4 traffic and NAT any established traffic.
5075table=0 priority=10 ip, action=ct(nat,table=1)
5076table=0 priority=0 action=drop
5077dnl
5078dnl Table 1
5079dnl
5080dnl Allow new FTP control connections.
5081table=1 in_port=1 ct_state=+new tcp nw_src=10.1.1.1 tp_dst=21 action=ct(alg=ftp,commit,nat(dst=10.1.100.1)),2
5082dnl Allow related TCP connections from port 1.
5083table=1 in_port=1 ct_state=+new+rel tcp nw_src=10.1.1.1 action=ct(commit,nat),2
5084dnl Allow established TCP connections both ways, post-NAT match.
5085table=1 in_port=1 ct_state=+est tcp nw_dst=10.1.100.1 action=2
5086table=1 in_port=2 ct_state=+est tcp nw_dst=10.1.1.1 action=1
5087
5088dnl Allow ICMP both ways.
5089table=1 priority=100 in_port=1 icmp, action=2
5090table=1 priority=100 in_port=2 icmp, action=1
5091table=1 priority=0, action=drop
5092])
5093
5094AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
5095
5096dnl Check that the stacks working to avoid races.
5097OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.1.100.1 >/dev/null])
5098
5099OVS_START_L7([at_ns1], [ftp])
5100
5101dnl FTP requests from p0->p1 should work fine.
5102NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.200 -t 3 -T 1 --retry-connrefused -v -o wget0.log])
5103
5104dnl Discards CLOSE_WAIT and CLOSING
5105AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.200)], [0], [dnl
5106tcp,orig=(src=10.1.1.1,dst=10.1.1.200,sport=<cleared>,dport=<cleared>),reply=(src=10.1.100.1,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>)
5107tcp,orig=(src=10.1.1.1,dst=10.1.1.200,sport=<cleared>,dport=<cleared>),reply=(src=10.1.100.1,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>),helper=ftp
5108])
5109
5110OVS_TRAFFIC_VSWITCHD_STOP
5111AT_CLEANUP
5112
efa29a89
DM
5113AT_SETUP([conntrack - IPv4 FTP Active with DNAT])
5114AT_SKIP_IF([test $HAVE_FTP = no])
5115CHECK_CONNTRACK()
5116CHECK_CONNTRACK_NAT()
5117CHECK_CONNTRACK_ALG()
5118
5119OVS_TRAFFIC_VSWITCHD_START()
5120
5121ADD_NAMESPACES(at_ns0, at_ns1)
5122
5123ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
5124NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address e6:66:c1:11:11:11])
5125NS_CHECK_EXEC([at_ns0], [arp -s 10.1.1.2 e6:66:c1:22:22:22])
5126NS_CHECK_EXEC([at_ns0], [arp -s 10.1.1.240 e6:66:c1:22:22:22])
5127
5128ADD_VETH(p1, at_ns1, br0, "10.1.1.240/24")
5129NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address e6:66:c1:22:22:22])
5130NS_CHECK_EXEC([at_ns1], [arp -s 10.1.1.1 e6:66:c1:11:11:11])
5131
5132dnl Allow any traffic from ns0->ns1.
5133AT_DATA([flows.txt], [dnl
5134dnl track all IPv4 traffic and NAT any established traffic.
5135table=0 priority=10 ip, action=ct(nat,table=1)
5136table=0 priority=0 action=drop
5137dnl
5138dnl Table 1
5139dnl
5140dnl Allow new FTP control connections.
5141table=1 in_port=1 ct_state=+new tcp nw_src=10.1.1.1 tp_dst=21 action=ct(alg=ftp,commit,nat(dst=10.1.1.240)),2
5142dnl Allow related TCP connections from port 1.
5143table=1 in_port=2 ct_state=+new+rel tcp nw_src=10.1.1.240 action=ct(commit,nat),1
5144dnl Allow established TCP connections both ways, post-NAT match.
5145table=1 in_port=1 ct_state=+est tcp nw_dst=10.1.1.240 action=2
5146table=1 in_port=2 ct_state=+est tcp nw_dst=10.1.1.1 action=1
5147
5148dnl Allow ICMP both ways.
5149table=1 priority=100 in_port=1 icmp, action=2
5150table=1 priority=100 in_port=2 icmp, action=1
5151table=1 priority=0, action=drop
5152])
5153
5154AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
5155
5156dnl Check that the stacks working to avoid races.
5157OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.1.1.240 >/dev/null])
5158
5159OVS_START_L7([at_ns1], [ftp])
5160
5161dnl FTP requests from p0->p1 should work fine.
5162NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.1.2 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v -o wget0.log])
5163
5164dnl Discards CLOSE_WAIT and CLOSING
5165AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
5166tcp,orig=(src=10.1.1.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.240,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>),helper=ftp
5167tcp,orig=(src=10.1.1.240,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>)
5168])
5169
5170OVS_TRAFFIC_VSWITCHD_STOP
5171AT_CLEANUP
5172
5173AT_SETUP([conntrack - IPv4 FTP Active with DNAT with reverse skew])
5174AT_SKIP_IF([test $HAVE_FTP = no])
5175CHECK_CONNTRACK()
5176CHECK_CONNTRACK_NAT()
5177CHECK_CONNTRACK_ALG()
5178
5179OVS_TRAFFIC_VSWITCHD_START()
5180
5181ADD_NAMESPACES(at_ns0, at_ns1)
5182
cd7c99a6 5183ADD_VETH(p0, at_ns0, br0, "10.1.1.1/16")
efa29a89
DM
5184NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address e6:66:c1:11:11:11])
5185NS_CHECK_EXEC([at_ns0], [arp -s 10.1.1.2 e6:66:c1:22:22:22])
cd7c99a6 5186NS_CHECK_EXEC([at_ns0], [arp -s 10.1.120.240 e6:66:c1:22:22:22])
efa29a89 5187
cd7c99a6 5188ADD_VETH(p1, at_ns1, br0, "10.1.1.2/16")
efa29a89
DM
5189NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address e6:66:c1:22:22:22])
5190NS_CHECK_EXEC([at_ns1], [arp -s 10.1.1.1 e6:66:c1:11:11:11])
5191
5192dnl Allow any traffic from ns0->ns1.
5193AT_DATA([flows.txt], [dnl
5194dnl track all IPv4 traffic and NAT any established traffic.
5195table=0 priority=10 ip, action=ct(nat,table=1)
5196table=0 priority=0 action=drop
5197dnl
5198dnl Table 1
5199dnl
5200dnl Allow new FTP control connections.
5201table=1 in_port=1 ct_state=+new tcp nw_src=10.1.1.1 tp_dst=21 action=ct(alg=ftp,commit,nat(dst=10.1.1.2)),2
5202dnl Allow related TCP connections from port 1.
5203table=1 in_port=2 ct_state=+new+rel tcp nw_src=10.1.1.2 action=ct(commit,nat),1
5204dnl Allow established TCP connections both ways, post-NAT match.
5205table=1 in_port=1 ct_state=+est tcp nw_dst=10.1.1.2 action=2
5206table=1 in_port=2 ct_state=+est tcp nw_dst=10.1.1.1 action=1
5207
5208dnl Allow ICMP both ways.
5209table=1 priority=100 in_port=1 icmp, action=2
5210table=1 priority=100 in_port=2 icmp, action=1
5211table=1 priority=0, action=drop
5212])
5213
5214AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
5215
5216dnl Check that the stacks working to avoid races.
5217OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.1.1.2 >/dev/null])
5218
5219OVS_START_L7([at_ns1], [ftp])
5220
5221dnl FTP requests from p0->p1 should work fine.
cd7c99a6 5222NS_CHECK_EXEC([at_ns0], [wget ftp://10.1.120.240 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v -o wget0.log])
efa29a89
DM
5223
5224dnl Discards CLOSE_WAIT and CLOSING
cd7c99a6
DB
5225AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.120.240)], [0], [dnl
5226tcp,orig=(src=10.1.1.1,dst=10.1.120.240,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>),helper=ftp
5227tcp,orig=(src=10.1.1.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.1,dst=10.1.120.240,sport=<cleared>,dport=<cleared>),protoinfo=(state=<cleared>)
efa29a89
DM
5228])
5229
5230OVS_TRAFFIC_VSWITCHD_STOP
5231AT_CLEANUP
5232
b020a416 5233AT_SETUP([conntrack - IPv6 HTTP with SNAT])
9ac0aada 5234CHECK_CONNTRACK()
4573c42e 5235CHECK_CONNTRACK_NAT()
9ac0aada
JR
5236OVS_TRAFFIC_VSWITCHD_START()
5237
5238ADD_NAMESPACES(at_ns0, at_ns1)
5239
5240ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
5241NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
5242ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
5243NS_CHECK_EXEC([at_ns1], [ip -6 neigh add fc00::240 lladdr 80:88:88:88:88:88 dev p1])
b020a416 5244NS_CHECK_EXEC([at_ns1], [ip -6 neigh add fc00::241 lladdr 80:88:88:88:88:88 dev p1])
9ac0aada
JR
5245
5246dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
5247AT_DATA([flows.txt], [dnl
5248priority=1,action=drop
5249priority=10,icmp6,action=normal
b020a416 5250priority=100,in_port=1,ip6,action=ct(commit,nat(src=fc00::240-fc00::241)),2
9ac0aada
JR
5251priority=100,in_port=2,ct_state=-trk,ip6,action=ct(nat,table=0)
5252priority=100,in_port=2,ct_state=+trk+est,ip6,action=1
5253priority=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
b020a416 5254priority=200,in_port=2,ct_state=+trk+new,icmp6,icmpv6_code=0,icmpv6_type=135,nd_target=fc00::241,action=ct(commit,nat(dst=fc00::1)),1
9ac0aada
JR
5255])
5256
5257AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
5258
c10840ff
JS
5259dnl Linux seems to take a little time to get its IPv6 stack in order. Without
5260dnl waiting, we get occasional failures due to the following error:
9ac0aada 5261dnl "connect: Cannot assign requested address"
c10840ff 5262OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
9ac0aada
JR
5263
5264dnl HTTP requests from ns0->ns1 should work fine.
7ed40afe 5265OVS_START_L7([at_ns1], [http6])
9ac0aada
JR
5266
5267NS_CHECK_EXEC([at_ns0], [wget http://[[fc00::2]] -t 3 -T 1 --retry-connrefused -v -o wget0.log])
5268
5269dnl HTTP requests from ns1->ns0 should fail due to network failure.
5270dnl Try 3 times, in 1 second intervals.
7ed40afe 5271OVS_START_L7([at_ns0], [http6])
9ac0aada
JR
5272NS_CHECK_EXEC([at_ns1], [wget http://[[fc00::1]] -t 3 -T 1 -v -o wget1.log], [4])
5273
5274OVS_TRAFFIC_VSWITCHD_STOP
5275AT_CLEANUP
5276
b020a416
DB
5277AT_SETUP([conntrack - IPv6 HTTP with DNAT])
5278CHECK_CONNTRACK()
5279CHECK_CONNTRACK_NAT()
5280OVS_TRAFFIC_VSWITCHD_START()
5281
5282ADD_NAMESPACES(at_ns0, at_ns1)
5283
5284ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
5285ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
5286NS_CHECK_EXEC([at_ns0], [ip -6 link set dev p0 address 80:88:88:88:88:77])
5287NS_CHECK_EXEC([at_ns1], [ip -6 link set dev p1 address 80:88:88:88:88:88])
5288NS_CHECK_EXEC([at_ns0], [ip -6 neigh add fc00::240 lladdr 80:88:88:88:88:88 dev p0])
5289NS_CHECK_EXEC([at_ns1], [ip -6 neigh add fc00::1 lladdr 80:88:88:88:88:77 dev p1])
5290
5291dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
5292AT_DATA([flows.txt], [dnl
5293priority=100 in_port=1,ip6,ipv6_dst=fc00::240,action=ct(zone=1,nat(dst=fc00::2),commit),2
5294priority=100 in_port=2,ct_state=-trk,ip6,action=ct(table=0,nat,zone=1)
5295priority=100 in_port=2,ct_state=+trk+est,ct_zone=1,ip6,action=1
5296])
5297
5298AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
5299
5300dnl Linux seems to take a little time to get its IPv6 stack in order. Without
5301dnl waiting, we get occasional failures due to the following error:
5302dnl "connect: Cannot assign requested address"
5303OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::240])
5304
5305NS_CHECK_EXEC([at_ns0], [ping6 -q -c 3 -i 0.3 -w 2 fc00::240 | FORMAT_PING], [0], [dnl
53063 packets transmitted, 3 received, 0% packet loss, time 0ms
5307])
5308
5309dnl Should work with the virtual IP address through NAT
5310OVS_START_L7([at_ns1], [http6])
5311NS_CHECK_EXEC([at_ns0], [wget http://[[fc00::240]] -t 5 -T 1 --retry-connrefused -v -o wget0.log])
5312
5313AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::1)], [0], [dnl
5314icmpv6,orig=(src=fc00::1,dst=fc00::240,id=<cleared>,type=128,code=0),reply=(src=fc00::2,dst=fc00::1,id=<cleared>,type=129,code=0),zone=1
5315tcp,orig=(src=fc00::1,dst=fc00::240,sport=<cleared>,dport=<cleared>),reply=(src=fc00::2,dst=fc00::1,sport=<cleared>,dport=<cleared>),zone=1,protoinfo=(state=<cleared>)
5316])
5317
5318OVS_TRAFFIC_VSWITCHD_STOP
5319AT_CLEANUP
5320
5321AT_SETUP([conntrack - IPv6 ICMP6 Related with SNAT])
5322AT_SKIP_IF([test $HAVE_TCPDUMP = no])
5323CHECK_CONNTRACK()
5324CHECK_CONNTRACK_NAT()
5325OVS_TRAFFIC_VSWITCHD_START()
5326
5327ADD_NAMESPACES(at_ns0, at_ns1)
5328
5329ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
5330ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
5331NS_CHECK_EXEC([at_ns0], [ip -6 link set dev p0 address 80:88:88:88:88:77])
5332NS_CHECK_EXEC([at_ns1], [ip -6 link set dev p1 address 80:88:88:88:88:88])
5333
5334NS_CHECK_EXEC([at_ns0], [ip -6 neigh add fc00::2 lladdr 80:88:88:88:88:88 dev p0])
5335NS_CHECK_EXEC([at_ns0], [ip -6 neigh add fc00::3 lladdr 80:88:88:88:88:88 dev p0])
5336NS_CHECK_EXEC([at_ns1], [ip -6 neigh add fc00::240 lladdr 80:88:88:88:88:77 dev p1])
5337NS_CHECK_EXEC([at_ns1], [ip -6 neigh add fc00::1 lladdr 80:88:88:88:88:77 dev p1])
5338
5339NS_CHECK_EXEC([at_ns0], [ip -6 route add default via fc00::2])
5340
5341dnl Allow any traffic from ns0->ns1. Only allow nd, return traffic from ns1->ns0.
5342AT_DATA([flows.txt], [dnl
5343priority=100 in_port=1,ip6,action=ct(nat(src=fc00::240),commit),2
5344priority=100 in_port=2,ct_state=-trk,ip6,action=ct(table=0,nat)
5345priority=100 in_port=2,ct_state=+trk+est,ip6,action=1
5346priority=100 in_port=2,ct_state=+trk+rel,ip6,action=1
5347])
5348
5349AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
5350
5351dnl Linux seems to take a little time to get its IPv6 stack in order. Without
5352dnl waiting, we get occasional failures due to the following error:
5353dnl "connect: Cannot assign requested address"
5354OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2])
5355
5356AT_CHECK([ovs-appctl dpctl/flush-conntrack])
5357
5358rm p0.pcap
5359tcpdump -U -i ovs-p0 -w p0.pcap &
5360sleep 1
5361
5362dnl UDP packets from ns0->ns1 should solicit "destination unreachable" response.
5363NS_CHECK_EXEC([at_ns0], [bash -c "echo a | nc -6 $NC_EOF_OPT -u fc00::2 1"])
5364
5365AT_CHECK([tcpdump -v "icmp6" -r p0.pcap 2>/dev/null | egrep 'wrong|bad'], [1], [ignore-nolog])
5366
5367AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
5368udp,orig=(src=fc00::1,dst=fc00::2,sport=<cleared>,dport=<cleared>),reply=(src=fc00::2,dst=fc00::240,sport=<cleared>,dport=<cleared>)
5369])
5370
5371OVS_TRAFFIC_VSWITCHD_STOP
5372AT_CLEANUP
9ac0aada 5373
efa29a89 5374AT_SETUP([conntrack - IPv6 FTP with SNAT])
40c7b2fc 5375AT_SKIP_IF([test $HAVE_FTP = no])
9ac0aada 5376CHECK_CONNTRACK()
4573c42e 5377CHECK_CONNTRACK_NAT()
fc9a5ee1
DB
5378CHECK_CONNTRACK_ALG()
5379
9ac0aada
JR
5380OVS_TRAFFIC_VSWITCHD_START()
5381
5382ADD_NAMESPACES(at_ns0, at_ns1)
5383
5384ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
5385NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
5386ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
5387dnl Would be nice if NAT could translate neighbor discovery messages, too.
5388NS_CHECK_EXEC([at_ns1], [ip -6 neigh add fc00::240 lladdr 80:88:88:88:88:88 dev p1])
5389
5390dnl Allow any traffic from ns0->ns1.
5391dnl Only allow nd, return traffic from ns1->ns0.
5392AT_DATA([flows.txt], [dnl
9ac0aada
JR
5393dnl track all IPv6 traffic (this includes NAT & help to non-NEW packets.)
5394table=0 priority=10 ip6, action=ct(nat,table=1)
5395table=0 priority=0 action=drop
5396dnl
5397dnl Table 1
5398dnl
5399dnl Allow new TCPv6 FTP control connections.
5400table=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
5401dnl Allow related TCPv6 connections from port 2 to the NATted address.
5402table=1 in_port=2 ct_state=+new+rel tcp6 ipv6_dst=fc00::240 action=ct(commit,nat),1
5403dnl Allow established TCPv6 connections both ways, enforce NATting
5404table=1 in_port=1 ct_state=+est tcp6 ipv6_src=fc00::240 action=2
5405table=1 in_port=2 ct_state=+est tcp6 ipv6_dst=fc00::1 action=1
daf4d3c1
JR
5406dnl Allow other ICMPv6 both ways (without commit).
5407table=1 priority=100 in_port=1 icmp6, action=2
5408table=1 priority=100 in_port=2 icmp6, action=1
9ac0aada
JR
5409dnl Drop everything else.
5410table=1 priority=0, action=drop
5411])
5412
5413AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
5414
c10840ff
JS
5415dnl Linux seems to take a little time to get its IPv6 stack in order. Without
5416dnl waiting, we get occasional failures due to the following error:
5417dnl "connect: Cannot assign requested address"
5418OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2 >/dev/null])
5419
7ed40afe 5420OVS_START_L7([at_ns1], [ftp])
9ac0aada
JR
5421
5422dnl FTP requests from p0->p1 should work fine.
4fee8b13 5423NS_CHECK_EXEC([at_ns0], [wget ftp://[[fc00::2]] -6 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v --server-response --no-remove-listing -o wget0.log -d])
9ac0aada 5424
a857bb69 5425dnl Discards CLOSE_WAIT and CLOSING
420c73b2
JR
5426AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
5427tcp,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
5428tcp,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
5429])
5430
5431OVS_TRAFFIC_VSWITCHD_STOP
5432AT_CLEANUP
2c66ebe4 5433
efa29a89 5434AT_SETUP([conntrack - IPv6 FTP Passive with SNAT])
200a9af9
DB
5435AT_SKIP_IF([test $HAVE_FTP = no])
5436CHECK_CONNTRACK()
5437CHECK_CONNTRACK_NAT()
5438CHECK_CONNTRACK_ALG()
5439
5440OVS_TRAFFIC_VSWITCHD_START()
5441
5442ADD_NAMESPACES(at_ns0, at_ns1)
5443
5444ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
5445NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
5446ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
5447NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address 80:88:88:88:88:99])
5448NS_CHECK_EXEC([at_ns0], [ip -6 neigh add fc00::2 lladdr 80:88:88:88:88:99 dev p0])
5449NS_CHECK_EXEC([at_ns1], [ip -6 neigh add fc00::240 lladdr 80:88:88:88:88:88 dev p1])
5450
5451dnl Allow any traffic from ns0->ns1.
5452dnl Only allow nd, return traffic from ns1->ns0.
5453AT_DATA([flows.txt], [dnl
5454dnl track all IPv6 traffic (this includes NAT & help to non-NEW packets.)
5455table=0 priority=10 ip6, action=ct(nat,table=1)
5456table=0 priority=0 action=drop
5457dnl
5458dnl Table 1
5459dnl
5460dnl Allow new TCPv6 FTP control connections.
5461table=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
5462dnl Allow related TCPv6 connections from port 1.
5463table=1 in_port=1 ct_state=+new+rel tcp6 ipv6_dst=fc00::2 action=ct(commit,nat),2
5464dnl Allow established TCPv6 connections both ways, enforce NATting
5465table=1 in_port=1 ct_state=+est tcp6 ipv6_src=fc00::240 action=2
5466table=1 in_port=2 ct_state=+est tcp6 ipv6_dst=fc00::1 action=1
5467dnl Allow other ICMPv6 both ways (without commit).
5468table=1 priority=100 in_port=1 icmp6, action=2
5469table=1 priority=100 in_port=2 icmp6, action=1
5470dnl Drop everything else.
5471table=1 priority=0, action=drop
5472])
5473
5474AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
5475
5476dnl Linux seems to take a little time to get its IPv6 stack in order. Without
5477dnl waiting, we get occasional failures due to the following error:
5478dnl "connect: Cannot assign requested address"
5479OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2 >/dev/null])
5480
5481OVS_START_L7([at_ns1], [ftp])
5482
5483dnl FTP requests from p0->p1 should work fine.
5484NS_CHECK_EXEC([at_ns0], [wget ftp://[[fc00::2]] -6 -t 3 -T 1 --retry-connrefused -v --server-response --no-remove-listing -o wget0.log -d])
5485
5486dnl Discards CLOSE_WAIT and CLOSING
5487AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
5488tcp,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>)
5489tcp,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
5490])
5491
5492OVS_TRAFFIC_VSWITCHD_STOP
5493AT_CLEANUP
daf4d3c1 5494
efa29a89 5495AT_SETUP([conntrack - IPv6 FTP with SNAT - orig tuple])
daf4d3c1
JR
5496AT_SKIP_IF([test $HAVE_FTP = no])
5497CHECK_CONNTRACK()
5498CHECK_CONNTRACK_NAT()
aeae4330 5499CHECK_CONNTRACK_ALG()
daf4d3c1
JR
5500OVS_TRAFFIC_VSWITCHD_START()
5501
5502ADD_NAMESPACES(at_ns0, at_ns1)
5503
5504ADD_VETH(p0, at_ns0, br0, "fc00::1/96")
5505NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address 80:88:88:88:88:88])
5506ADD_VETH(p1, at_ns1, br0, "fc00::2/96")
5507dnl Would be nice if NAT could translate neighbor discovery messages, too.
5508NS_CHECK_EXEC([at_ns1], [ip -6 neigh add fc00::240 lladdr 80:88:88:88:88:88 dev p1])
5509
5510dnl Allow any traffic from ns0->ns1.
5511dnl Only allow nd, return traffic from ns1->ns0.
5512AT_DATA([flows.txt], [dnl
5513dnl track all IPv6 traffic (this includes NAT & help to non-NEW packets.)
5514table=0 priority=10 ip6, action=ct(nat,table=1)
5515table=0 priority=0 action=drop
5516dnl
5517dnl Table 1
5518dnl
5519dnl Allow other ICMPv6 both ways (without commit).
5520table=1 priority=100 in_port=1 icmp6, action=2
5521table=1 priority=100 in_port=2 icmp6, action=1
5522dnl Allow new TCPv6 FTP control connections.
5523table=1 priority=10 in_port=1 ct_state=+new+trk-inv tcp6 ct_nw_proto=6 ct_ipv6_src=fc00::1 ct_tp_dst=21 action=ct(alg=ftp,commit,nat(src=fc00::240)),2
5524dnl Allow related TCPv6 connections from port 2 to the NATted address.
5525table=1 priority=10 in_port=2 ct_state=+new+rel+trk-inv ipv6 ct_nw_proto=6 ct_ipv6_src=fc00::1 ct_tp_dst=21 action=ct(commit,nat),1
5526dnl Allow established TCPv6 connections both ways, enforce NATting
5527table=1 priority=10 in_port=1 ct_state=+est+trk-inv ipv6 ct_nw_proto=6 ct_ipv6_src=fc00::1 ct_tp_dst=21 action=2
5528table=1 priority=10 in_port=2 ct_state=+est+trk-inv ipv6 ct_nw_proto=6 ct_ipv6_src=fc00::1 ct_tp_dst=21 action=1
5529dnl Drop everything else.
5530table=1 priority=0, action=drop
5531])
5532
5533AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
5534
5535dnl Linux seems to take a little time to get its IPv6 stack in order. Without
5536dnl waiting, we get occasional failures due to the following error:
5537dnl "connect: Cannot assign requested address"
5538OVS_WAIT_UNTIL([ip netns exec at_ns0 ping6 -c 1 fc00::2 >/dev/null])
5539
1ca0323e 5540NETNS_DAEMONIZE([at_ns1], [[$PYTHON3 $srcdir/test-l7.py ftp]], [ftp0.pid])
daf4d3c1
JR
5541OVS_WAIT_UNTIL([ip netns exec at_ns1 netstat -l | grep ftp])
5542
5543dnl FTP requests from p0->p1 should work fine.
5544NS_CHECK_EXEC([at_ns0], [wget ftp://[[fc00::2]] -6 --no-passive-ftp -t 3 -T 1 --retry-connrefused -v --server-response --no-remove-listing -o wget0.log -d])
5545
5546dnl Discards CLOSE_WAIT and CLOSING
5547AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(fc00::2)], [0], [dnl
5548tcp,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
5549tcp,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>)
5550])
5551
5552OVS_TRAFFIC_VSWITCHD_STOP
5553AT_CLEANUP
5554
efa29a89 5555AT_SETUP([conntrack - IPv4 TFTP with SNAT])
8fc6257b 5556AT_SKIP_IF([test $HAVE_TFTP = no])
200a9af9
DB
5557CHECK_CONNTRACK()
5558CHECK_CONNTRACK_NAT()
5559CHECK_CONNTRACK_ALG()
5560
5561OVS_TRAFFIC_VSWITCHD_START()
5562
5563ADD_NAMESPACES(at_ns0, at_ns1)
5564
5565ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
5566NS_CHECK_EXEC([at_ns0], [ip link set dev p0 address e6:66:c1:11:11:11])
5567NS_CHECK_EXEC([at_ns0], [arp -s 10.1.1.2 e6:66:c1:22:22:22])
5568
5569ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
5570NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address e6:66:c1:22:22:22])
5571NS_CHECK_EXEC([at_ns1], [arp -s 10.1.1.1 e6:66:c1:11:11:11])
5572NS_CHECK_EXEC([at_ns1], [arp -s 10.1.1.240 e6:66:c1:11:11:11])
5573
5574dnl Allow any traffic from ns0->ns1.
5575AT_DATA([flows.txt], [dnl
5576dnl track all IPv4 traffic.
5577table=0 priority=10 ip, action=ct(table=1)
5578dnl drop everything else.
5579table=0 priority=0 action=drop
5580dnl
5581dnl Table 1
5582dnl Allow ICMP both ways.
5583table=1 priority=100 in_port=1 icmp, action=2
5584table=1 priority=100 in_port=2 icmp, action=1
5585dnl
5586dnl Allow new TFTP control connections.
5587table=1 in_port=1 ct_state=+new udp nw_src=10.1.1.1 tp_dst=69 action=ct(alg=tftp,commit,nat(src=10.1.1.240)),2
5588dnl Allow related UDP connections from port 1.
5589table=1 in_port=2 ct_state=+new+rel udp nw_src=10.1.1.2 action=ct(commit,nat),1
5590dnl Allow established and NAT them.
5591table=1 in_port=1 ct_state=+est udp nw_src=10.1.1.1 action=ct(nat,table=2)
5592table=1 in_port=2 ct_state=+est udp nw_src=10.1.1.2 action=ct(nat,table=2)
5593dnl
5594table=1 priority=0, action=drop
5595dnl
5596table=2 in_port=1 ct_state=+est udp nw_src=10.1.1.240 action=2
5597table=2 in_port=2 ct_state=+est udp nw_dst=10.1.1.1 action=1
5598])
5599
5600AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
5601
5602dnl Check that the stacks working to avoid races.
5603OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.1.1.2 >/dev/null])
5604
5605OVS_START_L7([at_ns0], [tftp])
5606OVS_START_L7([at_ns1], [tftp])
5607
5608dnl TFTP requests from p0->p1 should work fine.
5609NS_CHECK_EXEC([at_ns0], [[curl $CURL_OPT tftp://10.1.1.2/flows.txt -o foo 2>curl0.log]])
5610
5611AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.2)], [0], [dnl
5612udp,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>),helper=tftp
5613udp,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>)
5614])
5615
5616OVS_TRAFFIC_VSWITCHD_STOP
5617AT_CLEANUP
daf4d3c1 5618
2c66ebe4
JR
5619AT_SETUP([conntrack - DNAT load balancing])
5620CHECK_CONNTRACK()
4573c42e 5621CHECK_CONNTRACK_NAT()
2c66ebe4
JR
5622OVS_TRAFFIC_VSWITCHD_START()
5623
5624ADD_NAMESPACES(at_ns1, at_ns2, at_ns3, at_ns4)
5625
5626ADD_VETH(p1, at_ns1, br0, "10.1.1.1/24")
5627ADD_VETH(p2, at_ns2, br0, "10.1.1.2/24")
5628ADD_VETH(p3, at_ns3, br0, "10.1.1.3/24")
5629ADD_VETH(p4, at_ns4, br0, "10.1.1.4/24")
5630NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address 80:88:88:88:88:11])
5631NS_CHECK_EXEC([at_ns2], [ip link set dev p2 address 80:88:88:88:88:22])
5632NS_CHECK_EXEC([at_ns3], [ip link set dev p3 address 80:88:88:88:88:33])
5633NS_CHECK_EXEC([at_ns4], [ip link set dev p4 address 80:88:88:88:88:44])
5634
5635dnl Select group for load balancing. One bucket per server. Each bucket
5636dnl tracks and NATs the connection and recirculates to table 4 for egress
5637dnl routing. Packets of existing connections are always NATted based on
5638dnl connection state, only new connections are NATted according to the
5639dnl specific NAT parameters in each bucket.
5640AT_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)"])
5641
5642AT_DATA([flows.txt], [dnl
5643dnl Track connections to the virtual IP address.
5644table=0 priority=100 ip nw_dst=10.1.1.64 action=group:234
5645dnl All other IP traffic is allowed but the connection state is no commited.
5646table=0 priority=90 ip action=ct(table=4,nat)
5647dnl
5648dnl Allow ARP, but generate responses for virtual addresses
5649table=0 priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
5650table=0 priority=10 arp action=normal
5651table=0 priority=0 action=drop
5652dnl
5653dnl Routing table
5654dnl
5655table=4,ip,nw_dst=10.1.1.1 action=mod_dl_dst:80:88:88:88:88:11,output:1
5656table=4,ip,nw_dst=10.1.1.2 action=mod_dl_dst:80:88:88:88:88:22,output:2
5657table=4,ip,nw_dst=10.1.1.3 action=mod_dl_dst:80:88:88:88:88:33,output:3
5658table=4,ip,nw_dst=10.1.1.4 action=mod_dl_dst:80:88:88:88:88:44,output:4
5659table=4 priority=0 action=drop
5660dnl
5661dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
5662table=8,reg2=0x0a010140,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
5663dnl Zero result means not found.
5664table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
5665dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
5666dnl TPA IP in reg2.
5667table=10 priority=100 arp xreg0=0 action=normal
5668dnl Swaps the fields of the ARP message to turn a query to a response.
5669table=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]]
5670table=10 priority=0 action=controller
5671])
5672
5673AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
5674
5675dnl Start web servers
7ed40afe
JS
5676OVS_START_L7([at_ns2], [http])
5677OVS_START_L7([at_ns3], [http])
5678OVS_START_L7([at_ns4], [http])
2c66ebe4
JR
5679
5680on_exit 'ovs-ofctl -O OpenFlow15 dump-flows br0'
5681on_exit 'ovs-appctl revalidator/purge'
5682on_exit 'ovs-appctl dpif/dump-flows br0'
5683
5684dnl Should work with the virtual IP address through NAT
5685for i in 1 2 3 4 5 6 7 8 9 10 11 12; do
5686 echo Request $i
5687 NS_CHECK_EXEC([at_ns1], [wget 10.1.1.64 -t 5 -T 1 --retry-connrefused -v -o wget$i.log])
5688done
5689
5690dnl Each server should have at least one connection.
420c73b2
JR
5691AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1.64)], [0], [dnl
5692tcp,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>)
5693tcp,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>)
5694tcp,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
5695])
5696
5697ovs-appctl dpif/dump-flows br0
5698ovs-appctl revalidator/purge
5699ovs-ofctl -O OpenFlow15 dump-flows br0
5700ovs-ofctl -O OpenFlow15 dump-group-stats br0
5701
5702OVS_TRAFFIC_VSWITCHD_STOP
5703AT_CLEANUP
5704
5705
5706AT_SETUP([conntrack - DNAT load balancing with NC])
9c1ab985 5707AT_SKIP_IF([test $HAVE_NC = no])
2c66ebe4 5708CHECK_CONNTRACK()
4573c42e 5709CHECK_CONNTRACK_NAT()
2c66ebe4
JR
5710OVS_TRAFFIC_VSWITCHD_START()
5711
5712ADD_NAMESPACES(at_ns1, at_ns2, at_ns3, at_ns4, at_ns5)
5713
5714ADD_VETH(p1, at_ns1, br0, "10.1.1.1/24")
5715ADD_VETH(p2, at_ns2, br0, "10.1.1.2/24")
5716ADD_VETH(p3, at_ns3, br0, "10.1.1.3/24")
5717ADD_VETH(p4, at_ns4, br0, "10.1.1.4/24")
5718ADD_VETH(p5, at_ns5, br0, "10.1.1.5/24")
5719NS_CHECK_EXEC([at_ns1], [ip link set dev p1 address 80:88:88:88:88:11])
5720NS_CHECK_EXEC([at_ns2], [ip link set dev p2 address 80:88:88:88:88:22])
5721NS_CHECK_EXEC([at_ns3], [ip link set dev p3 address 80:88:88:88:88:33])
5722NS_CHECK_EXEC([at_ns4], [ip link set dev p4 address 80:88:88:88:88:44])
5723NS_CHECK_EXEC([at_ns5], [ip link set dev p5 address 80:88:88:88:88:55])
5724
5725dnl Select group for load balancing. One bucket per server. Each bucket
5726dnl tracks and NATs the connection and recirculates to table 4 for egress
5727dnl routing. Packets of existing connections are always NATted based on
5728dnl connection state, only new connections are NATted according to the
5729dnl specific NAT parameters in each bucket.
5730AT_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)"])
5731
5732AT_DATA([flows.txt], [dnl
5733dnl Track connections to the virtual IP address.
5734table=0 priority=100 ip nw_dst=10.1.1.64 action=group:234
5735dnl All other IP traffic is allowed but the connection state is no commited.
5736table=0 priority=90 ip action=ct(table=4,nat)
5737dnl
5738dnl Allow ARP, but generate responses for virtual addresses
5739table=0 priority=100 arp arp_op=1 action=move:OXM_OF_ARP_TPA[[]]->NXM_NX_REG2[[]],resubmit(,8),goto_table:10
5740table=0 priority=10 arp action=normal
5741table=0 priority=0 action=drop
5742dnl
5743dnl Routing table
5744dnl
5745table=4,ip,nw_dst=10.1.1.1 action=mod_dl_dst:80:88:88:88:88:11,output:1
5746table=4,ip,nw_dst=10.1.1.2 action=mod_dl_dst:80:88:88:88:88:22,output:2
5747table=4,ip,nw_dst=10.1.1.3 action=mod_dl_dst:80:88:88:88:88:33,output:3
5748table=4,ip,nw_dst=10.1.1.4 action=mod_dl_dst:80:88:88:88:88:44,output:4
5749table=4,ip,nw_dst=10.1.1.5 action=mod_dl_dst:80:88:88:88:88:55,output:5
5750table=4 priority=0 action=drop
5751dnl
5752dnl MAC resolution table for IP in reg2, stores mac in OXM_OF_PKT_REG0
5753table=8,reg2=0x0a010140,action=load:0x808888888888->OXM_OF_PKT_REG0[[]]
5754dnl Zero result means not found.
5755table=8,priority=0,action=load:0->OXM_OF_PKT_REG0[[]]
5756dnl ARP responder mac filled in at OXM_OF_PKT_REG0, or 0 for normal action.
5757dnl TPA IP in reg2.
5758table=10 priority=100 arp xreg0=0 action=normal
5759dnl Swaps the fields of the ARP message to turn a query to a response.
5760table=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]]
5761table=10 priority=0 action=controller
5762])
5763
5764AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
5765
5766dnl Start web servers
7ed40afe
JS
5767OVS_START_L7([at_ns2], [http])
5768OVS_START_L7([at_ns3], [http])
5769OVS_START_L7([at_ns4], [http])
2c66ebe4
JR
5770
5771on_exit 'ovs-ofctl -O OpenFlow15 dump-flows br0'
5772on_exit 'ovs-appctl revalidator/purge'
5773on_exit 'ovs-appctl dpif/dump-flows br0'
5774
5775sleep 5
5776
5777dnl Should work with the virtual IP address through NAT
5778for i in 1 2 3 4 5 6 7 8 9; do
5779 echo Request $i
5780 NS_CHECK_EXEC([at_ns1], [echo "TEST1" | nc -p 4100$i 10.1.1.64 80 > nc-1-$i.log])
5781 NS_CHECK_EXEC([at_ns5], [echo "TEST5" | nc -p 4100$i 10.1.1.64 80 > nc-5-$i.log])
5782done
5783
5784conntrack -L 2>&1
5785
5786ovs-appctl dpif/dump-flows br0
5787ovs-appctl revalidator/purge
5788ovs-ofctl -O OpenFlow15 dump-flows br0
5789ovs-ofctl -O OpenFlow15 dump-group-stats br0
5790
5791OVS_TRAFFIC_VSWITCHD_STOP
5792AT_CLEANUP
b4fa814c 5793
8d48d5f3
EG
5794AT_SETUP([conntrack - floating IP])
5795AT_SKIP_IF([test $HAVE_NC = no])
5796CHECK_CONNTRACK()
5797OVS_TRAFFIC_VSWITCHD_START()
5798OVS_CHECK_CT_CLEAR()
5799
5800ADD_NAMESPACES(at_ns0, at_ns1)
5801ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24", "f0:00:00:01:01:01") dnl FIP 10.254.254.1
5802ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24", "f0:00:00:01:01:02") dnl FIP 10.254.254.2
5803
5804dnl Static ARPs
5805NS_CHECK_EXEC([at_ns0], [ip neigh add 10.1.1.2 lladdr f0:00:00:01:01:02 dev p0])
5806NS_CHECK_EXEC([at_ns1], [ip neigh add 10.1.1.1 lladdr f0:00:00:01:01:01 dev p1])
5807
5808dnl Static ARP and route entries for the FIP "gateway"
5809NS_CHECK_EXEC([at_ns0], [ip neigh add 10.1.1.254 lladdr f0:00:00:01:01:FE dev p0])
5810NS_CHECK_EXEC([at_ns1], [ip neigh add 10.1.1.254 lladdr f0:00:00:01:01:FE dev p1])
5811NS_CHECK_EXEC([at_ns0], [ip route add default nexthop via 10.1.1.254])
5812NS_CHECK_EXEC([at_ns1], [ip route add default nexthop via 10.1.1.254])
5813
5814NETNS_DAEMONIZE([at_ns0], [nc -l -k 1234 > /dev/null], [nc0.pid])
5815
5816AT_DATA([flows.txt], [dnl
5817table=0,priority=10 ip action=ct(table=1)
5818table=0,priority=1 action=drop
5819dnl dst FIP
5820table=1,priority=20 ip,ct_state=+trk+est,nw_dst=10.254.254.0/24 action=goto_table:10
5821table=1,priority=20 ip,ct_state=+trk+new,nw_dst=10.254.254.0/24 action=ct(commit,table=10)
5822dnl dst local
5823table=1,priority=10 ip,ct_state=+trk+est action=goto_table:20
5824table=1,priority=10 ip,ct_state=+trk+new action=ct(commit,table=20)
5825table=1,priority=1 ip,ct_state=+trk+inv action=drop
5826dnl
5827dnl FIP translation (dst FIP, src local) --> (dst local, src FIP)
5828table=10 ip,nw_dst=10.254.254.1 action=set_field:10.1.1.1->nw_dst,goto_table:11
5829table=10 ip,nw_dst=10.254.254.2 action=set_field:10.1.1.2->nw_dst,goto_table:11
5830table=11 ip,nw_src=10.1.1.1 action=set_field:10.254.254.1->nw_src,goto_table:12
5831table=11 ip,nw_src=10.1.1.2 action=set_field:10.254.254.2->nw_src,goto_table:12
5832dnl clear conntrack and do another lookup since we changed the tuple
5833table=12,priority=10 ip action=ct_clear,ct(table=13)
5834table=12,priority=1 action=drop
5835table=13 ip,ct_state=+trk+est action=goto_table:20
5836table=13 ip,ct_state=+trk+new action=ct(commit,table=20)
5837table=13 ip,ct_state=+trk+inv action=drop
5838dnl
5839dnl Output
5840table=20 ip,nw_src=10.1.1.1 action=set_field:f0:00:00:01:01:01->eth_src,goto_table:21
5841table=20 ip,nw_src=10.1.1.2 action=set_field:f0:00:00:01:01:02->eth_src,goto_table:21
5842table=20 ip,nw_src=10.254.254.0/24 action=set_field:f0:00:00:01:01:FE->eth_src,goto_table:21
5843table=21 ip,nw_dst=10.1.1.1 action=set_field:f0:00:00:01:01:01->eth_dst,output:ovs-p0
5844table=21 ip,nw_dst=10.1.1.2 action=set_field:f0:00:00:01:01:02->eth_dst,output:ovs-p1
5845])
5846
5847AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
5848
5849dnl non-FIP case
5850NS_CHECK_EXEC([at_ns1], [echo "foobar" |nc $NC_EOF_OPT 10.1.1.1 1234])
5851OVS_WAIT_UNTIL([[ovs-appctl dpctl/dump-conntrack | sed -e 's/port=[0-9]*/port=<cleared>/g' -e 's/id=[0-9]*/id=<cleared>/g' |
5852grep "tcp,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=TIME_WAIT)"
5853]])
5854
5855dnl Check that the full session ends as expected (i.e. TIME_WAIT). Otherwise it
5856dnl means the datapath didn't process the ct_clear action. Ending in SYN_RECV
5857dnl (OVS maps to ESTABLISHED) means the initial frame was committed, but not a
5858dnl second time after the FIP translation (because ct_clear didn't occur).
5859NS_CHECK_EXEC([at_ns1], [echo "foobar" |nc $NC_EOF_OPT 10.254.254.1 1234])
5860OVS_WAIT_UNTIL([[ovs-appctl dpctl/dump-conntrack | sed -e 's/port=[0-9]*/port=<cleared>/g' -e 's/id=[0-9]*/id=<cleared>/g' |
5861grep "tcp,orig=(src=10.254.254.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.1,dst=10.254.254.2,sport=<cleared>,dport=<cleared>),protoinfo=(state=TIME_WAIT)"
5862]])
5863
5864OVS_TRAFFIC_VSWITCHD_STOP
5865AT_CLEANUP
5866
594570ea
DB
5867AT_SETUP([conntrack - negative test for recirculation optimization])
5868dnl This test will fail if 'conn' caching is being used, because the tuple
5869dnl has been changed outside of conntrack.
5870AT_SKIP_IF([test $HAVE_NC = no])
5871CHECK_CONNTRACK()
5872OVS_TRAFFIC_VSWITCHD_START()
5873OVS_CHECK_CT_CLEAR()
5874
5875ADD_NAMESPACES(at_ns0, at_ns1)
5876ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24", "f0:00:00:01:01:01") dnl FIP 10.254.254.1
5877ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24", "f0:00:00:01:01:02") dnl FIP 10.254.254.2
5878
5879dnl Static ARPs
5880NS_CHECK_EXEC([at_ns0], [ip neigh add 10.1.1.2 lladdr f0:00:00:01:01:02 dev p0])
5881NS_CHECK_EXEC([at_ns1], [ip neigh add 10.1.1.1 lladdr f0:00:00:01:01:01 dev p1])
5882
5883dnl Static ARP and route entries for the FIP "gateway"
5884NS_CHECK_EXEC([at_ns0], [ip neigh add 10.1.1.254 lladdr f0:00:00:01:01:FE dev p0])
5885NS_CHECK_EXEC([at_ns1], [ip neigh add 10.1.1.254 lladdr f0:00:00:01:01:FE dev p1])
5886NS_CHECK_EXEC([at_ns0], [ip route add default nexthop via 10.1.1.254])
5887NS_CHECK_EXEC([at_ns1], [ip route add default nexthop via 10.1.1.254])
5888
5889NETNS_DAEMONIZE([at_ns0], [nc -l -k 1234 > /dev/null], [nc0.pid])
5890
5891AT_DATA([flows.txt], [dnl
5892table=0,priority=10 ip action=ct(table=1)
5893dnl dst FIP
5894table=1,priority=20 ip,ct_state=+trk+est,nw_dst=10.254.254.0/24 action=goto_table:2
5895table=1,priority=20 ip,ct_state=+trk+new,nw_dst=10.254.254.0/24 action=ct(commit,exec(set_field:1->ct_mark),table=2)
5896dnl
5897dnl FIP translation (dst FIP, src local) --> (dst local, src FIP)
5898table=2 ip,nw_dst=10.254.254.1 action=set_field:10.1.1.1->nw_dst,goto_table:3
5899table=2 ip,nw_dst=10.254.254.2 action=set_field:10.1.1.2->nw_dst,goto_table:3
5900table=3 ip,nw_src=10.1.1.1 action=set_field:10.254.254.1->nw_src,goto_table:4
5901table=3 ip,nw_src=10.1.1.2 action=set_field:10.254.254.2->nw_src,goto_table:4
5902table=4 ip,nw_dst=10.1.1.1 action=set_field:f0:00:00:01:01:01->eth_dst,goto_table:5
5903table=4 ip,nw_dst=10.1.1.2 action=set_field:f0:00:00:01:01:02->eth_dst,goto_table:5
5904table=5 ip,nw_src=10.254.254.0/24 action=set_field:f0:00:00:01:01:FE->eth_src,goto_table:6
5905dnl
5906dnl Tuple has been changed outside of conntrack
5907table=6,priority=10 ip action=ct(table=7)
5908dnl
5909table=7 ip,ct_state=+trk+est action=goto_table:8
5910table=7 ip,ct_mark=0x0,ct_state=+trk+new action=ct(commit,exec(set_field:2->ct_mark),table=8)
5911dnl
5912table=8 ip,nw_dst=10.1.1.1 action=output:ovs-p0
5913table=8 ip,nw_dst=10.1.1.2 action=output:ovs-p1
5914])
5915
5916AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
5917
5918NS_CHECK_EXEC([at_ns1], [echo "foobar" |nc $NC_EOF_OPT 10.254.254.1 1234])
5919
5920AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.254.254)], [0], [dnl
5921tcp,orig=(src=10.1.1.2,dst=10.254.254.1,sport=<cleared>,dport=<cleared>),reply=(src=10.254.254.1,dst=10.1.1.2,sport=<cleared>,dport=<cleared>),mark=1,protoinfo=(state=<cleared>)
5922tcp,orig=(src=10.254.254.2,dst=10.1.1.1,sport=<cleared>,dport=<cleared>),reply=(src=10.1.1.1,dst=10.254.254.2,sport=<cleared>,dport=<cleared>),mark=2,protoinfo=(state=<cleared>)
5923])
5924
5925ovs-appctl dpif/dump-flows br0
5926
5927OVS_TRAFFIC_VSWITCHD_STOP
5928AT_CLEANUP
5929
08905c93
TZ
5930AT_SETUP([conntrack - Multiple ICMP traverse])
5931dnl This tracks sending ICMP packets via conntrack multiple times for the
5932dnl same packet
5933CHECK_CONNTRACK()
5934OVS_TRAFFIC_VSWITCHD_START()
5935OVS_CHECK_CT_CLEAR()
5936
5937ADD_NAMESPACES(at_ns0, at_ns1)
5938ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24", "f0:00:00:01:01:01")
5939ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24", "f0:00:00:01:01:02")
5940dnl setup ct flows
5941AT_DATA([flows.txt], [dnl
5942table=0,priority=10 ip,icmp,ct_state=-trk action=ct(zone=1,table=1)
5943table=0,priority=0 action=drop
5944table=1,priority=10 ct_state=-est+trk+new,ip,ct_zone=1,in_port=1 action=ct(commit,table=2)
5945table=1,priority=10 ct_state=+est-new+trk,ct_zone=1,in_port=1 action=resubmit(,2)
5946table=1,priority=0 action=drop
5947table=2,priority=10 ct_state=+trk+new,in_port=1 action=drop
5948table=2,priority=10 ct_state=+trk+est action=drop
5949])
5950
5951AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
5952
5953# sending icmp pkts, first and second
5954NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 f0 00 00 01 01 02 f0 00 00 01 01 01 08 00 45 00 00 1c 00 01 00 00 40 01 64 dc 0a 01 01 01 0a 01 01 02 08 00 f7 ff ff ff ff ff > /dev/null])
5955
5956NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 f0 00 00 01 01 02 f0 00 00 01 01 01 08 00 45 00 00 1c 00 01 00 00 40 01 64 dc 0a 01 01 01 0a 01 01 02 08 00 f7 ff ff ff ff ff > /dev/null])
5957
5958sleep 1
5959
5960dnl ensure CT picked up the packet
5961AT_CHECK([ovs-appctl dpctl/dump-conntrack | FORMAT_CT(10.1.1)], [0], [dnl
5962icmp,orig=(src=10.1.1.1,dst=10.1.1.2,id=<cleared>,type=8,code=0),reply=(src=10.1.1.2,dst=10.1.1.1,id=<cleared>,type=0,code=0)
5963])
5964
5965AT_CHECK([ovs-ofctl dump-flows br0 | grep table=2, | OFPROTO_CLEAR_DURATION_IDLE],
5966 [0], [dnl
5967 cookie=0x0, duration=<cleared>, table=2, n_packets=2, n_bytes=84, idle_age=<cleared>, priority=10,ct_state=+new+trk,in_port=1 actions=drop
5968 cookie=0x0, duration=<cleared>, table=2, n_packets=0, n_bytes=0, idle_age=<cleared>, priority=10,ct_state=+est+trk actions=drop
5969])
5970
5971OVS_TRAFFIC_VSWITCHD_STOP
5972AT_CLEANUP
5973
b4fa814c
EG
5974AT_BANNER([802.1ad])
5975
5976AT_SETUP([802.1ad - vlan_limit])
5977OVS_TRAFFIC_VSWITCHD_START([set Open_vSwitch . other_config:vlan-limit=0])
5978OVS_CHECK_8021AD()
5979
5980ADD_NAMESPACES(at_ns0, at_ns1)
5981
5982ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
5983ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
5984
5985ADD_SVLAN(p0, at_ns0, 4094, "10.255.2.1/24")
5986ADD_SVLAN(p1, at_ns1, 4094, "10.255.2.2/24")
5987
5988ADD_CVLAN(p0.4094, at_ns0, 100, "10.2.2.1/24")
5989ADD_CVLAN(p1.4094, at_ns1, 100, "10.2.2.2/24")
5990
5991AT_CHECK([ovs-ofctl add-flow br0 "priority=1 action=normal"])
5992
5993OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.2.2.2])
5994
5995dnl CVLAN traffic should match the flow and drop
5996AT_CHECK([ovs-appctl revalidator/purge])
5997AT_CHECK([ovs-vsctl set Open_vSwitch . other_config:vlan-limit=1])
5998AT_CHECK([ovs-ofctl add-flow br0 "priority=100 dl_type=0x8100 action=drop"])
5999NS_CHECK_EXEC([at_ns0], [ping -q -c 1 -w 3 10.2.2.2], [1], [ignore])
6000
6001OVS_TRAFFIC_VSWITCHD_STOP
6002AT_CLEANUP
0147a20e
EG
6003
6004
6005AT_SETUP([802.1ad - push/pop outer 802.1ad])
6006OVS_TRAFFIC_VSWITCHD_START([set Open_vSwitch . other_config:vlan-limit=0])
6007OVS_CHECK_8021AD()
6008
6009ADD_BR([br1])
6010ADD_BR([br2])
6011ADD_NAMESPACES(at_ns0, at_ns1)
6012
6013AT_CHECK([ip link add ovs-p0 type veth peer name ovs-p1])
6014AT_CHECK([ip link set dev ovs-p0 up])
6015AT_CHECK([ip link set dev ovs-p1 up])
6016AT_CHECK([ovs-vsctl add-port br0 ovs-p0])
6017AT_CHECK([ovs-vsctl add-port br1 ovs-p1])
6018on_exit 'ip link del ovs-p0'
6019
6020AT_CHECK([ip link add ovs-p2 type veth peer name ovs-p3])
6021AT_CHECK([ip link set dev ovs-p2 up])
6022AT_CHECK([ip link set dev ovs-p3 up])
6023AT_CHECK([ovs-vsctl add-port br0 ovs-p2])
6024AT_CHECK([ovs-vsctl add-port br2 ovs-p3])
6025on_exit 'ip link del ovs-p2'
6026
6027ADD_VETH(p4, at_ns0, br1, "10.1.1.1/24")
6028ADD_VETH(p5, at_ns1, br2, "10.1.1.2/24")
6029ADD_CVLAN(p4, at_ns0, 100, "10.2.2.1/24")
6030ADD_CVLAN(p5, at_ns1, 100, "10.2.2.2/24")
6031
6032AT_DATA([flows-br0.txt], [dnl
6033priority=1 action=drop
6034priority=100 in_port=1 action=push_vlan:0x88a8,mod_vlan_vid=4094,output:2
6035priority=100 in_port=2 action=push_vlan:0x88a8,mod_vlan_vid=4094,output:1
6036])
6037
6038AT_DATA([flows-customer-br.txt], [dnl
6039priority=1 action=normal
6040priority=100 in_port=1 vlan_tci=0x1000/0x1000 action=pop_vlan,normal
6041])
6042
6043AT_CHECK([ovs-ofctl --bundle add-flows br0 flows-br0.txt])
6044AT_CHECK([ovs-ofctl --bundle add-flows br1 flows-customer-br.txt])
6045AT_CHECK([ovs-ofctl --bundle add-flows br2 flows-customer-br.txt])
6046
6047OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.2.2.2])
6048
6049NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
60503 packets transmitted, 3 received, 0% packet loss, time 0ms
6051])
6052
6053NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
60543 packets transmitted, 3 received, 0% packet loss, time 0ms
6055])
6056
6057OVS_TRAFFIC_VSWITCHD_STOP
6058AT_CLEANUP
6059
6060
6061AT_SETUP([802.1ad - push/pop outer 802.1q])
6062OVS_TRAFFIC_VSWITCHD_START([set Open_vSwitch . other_config:vlan-limit=0])
6063OVS_CHECK_8021AD()
6064
6065ADD_BR([br1])
6066ADD_BR([br2])
6067ADD_NAMESPACES(at_ns0, at_ns1)
6068
6069AT_CHECK([ip link add ovs-p0 type veth peer name ovs-p1])
6070AT_CHECK([ip link set dev ovs-p0 up])
6071AT_CHECK([ip link set dev ovs-p1 up])
6072AT_CHECK([ovs-vsctl add-port br0 ovs-p0])
6073AT_CHECK([ovs-vsctl add-port br1 ovs-p1])
6074on_exit 'ip link del ovs-p0'
6075
6076AT_CHECK([ip link add ovs-p2 type veth peer name ovs-p3])
6077AT_CHECK([ip link set dev ovs-p2 up])
6078AT_CHECK([ip link set dev ovs-p3 up])
6079AT_CHECK([ovs-vsctl add-port br0 ovs-p2])
6080AT_CHECK([ovs-vsctl add-port br2 ovs-p3])
6081on_exit 'ip link del ovs-p2'
6082
6083ADD_VETH(p4, at_ns0, br1, "10.1.1.1/24")
6084ADD_VETH(p5, at_ns1, br2, "10.1.1.2/24")
6085ADD_CVLAN(p4, at_ns0, 100, "10.2.2.1/24")
6086ADD_CVLAN(p5, at_ns1, 100, "10.2.2.2/24")
6087
6088AT_DATA([flows-br0.txt], [dnl
6089priority=1 action=drop
6090priority=100 in_port=1 action=push_vlan:0x8100,mod_vlan_vid=4094,output:2
6091priority=100 in_port=2 action=push_vlan:0x8100,mod_vlan_vid=4094,output:1
6092])
6093
6094AT_DATA([flows-customer-br.txt], [dnl
6095priority=1 action=normal
6096priority=100 in_port=1 vlan_tci=0x1000/0x1000 action=pop_vlan,normal
6097])
6098
6099AT_CHECK([ovs-ofctl --bundle add-flows br0 flows-br0.txt])
6100AT_CHECK([ovs-ofctl --bundle add-flows br1 flows-customer-br.txt])
6101AT_CHECK([ovs-ofctl --bundle add-flows br2 flows-customer-br.txt])
6102
6103OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.2.2.2])
6104
6105NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
61063 packets transmitted, 3 received, 0% packet loss, time 0ms
6107])
6108
6109NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
61103 packets transmitted, 3 received, 0% packet loss, time 0ms
6111])
6112
6113OVS_TRAFFIC_VSWITCHD_STOP
6114AT_CLEANUP
d4a814a8
EG
6115
6116
6117AT_SETUP([802.1ad - 802.1q tunnel])
6118OVS_TRAFFIC_VSWITCHD_START([set Open_vSwitch . other_config:vlan-limit=0])
6119OVS_CHECK_8021AD()
6120
6121ADD_BR([br1])
6122ADD_BR([br2])
6123ADD_NAMESPACES(at_ns0, at_ns1)
6124
6125AT_CHECK([ip link add ovs-p0 type veth peer name ovs-p1])
6126AT_CHECK([ip link set dev ovs-p0 up])
6127AT_CHECK([ip link set dev ovs-p1 up])
6128AT_CHECK([ovs-vsctl add-port br0 ovs-p0])
6129AT_CHECK([ovs-vsctl add-port br1 ovs-p1])
6130on_exit 'ip link del ovs-p0'
6131
6132AT_CHECK([ip link add ovs-p2 type veth peer name ovs-p3])
6133AT_CHECK([ip link set dev ovs-p2 up])
6134AT_CHECK([ip link set dev ovs-p3 up])
6135AT_CHECK([ovs-vsctl add-port br0 ovs-p2])
6136AT_CHECK([ovs-vsctl add-port br2 ovs-p3])
6137on_exit 'ip link del ovs-p2'
6138
6139ADD_VETH(p4, at_ns0, br1, "10.1.1.1/24")
6140ADD_VETH(p5, at_ns1, br2, "10.1.1.2/24")
6141ADD_CVLAN(p4, at_ns0, 100, "10.2.2.1/24")
6142ADD_CVLAN(p5, at_ns1, 100, "10.2.2.2/24")
6143ADD_CVLAN(p4, at_ns0, 200, "10.3.2.1/24")
6144ADD_CVLAN(p5, at_ns1, 200, "10.3.2.2/24")
6145ADD_CVLAN(p4, at_ns0, 300, "10.4.2.1/24")
6146ADD_CVLAN(p5, at_ns1, 300, "10.4.2.2/24")
6147
6148AT_CHECK([ovs-ofctl add-flow br0 action=normal])
6149AT_CHECK([ovs-ofctl add-flow br1 action=normal])
6150AT_CHECK([ovs-ofctl add-flow br2 action=normal])
6151AT_CHECK([ovs-vsctl set port ovs-p0 vlan_mode=dot1q-tunnel tag=4094 cvlans=100,200])
6152AT_CHECK([ovs-vsctl set port ovs-p2 vlan_mode=dot1q-tunnel tag=4094 cvlans=100,200])
6153
6154OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.2.2.2])
6155OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.3.2.2])
6156
6157NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
61583 packets transmitted, 3 received, 0% packet loss, time 0ms
6159])
6160
6161NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.3.2.2 | FORMAT_PING], [0], [dnl
61623 packets transmitted, 3 received, 0% packet loss, time 0ms
6163])
6164
6165NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
61663 packets transmitted, 3 received, 0% packet loss, time 0ms
6167])
6168
6169NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.3.2.2 | FORMAT_PING], [0], [dnl
61703 packets transmitted, 3 received, 0% packet loss, time 0ms
6171])
6172
6173dnl CVLAN 300 is not permitted by dot1q-tunnel
6174NS_CHECK_EXEC([at_ns0], [ping -q -c 1 -w 3 10.4.2.2], [1], [ignore])
6175
6176OVS_TRAFFIC_VSWITCHD_STOP(["/dropping VLAN \(0\|300\) packet received on dot1q-tunnel port/d"])
6177AT_CLEANUP
79d6e24f
EG
6178
6179AT_SETUP([802.1ad - double vlan match])
6180OVS_TRAFFIC_VSWITCHD_START([set Open_vSwitch . other_config:vlan-limit=0])
6181OVS_CHECK_8021AD()
6182
6183ADD_NAMESPACES(at_ns0, at_ns1)
6184
6185ADD_VETH(p0, at_ns0, br0, "10.1.1.1/24")
6186ADD_VETH(p1, at_ns1, br0, "10.1.1.2/24")
6187
6188ADD_SVLAN(p0, at_ns0, 4094, "10.255.2.1/24")
6189ADD_SVLAN(p1, at_ns1, 4094, "10.255.2.2/24")
6190
6191ADD_CVLAN(p0.4094, at_ns0, 100, "10.2.2.1/24")
6192ADD_CVLAN(p1.4094, at_ns1, 100, "10.2.2.2/24")
6193
6194AT_DATA([flows-br0.txt], [dnl
6195table=0,priority=1 action=drop
6196table=0,priority=100 dl_vlan=4094 action=pop_vlan,goto_table:1
6197table=1,priority=100 dl_vlan=100 action=push_vlan:0x88a8,mod_vlan_vid:4094,normal
6198])
6199AT_CHECK([ovs-ofctl --bundle add-flows br0 flows-br0.txt])
6200
6201OVS_WAIT_UNTIL([ip netns exec at_ns0 ping -c 1 10.2.2.2])
6202
6203NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
62043 packets transmitted, 3 received, 0% packet loss, time 0ms
6205])
6206
6207NS_CHECK_EXEC([at_ns0], [ping -s 1600 -q -c 3 -i 0.3 -w 2 10.2.2.2 | FORMAT_PING], [0], [dnl
62083 packets transmitted, 3 received, 0% packet loss, time 0ms
6209])
6210
296251ca
AV
6211OVS_TRAFFIC_VSWITCHD_STOP
6212AT_CLEANUP
6213
6214
6215AT_BANNER([nsh-datapath])
6216
6217AT_SETUP([nsh - encap header])
6218OVS_TRAFFIC_VSWITCHD_START()
6219
6220ADD_NAMESPACES(at_ns0, at_ns1)
6221
6222ADD_VETH(p0, at_ns0, br0, "0.0.0.0")
6223ADD_VETH(p1, at_ns1, br0, "0.0.0.0")
6224
6225dnl The flow will encap a nsh header to the TCP syn packet
6226dnl eth/ip/tcp --> OVS --> eth/nsh/eth/ip/tcp
6227AT_CHECK([ovs-ofctl -Oopenflow13 add-flow br0 "table=0,priority=100,in_port=ovs-p0,ip,actions=encap(nsh(md_type=1)),set_field:0x1234->nsh_spi,set_field:0x11223344->nsh_c1,encap(ethernet),set_field:f2:ff:00:00:00:02->dl_dst,set_field:f2:ff:00:00:00:01->dl_src,ovs-p1"])
6228
0c5a65f2 6229NS_CHECK_EXEC([at_ns1], [tcpdump -l -n -xx -U -i p1 > p1.pcap &])
296251ca
AV
6230sleep 1
6231
6232dnl The hex dump is a TCP syn packet. pkt=eth/ip/tcp
6233dnl The packet is sent from p0(at_ns0) interface directed to
6234dnl p1(at_ns1) interface
1ca0323e 6235NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 f2 00 00 00 00 02 f2 00 00 00 00 01 08 00 45 00 00 28 00 01 00 00 40 06 b0 13 c0 a8 00 0a 0a 00 00 0a 04 00 08 00 00 00 00 c8 00 00 00 00 50 02 20 00 b8 5e 00 00 > /dev/null])
296251ca 6236
296251ca 6237dnl Check the expected nsh encapsulated packet on the egress interface
0c5a65f2
WT
6238OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0000: *f2ff *0000 *0002 *f2ff *0000 *0001 *894f *0fc6" 2>&1 1>/dev/null])
6239OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0010: *0103 *0012 *34ff *1122 *3344 *0000 *0000 *0000" 2>&1 1>/dev/null])
6240OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0020: *0000 *0000 *0000 *f200 *0000 *0002 *f200 *0000" 2>&1 1>/dev/null])
6241OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0030: *0001 *0800 *4500 *0028 *0001 *0000 *4006 *b013" 2>&1 1>/dev/null])
6242OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0040: *c0a8 *000a *0a00 *000a *0400 *0800 *0000 *00c8" 2>&1 1>/dev/null])
6243OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0050: *0000 *0000 *5002 *2000 *b85e *0000" 2>&1 1>/dev/null])
296251ca
AV
6244
6245OVS_TRAFFIC_VSWITCHD_STOP
6246AT_CLEANUP
6247
0c5a65f2 6248
296251ca
AV
6249AT_SETUP([nsh - decap header])
6250OVS_TRAFFIC_VSWITCHD_START()
6251
6252ADD_NAMESPACES(at_ns0, at_ns1)
6253
6254ADD_VETH(p0, at_ns0, br0, "0.0.0.0")
6255ADD_VETH(p1, at_ns1, br0, "0.0.0.0")
6256
6257dnl The flow will decap a nsh header which in turn carries a TCP syn packet
6258dnl eth/nsh/eth/ip/tcp --> OVS --> eth/ip/tcp
6259AT_CHECK([ovs-ofctl -Oopenflow13 add-flow br0 "table=0,priority=100,in_port=ovs-p0,dl_type=0x894f, actions=decap(),decap(), ovs-p1"])
6260
0c5a65f2 6261NS_CHECK_EXEC([at_ns1], [tcpdump -l -n -xx -U -i p1 > p1.pcap &])
296251ca
AV
6262sleep 1
6263
6264dnl The hex dump is NSH packet with TCP syn payload. pkt=eth/nsh/eth/ip/tcp
6265dnl The packet is sent from p0(at_ns0) interface directed to
6266dnl p1(at_ns1) interface
1ca0323e 6267NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 f2 ff 00 00 00 02 f2 ff 00 00 00 01 89 4f 02 06 01 03 00 00 64 03 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 f2 00 00 00 00 02 f2 00 00 00 00 01 08 00 45 00 00 28 00 01 00 00 40 06 b0 13 c0 a8 00 0a 0a 00 00 0a 04 00 08 00 00 00 00 c8 00 00 00 00 50 02 20 00 b8 5e 00 00 > /dev/null])
296251ca 6268
296251ca 6269dnl Check the expected de-capsulated TCP packet on the egress interface
0c5a65f2
WT
6270OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0000: *f200 *0000 *0002 *f200 *0000 *0001 *0800 *4500" 2>&1 1>/dev/null])
6271OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0010: *0028 *0001 *0000 *4006 *b013 *c0a8 *000a *0a00" 2>&1 1>/dev/null])
6272OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0020: *000a *0400 *0800 *0000 *00c8 *0000 *0000 *5002" 2>&1 1>/dev/null])
6273OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0030: *2000 *b85e *0000" 2>&1 1>/dev/null])
296251ca
AV
6274
6275OVS_TRAFFIC_VSWITCHD_STOP
6276AT_CLEANUP
6277
0c5a65f2 6278
296251ca
AV
6279AT_SETUP([nsh - replace header])
6280OVS_TRAFFIC_VSWITCHD_START()
6281
6282ADD_NAMESPACES(at_ns0, at_ns1)
6283
6284ADD_VETH(p0, at_ns0, br0, "0.0.0.0")
6285ADD_VETH(p1, at_ns1, br0, "0.0.0.0")
6286
6287dnl The flow will decap a nsh header and encap a new nsh header
6288dnl eth/nsh-X/eth/ip/tcp --> OVS --> eth/nsh-Y/eth/ip/tcp
6289dnl The flow will add another NSH header with nsh_spi=0x101, nsh_si=4,
6290dnl nsh_ttl=7 and change the md1 context
6291AT_CHECK([ovs-ofctl -Oopenflow13 add-flow br0 "table=0,priority=100,in_port=ovs-p0,dl_type=0x894f,nsh_spi=0x100,nsh_si=0x03,actions=decap(),decap(),encap(nsh(md_type=1)),set_field:0x07->nsh_ttl,set_field:0x0101->nsh_spi,set_field:0x04->nsh_si,set_field:0x100f0e0d->nsh_c1,set_field:0x0c0b0a09->nsh_c2,set_field:0x08070605->nsh_c3,set_field:0x04030201->nsh_c4,encap(ethernet),set_field:f2:ff:00:00:00:02->dl_dst,set_field:f2:ff:00:00:00:01->dl_src,ovs-p1"])
6292
0c5a65f2 6293NS_CHECK_EXEC([at_ns1], [tcpdump -l -n -xx -U -i p1 > p1.pcap &])
296251ca
AV
6294sleep 1
6295
6296dnl The hex dump is NSH packet with TCP syn payload. pkt=eth/nsh/eth/ip/tcp
6297dnl The nsh_ttl is 8, nsh_spi is 0x100 and nsh_si is 3
6298dnl The packet is sent from p0(at_ns0) interface directed to
6299dnl p1(at_ns1) interface
1ca0323e 6300NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 f2 ff 00 00 00 02 f2 ff 00 00 00 01 89 4f 02 06 01 03 00 01 00 03 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 f2 00 00 00 00 02 f2 00 00 00 00 01 08 00 45 00 00 28 00 01 00 00 40 06 b0 13 c0 a8 00 0a 0a 00 00 0a 04 00 08 00 00 00 00 c8 00 00 00 00 50 02 20 00 b8 5e 00 00 > /dev/null])
296251ca 6301
296251ca 6302dnl Check the expected NSH packet with new fields in the header
0c5a65f2
WT
6303OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0000: *f2ff *0000 *0002 *f2ff *0000* 0001 *894f *01c6" 2>&1 1>/dev/null])
6304OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0010: *0103 *0001 *0104 *100f *0e0d *0c0b *0a09 *0807" 2>&1 1>/dev/null])
6305OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0020: *0605 *0403 *0201 *f200 *0000 *0002 *f200 *0000" 2>&1 1>/dev/null])
6306OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0030: *0001 *0800 *4500 *0028 *0001 *0000 *4006 *b013" 2>&1 1>/dev/null])
6307OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0040: *c0a8 *000a *0a00 *000a *0400 *0800 *0000 *00c8" 2>&1 1>/dev/null])
6308OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0050: *0000 *0000 *5002 *2000 *b85e *0000" 2>&1 1>/dev/null])
296251ca
AV
6309
6310OVS_TRAFFIC_VSWITCHD_STOP
6311AT_CLEANUP
6312
6313
6314AT_SETUP([nsh - forward])
6315OVS_TRAFFIC_VSWITCHD_START()
6316
6317ADD_NAMESPACES(at_ns0, at_ns1, at_ns2)
6318
6319ADD_VETH(p0, at_ns0, br0, "0.0.0.0")
6320ADD_VETH(p1, at_ns1, br0, "0.0.0.0")
6321ADD_VETH(p2, at_ns2, br0, "0.0.0.0")
6322
6323dnl Push two flows to OVS. #1 will check on SPI=0X100, SI=2 and send the
6324dnl packet to at_ns1. #2 will check on SPI=0X100, SI=1 and send the
6325dnl packet to to at_ns2.
6326AT_CHECK([ovs-ofctl -Oopenflow13 add-flow br0 "table=0,priority=100,dl_type=0x894f,nsh_spi=0x100,nsh_si=0x02,actions=ovs-p1"])
6327AT_CHECK([ovs-ofctl -Oopenflow13 add-flow br0 "table=0,priority=100,dl_type=0x894f,nsh_spi=0x100,nsh_si=0x01,actions=ovs-p2"])
6328
0c5a65f2
WT
6329NS_CHECK_EXEC([at_ns1], [tcpdump -l -n -xx -U -i p1 > p1.pcap &])
6330NS_CHECK_EXEC([at_ns2], [tcpdump -l -n -xx -U -i p2 > p2.pcap &])
296251ca
AV
6331sleep 1
6332
6333dnl First send packet from at_ns0 --> OVS with SPI=0x100 and SI=2
1ca0323e 6334NS_CHECK_EXEC([at_ns0], [$PYTHON3 $srcdir/sendpkt.py p0 f2 ff 00 00 00 02 f2 ff 00 00 00 01 89 4f 02 06 01 03 00 01 00 02 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 f2 00 00 00 00 02 f2 00 00 00 00 01 08 00 45 00 00 28 00 01 00 00 40 06 b0 13 c0 a8 00 0a 0a 00 00 0a 04 00 08 00 00 00 00 c8 00 00 00 00 50 02 20 00 b8 5e 00 00 > /dev/null])
296251ca 6335
0c5a65f2
WT
6336dnl Check for the above packet on p1 interface
6337OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0000: *f2ff *0000 *0002 *f2ff *0000 *0001 *894f *0206" 2>&1 1>/dev/null])
6338OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0010: *0103 *0001 *0002 *0102 *0304 *0506 *0708 *090a" 2>&1 1>/dev/null])
6339OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0020: *0b0c *0d0e *0f10 *f200 *0000 *0002 *f200 *0000" 2>&1 1>/dev/null])
6340OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0030: *0001 *0800 *4500 *0028 *0001 *0000 *4006 *b013" 2>&1 1>/dev/null])
6341OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0040: *c0a8 *000a *0a00 *000a *0400 *0800 *0000 *00c8" 2>&1 1>/dev/null])
6342OVS_WAIT_UNTIL([cat p1.pcap | egrep "0x0050: *0000 *0000 *5002 *2000 *b85e *0000" 2>&1 1>/dev/null])
296251ca
AV
6343
6344dnl Send the second packet from at_ns1 --> OVS with SPI=0x100 and SI=1
1ca0323e 6345NS_CHECK_EXEC([at_ns1], [$PYTHON3 $srcdir/sendpkt.py p1 f2 ff 00 00 00 02 f2 ff 00 00 00 01 89 4f 01 c6 01 03 00 01 00 01 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 f2 00 00 00 00 02 f2 00 00 00 00 01 08 00 45 00 00 28 00 01 00 00 40 06 b0 13 c0 a8 00 0a 0a 00 00 0a 04 00 08 00 00 00 00 c8 00 00 00 00 50 02 20 00 b8 5e 00 00 > /dev/null])
296251ca 6346
0c5a65f2
WT
6347dnl Check for the above packet on p2 interface
6348OVS_WAIT_UNTIL([cat p2.pcap | egrep "0x0000: *f2ff *0000 *0002 *f2ff *0000 *0001 *894f *01c6" 2>&1 1>/dev/null])
6349OVS_WAIT_UNTIL([cat p2.pcap | egrep "0x0010: *0103 *0001 *0001 *0102 *0304 *0506 *0708 *090a" 2>&1 1>/dev/null])
6350OVS_WAIT_UNTIL([cat p2.pcap | egrep "0x0020: *0b0c *0d0e *0f10 *f200 *0000 *0002 *f200 *0000" 2>&1 1>/dev/null])
6351OVS_WAIT_UNTIL([cat p2.pcap | egrep "0x0030: *0001 *0800 *4500 *0028 *0001 *0000 *4006 *b013" 2>&1 1>/dev/null])
6352OVS_WAIT_UNTIL([cat p2.pcap | egrep "0x0040: *c0a8 *000a *0a00 *000a *0400 *0800 *0000 *00c8" 2>&1 1>/dev/null])
6353OVS_WAIT_UNTIL([cat p2.pcap | egrep "0x0050: *0000 *0000 *5002 *2000 *b85e *0000" 2>&1 1>/dev/null])
296251ca 6354
79d6e24f
EG
6355OVS_TRAFFIC_VSWITCHD_STOP
6356AT_CLEANUP