1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4# This test is for checking IPv4 and IPv6 FIB rules API 5 6ret=0 7 8PAUSE_ON_FAIL=${PAUSE_ON_FAIL:=no} 9IP="ip -netns testns" 10 11RTABLE=100 12GW_IP4=192.51.100.2 13SRC_IP=192.51.100.3 14GW_IP6=2001:db8:1::2 15SRC_IP6=2001:db8:1::3 16 17DEV_ADDR=192.51.100.1 18DEV=dummy0 19 20log_test() 21{ 22 local rc=$1 23 local expected=$2 24 local msg="$3" 25 26 if [ ${rc} -eq ${expected} ]; then 27 nsuccess=$((nsuccess+1)) 28 printf "\n TEST: %-50s [ OK ]\n" "${msg}" 29 else 30 nfail=$((nfail+1)) 31 printf "\n TEST: %-50s [FAIL]\n" "${msg}" 32 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then 33 echo 34 echo "hit enter to continue, 'q' to quit" 35 read a 36 [ "$a" = "q" ] && exit 1 37 fi 38 fi 39} 40 41log_section() 42{ 43 echo 44 echo "######################################################################" 45 echo "TEST SECTION: $*" 46 echo "######################################################################" 47} 48 49setup() 50{ 51 set -e 52 ip netns add testns 53 $IP link set dev lo up 54 55 $IP link add dummy0 type dummy 56 $IP link set dev dummy0 up 57 $IP address add 198.51.100.1/24 dev dummy0 58 $IP -6 address add 2001:db8:1::1/64 dev dummy0 59 60 set +e 61} 62 63cleanup() 64{ 65 $IP link del dev dummy0 &> /dev/null 66 ip netns del testns 67} 68 69fib_check_iproute_support() 70{ 71 ip rule help 2>&1 | grep -q $1 72 if [ $? -ne 0 ]; then 73 echo "SKIP: iproute2 iprule too old, missing $1 match" 74 return 1 75 fi 76 77 ip route get help 2>&1 | grep -q $2 78 if [ $? -ne 0 ]; then 79 echo "SKIP: iproute2 get route too old, missing $2 match" 80 return 1 81 fi 82 83 return 0 84} 85 86fib_rule6_del() 87{ 88 $IP -6 rule del $1 89 log_test $? 0 "rule6 del $1" 90} 91 92fib_rule6_del_by_pref() 93{ 94 pref=$($IP -6 rule show | grep "$1 lookup $TABLE" | cut -d ":" -f 1) 95 $IP -6 rule del pref $pref 96} 97 98fib_rule6_test_match_n_redirect() 99{ 100 local match="$1" 101 local getmatch="$2" 102 103 $IP -6 rule add $match table $RTABLE 104 $IP -6 route get $GW_IP6 $getmatch | grep -q "table $RTABLE" 105 log_test $? 0 "rule6 check: $1" 106 107 fib_rule6_del_by_pref "$match" 108 log_test $? 0 "rule6 del by pref: $match" 109} 110 111fib_rule6_test() 112{ 113 # setup the fib rule redirect route 114 $IP -6 route add table $RTABLE default via $GW_IP6 dev $DEV onlink 115 116 match="oif $DEV" 117 fib_rule6_test_match_n_redirect "$match" "$match" "oif redirect to table" 118 119 match="from $SRC_IP6 iif $DEV" 120 fib_rule6_test_match_n_redirect "$match" "$match" "iif redirect to table" 121 122 match="tos 0x10" 123 fib_rule6_test_match_n_redirect "$match" "$match" "tos redirect to table" 124 125 match="fwmark 0x64" 126 getmatch="mark 0x64" 127 fib_rule6_test_match_n_redirect "$match" "$getmatch" "fwmark redirect to table" 128 129 fib_check_iproute_support "uidrange" "uid" 130 if [ $? -eq 0 ]; then 131 match="uidrange 100-100" 132 getmatch="uid 100" 133 fib_rule6_test_match_n_redirect "$match" "$getmatch" "uid redirect to table" 134 fi 135 136 fib_check_iproute_support "sport" "sport" 137 if [ $? -eq 0 ]; then 138 match="sport 666 dport 777" 139 fib_rule6_test_match_n_redirect "$match" "$match" "sport and dport redirect to table" 140 fi 141 142 fib_check_iproute_support "ipproto" "ipproto" 143 if [ $? -eq 0 ]; then 144 match="ipproto tcp" 145 fib_rule6_test_match_n_redirect "$match" "$match" "ipproto match" 146 fi 147 148 fib_check_iproute_support "ipproto" "ipproto" 149 if [ $? -eq 0 ]; then 150 match="ipproto icmp" 151 fib_rule6_test_match_n_redirect "$match" "$match" "ipproto icmp match" 152 fi 153} 154 155fib_rule4_del() 156{ 157 $IP rule del $1 158 log_test $? 0 "del $1" 159} 160 161fib_rule4_del_by_pref() 162{ 163 pref=$($IP rule show | grep "$1 lookup $TABLE" | cut -d ":" -f 1) 164 $IP rule del pref $pref 165} 166 167fib_rule4_test_match_n_redirect() 168{ 169 local match="$1" 170 local getmatch="$2" 171 172 $IP rule add $match table $RTABLE 173 $IP route get $GW_IP4 $getmatch | grep -q "table $RTABLE" 174 log_test $? 0 "rule4 check: $1" 175 176 fib_rule4_del_by_pref "$match" 177 log_test $? 0 "rule4 del by pref: $match" 178} 179 180fib_rule4_test() 181{ 182 # setup the fib rule redirect route 183 $IP route add table $RTABLE default via $GW_IP4 dev $DEV onlink 184 185 match="oif $DEV" 186 fib_rule4_test_match_n_redirect "$match" "$match" "oif redirect to table" 187 188 match="from $SRC_IP iif $DEV" 189 fib_rule4_test_match_n_redirect "$match" "$match" "iif redirect to table" 190 191 match="tos 0x10" 192 fib_rule4_test_match_n_redirect "$match" "$match" "tos redirect to table" 193 194 match="fwmark 0x64" 195 getmatch="mark 0x64" 196 fib_rule4_test_match_n_redirect "$match" "$getmatch" "fwmark redirect to table" 197 198 fib_check_iproute_support "uidrange" "uid" 199 if [ $? -eq 0 ]; then 200 match="uidrange 100-100" 201 getmatch="uid 100" 202 fib_rule4_test_match_n_redirect "$match" "$getmatch" "uid redirect to table" 203 fi 204 205 fib_check_iproute_support "sport" "sport" 206 if [ $? -eq 0 ]; then 207 match="sport 666 dport 777" 208 fib_rule4_test_match_n_redirect "$match" "$match" "sport and dport redirect to table" 209 fi 210 211 fib_check_iproute_support "ipproto" "ipproto" 212 if [ $? -eq 0 ]; then 213 match="ipproto tcp" 214 fib_rule4_test_match_n_redirect "$match" "$match" "ipproto tcp match" 215 fi 216 217 fib_check_iproute_support "ipproto" "ipproto" 218 if [ $? -eq 0 ]; then 219 match="ipproto icmp" 220 fib_rule4_test_match_n_redirect "$match" "$match" "ipproto icmp match" 221 fi 222} 223 224run_fibrule_tests() 225{ 226 log_section "IPv4 fib rule" 227 fib_rule4_test 228 log_section "IPv6 fib rule" 229 fib_rule6_test 230} 231 232if [ "$(id -u)" -ne 0 ];then 233 echo "SKIP: Need root privileges" 234 exit 0 235fi 236 237if [ ! -x "$(command -v ip)" ]; then 238 echo "SKIP: Could not run test without ip tool" 239 exit 0 240fi 241 242# start clean 243cleanup &> /dev/null 244setup 245run_fibrule_tests 246cleanup 247 248exit $ret 249