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