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