1682 lines · 43.1 KB · Shell
RawDownload
#!/bin/bash## This test is for checking rtnetlink callpaths, and get as much coverage as possible.## set -e ALL_TESTS="	kci_test_polrouting	kci_test_route_get	kci_test_addrlft	kci_test_addrlft_route_cleanup	kci_test_promote_secondaries	kci_test_tc	kci_test_gre	kci_test_gretap	kci_test_ip6gretap	kci_test_erspan	kci_test_ip6erspan	kci_test_bridge	kci_test_addrlabel	kci_test_ifalias	kci_test_vrf	kci_test_encap	kci_test_macsec	kci_test_macsec_vlan	kci_test_team_bridge_macvlan	kci_test_bridge_promisc_netlink	kci_test_bridge_promisc_sysfs	kci_test_ipsec	kci_test_ipsec_offload	kci_test_fdb_get	kci_test_fdb_del	kci_test_neigh_get	kci_test_neigh_update	kci_test_bridge_parent_id	kci_test_address_proto	kci_test_enslave_bonding	kci_test_mngtmpaddr	kci_test_operstate" devdummy="test-dummy0"VERBOSE=0PAUSE=noPAUSE_ON_FAIL=no source lib.sh # set global exit status, but never reset nonzero one.check_err(){	if [ $ret -eq 0 ]; then		ret=$1	fi	[ -n "$2" ] && echo "$2"} # same but inverted -- used when command must fail for test to passcheck_fail(){	if [ $1 -eq 0 ]; then		ret=1	fi} sysfs_write(){	local val="$1"	local path="$2" 	echo "$val" > "$path"} run_cmd_common(){	local cmd="$*"	local out	if [ "$VERBOSE" = "1" ]; then		echo "COMMAND: ${cmd}"	fi	out=$($cmd 2>&1)	rc=$?	if [ "$VERBOSE" = "1" -a -n "$out" ]; then		echo "    $out"	fi	return $rc} run_cmd() {	run_cmd_common "$@"	rc=$?	check_err $rc	return $rc}run_cmd_fail(){	run_cmd_common "$@"	rc=$?	check_fail $rc	return $rc} run_cmd_grep_common(){	local find="$1"; shift	local cmd="$*"	local out	if [ "$VERBOSE" = "1" ]; then		echo "COMMAND: ${cmd} 2>&1 | grep -q '${find}'"	fi	out=$($cmd 2>&1 | grep -q "${find}" 2>&1)	return $?} run_cmd_grep() {	run_cmd_grep_common "$@"	rc=$?	check_err $rc	return $rc} run_cmd_grep_fail(){	run_cmd_grep_common "$@"	rc=$?	check_fail $rc	return $rc} end_test(){	echo "$*"	[ "${VERBOSE}" = "1" ] && echo 	if [[ $ret -ne 0 ]] && [[ "${PAUSE_ON_FAIL}" = "yes" ]]; then		echo "Hit enter to continue"		read a	fi; 	if [ "${PAUSE}" = "yes" ]; then		echo "Hit enter to continue"		read a	fi }  kci_add_dummy(){	run_cmd ip link add name "$devdummy" type dummy	run_cmd ip link set "$devdummy" up} kci_del_dummy(){	run_cmd ip link del dev "$devdummy"} kci_test_netconf(){	dev="$1"	r=$ret	run_cmd ip netconf show dev "$dev"	for f in 4 6; do		run_cmd ip -$f netconf show dev "$dev"	done 	if [ $ret -ne 0 ] ;then		end_test "FAIL: ip netconf show $dev"		test $r -eq 0 && ret=0		return 1	fi} # add a bridge with vlans on topkci_test_bridge(){	devbr="test-br0"	vlandev="testbr-vlan1" 	local ret=0	run_cmd ip link add name "$devbr" type bridge	run_cmd ip link set dev "$devdummy" master "$devbr"	run_cmd ip link set "$devbr" up	run_cmd ip link add link "$devbr" name "$vlandev" type vlan id 1	run_cmd ip addr add dev "$vlandev" 10.200.7.23/30	run_cmd ip -6 addr add dev "$vlandev" dead:42::1234/64	run_cmd ip -d link	run_cmd ip r s t all 	for name in "$devbr" "$vlandev" "$devdummy" ; do		kci_test_netconf "$name"	done	run_cmd ip -6 addr del dev "$vlandev" dead:42::1234/64	run_cmd ip link del dev "$vlandev"	run_cmd ip link del dev "$devbr" 	if [ $ret -ne 0 ];then		end_test "FAIL: bridge setup"		return 1	fi	end_test "PASS: bridge setup" } kci_test_gre(){	gredev=neta	rem=10.42.42.1	loc=10.0.0.1 	local ret=0	run_cmd ip tunnel add $gredev mode gre remote $rem local $loc ttl 1	run_cmd ip link set $gredev up	run_cmd ip addr add 10.23.7.10 dev $gredev	run_cmd ip route add 10.23.8.0/30 dev $gredev	run_cmd ip addr add dev "$devdummy" 10.23.7.11/24	run_cmd ip link	run_cmd ip addr 	kci_test_netconf "$gredev"	run_cmd ip addr del dev "$devdummy" 10.23.7.11/24	run_cmd ip link del $gredev 	if [ $ret -ne 0 ];then		end_test "FAIL: gre tunnel endpoint"		return 1	fi	end_test "PASS: gre tunnel endpoint"} # tc uses rtnetlink too, for full tc testing# please see tools/testing/selftests/tc-testing.kci_test_tc(){	dev=lo	local ret=0 	run_cmd tc qdisc add dev "$dev" root handle 1: htb	run_cmd tc class add dev "$dev" parent 1: classid 1:10 htb rate 1mbit	run_cmd tc filter add dev "$dev" parent 1:0 prio 5 handle ffe: protocol ip u32 divisor 256	run_cmd tc filter add dev "$dev" parent 1:0 prio 5 handle ffd: protocol ip u32 divisor 256	run_cmd tc filter add dev "$dev" parent 1:0 prio 5 handle ffc: protocol ip u32 divisor 256	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:10	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:10	run_cmd tc filter show dev "$dev" parent  1:0	run_cmd tc filter del dev "$dev" protocol ip parent 1: prio 5 handle ffe:2:3 u32	run_cmd tc filter show dev "$dev" parent  1:0	run_cmd tc qdisc del dev "$dev" root handle 1: htb 	if [ $ret -ne 0 ];then		end_test "FAIL: tc htb hierarchy"		return 1	fi	end_test "PASS: tc htb hierarchy" } kci_test_polrouting(){	local ret=0	run_cmd ip rule add fwmark 1 lookup 100	run_cmd ip route add local 0.0.0.0/0 dev lo table 100	run_cmd ip r s t all	run_cmd ip rule del fwmark 1 lookup 100	run_cmd ip route del local 0.0.0.0/0 dev lo table 100 	if [ $ret -ne 0 ];then		end_test "FAIL: policy route test"		return 1	fi	end_test "PASS: policy routing"} kci_test_route_get(){	local hash_policy=$(sysctl -n net.ipv4.fib_multipath_hash_policy) 	local ret=0	run_cmd ip route get 127.0.0.1	run_cmd ip route get 127.0.0.1 dev "$devdummy"	run_cmd ip route get ::1	run_cmd ip route get fe80::1 dev "$devdummy"	run_cmd ip route get 127.0.0.1 from 127.0.0.1 oif lo tos 0x10 mark 0x1	run_cmd ip route get ::1 from ::1 iif lo oif lo tos 0x10 mark 0x1	run_cmd ip addr add dev "$devdummy" 10.23.7.11/24	run_cmd ip route get 10.23.7.11 from 10.23.7.12 iif "$devdummy"	run_cmd ip route add 10.23.8.0/24 \		nexthop via 10.23.7.13 dev "$devdummy" \		nexthop via 10.23.7.14 dev "$devdummy" 	sysctl -wq net.ipv4.fib_multipath_hash_policy=0	run_cmd ip route get 10.23.8.11	sysctl -wq net.ipv4.fib_multipath_hash_policy=1	run_cmd ip route get 10.23.8.11	sysctl -wq net.ipv4.fib_multipath_hash_policy="$hash_policy"	run_cmd ip route del 10.23.8.0/24	run_cmd ip addr del dev "$devdummy" 10.23.7.11/24  	if [ $ret -ne 0 ];then		end_test "FAIL: route get"		return 1	fi 	end_test "PASS: route get"} check_addr_not_exist(){	dev=$1	addr=$2	if ip addr show dev $dev | grep -q $addr; then		return 1	else		return 0	fi} kci_test_addrlft(){	for i in $(seq 10 100) ;do		lft=$(((RANDOM%3) + 1))		run_cmd ip addr add 10.23.11.$i/32 dev "$devdummy" preferred_lft $lft valid_lft $((lft+1))	done 	slowwait 5 check_addr_not_exist "$devdummy" "10.23.11."	if [ $? -eq 1 ]; then		# troubleshoot the reason for our failure		run_cmd ip addr show dev "$devdummy"		check_err 1		end_test "FAIL: preferred_lft addresses remaining"		return	fi 	end_test "PASS: preferred_lft addresses have expired"} kci_test_addrlft_route_cleanup(){	local ret=0	local test_addr="2001:db8:99::1/64"	local test_prefix="2001:db8:99::/64" 	run_cmd ip -6 addr add $test_addr dev "$devdummy" valid_lft 300 preferred_lft 300	run_cmd_grep "$test_prefix proto kernel" ip -6 route show dev "$devdummy"	run_cmd ip -6 addr del $test_addr dev "$devdummy"	run_cmd_grep_fail "$test_prefix" ip -6 route show dev "$devdummy" 	if [ $ret -ne 0 ]; then		end_test "FAIL: route not cleaned up when address with valid_lft deleted"		return 1	fi 	end_test "PASS: route cleaned up when address with valid_lft deleted"} kci_test_promote_secondaries(){	run_cmd ifconfig "$devdummy"	if [ $ret -ne 0 ]; then		end_test "SKIP: ifconfig not installed"		return $ksft_skip	fi	promote=$(sysctl -n net.ipv4.conf.$devdummy.promote_secondaries) 	sysctl -q net.ipv4.conf.$devdummy.promote_secondaries=1 	for i in $(seq 2 254);do		IP="10.23.11.$i"		ip -f inet addr add $IP/16 brd + dev "$devdummy"		ifconfig "$devdummy" $IP netmask 255.255.0.0	done 	ip addr flush dev "$devdummy" 	[ $promote -eq 0 ] && sysctl -q net.ipv4.conf.$devdummy.promote_secondaries=0 	end_test "PASS: promote_secondaries complete"} kci_test_addrlabel(){	local ret=0	run_cmd ip addrlabel add prefix dead::/64 dev lo label 1	run_cmd_grep "prefix dead::/64 dev lo label 1" ip addrlabel list	run_cmd ip addrlabel del prefix dead::/64 dev lo label 1	run_cmd ip addrlabel add prefix dead::/64 label 1	run_cmd ip addrlabel del prefix dead::/64 label 1 	# concurrent add/delete	for i in $(seq 1 1000); do		ip addrlabel add prefix 1c3::/64 label 12345 2>/dev/null	done & 	for i in $(seq 1 1000); do		ip addrlabel del prefix 1c3::/64 label 12345 2>/dev/null	done 	wait 	ip addrlabel del prefix 1c3::/64 label 12345 2>/dev/null 	if [ $ret -ne 0 ];then		end_test "FAIL: ipv6 addrlabel"		return 1	fi 	end_test "PASS: ipv6 addrlabel"} kci_test_ifalias(){	local ret=0	namewant=$(uuidgen)	syspathname="/sys/class/net/$devdummy/ifalias"	run_cmd ip link set dev "$devdummy" alias "$namewant" 	if [ $ret -ne 0 ]; then		end_test "FAIL: cannot set interface alias of $devdummy to $namewant"		return 1	fi	run_cmd_grep "alias $namewant" ip link show "$devdummy" 	if [ -r "$syspathname" ] ; then		read namehave < "$syspathname"		if [ "$namewant" != "$namehave" ]; then			end_test "FAIL: did set ifalias $namewant but got $namehave"			return 1		fi 		namewant=$(uuidgen)		echo "$namewant" > "$syspathname"	        run_cmd_grep "alias $namewant" ip link show "$devdummy" 		# sysfs interface allows to delete alias again		echo "" > "$syspathname"	        run_cmd_grep_fail "alias $namewant" ip link show "$devdummy" 		for i in $(seq 1 100); do			uuidgen > "$syspathname" &		done 		wait 		# re-add the alias -- kernel should free mem when dummy dev is removed		run_cmd ip link set dev "$devdummy" alias "$namewant" 	fi 	if [ $ret -ne 0 ]; then		end_test "FAIL: set interface alias $devdummy to $namewant"		return 1	fi 	end_test "PASS: set ifalias $namewant for $devdummy"} kci_test_vrf(){	vrfname="test-vrf"	local ret=0	run_cmd ip link show type vrf	if [ $? -ne 0 ]; then		end_test "SKIP: vrf: iproute2 too old"		return $ksft_skip	fi	run_cmd ip link add "$vrfname" type vrf table 10	if [ $ret -ne 0 ];then		end_test "FAIL: can't add vrf interface, skipping test"		return 0	fi	run_cmd_grep "$vrfname" ip -br link show type vrf	if [ $ret -ne 0 ];then		end_test "FAIL: created vrf device not found"		return 1	fi 	run_cmd ip link set dev "$vrfname" up	run_cmd ip link set dev "$devdummy" master "$vrfname"	run_cmd ip link del dev "$vrfname" 	if [ $ret -ne 0 ];then		end_test "FAIL: vrf"		return 1	fi 	end_test "PASS: vrf"} kci_test_encap_vxlan(){	local ret=0	vxlan="test-vxlan0"	vlan="test-vlan0"	run_cmd ip -netns "$testns" link add "$vxlan" type vxlan id 42 group 239.1.1.1 \		dev "$devdummy" dstport 4789	if [ $? -ne 0 ]; then		end_test "FAIL: can't add vxlan interface, skipping test"		return 0

Lines 1–500 of 1682.