selftests: netdevsim: fix the udp_tunnel_nic test
[platform/kernel/linux-starfive.git] / tools / testing / selftests / drivers / net / netdevsim / udp_tunnel_nic.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0-only
3
4 VNI_GEN=$RANDOM
5 NSIM_ID=$((RANDOM % 1024))
6 NSIM_DEV_SYS=/sys/bus/netdevsim/devices/netdevsim$NSIM_ID
7 NSIM_DEV_DFS=/sys/kernel/debug/netdevsim/netdevsim$NSIM_ID
8 NSIM_NETDEV=
9 HAS_ETHTOOL=
10 STATIC_ENTRIES=
11 EXIT_STATUS=0
12 num_cases=0
13 num_errors=0
14
15 clean_up_devs=( )
16
17 function err_cnt {
18     echo "ERROR:" $@
19     EXIT_STATUS=1
20     ((num_errors++))
21     ((num_cases++))
22 }
23
24 function pass_cnt {
25     ((num_cases++))
26 }
27
28 function cleanup_tuns {
29     for dev in "${clean_up_devs[@]}"; do
30         [ -e /sys/class/net/$dev ] && ip link del dev $dev
31     done
32     clean_up_devs=( )
33 }
34
35 function cleanup_nsim {
36     if [ -e $NSIM_DEV_SYS ]; then
37         echo $NSIM_ID > /sys/bus/netdevsim/del_device
38     fi
39 }
40
41 function cleanup {
42     cleanup_tuns
43     cleanup_nsim
44 }
45
46 trap cleanup EXIT
47
48 function new_vxlan {
49     local dev=$1
50     local dstport=$2
51     local lower=$3
52     local ipver=$4
53     local flags=$5
54
55     local group ipfl
56
57     [ "$ipver" != '6' ] && group=239.1.1.1 || group=fff1::1
58     [ "$ipver" != '6' ] || ipfl="-6"
59
60     [[ ! "$flags" =~ "external" ]] && flags="$flags id $((VNI_GEN++))"
61
62     ip $ipfl link add $dev type vxlan \
63        group $group \
64        dev $lower \
65        dstport $dstport \
66        $flags
67
68     ip link set dev $dev up
69
70     clean_up_devs=("${clean_up_devs[@]}" $dev)
71
72     check_tables
73 }
74
75 function new_geneve {
76     local dev=$1
77     local dstport=$2
78     local ipver=$3
79     local flags=$4
80
81     local group ipfl
82
83     [ "$ipver" != '6' ] && remote=1.1.1.2 || group=::2
84     [ "$ipver" != '6' ] || ipfl="-6"
85
86     [[ ! "$flags" =~ "external" ]] && flags="$flags vni $((VNI_GEN++))"
87
88     ip $ipfl link add $dev type geneve \
89        remote $remote  \
90        dstport $dstport \
91        $flags
92
93     ip link set dev $dev up
94
95     clean_up_devs=("${clean_up_devs[@]}" $dev)
96
97     check_tables
98 }
99
100 function del_dev {
101     local dev=$1
102
103     ip link del dev $dev
104     check_tables
105 }
106
107 # Helpers for netdevsim port/type encoding
108 function mke {
109     local port=$1
110     local type=$2
111
112     echo $((port << 16 | type))
113 }
114
115 function pre {
116     local val=$1
117
118     echo -e "port: $((val >> 16))\ttype: $((val & 0xffff))"
119 }
120
121 function pre_ethtool {
122     local val=$1
123     local port=$((val >> 16))
124     local type=$((val & 0xffff))
125
126     case $type in
127         1)
128             type_name="vxlan"
129             ;;
130         2)
131             type_name="geneve"
132             ;;
133         4)
134             type_name="vxlan-gpe"
135             ;;
136         *)
137             type_name="bit X"
138             ;;
139     esac
140
141     echo "port $port, $type_name"
142 }
143
144 function check_table {
145     local path=$NSIM_DEV_DFS/ports/$port/udp_ports_table$1
146     local -n expected=$2
147     local last=$3
148
149     read -a have < $path
150
151     if [ ${#expected[@]} -ne ${#have[@]} ]; then
152         echo "check_table: BAD NUMBER OF ITEMS"
153         return 0
154     fi
155
156     for i in "${!expected[@]}"; do
157         if [ -n "$HAS_ETHTOOL" -a ${expected[i]} -ne 0 ]; then
158             pp_expected=`pre_ethtool ${expected[i]}`
159             ethtool --show-tunnels $NSIM_NETDEV | grep "$pp_expected" >/dev/null
160             if [ $? -ne 0 -a $last -ne 0 ]; then
161                 err_cnt "ethtool table $1 on port $port: $pfx - $msg"
162                 echo "       check_table: ethtool does not contain '$pp_expected'"
163                 ethtool --show-tunnels $NSIM_NETDEV
164                 return 0
165
166             fi
167         fi
168
169         if [ ${expected[i]} != ${have[i]} ]; then
170             if [ $last -ne 0 ]; then
171                 err_cnt "table $1 on port $port: $pfx - $msg"
172                 echo "       check_table: wrong entry $i"
173                 echo "       expected: `pre ${expected[i]}`"
174                 echo "       have:     `pre ${have[i]}`"
175                 return 0
176             fi
177             return 1
178         fi
179     done
180
181     pass_cnt
182     return 0
183 }
184
185 function check_tables {
186     # Need retries in case we have workqueue making the changes
187     local retries=10
188
189     while ! check_table 0 exp0 $((retries == 0)); do
190         sleep 0.02
191         ((retries--))
192     done
193     while ! check_table 1 exp1 $((retries == 0)); do
194         sleep 0.02
195         ((retries--))
196     done
197
198     if [ -n "$HAS_ETHTOOL" -a -n "${STATIC_ENTRIES[0]}" ]; then
199         fail=0
200         for i in "${!STATIC_ENTRIES[@]}"; do
201             pp_expected=`pre_ethtool ${STATIC_ENTRIES[i]}`
202             cnt=$(ethtool --show-tunnels $NSIM_NETDEV | grep -c "$pp_expected")
203             if [ $cnt -ne 1 ]; then
204                 err_cnt "ethtool static entry: $pfx - $msg"
205                 echo "       check_table: ethtool does not contain '$pp_expected'"
206                 ethtool --show-tunnels $NSIM_NETDEV
207                 fail=1
208             fi
209         done
210         [ $fail == 0 ] && pass_cnt
211     fi
212 }
213
214 function print_table {
215     local path=$NSIM_DEV_DFS/ports/$port/udp_ports_table$1
216     read -a have < $path
217
218     tree $NSIM_DEV_DFS/
219
220     echo "Port $port table $1:"
221
222     for i in "${!have[@]}"; do
223         echo "    `pre ${have[i]}`"
224     done
225
226 }
227
228 function print_tables {
229     print_table 0
230     print_table 1
231 }
232
233 function get_netdev_name {
234     local -n old=$1
235
236     new=$(ls /sys/class/net)
237
238     for netdev in $new; do
239         for check in $old; do
240             [ $netdev == $check ] && break
241         done
242
243         if [ $netdev != $check ]; then
244             echo $netdev
245             break
246         fi
247     done
248 }
249
250 ###
251 ### Code start
252 ###
253
254 # Probe ethtool support
255 ethtool -h | grep show-tunnels 2>&1 >/dev/null && HAS_ETHTOOL=y
256
257 modprobe netdevsim
258
259 # Basic test
260 pfx="basic"
261
262 for port in 0 1; do
263     old_netdevs=$(ls /sys/class/net)
264     if [ $port -eq 0 ]; then
265         echo $NSIM_ID > /sys/bus/netdevsim/new_device
266     else
267         echo 1 > $NSIM_DEV_DFS/udp_ports_open_only
268         echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
269         echo 1 > $NSIM_DEV_SYS/new_port
270     fi
271     NSIM_NETDEV=`get_netdev_name old_netdevs`
272     ifconfig $NSIM_NETDEV up
273
274     msg="new NIC device created"
275     exp0=( 0 0 0 0 )
276     exp1=( 0 0 0 0 )
277     check_tables
278
279     msg="VxLAN v4 devices"
280     exp0=( `mke 4789 1` 0 0 0 )
281     new_vxlan vxlan0 4789 $NSIM_NETDEV
282     new_vxlan vxlan1 4789 $NSIM_NETDEV
283
284     msg="VxLAN v4 devices go down"
285     exp0=( 0 0 0 0 )
286     ifconfig vxlan1 down
287     ifconfig vxlan0 down
288     check_tables
289
290     msg="VxLAN v6 devices"
291     exp0=( `mke 4789 1` 0 0 0 )
292     new_vxlan vxlanA 4789 $NSIM_NETDEV 6
293
294     for ifc in vxlan0 vxlan1; do
295         ifconfig $ifc up
296     done
297
298     new_vxlan vxlanB 4789 $NSIM_NETDEV 6
299
300     msg="another VxLAN v6 devices"
301     exp0=( `mke 4789 1` `mke 4790 1` 0 0 )
302     new_vxlan vxlanC 4790 $NSIM_NETDEV 6
303
304     msg="Geneve device"
305     exp1=( `mke 6081 2` 0 0 0 )
306     new_geneve gnv0 6081
307
308     msg="NIC device goes down"
309     ifconfig $NSIM_NETDEV down
310     if [ $port -eq 1 ]; then
311         exp0=( 0 0 0 0 )
312         exp1=( 0 0 0 0 )
313     fi
314     check_tables
315     msg="NIC device goes up again"
316     ifconfig $NSIM_NETDEV up
317     exp0=( `mke 4789 1` `mke 4790 1` 0 0 )
318     exp1=( `mke 6081 2` 0 0 0 )
319     check_tables
320
321     cleanup_tuns
322
323     msg="tunnels destroyed"
324     exp0=( 0 0 0 0 )
325     exp1=( 0 0 0 0 )
326     check_tables
327
328     modprobe -r geneve
329     modprobe -r vxlan
330     modprobe -r udp_tunnel
331
332     check_tables
333 done
334
335 modprobe -r netdevsim
336
337 # Module tests
338 pfx="module tests"
339
340 if modinfo netdevsim | grep udp_tunnel >/dev/null; then
341     err_cnt "netdevsim depends on udp_tunnel"
342 else
343     pass_cnt
344 fi
345
346 modprobe netdevsim
347
348 old_netdevs=$(ls /sys/class/net)
349 port=0
350 echo $NSIM_ID > /sys/bus/netdevsim/new_device
351 echo 0 > $NSIM_DEV_SYS/del_port
352 echo 1000 > $NSIM_DEV_DFS/udp_ports_sleep
353 echo 0 > $NSIM_DEV_SYS/new_port
354 NSIM_NETDEV=`get_netdev_name old_netdevs`
355
356 msg="create VxLANs"
357 exp0=( 0 0 0 0 ) # sleep is longer than out wait
358 new_vxlan vxlan0 10000 $NSIM_NETDEV
359
360 modprobe -r vxlan
361 modprobe -r udp_tunnel
362
363 msg="remove tunnels"
364 exp0=( 0 0 0 0 )
365 check_tables
366
367 msg="create VxLANs"
368 exp0=( 0 0 0 0 ) # sleep is longer than out wait
369 new_vxlan vxlan0 10000 $NSIM_NETDEV
370
371 exp0=( 0 0 0 0 )
372
373 modprobe -r netdevsim
374 modprobe netdevsim
375
376 # Overflow the table
377
378 function overflow_table0 {
379     local pfx=$1
380
381     msg="create VxLANs 1/5"
382     exp0=( `mke 10000 1` 0 0 0 )
383     new_vxlan vxlan0 10000 $NSIM_NETDEV
384
385     msg="create VxLANs 2/5"
386     exp0=( `mke 10000 1` `mke 10001 1` 0 0 )
387     new_vxlan vxlan1 10001 $NSIM_NETDEV
388
389     msg="create VxLANs 3/5"
390     exp0=( `mke 10000 1` `mke 10001 1` `mke 10002 1` 0 )
391     new_vxlan vxlan2 10002 $NSIM_NETDEV
392
393     msg="create VxLANs 4/5"
394     exp0=( `mke 10000 1` `mke 10001 1` `mke 10002 1` `mke 10003 1` )
395     new_vxlan vxlan3 10003 $NSIM_NETDEV
396
397     msg="create VxLANs 5/5"
398     new_vxlan vxlan4 10004 $NSIM_NETDEV
399 }
400
401 function overflow_table1 {
402     local pfx=$1
403
404     msg="create GENEVE 1/5"
405     exp1=( `mke 20000 2` 0 0 0 )
406     new_geneve gnv0 20000
407
408     msg="create GENEVE 2/5"
409     exp1=( `mke 20000 2` `mke 20001 2` 0 0 )
410     new_geneve gnv1 20001
411
412     msg="create GENEVE 3/5"
413     exp1=( `mke 20000 2` `mke 20001 2` `mke 20002 2` 0 )
414     new_geneve gnv2 20002
415
416     msg="create GENEVE 4/5"
417     exp1=( `mke 20000 2` `mke 20001 2` `mke 20002 2` `mke 20003 2` )
418     new_geneve gnv3 20003
419
420     msg="create GENEVE 5/5"
421     new_geneve gnv4 20004
422 }
423
424 echo $NSIM_ID > /sys/bus/netdevsim/new_device
425 echo 0 > $NSIM_DEV_SYS/del_port
426
427 for port in 0 1; do
428     if [ $port -ne 0 ]; then
429         echo 1 > $NSIM_DEV_DFS/udp_ports_open_only
430         echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
431     fi
432
433     echo $port > $NSIM_DEV_SYS/new_port
434     NSIM_NETDEV=`get_netdev_name old_netdevs`
435     ifconfig $NSIM_NETDEV up
436
437     overflow_table0 "overflow NIC table"
438     overflow_table1 "overflow NIC table"
439
440     msg="replace VxLAN in overflow table"
441     exp0=( `mke 10000 1` `mke 10004 1` `mke 10002 1` `mke 10003 1` )
442     del_dev vxlan1
443
444     msg="vacate VxLAN in overflow table"
445     exp0=( `mke 10000 1` `mke 10004 1` 0 `mke 10003 1` )
446     del_dev vxlan2
447
448     msg="replace GENEVE in overflow table"
449     exp1=( `mke 20000 2` `mke 20004 2` `mke 20002 2` `mke 20003 2` )
450     del_dev gnv1
451
452     msg="vacate GENEVE in overflow table"
453     exp1=( `mke 20000 2` `mke 20004 2` 0 `mke 20003 2` )
454     del_dev gnv2
455
456     msg="table sharing - share"
457     exp1=( `mke 20000 2` `mke 20004 2` `mke 30001 4` `mke 20003 2` )
458     new_vxlan vxlanG0 30001 $NSIM_NETDEV 4 "gpe external"
459
460     msg="table sharing - overflow"
461     new_vxlan vxlanG1 30002 $NSIM_NETDEV 4 "gpe external"
462     msg="table sharing - overflow v6"
463     new_vxlan vxlanG2 30002 $NSIM_NETDEV 6 "gpe external"
464
465     exp1=( `mke 20000 2` `mke 30002 4` `mke 30001 4` `mke 20003 2` )
466     del_dev gnv4
467
468     msg="destroy NIC"
469     echo $port > $NSIM_DEV_SYS/del_port
470
471     cleanup_tuns
472     exp0=( 0 0 0 0 )
473     exp1=( 0 0 0 0 )
474 done
475
476 cleanup_nsim
477
478 # Sync all
479 pfx="sync all"
480
481 echo $NSIM_ID > /sys/bus/netdevsim/new_device
482 echo 0 > $NSIM_DEV_SYS/del_port
483 echo 1 > $NSIM_DEV_DFS/udp_ports_sync_all
484
485 for port in 0 1; do
486     if [ $port -ne 0 ]; then
487         echo 1 > $NSIM_DEV_DFS/udp_ports_open_only
488         echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
489     fi
490
491     echo $port > $NSIM_DEV_SYS/new_port
492     NSIM_NETDEV=`get_netdev_name old_netdevs`
493     ifconfig $NSIM_NETDEV up
494
495     overflow_table0 "overflow NIC table"
496     overflow_table1 "overflow NIC table"
497
498     msg="replace VxLAN in overflow table"
499     exp0=( `mke 10000 1` `mke 10004 1` `mke 10002 1` `mke 10003 1` )
500     del_dev vxlan1
501
502     msg="vacate VxLAN in overflow table"
503     exp0=( `mke 10000 1` `mke 10004 1` 0 `mke 10003 1` )
504     del_dev vxlan2
505
506     msg="replace GENEVE in overflow table"
507     exp1=( `mke 20000 2` `mke 20004 2` `mke 20002 2` `mke 20003 2` )
508     del_dev gnv1
509
510     msg="vacate GENEVE in overflow table"
511     exp1=( `mke 20000 2` `mke 20004 2` 0 `mke 20003 2` )
512     del_dev gnv2
513
514     msg="table sharing - share"
515     exp1=( `mke 20000 2` `mke 20004 2` `mke 30001 4` `mke 20003 2` )
516     new_vxlan vxlanG0 30001 $NSIM_NETDEV 4 "gpe external"
517
518     msg="table sharing - overflow"
519     new_vxlan vxlanG1 30002 $NSIM_NETDEV 4 "gpe external"
520     msg="table sharing - overflow v6"
521     new_vxlan vxlanG2 30002 $NSIM_NETDEV 6 "gpe external"
522
523     exp1=( `mke 20000 2` `mke 30002 4` `mke 30001 4` `mke 20003 2` )
524     del_dev gnv4
525
526     msg="destroy NIC"
527     echo $port > $NSIM_DEV_SYS/del_port
528
529     cleanup_tuns
530     exp0=( 0 0 0 0 )
531     exp1=( 0 0 0 0 )
532 done
533
534 cleanup_nsim
535
536 # Destroy full NIC
537 pfx="destroy full"
538
539 echo $NSIM_ID > /sys/bus/netdevsim/new_device
540 echo 0 > $NSIM_DEV_SYS/del_port
541
542 for port in 0 1; do
543     if [ $port -ne 0 ]; then
544         echo 1 > $NSIM_DEV_DFS/udp_ports_open_only
545         echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
546     fi
547
548     echo $port > $NSIM_DEV_SYS/new_port
549     NSIM_NETDEV=`get_netdev_name old_netdevs`
550     ifconfig $NSIM_NETDEV up
551
552     overflow_table0 "destroy NIC"
553     overflow_table1 "destroy NIC"
554
555     msg="destroy NIC"
556     echo $port > $NSIM_DEV_SYS/del_port
557
558     cleanup_tuns
559     exp0=( 0 0 0 0 )
560     exp1=( 0 0 0 0 )
561 done
562
563 cleanup_nsim
564
565 # IPv4 only
566 pfx="IPv4 only"
567
568 echo $NSIM_ID > /sys/bus/netdevsim/new_device
569 echo 0 > $NSIM_DEV_SYS/del_port
570 echo 1 > $NSIM_DEV_DFS/udp_ports_ipv4_only
571
572 for port in 0 1; do
573     if [ $port -ne 0 ]; then
574         echo 1 > $NSIM_DEV_DFS/udp_ports_open_only
575         echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
576     fi
577
578     echo $port > $NSIM_DEV_SYS/new_port
579     NSIM_NETDEV=`get_netdev_name old_netdevs`
580     ifconfig $NSIM_NETDEV up
581
582     msg="create VxLANs v6"
583     new_vxlan vxlanA0 10000 $NSIM_NETDEV 6
584
585     msg="create VxLANs v6"
586     new_vxlan vxlanA1 10000 $NSIM_NETDEV 6
587
588     ip link set dev vxlanA0 down
589     ip link set dev vxlanA0 up
590     check_tables
591
592     msg="create VxLANs v4"
593     exp0=( `mke 10000 1` 0 0 0 )
594     new_vxlan vxlan0 10000 $NSIM_NETDEV
595
596     msg="down VxLANs v4"
597     exp0=( 0 0 0 0 )
598     ip link set dev vxlan0 down
599     check_tables
600
601     msg="up VxLANs v4"
602     exp0=( `mke 10000 1` 0 0 0 )
603     ip link set dev vxlan0 up
604     check_tables
605
606     msg="destroy VxLANs v4"
607     exp0=( 0 0 0 0 )
608     del_dev vxlan0
609
610     msg="recreate VxLANs v4"
611     exp0=( `mke 10000 1` 0 0 0 )
612     new_vxlan vxlan0 10000 $NSIM_NETDEV
613
614     del_dev vxlanA0
615     del_dev vxlanA1
616
617     msg="destroy NIC"
618     echo $port > $NSIM_DEV_SYS/del_port
619
620     cleanup_tuns
621     exp0=( 0 0 0 0 )
622     exp1=( 0 0 0 0 )
623 done
624
625 cleanup_nsim
626
627 # Failures
628 pfx="error injection"
629
630 echo $NSIM_ID > /sys/bus/netdevsim/new_device
631 echo 0 > $NSIM_DEV_SYS/del_port
632
633 for port in 0 1; do
634     if [ $port -ne 0 ]; then
635         echo 1 > $NSIM_DEV_DFS/udp_ports_open_only
636         echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
637     fi
638
639     echo $port > $NSIM_DEV_SYS/new_port
640     NSIM_NETDEV=`get_netdev_name old_netdevs`
641     ifconfig $NSIM_NETDEV up
642
643     echo 110 > $NSIM_DEV_DFS/ports/$port/udp_ports_inject_error
644
645     msg="1 - create VxLANs v6"
646     exp0=( 0 0 0 0 )
647     new_vxlan vxlanA0 10000 $NSIM_NETDEV 6
648
649     msg="1 - create VxLANs v4"
650     exp0=( `mke 10000 1` 0 0 0 )
651     new_vxlan vxlan0 10000 $NSIM_NETDEV
652
653     msg="1 - remove VxLANs v4"
654     del_dev vxlan0
655
656     msg="1 - remove VxLANs v6"
657     exp0=( 0 0 0 0 )
658     del_dev vxlanA0
659
660     msg="2 - create GENEVE"
661     exp1=( `mke 20000 2` 0 0 0 )
662     new_geneve gnv0 20000
663
664     msg="2 - destroy GENEVE"
665     echo 2 > $NSIM_DEV_DFS/ports/$port/udp_ports_inject_error
666     exp1=( `mke 20000 2` 0 0 0 )
667     del_dev gnv0
668
669     msg="2 - create second GENEVE"
670     exp1=( 0 `mke 20001 2` 0 0 )
671     new_geneve gnv0 20001
672
673     msg="destroy NIC"
674     echo $port > $NSIM_DEV_SYS/del_port
675
676     cleanup_tuns
677     exp0=( 0 0 0 0 )
678     exp1=( 0 0 0 0 )
679 done
680
681 cleanup_nsim
682
683 # netdev flags
684 pfx="netdev flags"
685
686 echo $NSIM_ID > /sys/bus/netdevsim/new_device
687 echo 0 > $NSIM_DEV_SYS/del_port
688
689 for port in 0 1; do
690     if [ $port -ne 0 ]; then
691         echo 1 > $NSIM_DEV_DFS/udp_ports_open_only
692         echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
693     fi
694
695     echo $port > $NSIM_DEV_SYS/new_port
696     NSIM_NETDEV=`get_netdev_name old_netdevs`
697     ifconfig $NSIM_NETDEV up
698
699     msg="create VxLANs v6"
700     exp0=( `mke 10000 1` 0 0 0 )
701     new_vxlan vxlanA0 10000 $NSIM_NETDEV 6
702
703     msg="create VxLANs v4"
704     new_vxlan vxlan0 10000 $NSIM_NETDEV
705
706     msg="turn off"
707     exp0=( 0 0 0 0 )
708     ethtool -K $NSIM_NETDEV rx-udp_tunnel-port-offload off
709     check_tables
710
711     msg="turn on"
712     exp0=( `mke 10000 1` 0 0 0 )
713     ethtool -K $NSIM_NETDEV rx-udp_tunnel-port-offload on
714     check_tables
715
716     msg="remove both"
717     del_dev vxlanA0
718     exp0=( 0 0 0 0 )
719     del_dev vxlan0
720     check_tables
721
722     ethtool -K $NSIM_NETDEV rx-udp_tunnel-port-offload off
723
724     msg="create VxLANs v4 - off"
725     exp0=( 0 0 0 0 )
726     new_vxlan vxlan0 10000 $NSIM_NETDEV
727
728     msg="created off - turn on"
729     exp0=( `mke 10000 1` 0 0 0 )
730     ethtool -K $NSIM_NETDEV rx-udp_tunnel-port-offload on
731     check_tables
732
733     msg="destroy NIC"
734     echo $port > $NSIM_DEV_SYS/del_port
735
736     cleanup_tuns
737     exp0=( 0 0 0 0 )
738     exp1=( 0 0 0 0 )
739 done
740
741 cleanup_nsim
742
743 # device initiated reset
744 pfx="reset notification"
745
746 echo $NSIM_ID > /sys/bus/netdevsim/new_device
747 echo 0 > $NSIM_DEV_SYS/del_port
748
749 for port in 0 1; do
750     if [ $port -ne 0 ]; then
751         echo 1 > $NSIM_DEV_DFS/udp_ports_open_only
752         echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
753     fi
754
755     echo $port > $NSIM_DEV_SYS/new_port
756     NSIM_NETDEV=`get_netdev_name old_netdevs`
757     ifconfig $NSIM_NETDEV up
758
759     msg="create VxLANs v6"
760     exp0=( `mke 10000 1` 0 0 0 )
761     new_vxlan vxlanA0 10000 $NSIM_NETDEV 6
762
763     msg="create VxLANs v4"
764     new_vxlan vxlan0 10000 $NSIM_NETDEV
765
766     echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
767     check_tables
768
769     msg="NIC device goes down"
770     ifconfig $NSIM_NETDEV down
771     if [ $port -eq 1 ]; then
772         exp0=( 0 0 0 0 )
773         exp1=( 0 0 0 0 )
774     fi
775     check_tables
776
777     echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
778     check_tables
779
780     msg="NIC device goes up again"
781     ifconfig $NSIM_NETDEV up
782     exp0=( `mke 10000 1` 0 0 0 )
783     check_tables
784
785     msg="remove both"
786     del_dev vxlanA0
787     exp0=( 0 0 0 0 )
788     del_dev vxlan0
789     check_tables
790
791     echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
792     check_tables
793
794     msg="destroy NIC"
795     echo $port > $NSIM_DEV_SYS/del_port
796
797     cleanup_tuns
798     exp0=( 0 0 0 0 )
799     exp1=( 0 0 0 0 )
800 done
801
802 cleanup_nsim
803
804 # shared port tables
805 pfx="table sharing"
806
807 echo $NSIM_ID > /sys/bus/netdevsim/new_device
808 echo 0 > $NSIM_DEV_SYS/del_port
809
810 echo 0 > $NSIM_DEV_DFS/udp_ports_open_only
811 echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
812 echo 1 > $NSIM_DEV_DFS/udp_ports_shared
813
814 old_netdevs=$(ls /sys/class/net)
815 echo 1 > $NSIM_DEV_SYS/new_port
816 NSIM_NETDEV=`get_netdev_name old_netdevs`
817 old_netdevs=$(ls /sys/class/net)
818 echo 2 > $NSIM_DEV_SYS/new_port
819 NSIM_NETDEV2=`get_netdev_name old_netdevs`
820
821 msg="VxLAN v4 devices"
822 exp0=( `mke 4789 1` 0 0 0 )
823 exp1=( 0 0 0 0 )
824 new_vxlan vxlan0 4789 $NSIM_NETDEV
825 new_vxlan vxlan1 4789 $NSIM_NETDEV2
826
827 msg="VxLAN v4 devices go down"
828 exp0=( 0 0 0 0 )
829 ifconfig vxlan1 down
830 ifconfig vxlan0 down
831 check_tables
832
833 for ifc in vxlan0 vxlan1; do
834     ifconfig $ifc up
835 done
836
837 msg="VxLAN v6 device"
838 exp0=( `mke 4789 1` `mke 4790 1` 0 0 )
839 new_vxlan vxlanC 4790 $NSIM_NETDEV 6
840
841 msg="Geneve device"
842 exp1=( `mke 6081 2` 0 0 0 )
843 new_geneve gnv0 6081
844
845 msg="NIC device goes down"
846 ifconfig $NSIM_NETDEV down
847 check_tables
848
849 msg="NIC device goes up again"
850 ifconfig $NSIM_NETDEV up
851 check_tables
852
853 for i in `seq 2`; do
854     msg="turn feature off - 1, rep $i"
855     ethtool -K $NSIM_NETDEV rx-udp_tunnel-port-offload off
856     check_tables
857
858     msg="turn feature off - 2, rep $i"
859     exp0=( 0 0 0 0 )
860     exp1=( 0 0 0 0 )
861     ethtool -K $NSIM_NETDEV2 rx-udp_tunnel-port-offload off
862     check_tables
863
864     msg="turn feature on - 1, rep $i"
865     exp0=( `mke 4789 1` `mke 4790 1` 0 0 )
866     exp1=( `mke 6081 2` 0 0 0 )
867     ethtool -K $NSIM_NETDEV rx-udp_tunnel-port-offload on
868     check_tables
869
870     msg="turn feature on - 2, rep $i"
871     ethtool -K $NSIM_NETDEV2 rx-udp_tunnel-port-offload on
872     check_tables
873 done
874
875 msg="tunnels destroyed 1"
876 cleanup_tuns
877 exp0=( 0 0 0 0 )
878 exp1=( 0 0 0 0 )
879 check_tables
880
881 overflow_table0 "overflow NIC table"
882
883 msg="re-add a port"
884
885 echo 2 > $NSIM_DEV_SYS/del_port
886 echo 2 > $NSIM_DEV_SYS/new_port
887 NSIM_NETDEV=`get_netdev_name old_netdevs`
888 check_tables
889
890 msg="replace VxLAN in overflow table"
891 exp0=( `mke 10000 1` `mke 10004 1` `mke 10002 1` `mke 10003 1` )
892 del_dev vxlan1
893
894 msg="vacate VxLAN in overflow table"
895 exp0=( `mke 10000 1` `mke 10004 1` 0 `mke 10003 1` )
896 del_dev vxlan2
897
898 echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
899 check_tables
900
901 msg="tunnels destroyed 2"
902 cleanup_tuns
903 exp0=( 0 0 0 0 )
904 exp1=( 0 0 0 0 )
905 check_tables
906
907 echo 1 > $NSIM_DEV_SYS/del_port
908 echo 2 > $NSIM_DEV_SYS/del_port
909
910 cleanup_nsim
911
912 # Static IANA port
913 pfx="static IANA vxlan"
914
915 echo $NSIM_ID > /sys/bus/netdevsim/new_device
916 echo 0 > $NSIM_DEV_SYS/del_port
917
918 echo 1 > $NSIM_DEV_DFS/udp_ports_static_iana_vxlan
919 STATIC_ENTRIES=( `mke 4789 1` )
920
921 port=1
922 old_netdevs=$(ls /sys/class/net)
923 echo $port > $NSIM_DEV_SYS/new_port
924 NSIM_NETDEV=`get_netdev_name old_netdevs`
925
926 msg="check empty"
927 exp0=( 0 0 0 0 )
928 exp1=( 0 0 0 0 )
929 check_tables
930
931 msg="add on static port"
932 new_vxlan vxlan0 4789 $NSIM_NETDEV
933 new_vxlan vxlan1 4789 $NSIM_NETDEV
934
935 msg="add on different port"
936 exp0=( `mke 4790 1` 0 0 0 )
937 new_vxlan vxlan2 4790 $NSIM_NETDEV
938
939 cleanup_tuns
940
941 msg="tunnels destroyed"
942 exp0=( 0 0 0 0 )
943 exp1=( 0 0 0 0 )
944 check_tables
945
946 msg="different type"
947 new_geneve gnv0 4789
948
949 cleanup_tuns
950 cleanup_nsim
951
952 # END
953
954 modprobe -r netdevsim
955
956 if [ $num_errors -eq 0 ]; then
957     echo "PASSED all $num_cases checks"
958 else
959     echo "FAILED $num_errors/$num_cases checks"
960 fi
961
962 exit $EXIT_STATUS