GNU Linux-libre 4.19.211-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 # Kselftest framework requirement - SKIP code is 4.
11 ksft_skip=4
12
13 # set global exit status, but never reset nonzero one.
14 check_err()
15 {
16         if [ $ret -eq 0 ]; then
17                 ret=$1
18         fi
19 }
20
21 # same but inverted -- used when command must fail for test to pass
22 check_fail()
23 {
24         if [ $1 -eq 0 ]; then
25                 ret=1
26         fi
27 }
28
29 kci_add_dummy()
30 {
31         ip link add name "$devdummy" type dummy
32         check_err $?
33         ip link set "$devdummy" up
34         check_err $?
35 }
36
37 kci_del_dummy()
38 {
39         ip link del dev "$devdummy"
40         check_err $?
41 }
42
43 kci_test_netconf()
44 {
45         dev="$1"
46         r=$ret
47
48         ip netconf show dev "$dev" > /dev/null
49         check_err $?
50
51         for f in 4 6; do
52                 ip -$f netconf show dev "$dev" > /dev/null
53                 check_err $?
54         done
55
56         if [ $ret -ne 0 ] ;then
57                 echo "FAIL: ip netconf show $dev"
58                 test $r -eq 0 && ret=0
59                 return 1
60         fi
61 }
62
63 # add a bridge with vlans on top
64 kci_test_bridge()
65 {
66         devbr="test-br0"
67         vlandev="testbr-vlan1"
68
69         ret=0
70         ip link add name "$devbr" type bridge
71         check_err $?
72
73         ip link set dev "$devdummy" master "$devbr"
74         check_err $?
75
76         ip link set "$devbr" up
77         check_err $?
78
79         ip link add link "$devbr" name "$vlandev" type vlan id 1
80         check_err $?
81         ip addr add dev "$vlandev" 10.200.7.23/30
82         check_err $?
83         ip -6 addr add dev "$vlandev" dead:42::1234/64
84         check_err $?
85         ip -d link > /dev/null
86         check_err $?
87         ip r s t all > /dev/null
88         check_err $?
89
90         for name in "$devbr" "$vlandev" "$devdummy" ; do
91                 kci_test_netconf "$name"
92         done
93
94         ip -6 addr del dev "$vlandev" dead:42::1234/64
95         check_err $?
96
97         ip link del dev "$vlandev"
98         check_err $?
99         ip link del dev "$devbr"
100         check_err $?
101
102         if [ $ret -ne 0 ];then
103                 echo "FAIL: bridge setup"
104                 return 1
105         fi
106         echo "PASS: bridge setup"
107
108 }
109
110 kci_test_gre()
111 {
112         gredev=neta
113         rem=10.42.42.1
114         loc=10.0.0.1
115
116         ret=0
117         ip tunnel add $gredev mode gre remote $rem local $loc ttl 1
118         check_err $?
119         ip link set $gredev up
120         check_err $?
121         ip addr add 10.23.7.10 dev $gredev
122         check_err $?
123         ip route add 10.23.8.0/30 dev $gredev
124         check_err $?
125         ip addr add dev "$devdummy" 10.23.7.11/24
126         check_err $?
127         ip link > /dev/null
128         check_err $?
129         ip addr > /dev/null
130         check_err $?
131
132         kci_test_netconf "$gredev"
133
134         ip addr del dev "$devdummy" 10.23.7.11/24
135         check_err $?
136
137         ip link del $gredev
138         check_err $?
139
140         if [ $ret -ne 0 ];then
141                 echo "FAIL: gre tunnel endpoint"
142                 return 1
143         fi
144         echo "PASS: gre tunnel endpoint"
145 }
146
147 # tc uses rtnetlink too, for full tc testing
148 # please see tools/testing/selftests/tc-testing.
149 kci_test_tc()
150 {
151         dev=lo
152         ret=0
153
154         tc qdisc add dev "$dev" root handle 1: htb
155         check_err $?
156         tc class add dev "$dev" parent 1: classid 1:10 htb rate 1mbit
157         check_err $?
158         tc filter add dev "$dev" parent 1:0 prio 5 handle ffe: protocol ip u32 divisor 256
159         check_err $?
160         tc filter add dev "$dev" parent 1:0 prio 5 handle ffd: protocol ip u32 divisor 256
161         check_err $?
162         tc filter add dev "$dev" parent 1:0 prio 5 handle ffc: protocol ip u32 divisor 256
163         check_err $?
164         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
165         check_err $?
166         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
167         check_err $?
168         tc filter show dev "$dev" parent  1:0 > /dev/null
169         check_err $?
170         tc filter del dev "$dev" protocol ip parent 1: prio 5 handle ffe:2:3 u32
171         check_err $?
172         tc filter show dev "$dev" parent  1:0 > /dev/null
173         check_err $?
174         tc qdisc del dev "$dev" root handle 1: htb
175         check_err $?
176
177         if [ $ret -ne 0 ];then
178                 echo "FAIL: tc htb hierarchy"
179                 return 1
180         fi
181         echo "PASS: tc htb hierarchy"
182
183 }
184
185 kci_test_polrouting()
186 {
187         ret=0
188         ip rule add fwmark 1 lookup 100
189         check_err $?
190         ip route add local 0.0.0.0/0 dev lo table 100
191         check_err $?
192         ip r s t all > /dev/null
193         check_err $?
194         ip rule del fwmark 1 lookup 100
195         check_err $?
196         ip route del local 0.0.0.0/0 dev lo table 100
197         check_err $?
198
199         if [ $ret -ne 0 ];then
200                 echo "FAIL: policy route test"
201                 return 1
202         fi
203         echo "PASS: policy routing"
204 }
205
206 kci_test_route_get()
207 {
208         ret=0
209
210         ip route get 127.0.0.1 > /dev/null
211         check_err $?
212         ip route get 127.0.0.1 dev "$devdummy" > /dev/null
213         check_err $?
214         ip route get ::1 > /dev/null
215         check_err $?
216         ip route get fe80::1 dev "$devdummy" > /dev/null
217         check_err $?
218         ip route get 127.0.0.1 from 127.0.0.1 oif lo tos 0x1 mark 0x1 > /dev/null
219         check_err $?
220         ip route get ::1 from ::1 iif lo oif lo tos 0x1 mark 0x1 > /dev/null
221         check_err $?
222         ip addr add dev "$devdummy" 10.23.7.11/24
223         check_err $?
224         ip route get 10.23.7.11 from 10.23.7.12 iif "$devdummy" > /dev/null
225         check_err $?
226         ip addr del dev "$devdummy" 10.23.7.11/24
227         check_err $?
228
229         if [ $ret -ne 0 ];then
230                 echo "FAIL: route get"
231                 return 1
232         fi
233
234         echo "PASS: route get"
235 }
236
237 kci_test_addrlft()
238 {
239         for i in $(seq 10 100) ;do
240                 lft=$(((RANDOM%3) + 1))
241                 ip addr add 10.23.11.$i/32 dev "$devdummy" preferred_lft $lft valid_lft $((lft+1))
242                 check_err $?
243         done
244
245         sleep 5
246
247         ip addr show dev "$devdummy" | grep "10.23.11."
248         if [ $? -eq 0 ]; then
249                 echo "FAIL: preferred_lft addresses remaining"
250                 check_err 1
251                 return
252         fi
253
254         echo "PASS: preferred_lft addresses have expired"
255 }
256
257 kci_test_addrlabel()
258 {
259         ret=0
260
261         ip addrlabel add prefix dead::/64 dev lo label 1
262         check_err $?
263
264         ip addrlabel list |grep -q "prefix dead::/64 dev lo label 1"
265         check_err $?
266
267         ip addrlabel del prefix dead::/64 dev lo label 1 2> /dev/null
268         check_err $?
269
270         ip addrlabel add prefix dead::/64 label 1 2> /dev/null
271         check_err $?
272
273         ip addrlabel del prefix dead::/64 label 1 2> /dev/null
274         check_err $?
275
276         # concurrent add/delete
277         for i in $(seq 1 1000); do
278                 ip addrlabel add prefix 1c3::/64 label 12345 2>/dev/null
279         done &
280
281         for i in $(seq 1 1000); do
282                 ip addrlabel del prefix 1c3::/64 label 12345 2>/dev/null
283         done
284
285         wait
286
287         ip addrlabel del prefix 1c3::/64 label 12345 2>/dev/null
288
289         if [ $ret -ne 0 ];then
290                 echo "FAIL: ipv6 addrlabel"
291                 return 1
292         fi
293
294         echo "PASS: ipv6 addrlabel"
295 }
296
297 kci_test_ifalias()
298 {
299         ret=0
300         namewant=$(uuidgen)
301         syspathname="/sys/class/net/$devdummy/ifalias"
302
303         ip link set dev "$devdummy" alias "$namewant"
304         check_err $?
305
306         if [ $ret -ne 0 ]; then
307                 echo "FAIL: cannot set interface alias of $devdummy to $namewant"
308                 return 1
309         fi
310
311         ip link show "$devdummy" | grep -q "alias $namewant"
312         check_err $?
313
314         if [ -r "$syspathname" ] ; then
315                 read namehave < "$syspathname"
316                 if [ "$namewant" != "$namehave" ]; then
317                         echo "FAIL: did set ifalias $namewant but got $namehave"
318                         return 1
319                 fi
320
321                 namewant=$(uuidgen)
322                 echo "$namewant" > "$syspathname"
323                 ip link show "$devdummy" | grep -q "alias $namewant"
324                 check_err $?
325
326                 # sysfs interface allows to delete alias again
327                 echo "" > "$syspathname"
328
329                 ip link show "$devdummy" | grep -q "alias $namewant"
330                 check_fail $?
331
332                 for i in $(seq 1 100); do
333                         uuidgen > "$syspathname" &
334                 done
335
336                 wait
337
338                 # re-add the alias -- kernel should free mem when dummy dev is removed
339                 ip link set dev "$devdummy" alias "$namewant"
340                 check_err $?
341         fi
342
343         if [ $ret -ne 0 ]; then
344                 echo "FAIL: set interface alias $devdummy to $namewant"
345                 return 1
346         fi
347
348         echo "PASS: set ifalias $namewant for $devdummy"
349 }
350
351 kci_test_vrf()
352 {
353         vrfname="test-vrf"
354         ret=0
355
356         ip link show type vrf 2>/dev/null
357         if [ $? -ne 0 ]; then
358                 echo "SKIP: vrf: iproute2 too old"
359                 return $ksft_skip
360         fi
361
362         ip link add "$vrfname" type vrf table 10
363         check_err $?
364         if [ $ret -ne 0 ];then
365                 echo "FAIL: can't add vrf interface, skipping test"
366                 return 0
367         fi
368
369         ip -br link show type vrf | grep -q "$vrfname"
370         check_err $?
371         if [ $ret -ne 0 ];then
372                 echo "FAIL: created vrf device not found"
373                 return 1
374         fi
375
376         ip link set dev "$vrfname" up
377         check_err $?
378
379         ip link set dev "$devdummy" master "$vrfname"
380         check_err $?
381         ip link del dev "$vrfname"
382         check_err $?
383
384         if [ $ret -ne 0 ];then
385                 echo "FAIL: vrf"
386                 return 1
387         fi
388
389         echo "PASS: vrf"
390 }
391
392 kci_test_encap_vxlan()
393 {
394         ret=0
395         vxlan="test-vxlan0"
396         vlan="test-vlan0"
397         testns="$1"
398
399         ip netns exec "$testns" ip link add "$vxlan" type vxlan id 42 group 239.1.1.1 \
400                 dev "$devdummy" dstport 4789 2>/dev/null
401         if [ $? -ne 0 ]; then
402                 echo "FAIL: can't add vxlan interface, skipping test"
403                 return 0
404         fi
405         check_err $?
406
407         ip netns exec "$testns" ip addr add 10.2.11.49/24 dev "$vxlan"
408         check_err $?
409
410         ip netns exec "$testns" ip link set up dev "$vxlan"
411         check_err $?
412
413         ip netns exec "$testns" ip link add link "$vxlan" name "$vlan" type vlan id 1
414         check_err $?
415
416         ip netns exec "$testns" ip link del "$vxlan"
417         check_err $?
418
419         if [ $ret -ne 0 ]; then
420                 echo "FAIL: vxlan"
421                 return 1
422         fi
423         echo "PASS: vxlan"
424 }
425
426 kci_test_encap_fou()
427 {
428         ret=0
429         name="test-fou"
430         testns="$1"
431
432         ip fou help 2>&1 |grep -q 'Usage: ip fou'
433         if [ $? -ne 0 ];then
434                 echo "SKIP: fou: iproute2 too old"
435                 return $ksft_skip
436         fi
437
438         ip netns exec "$testns" ip fou add port 7777 ipproto 47 2>/dev/null
439         if [ $? -ne 0 ];then
440                 echo "FAIL: can't add fou port 7777, skipping test"
441                 return 1
442         fi
443
444         ip netns exec "$testns" ip fou add port 8888 ipproto 4
445         check_err $?
446
447         ip netns exec "$testns" ip fou del port 9999 2>/dev/null
448         check_fail $?
449
450         ip netns exec "$testns" ip fou del port 7777
451         check_err $?
452
453         if [ $ret -ne 0 ]; then
454                 echo "FAIL: fou"
455                 return 1
456         fi
457
458         echo "PASS: fou"
459 }
460
461 # test various encap methods, use netns to avoid unwanted interference
462 kci_test_encap()
463 {
464         testns="testns"
465         ret=0
466
467         ip netns add "$testns"
468         if [ $? -ne 0 ]; then
469                 echo "SKIP encap tests: cannot add net namespace $testns"
470                 return $ksft_skip
471         fi
472
473         ip netns exec "$testns" ip link set lo up
474         check_err $?
475
476         ip netns exec "$testns" ip link add name "$devdummy" type dummy
477         check_err $?
478         ip netns exec "$testns" ip link set "$devdummy" up
479         check_err $?
480
481         kci_test_encap_vxlan "$testns"
482         kci_test_encap_fou "$testns"
483
484         ip netns del "$testns"
485 }
486
487 kci_test_macsec()
488 {
489         msname="test_macsec0"
490         ret=0
491
492         ip macsec help 2>&1 | grep -q "^Usage: ip macsec"
493         if [ $? -ne 0 ]; then
494                 echo "SKIP: macsec: iproute2 too old"
495                 return $ksft_skip
496         fi
497
498         ip link add link "$devdummy" "$msname" type macsec port 42 encrypt on
499         check_err $?
500         if [ $ret -ne 0 ];then
501                 echo "FAIL: can't add macsec interface, skipping test"
502                 return 1
503         fi
504
505         ip macsec add "$msname" tx sa 0 pn 1024 on key 01 12345678901234567890123456789012
506         check_err $?
507
508         ip macsec add "$msname" rx port 1234 address "1c:ed:de:ad:be:ef"
509         check_err $?
510
511         ip macsec add "$msname" rx port 1234 address "1c:ed:de:ad:be:ef" sa 0 pn 1 on key 00 0123456789abcdef0123456789abcdef
512         check_err $?
513
514         ip macsec show > /dev/null
515         check_err $?
516
517         ip link del dev "$msname"
518         check_err $?
519
520         if [ $ret -ne 0 ];then
521                 echo "FAIL: macsec"
522                 return 1
523         fi
524
525         echo "PASS: macsec"
526 }
527
528 #-------------------------------------------------------------------
529 # Example commands
530 #   ip x s add proto esp src 14.0.0.52 dst 14.0.0.70 \
531 #            spi 0x07 mode transport reqid 0x07 replay-window 32 \
532 #            aead 'rfc4106(gcm(aes))' 1234567890123456dcba 128 \
533 #            sel src 14.0.0.52/24 dst 14.0.0.70/24
534 #   ip x p add dir out src 14.0.0.52/24 dst 14.0.0.70/24 \
535 #            tmpl proto esp src 14.0.0.52 dst 14.0.0.70 \
536 #            spi 0x07 mode transport reqid 0x07
537 #
538 # Subcommands not tested
539 #    ip x s update
540 #    ip x s allocspi
541 #    ip x s deleteall
542 #    ip x p update
543 #    ip x p deleteall
544 #    ip x p set
545 #-------------------------------------------------------------------
546 kci_test_ipsec()
547 {
548         ret=0
549         algo="aead rfc4106(gcm(aes)) 0x3132333435363738393031323334353664636261 128"
550         srcip=192.168.123.1
551         dstip=192.168.123.2
552         spi=7
553
554         ip addr add $srcip dev $devdummy
555
556         # flush to be sure there's nothing configured
557         ip x s flush ; ip x p flush
558         check_err $?
559
560         # start the monitor in the background
561         tmpfile=`mktemp /var/run/ipsectestXXX`
562         mpid=`(ip x m > $tmpfile & echo $!) 2>/dev/null`
563         sleep 0.2
564
565         ipsecid="proto esp src $srcip dst $dstip spi 0x07"
566         ip x s add $ipsecid \
567             mode transport reqid 0x07 replay-window 32 \
568             $algo sel src $srcip/24 dst $dstip/24
569         check_err $?
570
571         lines=`ip x s list | grep $srcip | grep $dstip | wc -l`
572         test $lines -eq 2
573         check_err $?
574
575         ip x s count | grep -q "SAD count 1"
576         check_err $?
577
578         lines=`ip x s get $ipsecid | grep $srcip | grep $dstip | wc -l`
579         test $lines -eq 2
580         check_err $?
581
582         ip x s delete $ipsecid
583         check_err $?
584
585         lines=`ip x s list | wc -l`
586         test $lines -eq 0
587         check_err $?
588
589         ipsecsel="dir out src $srcip/24 dst $dstip/24"
590         ip x p add $ipsecsel \
591                     tmpl proto esp src $srcip dst $dstip \
592                     spi 0x07 mode transport reqid 0x07
593         check_err $?
594
595         lines=`ip x p list | grep $srcip | grep $dstip | wc -l`
596         test $lines -eq 2
597         check_err $?
598
599         ip x p count | grep -q "SPD IN  0 OUT 1 FWD 0"
600         check_err $?
601
602         lines=`ip x p get $ipsecsel | grep $srcip | grep $dstip | wc -l`
603         test $lines -eq 2
604         check_err $?
605
606         ip x p delete $ipsecsel
607         check_err $?
608
609         lines=`ip x p list | wc -l`
610         test $lines -eq 0
611         check_err $?
612
613         # check the monitor results
614         kill $mpid
615         lines=`wc -l $tmpfile | cut "-d " -f1`
616         test $lines -eq 20
617         check_err $?
618         rm -rf $tmpfile
619
620         # clean up any leftovers
621         ip x s flush
622         check_err $?
623         ip x p flush
624         check_err $?
625         ip addr del $srcip/32 dev $devdummy
626
627         if [ $ret -ne 0 ]; then
628                 echo "FAIL: ipsec"
629                 return 1
630         fi
631         echo "PASS: ipsec"
632 }
633
634 #-------------------------------------------------------------------
635 # Example commands
636 #   ip x s add proto esp src 14.0.0.52 dst 14.0.0.70 \
637 #            spi 0x07 mode transport reqid 0x07 replay-window 32 \
638 #            aead 'rfc4106(gcm(aes))' 1234567890123456dcba 128 \
639 #            sel src 14.0.0.52/24 dst 14.0.0.70/24
640 #            offload dev sim1 dir out
641 #   ip x p add dir out src 14.0.0.52/24 dst 14.0.0.70/24 \
642 #            tmpl proto esp src 14.0.0.52 dst 14.0.0.70 \
643 #            spi 0x07 mode transport reqid 0x07
644 #
645 #-------------------------------------------------------------------
646 kci_test_ipsec_offload()
647 {
648         ret=0
649         algo="aead rfc4106(gcm(aes)) 0x3132333435363738393031323334353664636261 128"
650         srcip=192.168.123.3
651         dstip=192.168.123.4
652         dev=simx1
653         sysfsd=/sys/kernel/debug/netdevsim/$dev
654         sysfsf=$sysfsd/ipsec
655
656         # setup netdevsim since dummydev doesn't have offload support
657         modprobe netdevsim
658         check_err $?
659         if [ $ret -ne 0 ]; then
660                 echo "FAIL: ipsec_offload can't load netdevsim"
661                 return 1
662         fi
663
664         ip link add $dev type netdevsim
665         ip addr add $srcip dev $dev
666         ip link set $dev up
667         if [ ! -d $sysfsd ] ; then
668                 echo "FAIL: ipsec_offload can't create device $dev"
669                 return 1
670         fi
671         if [ ! -f $sysfsf ] ; then
672                 echo "FAIL: ipsec_offload netdevsim doesn't support IPsec offload"
673                 return 1
674         fi
675
676         # flush to be sure there's nothing configured
677         ip x s flush ; ip x p flush
678
679         # create offloaded SAs, both in and out
680         ip x p add dir out src $srcip/24 dst $dstip/24 \
681             tmpl proto esp src $srcip dst $dstip spi 9 \
682             mode transport reqid 42
683         check_err $?
684         ip x p add dir out src $dstip/24 dst $srcip/24 \
685             tmpl proto esp src $dstip dst $srcip spi 9 \
686             mode transport reqid 42
687         check_err $?
688
689         ip x s add proto esp src $srcip dst $dstip spi 9 \
690             mode transport reqid 42 $algo sel src $srcip/24 dst $dstip/24 \
691             offload dev $dev dir out
692         check_err $?
693         ip x s add proto esp src $dstip dst $srcip spi 9 \
694             mode transport reqid 42 $algo sel src $dstip/24 dst $srcip/24 \
695             offload dev $dev dir in
696         check_err $?
697         if [ $ret -ne 0 ]; then
698                 echo "FAIL: ipsec_offload can't create SA"
699                 return 1
700         fi
701
702         # does offload show up in ip output
703         lines=`ip x s list | grep -c "crypto offload parameters: dev $dev dir"`
704         if [ $lines -ne 2 ] ; then
705                 echo "FAIL: ipsec_offload SA offload missing from list output"
706                 check_err 1
707         fi
708
709         # use ping to exercise the Tx path
710         ping -I $dev -c 3 -W 1 -i 0 $dstip >/dev/null
711
712         # does driver have correct offload info
713         diff $sysfsf - << EOF
714 SA count=2 tx=3
715 sa[0] tx ipaddr=0x00000000 00000000 00000000 00000000
716 sa[0]    spi=0x00000009 proto=0x32 salt=0x61626364 crypt=1
717 sa[0]    key=0x34333231 38373635 32313039 36353433
718 sa[1] rx ipaddr=0x00000000 00000000 00000000 037ba8c0
719 sa[1]    spi=0x00000009 proto=0x32 salt=0x61626364 crypt=1
720 sa[1]    key=0x34333231 38373635 32313039 36353433
721 EOF
722         if [ $? -ne 0 ] ; then
723                 echo "FAIL: ipsec_offload incorrect driver data"
724                 check_err 1
725         fi
726
727         # does offload get removed from driver
728         ip x s flush
729         ip x p flush
730         lines=`grep -c "SA count=0" $sysfsf`
731         if [ $lines -ne 1 ] ; then
732                 echo "FAIL: ipsec_offload SA not removed from driver"
733                 check_err 1
734         fi
735
736         # clean up any leftovers
737         ip link del $dev
738         rmmod netdevsim
739
740         if [ $ret -ne 0 ]; then
741                 echo "FAIL: ipsec_offload"
742                 return 1
743         fi
744         echo "PASS: ipsec_offload"
745 }
746
747 kci_test_gretap()
748 {
749         testns="testns"
750         DEV_NS=gretap00
751         ret=0
752
753         ip netns add "$testns"
754         if [ $? -ne 0 ]; then
755                 echo "SKIP gretap tests: cannot add net namespace $testns"
756                 return $ksft_skip
757         fi
758
759         ip link help gretap 2>&1 | grep -q "^Usage:"
760         if [ $? -ne 0 ];then
761                 echo "SKIP: gretap: iproute2 too old"
762                 ip netns del "$testns"
763                 return $ksft_skip
764         fi
765
766         # test native tunnel
767         ip netns exec "$testns" ip link add dev "$DEV_NS" type gretap seq \
768                 key 102 local 172.16.1.100 remote 172.16.1.200
769         check_err $?
770
771         ip netns exec "$testns" ip addr add dev "$DEV_NS" 10.1.1.100/24
772         check_err $?
773
774         ip netns exec "$testns" ip link set dev $DEV_NS up
775         check_err $?
776
777         ip netns exec "$testns" ip link del "$DEV_NS"
778         check_err $?
779
780         # test external mode
781         ip netns exec "$testns" ip link add dev "$DEV_NS" type gretap external
782         check_err $?
783
784         ip netns exec "$testns" ip link del "$DEV_NS"
785         check_err $?
786
787         if [ $ret -ne 0 ]; then
788                 echo "FAIL: gretap"
789                 ip netns del "$testns"
790                 return 1
791         fi
792         echo "PASS: gretap"
793
794         ip netns del "$testns"
795 }
796
797 kci_test_ip6gretap()
798 {
799         testns="testns"
800         DEV_NS=ip6gretap00
801         ret=0
802
803         ip netns add "$testns"
804         if [ $? -ne 0 ]; then
805                 echo "SKIP ip6gretap tests: cannot add net namespace $testns"
806                 return $ksft_skip
807         fi
808
809         ip link help ip6gretap 2>&1 | grep -q "^Usage:"
810         if [ $? -ne 0 ];then
811                 echo "SKIP: ip6gretap: iproute2 too old"
812                 ip netns del "$testns"
813                 return $ksft_skip
814         fi
815
816         # test native tunnel
817         ip netns exec "$testns" ip link add dev "$DEV_NS" type ip6gretap seq \
818                 key 102 local fc00:100::1 remote fc00:100::2
819         check_err $?
820
821         ip netns exec "$testns" ip addr add dev "$DEV_NS" fc00:200::1/96
822         check_err $?
823
824         ip netns exec "$testns" ip link set dev $DEV_NS up
825         check_err $?
826
827         ip netns exec "$testns" ip link del "$DEV_NS"
828         check_err $?
829
830         # test external mode
831         ip netns exec "$testns" ip link add dev "$DEV_NS" type ip6gretap external
832         check_err $?
833
834         ip netns exec "$testns" ip link del "$DEV_NS"
835         check_err $?
836
837         if [ $ret -ne 0 ]; then
838                 echo "FAIL: ip6gretap"
839                 ip netns del "$testns"
840                 return 1
841         fi
842         echo "PASS: ip6gretap"
843
844         ip netns del "$testns"
845 }
846
847 kci_test_erspan()
848 {
849         testns="testns"
850         DEV_NS=erspan00
851         ret=0
852
853         ip link help erspan 2>&1 | grep -q "^Usage:"
854         if [ $? -ne 0 ];then
855                 echo "SKIP: erspan: iproute2 too old"
856                 return $ksft_skip
857         fi
858
859         ip netns add "$testns"
860         if [ $? -ne 0 ]; then
861                 echo "SKIP erspan tests: cannot add net namespace $testns"
862                 return $ksft_skip
863         fi
864
865         # test native tunnel erspan v1
866         ip netns exec "$testns" ip link add dev "$DEV_NS" type erspan seq \
867                 key 102 local 172.16.1.100 remote 172.16.1.200 \
868                 erspan_ver 1 erspan 488
869         check_err $?
870
871         ip netns exec "$testns" ip addr add dev "$DEV_NS" 10.1.1.100/24
872         check_err $?
873
874         ip netns exec "$testns" ip link set dev $DEV_NS up
875         check_err $?
876
877         ip netns exec "$testns" ip link del "$DEV_NS"
878         check_err $?
879
880         # test native tunnel erspan v2
881         ip netns exec "$testns" ip link add dev "$DEV_NS" type erspan seq \
882                 key 102 local 172.16.1.100 remote 172.16.1.200 \
883                 erspan_ver 2 erspan_dir ingress erspan_hwid 7
884         check_err $?
885
886         ip netns exec "$testns" ip addr add dev "$DEV_NS" 10.1.1.100/24
887         check_err $?
888
889         ip netns exec "$testns" ip link set dev $DEV_NS up
890         check_err $?
891
892         ip netns exec "$testns" ip link del "$DEV_NS"
893         check_err $?
894
895         # test external mode
896         ip netns exec "$testns" ip link add dev "$DEV_NS" type erspan external
897         check_err $?
898
899         ip netns exec "$testns" ip link del "$DEV_NS"
900         check_err $?
901
902         if [ $ret -ne 0 ]; then
903                 echo "FAIL: erspan"
904                 ip netns del "$testns"
905                 return 1
906         fi
907         echo "PASS: erspan"
908
909         ip netns del "$testns"
910 }
911
912 kci_test_ip6erspan()
913 {
914         testns="testns"
915         DEV_NS=ip6erspan00
916         ret=0
917
918         ip link help ip6erspan 2>&1 | grep -q "^Usage:"
919         if [ $? -ne 0 ];then
920                 echo "SKIP: ip6erspan: iproute2 too old"
921                 return $ksft_skip
922         fi
923
924         ip netns add "$testns"
925         if [ $? -ne 0 ]; then
926                 echo "SKIP ip6erspan tests: cannot add net namespace $testns"
927                 return $ksft_skip
928         fi
929
930         # test native tunnel ip6erspan v1
931         ip netns exec "$testns" ip link add dev "$DEV_NS" type ip6erspan seq \
932                 key 102 local fc00:100::1 remote fc00:100::2 \
933                 erspan_ver 1 erspan 488
934         check_err $?
935
936         ip netns exec "$testns" ip addr add dev "$DEV_NS" 10.1.1.100/24
937         check_err $?
938
939         ip netns exec "$testns" ip link set dev $DEV_NS up
940         check_err $?
941
942         ip netns exec "$testns" ip link del "$DEV_NS"
943         check_err $?
944
945         # test native tunnel ip6erspan v2
946         ip netns exec "$testns" ip link add dev "$DEV_NS" type ip6erspan seq \
947                 key 102 local fc00:100::1 remote fc00:100::2 \
948                 erspan_ver 2 erspan_dir ingress erspan_hwid 7
949         check_err $?
950
951         ip netns exec "$testns" ip addr add dev "$DEV_NS" 10.1.1.100/24
952         check_err $?
953
954         ip netns exec "$testns" ip link set dev $DEV_NS up
955         check_err $?
956
957         ip netns exec "$testns" ip link del "$DEV_NS"
958         check_err $?
959
960         # test external mode
961         ip netns exec "$testns" ip link add dev "$DEV_NS" \
962                 type ip6erspan external
963         check_err $?
964
965         ip netns exec "$testns" ip link del "$DEV_NS"
966         check_err $?
967
968         if [ $ret -ne 0 ]; then
969                 echo "FAIL: ip6erspan"
970                 ip netns del "$testns"
971                 return 1
972         fi
973         echo "PASS: ip6erspan"
974
975         ip netns del "$testns"
976 }
977
978 kci_test_rtnl()
979 {
980         kci_add_dummy
981         if [ $ret -ne 0 ];then
982                 echo "FAIL: cannot add dummy interface"
983                 return 1
984         fi
985
986         kci_test_polrouting
987         kci_test_route_get
988         kci_test_addrlft
989         kci_test_tc
990         kci_test_gre
991         kci_test_gretap
992         kci_test_ip6gretap
993         kci_test_erspan
994         kci_test_ip6erspan
995         kci_test_bridge
996         kci_test_addrlabel
997         kci_test_ifalias
998         kci_test_vrf
999         kci_test_encap
1000         kci_test_macsec
1001         kci_test_ipsec
1002         kci_test_ipsec_offload
1003
1004         kci_del_dummy
1005 }
1006
1007 #check for needed privileges
1008 if [ "$(id -u)" -ne 0 ];then
1009         echo "SKIP: Need root privileges"
1010         exit $ksft_skip
1011 fi
1012
1013 for x in ip tc;do
1014         $x -Version 2>/dev/null >/dev/null
1015         if [ $? -ne 0 ];then
1016                 echo "SKIP: Could not run test without the $x tool"
1017                 exit $ksft_skip
1018         fi
1019 done
1020
1021 kci_test_rtnl
1022
1023 exit $ret