0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 ksft_skip=4
0029 ret=0
0030 GREEN='\033[0;92m'
0031 RED='\033[0;31m'
0032 NC='\033[0m'
0033
0034 readonly port=8080
0035
0036 readonly vip_v4=207.175.44.110
0037 readonly cip_v4=10.0.0.2
0038 readonly gip_v4=10.0.0.1
0039 readonly dip_v4=172.16.0.1
0040 readonly rip_v4=172.16.0.2
0041 readonly sip_v4=10.0.0.3
0042
0043 readonly infile="$(mktemp)"
0044 readonly outfile="$(mktemp)"
0045 readonly datalen=32
0046
0047 sysipvsnet="/proc/sys/net/ipv4/vs/"
0048 if [ ! -d $sysipvsnet ]; then
0049 modprobe -q ip_vs
0050 if [ $? -ne 0 ]; then
0051 echo "skip: could not run test without ipvs module"
0052 exit $ksft_skip
0053 fi
0054 fi
0055
0056 ip -Version > /dev/null 2>&1
0057 if [ $? -ne 0 ]; then
0058 echo "SKIP: Could not run test without ip tool"
0059 exit $ksft_skip
0060 fi
0061
0062 ipvsadm -v > /dev/null 2>&1
0063 if [ $? -ne 0 ]; then
0064 echo "SKIP: Could not run test without ipvsadm"
0065 exit $ksft_skip
0066 fi
0067
0068 setup() {
0069 ip netns add ns0
0070 ip netns add ns1
0071 ip netns add ns2
0072
0073 ip link add veth01 netns ns0 type veth peer name veth10 netns ns1
0074 ip link add veth02 netns ns0 type veth peer name veth20 netns ns2
0075 ip link add veth12 netns ns1 type veth peer name veth21 netns ns2
0076
0077 ip netns exec ns0 ip link set veth01 up
0078 ip netns exec ns0 ip link set veth02 up
0079 ip netns exec ns0 ip link add br0 type bridge
0080 ip netns exec ns0 ip link set veth01 master br0
0081 ip netns exec ns0 ip link set veth02 master br0
0082 ip netns exec ns0 ip link set br0 up
0083 ip netns exec ns0 ip addr add ${cip_v4}/24 dev br0
0084
0085 ip netns exec ns1 ip link set lo up
0086 ip netns exec ns1 ip link set veth10 up
0087 ip netns exec ns1 ip addr add ${gip_v4}/24 dev veth10
0088 ip netns exec ns1 ip link set veth12 up
0089 ip netns exec ns1 ip addr add ${dip_v4}/24 dev veth12
0090
0091 ip netns exec ns2 ip link set lo up
0092 ip netns exec ns2 ip link set veth21 up
0093 ip netns exec ns2 ip addr add ${rip_v4}/24 dev veth21
0094 ip netns exec ns2 ip link set veth20 up
0095 ip netns exec ns2 ip addr add ${sip_v4}/24 dev veth20
0096
0097 sleep 1
0098
0099 dd if=/dev/urandom of="${infile}" bs="${datalen}" count=1 status=none
0100 }
0101
0102 cleanup() {
0103 for i in 0 1 2
0104 do
0105 ip netns del ns$i > /dev/null 2>&1
0106 done
0107
0108 if [ -f "${outfile}" ]; then
0109 rm "${outfile}"
0110 fi
0111 if [ -f "${infile}" ]; then
0112 rm "${infile}"
0113 fi
0114 }
0115
0116 server_listen() {
0117 ip netns exec ns2 nc -l -p 8080 > "${outfile}" &
0118 server_pid=$!
0119 sleep 0.2
0120 }
0121
0122 client_connect() {
0123 ip netns exec ns0 timeout 2 nc -w 1 ${vip_v4} ${port} < "${infile}"
0124 }
0125
0126 verify_data() {
0127 wait "${server_pid}"
0128 cmp "$infile" "$outfile" 2>/dev/null
0129 }
0130
0131 test_service() {
0132 server_listen
0133 client_connect
0134 verify_data
0135 }
0136
0137
0138 test_dr() {
0139 ip netns exec ns0 ip route add ${vip_v4} via ${gip_v4} dev br0
0140
0141 ip netns exec ns1 sysctl -qw net.ipv4.ip_forward=1
0142 ip netns exec ns1 ipvsadm -A -t ${vip_v4}:${port} -s rr
0143 ip netns exec ns1 ipvsadm -a -t ${vip_v4}:${port} -r ${rip_v4}:${port}
0144 ip netns exec ns1 ip addr add ${vip_v4}/32 dev lo:1
0145
0146
0147 ip netns exec ns2 sysctl -qw net.ipv4.conf.all.arp_ignore=1
0148 ip netns exec ns2 sysctl -qw net.ipv4.conf.all.arp_announce=2
0149
0150 ip netns exec ns2 sysctl -qw net.ipv4.conf.all.rp_filter=0
0151 ip netns exec ns2 sysctl -qw net.ipv4.conf.veth21.rp_filter=0
0152 ip netns exec ns2 ip addr add ${vip_v4}/32 dev lo:1
0153
0154 test_service
0155 }
0156
0157 test_nat() {
0158 ip netns exec ns0 ip route add ${vip_v4} via ${gip_v4} dev br0
0159
0160 ip netns exec ns1 sysctl -qw net.ipv4.ip_forward=1
0161 ip netns exec ns1 ipvsadm -A -t ${vip_v4}:${port} -s rr
0162 ip netns exec ns1 ipvsadm -a -m -t ${vip_v4}:${port} -r ${rip_v4}:${port}
0163 ip netns exec ns1 ip addr add ${vip_v4}/32 dev lo:1
0164
0165 ip netns exec ns2 ip link del veth20
0166 ip netns exec ns2 ip route add default via ${dip_v4} dev veth21
0167
0168 test_service
0169 }
0170
0171 test_tun() {
0172 ip netns exec ns0 ip route add ${vip_v4} via ${gip_v4} dev br0
0173
0174 ip netns exec ns1 modprobe ipip
0175 ip netns exec ns1 ip link set tunl0 up
0176 ip netns exec ns1 sysctl -qw net.ipv4.ip_forward=0
0177 ip netns exec ns1 sysctl -qw net.ipv4.conf.all.send_redirects=0
0178 ip netns exec ns1 sysctl -qw net.ipv4.conf.default.send_redirects=0
0179 ip netns exec ns1 ipvsadm -A -t ${vip_v4}:${port} -s rr
0180 ip netns exec ns1 ipvsadm -a -i -t ${vip_v4}:${port} -r ${rip_v4}:${port}
0181 ip netns exec ns1 ip addr add ${vip_v4}/32 dev lo:1
0182
0183 ip netns exec ns2 modprobe ipip
0184 ip netns exec ns2 ip link set tunl0 up
0185 ip netns exec ns2 sysctl -qw net.ipv4.conf.all.arp_ignore=1
0186 ip netns exec ns2 sysctl -qw net.ipv4.conf.all.arp_announce=2
0187 ip netns exec ns2 sysctl -qw net.ipv4.conf.all.rp_filter=0
0188 ip netns exec ns2 sysctl -qw net.ipv4.conf.tunl0.rp_filter=0
0189 ip netns exec ns2 sysctl -qw net.ipv4.conf.veth21.rp_filter=0
0190 ip netns exec ns2 ip addr add ${vip_v4}/32 dev lo:1
0191
0192 test_service
0193 }
0194
0195 run_tests() {
0196 local errors=
0197
0198 echo "Testing DR mode..."
0199 cleanup
0200 setup
0201 test_dr
0202 errors=$(( $errors + $? ))
0203
0204 echo "Testing NAT mode..."
0205 cleanup
0206 setup
0207 test_nat
0208 errors=$(( $errors + $? ))
0209
0210 echo "Testing Tunnel mode..."
0211 cleanup
0212 setup
0213 test_tun
0214 errors=$(( $errors + $? ))
0215
0216 return $errors
0217 }
0218
0219 trap cleanup EXIT
0220
0221 run_tests
0222
0223 if [ $? -ne 0 ]; then
0224 echo -e "$(basename $0): ${RED}FAIL${NC}"
0225 exit 1
0226 fi
0227 echo -e "$(basename $0): ${GREEN}PASS${NC}"
0228 exit 0