1333 lines · bash
1#!/bin/bash2#3# This test is for checking rtnetlink callpaths, and get as much coverage as possible.4#5# set -e6 7ALL_TESTS="8 kci_test_polrouting9 kci_test_route_get10 kci_test_addrlft11 kci_test_promote_secondaries12 kci_test_tc13 kci_test_gre14 kci_test_gretap15 kci_test_ip6gretap16 kci_test_erspan17 kci_test_ip6erspan18 kci_test_bridge19 kci_test_addrlabel20 kci_test_ifalias21 kci_test_vrf22 kci_test_encap23 kci_test_macsec24 kci_test_macsec_offload25 kci_test_ipsec26 kci_test_ipsec_offload27 kci_test_fdb_get28 kci_test_neigh_get29 kci_test_bridge_parent_id30 kci_test_address_proto31 kci_test_enslave_bonding32"33 34devdummy="test-dummy0"35VERBOSE=036PAUSE=no37PAUSE_ON_FAIL=no38 39source lib.sh40 41# set global exit status, but never reset nonzero one.42check_err()43{44 if [ $ret -eq 0 ]; then45 ret=$146 fi47}48 49# same but inverted -- used when command must fail for test to pass50check_fail()51{52 if [ $1 -eq 0 ]; then53 ret=154 fi55}56 57run_cmd_common()58{59 local cmd="$*"60 local out61 if [ "$VERBOSE" = "1" ]; then62 echo "COMMAND: ${cmd}"63 fi64 out=$($cmd 2>&1)65 rc=$?66 if [ "$VERBOSE" = "1" -a -n "$out" ]; then67 echo " $out"68 fi69 return $rc70}71 72run_cmd() {73 run_cmd_common "$@"74 rc=$?75 check_err $rc76 return $rc77}78run_cmd_fail()79{80 run_cmd_common "$@"81 rc=$?82 check_fail $rc83 return $rc84}85 86run_cmd_grep_common()87{88 local find="$1"; shift89 local cmd="$*"90 local out91 if [ "$VERBOSE" = "1" ]; then92 echo "COMMAND: ${cmd} 2>&1 | grep -q '${find}'"93 fi94 out=$($cmd 2>&1 | grep -q "${find}" 2>&1)95 return $?96}97 98run_cmd_grep() {99 run_cmd_grep_common "$@"100 rc=$?101 check_err $rc102 return $rc103}104 105run_cmd_grep_fail()106{107 run_cmd_grep_common "$@"108 rc=$?109 check_fail $rc110 return $rc111}112 113end_test()114{115 echo "$*"116 [ "${VERBOSE}" = "1" ] && echo117 118 if [[ $ret -ne 0 ]] && [[ "${PAUSE_ON_FAIL}" = "yes" ]]; then119 echo "Hit enter to continue"120 read a121 fi;122 123 if [ "${PAUSE}" = "yes" ]; then124 echo "Hit enter to continue"125 read a126 fi127 128}129 130 131kci_add_dummy()132{133 run_cmd ip link add name "$devdummy" type dummy134 run_cmd ip link set "$devdummy" up135}136 137kci_del_dummy()138{139 run_cmd ip link del dev "$devdummy"140}141 142kci_test_netconf()143{144 dev="$1"145 r=$ret146 run_cmd ip netconf show dev "$dev"147 for f in 4 6; do148 run_cmd ip -$f netconf show dev "$dev"149 done150 151 if [ $ret -ne 0 ] ;then152 end_test "FAIL: ip netconf show $dev"153 test $r -eq 0 && ret=0154 return 1155 fi156}157 158# add a bridge with vlans on top159kci_test_bridge()160{161 devbr="test-br0"162 vlandev="testbr-vlan1"163 164 local ret=0165 run_cmd ip link add name "$devbr" type bridge166 run_cmd ip link set dev "$devdummy" master "$devbr"167 run_cmd ip link set "$devbr" up168 run_cmd ip link add link "$devbr" name "$vlandev" type vlan id 1169 run_cmd ip addr add dev "$vlandev" 10.200.7.23/30170 run_cmd ip -6 addr add dev "$vlandev" dead:42::1234/64171 run_cmd ip -d link172 run_cmd ip r s t all173 174 for name in "$devbr" "$vlandev" "$devdummy" ; do175 kci_test_netconf "$name"176 done177 run_cmd ip -6 addr del dev "$vlandev" dead:42::1234/64178 run_cmd ip link del dev "$vlandev"179 run_cmd ip link del dev "$devbr"180 181 if [ $ret -ne 0 ];then182 end_test "FAIL: bridge setup"183 return 1184 fi185 end_test "PASS: bridge setup"186 187}188 189kci_test_gre()190{191 gredev=neta192 rem=10.42.42.1193 loc=10.0.0.1194 195 local ret=0196 run_cmd ip tunnel add $gredev mode gre remote $rem local $loc ttl 1197 run_cmd ip link set $gredev up198 run_cmd ip addr add 10.23.7.10 dev $gredev199 run_cmd ip route add 10.23.8.0/30 dev $gredev200 run_cmd ip addr add dev "$devdummy" 10.23.7.11/24201 run_cmd ip link202 run_cmd ip addr203 204 kci_test_netconf "$gredev"205 run_cmd ip addr del dev "$devdummy" 10.23.7.11/24206 run_cmd ip link del $gredev207 208 if [ $ret -ne 0 ];then209 end_test "FAIL: gre tunnel endpoint"210 return 1211 fi212 end_test "PASS: gre tunnel endpoint"213}214 215# tc uses rtnetlink too, for full tc testing216# please see tools/testing/selftests/tc-testing.217kci_test_tc()218{219 dev=lo220 local ret=0221 222 run_cmd tc qdisc add dev "$dev" root handle 1: htb223 run_cmd tc class add dev "$dev" parent 1: classid 1:10 htb rate 1mbit224 run_cmd tc filter add dev "$dev" parent 1:0 prio 5 handle ffe: protocol ip u32 divisor 256225 run_cmd tc filter add dev "$dev" parent 1:0 prio 5 handle ffd: protocol ip u32 divisor 256226 run_cmd tc filter add dev "$dev" parent 1:0 prio 5 handle ffc: protocol ip u32 divisor 256227 run_cmd 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:10228 run_cmd 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:10229 run_cmd tc filter show dev "$dev" parent 1:0230 run_cmd tc filter del dev "$dev" protocol ip parent 1: prio 5 handle ffe:2:3 u32231 run_cmd tc filter show dev "$dev" parent 1:0232 run_cmd tc qdisc del dev "$dev" root handle 1: htb233 234 if [ $ret -ne 0 ];then235 end_test "FAIL: tc htb hierarchy"236 return 1237 fi238 end_test "PASS: tc htb hierarchy"239 240}241 242kci_test_polrouting()243{244 local ret=0245 run_cmd ip rule add fwmark 1 lookup 100246 run_cmd ip route add local 0.0.0.0/0 dev lo table 100247 run_cmd ip r s t all248 run_cmd ip rule del fwmark 1 lookup 100249 run_cmd ip route del local 0.0.0.0/0 dev lo table 100250 251 if [ $ret -ne 0 ];then252 end_test "FAIL: policy route test"253 return 1254 fi255 end_test "PASS: policy routing"256}257 258kci_test_route_get()259{260 local hash_policy=$(sysctl -n net.ipv4.fib_multipath_hash_policy)261 262 local ret=0263 run_cmd ip route get 127.0.0.1264 run_cmd ip route get 127.0.0.1 dev "$devdummy"265 run_cmd ip route get ::1266 run_cmd ip route get fe80::1 dev "$devdummy"267 run_cmd ip route get 127.0.0.1 from 127.0.0.1 oif lo tos 0x10 mark 0x1268 run_cmd ip route get ::1 from ::1 iif lo oif lo tos 0x10 mark 0x1269 run_cmd ip addr add dev "$devdummy" 10.23.7.11/24270 run_cmd ip route get 10.23.7.11 from 10.23.7.12 iif "$devdummy"271 run_cmd ip route add 10.23.8.0/24 \272 nexthop via 10.23.7.13 dev "$devdummy" \273 nexthop via 10.23.7.14 dev "$devdummy"274 275 sysctl -wq net.ipv4.fib_multipath_hash_policy=0276 run_cmd ip route get 10.23.8.11277 sysctl -wq net.ipv4.fib_multipath_hash_policy=1278 run_cmd ip route get 10.23.8.11279 sysctl -wq net.ipv4.fib_multipath_hash_policy="$hash_policy"280 run_cmd ip route del 10.23.8.0/24281 run_cmd ip addr del dev "$devdummy" 10.23.7.11/24282 283 284 if [ $ret -ne 0 ];then285 end_test "FAIL: route get"286 return 1287 fi288 289 end_test "PASS: route get"290}291 292kci_test_addrlft()293{294 for i in $(seq 10 100) ;do295 lft=$(((RANDOM%3) + 1))296 run_cmd ip addr add 10.23.11.$i/32 dev "$devdummy" preferred_lft $lft valid_lft $((lft+1))297 done298 299 sleep 5300 run_cmd_grep_fail "10.23.11." ip addr show dev "$devdummy"301 if [ $? -eq 0 ]; then302 check_err 1303 end_test "FAIL: preferred_lft addresses remaining"304 return305 fi306 307 end_test "PASS: preferred_lft addresses have expired"308}309 310kci_test_promote_secondaries()311{312 promote=$(sysctl -n net.ipv4.conf.$devdummy.promote_secondaries)313 314 sysctl -q net.ipv4.conf.$devdummy.promote_secondaries=1315 316 for i in $(seq 2 254);do317 IP="10.23.11.$i"318 ip -f inet addr add $IP/16 brd + dev "$devdummy"319 ifconfig "$devdummy" $IP netmask 255.255.0.0320 done321 322 ip addr flush dev "$devdummy"323 324 [ $promote -eq 0 ] && sysctl -q net.ipv4.conf.$devdummy.promote_secondaries=0325 326 end_test "PASS: promote_secondaries complete"327}328 329kci_test_addrlabel()330{331 local ret=0332 run_cmd ip addrlabel add prefix dead::/64 dev lo label 1333 run_cmd_grep "prefix dead::/64 dev lo label 1" ip addrlabel list334 run_cmd ip addrlabel del prefix dead::/64 dev lo label 1335 run_cmd ip addrlabel add prefix dead::/64 label 1336 run_cmd ip addrlabel del prefix dead::/64 label 1337 338 # concurrent add/delete339 for i in $(seq 1 1000); do340 ip addrlabel add prefix 1c3::/64 label 12345 2>/dev/null341 done &342 343 for i in $(seq 1 1000); do344 ip addrlabel del prefix 1c3::/64 label 12345 2>/dev/null345 done346 347 wait348 349 ip addrlabel del prefix 1c3::/64 label 12345 2>/dev/null350 351 if [ $ret -ne 0 ];then352 end_test "FAIL: ipv6 addrlabel"353 return 1354 fi355 356 end_test "PASS: ipv6 addrlabel"357}358 359kci_test_ifalias()360{361 local ret=0362 namewant=$(uuidgen)363 syspathname="/sys/class/net/$devdummy/ifalias"364 run_cmd ip link set dev "$devdummy" alias "$namewant"365 366 if [ $ret -ne 0 ]; then367 end_test "FAIL: cannot set interface alias of $devdummy to $namewant"368 return 1369 fi370 run_cmd_grep "alias $namewant" ip link show "$devdummy"371 372 if [ -r "$syspathname" ] ; then373 read namehave < "$syspathname"374 if [ "$namewant" != "$namehave" ]; then375 end_test "FAIL: did set ifalias $namewant but got $namehave"376 return 1377 fi378 379 namewant=$(uuidgen)380 echo "$namewant" > "$syspathname"381 run_cmd_grep "alias $namewant" ip link show "$devdummy"382 383 # sysfs interface allows to delete alias again384 echo "" > "$syspathname"385 run_cmd_grep_fail "alias $namewant" ip link show "$devdummy"386 387 for i in $(seq 1 100); do388 uuidgen > "$syspathname" &389 done390 391 wait392 393 # re-add the alias -- kernel should free mem when dummy dev is removed394 run_cmd ip link set dev "$devdummy" alias "$namewant"395 396 fi397 398 if [ $ret -ne 0 ]; then399 end_test "FAIL: set interface alias $devdummy to $namewant"400 return 1401 fi402 403 end_test "PASS: set ifalias $namewant for $devdummy"404}405 406kci_test_vrf()407{408 vrfname="test-vrf"409 local ret=0410 run_cmd ip link show type vrf411 if [ $? -ne 0 ]; then412 end_test "SKIP: vrf: iproute2 too old"413 return $ksft_skip414 fi415 run_cmd ip link add "$vrfname" type vrf table 10416 if [ $ret -ne 0 ];then417 end_test "FAIL: can't add vrf interface, skipping test"418 return 0419 fi420 run_cmd_grep "$vrfname" ip -br link show type vrf421 if [ $ret -ne 0 ];then422 end_test "FAIL: created vrf device not found"423 return 1424 fi425 426 run_cmd ip link set dev "$vrfname" up427 run_cmd ip link set dev "$devdummy" master "$vrfname"428 run_cmd ip link del dev "$vrfname"429 430 if [ $ret -ne 0 ];then431 end_test "FAIL: vrf"432 return 1433 fi434 435 end_test "PASS: vrf"436}437 438kci_test_encap_vxlan()439{440 local ret=0441 vxlan="test-vxlan0"442 vlan="test-vlan0"443 run_cmd ip -netns "$testns" link add "$vxlan" type vxlan id 42 group 239.1.1.1 \444 dev "$devdummy" dstport 4789445 if [ $? -ne 0 ]; then446 end_test "FAIL: can't add vxlan interface, skipping test"447 return 0448 fi449 450 run_cmd ip -netns "$testns" addr add 10.2.11.49/24 dev "$vxlan"451 run_cmd ip -netns "$testns" link set up dev "$vxlan"452 run_cmd ip -netns "$testns" link add link "$vxlan" name "$vlan" type vlan id 1453 454 # changelink testcases455 run_cmd_fail ip -netns "$testns" link set dev "$vxlan" type vxlan vni 43456 run_cmd_fail ip -netns "$testns" link set dev "$vxlan" type vxlan group ffe5::5 dev "$devdummy"457 run_cmd_fail ip -netns "$testns" link set dev "$vxlan" type vxlan ttl inherit458 459 run_cmd ip -netns "$testns" link set dev "$vxlan" type vxlan ttl 64460 run_cmd ip -netns "$testns" link set dev "$vxlan" type vxlan nolearning461 462 run_cmd_fail ip -netns "$testns" link set dev "$vxlan" type vxlan proxy463 run_cmd_fail ip -netns "$testns" link set dev "$vxlan" type vxlan norsc464 run_cmd_fail ip -netns "$testns" link set dev "$vxlan" type vxlan l2miss465 run_cmd_fail ip -netns "$testns" link set dev "$vxlan" type vxlan l3miss466 run_cmd_fail ip -netns "$testns" link set dev "$vxlan" type vxlan external467 run_cmd_fail ip -netns "$testns" link set dev "$vxlan" type vxlan udpcsum468 run_cmd_fail ip -netns "$testns" link set dev "$vxlan" type vxlan udp6zerocsumtx469 run_cmd_fail ip -netns "$testns" link set dev "$vxlan" type vxlan udp6zerocsumrx470 run_cmd_fail ip -netns "$testns" link set dev "$vxlan" type vxlan remcsumtx471 run_cmd_fail ip -netns "$testns" link set dev "$vxlan" type vxlan remcsumrx472 run_cmd_fail ip -netns "$testns" link set dev "$vxlan" type vxlan gbp473 run_cmd_fail ip -netns "$testns" link set dev "$vxlan" type vxlan gpe474 run_cmd ip -netns "$testns" link del "$vxlan"475 476 if [ $ret -ne 0 ]; then477 end_test "FAIL: vxlan"478 return 1479 fi480 end_test "PASS: vxlan"481}482 483kci_test_encap_fou()484{485 local ret=0486 name="test-fou"487 run_cmd_grep 'Usage: ip fou' ip fou help488 if [ $? -ne 0 ];then489 end_test "SKIP: fou: iproute2 too old"490 return $ksft_skip491 fi492 493 if ! /sbin/modprobe -q -n fou; then494 end_test "SKIP: module fou is not found"495 return $ksft_skip496 fi497 /sbin/modprobe -q fou498 499 run_cmd ip -netns "$testns" fou add port 7777 ipproto 47500 if [ $? -ne 0 ];then501 end_test "FAIL: can't add fou port 7777, skipping test"502 return 1503 fi504 run_cmd ip -netns "$testns" fou add port 8888 ipproto 4505 run_cmd_fail ip -netns "$testns" fou del port 9999506 run_cmd ip -netns "$testns" fou del port 7777507 if [ $ret -ne 0 ]; then508 end_test "FAIL: fou"s509 return 1510 fi511 512 end_test "PASS: fou"513}514 515# test various encap methods, use netns to avoid unwanted interference516kci_test_encap()517{518 local ret=0519 setup_ns testns520 if [ $? -ne 0 ]; then521 end_test "SKIP encap tests: cannot add net namespace $testns"522 return $ksft_skip523 fi524 run_cmd ip -netns "$testns" link set lo up525 run_cmd ip -netns "$testns" link add name "$devdummy" type dummy526 run_cmd ip -netns "$testns" link set "$devdummy" up527 run_cmd kci_test_encap_vxlan528 run_cmd kci_test_encap_fou529 530 ip netns del "$testns"531 return $ret532}533 534kci_test_macsec()535{536 msname="test_macsec0"537 local ret=0538 run_cmd_grep "^Usage: ip macsec" ip macsec help539 if [ $? -ne 0 ]; then540 end_test "SKIP: macsec: iproute2 too old"541 return $ksft_skip542 fi543 run_cmd ip link add link "$devdummy" "$msname" type macsec port 42 encrypt on544 if [ $ret -ne 0 ];then545 end_test "FAIL: can't add macsec interface, skipping test"546 return 1547 fi548 run_cmd ip macsec add "$msname" tx sa 0 pn 1024 on key 01 12345678901234567890123456789012549 run_cmd ip macsec add "$msname" rx port 1234 address "1c:ed:de:ad:be:ef"550 run_cmd ip macsec add "$msname" rx port 1234 address "1c:ed:de:ad:be:ef" sa 0 pn 1 on key 00 0123456789abcdef0123456789abcdef551 run_cmd ip macsec show552 run_cmd ip link del dev "$msname"553 554 if [ $ret -ne 0 ];then555 end_test "FAIL: macsec"556 return 1557 fi558 559 end_test "PASS: macsec"560}561 562kci_test_macsec_offload()563{564 sysfsd=/sys/kernel/debug/netdevsim/netdevsim0/ports/0/565 sysfsnet=/sys/bus/netdevsim/devices/netdevsim0/net/566 probed=false567 local ret=0568 run_cmd_grep "^Usage: ip macsec" ip macsec help569 if [ $? -ne 0 ]; then570 end_test "SKIP: macsec: iproute2 too old"571 return $ksft_skip572 fi573 574 if ! mount | grep -q debugfs; then575 mount -t debugfs none /sys/kernel/debug/ &> /dev/null576 fi577 578 # setup netdevsim since dummydev doesn't have offload support579 if [ ! -w /sys/bus/netdevsim/new_device ] ; then580 run_cmd modprobe -q netdevsim581 582 if [ $ret -ne 0 ]; then583 end_test "SKIP: macsec_offload can't load netdevsim"584 return $ksft_skip585 fi586 probed=true587 fi588 589 echo "0" > /sys/bus/netdevsim/new_device590 while [ ! -d $sysfsnet ] ; do :; done591 udevadm settle592 dev=`ls $sysfsnet`593 594 ip link set $dev up595 if [ ! -d $sysfsd ] ; then596 end_test "FAIL: macsec_offload can't create device $dev"597 return 1598 fi599 run_cmd_grep 'macsec-hw-offload: on' ethtool -k $dev600 if [ $? -eq 1 ] ; then601 end_test "FAIL: macsec_offload netdevsim doesn't support MACsec offload"602 return 1603 fi604 run_cmd ip link add link $dev kci_macsec1 type macsec port 4 offload mac605 run_cmd ip link add link $dev kci_macsec2 type macsec address "aa:bb:cc:dd:ee:ff" port 5 offload mac606 run_cmd ip link add link $dev kci_macsec3 type macsec sci abbacdde01020304 offload mac607 run_cmd_fail ip link add link $dev kci_macsec4 type macsec port 8 offload mac608 609 msname=kci_macsec1610 run_cmd ip macsec add "$msname" tx sa 0 pn 1024 on key 01 12345678901234567890123456789012611 run_cmd ip macsec add "$msname" rx port 1234 address "1c:ed:de:ad:be:ef"612 run_cmd ip macsec add "$msname" rx port 1234 address "1c:ed:de:ad:be:ef" sa 0 pn 1 on \613 key 00 0123456789abcdef0123456789abcdef614 run_cmd_fail ip macsec add "$msname" rx port 1235 address "1c:ed:de:ad:be:ef"615 # clean up any leftovers616 for msdev in kci_macsec{1,2,3,4} ; do617 ip link del $msdev 2> /dev/null618 done619 echo 0 > /sys/bus/netdevsim/del_device620 $probed && rmmod netdevsim621 622 if [ $ret -ne 0 ]; then623 end_test "FAIL: macsec_offload"624 return 1625 fi626 end_test "PASS: macsec_offload"627}628 629#-------------------------------------------------------------------630# Example commands631# ip x s add proto esp src 14.0.0.52 dst 14.0.0.70 \632# spi 0x07 mode transport reqid 0x07 replay-window 32 \633# aead 'rfc4106(gcm(aes))' 1234567890123456dcba 128 \634# sel src 14.0.0.52/24 dst 14.0.0.70/24635# ip x p add dir out src 14.0.0.52/24 dst 14.0.0.70/24 \636# tmpl proto esp src 14.0.0.52 dst 14.0.0.70 \637# spi 0x07 mode transport reqid 0x07638#639# Subcommands not tested640# ip x s update641# ip x s allocspi642# ip x s deleteall643# ip x p update644# ip x p deleteall645# ip x p set646#-------------------------------------------------------------------647kci_test_ipsec()648{649 local ret=0650 algo="aead rfc4106(gcm(aes)) 0x3132333435363738393031323334353664636261 128"651 srcip=192.168.123.1652 dstip=192.168.123.2653 spi=7654 655 ip addr add $srcip dev $devdummy656 657 # flush to be sure there's nothing configured658 run_cmd ip x s flush ; ip x p flush659 660 # start the monitor in the background661 tmpfile=`mktemp /var/run/ipsectestXXX`662 mpid=`(ip x m > $tmpfile & echo $!) 2>/dev/null`663 sleep 0.2664 665 ipsecid="proto esp src $srcip dst $dstip spi 0x07"666 run_cmd ip x s add $ipsecid \667 mode transport reqid 0x07 replay-window 32 \668 $algo sel src $srcip/24 dst $dstip/24669 670 671 lines=`ip x s list | grep $srcip | grep $dstip | wc -l`672 run_cmd test $lines -eq 2673 run_cmd_grep "SAD count 1" ip x s count674 675 lines=`ip x s get $ipsecid | grep $srcip | grep $dstip | wc -l`676 run_cmd test $lines -eq 2677 run_cmd ip x s delete $ipsecid678 679 lines=`ip x s list | wc -l`680 run_cmd test $lines -eq 0681 682 ipsecsel="dir out src $srcip/24 dst $dstip/24"683 run_cmd ip x p add $ipsecsel \684 tmpl proto esp src $srcip dst $dstip \685 spi 0x07 mode transport reqid 0x07686 687 688 lines=`ip x p list | grep $srcip | grep $dstip | wc -l`689 run_cmd test $lines -eq 2690 691 run_cmd_grep "SPD IN 0 OUT 1 FWD 0" ip x p count692 693 lines=`ip x p get $ipsecsel | grep $srcip | grep $dstip | wc -l`694 run_cmd test $lines -eq 2695 696 run_cmd ip x p delete $ipsecsel697 698 lines=`ip x p list | wc -l`699 run_cmd test $lines -eq 0700 701 # check the monitor results702 kill $mpid703 lines=`wc -l $tmpfile | cut "-d " -f1`704 run_cmd test $lines -eq 20705 rm -rf $tmpfile706 707 # clean up any leftovers708 run_cmd ip x s flush709 run_cmd ip x p flush710 ip addr del $srcip/32 dev $devdummy711 712 if [ $ret -ne 0 ]; then713 end_test "FAIL: ipsec"714 return 1715 fi716 end_test "PASS: ipsec"717}718 719#-------------------------------------------------------------------720# Example commands721# ip x s add proto esp src 14.0.0.52 dst 14.0.0.70 \722# spi 0x07 mode transport reqid 0x07 replay-window 32 \723# aead 'rfc4106(gcm(aes))' 1234567890123456dcba 128 \724# sel src 14.0.0.52/24 dst 14.0.0.70/24725# offload dev sim1 dir out726# ip x p add dir out src 14.0.0.52/24 dst 14.0.0.70/24 \727# tmpl proto esp src 14.0.0.52 dst 14.0.0.70 \728# spi 0x07 mode transport reqid 0x07729#730#-------------------------------------------------------------------731kci_test_ipsec_offload()732{733 local ret=0734 algo="aead rfc4106(gcm(aes)) 0x3132333435363738393031323334353664636261 128"735 srcip=192.168.123.3736 dstip=192.168.123.4737 sysfsd=/sys/kernel/debug/netdevsim/netdevsim0/ports/0/738 sysfsf=$sysfsd/ipsec739 sysfsnet=/sys/bus/netdevsim/devices/netdevsim0/net/740 probed=false741 742 if ! mount | grep -q debugfs; then743 mount -t debugfs none /sys/kernel/debug/ &> /dev/null744 fi745 746 # setup netdevsim since dummydev doesn't have offload support747 if [ ! -w /sys/bus/netdevsim/new_device ] ; then748 run_cmd modprobe -q netdevsim749 if [ $ret -ne 0 ]; then750 end_test "SKIP: ipsec_offload can't load netdevsim"751 return $ksft_skip752 fi753 probed=true754 fi755 756 echo "0" > /sys/bus/netdevsim/new_device757 while [ ! -d $sysfsnet ] ; do :; done758 udevadm settle759 dev=`ls $sysfsnet`760 761 ip addr add $srcip dev $dev762 ip link set $dev up763 if [ ! -d $sysfsd ] ; then764 end_test "FAIL: ipsec_offload can't create device $dev"765 return 1766 fi767 if [ ! -f $sysfsf ] ; then768 end_test "FAIL: ipsec_offload netdevsim doesn't support IPsec offload"769 return 1770 fi771 772 # flush to be sure there's nothing configured773 ip x s flush ; ip x p flush774 775 # create offloaded SAs, both in and out776 run_cmd ip x p add dir out src $srcip/24 dst $dstip/24 \777 tmpl proto esp src $srcip dst $dstip spi 9 \778 mode transport reqid 42779 780 run_cmd ip x p add dir in src $dstip/24 dst $srcip/24 \781 tmpl proto esp src $dstip dst $srcip spi 9 \782 mode transport reqid 42783 784 run_cmd ip x s add proto esp src $srcip dst $dstip spi 9 \785 mode transport reqid 42 $algo sel src $srcip/24 dst $dstip/24 \786 offload dev $dev dir out787 788 run_cmd ip x s add proto esp src $dstip dst $srcip spi 9 \789 mode transport reqid 42 $algo sel src $dstip/24 dst $srcip/24 \790 offload dev $dev dir in791 792 if [ $ret -ne 0 ]; then793 end_test "FAIL: ipsec_offload can't create SA"794 return 1795 fi796 797 # does offload show up in ip output798 lines=`ip x s list | grep -c "crypto offload parameters: dev $dev dir"`799 if [ $lines -ne 2 ] ; then800 check_err 1801 end_test "FAIL: ipsec_offload SA offload missing from list output"802 fi803 804 # we didn't create a peer, make sure we can Tx805 ip neigh add $dstip dev $dev lladdr 00:11:22:33:44:55806 # use ping to exercise the Tx path807 ping -I $dev -c 3 -W 1 -i 0 $dstip >/dev/null808 809 # does driver have correct offload info810 run_cmd diff $sysfsf - << EOF811SA count=2 tx=3812sa[0] tx ipaddr=0x00000000 00000000 00000000 00000000813sa[0] spi=0x00000009 proto=0x32 salt=0x61626364 crypt=1814sa[0] key=0x34333231 38373635 32313039 36353433815sa[1] rx ipaddr=0x00000000 00000000 00000000 037ba8c0816sa[1] spi=0x00000009 proto=0x32 salt=0x61626364 crypt=1817sa[1] key=0x34333231 38373635 32313039 36353433818EOF819 if [ $? -ne 0 ] ; then820 end_test "FAIL: ipsec_offload incorrect driver data"821 check_err 1822 fi823 824 # does offload get removed from driver825 ip x s flush826 ip x p flush827 lines=`grep -c "SA count=0" $sysfsf`828 if [ $lines -ne 1 ] ; then829 check_err 1830 end_test "FAIL: ipsec_offload SA not removed from driver"831 fi832 833 # clean up any leftovers834 echo 0 > /sys/bus/netdevsim/del_device835 $probed && rmmod netdevsim836 837 if [ $ret -ne 0 ]; then838 end_test "FAIL: ipsec_offload"839 return 1840 fi841 end_test "PASS: ipsec_offload"842}843 844kci_test_gretap()845{846 DEV_NS=gretap00847 local ret=0848 849 setup_ns testns850 if [ $? -ne 0 ]; then851 end_test "SKIP gretap tests: cannot add net namespace $testns"852 return $ksft_skip853 fi854 855 run_cmd_grep "^Usage:" ip link help gretap856 if [ $? -ne 0 ];then857 end_test "SKIP: gretap: iproute2 too old"858 ip netns del "$testns"859 return $ksft_skip860 fi861 862 # test native tunnel863 run_cmd ip -netns "$testns" link add dev "$DEV_NS" type gretap seq \864 key 102 local 172.16.1.100 remote 172.16.1.200865 866 867 run_cmd ip -netns "$testns" addr add dev "$DEV_NS" 10.1.1.100/24868 run_cmd ip -netns "$testns" link set dev $DEV_NS up869 run_cmd ip -netns "$testns" link del "$DEV_NS"870 871 # test external mode872 run_cmd ip -netns "$testns" link add dev "$DEV_NS" type gretap external873 run_cmd ip -netns "$testns" link del "$DEV_NS"874 875 if [ $ret -ne 0 ]; then876 end_test "FAIL: gretap"877 ip netns del "$testns"878 return 1879 fi880 end_test "PASS: gretap"881 882 ip netns del "$testns"883}884 885kci_test_ip6gretap()886{887 DEV_NS=ip6gretap00888 local ret=0889 890 setup_ns testns891 if [ $? -ne 0 ]; then892 end_test "SKIP ip6gretap tests: cannot add net namespace $testns"893 return $ksft_skip894 fi895 896 run_cmd_grep "^Usage:" ip link help ip6gretap897 if [ $? -ne 0 ];then898 end_test "SKIP: ip6gretap: iproute2 too old"899 ip netns del "$testns"900 return $ksft_skip901 fi902 903 # test native tunnel904 run_cmd ip -netns "$testns" link add dev "$DEV_NS" type ip6gretap seq \905 key 102 local fc00:100::1 remote fc00:100::2906 907 908 run_cmd ip -netns "$testns" addr add dev "$DEV_NS" fc00:200::1/96909 run_cmd ip -netns "$testns" link set dev $DEV_NS up910 run_cmd ip -netns "$testns" link del "$DEV_NS"911 912 # test external mode913 run_cmd ip -netns "$testns" link add dev "$DEV_NS" type ip6gretap external914 run_cmd ip -netns "$testns" link del "$DEV_NS"915 916 if [ $ret -ne 0 ]; then917 end_test "FAIL: ip6gretap"918 ip netns del "$testns"919 return 1920 fi921 end_test "PASS: ip6gretap"922 923 ip netns del "$testns"924}925 926kci_test_erspan()927{928 DEV_NS=erspan00929 local ret=0930 run_cmd_grep "^Usage:" ip link help erspan931 if [ $? -ne 0 ];then932 end_test "SKIP: erspan: iproute2 too old"933 return $ksft_skip934 fi935 setup_ns testns936 if [ $? -ne 0 ]; then937 end_test "SKIP erspan tests: cannot add net namespace $testns"938 return $ksft_skip939 fi940 941 # test native tunnel erspan v1942 run_cmd ip -netns "$testns" link add dev "$DEV_NS" type erspan seq \943 key 102 local 172.16.1.100 remote 172.16.1.200 \944 erspan_ver 1 erspan 488945 946 947 run_cmd ip -netns "$testns" addr add dev "$DEV_NS" 10.1.1.100/24948 run_cmd ip -netns "$testns" link set dev $DEV_NS up949 run_cmd ip -netns "$testns" link del "$DEV_NS"950 951 # test native tunnel erspan v2952 run_cmd ip -netns "$testns" link add dev "$DEV_NS" type erspan seq \953 key 102 local 172.16.1.100 remote 172.16.1.200 \954 erspan_ver 2 erspan_dir ingress erspan_hwid 7955 956 957 run_cmd ip -netns "$testns" addr add dev "$DEV_NS" 10.1.1.100/24958 run_cmd ip -netns "$testns" link set dev $DEV_NS up959 run_cmd ip -netns "$testns" link del "$DEV_NS"960 961 # test external mode962 run_cmd ip -netns "$testns" link add dev "$DEV_NS" type erspan external963 run_cmd ip -netns "$testns" link del "$DEV_NS"964 965 if [ $ret -ne 0 ]; then966 end_test "FAIL: erspan"967 ip netns del "$testns"968 return 1969 fi970 end_test "PASS: erspan"971 972 ip netns del "$testns"973}974 975kci_test_ip6erspan()976{977 DEV_NS=ip6erspan00978 local ret=0979 run_cmd_grep "^Usage:" ip link help ip6erspan980 if [ $? -ne 0 ];then981 end_test "SKIP: ip6erspan: iproute2 too old"982 return $ksft_skip983 fi984 setup_ns testns985 if [ $? -ne 0 ]; then986 end_test "SKIP ip6erspan tests: cannot add net namespace $testns"987 return $ksft_skip988 fi989 990 # test native tunnel ip6erspan v1991 run_cmd ip -netns "$testns" link add dev "$DEV_NS" type ip6erspan seq \992 key 102 local fc00:100::1 remote fc00:100::2 \993 erspan_ver 1 erspan 488994 995 996 run_cmd ip -netns "$testns" addr add dev "$DEV_NS" 10.1.1.100/24997 run_cmd ip -netns "$testns" link set dev $DEV_NS up998 run_cmd ip -netns "$testns" link del "$DEV_NS"999 1000 # test native tunnel ip6erspan v21001 run_cmd ip -netns "$testns" link add dev "$DEV_NS" type ip6erspan seq \1002 key 102 local fc00:100::1 remote fc00:100::2 \1003 erspan_ver 2 erspan_dir ingress erspan_hwid 71004 1005 1006 run_cmd ip -netns "$testns" addr add dev "$DEV_NS" 10.1.1.100/241007 run_cmd ip -netns "$testns" link set dev $DEV_NS up1008 run_cmd ip -netns "$testns" link del "$DEV_NS"1009 1010 # test external mode1011 run_cmd ip -netns "$testns" link add dev "$DEV_NS" \1012 type ip6erspan external1013 1014 run_cmd ip -netns "$testns" link del "$DEV_NS"1015 1016 if [ $ret -ne 0 ]; then1017 end_test "FAIL: ip6erspan"1018 ip netns del "$testns"1019 return 11020 fi1021 end_test "PASS: ip6erspan"1022 1023 ip netns del "$testns"1024}1025 1026kci_test_fdb_get()1027{1028 brdev="test-br0"1029 vxlandev="vxlan10"1030 test_mac=de:ad:be:ef:13:371031 localip="10.0.2.2"1032 dstip="10.0.2.3"1033 local ret=01034 1035 run_cmd_grep 'bridge fdb get' bridge fdb help1036 if [ $? -ne 0 ];then1037 end_test "SKIP: fdb get tests: iproute2 too old"1038 return $ksft_skip1039 fi1040 1041 setup_ns testns1042 if [ $? -ne 0 ]; then1043 end_test "SKIP fdb get tests: cannot add net namespace $testns"1044 return $ksft_skip1045 fi1046 IP="ip -netns $testns"1047 BRIDGE="bridge -netns $testns"1048 run_cmd $IP link add "$vxlandev" type vxlan id 10 local $localip \1049 dstport 47891050 run_cmd $IP link add name "$brdev" type bridge1051 run_cmd $IP link set dev "$vxlandev" master "$brdev"1052 run_cmd $BRIDGE fdb add $test_mac dev "$vxlandev" master1053 run_cmd $BRIDGE fdb add $test_mac dev "$vxlandev" dst $dstip self1054 run_cmd_grep "dev $vxlandev master $brdev" $BRIDGE fdb get $test_mac brport "$vxlandev"1055 run_cmd_grep "dev $vxlandev master $brdev" $BRIDGE fdb get $test_mac br "$brdev"1056 run_cmd_grep "dev $vxlandev dst $dstip" $BRIDGE fdb get $test_mac dev "$vxlandev" self1057 1058 ip netns del $testns &>/dev/null1059 1060 if [ $ret -ne 0 ]; then1061 end_test "FAIL: bridge fdb get"1062 return 11063 fi1064 1065 end_test "PASS: bridge fdb get"1066}1067 1068kci_test_neigh_get()1069{1070 dstmac=de:ad:be:ef:13:371071 dstip=10.0.2.41072 dstip6=dead::21073 local ret=01074 1075 run_cmd_grep 'ip neigh get' ip neigh help1076 if [ $? -ne 0 ];then1077 end_test "SKIP: fdb get tests: iproute2 too old"1078 return $ksft_skip1079 fi1080 1081 # ipv41082 run_cmd ip neigh add $dstip lladdr $dstmac dev "$devdummy"1083 run_cmd_grep "$dstmac" ip neigh get $dstip dev "$devdummy"1084 run_cmd ip neigh del $dstip lladdr $dstmac dev "$devdummy"1085 1086 # ipv4 proxy1087 run_cmd ip neigh add proxy $dstip dev "$devdummy"1088 run_cmd_grep "$dstip" ip neigh get proxy $dstip dev "$devdummy"1089 run_cmd ip neigh del proxy $dstip dev "$devdummy"1090 1091 # ipv61092 run_cmd ip neigh add $dstip6 lladdr $dstmac dev "$devdummy"1093 run_cmd_grep "$dstmac" ip neigh get $dstip6 dev "$devdummy"1094 run_cmd ip neigh del $dstip6 lladdr $dstmac dev "$devdummy"1095 1096 # ipv6 proxy1097 run_cmd ip neigh add proxy $dstip6 dev "$devdummy"1098 run_cmd_grep "$dstip6" ip neigh get proxy $dstip6 dev "$devdummy"1099 run_cmd ip neigh del proxy $dstip6 dev "$devdummy"1100 1101 if [ $ret -ne 0 ];then1102 end_test "FAIL: neigh get"1103 return 11104 fi1105 1106 end_test "PASS: neigh get"1107}1108 1109kci_test_bridge_parent_id()1110{1111 local ret=01112 sysfsnet=/sys/bus/netdevsim/devices/netdevsim1113 probed=false1114 1115 if [ ! -w /sys/bus/netdevsim/new_device ] ; then1116 run_cmd modprobe -q netdevsim1117 if [ $ret -ne 0 ]; then1118 end_test "SKIP: bridge_parent_id can't load netdevsim"1119 return $ksft_skip1120 fi1121 probed=true1122 fi1123 1124 echo "10 1" > /sys/bus/netdevsim/new_device1125 while [ ! -d ${sysfsnet}10 ] ; do :; done1126 echo "20 1" > /sys/bus/netdevsim/new_device1127 while [ ! -d ${sysfsnet}20 ] ; do :; done1128 udevadm settle1129 dev10=`ls ${sysfsnet}10/net/`1130 dev20=`ls ${sysfsnet}20/net/`1131 run_cmd ip link add name test-bond0 type bond mode 802.3ad1132 run_cmd ip link set dev $dev10 master test-bond01133 run_cmd ip link set dev $dev20 master test-bond01134 run_cmd ip link add name test-br0 type bridge1135 run_cmd ip link set dev test-bond0 master test-br01136 1137 # clean up any leftovers1138 ip link del dev test-br01139 ip link del dev test-bond01140 echo 20 > /sys/bus/netdevsim/del_device1141 echo 10 > /sys/bus/netdevsim/del_device1142 $probed && rmmod netdevsim1143 1144 if [ $ret -ne 0 ]; then1145 end_test "FAIL: bridge_parent_id"1146 return 11147 fi1148 end_test "PASS: bridge_parent_id"1149}1150 1151address_get_proto()1152{1153 local addr=$1; shift1154 1155 ip -N -j address show dev "$devdummy" |1156 jq -e -r --arg addr "${addr%/*}" \1157 '.[].addr_info[] | select(.local == $addr) | .protocol'1158}1159 1160address_count()1161{1162 ip -N -j address show dev "$devdummy" "$@" |1163 jq -e -r '[.[].addr_info[] | .local | select(. != null)] | length'1164}1165 1166do_test_address_proto()1167{1168 local what=$1; shift1169 local addr=$1; shift1170 local addr2=${addr%/*}2/${addr#*/}1171 local addr3=${addr%/*}3/${addr#*/}1172 local proto1173 local count1174 local ret=01175 local err1176 1177 ip address add dev "$devdummy" "$addr3"1178 check_err $?1179 proto=$(address_get_proto "$addr3")1180 [[ "$proto" == null ]]1181 check_err $?1182 1183 ip address add dev "$devdummy" "$addr2" proto 0x991184 check_err $?1185 proto=$(address_get_proto "$addr2")1186 [[ "$proto" == 0x99 ]]1187 check_err $?1188 1189 ip address add dev "$devdummy" "$addr" proto 0xab1190 check_err $?1191 proto=$(address_get_proto "$addr")1192 [[ "$proto" == 0xab ]]1193 check_err $?1194 1195 ip address replace dev "$devdummy" "$addr" proto 0x111196 proto=$(address_get_proto "$addr")1197 check_err $?1198 [[ "$proto" == 0x11 ]]1199 check_err $?1200 1201 count=$(address_count)1202 check_err $?1203 (( count >= 3 )) # $addr, $addr2 and $addr3 plus any kernel addresses1204 check_err $?1205 1206 count=$(address_count proto 0)1207 check_err $?1208 (( count == 1 )) # just $addr31209 check_err $?1210 1211 count=$(address_count proto 0x11)1212 check_err $?1213 (( count == 2 )) # $addr and $addr31214 check_err $?1215 1216 count=$(address_count proto 0xab)1217 check_err $?1218 (( count == 1 )) # just $addr31219 check_err $?1220 1221 ip address del dev "$devdummy" "$addr"1222 ip address del dev "$devdummy" "$addr2"1223 ip address del dev "$devdummy" "$addr3"1224 1225 if [ $ret -ne 0 ]; then1226 end_test "FAIL: address proto $what"1227 return 11228 fi1229 end_test "PASS: address proto $what"1230}1231 1232kci_test_address_proto()1233{1234 local ret=01235 1236 do_test_address_proto IPv4 192.0.2.1/281237 check_err $?1238 1239 do_test_address_proto IPv6 2001:db8:1::1/641240 check_err $?1241 1242 return $ret1243}1244 1245kci_test_enslave_bonding()1246{1247 local bond="bond123"1248 local ret=01249 1250 setup_ns testns1251 if [ $? -ne 0 ]; then1252 end_test "SKIP bonding tests: cannot add net namespace $testns"1253 return $ksft_skip1254 fi1255 1256 run_cmd ip -netns $testns link add dev $bond type bond mode balance-rr1257 run_cmd ip -netns $testns link add dev $devdummy type dummy1258 run_cmd ip -netns $testns link set dev $devdummy up1259 run_cmd ip -netns $testns link set dev $devdummy master $bond down1260 if [ $ret -ne 0 ]; then1261 end_test "FAIL: initially up interface added to a bond and set down"1262 ip netns del "$testns"1263 return 11264 fi1265 1266 end_test "PASS: enslave interface in a bond"1267 ip netns del "$testns"1268}1269 1270kci_test_rtnl()1271{1272 local current_test1273 local ret=01274 1275 kci_add_dummy1276 if [ $ret -ne 0 ];then1277 end_test "FAIL: cannot add dummy interface"1278 return 11279 fi1280 1281 for current_test in ${TESTS:-$ALL_TESTS}; do1282 $current_test1283 check_err $?1284 done1285 1286 kci_del_dummy1287 return $ret1288}1289 1290usage()1291{1292 cat <<EOF1293usage: ${0##*/} OPTS1294 1295 -t <test> Test(s) to run (default: all)1296 (options: $(echo $ALL_TESTS))1297 -v Verbose mode (show commands and output)1298 -P Pause after every test1299 -p Pause after every failing test before cleanup (for debugging)1300EOF1301}1302 1303#check for needed privileges1304if [ "$(id -u)" -ne 0 ];then1305 end_test "SKIP: Need root privileges"1306 exit $ksft_skip1307fi1308 1309for x in ip tc;do1310 $x -Version 2>/dev/null >/dev/null1311 if [ $? -ne 0 ];then1312 end_test "SKIP: Could not run test without the $x tool"1313 exit $ksft_skip1314 fi1315done1316 1317while getopts t:hvpP o; do1318 case $o in1319 t) TESTS=$OPTARG;;1320 v) VERBOSE=1;;1321 p) PAUSE_ON_FAIL=yes;;1322 P) PAUSE=yes;;1323 h) usage; exit 0;;1324 *) usage; exit 1;;1325 esac1326done1327 1328[ $PAUSE = "yes" ] && PAUSE_ON_FAIL="no"1329 1330kci_test_rtnl1331 1332exit $?1333