selftests: add rtnetlink test script
authorFlorian Westphal <fw@strlen.de>
Thu, 10 Aug 2017 14:53:02 +0000 (16:53 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 10 Aug 2017 16:50:22 +0000 (09:50 -0700)
add a simple script to exercise some rtnetlink call paths, so KASAN,
lockdep etc. can yell at developer before patches are sent upstream.

This can be extended to also cover bond, team, vrf and the like.

Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
tools/testing/selftests/net/Makefile
tools/testing/selftests/net/rtnetlink.sh [new file with mode: 0755]

index 6135a844890097c86d7c6277c7d45a7a4627b1bb..de1f5772b878ee1f4aee9e1452d1f0e83696af62 100644 (file)
@@ -3,7 +3,7 @@
 CFLAGS =  -Wall -Wl,--no-as-needed -O2 -g
 CFLAGS += -I../../../../usr/include/
 
-TEST_PROGS := run_netsocktests run_afpackettests test_bpf.sh netdevice.sh
+TEST_PROGS := run_netsocktests run_afpackettests test_bpf.sh netdevice.sh rtnetlink.sh
 TEST_GEN_FILES =  socket
 TEST_GEN_FILES += psock_fanout psock_tpacket
 TEST_GEN_FILES += reuseport_bpf reuseport_bpf_cpu reuseport_bpf_numa
diff --git a/tools/testing/selftests/net/rtnetlink.sh b/tools/testing/selftests/net/rtnetlink.sh
new file mode 100755 (executable)
index 0000000..5b04ad9
--- /dev/null
@@ -0,0 +1,199 @@
+#!/bin/sh
+#
+# This test is for checking rtnetlink callpaths, and get as much coverage as possible.
+#
+# set -e
+
+devdummy="test-dummy0"
+ret=0
+
+# set global exit status, but never reset nonzero one.
+check_err()
+{
+       if [ $ret -eq 0 ]; then
+               ret=$1
+       fi
+}
+
+kci_add_dummy()
+{
+       ip link add name "$devdummy" type dummy
+       check_err $?
+       ip link set "$devdummy" up
+       check_err $?
+}
+
+kci_del_dummy()
+{
+       ip link del dev "$devdummy"
+       check_err $?
+}
+
+# add a bridge with vlans on top
+kci_test_bridge()
+{
+       devbr="test-br0"
+       vlandev="testbr-vlan1"
+
+       ret=0
+       ip link add name "$devbr" type bridge
+       check_err $?
+
+       ip link set dev "$devdummy" master "$devbr"
+       check_err $?
+
+       ip link set "$devbr" up
+       check_err $?
+
+       ip link add link "$devbr" name "$vlandev" type vlan id 1
+       check_err $?
+       ip addr add dev "$vlandev" 10.200.7.23/30
+       check_err $?
+       ip -6 addr add dev "$vlandev" dead:42::1234/64
+       check_err $?
+       ip -d link > /dev/null
+       check_err $?
+       ip r s t all > /dev/null
+       check_err $?
+       ip -6 addr del dev "$vlandev" dead:42::1234/64
+       check_err $?
+
+       ip link del dev "$vlandev"
+       check_err $?
+       ip link del dev "$devbr"
+       check_err $?
+
+       if [ $ret -ne 0 ];then
+               echo "FAIL: bridge setup"
+               return 1
+       fi
+       echo "PASS: bridge setup"
+
+}
+
+kci_test_gre()
+{
+       gredev=neta
+       rem=10.42.42.1
+       loc=10.0.0.1
+
+       ret=0
+       ip tunnel add $gredev mode gre remote $rem local $loc ttl 1
+       check_err $?
+       ip link set $gredev up
+       check_err $?
+       ip addr add 10.23.7.10 dev $gredev
+       check_err $?
+       ip route add 10.23.8.0/30 dev $gredev
+       check_err $?
+       ip addr add dev "$devdummy" 10.23.7.11/24
+       check_err $?
+       ip link > /dev/null
+       check_err $?
+       ip addr > /dev/null
+       check_err $?
+       ip addr del dev "$devdummy" 10.23.7.11/24
+       check_err $?
+
+       ip link del $gredev
+       check_err $?
+
+       if [ $ret -ne 0 ];then
+               echo "FAIL: gre tunnel endpoint"
+               return 1
+       fi
+       echo "PASS: gre tunnel endpoint"
+}
+
+# tc uses rtnetlink too, for full tc testing
+# please see tools/testing/selftests/tc-testing.
+kci_test_tc()
+{
+       dev=lo
+       ret=0
+
+       tc qdisc add dev "$dev" root handle 1: htb
+       check_err $?
+       tc class add dev "$dev" parent 1: classid 1:10 htb rate 1mbit
+       check_err $?
+       tc filter add dev "$dev" parent 1:0 prio 5 handle ffe: protocol ip u32 divisor 256
+       check_err $?
+       tc filter add dev "$dev" parent 1:0 prio 5 handle ffd: protocol ip u32 divisor 256
+       check_err $?
+       tc filter add dev "$dev" parent 1:0 prio 5 handle ffc: protocol ip u32 divisor 256
+       check_err $?
+       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
+       check_err $?
+       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
+       check_err $?
+       tc filter show dev "$dev" parent  1:0 > /dev/null
+       check_err $?
+       tc filter del dev "$dev" protocol ip parent 1: prio 5 handle ffe:2:3 u32
+       check_err $?
+       tc filter show dev "$dev" parent  1:0 > /dev/null
+       check_err $?
+       tc qdisc del dev "$dev" root handle 1: htb
+       check_err $?
+
+       if [ $ret -ne 0 ];then
+               echo "FAIL: tc htb hierarchy"
+               return 1
+       fi
+       echo "PASS: tc htb hierarchy"
+
+}
+
+kci_test_polrouting()
+{
+       ret=0
+       ip rule add fwmark 1 lookup 100
+       check_err $?
+       ip route add local 0.0.0.0/0 dev lo table 100
+       check_err $?
+       ip r s t all > /dev/null
+       check_err $?
+       ip rule del fwmark 1 lookup 100
+       check_err $?
+       ip route del local 0.0.0.0/0 dev lo table 100
+       check_err $?
+
+       if [ $ret -ne 0 ];then
+               echo "FAIL: policy route test"
+               return 1
+       fi
+       echo "PASS: policy routing"
+}
+
+kci_test_rtnl()
+{
+       kci_add_dummy
+       if [ $ret -ne 0 ];then
+               echo "FAIL: cannot add dummy interface"
+               return 1
+       fi
+
+       kci_test_polrouting
+       kci_test_tc
+       kci_test_gre
+       kci_test_bridge
+
+       kci_del_dummy
+}
+
+#check for needed privileges
+if [ "$(id -u)" -ne 0 ];then
+       echo "SKIP: Need root privileges"
+       exit 0
+fi
+
+for x in ip tc;do
+       $x -Version 2>/dev/null >/dev/null
+       if [ $? -ne 0 ];then
+               echo "SKIP: Could not run test without the $x tool"
+               exit 0
+       fi
+done
+
+kci_test_rtnl
+
+exit $ret