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