Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/sh
0002 # SPDX-License-Identifier: GPL-2.0
0003 #
0004 # End-to-end ipvs test suite
0005 # Topology:
0006 #--------------------------------------------------------------+
0007 #                      |                                       |
0008 #         ns0          |         ns1                           |
0009 #      -----------     |     -----------    -----------        |
0010 #      | veth01  | --------- | veth10  |    | veth12  |        |
0011 #      -----------    peer   -----------    -----------        |
0012 #           |          |                        |              |
0013 #      -----------     |                        |              |
0014 #      |  br0    |     |-----------------  peer |--------------|
0015 #      -----------     |                        |              |
0016 #           |          |                        |              |
0017 #      ----------     peer   ----------      -----------       |
0018 #      |  veth02 | --------- |  veth20 |     | veth21  |       |
0019 #      ----------      |     ----------      -----------       |
0020 #                      |         ns2                           |
0021 #                      |                                       |
0022 #--------------------------------------------------------------+
0023 #
0024 # We assume that all network driver are loaded
0025 #
0026 
0027 # Kselftest framework requirement - SKIP code is 4.
0028 ksft_skip=4
0029 ret=0
0030 GREEN='\033[0;92m'
0031 RED='\033[0;31m'
0032 NC='\033[0m' # No Color
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         # avoid incorrect arp response
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         # avoid reverse route lookup
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