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