brintos

brintos / linux-shallow public Read only

0
0
Text · 32.9 KiB · bdf6f10 Raw
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