GNU Linux-libre 4.14.266-gnu1
[releases.git] / tools / testing / selftests / net / rtnetlink.sh
1 #!/bin/bash
2 #
3 # This test is for checking rtnetlink callpaths, and get as much coverage as possible.
4 #
5 # set -e
6
7 devdummy="test-dummy0"
8 ret=0
9
10 # set global exit status, but never reset nonzero one.
11 check_err()
12 {
13         if [ $ret -eq 0 ]; then
14                 ret=$1
15         fi
16 }
17
18 kci_add_dummy()
19 {
20         ip link add name "$devdummy" type dummy
21         check_err $?
22         ip link set "$devdummy" up
23         check_err $?
24 }
25
26 kci_del_dummy()
27 {
28         ip link del dev "$devdummy"
29         check_err $?
30 }
31
32 # add a bridge with vlans on top
33 kci_test_bridge()
34 {
35         devbr="test-br0"
36         vlandev="testbr-vlan1"
37
38         ret=0
39         ip link add name "$devbr" type bridge
40         check_err $?
41
42         ip link set dev "$devdummy" master "$devbr"
43         check_err $?
44
45         ip link set "$devbr" up
46         check_err $?
47
48         ip link add link "$devbr" name "$vlandev" type vlan id 1
49         check_err $?
50         ip addr add dev "$vlandev" 10.200.7.23/30
51         check_err $?
52         ip -6 addr add dev "$vlandev" dead:42::1234/64
53         check_err $?
54         ip -d link > /dev/null
55         check_err $?
56         ip r s t all > /dev/null
57         check_err $?
58         ip -6 addr del dev "$vlandev" dead:42::1234/64
59         check_err $?
60
61         ip link del dev "$vlandev"
62         check_err $?
63         ip link del dev "$devbr"
64         check_err $?
65
66         if [ $ret -ne 0 ];then
67                 echo "FAIL: bridge setup"
68                 return 1
69         fi
70         echo "PASS: bridge setup"
71
72 }
73
74 kci_test_gre()
75 {
76         gredev=neta
77         rem=10.42.42.1
78         loc=10.0.0.1
79
80         ret=0
81         ip tunnel add $gredev mode gre remote $rem local $loc ttl 1
82         check_err $?
83         ip link set $gredev up
84         check_err $?
85         ip addr add 10.23.7.10 dev $gredev
86         check_err $?
87         ip route add 10.23.8.0/30 dev $gredev
88         check_err $?
89         ip addr add dev "$devdummy" 10.23.7.11/24
90         check_err $?
91         ip link > /dev/null
92         check_err $?
93         ip addr > /dev/null
94         check_err $?
95         ip addr del dev "$devdummy" 10.23.7.11/24
96         check_err $?
97
98         ip link del $gredev
99         check_err $?
100
101         if [ $ret -ne 0 ];then
102                 echo "FAIL: gre tunnel endpoint"
103                 return 1
104         fi
105         echo "PASS: gre tunnel endpoint"
106 }
107
108 # tc uses rtnetlink too, for full tc testing
109 # please see tools/testing/selftests/tc-testing.
110 kci_test_tc()
111 {
112         dev=lo
113         ret=0
114
115         tc qdisc add dev "$dev" root handle 1: htb
116         check_err $?
117         tc class add dev "$dev" parent 1: classid 1:10 htb rate 1mbit
118         check_err $?
119         tc filter add dev "$dev" parent 1:0 prio 5 handle ffe: protocol ip u32 divisor 256
120         check_err $?
121         tc filter add dev "$dev" parent 1:0 prio 5 handle ffd: protocol ip u32 divisor 256
122         check_err $?
123         tc filter add dev "$dev" parent 1:0 prio 5 handle ffc: protocol ip u32 divisor 256
124         check_err $?
125         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
126         check_err $?
127         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
128         check_err $?
129         tc filter show dev "$dev" parent  1:0 > /dev/null
130         check_err $?
131         tc filter del dev "$dev" protocol ip parent 1: prio 5 handle ffe:2:3 u32
132         check_err $?
133         tc filter show dev "$dev" parent  1:0 > /dev/null
134         check_err $?
135         tc qdisc del dev "$dev" root handle 1: htb
136         check_err $?
137
138         if [ $ret -ne 0 ];then
139                 echo "FAIL: tc htb hierarchy"
140                 return 1
141         fi
142         echo "PASS: tc htb hierarchy"
143
144 }
145
146 kci_test_polrouting()
147 {
148         ret=0
149         ip rule add fwmark 1 lookup 100
150         check_err $?
151         ip route add local 0.0.0.0/0 dev lo table 100
152         check_err $?
153         ip r s t all > /dev/null
154         check_err $?
155         ip rule del fwmark 1 lookup 100
156         check_err $?
157         ip route del local 0.0.0.0/0 dev lo table 100
158         check_err $?
159
160         if [ $ret -ne 0 ];then
161                 echo "FAIL: policy route test"
162                 return 1
163         fi
164         echo "PASS: policy routing"
165 }
166
167 kci_test_route_get()
168 {
169         ret=0
170
171         ip route get 127.0.0.1 > /dev/null
172         check_err $?
173         ip route get 127.0.0.1 dev "$devdummy" > /dev/null
174         check_err $?
175         ip route get ::1 > /dev/null
176         check_err $?
177         ip route get fe80::1 dev "$devdummy" > /dev/null
178         check_err $?
179         ip route get 127.0.0.1 from 127.0.0.1 oif lo tos 0x1 mark 0x1 > /dev/null
180         check_err $?
181         ip route get ::1 from ::1 iif lo oif lo tos 0x1 mark 0x1 > /dev/null
182         check_err $?
183         ip addr add dev "$devdummy" 10.23.7.11/24
184         check_err $?
185         ip route get 10.23.7.11 from 10.23.7.12 iif "$devdummy" > /dev/null
186         check_err $?
187         ip addr del dev "$devdummy" 10.23.7.11/24
188         check_err $?
189
190         if [ $ret -ne 0 ];then
191                 echo "FAIL: route get"
192                 return 1
193         fi
194
195         echo "PASS: route get"
196 }
197
198 kci_test_addrlft()
199 {
200         for i in $(seq 10 100) ;do
201                 lft=$(((RANDOM%3) + 1))
202                 ip addr add 10.23.11.$i/32 dev "$devdummy" preferred_lft $lft valid_lft $((lft+1))
203                 check_err $?
204         done
205
206         sleep 5
207
208         ip addr show dev "$devdummy" | grep "10.23.11."
209         if [ $? -eq 0 ]; then
210                 echo "FAIL: preferred_lft addresses remaining"
211                 check_err 1
212                 return
213         fi
214
215         echo "PASS: preferred_lft addresses have expired"
216 }
217
218 kci_test_addrlabel()
219 {
220         ret=0
221
222         ip addrlabel add prefix dead::/64 dev lo label 1
223         check_err $?
224
225         ip addrlabel list |grep -q "prefix dead::/64 dev lo label 1"
226         check_err $?
227
228         ip addrlabel del prefix dead::/64 dev lo label 1 2> /dev/null
229         check_err $?
230
231         ip addrlabel add prefix dead::/64 label 1 2> /dev/null
232         check_err $?
233
234         ip addrlabel del prefix dead::/64 label 1 2> /dev/null
235         check_err $?
236
237         # concurrent add/delete
238         for i in $(seq 1 1000); do
239                 ip addrlabel add prefix 1c3::/64 label 12345 2>/dev/null
240         done &
241
242         for i in $(seq 1 1000); do
243                 ip addrlabel del prefix 1c3::/64 label 12345 2>/dev/null
244         done
245
246         wait
247
248         ip addrlabel del prefix 1c3::/64 label 12345 2>/dev/null
249
250         if [ $ret -ne 0 ];then
251                 echo "FAIL: ipv6 addrlabel"
252                 return 1
253         fi
254
255         echo "PASS: ipv6 addrlabel"
256 }
257
258 kci_test_rtnl()
259 {
260         kci_add_dummy
261         if [ $ret -ne 0 ];then
262                 echo "FAIL: cannot add dummy interface"
263                 return 1
264         fi
265
266         kci_test_polrouting
267         kci_test_route_get
268         kci_test_addrlft
269         kci_test_tc
270         kci_test_gre
271         kci_test_bridge
272         kci_test_addrlabel
273
274         kci_del_dummy
275 }
276
277 #check for needed privileges
278 if [ "$(id -u)" -ne 0 ];then
279         echo "SKIP: Need root privileges"
280         exit 0
281 fi
282
283 for x in ip tc;do
284         $x -Version 2>/dev/null >/dev/null
285         if [ $? -ne 0 ];then
286                 echo "SKIP: Could not run test without the $x tool"
287                 exit 0
288         fi
289 done
290
291 kci_test_rtnl
292
293 exit $ret