1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# This test is for checking rtnetlink callpaths, and get as much coverage as possible. 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# set -e 6*4882a593Smuzhiyun 7*4882a593Smuzhiyundevdummy="test-dummy0" 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun# Kselftest framework requirement - SKIP code is 4. 10*4882a593Smuzhiyunksft_skip=4 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun# set global exit status, but never reset nonzero one. 13*4882a593Smuzhiyuncheck_err() 14*4882a593Smuzhiyun{ 15*4882a593Smuzhiyun if [ $ret -eq 0 ]; then 16*4882a593Smuzhiyun ret=$1 17*4882a593Smuzhiyun fi 18*4882a593Smuzhiyun} 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun# same but inverted -- used when command must fail for test to pass 21*4882a593Smuzhiyuncheck_fail() 22*4882a593Smuzhiyun{ 23*4882a593Smuzhiyun if [ $1 -eq 0 ]; then 24*4882a593Smuzhiyun ret=1 25*4882a593Smuzhiyun fi 26*4882a593Smuzhiyun} 27*4882a593Smuzhiyun 28*4882a593Smuzhiyunkci_add_dummy() 29*4882a593Smuzhiyun{ 30*4882a593Smuzhiyun ip link add name "$devdummy" type dummy 31*4882a593Smuzhiyun check_err $? 32*4882a593Smuzhiyun ip link set "$devdummy" up 33*4882a593Smuzhiyun check_err $? 34*4882a593Smuzhiyun} 35*4882a593Smuzhiyun 36*4882a593Smuzhiyunkci_del_dummy() 37*4882a593Smuzhiyun{ 38*4882a593Smuzhiyun ip link del dev "$devdummy" 39*4882a593Smuzhiyun check_err $? 40*4882a593Smuzhiyun} 41*4882a593Smuzhiyun 42*4882a593Smuzhiyunkci_test_netconf() 43*4882a593Smuzhiyun{ 44*4882a593Smuzhiyun dev="$1" 45*4882a593Smuzhiyun r=$ret 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun ip netconf show dev "$dev" > /dev/null 48*4882a593Smuzhiyun check_err $? 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun for f in 4 6; do 51*4882a593Smuzhiyun ip -$f netconf show dev "$dev" > /dev/null 52*4882a593Smuzhiyun check_err $? 53*4882a593Smuzhiyun done 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun if [ $ret -ne 0 ] ;then 56*4882a593Smuzhiyun echo "FAIL: ip netconf show $dev" 57*4882a593Smuzhiyun test $r -eq 0 && ret=0 58*4882a593Smuzhiyun return 1 59*4882a593Smuzhiyun fi 60*4882a593Smuzhiyun} 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun# add a bridge with vlans on top 63*4882a593Smuzhiyunkci_test_bridge() 64*4882a593Smuzhiyun{ 65*4882a593Smuzhiyun devbr="test-br0" 66*4882a593Smuzhiyun vlandev="testbr-vlan1" 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun local ret=0 69*4882a593Smuzhiyun ip link add name "$devbr" type bridge 70*4882a593Smuzhiyun check_err $? 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun ip link set dev "$devdummy" master "$devbr" 73*4882a593Smuzhiyun check_err $? 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun ip link set "$devbr" up 76*4882a593Smuzhiyun check_err $? 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun ip link add link "$devbr" name "$vlandev" type vlan id 1 79*4882a593Smuzhiyun check_err $? 80*4882a593Smuzhiyun ip addr add dev "$vlandev" 10.200.7.23/30 81*4882a593Smuzhiyun check_err $? 82*4882a593Smuzhiyun ip -6 addr add dev "$vlandev" dead:42::1234/64 83*4882a593Smuzhiyun check_err $? 84*4882a593Smuzhiyun ip -d link > /dev/null 85*4882a593Smuzhiyun check_err $? 86*4882a593Smuzhiyun ip r s t all > /dev/null 87*4882a593Smuzhiyun check_err $? 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun for name in "$devbr" "$vlandev" "$devdummy" ; do 90*4882a593Smuzhiyun kci_test_netconf "$name" 91*4882a593Smuzhiyun done 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun ip -6 addr del dev "$vlandev" dead:42::1234/64 94*4882a593Smuzhiyun check_err $? 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun ip link del dev "$vlandev" 97*4882a593Smuzhiyun check_err $? 98*4882a593Smuzhiyun ip link del dev "$devbr" 99*4882a593Smuzhiyun check_err $? 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun if [ $ret -ne 0 ];then 102*4882a593Smuzhiyun echo "FAIL: bridge setup" 103*4882a593Smuzhiyun return 1 104*4882a593Smuzhiyun fi 105*4882a593Smuzhiyun echo "PASS: bridge setup" 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun} 108*4882a593Smuzhiyun 109*4882a593Smuzhiyunkci_test_gre() 110*4882a593Smuzhiyun{ 111*4882a593Smuzhiyun gredev=neta 112*4882a593Smuzhiyun rem=10.42.42.1 113*4882a593Smuzhiyun loc=10.0.0.1 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun local ret=0 116*4882a593Smuzhiyun ip tunnel add $gredev mode gre remote $rem local $loc ttl 1 117*4882a593Smuzhiyun check_err $? 118*4882a593Smuzhiyun ip link set $gredev up 119*4882a593Smuzhiyun check_err $? 120*4882a593Smuzhiyun ip addr add 10.23.7.10 dev $gredev 121*4882a593Smuzhiyun check_err $? 122*4882a593Smuzhiyun ip route add 10.23.8.0/30 dev $gredev 123*4882a593Smuzhiyun check_err $? 124*4882a593Smuzhiyun ip addr add dev "$devdummy" 10.23.7.11/24 125*4882a593Smuzhiyun check_err $? 126*4882a593Smuzhiyun ip link > /dev/null 127*4882a593Smuzhiyun check_err $? 128*4882a593Smuzhiyun ip addr > /dev/null 129*4882a593Smuzhiyun check_err $? 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun kci_test_netconf "$gredev" 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun ip addr del dev "$devdummy" 10.23.7.11/24 134*4882a593Smuzhiyun check_err $? 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun ip link del $gredev 137*4882a593Smuzhiyun check_err $? 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun if [ $ret -ne 0 ];then 140*4882a593Smuzhiyun echo "FAIL: gre tunnel endpoint" 141*4882a593Smuzhiyun return 1 142*4882a593Smuzhiyun fi 143*4882a593Smuzhiyun echo "PASS: gre tunnel endpoint" 144*4882a593Smuzhiyun} 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun# tc uses rtnetlink too, for full tc testing 147*4882a593Smuzhiyun# please see tools/testing/selftests/tc-testing. 148*4882a593Smuzhiyunkci_test_tc() 149*4882a593Smuzhiyun{ 150*4882a593Smuzhiyun dev=lo 151*4882a593Smuzhiyun local ret=0 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun tc qdisc add dev "$dev" root handle 1: htb 154*4882a593Smuzhiyun check_err $? 155*4882a593Smuzhiyun tc class add dev "$dev" parent 1: classid 1:10 htb rate 1mbit 156*4882a593Smuzhiyun check_err $? 157*4882a593Smuzhiyun tc filter add dev "$dev" parent 1:0 prio 5 handle ffe: protocol ip u32 divisor 256 158*4882a593Smuzhiyun check_err $? 159*4882a593Smuzhiyun tc filter add dev "$dev" parent 1:0 prio 5 handle ffd: protocol ip u32 divisor 256 160*4882a593Smuzhiyun check_err $? 161*4882a593Smuzhiyun tc filter add dev "$dev" parent 1:0 prio 5 handle ffc: protocol ip u32 divisor 256 162*4882a593Smuzhiyun check_err $? 163*4882a593Smuzhiyun tc filter add dev "$dev" protocol ip parent 1: prio 5 handle ffe:2:3 u32 ht ffe:2: match ip src 10.0.0.3 flowid 1:10 164*4882a593Smuzhiyun check_err $? 165*4882a593Smuzhiyun tc filter add dev "$dev" protocol ip parent 1: prio 5 handle ffe:2:2 u32 ht ffe:2: match ip src 10.0.0.2 flowid 1:10 166*4882a593Smuzhiyun check_err $? 167*4882a593Smuzhiyun tc filter show dev "$dev" parent 1:0 > /dev/null 168*4882a593Smuzhiyun check_err $? 169*4882a593Smuzhiyun tc filter del dev "$dev" protocol ip parent 1: prio 5 handle ffe:2:3 u32 170*4882a593Smuzhiyun check_err $? 171*4882a593Smuzhiyun tc filter show dev "$dev" parent 1:0 > /dev/null 172*4882a593Smuzhiyun check_err $? 173*4882a593Smuzhiyun tc qdisc del dev "$dev" root handle 1: htb 174*4882a593Smuzhiyun check_err $? 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun if [ $ret -ne 0 ];then 177*4882a593Smuzhiyun echo "FAIL: tc htb hierarchy" 178*4882a593Smuzhiyun return 1 179*4882a593Smuzhiyun fi 180*4882a593Smuzhiyun echo "PASS: tc htb hierarchy" 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun} 183*4882a593Smuzhiyun 184*4882a593Smuzhiyunkci_test_polrouting() 185*4882a593Smuzhiyun{ 186*4882a593Smuzhiyun local ret=0 187*4882a593Smuzhiyun ip rule add fwmark 1 lookup 100 188*4882a593Smuzhiyun check_err $? 189*4882a593Smuzhiyun ip route add local 0.0.0.0/0 dev lo table 100 190*4882a593Smuzhiyun check_err $? 191*4882a593Smuzhiyun ip r s t all > /dev/null 192*4882a593Smuzhiyun check_err $? 193*4882a593Smuzhiyun ip rule del fwmark 1 lookup 100 194*4882a593Smuzhiyun check_err $? 195*4882a593Smuzhiyun ip route del local 0.0.0.0/0 dev lo table 100 196*4882a593Smuzhiyun check_err $? 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun if [ $ret -ne 0 ];then 199*4882a593Smuzhiyun echo "FAIL: policy route test" 200*4882a593Smuzhiyun return 1 201*4882a593Smuzhiyun fi 202*4882a593Smuzhiyun echo "PASS: policy routing" 203*4882a593Smuzhiyun} 204*4882a593Smuzhiyun 205*4882a593Smuzhiyunkci_test_route_get() 206*4882a593Smuzhiyun{ 207*4882a593Smuzhiyun local hash_policy=$(sysctl -n net.ipv4.fib_multipath_hash_policy) 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun local ret=0 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun ip route get 127.0.0.1 > /dev/null 212*4882a593Smuzhiyun check_err $? 213*4882a593Smuzhiyun ip route get 127.0.0.1 dev "$devdummy" > /dev/null 214*4882a593Smuzhiyun check_err $? 215*4882a593Smuzhiyun ip route get ::1 > /dev/null 216*4882a593Smuzhiyun check_err $? 217*4882a593Smuzhiyun ip route get fe80::1 dev "$devdummy" > /dev/null 218*4882a593Smuzhiyun check_err $? 219*4882a593Smuzhiyun ip route get 127.0.0.1 from 127.0.0.1 oif lo tos 0x1 mark 0x1 > /dev/null 220*4882a593Smuzhiyun check_err $? 221*4882a593Smuzhiyun ip route get ::1 from ::1 iif lo oif lo tos 0x1 mark 0x1 > /dev/null 222*4882a593Smuzhiyun check_err $? 223*4882a593Smuzhiyun ip addr add dev "$devdummy" 10.23.7.11/24 224*4882a593Smuzhiyun check_err $? 225*4882a593Smuzhiyun ip route get 10.23.7.11 from 10.23.7.12 iif "$devdummy" > /dev/null 226*4882a593Smuzhiyun check_err $? 227*4882a593Smuzhiyun ip route add 10.23.8.0/24 \ 228*4882a593Smuzhiyun nexthop via 10.23.7.13 dev "$devdummy" \ 229*4882a593Smuzhiyun nexthop via 10.23.7.14 dev "$devdummy" 230*4882a593Smuzhiyun check_err $? 231*4882a593Smuzhiyun sysctl -wq net.ipv4.fib_multipath_hash_policy=0 232*4882a593Smuzhiyun ip route get 10.23.8.11 > /dev/null 233*4882a593Smuzhiyun check_err $? 234*4882a593Smuzhiyun sysctl -wq net.ipv4.fib_multipath_hash_policy=1 235*4882a593Smuzhiyun ip route get 10.23.8.11 > /dev/null 236*4882a593Smuzhiyun check_err $? 237*4882a593Smuzhiyun sysctl -wq net.ipv4.fib_multipath_hash_policy="$hash_policy" 238*4882a593Smuzhiyun ip route del 10.23.8.0/24 239*4882a593Smuzhiyun check_err $? 240*4882a593Smuzhiyun ip addr del dev "$devdummy" 10.23.7.11/24 241*4882a593Smuzhiyun check_err $? 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun if [ $ret -ne 0 ];then 244*4882a593Smuzhiyun echo "FAIL: route get" 245*4882a593Smuzhiyun return 1 246*4882a593Smuzhiyun fi 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun echo "PASS: route get" 249*4882a593Smuzhiyun} 250*4882a593Smuzhiyun 251*4882a593Smuzhiyunkci_test_addrlft() 252*4882a593Smuzhiyun{ 253*4882a593Smuzhiyun for i in $(seq 10 100) ;do 254*4882a593Smuzhiyun lft=$(((RANDOM%3) + 1)) 255*4882a593Smuzhiyun ip addr add 10.23.11.$i/32 dev "$devdummy" preferred_lft $lft valid_lft $((lft+1)) 256*4882a593Smuzhiyun check_err $? 257*4882a593Smuzhiyun done 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun sleep 5 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun ip addr show dev "$devdummy" | grep "10.23.11." 262*4882a593Smuzhiyun if [ $? -eq 0 ]; then 263*4882a593Smuzhiyun echo "FAIL: preferred_lft addresses remaining" 264*4882a593Smuzhiyun check_err 1 265*4882a593Smuzhiyun return 266*4882a593Smuzhiyun fi 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun echo "PASS: preferred_lft addresses have expired" 269*4882a593Smuzhiyun} 270*4882a593Smuzhiyun 271*4882a593Smuzhiyunkci_test_promote_secondaries() 272*4882a593Smuzhiyun{ 273*4882a593Smuzhiyun promote=$(sysctl -n net.ipv4.conf.$devdummy.promote_secondaries) 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun sysctl -q net.ipv4.conf.$devdummy.promote_secondaries=1 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun for i in $(seq 2 254);do 278*4882a593Smuzhiyun IP="10.23.11.$i" 279*4882a593Smuzhiyun ip -f inet addr add $IP/16 brd + dev "$devdummy" 280*4882a593Smuzhiyun ifconfig "$devdummy" $IP netmask 255.255.0.0 281*4882a593Smuzhiyun done 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun ip addr flush dev "$devdummy" 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun [ $promote -eq 0 ] && sysctl -q net.ipv4.conf.$devdummy.promote_secondaries=0 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun echo "PASS: promote_secondaries complete" 288*4882a593Smuzhiyun} 289*4882a593Smuzhiyun 290*4882a593Smuzhiyunkci_test_addrlabel() 291*4882a593Smuzhiyun{ 292*4882a593Smuzhiyun local ret=0 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun ip addrlabel add prefix dead::/64 dev lo label 1 295*4882a593Smuzhiyun check_err $? 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun ip addrlabel list |grep -q "prefix dead::/64 dev lo label 1" 298*4882a593Smuzhiyun check_err $? 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun ip addrlabel del prefix dead::/64 dev lo label 1 2> /dev/null 301*4882a593Smuzhiyun check_err $? 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun ip addrlabel add prefix dead::/64 label 1 2> /dev/null 304*4882a593Smuzhiyun check_err $? 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun ip addrlabel del prefix dead::/64 label 1 2> /dev/null 307*4882a593Smuzhiyun check_err $? 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun # concurrent add/delete 310*4882a593Smuzhiyun for i in $(seq 1 1000); do 311*4882a593Smuzhiyun ip addrlabel add prefix 1c3::/64 label 12345 2>/dev/null 312*4882a593Smuzhiyun done & 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun for i in $(seq 1 1000); do 315*4882a593Smuzhiyun ip addrlabel del prefix 1c3::/64 label 12345 2>/dev/null 316*4882a593Smuzhiyun done 317*4882a593Smuzhiyun 318*4882a593Smuzhiyun wait 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun ip addrlabel del prefix 1c3::/64 label 12345 2>/dev/null 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun if [ $ret -ne 0 ];then 323*4882a593Smuzhiyun echo "FAIL: ipv6 addrlabel" 324*4882a593Smuzhiyun return 1 325*4882a593Smuzhiyun fi 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun echo "PASS: ipv6 addrlabel" 328*4882a593Smuzhiyun} 329*4882a593Smuzhiyun 330*4882a593Smuzhiyunkci_test_ifalias() 331*4882a593Smuzhiyun{ 332*4882a593Smuzhiyun local ret=0 333*4882a593Smuzhiyun namewant=$(uuidgen) 334*4882a593Smuzhiyun syspathname="/sys/class/net/$devdummy/ifalias" 335*4882a593Smuzhiyun 336*4882a593Smuzhiyun ip link set dev "$devdummy" alias "$namewant" 337*4882a593Smuzhiyun check_err $? 338*4882a593Smuzhiyun 339*4882a593Smuzhiyun if [ $ret -ne 0 ]; then 340*4882a593Smuzhiyun echo "FAIL: cannot set interface alias of $devdummy to $namewant" 341*4882a593Smuzhiyun return 1 342*4882a593Smuzhiyun fi 343*4882a593Smuzhiyun 344*4882a593Smuzhiyun ip link show "$devdummy" | grep -q "alias $namewant" 345*4882a593Smuzhiyun check_err $? 346*4882a593Smuzhiyun 347*4882a593Smuzhiyun if [ -r "$syspathname" ] ; then 348*4882a593Smuzhiyun read namehave < "$syspathname" 349*4882a593Smuzhiyun if [ "$namewant" != "$namehave" ]; then 350*4882a593Smuzhiyun echo "FAIL: did set ifalias $namewant but got $namehave" 351*4882a593Smuzhiyun return 1 352*4882a593Smuzhiyun fi 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun namewant=$(uuidgen) 355*4882a593Smuzhiyun echo "$namewant" > "$syspathname" 356*4882a593Smuzhiyun ip link show "$devdummy" | grep -q "alias $namewant" 357*4882a593Smuzhiyun check_err $? 358*4882a593Smuzhiyun 359*4882a593Smuzhiyun # sysfs interface allows to delete alias again 360*4882a593Smuzhiyun echo "" > "$syspathname" 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun ip link show "$devdummy" | grep -q "alias $namewant" 363*4882a593Smuzhiyun check_fail $? 364*4882a593Smuzhiyun 365*4882a593Smuzhiyun for i in $(seq 1 100); do 366*4882a593Smuzhiyun uuidgen > "$syspathname" & 367*4882a593Smuzhiyun done 368*4882a593Smuzhiyun 369*4882a593Smuzhiyun wait 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun # re-add the alias -- kernel should free mem when dummy dev is removed 372*4882a593Smuzhiyun ip link set dev "$devdummy" alias "$namewant" 373*4882a593Smuzhiyun check_err $? 374*4882a593Smuzhiyun fi 375*4882a593Smuzhiyun 376*4882a593Smuzhiyun if [ $ret -ne 0 ]; then 377*4882a593Smuzhiyun echo "FAIL: set interface alias $devdummy to $namewant" 378*4882a593Smuzhiyun return 1 379*4882a593Smuzhiyun fi 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun echo "PASS: set ifalias $namewant for $devdummy" 382*4882a593Smuzhiyun} 383*4882a593Smuzhiyun 384*4882a593Smuzhiyunkci_test_vrf() 385*4882a593Smuzhiyun{ 386*4882a593Smuzhiyun vrfname="test-vrf" 387*4882a593Smuzhiyun local ret=0 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun ip link show type vrf 2>/dev/null 390*4882a593Smuzhiyun if [ $? -ne 0 ]; then 391*4882a593Smuzhiyun echo "SKIP: vrf: iproute2 too old" 392*4882a593Smuzhiyun return $ksft_skip 393*4882a593Smuzhiyun fi 394*4882a593Smuzhiyun 395*4882a593Smuzhiyun ip link add "$vrfname" type vrf table 10 396*4882a593Smuzhiyun check_err $? 397*4882a593Smuzhiyun if [ $ret -ne 0 ];then 398*4882a593Smuzhiyun echo "FAIL: can't add vrf interface, skipping test" 399*4882a593Smuzhiyun return 0 400*4882a593Smuzhiyun fi 401*4882a593Smuzhiyun 402*4882a593Smuzhiyun ip -br link show type vrf | grep -q "$vrfname" 403*4882a593Smuzhiyun check_err $? 404*4882a593Smuzhiyun if [ $ret -ne 0 ];then 405*4882a593Smuzhiyun echo "FAIL: created vrf device not found" 406*4882a593Smuzhiyun return 1 407*4882a593Smuzhiyun fi 408*4882a593Smuzhiyun 409*4882a593Smuzhiyun ip link set dev "$vrfname" up 410*4882a593Smuzhiyun check_err $? 411*4882a593Smuzhiyun 412*4882a593Smuzhiyun ip link set dev "$devdummy" master "$vrfname" 413*4882a593Smuzhiyun check_err $? 414*4882a593Smuzhiyun ip link del dev "$vrfname" 415*4882a593Smuzhiyun check_err $? 416*4882a593Smuzhiyun 417*4882a593Smuzhiyun if [ $ret -ne 0 ];then 418*4882a593Smuzhiyun echo "FAIL: vrf" 419*4882a593Smuzhiyun return 1 420*4882a593Smuzhiyun fi 421*4882a593Smuzhiyun 422*4882a593Smuzhiyun echo "PASS: vrf" 423*4882a593Smuzhiyun} 424*4882a593Smuzhiyun 425*4882a593Smuzhiyunkci_test_encap_vxlan() 426*4882a593Smuzhiyun{ 427*4882a593Smuzhiyun local ret=0 428*4882a593Smuzhiyun vxlan="test-vxlan0" 429*4882a593Smuzhiyun vlan="test-vlan0" 430*4882a593Smuzhiyun testns="$1" 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun ip -netns "$testns" link add "$vxlan" type vxlan id 42 group 239.1.1.1 \ 433*4882a593Smuzhiyun dev "$devdummy" dstport 4789 2>/dev/null 434*4882a593Smuzhiyun if [ $? -ne 0 ]; then 435*4882a593Smuzhiyun echo "FAIL: can't add vxlan interface, skipping test" 436*4882a593Smuzhiyun return 0 437*4882a593Smuzhiyun fi 438*4882a593Smuzhiyun check_err $? 439*4882a593Smuzhiyun 440*4882a593Smuzhiyun ip -netns "$testns" addr add 10.2.11.49/24 dev "$vxlan" 441*4882a593Smuzhiyun check_err $? 442*4882a593Smuzhiyun 443*4882a593Smuzhiyun ip -netns "$testns" link set up dev "$vxlan" 444*4882a593Smuzhiyun check_err $? 445*4882a593Smuzhiyun 446*4882a593Smuzhiyun ip -netns "$testns" link add link "$vxlan" name "$vlan" type vlan id 1 447*4882a593Smuzhiyun check_err $? 448*4882a593Smuzhiyun 449*4882a593Smuzhiyun # changelink testcases 450*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan vni 43 2>/dev/null 451*4882a593Smuzhiyun check_fail $? 452*4882a593Smuzhiyun 453*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan group ffe5::5 dev "$devdummy" 2>/dev/null 454*4882a593Smuzhiyun check_fail $? 455*4882a593Smuzhiyun 456*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan ttl inherit 2>/dev/null 457*4882a593Smuzhiyun check_fail $? 458*4882a593Smuzhiyun 459*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan ttl 64 460*4882a593Smuzhiyun check_err $? 461*4882a593Smuzhiyun 462*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan nolearning 463*4882a593Smuzhiyun check_err $? 464*4882a593Smuzhiyun 465*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan proxy 2>/dev/null 466*4882a593Smuzhiyun check_fail $? 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan norsc 2>/dev/null 469*4882a593Smuzhiyun check_fail $? 470*4882a593Smuzhiyun 471*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan l2miss 2>/dev/null 472*4882a593Smuzhiyun check_fail $? 473*4882a593Smuzhiyun 474*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan l3miss 2>/dev/null 475*4882a593Smuzhiyun check_fail $? 476*4882a593Smuzhiyun 477*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan external 2>/dev/null 478*4882a593Smuzhiyun check_fail $? 479*4882a593Smuzhiyun 480*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan udpcsum 2>/dev/null 481*4882a593Smuzhiyun check_fail $? 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan udp6zerocsumtx 2>/dev/null 484*4882a593Smuzhiyun check_fail $? 485*4882a593Smuzhiyun 486*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan udp6zerocsumrx 2>/dev/null 487*4882a593Smuzhiyun check_fail $? 488*4882a593Smuzhiyun 489*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan remcsumtx 2>/dev/null 490*4882a593Smuzhiyun check_fail $? 491*4882a593Smuzhiyun 492*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan remcsumrx 2>/dev/null 493*4882a593Smuzhiyun check_fail $? 494*4882a593Smuzhiyun 495*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan gbp 2>/dev/null 496*4882a593Smuzhiyun check_fail $? 497*4882a593Smuzhiyun 498*4882a593Smuzhiyun ip -netns "$testns" link set dev "$vxlan" type vxlan gpe 2>/dev/null 499*4882a593Smuzhiyun check_fail $? 500*4882a593Smuzhiyun 501*4882a593Smuzhiyun ip -netns "$testns" link del "$vxlan" 502*4882a593Smuzhiyun check_err $? 503*4882a593Smuzhiyun 504*4882a593Smuzhiyun if [ $ret -ne 0 ]; then 505*4882a593Smuzhiyun echo "FAIL: vxlan" 506*4882a593Smuzhiyun return 1 507*4882a593Smuzhiyun fi 508*4882a593Smuzhiyun echo "PASS: vxlan" 509*4882a593Smuzhiyun} 510*4882a593Smuzhiyun 511*4882a593Smuzhiyunkci_test_encap_fou() 512*4882a593Smuzhiyun{ 513*4882a593Smuzhiyun local ret=0 514*4882a593Smuzhiyun name="test-fou" 515*4882a593Smuzhiyun testns="$1" 516*4882a593Smuzhiyun 517*4882a593Smuzhiyun ip fou help 2>&1 |grep -q 'Usage: ip fou' 518*4882a593Smuzhiyun if [ $? -ne 0 ];then 519*4882a593Smuzhiyun echo "SKIP: fou: iproute2 too old" 520*4882a593Smuzhiyun return $ksft_skip 521*4882a593Smuzhiyun fi 522*4882a593Smuzhiyun 523*4882a593Smuzhiyun if ! /sbin/modprobe -q -n fou; then 524*4882a593Smuzhiyun echo "SKIP: module fou is not found" 525*4882a593Smuzhiyun return $ksft_skip 526*4882a593Smuzhiyun fi 527*4882a593Smuzhiyun /sbin/modprobe -q fou 528*4882a593Smuzhiyun ip -netns "$testns" fou add port 7777 ipproto 47 2>/dev/null 529*4882a593Smuzhiyun if [ $? -ne 0 ];then 530*4882a593Smuzhiyun echo "FAIL: can't add fou port 7777, skipping test" 531*4882a593Smuzhiyun return 1 532*4882a593Smuzhiyun fi 533*4882a593Smuzhiyun 534*4882a593Smuzhiyun ip -netns "$testns" fou add port 8888 ipproto 4 535*4882a593Smuzhiyun check_err $? 536*4882a593Smuzhiyun 537*4882a593Smuzhiyun ip -netns "$testns" fou del port 9999 2>/dev/null 538*4882a593Smuzhiyun check_fail $? 539*4882a593Smuzhiyun 540*4882a593Smuzhiyun ip -netns "$testns" fou del port 7777 541*4882a593Smuzhiyun check_err $? 542*4882a593Smuzhiyun 543*4882a593Smuzhiyun if [ $ret -ne 0 ]; then 544*4882a593Smuzhiyun echo "FAIL: fou" 545*4882a593Smuzhiyun return 1 546*4882a593Smuzhiyun fi 547*4882a593Smuzhiyun 548*4882a593Smuzhiyun echo "PASS: fou" 549*4882a593Smuzhiyun} 550*4882a593Smuzhiyun 551*4882a593Smuzhiyun# test various encap methods, use netns to avoid unwanted interference 552*4882a593Smuzhiyunkci_test_encap() 553*4882a593Smuzhiyun{ 554*4882a593Smuzhiyun testns="testns" 555*4882a593Smuzhiyun local ret=0 556*4882a593Smuzhiyun 557*4882a593Smuzhiyun ip netns add "$testns" 558*4882a593Smuzhiyun if [ $? -ne 0 ]; then 559*4882a593Smuzhiyun echo "SKIP encap tests: cannot add net namespace $testns" 560*4882a593Smuzhiyun return $ksft_skip 561*4882a593Smuzhiyun fi 562*4882a593Smuzhiyun 563*4882a593Smuzhiyun ip -netns "$testns" link set lo up 564*4882a593Smuzhiyun check_err $? 565*4882a593Smuzhiyun 566*4882a593Smuzhiyun ip -netns "$testns" link add name "$devdummy" type dummy 567*4882a593Smuzhiyun check_err $? 568*4882a593Smuzhiyun ip -netns "$testns" link set "$devdummy" up 569*4882a593Smuzhiyun check_err $? 570*4882a593Smuzhiyun 571*4882a593Smuzhiyun kci_test_encap_vxlan "$testns" 572*4882a593Smuzhiyun check_err $? 573*4882a593Smuzhiyun kci_test_encap_fou "$testns" 574*4882a593Smuzhiyun check_err $? 575*4882a593Smuzhiyun 576*4882a593Smuzhiyun ip netns del "$testns" 577*4882a593Smuzhiyun return $ret 578*4882a593Smuzhiyun} 579*4882a593Smuzhiyun 580*4882a593Smuzhiyunkci_test_macsec() 581*4882a593Smuzhiyun{ 582*4882a593Smuzhiyun msname="test_macsec0" 583*4882a593Smuzhiyun local ret=0 584*4882a593Smuzhiyun 585*4882a593Smuzhiyun ip macsec help 2>&1 | grep -q "^Usage: ip macsec" 586*4882a593Smuzhiyun if [ $? -ne 0 ]; then 587*4882a593Smuzhiyun echo "SKIP: macsec: iproute2 too old" 588*4882a593Smuzhiyun return $ksft_skip 589*4882a593Smuzhiyun fi 590*4882a593Smuzhiyun 591*4882a593Smuzhiyun ip link add link "$devdummy" "$msname" type macsec port 42 encrypt on 592*4882a593Smuzhiyun check_err $? 593*4882a593Smuzhiyun if [ $ret -ne 0 ];then 594*4882a593Smuzhiyun echo "FAIL: can't add macsec interface, skipping test" 595*4882a593Smuzhiyun return 1 596*4882a593Smuzhiyun fi 597*4882a593Smuzhiyun 598*4882a593Smuzhiyun ip macsec add "$msname" tx sa 0 pn 1024 on key 01 12345678901234567890123456789012 599*4882a593Smuzhiyun check_err $? 600*4882a593Smuzhiyun 601*4882a593Smuzhiyun ip macsec add "$msname" rx port 1234 address "1c:ed:de:ad:be:ef" 602*4882a593Smuzhiyun check_err $? 603*4882a593Smuzhiyun 604*4882a593Smuzhiyun ip macsec add "$msname" rx port 1234 address "1c:ed:de:ad:be:ef" sa 0 pn 1 on key 00 0123456789abcdef0123456789abcdef 605*4882a593Smuzhiyun check_err $? 606*4882a593Smuzhiyun 607*4882a593Smuzhiyun ip macsec show > /dev/null 608*4882a593Smuzhiyun check_err $? 609*4882a593Smuzhiyun 610*4882a593Smuzhiyun ip link del dev "$msname" 611*4882a593Smuzhiyun check_err $? 612*4882a593Smuzhiyun 613*4882a593Smuzhiyun if [ $ret -ne 0 ];then 614*4882a593Smuzhiyun echo "FAIL: macsec" 615*4882a593Smuzhiyun return 1 616*4882a593Smuzhiyun fi 617*4882a593Smuzhiyun 618*4882a593Smuzhiyun echo "PASS: macsec" 619*4882a593Smuzhiyun} 620*4882a593Smuzhiyun 621*4882a593Smuzhiyun#------------------------------------------------------------------- 622*4882a593Smuzhiyun# Example commands 623*4882a593Smuzhiyun# ip x s add proto esp src 14.0.0.52 dst 14.0.0.70 \ 624*4882a593Smuzhiyun# spi 0x07 mode transport reqid 0x07 replay-window 32 \ 625*4882a593Smuzhiyun# aead 'rfc4106(gcm(aes))' 1234567890123456dcba 128 \ 626*4882a593Smuzhiyun# sel src 14.0.0.52/24 dst 14.0.0.70/24 627*4882a593Smuzhiyun# ip x p add dir out src 14.0.0.52/24 dst 14.0.0.70/24 \ 628*4882a593Smuzhiyun# tmpl proto esp src 14.0.0.52 dst 14.0.0.70 \ 629*4882a593Smuzhiyun# spi 0x07 mode transport reqid 0x07 630*4882a593Smuzhiyun# 631*4882a593Smuzhiyun# Subcommands not tested 632*4882a593Smuzhiyun# ip x s update 633*4882a593Smuzhiyun# ip x s allocspi 634*4882a593Smuzhiyun# ip x s deleteall 635*4882a593Smuzhiyun# ip x p update 636*4882a593Smuzhiyun# ip x p deleteall 637*4882a593Smuzhiyun# ip x p set 638*4882a593Smuzhiyun#------------------------------------------------------------------- 639*4882a593Smuzhiyunkci_test_ipsec() 640*4882a593Smuzhiyun{ 641*4882a593Smuzhiyun local ret=0 642*4882a593Smuzhiyun algo="aead rfc4106(gcm(aes)) 0x3132333435363738393031323334353664636261 128" 643*4882a593Smuzhiyun srcip=192.168.123.1 644*4882a593Smuzhiyun dstip=192.168.123.2 645*4882a593Smuzhiyun spi=7 646*4882a593Smuzhiyun 647*4882a593Smuzhiyun ip addr add $srcip dev $devdummy 648*4882a593Smuzhiyun 649*4882a593Smuzhiyun # flush to be sure there's nothing configured 650*4882a593Smuzhiyun ip x s flush ; ip x p flush 651*4882a593Smuzhiyun check_err $? 652*4882a593Smuzhiyun 653*4882a593Smuzhiyun # start the monitor in the background 654*4882a593Smuzhiyun tmpfile=`mktemp /var/run/ipsectestXXX` 655*4882a593Smuzhiyun mpid=`(ip x m > $tmpfile & echo $!) 2>/dev/null` 656*4882a593Smuzhiyun sleep 0.2 657*4882a593Smuzhiyun 658*4882a593Smuzhiyun ipsecid="proto esp src $srcip dst $dstip spi 0x07" 659*4882a593Smuzhiyun ip x s add $ipsecid \ 660*4882a593Smuzhiyun mode transport reqid 0x07 replay-window 32 \ 661*4882a593Smuzhiyun $algo sel src $srcip/24 dst $dstip/24 662*4882a593Smuzhiyun check_err $? 663*4882a593Smuzhiyun 664*4882a593Smuzhiyun lines=`ip x s list | grep $srcip | grep $dstip | wc -l` 665*4882a593Smuzhiyun test $lines -eq 2 666*4882a593Smuzhiyun check_err $? 667*4882a593Smuzhiyun 668*4882a593Smuzhiyun ip x s count | grep -q "SAD count 1" 669*4882a593Smuzhiyun check_err $? 670*4882a593Smuzhiyun 671*4882a593Smuzhiyun lines=`ip x s get $ipsecid | grep $srcip | grep $dstip | wc -l` 672*4882a593Smuzhiyun test $lines -eq 2 673*4882a593Smuzhiyun check_err $? 674*4882a593Smuzhiyun 675*4882a593Smuzhiyun ip x s delete $ipsecid 676*4882a593Smuzhiyun check_err $? 677*4882a593Smuzhiyun 678*4882a593Smuzhiyun lines=`ip x s list | wc -l` 679*4882a593Smuzhiyun test $lines -eq 0 680*4882a593Smuzhiyun check_err $? 681*4882a593Smuzhiyun 682*4882a593Smuzhiyun ipsecsel="dir out src $srcip/24 dst $dstip/24" 683*4882a593Smuzhiyun ip x p add $ipsecsel \ 684*4882a593Smuzhiyun tmpl proto esp src $srcip dst $dstip \ 685*4882a593Smuzhiyun spi 0x07 mode transport reqid 0x07 686*4882a593Smuzhiyun check_err $? 687*4882a593Smuzhiyun 688*4882a593Smuzhiyun lines=`ip x p list | grep $srcip | grep $dstip | wc -l` 689*4882a593Smuzhiyun test $lines -eq 2 690*4882a593Smuzhiyun check_err $? 691*4882a593Smuzhiyun 692*4882a593Smuzhiyun ip x p count | grep -q "SPD IN 0 OUT 1 FWD 0" 693*4882a593Smuzhiyun check_err $? 694*4882a593Smuzhiyun 695*4882a593Smuzhiyun lines=`ip x p get $ipsecsel | grep $srcip | grep $dstip | wc -l` 696*4882a593Smuzhiyun test $lines -eq 2 697*4882a593Smuzhiyun check_err $? 698*4882a593Smuzhiyun 699*4882a593Smuzhiyun ip x p delete $ipsecsel 700*4882a593Smuzhiyun check_err $? 701*4882a593Smuzhiyun 702*4882a593Smuzhiyun lines=`ip x p list | wc -l` 703*4882a593Smuzhiyun test $lines -eq 0 704*4882a593Smuzhiyun check_err $? 705*4882a593Smuzhiyun 706*4882a593Smuzhiyun # check the monitor results 707*4882a593Smuzhiyun kill $mpid 708*4882a593Smuzhiyun lines=`wc -l $tmpfile | cut "-d " -f1` 709*4882a593Smuzhiyun test $lines -eq 20 710*4882a593Smuzhiyun check_err $? 711*4882a593Smuzhiyun rm -rf $tmpfile 712*4882a593Smuzhiyun 713*4882a593Smuzhiyun # clean up any leftovers 714*4882a593Smuzhiyun ip x s flush 715*4882a593Smuzhiyun check_err $? 716*4882a593Smuzhiyun ip x p flush 717*4882a593Smuzhiyun check_err $? 718*4882a593Smuzhiyun ip addr del $srcip/32 dev $devdummy 719*4882a593Smuzhiyun 720*4882a593Smuzhiyun if [ $ret -ne 0 ]; then 721*4882a593Smuzhiyun echo "FAIL: ipsec" 722*4882a593Smuzhiyun return 1 723*4882a593Smuzhiyun fi 724*4882a593Smuzhiyun echo "PASS: ipsec" 725*4882a593Smuzhiyun} 726*4882a593Smuzhiyun 727*4882a593Smuzhiyun#------------------------------------------------------------------- 728*4882a593Smuzhiyun# Example commands 729*4882a593Smuzhiyun# ip x s add proto esp src 14.0.0.52 dst 14.0.0.70 \ 730*4882a593Smuzhiyun# spi 0x07 mode transport reqid 0x07 replay-window 32 \ 731*4882a593Smuzhiyun# aead 'rfc4106(gcm(aes))' 1234567890123456dcba 128 \ 732*4882a593Smuzhiyun# sel src 14.0.0.52/24 dst 14.0.0.70/24 733*4882a593Smuzhiyun# offload dev sim1 dir out 734*4882a593Smuzhiyun# ip x p add dir out src 14.0.0.52/24 dst 14.0.0.70/24 \ 735*4882a593Smuzhiyun# tmpl proto esp src 14.0.0.52 dst 14.0.0.70 \ 736*4882a593Smuzhiyun# spi 0x07 mode transport reqid 0x07 737*4882a593Smuzhiyun# 738*4882a593Smuzhiyun#------------------------------------------------------------------- 739*4882a593Smuzhiyunkci_test_ipsec_offload() 740*4882a593Smuzhiyun{ 741*4882a593Smuzhiyun local ret=0 742*4882a593Smuzhiyun algo="aead rfc4106(gcm(aes)) 0x3132333435363738393031323334353664636261 128" 743*4882a593Smuzhiyun srcip=192.168.123.3 744*4882a593Smuzhiyun dstip=192.168.123.4 745*4882a593Smuzhiyun sysfsd=/sys/kernel/debug/netdevsim/netdevsim0/ports/0/ 746*4882a593Smuzhiyun sysfsf=$sysfsd/ipsec 747*4882a593Smuzhiyun sysfsnet=/sys/bus/netdevsim/devices/netdevsim0/net/ 748*4882a593Smuzhiyun probed=false 749*4882a593Smuzhiyun 750*4882a593Smuzhiyun # setup netdevsim since dummydev doesn't have offload support 751*4882a593Smuzhiyun if [ ! -w /sys/bus/netdevsim/new_device ] ; then 752*4882a593Smuzhiyun modprobe -q netdevsim 753*4882a593Smuzhiyun check_err $? 754*4882a593Smuzhiyun if [ $ret -ne 0 ]; then 755*4882a593Smuzhiyun echo "SKIP: ipsec_offload can't load netdevsim" 756*4882a593Smuzhiyun return $ksft_skip 757*4882a593Smuzhiyun fi 758*4882a593Smuzhiyun probed=true 759*4882a593Smuzhiyun fi 760*4882a593Smuzhiyun 761*4882a593Smuzhiyun echo "0" > /sys/bus/netdevsim/new_device 762*4882a593Smuzhiyun while [ ! -d $sysfsnet ] ; do :; done 763*4882a593Smuzhiyun udevadm settle 764*4882a593Smuzhiyun dev=`ls $sysfsnet` 765*4882a593Smuzhiyun 766*4882a593Smuzhiyun ip addr add $srcip dev $dev 767*4882a593Smuzhiyun ip link set $dev up 768*4882a593Smuzhiyun if [ ! -d $sysfsd ] ; then 769*4882a593Smuzhiyun echo "FAIL: ipsec_offload can't create device $dev" 770*4882a593Smuzhiyun return 1 771*4882a593Smuzhiyun fi 772*4882a593Smuzhiyun if [ ! -f $sysfsf ] ; then 773*4882a593Smuzhiyun echo "FAIL: ipsec_offload netdevsim doesn't support IPsec offload" 774*4882a593Smuzhiyun return 1 775*4882a593Smuzhiyun fi 776*4882a593Smuzhiyun 777*4882a593Smuzhiyun # flush to be sure there's nothing configured 778*4882a593Smuzhiyun ip x s flush ; ip x p flush 779*4882a593Smuzhiyun 780*4882a593Smuzhiyun # create offloaded SAs, both in and out 781*4882a593Smuzhiyun ip x p add dir out src $srcip/24 dst $dstip/24 \ 782*4882a593Smuzhiyun tmpl proto esp src $srcip dst $dstip spi 9 \ 783*4882a593Smuzhiyun mode transport reqid 42 784*4882a593Smuzhiyun check_err $? 785*4882a593Smuzhiyun ip x p add dir in src $dstip/24 dst $srcip/24 \ 786*4882a593Smuzhiyun tmpl proto esp src $dstip dst $srcip spi 9 \ 787*4882a593Smuzhiyun mode transport reqid 42 788*4882a593Smuzhiyun check_err $? 789*4882a593Smuzhiyun 790*4882a593Smuzhiyun ip x s add proto esp src $srcip dst $dstip spi 9 \ 791*4882a593Smuzhiyun mode transport reqid 42 $algo sel src $srcip/24 dst $dstip/24 \ 792*4882a593Smuzhiyun offload dev $dev dir out 793*4882a593Smuzhiyun check_err $? 794*4882a593Smuzhiyun ip x s add proto esp src $dstip dst $srcip spi 9 \ 795*4882a593Smuzhiyun mode transport reqid 42 $algo sel src $dstip/24 dst $srcip/24 \ 796*4882a593Smuzhiyun offload dev $dev dir in 797*4882a593Smuzhiyun check_err $? 798*4882a593Smuzhiyun if [ $ret -ne 0 ]; then 799*4882a593Smuzhiyun echo "FAIL: ipsec_offload can't create SA" 800*4882a593Smuzhiyun return 1 801*4882a593Smuzhiyun fi 802*4882a593Smuzhiyun 803*4882a593Smuzhiyun # does offload show up in ip output 804*4882a593Smuzhiyun lines=`ip x s list | grep -c "crypto offload parameters: dev $dev dir"` 805*4882a593Smuzhiyun if [ $lines -ne 2 ] ; then 806*4882a593Smuzhiyun echo "FAIL: ipsec_offload SA offload missing from list output" 807*4882a593Smuzhiyun check_err 1 808*4882a593Smuzhiyun fi 809*4882a593Smuzhiyun 810*4882a593Smuzhiyun # use ping to exercise the Tx path 811*4882a593Smuzhiyun ping -I $dev -c 3 -W 1 -i 0 $dstip >/dev/null 812*4882a593Smuzhiyun 813*4882a593Smuzhiyun # does driver have correct offload info 814*4882a593Smuzhiyun diff $sysfsf - << EOF 815*4882a593SmuzhiyunSA count=2 tx=3 816*4882a593Smuzhiyunsa[0] tx ipaddr=0x00000000 00000000 00000000 00000000 817*4882a593Smuzhiyunsa[0] spi=0x00000009 proto=0x32 salt=0x61626364 crypt=1 818*4882a593Smuzhiyunsa[0] key=0x34333231 38373635 32313039 36353433 819*4882a593Smuzhiyunsa[1] rx ipaddr=0x00000000 00000000 00000000 037ba8c0 820*4882a593Smuzhiyunsa[1] spi=0x00000009 proto=0x32 salt=0x61626364 crypt=1 821*4882a593Smuzhiyunsa[1] key=0x34333231 38373635 32313039 36353433 822*4882a593SmuzhiyunEOF 823*4882a593Smuzhiyun if [ $? -ne 0 ] ; then 824*4882a593Smuzhiyun echo "FAIL: ipsec_offload incorrect driver data" 825*4882a593Smuzhiyun check_err 1 826*4882a593Smuzhiyun fi 827*4882a593Smuzhiyun 828*4882a593Smuzhiyun # does offload get removed from driver 829*4882a593Smuzhiyun ip x s flush 830*4882a593Smuzhiyun ip x p flush 831*4882a593Smuzhiyun lines=`grep -c "SA count=0" $sysfsf` 832*4882a593Smuzhiyun if [ $lines -ne 1 ] ; then 833*4882a593Smuzhiyun echo "FAIL: ipsec_offload SA not removed from driver" 834*4882a593Smuzhiyun check_err 1 835*4882a593Smuzhiyun fi 836*4882a593Smuzhiyun 837*4882a593Smuzhiyun # clean up any leftovers 838*4882a593Smuzhiyun $probed && rmmod netdevsim 839*4882a593Smuzhiyun 840*4882a593Smuzhiyun if [ $ret -ne 0 ]; then 841*4882a593Smuzhiyun echo "FAIL: ipsec_offload" 842*4882a593Smuzhiyun return 1 843*4882a593Smuzhiyun fi 844*4882a593Smuzhiyun echo "PASS: ipsec_offload" 845*4882a593Smuzhiyun} 846*4882a593Smuzhiyun 847*4882a593Smuzhiyunkci_test_gretap() 848*4882a593Smuzhiyun{ 849*4882a593Smuzhiyun testns="testns" 850*4882a593Smuzhiyun DEV_NS=gretap00 851*4882a593Smuzhiyun local ret=0 852*4882a593Smuzhiyun 853*4882a593Smuzhiyun ip netns add "$testns" 854*4882a593Smuzhiyun if [ $? -ne 0 ]; then 855*4882a593Smuzhiyun echo "SKIP gretap tests: cannot add net namespace $testns" 856*4882a593Smuzhiyun return $ksft_skip 857*4882a593Smuzhiyun fi 858*4882a593Smuzhiyun 859*4882a593Smuzhiyun ip link help gretap 2>&1 | grep -q "^Usage:" 860*4882a593Smuzhiyun if [ $? -ne 0 ];then 861*4882a593Smuzhiyun echo "SKIP: gretap: iproute2 too old" 862*4882a593Smuzhiyun ip netns del "$testns" 863*4882a593Smuzhiyun return $ksft_skip 864*4882a593Smuzhiyun fi 865*4882a593Smuzhiyun 866*4882a593Smuzhiyun # test native tunnel 867*4882a593Smuzhiyun ip -netns "$testns" link add dev "$DEV_NS" type gretap seq \ 868*4882a593Smuzhiyun key 102 local 172.16.1.100 remote 172.16.1.200 869*4882a593Smuzhiyun check_err $? 870*4882a593Smuzhiyun 871*4882a593Smuzhiyun ip -netns "$testns" addr add dev "$DEV_NS" 10.1.1.100/24 872*4882a593Smuzhiyun check_err $? 873*4882a593Smuzhiyun 874*4882a593Smuzhiyun ip -netns "$testns" link set dev $DEV_NS up 875*4882a593Smuzhiyun check_err $? 876*4882a593Smuzhiyun 877*4882a593Smuzhiyun ip -netns "$testns" link del "$DEV_NS" 878*4882a593Smuzhiyun check_err $? 879*4882a593Smuzhiyun 880*4882a593Smuzhiyun # test external mode 881*4882a593Smuzhiyun ip -netns "$testns" link add dev "$DEV_NS" type gretap external 882*4882a593Smuzhiyun check_err $? 883*4882a593Smuzhiyun 884*4882a593Smuzhiyun ip -netns "$testns" link del "$DEV_NS" 885*4882a593Smuzhiyun check_err $? 886*4882a593Smuzhiyun 887*4882a593Smuzhiyun if [ $ret -ne 0 ]; then 888*4882a593Smuzhiyun echo "FAIL: gretap" 889*4882a593Smuzhiyun ip netns del "$testns" 890*4882a593Smuzhiyun return 1 891*4882a593Smuzhiyun fi 892*4882a593Smuzhiyun echo "PASS: gretap" 893*4882a593Smuzhiyun 894*4882a593Smuzhiyun ip netns del "$testns" 895*4882a593Smuzhiyun} 896*4882a593Smuzhiyun 897*4882a593Smuzhiyunkci_test_ip6gretap() 898*4882a593Smuzhiyun{ 899*4882a593Smuzhiyun testns="testns" 900*4882a593Smuzhiyun DEV_NS=ip6gretap00 901*4882a593Smuzhiyun local ret=0 902*4882a593Smuzhiyun 903*4882a593Smuzhiyun ip netns add "$testns" 904*4882a593Smuzhiyun if [ $? -ne 0 ]; then 905*4882a593Smuzhiyun echo "SKIP ip6gretap tests: cannot add net namespace $testns" 906*4882a593Smuzhiyun return $ksft_skip 907*4882a593Smuzhiyun fi 908*4882a593Smuzhiyun 909*4882a593Smuzhiyun ip link help ip6gretap 2>&1 | grep -q "^Usage:" 910*4882a593Smuzhiyun if [ $? -ne 0 ];then 911*4882a593Smuzhiyun echo "SKIP: ip6gretap: iproute2 too old" 912*4882a593Smuzhiyun ip netns del "$testns" 913*4882a593Smuzhiyun return $ksft_skip 914*4882a593Smuzhiyun fi 915*4882a593Smuzhiyun 916*4882a593Smuzhiyun # test native tunnel 917*4882a593Smuzhiyun ip -netns "$testns" link add dev "$DEV_NS" type ip6gretap seq \ 918*4882a593Smuzhiyun key 102 local fc00:100::1 remote fc00:100::2 919*4882a593Smuzhiyun check_err $? 920*4882a593Smuzhiyun 921*4882a593Smuzhiyun ip -netns "$testns" addr add dev "$DEV_NS" fc00:200::1/96 922*4882a593Smuzhiyun check_err $? 923*4882a593Smuzhiyun 924*4882a593Smuzhiyun ip -netns "$testns" link set dev $DEV_NS up 925*4882a593Smuzhiyun check_err $? 926*4882a593Smuzhiyun 927*4882a593Smuzhiyun ip -netns "$testns" link del "$DEV_NS" 928*4882a593Smuzhiyun check_err $? 929*4882a593Smuzhiyun 930*4882a593Smuzhiyun # test external mode 931*4882a593Smuzhiyun ip -netns "$testns" link add dev "$DEV_NS" type ip6gretap external 932*4882a593Smuzhiyun check_err $? 933*4882a593Smuzhiyun 934*4882a593Smuzhiyun ip -netns "$testns" link del "$DEV_NS" 935*4882a593Smuzhiyun check_err $? 936*4882a593Smuzhiyun 937*4882a593Smuzhiyun if [ $ret -ne 0 ]; then 938*4882a593Smuzhiyun echo "FAIL: ip6gretap" 939*4882a593Smuzhiyun ip netns del "$testns" 940*4882a593Smuzhiyun return 1 941*4882a593Smuzhiyun fi 942*4882a593Smuzhiyun echo "PASS: ip6gretap" 943*4882a593Smuzhiyun 944*4882a593Smuzhiyun ip netns del "$testns" 945*4882a593Smuzhiyun} 946*4882a593Smuzhiyun 947*4882a593Smuzhiyunkci_test_erspan() 948*4882a593Smuzhiyun{ 949*4882a593Smuzhiyun testns="testns" 950*4882a593Smuzhiyun DEV_NS=erspan00 951*4882a593Smuzhiyun local ret=0 952*4882a593Smuzhiyun 953*4882a593Smuzhiyun ip link help erspan 2>&1 | grep -q "^Usage:" 954*4882a593Smuzhiyun if [ $? -ne 0 ];then 955*4882a593Smuzhiyun echo "SKIP: erspan: iproute2 too old" 956*4882a593Smuzhiyun return $ksft_skip 957*4882a593Smuzhiyun fi 958*4882a593Smuzhiyun 959*4882a593Smuzhiyun ip netns add "$testns" 960*4882a593Smuzhiyun if [ $? -ne 0 ]; then 961*4882a593Smuzhiyun echo "SKIP erspan tests: cannot add net namespace $testns" 962*4882a593Smuzhiyun return $ksft_skip 963*4882a593Smuzhiyun fi 964*4882a593Smuzhiyun 965*4882a593Smuzhiyun # test native tunnel erspan v1 966*4882a593Smuzhiyun ip -netns "$testns" link add dev "$DEV_NS" type erspan seq \ 967*4882a593Smuzhiyun key 102 local 172.16.1.100 remote 172.16.1.200 \ 968*4882a593Smuzhiyun erspan_ver 1 erspan 488 969*4882a593Smuzhiyun check_err $? 970*4882a593Smuzhiyun 971*4882a593Smuzhiyun ip -netns "$testns" addr add dev "$DEV_NS" 10.1.1.100/24 972*4882a593Smuzhiyun check_err $? 973*4882a593Smuzhiyun 974*4882a593Smuzhiyun ip -netns "$testns" link set dev $DEV_NS up 975*4882a593Smuzhiyun check_err $? 976*4882a593Smuzhiyun 977*4882a593Smuzhiyun ip -netns "$testns" link del "$DEV_NS" 978*4882a593Smuzhiyun check_err $? 979*4882a593Smuzhiyun 980*4882a593Smuzhiyun # test native tunnel erspan v2 981*4882a593Smuzhiyun ip -netns "$testns" link add dev "$DEV_NS" type erspan seq \ 982*4882a593Smuzhiyun key 102 local 172.16.1.100 remote 172.16.1.200 \ 983*4882a593Smuzhiyun erspan_ver 2 erspan_dir ingress erspan_hwid 7 984*4882a593Smuzhiyun check_err $? 985*4882a593Smuzhiyun 986*4882a593Smuzhiyun ip -netns "$testns" addr add dev "$DEV_NS" 10.1.1.100/24 987*4882a593Smuzhiyun check_err $? 988*4882a593Smuzhiyun 989*4882a593Smuzhiyun ip -netns "$testns" link set dev $DEV_NS up 990*4882a593Smuzhiyun check_err $? 991*4882a593Smuzhiyun 992*4882a593Smuzhiyun ip -netns "$testns" link del "$DEV_NS" 993*4882a593Smuzhiyun check_err $? 994*4882a593Smuzhiyun 995*4882a593Smuzhiyun # test external mode 996*4882a593Smuzhiyun ip -netns "$testns" link add dev "$DEV_NS" type erspan external 997*4882a593Smuzhiyun check_err $? 998*4882a593Smuzhiyun 999*4882a593Smuzhiyun ip -netns "$testns" link del "$DEV_NS" 1000*4882a593Smuzhiyun check_err $? 1001*4882a593Smuzhiyun 1002*4882a593Smuzhiyun if [ $ret -ne 0 ]; then 1003*4882a593Smuzhiyun echo "FAIL: erspan" 1004*4882a593Smuzhiyun ip netns del "$testns" 1005*4882a593Smuzhiyun return 1 1006*4882a593Smuzhiyun fi 1007*4882a593Smuzhiyun echo "PASS: erspan" 1008*4882a593Smuzhiyun 1009*4882a593Smuzhiyun ip netns del "$testns" 1010*4882a593Smuzhiyun} 1011*4882a593Smuzhiyun 1012*4882a593Smuzhiyunkci_test_ip6erspan() 1013*4882a593Smuzhiyun{ 1014*4882a593Smuzhiyun testns="testns" 1015*4882a593Smuzhiyun DEV_NS=ip6erspan00 1016*4882a593Smuzhiyun local ret=0 1017*4882a593Smuzhiyun 1018*4882a593Smuzhiyun ip link help ip6erspan 2>&1 | grep -q "^Usage:" 1019*4882a593Smuzhiyun if [ $? -ne 0 ];then 1020*4882a593Smuzhiyun echo "SKIP: ip6erspan: iproute2 too old" 1021*4882a593Smuzhiyun return $ksft_skip 1022*4882a593Smuzhiyun fi 1023*4882a593Smuzhiyun 1024*4882a593Smuzhiyun ip netns add "$testns" 1025*4882a593Smuzhiyun if [ $? -ne 0 ]; then 1026*4882a593Smuzhiyun echo "SKIP ip6erspan tests: cannot add net namespace $testns" 1027*4882a593Smuzhiyun return $ksft_skip 1028*4882a593Smuzhiyun fi 1029*4882a593Smuzhiyun 1030*4882a593Smuzhiyun # test native tunnel ip6erspan v1 1031*4882a593Smuzhiyun ip -netns "$testns" link add dev "$DEV_NS" type ip6erspan seq \ 1032*4882a593Smuzhiyun key 102 local fc00:100::1 remote fc00:100::2 \ 1033*4882a593Smuzhiyun erspan_ver 1 erspan 488 1034*4882a593Smuzhiyun check_err $? 1035*4882a593Smuzhiyun 1036*4882a593Smuzhiyun ip -netns "$testns" addr add dev "$DEV_NS" 10.1.1.100/24 1037*4882a593Smuzhiyun check_err $? 1038*4882a593Smuzhiyun 1039*4882a593Smuzhiyun ip -netns "$testns" link set dev $DEV_NS up 1040*4882a593Smuzhiyun check_err $? 1041*4882a593Smuzhiyun 1042*4882a593Smuzhiyun ip -netns "$testns" link del "$DEV_NS" 1043*4882a593Smuzhiyun check_err $? 1044*4882a593Smuzhiyun 1045*4882a593Smuzhiyun # test native tunnel ip6erspan v2 1046*4882a593Smuzhiyun ip -netns "$testns" link add dev "$DEV_NS" type ip6erspan seq \ 1047*4882a593Smuzhiyun key 102 local fc00:100::1 remote fc00:100::2 \ 1048*4882a593Smuzhiyun erspan_ver 2 erspan_dir ingress erspan_hwid 7 1049*4882a593Smuzhiyun check_err $? 1050*4882a593Smuzhiyun 1051*4882a593Smuzhiyun ip -netns "$testns" addr add dev "$DEV_NS" 10.1.1.100/24 1052*4882a593Smuzhiyun check_err $? 1053*4882a593Smuzhiyun 1054*4882a593Smuzhiyun ip -netns "$testns" link set dev $DEV_NS up 1055*4882a593Smuzhiyun check_err $? 1056*4882a593Smuzhiyun 1057*4882a593Smuzhiyun ip -netns "$testns" link del "$DEV_NS" 1058*4882a593Smuzhiyun check_err $? 1059*4882a593Smuzhiyun 1060*4882a593Smuzhiyun # test external mode 1061*4882a593Smuzhiyun ip -netns "$testns" link add dev "$DEV_NS" \ 1062*4882a593Smuzhiyun type ip6erspan external 1063*4882a593Smuzhiyun check_err $? 1064*4882a593Smuzhiyun 1065*4882a593Smuzhiyun ip -netns "$testns" link del "$DEV_NS" 1066*4882a593Smuzhiyun check_err $? 1067*4882a593Smuzhiyun 1068*4882a593Smuzhiyun if [ $ret -ne 0 ]; then 1069*4882a593Smuzhiyun echo "FAIL: ip6erspan" 1070*4882a593Smuzhiyun ip netns del "$testns" 1071*4882a593Smuzhiyun return 1 1072*4882a593Smuzhiyun fi 1073*4882a593Smuzhiyun echo "PASS: ip6erspan" 1074*4882a593Smuzhiyun 1075*4882a593Smuzhiyun ip netns del "$testns" 1076*4882a593Smuzhiyun} 1077*4882a593Smuzhiyun 1078*4882a593Smuzhiyunkci_test_fdb_get() 1079*4882a593Smuzhiyun{ 1080*4882a593Smuzhiyun IP="ip -netns testns" 1081*4882a593Smuzhiyun BRIDGE="bridge -netns testns" 1082*4882a593Smuzhiyun brdev="test-br0" 1083*4882a593Smuzhiyun vxlandev="vxlan10" 1084*4882a593Smuzhiyun test_mac=de:ad:be:ef:13:37 1085*4882a593Smuzhiyun localip="10.0.2.2" 1086*4882a593Smuzhiyun dstip="10.0.2.3" 1087*4882a593Smuzhiyun local ret=0 1088*4882a593Smuzhiyun 1089*4882a593Smuzhiyun bridge fdb help 2>&1 |grep -q 'bridge fdb get' 1090*4882a593Smuzhiyun if [ $? -ne 0 ];then 1091*4882a593Smuzhiyun echo "SKIP: fdb get tests: iproute2 too old" 1092*4882a593Smuzhiyun return $ksft_skip 1093*4882a593Smuzhiyun fi 1094*4882a593Smuzhiyun 1095*4882a593Smuzhiyun ip netns add testns 1096*4882a593Smuzhiyun if [ $? -ne 0 ]; then 1097*4882a593Smuzhiyun echo "SKIP fdb get tests: cannot add net namespace $testns" 1098*4882a593Smuzhiyun return $ksft_skip 1099*4882a593Smuzhiyun fi 1100*4882a593Smuzhiyun 1101*4882a593Smuzhiyun $IP link add "$vxlandev" type vxlan id 10 local $localip \ 1102*4882a593Smuzhiyun dstport 4789 2>/dev/null 1103*4882a593Smuzhiyun check_err $? 1104*4882a593Smuzhiyun $IP link add name "$brdev" type bridge &>/dev/null 1105*4882a593Smuzhiyun check_err $? 1106*4882a593Smuzhiyun $IP link set dev "$vxlandev" master "$brdev" &>/dev/null 1107*4882a593Smuzhiyun check_err $? 1108*4882a593Smuzhiyun $BRIDGE fdb add $test_mac dev "$vxlandev" master &>/dev/null 1109*4882a593Smuzhiyun check_err $? 1110*4882a593Smuzhiyun $BRIDGE fdb add $test_mac dev "$vxlandev" dst $dstip self &>/dev/null 1111*4882a593Smuzhiyun check_err $? 1112*4882a593Smuzhiyun 1113*4882a593Smuzhiyun $BRIDGE fdb get $test_mac brport "$vxlandev" 2>/dev/null | grep -q "dev $vxlandev master $brdev" 1114*4882a593Smuzhiyun check_err $? 1115*4882a593Smuzhiyun $BRIDGE fdb get $test_mac br "$brdev" 2>/dev/null | grep -q "dev $vxlandev master $brdev" 1116*4882a593Smuzhiyun check_err $? 1117*4882a593Smuzhiyun $BRIDGE fdb get $test_mac dev "$vxlandev" self 2>/dev/null | grep -q "dev $vxlandev dst $dstip" 1118*4882a593Smuzhiyun check_err $? 1119*4882a593Smuzhiyun 1120*4882a593Smuzhiyun ip netns del testns &>/dev/null 1121*4882a593Smuzhiyun 1122*4882a593Smuzhiyun if [ $ret -ne 0 ]; then 1123*4882a593Smuzhiyun echo "FAIL: bridge fdb get" 1124*4882a593Smuzhiyun return 1 1125*4882a593Smuzhiyun fi 1126*4882a593Smuzhiyun 1127*4882a593Smuzhiyun echo "PASS: bridge fdb get" 1128*4882a593Smuzhiyun} 1129*4882a593Smuzhiyun 1130*4882a593Smuzhiyunkci_test_neigh_get() 1131*4882a593Smuzhiyun{ 1132*4882a593Smuzhiyun dstmac=de:ad:be:ef:13:37 1133*4882a593Smuzhiyun dstip=10.0.2.4 1134*4882a593Smuzhiyun dstip6=dead::2 1135*4882a593Smuzhiyun local ret=0 1136*4882a593Smuzhiyun 1137*4882a593Smuzhiyun ip neigh help 2>&1 |grep -q 'ip neigh get' 1138*4882a593Smuzhiyun if [ $? -ne 0 ];then 1139*4882a593Smuzhiyun echo "SKIP: fdb get tests: iproute2 too old" 1140*4882a593Smuzhiyun return $ksft_skip 1141*4882a593Smuzhiyun fi 1142*4882a593Smuzhiyun 1143*4882a593Smuzhiyun # ipv4 1144*4882a593Smuzhiyun ip neigh add $dstip lladdr $dstmac dev "$devdummy" > /dev/null 1145*4882a593Smuzhiyun check_err $? 1146*4882a593Smuzhiyun ip neigh get $dstip dev "$devdummy" 2> /dev/null | grep -q "$dstmac" 1147*4882a593Smuzhiyun check_err $? 1148*4882a593Smuzhiyun ip neigh del $dstip lladdr $dstmac dev "$devdummy" > /dev/null 1149*4882a593Smuzhiyun check_err $? 1150*4882a593Smuzhiyun 1151*4882a593Smuzhiyun # ipv4 proxy 1152*4882a593Smuzhiyun ip neigh add proxy $dstip dev "$devdummy" > /dev/null 1153*4882a593Smuzhiyun check_err $? 1154*4882a593Smuzhiyun ip neigh get proxy $dstip dev "$devdummy" 2>/dev/null | grep -q "$dstip" 1155*4882a593Smuzhiyun check_err $? 1156*4882a593Smuzhiyun ip neigh del proxy $dstip dev "$devdummy" > /dev/null 1157*4882a593Smuzhiyun check_err $? 1158*4882a593Smuzhiyun 1159*4882a593Smuzhiyun # ipv6 1160*4882a593Smuzhiyun ip neigh add $dstip6 lladdr $dstmac dev "$devdummy" > /dev/null 1161*4882a593Smuzhiyun check_err $? 1162*4882a593Smuzhiyun ip neigh get $dstip6 dev "$devdummy" 2> /dev/null | grep -q "$dstmac" 1163*4882a593Smuzhiyun check_err $? 1164*4882a593Smuzhiyun ip neigh del $dstip6 lladdr $dstmac dev "$devdummy" > /dev/null 1165*4882a593Smuzhiyun check_err $? 1166*4882a593Smuzhiyun 1167*4882a593Smuzhiyun # ipv6 proxy 1168*4882a593Smuzhiyun ip neigh add proxy $dstip6 dev "$devdummy" > /dev/null 1169*4882a593Smuzhiyun check_err $? 1170*4882a593Smuzhiyun ip neigh get proxy $dstip6 dev "$devdummy" 2>/dev/null | grep -q "$dstip6" 1171*4882a593Smuzhiyun check_err $? 1172*4882a593Smuzhiyun ip neigh del proxy $dstip6 dev "$devdummy" > /dev/null 1173*4882a593Smuzhiyun check_err $? 1174*4882a593Smuzhiyun 1175*4882a593Smuzhiyun if [ $ret -ne 0 ];then 1176*4882a593Smuzhiyun echo "FAIL: neigh get" 1177*4882a593Smuzhiyun return 1 1178*4882a593Smuzhiyun fi 1179*4882a593Smuzhiyun 1180*4882a593Smuzhiyun echo "PASS: neigh get" 1181*4882a593Smuzhiyun} 1182*4882a593Smuzhiyun 1183*4882a593Smuzhiyunkci_test_bridge_parent_id() 1184*4882a593Smuzhiyun{ 1185*4882a593Smuzhiyun local ret=0 1186*4882a593Smuzhiyun sysfsnet=/sys/bus/netdevsim/devices/netdevsim 1187*4882a593Smuzhiyun probed=false 1188*4882a593Smuzhiyun 1189*4882a593Smuzhiyun if [ ! -w /sys/bus/netdevsim/new_device ] ; then 1190*4882a593Smuzhiyun modprobe -q netdevsim 1191*4882a593Smuzhiyun check_err $? 1192*4882a593Smuzhiyun if [ $ret -ne 0 ]; then 1193*4882a593Smuzhiyun echo "SKIP: bridge_parent_id can't load netdevsim" 1194*4882a593Smuzhiyun return $ksft_skip 1195*4882a593Smuzhiyun fi 1196*4882a593Smuzhiyun probed=true 1197*4882a593Smuzhiyun fi 1198*4882a593Smuzhiyun 1199*4882a593Smuzhiyun echo "10 1" > /sys/bus/netdevsim/new_device 1200*4882a593Smuzhiyun while [ ! -d ${sysfsnet}10 ] ; do :; done 1201*4882a593Smuzhiyun echo "20 1" > /sys/bus/netdevsim/new_device 1202*4882a593Smuzhiyun while [ ! -d ${sysfsnet}20 ] ; do :; done 1203*4882a593Smuzhiyun udevadm settle 1204*4882a593Smuzhiyun dev10=`ls ${sysfsnet}10/net/` 1205*4882a593Smuzhiyun dev20=`ls ${sysfsnet}20/net/` 1206*4882a593Smuzhiyun 1207*4882a593Smuzhiyun ip link add name test-bond0 type bond mode 802.3ad 1208*4882a593Smuzhiyun ip link set dev $dev10 master test-bond0 1209*4882a593Smuzhiyun ip link set dev $dev20 master test-bond0 1210*4882a593Smuzhiyun ip link add name test-br0 type bridge 1211*4882a593Smuzhiyun ip link set dev test-bond0 master test-br0 1212*4882a593Smuzhiyun check_err $? 1213*4882a593Smuzhiyun 1214*4882a593Smuzhiyun # clean up any leftovers 1215*4882a593Smuzhiyun ip link del dev test-br0 1216*4882a593Smuzhiyun ip link del dev test-bond0 1217*4882a593Smuzhiyun echo 20 > /sys/bus/netdevsim/del_device 1218*4882a593Smuzhiyun echo 10 > /sys/bus/netdevsim/del_device 1219*4882a593Smuzhiyun $probed && rmmod netdevsim 1220*4882a593Smuzhiyun 1221*4882a593Smuzhiyun if [ $ret -ne 0 ]; then 1222*4882a593Smuzhiyun echo "FAIL: bridge_parent_id" 1223*4882a593Smuzhiyun return 1 1224*4882a593Smuzhiyun fi 1225*4882a593Smuzhiyun echo "PASS: bridge_parent_id" 1226*4882a593Smuzhiyun} 1227*4882a593Smuzhiyun 1228*4882a593Smuzhiyunkci_test_rtnl() 1229*4882a593Smuzhiyun{ 1230*4882a593Smuzhiyun local ret=0 1231*4882a593Smuzhiyun kci_add_dummy 1232*4882a593Smuzhiyun if [ $ret -ne 0 ];then 1233*4882a593Smuzhiyun echo "FAIL: cannot add dummy interface" 1234*4882a593Smuzhiyun return 1 1235*4882a593Smuzhiyun fi 1236*4882a593Smuzhiyun 1237*4882a593Smuzhiyun kci_test_polrouting 1238*4882a593Smuzhiyun check_err $? 1239*4882a593Smuzhiyun kci_test_route_get 1240*4882a593Smuzhiyun check_err $? 1241*4882a593Smuzhiyun kci_test_addrlft 1242*4882a593Smuzhiyun check_err $? 1243*4882a593Smuzhiyun kci_test_promote_secondaries 1244*4882a593Smuzhiyun check_err $? 1245*4882a593Smuzhiyun kci_test_tc 1246*4882a593Smuzhiyun check_err $? 1247*4882a593Smuzhiyun kci_test_gre 1248*4882a593Smuzhiyun check_err $? 1249*4882a593Smuzhiyun kci_test_gretap 1250*4882a593Smuzhiyun check_err $? 1251*4882a593Smuzhiyun kci_test_ip6gretap 1252*4882a593Smuzhiyun check_err $? 1253*4882a593Smuzhiyun kci_test_erspan 1254*4882a593Smuzhiyun check_err $? 1255*4882a593Smuzhiyun kci_test_ip6erspan 1256*4882a593Smuzhiyun check_err $? 1257*4882a593Smuzhiyun kci_test_bridge 1258*4882a593Smuzhiyun check_err $? 1259*4882a593Smuzhiyun kci_test_addrlabel 1260*4882a593Smuzhiyun check_err $? 1261*4882a593Smuzhiyun kci_test_ifalias 1262*4882a593Smuzhiyun check_err $? 1263*4882a593Smuzhiyun kci_test_vrf 1264*4882a593Smuzhiyun check_err $? 1265*4882a593Smuzhiyun kci_test_encap 1266*4882a593Smuzhiyun check_err $? 1267*4882a593Smuzhiyun kci_test_macsec 1268*4882a593Smuzhiyun check_err $? 1269*4882a593Smuzhiyun kci_test_ipsec 1270*4882a593Smuzhiyun check_err $? 1271*4882a593Smuzhiyun kci_test_ipsec_offload 1272*4882a593Smuzhiyun check_err $? 1273*4882a593Smuzhiyun kci_test_fdb_get 1274*4882a593Smuzhiyun check_err $? 1275*4882a593Smuzhiyun kci_test_neigh_get 1276*4882a593Smuzhiyun check_err $? 1277*4882a593Smuzhiyun kci_test_bridge_parent_id 1278*4882a593Smuzhiyun check_err $? 1279*4882a593Smuzhiyun 1280*4882a593Smuzhiyun kci_del_dummy 1281*4882a593Smuzhiyun return $ret 1282*4882a593Smuzhiyun} 1283*4882a593Smuzhiyun 1284*4882a593Smuzhiyun#check for needed privileges 1285*4882a593Smuzhiyunif [ "$(id -u)" -ne 0 ];then 1286*4882a593Smuzhiyun echo "SKIP: Need root privileges" 1287*4882a593Smuzhiyun exit $ksft_skip 1288*4882a593Smuzhiyunfi 1289*4882a593Smuzhiyun 1290*4882a593Smuzhiyunfor x in ip tc;do 1291*4882a593Smuzhiyun $x -Version 2>/dev/null >/dev/null 1292*4882a593Smuzhiyun if [ $? -ne 0 ];then 1293*4882a593Smuzhiyun echo "SKIP: Could not run test without the $x tool" 1294*4882a593Smuzhiyun exit $ksft_skip 1295*4882a593Smuzhiyun fi 1296*4882a593Smuzhiyundone 1297*4882a593Smuzhiyun 1298*4882a593Smuzhiyunkci_test_rtnl 1299*4882a593Smuzhiyun 1300*4882a593Smuzhiyunexit $? 1301