xref: /openbsd/regress/sys/net/vxlan/vxlan_2.sh (revision 09467b48)
1#!/bin/ksh
2#	$Id: vxlan_2.sh,v 1.2 2016/11/30 22:21:20 vgross Exp $
3
4
5CAPFILE=$(mktemp -t regress_vxlan.XXXXXXX)
6
7
8CURDIR=$(cd $(dirname $0); pwd)
9
10
11cleanup() {
12	for ifname in $CLEANUP_IFS; do
13		$SUDO ifconfig $ifname down
14	done
15	for ifname in $CLEANUP_IFS; do
16		$SUDO ifconfig $ifname destroy
17	done
18	rm $CAPFILE
19}
20
21do_ping()
22{
23	local source="$1"
24	local dest="${VXLAN_NETID}${2}"
25	$PING -q -c 3 -w 1 -V "$source" "$dest" | grep -q ' 0.0% packet loss' && return
26	echo "Failed to ping $dest from vstack $source"
27	STATUS=1
28}
29
30cross_ping() {
31	local tcpdump_expr='udp src port 4789 and dst port 4789 and (ether multicast or ip multicast)'
32	local nomcast=
33	[[ $1 == nomcast ]] && nomcast=1 && shift
34	echo "cross_ping: vstacks=$@, ping=$PING, nomcast=$nomcast"
35	while [[ $# -gt 1 ]]; do
36		local source=$1 ; shift
37		:> $CAPFILE
38		if [[ -n $nomcast ]]; then
39			$SUDO tcpdump -i pair${source}0 -n -s 512 -w $CAPFILE "$tcpdump_expr" 2> /dev/null &
40			while ! [[ -s $CAPFILE ]]; do :; done
41		fi
42		for target in $@ ; do
43			do_ping $source $target
44		done
45		sleep 1
46		if [[ -n $nomcast ]]; then
47			$SUDO pkill -f "tcpdump -i pair${source}0 -n"
48			wait
49			if $SUDO tcpdump -s 512 -nr $CAPFILE | grep '.'; then
50				echo "Multicast traffic detected when pinging from rdomain $1"
51				STATUS=1
52			fi
53		fi
54	done
55}
56
57test_inet6()
58{
59	VXLAN_NETID="fd42::"
60	PING=ping6
61	for vstack in "$@"; do
62		$SUDO ifconfig "vxlan$vstack" inet6 "${VXLAN_NETID}${vstack}/64"
63	done
64	sleep 2 # sleep off DAD
65	cross_ping "$@"
66	[[ -n $DYNAMIC ]] && cross_ping ${DYNAMIC:+nomcast} "$@"
67	for vstack in "$@"; do
68		$SUDO ifconfig "vxlan$vstack" inet6 "${VXLAN_NETID}${vstack}/64" delete
69	done
70}
71
72test_inet()
73{
74	VXLAN_NETID="10.42.0."
75	PING=ping
76	for vstack in "$@"; do
77		$SUDO ifconfig "vxlan$vstack" inet "${VXLAN_NETID}${vstack}/24"
78	done
79	cross_ping "$@"
80	[[ -n $DYNAMIC ]] && cross_ping ${DYNAMIC:+nomcast} "$@"
81	for vstack in "$@"; do
82		$SUDO ifconfig "vxlan$vstack" inet "${VXLAN_NETID}${vstack}/24" delete
83	done
84}
85
86vstack_add() {
87	local vstack=$1
88	local vstack_pairname="pair${vstack}0"
89	local vstack_tunsrc="${PAIR_NETID}${vstack}"
90	[[ $AF == inet6 ]] && tundst_sufx="%${vstack_pairname}"
91
92	for ifname in "$vstack_pairname" "vxlan$vstack" "bridge$vstack"; do
93		iface_exists $ifname && abort_test "interface $ifname already exists"
94		CLEANUP_IFS="$ifname $CLEANUP_IFS"
95	done
96	$SUDO ifconfig "$vstack_pairname" rdomain "$vstack" $IFCONFIG_OPTS
97	$SUDO ifconfig "$vstack_pairname" "$AF" "${vstack_tunsrc}${PAIR_PREFX}" up
98	$SUDO ifconfig "vxlan$vstack" rdomain "$vstack" tunneldomain "$vstack" $IFCONFIG_OPTS
99	$SUDO ifconfig "vxlan$vstack" vnetid "$VNETID" tunnel "$vstack_tunsrc" "${VXLAN_TUNDST}${tundst_sufx}" up
100	[[ -n $DYNAMIC ]] && $SUDO ifconfig "bridge$vstack" rdomain "$vstack" add "vxlan$vstack" $IFCONFIG_OPTS up
101}
102
103
104. ${CURDIR}/vxlan_subr
105
106VNETID=0
107for rdom in $RDOMAINS; do
108	rdomain_is_used $rdom || abort_test "rdomain $rdom already in use"
109	[[ $rdom -ge $VNETID ]] && VNETID=$(( rdom + 1 ))
110done
111
112rdomain_is_used $VNETID || abort_test "rdomain $rdom already in use"
113iface_exists "bridge$VNETID" && abort_test "interface bridge${VNETID} already exists"
114$SUDO ifconfig "bridge$VNETID" rdomain "$VNETID" $IFCONFIG_OPTS up
115
116case $AF in
117	inet)
118		PAIR_NETID="10.23.0."
119		PAIR_PREFX="/24"
120		VXLAN_TUNDST="224.0.2.$VNETID"
121		;;
122	inet6)
123		PAIR_NETID="fd23::"
124		PAIR_PREFX="/64"
125		VXLAN_TUNDST="ff02::$VNETID"
126		;;
127	*)
128		echo "Unknown AF $AF !"
129		exit 1
130esac
131
132trap cleanup 0 1 2 3 15
133
134for id in $RDOMAINS; do
135	vstack_add $id
136	iface_exists "pair${id}1" && abort_test "interface pair${id}1 already exists"
137	$SUDO ifconfig "pair${id}1" rdomain $VNETID $IFCONFIG_OPTS up
138	CLEANUP_IFS="pair${id}1 $CLEANUP_IFS"
139	$SUDO ifconfig "pair${id}1" patch "pair${id}0"
140	$SUDO ifconfig "bridge$VNETID" add "pair${id}1"
141done
142
143CLEANUP_IFS="bridge$VNETID $CLEANUP_IFS"
144
145STATUS=0
146
147test_inet $RDOMAINS
148
149test_inet6 $RDOMAINS
150
151exit $STATUS
152