2 # SPDX-License-Identifier: GPL-2.0-only
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
28 function cleanup_tuns {
29 for dev in "${clean_up_devs[@]}"; do
30 [ -e /sys/class/net/$dev ] && ip link del dev $dev
35 function cleanup_nsim {
36 if [ -e $NSIM_DEV_SYS ]; then
37 echo $NSIM_ID > /sys/bus/netdevsim/del_device
57 [ "$ipver" != '6' ] && group=239.1.1.1 || group=fff1::1
58 [ "$ipver" != '6' ] || ipfl="-6"
60 [[ ! "$flags" =~ "external" ]] && flags="$flags id $((VNI_GEN++))"
62 ip $ipfl link add $dev type vxlan \
68 ip link set dev $dev up
70 clean_up_devs=("${clean_up_devs[@]}" $dev)
83 [ "$ipver" != '6' ] && remote=1.1.1.2 || group=::2
84 [ "$ipver" != '6' ] || ipfl="-6"
86 [[ ! "$flags" =~ "external" ]] && flags="$flags vni $((VNI_GEN++))"
88 ip $ipfl link add $dev type geneve \
93 ip link set dev $dev up
95 clean_up_devs=("${clean_up_devs[@]}" $dev)
107 # Helpers for netdevsim port/type encoding
112 echo $((port << 16 | type))
118 echo -e "port: $((val >> 16))\ttype: $((val & 0xffff))"
121 function pre_ethtool {
123 local port=$((val >> 16))
124 local type=$((val & 0xffff))
134 type_name="vxlan-gpe"
141 echo "port $port, $type_name"
144 function check_table {
145 local path=$NSIM_DEV_DFS/ports/$port/udp_ports_table$1
151 if [ ${#expected[@]} -ne ${#have[@]} ]; then
152 echo "check_table: BAD NUMBER OF ITEMS"
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
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]}`"
185 function check_tables {
186 # Need retries in case we have workqueue making the changes
189 while ! check_table 0 exp0 $((retries == 0)); do
193 while ! check_table 1 exp1 $((retries == 0)); do
198 if [ -n "$HAS_ETHTOOL" -a -n "${STATIC_ENTRIES[0]}" ]; then
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
210 [ $fail == 0 ] && pass_cnt
214 function print_table {
215 local path=$NSIM_DEV_DFS/ports/$port/udp_ports_table$1
220 echo "Port $port table $1:"
222 for i in "${!have[@]}"; do
223 echo " `pre ${have[i]}`"
228 function print_tables {
233 function get_netdev_name {
236 new=$(ls /sys/class/net)
238 for netdev in $new; do
239 for check in $old; do
240 [ $netdev == $check ] && break
243 if [ $netdev != $check ]; then
254 # Probe ethtool support
255 ethtool -h | grep show-tunnels 2>&1 >/dev/null && HAS_ETHTOOL=y
263 old_netdevs=$(ls /sys/class/net)
264 if [ $port -eq 0 ]; then
265 echo $NSIM_ID > /sys/bus/netdevsim/new_device
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
271 NSIM_NETDEV=`get_netdev_name old_netdevs`
273 msg="new NIC device created"
278 msg="VxLAN v4 devices"
279 exp0=( `mke 4789 1` 0 0 0 )
280 new_vxlan vxlan0 4789 $NSIM_NETDEV
281 new_vxlan vxlan1 4789 $NSIM_NETDEV
283 msg="VxLAN v4 devices go down"
289 msg="VxLAN v6 devices"
290 exp0=( `mke 4789 1` 0 0 0 )
291 new_vxlan vxlanA 4789 $NSIM_NETDEV 6
293 for ifc in vxlan0 vxlan1; do
297 new_vxlan vxlanB 4789 $NSIM_NETDEV 6
299 msg="another VxLAN v6 devices"
300 exp0=( `mke 4789 1` `mke 4790 1` 0 0 )
301 new_vxlan vxlanC 4790 $NSIM_NETDEV 6
304 exp1=( `mke 6081 2` 0 0 0 )
307 msg="NIC device goes down"
308 ifconfig $NSIM_NETDEV down
309 if [ $port -eq 1 ]; then
314 msg="NIC device goes up again"
315 ifconfig $NSIM_NETDEV up
316 exp0=( `mke 4789 1` `mke 4790 1` 0 0 )
317 exp1=( `mke 6081 2` 0 0 0 )
322 msg="tunnels destroyed"
329 modprobe -r udp_tunnel
334 modprobe -r netdevsim
339 if modinfo netdevsim | grep udp_tunnel >/dev/null; then
340 err_cnt "netdevsim depends on udp_tunnel"
347 old_netdevs=$(ls /sys/class/net)
349 echo $NSIM_ID > /sys/bus/netdevsim/new_device
350 echo 0 > $NSIM_DEV_SYS/del_port
351 echo 1000 > $NSIM_DEV_DFS/udp_ports_sleep
352 echo 0 > $NSIM_DEV_SYS/new_port
353 NSIM_NETDEV=`get_netdev_name old_netdevs`
356 exp0=( 0 0 0 0 ) # sleep is longer than out wait
357 new_vxlan vxlan0 10000 $NSIM_NETDEV
360 modprobe -r udp_tunnel
367 exp0=( 0 0 0 0 ) # sleep is longer than out wait
368 new_vxlan vxlan0 10000 $NSIM_NETDEV
372 modprobe -r netdevsim
377 function overflow_table0 {
380 msg="create VxLANs 1/5"
381 exp0=( `mke 10000 1` 0 0 0 )
382 new_vxlan vxlan0 10000 $NSIM_NETDEV
384 msg="create VxLANs 2/5"
385 exp0=( `mke 10000 1` `mke 10001 1` 0 0 )
386 new_vxlan vxlan1 10001 $NSIM_NETDEV
388 msg="create VxLANs 3/5"
389 exp0=( `mke 10000 1` `mke 10001 1` `mke 10002 1` 0 )
390 new_vxlan vxlan2 10002 $NSIM_NETDEV
392 msg="create VxLANs 4/5"
393 exp0=( `mke 10000 1` `mke 10001 1` `mke 10002 1` `mke 10003 1` )
394 new_vxlan vxlan3 10003 $NSIM_NETDEV
396 msg="create VxLANs 5/5"
397 new_vxlan vxlan4 10004 $NSIM_NETDEV
400 function overflow_table1 {
403 msg="create GENEVE 1/5"
404 exp1=( `mke 20000 2` 0 0 0 )
405 new_geneve gnv0 20000
407 msg="create GENEVE 2/5"
408 exp1=( `mke 20000 2` `mke 20001 2` 0 0 )
409 new_geneve gnv1 20001
411 msg="create GENEVE 3/5"
412 exp1=( `mke 20000 2` `mke 20001 2` `mke 20002 2` 0 )
413 new_geneve gnv2 20002
415 msg="create GENEVE 4/5"
416 exp1=( `mke 20000 2` `mke 20001 2` `mke 20002 2` `mke 20003 2` )
417 new_geneve gnv3 20003
419 msg="create GENEVE 5/5"
420 new_geneve gnv4 20004
423 echo $NSIM_ID > /sys/bus/netdevsim/new_device
424 echo 0 > $NSIM_DEV_SYS/del_port
427 if [ $port -ne 0 ]; then
428 echo 1 > $NSIM_DEV_DFS/udp_ports_open_only
429 echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
432 echo $port > $NSIM_DEV_SYS/new_port
433 ifconfig $NSIM_NETDEV up
435 overflow_table0 "overflow NIC table"
436 overflow_table1 "overflow NIC table"
438 msg="replace VxLAN in overflow table"
439 exp0=( `mke 10000 1` `mke 10004 1` `mke 10002 1` `mke 10003 1` )
442 msg="vacate VxLAN in overflow table"
443 exp0=( `mke 10000 1` `mke 10004 1` 0 `mke 10003 1` )
446 msg="replace GENEVE in overflow table"
447 exp1=( `mke 20000 2` `mke 20004 2` `mke 20002 2` `mke 20003 2` )
450 msg="vacate GENEVE in overflow table"
451 exp1=( `mke 20000 2` `mke 20004 2` 0 `mke 20003 2` )
454 msg="table sharing - share"
455 exp1=( `mke 20000 2` `mke 20004 2` `mke 30001 4` `mke 20003 2` )
456 new_vxlan vxlanG0 30001 $NSIM_NETDEV 4 "gpe external"
458 msg="table sharing - overflow"
459 new_vxlan vxlanG1 30002 $NSIM_NETDEV 4 "gpe external"
460 msg="table sharing - overflow v6"
461 new_vxlan vxlanG2 30002 $NSIM_NETDEV 6 "gpe external"
463 exp1=( `mke 20000 2` `mke 30002 4` `mke 30001 4` `mke 20003 2` )
467 echo $port > $NSIM_DEV_SYS/del_port
479 echo $NSIM_ID > /sys/bus/netdevsim/new_device
480 echo 0 > $NSIM_DEV_SYS/del_port
481 echo 1 > $NSIM_DEV_DFS/udp_ports_sync_all
484 if [ $port -ne 0 ]; then
485 echo 1 > $NSIM_DEV_DFS/udp_ports_open_only
486 echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
489 echo $port > $NSIM_DEV_SYS/new_port
490 ifconfig $NSIM_NETDEV up
492 overflow_table0 "overflow NIC table"
493 overflow_table1 "overflow NIC table"
495 msg="replace VxLAN in overflow table"
496 exp0=( `mke 10000 1` `mke 10004 1` `mke 10002 1` `mke 10003 1` )
499 msg="vacate VxLAN in overflow table"
500 exp0=( `mke 10000 1` `mke 10004 1` 0 `mke 10003 1` )
503 msg="replace GENEVE in overflow table"
504 exp1=( `mke 20000 2` `mke 20004 2` `mke 20002 2` `mke 20003 2` )
507 msg="vacate GENEVE in overflow table"
508 exp1=( `mke 20000 2` `mke 20004 2` 0 `mke 20003 2` )
511 msg="table sharing - share"
512 exp1=( `mke 20000 2` `mke 20004 2` `mke 30001 4` `mke 20003 2` )
513 new_vxlan vxlanG0 30001 $NSIM_NETDEV 4 "gpe external"
515 msg="table sharing - overflow"
516 new_vxlan vxlanG1 30002 $NSIM_NETDEV 4 "gpe external"
517 msg="table sharing - overflow v6"
518 new_vxlan vxlanG2 30002 $NSIM_NETDEV 6 "gpe external"
520 exp1=( `mke 20000 2` `mke 30002 4` `mke 30001 4` `mke 20003 2` )
524 echo $port > $NSIM_DEV_SYS/del_port
536 echo $NSIM_ID > /sys/bus/netdevsim/new_device
537 echo 0 > $NSIM_DEV_SYS/del_port
540 if [ $port -ne 0 ]; then
541 echo 1 > $NSIM_DEV_DFS/udp_ports_open_only
542 echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
545 echo $port > $NSIM_DEV_SYS/new_port
546 ifconfig $NSIM_NETDEV up
548 overflow_table0 "destroy NIC"
549 overflow_table1 "destroy NIC"
552 echo $port > $NSIM_DEV_SYS/del_port
564 echo $NSIM_ID > /sys/bus/netdevsim/new_device
565 echo 0 > $NSIM_DEV_SYS/del_port
566 echo 1 > $NSIM_DEV_DFS/udp_ports_ipv4_only
569 if [ $port -ne 0 ]; then
570 echo 1 > $NSIM_DEV_DFS/udp_ports_open_only
571 echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
574 echo $port > $NSIM_DEV_SYS/new_port
575 ifconfig $NSIM_NETDEV up
577 msg="create VxLANs v6"
578 new_vxlan vxlanA0 10000 $NSIM_NETDEV 6
580 msg="create VxLANs v6"
581 new_vxlan vxlanA1 10000 $NSIM_NETDEV 6
583 ip link set dev vxlanA0 down
584 ip link set dev vxlanA0 up
587 msg="create VxLANs v4"
588 exp0=( `mke 10000 1` 0 0 0 )
589 new_vxlan vxlan0 10000 $NSIM_NETDEV
593 ip link set dev vxlan0 down
597 exp0=( `mke 10000 1` 0 0 0 )
598 ip link set dev vxlan0 up
601 msg="destroy VxLANs v4"
605 msg="recreate VxLANs v4"
606 exp0=( `mke 10000 1` 0 0 0 )
607 new_vxlan vxlan0 10000 $NSIM_NETDEV
613 echo $port > $NSIM_DEV_SYS/del_port
623 pfx="error injection"
625 echo $NSIM_ID > /sys/bus/netdevsim/new_device
626 echo 0 > $NSIM_DEV_SYS/del_port
629 if [ $port -ne 0 ]; then
630 echo 1 > $NSIM_DEV_DFS/udp_ports_open_only
631 echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
634 echo $port > $NSIM_DEV_SYS/new_port
635 ifconfig $NSIM_NETDEV up
637 echo 110 > $NSIM_DEV_DFS/ports/$port/udp_ports_inject_error
639 msg="1 - create VxLANs v6"
641 new_vxlan vxlanA0 10000 $NSIM_NETDEV 6
643 msg="1 - create VxLANs v4"
644 exp0=( `mke 10000 1` 0 0 0 )
645 new_vxlan vxlan0 10000 $NSIM_NETDEV
647 msg="1 - remove VxLANs v4"
650 msg="1 - remove VxLANs v6"
654 msg="2 - create GENEVE"
655 exp1=( `mke 20000 2` 0 0 0 )
656 new_geneve gnv0 20000
658 msg="2 - destroy GENEVE"
659 echo 2 > $NSIM_DEV_DFS/ports/$port/udp_ports_inject_error
660 exp1=( `mke 20000 2` 0 0 0 )
663 msg="2 - create second GENEVE"
664 exp1=( 0 `mke 20001 2` 0 0 )
665 new_geneve gnv0 20001
668 echo $port > $NSIM_DEV_SYS/del_port
680 echo $NSIM_ID > /sys/bus/netdevsim/new_device
681 echo 0 > $NSIM_DEV_SYS/del_port
684 if [ $port -ne 0 ]; then
685 echo 1 > $NSIM_DEV_DFS/udp_ports_open_only
686 echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
689 echo $port > $NSIM_DEV_SYS/new_port
690 ifconfig $NSIM_NETDEV up
692 msg="create VxLANs v6"
693 exp0=( `mke 10000 1` 0 0 0 )
694 new_vxlan vxlanA0 10000 $NSIM_NETDEV 6
696 msg="create VxLANs v4"
697 new_vxlan vxlan0 10000 $NSIM_NETDEV
701 ethtool -K $NSIM_NETDEV rx-udp_tunnel-port-offload off
705 exp0=( `mke 10000 1` 0 0 0 )
706 ethtool -K $NSIM_NETDEV rx-udp_tunnel-port-offload on
715 ethtool -K $NSIM_NETDEV rx-udp_tunnel-port-offload off
717 msg="create VxLANs v4 - off"
719 new_vxlan vxlan0 10000 $NSIM_NETDEV
721 msg="created off - turn on"
722 exp0=( `mke 10000 1` 0 0 0 )
723 ethtool -K $NSIM_NETDEV rx-udp_tunnel-port-offload on
727 echo $port > $NSIM_DEV_SYS/del_port
736 # device initiated reset
737 pfx="reset notification"
739 echo $NSIM_ID > /sys/bus/netdevsim/new_device
740 echo 0 > $NSIM_DEV_SYS/del_port
743 if [ $port -ne 0 ]; then
744 echo 1 > $NSIM_DEV_DFS/udp_ports_open_only
745 echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
748 echo $port > $NSIM_DEV_SYS/new_port
749 ifconfig $NSIM_NETDEV up
751 msg="create VxLANs v6"
752 exp0=( `mke 10000 1` 0 0 0 )
753 new_vxlan vxlanA0 10000 $NSIM_NETDEV 6
755 msg="create VxLANs v4"
756 new_vxlan vxlan0 10000 $NSIM_NETDEV
758 echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
761 msg="NIC device goes down"
762 ifconfig $NSIM_NETDEV down
763 if [ $port -eq 1 ]; then
769 echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
772 msg="NIC device goes up again"
773 ifconfig $NSIM_NETDEV up
774 exp0=( `mke 10000 1` 0 0 0 )
783 echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
787 echo $port > $NSIM_DEV_SYS/del_port
799 echo $NSIM_ID > /sys/bus/netdevsim/new_device
800 echo 0 > $NSIM_DEV_SYS/del_port
802 echo 0 > $NSIM_DEV_DFS/udp_ports_open_only
803 echo 1 > $NSIM_DEV_DFS/udp_ports_sleep
804 echo 1 > $NSIM_DEV_DFS/udp_ports_shared
806 old_netdevs=$(ls /sys/class/net)
807 echo 1 > $NSIM_DEV_SYS/new_port
808 NSIM_NETDEV=`get_netdev_name old_netdevs`
809 old_netdevs=$(ls /sys/class/net)
810 echo 2 > $NSIM_DEV_SYS/new_port
811 NSIM_NETDEV2=`get_netdev_name old_netdevs`
813 msg="VxLAN v4 devices"
814 exp0=( `mke 4789 1` 0 0 0 )
816 new_vxlan vxlan0 4789 $NSIM_NETDEV
817 new_vxlan vxlan1 4789 $NSIM_NETDEV2
819 msg="VxLAN v4 devices go down"
825 for ifc in vxlan0 vxlan1; do
829 msg="VxLAN v6 device"
830 exp0=( `mke 4789 1` `mke 4790 1` 0 0 )
831 new_vxlan vxlanC 4790 $NSIM_NETDEV 6
834 exp1=( `mke 6081 2` 0 0 0 )
837 msg="NIC device goes down"
838 ifconfig $NSIM_NETDEV down
841 msg="NIC device goes up again"
842 ifconfig $NSIM_NETDEV up
846 msg="turn feature off - 1, rep $i"
847 ethtool -K $NSIM_NETDEV rx-udp_tunnel-port-offload off
850 msg="turn feature off - 2, rep $i"
853 ethtool -K $NSIM_NETDEV2 rx-udp_tunnel-port-offload off
856 msg="turn feature on - 1, rep $i"
857 exp0=( `mke 4789 1` `mke 4790 1` 0 0 )
858 exp1=( `mke 6081 2` 0 0 0 )
859 ethtool -K $NSIM_NETDEV rx-udp_tunnel-port-offload on
862 msg="turn feature on - 2, rep $i"
863 ethtool -K $NSIM_NETDEV2 rx-udp_tunnel-port-offload on
867 msg="tunnels destroyed 1"
873 overflow_table0 "overflow NIC table"
877 echo 2 > $NSIM_DEV_SYS/del_port
878 echo 2 > $NSIM_DEV_SYS/new_port
881 msg="replace VxLAN in overflow table"
882 exp0=( `mke 10000 1` `mke 10004 1` `mke 10002 1` `mke 10003 1` )
885 msg="vacate VxLAN in overflow table"
886 exp0=( `mke 10000 1` `mke 10004 1` 0 `mke 10003 1` )
889 echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
892 msg="tunnels destroyed 2"
898 echo 1 > $NSIM_DEV_SYS/del_port
899 echo 2 > $NSIM_DEV_SYS/del_port
904 pfx="static IANA vxlan"
906 echo $NSIM_ID > /sys/bus/netdevsim/new_device
907 echo 0 > $NSIM_DEV_SYS/del_port
909 echo 1 > $NSIM_DEV_DFS/udp_ports_static_iana_vxlan
910 STATIC_ENTRIES=( `mke 4789 1` )
913 old_netdevs=$(ls /sys/class/net)
914 echo $port > $NSIM_DEV_SYS/new_port
915 NSIM_NETDEV=`get_netdev_name old_netdevs`
922 msg="add on static port"
923 new_vxlan vxlan0 4789 $NSIM_NETDEV
924 new_vxlan vxlan1 4789 $NSIM_NETDEV
926 msg="add on different port"
927 exp0=( `mke 4790 1` 0 0 0 )
928 new_vxlan vxlan2 4790 $NSIM_NETDEV
932 msg="tunnels destroyed"
945 modprobe -r netdevsim
947 if [ $num_errors -eq 0 ]; then
948 echo "PASSED all $num_cases checks"
950 echo "FAILED $num_errors/$num_cases checks"