File Index
Files and directories
Sign in
FILE

ipvs.sh

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/net/netfilter/ipvs.sh BASH
  1#!/bin/bash
  2# SPDX-License-Identifier: GPL-2.0
  3#
  4# End-to-end ipvs test suite
  5# Topology:
  6#--------------------------------------------------------------+
  7#                      |                                       |
  8#         ns0          |         ns1                           |
  9#      -----------     |     -----------    -----------        |
 10#      | veth01  | --------- | veth10  |    | veth12  |        |
 11#      -----------    peer   -----------    -----------        |
 12#           |          |                        |              |
 13#      -----------     |                        |              |
 14#      |  br0    |     |-----------------  peer |--------------|
 15#      -----------     |                        |              |
 16#           |          |                        |              |
 17#      ----------     peer   ----------      -----------       |
 18#      |  veth02 | --------- |  veth20 |     | veth21  |       |
 19#      ----------      |     ----------      -----------       |
 20#                      |         ns2                           |
 21#                      |                                       |
 22#--------------------------------------------------------------+
 23#
 24# We assume that all network driver are loaded
 25#
 26
 27source lib.sh
 28
 29ret=0
 30GREEN='\033[0;92m'
 31RED='\033[0;31m'
 32NC='\033[0m' # No Color
 33
 34readonly port=8080
 35
 36readonly vip_v4=207.175.44.110
 37readonly cip_v4=10.0.0.2
 38readonly gip_v4=10.0.0.1
 39readonly dip_v4=172.16.0.1
 40readonly rip_v4=172.16.0.2
 41readonly sip_v4=10.0.0.3
 42
 43readonly infile="$(mktemp)"
 44readonly outfile="$(mktemp)"
 45readonly datalen=32
 46
 47sysipvsnet="/proc/sys/net/ipv4/vs/"
 48if [ ! -d $sysipvsnet ]; then
 49	if ! modprobe -q ip_vs; then
 50		echo "skip: could not run test without ipvs module"
 51		exit $ksft_skip
 52	fi
 53fi
 54
 55checktool "ipvsadm -v" "run test without ipvsadm"
 56checktool "socat -h" "run test without socat"
 57
 58setup() {
 59	setup_ns ns0 ns1 ns2
 60
 61	ip link add veth01 netns "${ns0}" type veth peer name veth10 netns "${ns1}"
 62	ip link add veth02 netns "${ns0}" type veth peer name veth20 netns "${ns2}"
 63	ip link add veth12 netns "${ns1}" type veth peer name veth21 netns "${ns2}"
 64
 65	ip netns exec "${ns0}" ip link set veth01 up
 66	ip netns exec "${ns0}" ip link set veth02 up
 67	ip netns exec "${ns0}" ip link add br0 type bridge
 68	ip netns exec "${ns0}" ip link set veth01 master br0
 69	ip netns exec "${ns0}" ip link set veth02 master br0
 70	ip netns exec "${ns0}" ip link set br0 up
 71	ip netns exec "${ns0}" ip addr add "${cip_v4}/24" dev br0
 72
 73	ip netns exec "${ns1}" ip link set veth10 up
 74	ip netns exec "${ns1}" ip addr add "${gip_v4}/24" dev veth10
 75	ip netns exec "${ns1}" ip link set veth12 up
 76	ip netns exec "${ns1}" ip addr add "${dip_v4}/24" dev veth12
 77
 78	ip netns exec "${ns2}" ip link set veth21 up
 79	ip netns exec "${ns2}" ip addr add "${rip_v4}/24" dev veth21
 80	ip netns exec "${ns2}" ip link set veth20 up
 81	ip netns exec "${ns2}" ip addr add "${sip_v4}/24" dev veth20
 82
 83	sleep 1
 84
 85	dd if=/dev/urandom of="${infile}" bs="${datalen}" count=1 status=none
 86}
 87
 88cleanup() {
 89	cleanup_all_ns
 90
 91	if [ -f "${outfile}" ]; then
 92		rm "${outfile}"
 93	fi
 94	if [ -f "${infile}" ]; then
 95		rm "${infile}"
 96	fi
 97}
 98
 99server_listen() {
100	ip netns exec "$ns2" timeout 5 socat -u -4 TCP-LISTEN:8080,reuseaddr STDOUT > "${outfile}" &
101	server_pid=$!
102	sleep 0.2
103}
104
105client_connect() {
106	ip netns exec "${ns0}" timeout 2 socat -u -4 STDIN TCP:"${vip_v4}":"${port}" < "${infile}"
107}
108
109verify_data() {
110	wait "${server_pid}"
111	cmp "$infile" "$outfile" 2>/dev/null
112}
113
114test_service() {
115	server_listen
116	client_connect
117	verify_data
118}
119
120
121test_dr() {
122	ip netns exec "${ns0}" ip route add "${vip_v4}" via "${gip_v4}" dev br0
123
124	ip netns exec "${ns1}" sysctl -qw net.ipv4.ip_forward=1
125	ip netns exec "${ns1}" ipvsadm -A -t "${vip_v4}:${port}" -s rr
126	ip netns exec "${ns1}" ipvsadm -a -t "${vip_v4}:${port}" -r "${rip_v4}:${port}"
127	ip netns exec "${ns1}" ip addr add "${vip_v4}/32" dev lo:1
128
129	# avoid incorrect arp response
130	ip netns exec "${ns2}" sysctl -qw net.ipv4.conf.all.arp_ignore=1
131	ip netns exec "${ns2}" sysctl -qw net.ipv4.conf.all.arp_announce=2
132	ip netns exec "${ns2}" ip addr add "${vip_v4}/32" dev lo:1
133
134	test_service
135}
136
137test_nat() {
138	ip netns exec "${ns0}" ip route add "${vip_v4}" via "${gip_v4}" dev br0
139
140	ip netns exec "${ns1}" sysctl -qw net.ipv4.ip_forward=1
141	ip netns exec "${ns1}" ipvsadm -A -t "${vip_v4}:${port}" -s rr
142	ip netns exec "${ns1}" ipvsadm -a -m -t "${vip_v4}:${port}" -r "${rip_v4}:${port}"
143	ip netns exec "${ns1}" ip addr add "${vip_v4}/32" dev lo:1
144
145	ip netns exec "${ns2}" ip link del veth20
146	ip netns exec "${ns2}" ip route add default via "${dip_v4}" dev veth21
147
148	test_service
149}
150
151test_tun() {
152	ip netns exec "${ns0}" ip route add "${vip_v4}" via "${gip_v4}" dev br0
153
154	modprobe -q ipip
155	ip netns exec "${ns1}" ip link set tunl0 up
156	ip netns exec "${ns1}" sysctl -qw net.ipv4.ip_forward=0
157	ip netns exec "${ns1}" sysctl -qw net.ipv4.conf.all.send_redirects=0
158	ip netns exec "${ns1}" sysctl -qw net.ipv4.conf.default.send_redirects=0
159	ip netns exec "${ns1}" ipvsadm -A -t "${vip_v4}:${port}" -s rr
160	ip netns exec "${ns1}" ipvsadm -a -i -t "${vip_v4}:${port}" -r ${rip_v4}:${port}
161	ip netns exec "${ns1}" ip addr add ${vip_v4}/32 dev lo:1
162
163	ip netns exec "${ns2}" ip link set tunl0 up
164	ip netns exec "${ns2}" sysctl -qw net.ipv4.conf.all.arp_ignore=1
165	ip netns exec "${ns2}" sysctl -qw net.ipv4.conf.all.arp_announce=2
166	ip netns exec "${ns2}" sysctl -qw net.ipv4.conf.tunl0.rp_filter=0
167	ip netns exec "${ns2}" ip addr add "${vip_v4}/32" dev lo:1
168
169	test_service
170}
171
172run_tests() {
173	local errors=
174
175	echo "Testing DR mode..."
176	cleanup
177	setup
178	test_dr
179	errors=$(( $errors + $? ))
180
181	echo "Testing NAT mode..."
182	cleanup
183	setup
184	test_nat
185	errors=$(( $errors + $? ))
186
187	echo "Testing Tunnel mode..."
188	cleanup
189	setup
190	test_tun
191	errors=$(( $errors + $? ))
192
193	return $errors
194}
195
196trap cleanup EXIT
197
198run_tests
199
200if [ $? -ne 0 ]; then
201	echo -e "$(basename $0): ${RED}FAIL${NC}"
202	exit 1
203fi
204echo -e "$(basename $0): ${GREEN}PASS${NC}"
205exit 0
~/ Read-only file preview.