xref: /linux/tools/testing/selftests/net/ipvtap_test.sh (revision 0a80e38d0fe1fe7b59c1e93ad908c4148a15926a)
1*8becfe16SDmitry Skorodumov#!/bin/bash
2*8becfe16SDmitry Skorodumov# SPDX-License-Identifier: GPL-2.0
3*8becfe16SDmitry Skorodumov#
4*8becfe16SDmitry Skorodumov# Simple tests for ipvtap
5*8becfe16SDmitry Skorodumov
6*8becfe16SDmitry Skorodumov
7*8becfe16SDmitry Skorodumov#
8*8becfe16SDmitry Skorodumov# The testing environment looks this way:
9*8becfe16SDmitry Skorodumov#
10*8becfe16SDmitry Skorodumov# |------HNS-------|     |------PHY-------|
11*8becfe16SDmitry Skorodumov# |      veth<----------------->veth      |
12*8becfe16SDmitry Skorodumov# |------|--|------|     |----------------|
13*8becfe16SDmitry Skorodumov#        |  |
14*8becfe16SDmitry Skorodumov#        |  |            |-----TST0-------|
15*8becfe16SDmitry Skorodumov#        |  |------------|----ipvlan      |
16*8becfe16SDmitry Skorodumov#        |               |----------------|
17*8becfe16SDmitry Skorodumov#        |
18*8becfe16SDmitry Skorodumov#        |               |-----TST1-------|
19*8becfe16SDmitry Skorodumov#        |---------------|----ipvlan      |
20*8becfe16SDmitry Skorodumov#                        |----------------|
21*8becfe16SDmitry Skorodumov#
22*8becfe16SDmitry Skorodumov
23*8becfe16SDmitry SkorodumovALL_TESTS="
24*8becfe16SDmitry Skorodumov	test_ip_set
25*8becfe16SDmitry Skorodumov"
26*8becfe16SDmitry Skorodumov
27*8becfe16SDmitry Skorodumovsource lib.sh
28*8becfe16SDmitry Skorodumov
29*8becfe16SDmitry SkorodumovDEBUG=0
30*8becfe16SDmitry Skorodumov
31*8becfe16SDmitry SkorodumovVETH_HOST=vethtst.h
32*8becfe16SDmitry SkorodumovVETH_PHY=vethtst.p
33*8becfe16SDmitry Skorodumov
34*8becfe16SDmitry SkorodumovNS_COUNT=32
35*8becfe16SDmitry SkorodumovIP_ITERATIONS=1024
36*8becfe16SDmitry SkorodumovIPSET_TIMEOUT="60s"
37*8becfe16SDmitry Skorodumov
38*8becfe16SDmitry Skorodumovns_run() {
39*8becfe16SDmitry Skorodumov	ns=$1
40*8becfe16SDmitry Skorodumov	shift
41*8becfe16SDmitry Skorodumov	if [[ "$ns" == "global" ]]; then
42*8becfe16SDmitry Skorodumov		"$@" >/dev/null
43*8becfe16SDmitry Skorodumov	else
44*8becfe16SDmitry Skorodumov		ip netns exec "$ns" "$@" >/dev/null
45*8becfe16SDmitry Skorodumov	fi
46*8becfe16SDmitry Skorodumov}
47*8becfe16SDmitry Skorodumov
48*8becfe16SDmitry Skorodumovtest_ip_setup_env() {
49*8becfe16SDmitry Skorodumov	setup_ns NS_PHY
50*8becfe16SDmitry Skorodumov	setup_ns HST_NS
51*8becfe16SDmitry Skorodumov
52*8becfe16SDmitry Skorodumov	# setup simulated other-host (phy) and host itself
53*8becfe16SDmitry Skorodumov	ns_run "$HST_NS" ip link add $VETH_HOST type veth peer name $VETH_PHY \
54*8becfe16SDmitry Skorodumov		netns "$NS_PHY" >/dev/null
55*8becfe16SDmitry Skorodumov	ns_run "$HST_NS" ip link set $VETH_HOST up
56*8becfe16SDmitry Skorodumov	ns_run "$NS_PHY" ip link set $VETH_PHY up
57*8becfe16SDmitry Skorodumov
58*8becfe16SDmitry Skorodumov	for ((i=0; i<NS_COUNT; i++)); do
59*8becfe16SDmitry Skorodumov		setup_ns ipvlan_ns_$i
60*8becfe16SDmitry Skorodumov		ns="ipvlan_ns_$i"
61*8becfe16SDmitry Skorodumov		if [ "$DEBUG" = "1" ]; then
62*8becfe16SDmitry Skorodumov			echo "created NS ${!ns}"
63*8becfe16SDmitry Skorodumov		fi
64*8becfe16SDmitry Skorodumov		if ! ns_run "$HST_NS" ip link add netns ${!ns} ipvlan0 \
65*8becfe16SDmitry Skorodumov		    link $VETH_HOST \
66*8becfe16SDmitry Skorodumov		    type ipvtap mode l2 bridge; then
67*8becfe16SDmitry Skorodumov			exit_error "FAIL: Failed to configure ipvlan link."
68*8becfe16SDmitry Skorodumov		fi
69*8becfe16SDmitry Skorodumov	done
70*8becfe16SDmitry Skorodumov}
71*8becfe16SDmitry Skorodumov
72*8becfe16SDmitry Skorodumovtest_ip_cleanup_env() {
73*8becfe16SDmitry Skorodumov	ns_run "$HST_NS" ip link del $VETH_HOST
74*8becfe16SDmitry Skorodumov	cleanup_all_ns
75*8becfe16SDmitry Skorodumov}
76*8becfe16SDmitry Skorodumov
77*8becfe16SDmitry Skorodumovexit_error() {
78*8becfe16SDmitry Skorodumov	echo "$1"
79*8becfe16SDmitry Skorodumov	exit $ksft_fail
80*8becfe16SDmitry Skorodumov}
81*8becfe16SDmitry Skorodumov
82*8becfe16SDmitry Skorodumovrnd() {
83*8becfe16SDmitry Skorodumov	echo $(( RANDOM % 32 + 16 ))
84*8becfe16SDmitry Skorodumov}
85*8becfe16SDmitry Skorodumov
86*8becfe16SDmitry Skorodumovtest_ip_set_thread() {
87*8becfe16SDmitry Skorodumov	# Here we are trying to create some IP conflicts between namespaces.
88*8becfe16SDmitry Skorodumov	# If just add/remove IP, nothing interesting will happen.
89*8becfe16SDmitry Skorodumov	# But if add random IP and then remove random IP,
90*8becfe16SDmitry Skorodumov	# eventually conflicts start to apear.
91*8becfe16SDmitry Skorodumov	ip link set ipvlan0 up
92*8becfe16SDmitry Skorodumov	for ((i=0; i<IP_ITERATIONS; i++)); do
93*8becfe16SDmitry Skorodumov		v=$(rnd)
94*8becfe16SDmitry Skorodumov		ip a a "172.25.0.$v/24" dev ipvlan0 2>/dev/null
95*8becfe16SDmitry Skorodumov		ip a a "fc00::$v/64" dev ipvlan0 2>/dev/null
96*8becfe16SDmitry Skorodumov		v=$(rnd)
97*8becfe16SDmitry Skorodumov		ip a d "172.25.0.$v/24" dev ipvlan0 2>/dev/null
98*8becfe16SDmitry Skorodumov		ip a d "fc00::$v/64" dev ipvlan0 2>/dev/null
99*8becfe16SDmitry Skorodumov	done
100*8becfe16SDmitry Skorodumov}
101*8becfe16SDmitry Skorodumov
102*8becfe16SDmitry Skorodumovtest_ip_set() {
103*8becfe16SDmitry Skorodumov	RET=0
104*8becfe16SDmitry Skorodumov
105*8becfe16SDmitry Skorodumov	trap test_ip_cleanup_env EXIT
106*8becfe16SDmitry Skorodumov
107*8becfe16SDmitry Skorodumov	test_ip_setup_env
108*8becfe16SDmitry Skorodumov
109*8becfe16SDmitry Skorodumov	declare -A ns_pids
110*8becfe16SDmitry Skorodumov	for ((i=0; i<NS_COUNT; i++)); do
111*8becfe16SDmitry Skorodumov		ns="ipvlan_ns_$i"
112*8becfe16SDmitry Skorodumov		ns_run ${!ns} timeout "$IPSET_TIMEOUT" \
113*8becfe16SDmitry Skorodumov			bash -c "$0 test_ip_set_thread"&
114*8becfe16SDmitry Skorodumov		ns_pids[$i]=$!
115*8becfe16SDmitry Skorodumov	done
116*8becfe16SDmitry Skorodumov
117*8becfe16SDmitry Skorodumov	for ((i=0; i<NS_COUNT; i++)); do
118*8becfe16SDmitry Skorodumov		wait "${ns_pids[$i]}"
119*8becfe16SDmitry Skorodumov	done
120*8becfe16SDmitry Skorodumov
121*8becfe16SDmitry Skorodumov	declare -A all_ips
122*8becfe16SDmitry Skorodumov	for ((i=0; i<NS_COUNT; i++)); do
123*8becfe16SDmitry Skorodumov		ns="ipvlan_ns_$i"
124*8becfe16SDmitry Skorodumov		ip_output=$(ip netns exec ${!ns} ip a l dev ipvlan0 | grep inet)
125*8becfe16SDmitry Skorodumov		while IFS= read -r nsip_out; do
126*8becfe16SDmitry Skorodumov			if [[ -z $nsip_out ]]; then
127*8becfe16SDmitry Skorodumov				continue;
128*8becfe16SDmitry Skorodumov			fi
129*8becfe16SDmitry Skorodumov			nsip=$(awk '{print $2}' <<< "$nsip_out")
130*8becfe16SDmitry Skorodumov			if [[ -v all_ips[$nsip] ]]; then
131*8becfe16SDmitry Skorodumov				RET=$ksft_fail
132*8becfe16SDmitry Skorodumov				log_test "conflict for $nsip"
133*8becfe16SDmitry Skorodumov				return "$RET"
134*8becfe16SDmitry Skorodumov			else
135*8becfe16SDmitry Skorodumov				all_ips[$nsip]=$i
136*8becfe16SDmitry Skorodumov			fi
137*8becfe16SDmitry Skorodumov		done <<< "$ip_output"
138*8becfe16SDmitry Skorodumov	done
139*8becfe16SDmitry Skorodumov
140*8becfe16SDmitry Skorodumov	if [ "$DEBUG" = "1" ]; then
141*8becfe16SDmitry Skorodumov		for key in "${!all_ips[@]}"; do
142*8becfe16SDmitry Skorodumov			echo "$key: ${all_ips[$key]}"
143*8becfe16SDmitry Skorodumov		done
144*8becfe16SDmitry Skorodumov	fi
145*8becfe16SDmitry Skorodumov
146*8becfe16SDmitry Skorodumov	trap - EXIT
147*8becfe16SDmitry Skorodumov	test_ip_cleanup_env
148*8becfe16SDmitry Skorodumov
149*8becfe16SDmitry Skorodumov	log_test "test multithreaded ip set"
150*8becfe16SDmitry Skorodumov}
151*8becfe16SDmitry Skorodumov
152*8becfe16SDmitry Skorodumovif [[ "$1" == "-d" ]]; then
153*8becfe16SDmitry Skorodumov	DEBUG=1
154*8becfe16SDmitry Skorodumov	shift
155*8becfe16SDmitry Skorodumovfi
156*8becfe16SDmitry Skorodumov
157*8becfe16SDmitry Skorodumovif [[ "$1" == "-t" ]]; then
158*8becfe16SDmitry Skorodumov	shift
159*8becfe16SDmitry Skorodumov	TESTS="$*"
160*8becfe16SDmitry Skorodumovfi
161*8becfe16SDmitry Skorodumov
162*8becfe16SDmitry Skorodumovif [[ "$1" == "test_ip_set_thread" ]]; then
163*8becfe16SDmitry Skorodumov	test_ip_set_thread
164*8becfe16SDmitry Skorodumovelse
165*8becfe16SDmitry Skorodumov	require_command ip
166*8becfe16SDmitry Skorodumov
167*8becfe16SDmitry Skorodumov	tests_run
168*8becfe16SDmitry Skorodumovfi
169