1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4# This test is for checking the VXLAN vni filtering api and
5# datapath.
6# It simulates two hypervisors running two VMs each using four network
7# six namespaces: two for the HVs, four for the VMs. Each VM is
8# connected to a separate bridge. The VM's use overlapping vlans and
9# hence the separate bridge domain. Each vxlan device is a collect
10# metadata device with vni filtering and hence has the ability to
11# terminate configured vni's only.
12
13#  +--------------------------------+     +------------------------------------+
14#  |  vm-11 netns                   |     |  vm-21 netns                       |
15#  |                                |     |                                    |
16#  |+------------+  +-------------+ |     |+-------------+ +----------------+  |
17#  ||veth-11.10  |  |veth-11.20   | |     ||veth-21.10   | | veth-21.20     |  |
18#  ||10.0.10.11/24  |10.0.20.11/24| |     ||10.0.10.21/24| | 10.0.20.21/24  |  |
19#  |+------|-----+  +|------------+ |     |+-----------|-+ +---|------------+  |
20#  |       |         |              |     |            |       |               |
21#  |       |         |              |     |         +------------+             |
22#  |      +------------+            |     |         | veth-21    |             |
23#  |      | veth-11    |            |     |         |            |             |
24#  |      |            |            |     |         +-----|------+             |
25#  |      +-----|------+            |     |               |                    |
26#  |            |                   |     |               |                    |
27#  +------------|-------------------+     +---------------|--------------------+
28#  +------------|-----------------------------------------|-------------------+
29#  |      +-----|------+                            +-----|------+            |
30#  |      |vethhv-11   |                            |vethhv-21   |            |
31#  |      +----|-------+                            +-----|------+            |
32#  |       +---|---+                                  +---|--+                |
33#  |       |  br1  |                                  | br2  |                |
34#  |       +---|---+                                  +---|--+                |
35#  |       +---|----+                                 +---|--+                |
36#  |       |  vxlan1|                                 |vxlan2|                |
37#  |       +--|-----+                                 +--|---+                |
38#  |          |                                          |                    |
39#  |          |         +---------------------+          |                    |
40#  |          |         |veth0                |          |                    |
41#  |          +---------|172.16.0.1/24        -----------+                    |
42#  |                    |2002:fee1::1/64      |                               |
43#  | hv-1 netns         +--------|------------+                               |
44#  +-----------------------------|--------------------------------------------+
45#                                |
46#  +-----------------------------|--------------------------------------------+
47#  | hv-2 netns         +--------|-------------+                              |
48#  |                    | veth0                |                              |
49#  |             +------| 172.16.0.2/24        |---+                          |
50#  |             |      | 2002:fee1::2/64      |   |                          |
51#  |             |      |                      |   |                          |
52#  |             |      +----------------------+   |         -                |
53#  |             |                                 |                          |
54#  |           +-|-------+                +--------|-+                        |
55#  |           | vxlan1  |                |  vxlan2  |                        |
56#  |           +----|----+                +---|------+                        |
57#  |             +--|--+                    +-|---+                           |
58#  |             | br1 |                    | br2 |                           |
59#  |             +--|--+                    +--|--+                           |
60#  |          +-----|-------+             +----|-------+                      |
61#  |          | vethhv-12   |             |vethhv-22   |                      |
62#  |          +------|------+             +-------|----+                      |
63#  +-----------------|----------------------------|---------------------------+
64#                    |                            |
65#  +-----------------|-----------------+ +--------|---------------------------+
66#  |         +-------|---+             | |     +--|---------+                 |
67#  |         | veth-12   |             | |     |veth-22     |                 |
68#  |         +-|--------|+             | |     +--|--------|+                 |
69#  |           |        |              | |        |        |                  |
70#  |+----------|--+ +---|-----------+  | |+-------|-----+ +|---------------+  |
71#  ||veth-12.10   | |veth-12.20     |  | ||veth-22.10   | |veth-22.20      |  |
72#  ||10.0.10.12/24| |10.0.20.12/24  |  | ||10.0.10.22/24| |10.0.20.22/24   |  |
73#  |+-------------+ +---------------+  | |+-------------+ +----------------+  |
74#  |                                   | |                                    |
75#  |                                   | |                                    |
76#  | vm-12 netns                       | |vm-22 netns                         |
77#  +-----------------------------------+ +------------------------------------+
78#
79#
80# This test tests the new vxlan vnifiltering api
81
82ret=0
83# Kselftest framework requirement - SKIP code is 4.
84ksft_skip=4
85
86# all tests in this script. Can be overridden with -t option
87TESTS="
88	vxlan_vnifilter_api
89	vxlan_vnifilter_datapath
90	vxlan_vnifilter_datapath_pervni
91	vxlan_vnifilter_datapath_mgroup
92	vxlan_vnifilter_datapath_mgroup_pervni
93	vxlan_vnifilter_metadata_and_traditional_mix
94"
95VERBOSE=0
96PAUSE_ON_FAIL=no
97PAUSE=no
98
99which ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping)
100
101log_test()
102{
103	local rc=$1
104	local expected=$2
105	local msg="$3"
106
107	if [ ${rc} -eq ${expected} ]; then
108		printf "    TEST: %-60s  [ OK ]\n" "${msg}"
109		nsuccess=$((nsuccess+1))
110	else
111		ret=1
112		nfail=$((nfail+1))
113		printf "    TEST: %-60s  [FAIL]\n" "${msg}"
114		if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
115		echo
116			echo "hit enter to continue, 'q' to quit"
117			read a
118			[ "$a" = "q" ] && exit 1
119		fi
120	fi
121
122	if [ "${PAUSE}" = "yes" ]; then
123		echo
124		echo "hit enter to continue, 'q' to quit"
125		read a
126		[ "$a" = "q" ] && exit 1
127	fi
128}
129
130run_cmd()
131{
132	local cmd="$1"
133	local out
134	local stderr="2>/dev/null"
135
136	if [ "$VERBOSE" = "1" ]; then
137		printf "COMMAND: $cmd\n"
138		stderr=
139	fi
140
141	out=$(eval $cmd $stderr)
142	rc=$?
143	if [ "$VERBOSE" = "1" -a -n "$out" ]; then
144		echo "    $out"
145	fi
146
147	return $rc
148}
149
150check_hv_connectivity() {
151	ip netns exec hv-1 ping -c 1 -W 1 $1 &>/dev/null
152	sleep 1
153	ip netns exec hv-1 ping -c 1 -W 1 $2 &>/dev/null
154
155	return $?
156}
157
158check_vm_connectivity() {
159	run_cmd "ip netns exec vm-11 ping -c 1 -W 1 10.0.10.12"
160	log_test $? 0 "VM connectivity over $1 (ipv4 default rdst)"
161
162	run_cmd "ip netns exec vm-21 ping -c 1 -W 1 10.0.10.22"
163	log_test $? 0 "VM connectivity over $1 (ipv6 default rdst)"
164}
165
166cleanup() {
167	ip link del veth-hv-1 2>/dev/null || true
168	ip link del vethhv-11 vethhv-12 vethhv-21 vethhv-22 2>/dev/null || true
169
170	for ns in hv-1 hv-2 vm-11 vm-21 vm-12 vm-22 vm-31 vm-32; do
171		ip netns del $ns 2>/dev/null || true
172	done
173}
174
175trap cleanup EXIT
176
177setup-hv-networking() {
178	hv=$1
179	local1=$2
180	mask1=$3
181	local2=$4
182	mask2=$5
183
184	ip netns add hv-$hv
185	ip link set veth-hv-$hv netns hv-$hv
186	ip -netns hv-$hv link set veth-hv-$hv name veth0
187	ip -netns hv-$hv addr add $local1/$mask1 dev veth0
188	ip -netns hv-$hv addr add $local2/$mask2 dev veth0
189	ip -netns hv-$hv link set veth0 up
190}
191
192# Setups a "VM" simulated by a netns an a veth pair
193# example: setup-vm <hvid> <vmid> <brid> <VATTRS> <mcast_for_bum>
194# VATTRS = comma separated "<vlan>-<v[46]>-<localip>-<remoteip>-<VTYPE>-<vxlandstport>"
195# VTYPE = vxlan device type. "default = traditional device, metadata = metadata device
196#         vnifilter = vnifiltering device,
197#         vnifilterg = vnifiltering device with per vni group/remote"
198# example:
199#     setup-vm 1 11 1 \
200#         10-v4-172.16.0.1-239.1.1.100-vnifilterg,20-v4-172.16.0.1-239.1.1.100-vnifilterg 1
201#
202setup-vm() {
203	hvid=$1
204	vmid=$2
205	brid=$3
206	vattrs=$4
207	mcast=$5
208	lastvxlandev=""
209
210	# create bridge
211	ip -netns hv-$hvid link add br$brid type bridge vlan_filtering 1 vlan_default_pvid 0 \
212		mcast_snooping 0
213	ip -netns hv-$hvid link set br$brid up
214
215	# create vm namespace and interfaces and connect to hypervisor
216	# namespace
217	ip netns add vm-$vmid
218	hvvethif="vethhv-$vmid"
219	vmvethif="veth-$vmid"
220	ip link add $hvvethif type veth peer name $vmvethif
221	ip link set $hvvethif netns hv-$hvid
222	ip link set $vmvethif netns vm-$vmid
223	ip -netns hv-$hvid link set $hvvethif up
224	ip -netns vm-$vmid link set $vmvethif up
225	ip -netns hv-$hvid link set $hvvethif master br$brid
226
227	# configure VM vlan/vni filtering on hypervisor
228	for vmap in $(echo $vattrs | cut -d "," -f1- --output-delimiter=' ')
229	do
230	local vid=$(echo $vmap | awk -F'-' '{print ($1)}')
231	local family=$(echo $vmap | awk -F'-' '{print ($2)}')
232	local localip=$(echo $vmap | awk -F'-' '{print ($3)}')
233	local group=$(echo $vmap | awk -F'-' '{print ($4)}')
234	local vtype=$(echo $vmap | awk -F'-' '{print ($5)}')
235	local port=$(echo $vmap | awk -F'-' '{print ($6)}')
236
237	ip -netns vm-$vmid link add name $vmvethif.$vid link $vmvethif type vlan id $vid
238	ip -netns vm-$vmid addr add 10.0.$vid.$vmid/24 dev $vmvethif.$vid
239	ip -netns vm-$vmid link set $vmvethif.$vid up
240
241	tid=$vid
242	vxlandev="vxlan$brid"
243	vxlandevflags=""
244
245	if [[ -n $vtype && $vtype == "metadata" ]]; then
246	   vxlandevflags="$vxlandevflags external"
247	elif [[ -n $vtype && $vtype == "vnifilter" || $vtype == "vnifilterg" ]]; then
248	   vxlandevflags="$vxlandevflags external vnifilter"
249	   tid=$((vid+brid))
250	else
251	   vxlandevflags="$vxlandevflags id $tid"
252	   vxlandev="vxlan$tid"
253	fi
254
255	if [[ -n $vtype && $vtype != "vnifilterg" ]]; then
256	   if [[ -n "$group" && "$group" != "null" ]]; then
257	      if [ $mcast -eq 1 ]; then
258		 vxlandevflags="$vxlandevflags group $group"
259	      else
260		 vxlandevflags="$vxlandevflags remote $group"
261	      fi
262	   fi
263	fi
264
265	if [[ -n "$port" && "$port" != "default" ]]; then
266	      vxlandevflags="$vxlandevflags dstport $port"
267	fi
268
269	# create vxlan device
270	if [ "$vxlandev" != "$lastvxlandev" ]; then
271	     ip -netns hv-$hvid link add $vxlandev type vxlan local $localip $vxlandevflags dev veth0 2>/dev/null
272	     ip -netns hv-$hvid link set $vxlandev master br$brid
273	     ip -netns hv-$hvid link set $vxlandev up
274	     lastvxlandev=$vxlandev
275	fi
276
277	# add vlan
278	bridge -netns hv-$hvid vlan add vid $vid dev $hvvethif
279	bridge -netns hv-$hvid vlan add vid $vid pvid dev $vxlandev
280
281	# Add bridge vni filter for tx
282	if [[ -n $vtype && $vtype == "metadata" || $vtype == "vnifilter" || $vtype == "vnifilterg" ]]; then
283	   bridge -netns hv-$hvid link set dev $vxlandev vlan_tunnel on
284	   bridge -netns hv-$hvid vlan add dev $vxlandev vid $vid tunnel_info id $tid
285	fi
286
287	if [[ -n $vtype && $vtype == "metadata" ]]; then
288	   bridge -netns hv-$hvid fdb add 00:00:00:00:00:00 dev $vxlandev \
289								src_vni $tid vni $tid dst $group self
290	elif [[ -n $vtype && $vtype == "vnifilter" ]]; then
291	   # Add per vni rx filter with 'bridge vni' api
292	   bridge -netns hv-$hvid vni add dev $vxlandev vni $tid
293	elif [[ -n $vtype && $vtype == "vnifilterg" ]]; then
294	   # Add per vni group config with 'bridge vni' api
295	   if [ -n "$group" ]; then
296	      if [ "$family" == "v4" ]; then
297		 if [ $mcast -eq 1 ]; then
298		    bridge -netns hv-$hvid vni add dev $vxlandev vni $tid group $group
299		 else
300		    bridge -netns hv-$hvid vni add dev $vxlandev vni $tid remote $group
301		 fi
302	      else
303		 if [ $mcast -eq 1 ]; then
304		    bridge -netns hv-$hvid vni add dev $vxlandev vni $tid group6 $group
305		 else
306		    bridge -netns hv-$hvid vni add dev $vxlandev vni $tid remote6 $group
307		 fi
308	      fi
309	   fi
310	fi
311	done
312}
313
314setup_vnifilter_api()
315{
316	ip link add veth-host type veth peer name veth-testns
317	ip netns add testns
318	ip link set veth-testns netns testns
319}
320
321cleanup_vnifilter_api()
322{
323	ip link del veth-host 2>/dev/null || true
324	ip netns del testns 2>/dev/null || true
325}
326
327# tests vxlan filtering api
328vxlan_vnifilter_api()
329{
330	hv1addr1="172.16.0.1"
331	hv2addr1="172.16.0.2"
332	hv1addr2="2002:fee1::1"
333	hv2addr2="2002:fee1::2"
334	localip="172.16.0.1"
335	group="239.1.1.101"
336
337	cleanup_vnifilter_api &>/dev/null
338	setup_vnifilter_api
339
340	# Duplicate vni test
341	# create non-vnifiltering traditional vni device
342	run_cmd "ip -netns testns link add vxlan100 type vxlan id 100 local $localip dev veth-testns dstport 4789"
343	log_test $? 0 "Create traditional vxlan device"
344
345	# create vni filtering device
346	run_cmd "ip -netns testns link add vxlan-ext1 type vxlan vnifilter local $localip dev veth-testns dstport 4789"
347	log_test $? 1 "Cannot create vnifilter device without external flag"
348
349	run_cmd "ip -netns testns link add vxlan-ext1 type vxlan external vnifilter local $localip dev veth-testns dstport 4789"
350	log_test $? 0 "Creating external vxlan device with vnifilter flag"
351
352	run_cmd "bridge -netns testns vni add dev vxlan-ext1 vni 100"
353	log_test $? 0 "Cannot set in-use vni id on vnifiltering device"
354
355	run_cmd "bridge -netns testns vni add dev vxlan-ext1 vni 200"
356	log_test $? 0 "Set new vni id on vnifiltering device"
357
358	run_cmd "ip -netns testns link add vxlan-ext2 type vxlan external vnifilter local $localip dev veth-testns dstport 4789"
359	log_test $? 0 "Create second external vxlan device with vnifilter flag"
360
361	run_cmd "bridge -netns testns vni add dev vxlan-ext2 vni 200"
362	log_test $? 255 "Cannot set in-use vni id on vnifiltering device"
363
364	run_cmd "bridge -netns testns vni add dev vxlan-ext2 vni 300"
365	log_test $? 0 "Set new vni id on vnifiltering device"
366
367	# check in bridge vni show
368	run_cmd "bridge -netns testns vni add dev vxlan-ext2 vni 300"
369	log_test $? 0 "Update vni id on vnifiltering device"
370
371	run_cmd "bridge -netns testns vni add dev vxlan-ext2 vni 400"
372	log_test $? 0 "Add new vni id on vnifiltering device"
373
374	# add multicast group per vni
375	run_cmd "bridge -netns testns vni add dev vxlan-ext1 vni 200 group $group"
376	log_test $? 0 "Set multicast group on existing vni"
377
378	# add multicast group per vni
379	run_cmd "bridge -netns testns vni add dev vxlan-ext2 vni 300 group $group"
380	log_test $? 0 "Set multicast group on existing vni"
381
382	# set vnifilter on an existing external vxlan device
383	run_cmd "ip -netns testns link set dev vxlan-ext1 type vxlan external vnifilter"
384	log_test $? 2 "Cannot set vnifilter flag on a device"
385
386	# change vxlan vnifilter flag
387	run_cmd "ip -netns testns link set dev vxlan-ext1 type vxlan external novnifilter"
388	log_test $? 2 "Cannot unset vnifilter flag on a device"
389}
390
391# Sanity test vnifilter datapath
392# vnifilter vnis inherit BUM group from
393# vxlan device
394vxlan_vnifilter_datapath()
395{
396	hv1addr1="172.16.0.1"
397	hv2addr1="172.16.0.2"
398	hv1addr2="2002:fee1::1"
399	hv2addr2="2002:fee1::2"
400
401	ip link add veth-hv-1 type veth peer name veth-hv-2
402	setup-hv-networking 1 $hv1addr1 24 $hv1addr2 64 $hv2addr1 $hv2addr2
403	setup-hv-networking 2 $hv2addr1 24 $hv2addr2 64 $hv1addr1 $hv1addr2
404
405        check_hv_connectivity hv2addr1 hv2addr2
406
407	setup-vm 1 11 1 10-v4-$hv1addr1-$hv2addr1-vnifilter,20-v4-$hv1addr1-$hv2addr1-vnifilter 0
408	setup-vm 1 21 2 10-v6-$hv1addr2-$hv2addr2-vnifilter,20-v6-$hv1addr2-$hv2addr2-vnifilter 0
409
410	setup-vm 2 12 1 10-v4-$hv2addr1-$hv1addr1-vnifilter,20-v4-$hv2addr1-$hv1addr1-vnifilter 0
411	setup-vm 2 22 2 10-v6-$hv2addr2-$hv1addr2-vnifilter,20-v6-$hv2addr2-$hv1addr2-vnifilter 0
412
413        check_vm_connectivity "vnifiltering vxlan"
414}
415
416# Sanity test vnifilter datapath
417# with vnifilter per vni configured BUM
418# group/remote
419vxlan_vnifilter_datapath_pervni()
420{
421	hv1addr1="172.16.0.1"
422	hv2addr1="172.16.0.2"
423	hv1addr2="2002:fee1::1"
424	hv2addr2="2002:fee1::2"
425
426	ip link add veth-hv-1 type veth peer name veth-hv-2
427	setup-hv-networking 1 $hv1addr1 24 $hv1addr2 64
428	setup-hv-networking 2 $hv2addr1 24 $hv2addr2 64
429
430        check_hv_connectivity hv2addr1 hv2addr2
431
432	setup-vm 1 11 1 10-v4-$hv1addr1-$hv2addr1-vnifilterg,20-v4-$hv1addr1-$hv2addr1-vnifilterg 0
433	setup-vm 1 21 2 10-v6-$hv1addr2-$hv2addr2-vnifilterg,20-v6-$hv1addr2-$hv2addr2-vnifilterg 0
434
435	setup-vm 2 12 1 10-v4-$hv2addr1-$hv1addr1-vnifilterg,20-v4-$hv2addr1-$hv1addr1-vnifilterg 0
436	setup-vm 2 22 2 10-v6-$hv2addr2-$hv1addr2-vnifilterg,20-v6-$hv2addr2-$hv1addr2-vnifilterg 0
437
438        check_vm_connectivity "vnifiltering vxlan pervni remote"
439}
440
441
442vxlan_vnifilter_datapath_mgroup()
443{
444	hv1addr1="172.16.0.1"
445	hv2addr1="172.16.0.2"
446	hv1addr2="2002:fee1::1"
447	hv2addr2="2002:fee1::2"
448        group="239.1.1.100"
449        group6="ff07::1"
450
451	ip link add veth-hv-1 type veth peer name veth-hv-2
452	setup-hv-networking 1 $hv1addr1 24 $hv1addr2 64
453	setup-hv-networking 2 $hv2addr1 24 $hv2addr2 64
454
455        check_hv_connectivity hv2addr1 hv2addr2
456
457	setup-vm 1 11 1 10-v4-$hv1addr1-$group-vnifilter,20-v4-$hv1addr1-$group-vnifilter 1
458	setup-vm 1 21 2 "10-v6-$hv1addr2-$group6-vnifilter,20-v6-$hv1addr2-$group6-vnifilter" 1
459
460        setup-vm 2 12 1 10-v4-$hv2addr1-$group-vnifilter,20-v4-$hv2addr1-$group-vnifilter 1
461        setup-vm 2 22 2 10-v6-$hv2addr2-$group6-vnifilter,20-v6-$hv2addr2-$group6-vnifilter 1
462
463        check_vm_connectivity "vnifiltering vxlan mgroup"
464}
465
466vxlan_vnifilter_datapath_mgroup_pervni()
467{
468	hv1addr1="172.16.0.1"
469	hv2addr1="172.16.0.2"
470	hv1addr2="2002:fee1::1"
471	hv2addr2="2002:fee1::2"
472        group="239.1.1.100"
473        group6="ff07::1"
474
475	ip link add veth-hv-1 type veth peer name veth-hv-2
476	setup-hv-networking 1 $hv1addr1 24 $hv1addr2 64
477	setup-hv-networking 2 $hv2addr1 24 $hv2addr2 64
478
479        check_hv_connectivity hv2addr1 hv2addr2
480
481	setup-vm 1 11 1 10-v4-$hv1addr1-$group-vnifilterg,20-v4-$hv1addr1-$group-vnifilterg 1
482	setup-vm 1 21 2 10-v6-$hv1addr2-$group6-vnifilterg,20-v6-$hv1addr2-$group6-vnifilterg 1
483
484        setup-vm 2 12 1 10-v4-$hv2addr1-$group-vnifilterg,20-v4-$hv2addr1-$group-vnifilterg 1
485        setup-vm 2 22 2 10-v6-$hv2addr2-$group6-vnifilterg,20-v6-$hv2addr2-$group6-vnifilterg 1
486
487        check_vm_connectivity "vnifiltering vxlan pervni mgroup"
488}
489
490vxlan_vnifilter_metadata_and_traditional_mix()
491{
492	hv1addr1="172.16.0.1"
493	hv2addr1="172.16.0.2"
494	hv1addr2="2002:fee1::1"
495	hv2addr2="2002:fee1::2"
496
497	ip link add veth-hv-1 type veth peer name veth-hv-2
498	setup-hv-networking 1 $hv1addr1 24 $hv1addr2 64
499	setup-hv-networking 2 $hv2addr1 24 $hv2addr2 64
500
501        check_hv_connectivity hv2addr1 hv2addr2
502
503	setup-vm 1 11 1 10-v4-$hv1addr1-$hv2addr1-vnifilter,20-v4-$hv1addr1-$hv2addr1-vnifilter 0
504	setup-vm 1 21 2 10-v6-$hv1addr2-$hv2addr2-vnifilter,20-v6-$hv1addr2-$hv2addr2-vnifilter 0
505	setup-vm 1 31 3 30-v4-$hv1addr1-$hv2addr1-default-4790,40-v6-$hv1addr2-$hv2addr2-default-4790,50-v4-$hv1addr1-$hv2addr1-metadata-4791 0
506
507
508	setup-vm 2 12 1 10-v4-$hv2addr1-$hv1addr1-vnifilter,20-v4-$hv2addr1-$hv1addr1-vnifilter 0
509	setup-vm 2 22 2 10-v6-$hv2addr2-$hv1addr2-vnifilter,20-v6-$hv2addr2-$hv1addr2-vnifilter 0
510	setup-vm 2 32 3 30-v4-$hv2addr1-$hv1addr1-default-4790,40-v6-$hv2addr2-$hv1addr2-default-4790,50-v4-$hv2addr1-$hv1addr1-metadata-4791 0
511
512        check_vm_connectivity "vnifiltering vxlan pervni remote mix"
513
514	# check VM connectivity over traditional/non-vxlan filtering vxlan devices
515	run_cmd "ip netns exec vm-31 ping -c 1 -W 1 10.0.30.32"
516        log_test $? 0 "VM connectivity over traditional vxlan (ipv4 default rdst)"
517
518	run_cmd "ip netns exec vm-31 ping -c 1 -W 1 10.0.40.32"
519        log_test $? 0 "VM connectivity over traditional vxlan (ipv6 default rdst)"
520
521	run_cmd "ip netns exec vm-31 ping -c 1 -W 1 10.0.50.32"
522        log_test $? 0 "VM connectivity over metadata nonfiltering vxlan (ipv4 default rdst)"
523}
524
525while getopts :t:pP46hv o
526do
527	case $o in
528		t) TESTS=$OPTARG;;
529		p) PAUSE_ON_FAIL=yes;;
530		P) PAUSE=yes;;
531		v) VERBOSE=$(($VERBOSE + 1));;
532		h) usage; exit 0;;
533		*) usage; exit 1;;
534	esac
535done
536
537# make sure we don't pause twice
538[ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no
539
540if [ "$(id -u)" -ne 0 ];then
541	echo "SKIP: Need root privileges"
542	exit $ksft_skip;
543fi
544
545if [ ! -x "$(command -v ip)" ]; then
546	echo "SKIP: Could not run test without ip tool"
547	exit $ksft_skip
548fi
549
550ip link help vxlan 2>&1 | grep -q "vnifilter"
551if [ $? -ne 0 ]; then
552   echo "SKIP: iproute2 too old, missing vxlan dev vnifilter setting"
553   sync
554   exit $ksft_skip
555fi
556
557bridge vni help 2>&1 | grep -q "Usage: bridge vni"
558if [ $? -ne 0 ]; then
559   echo "SKIP: iproute2 bridge lacks vxlan vnifiltering support"
560   exit $ksft_skip
561fi
562
563# start clean
564cleanup &> /dev/null
565
566for t in $TESTS
567do
568	case $t in
569	none) setup; exit 0;;
570	*) $t; cleanup;;
571	esac
572done
573
574if [ "$TESTS" != "none" ]; then
575	printf "\nTests passed: %3d\n" ${nsuccess}
576	printf "Tests failed: %3d\n"   ${nfail}
577fi
578
579exit $ret
580