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`
272 ifconfig $NSIM_NETDEV up
274 msg="new NIC device created"
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
284 msg="VxLAN v4 devices go down"
290 msg="VxLAN v6 devices"
291 exp0=( `mke 4789 1` 0 0 0 )
292 new_vxlan vxlanA 4789 $NSIM_NETDEV 6
294 for ifc in vxlan0 vxlan1; do
298 new_vxlan vxlanB 4789 $NSIM_NETDEV 6
300 msg="another VxLAN v6 devices"
301 exp0=( `mke 4789 1` `mke 4790 1` 0 0 )
302 new_vxlan vxlanC 4790 $NSIM_NETDEV 6
305 exp1=( `mke 6081 2` 0 0 0 )
308 msg="NIC device goes down"
309 ifconfig $NSIM_NETDEV down
310 if [ $port -eq 1 ]; then
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 )
323 msg="tunnels destroyed"
330 modprobe -r udp_tunnel
335 modprobe -r netdevsim
340 if modinfo netdevsim | grep udp_tunnel >/dev/null; then
341 err_cnt "netdevsim depends on udp_tunnel"
348 old_netdevs=$(ls /sys/class/net)
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`
357 exp0=( 0 0 0 0 ) # sleep is longer than out wait
358 new_vxlan vxlan0 10000 $NSIM_NETDEV
361 modprobe -r udp_tunnel
368 exp0=( 0 0 0 0 ) # sleep is longer than out wait
369 new_vxlan vxlan0 10000 $NSIM_NETDEV
373 modprobe -r netdevsim
378 function overflow_table0 {
381 msg="create VxLANs 1/5"
382 exp0=( `mke 10000 1` 0 0 0 )
383 new_vxlan vxlan0 10000 $NSIM_NETDEV
385 msg="create VxLANs 2/5"
386 exp0=( `mke 10000 1` `mke 10001 1` 0 0 )
387 new_vxlan vxlan1 10001 $NSIM_NETDEV
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
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
397 msg="create VxLANs 5/5"
398 new_vxlan vxlan4 10004 $NSIM_NETDEV
401 function overflow_table1 {
404 msg="create GENEVE 1/5"
405 exp1=( `mke 20000 2` 0 0 0 )
406 new_geneve gnv0 20000
408 msg="create GENEVE 2/5"
409 exp1=( `mke 20000 2` `mke 20001 2` 0 0 )
410 new_geneve gnv1 20001
412 msg="create GENEVE 3/5"
413 exp1=( `mke 20000 2` `mke 20001 2` `mke 20002 2` 0 )
414 new_geneve gnv2 20002
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
420 msg="create GENEVE 5/5"
421 new_geneve gnv4 20004
424 echo $NSIM_ID > /sys/bus/netdevsim/new_device
425 echo 0 > $NSIM_DEV_SYS/del_port
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
433 echo $port > $NSIM_DEV_SYS/new_port
434 NSIM_NETDEV=`get_netdev_name old_netdevs`
435 ifconfig $NSIM_NETDEV up
437 overflow_table0 "overflow NIC table"
438 overflow_table1 "overflow NIC table"
440 msg="replace VxLAN in overflow table"
441 exp0=( `mke 10000 1` `mke 10004 1` `mke 10002 1` `mke 10003 1` )
444 msg="vacate VxLAN in overflow table"
445 exp0=( `mke 10000 1` `mke 10004 1` 0 `mke 10003 1` )
448 msg="replace GENEVE in overflow table"
449 exp1=( `mke 20000 2` `mke 20004 2` `mke 20002 2` `mke 20003 2` )
452 msg="vacate GENEVE in overflow table"
453 exp1=( `mke 20000 2` `mke 20004 2` 0 `mke 20003 2` )
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"
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"
465 exp1=( `mke 20000 2` `mke 30002 4` `mke 30001 4` `mke 20003 2` )
469 echo $port > $NSIM_DEV_SYS/del_port
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
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
491 echo $port > $NSIM_DEV_SYS/new_port
492 NSIM_NETDEV=`get_netdev_name old_netdevs`
493 ifconfig $NSIM_NETDEV up
495 overflow_table0 "overflow NIC table"
496 overflow_table1 "overflow NIC table"
498 msg="replace VxLAN in overflow table"
499 exp0=( `mke 10000 1` `mke 10004 1` `mke 10002 1` `mke 10003 1` )
502 msg="vacate VxLAN in overflow table"
503 exp0=( `mke 10000 1` `mke 10004 1` 0 `mke 10003 1` )
506 msg="replace GENEVE in overflow table"
507 exp1=( `mke 20000 2` `mke 20004 2` `mke 20002 2` `mke 20003 2` )
510 msg="vacate GENEVE in overflow table"
511 exp1=( `mke 20000 2` `mke 20004 2` 0 `mke 20003 2` )
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"
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"
523 exp1=( `mke 20000 2` `mke 30002 4` `mke 30001 4` `mke 20003 2` )
527 echo $port > $NSIM_DEV_SYS/del_port
539 echo $NSIM_ID > /sys/bus/netdevsim/new_device
540 echo 0 > $NSIM_DEV_SYS/del_port
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
548 echo $port > $NSIM_DEV_SYS/new_port
549 NSIM_NETDEV=`get_netdev_name old_netdevs`
550 ifconfig $NSIM_NETDEV up
552 overflow_table0 "destroy NIC"
553 overflow_table1 "destroy NIC"
556 echo $port > $NSIM_DEV_SYS/del_port
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
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
578 echo $port > $NSIM_DEV_SYS/new_port
579 NSIM_NETDEV=`get_netdev_name old_netdevs`
580 ifconfig $NSIM_NETDEV up
582 msg="create VxLANs v6"
583 new_vxlan vxlanA0 10000 $NSIM_NETDEV 6
585 msg="create VxLANs v6"
586 new_vxlan vxlanA1 10000 $NSIM_NETDEV 6
588 ip link set dev vxlanA0 down
589 ip link set dev vxlanA0 up
592 msg="create VxLANs v4"
593 exp0=( `mke 10000 1` 0 0 0 )
594 new_vxlan vxlan0 10000 $NSIM_NETDEV
598 ip link set dev vxlan0 down
602 exp0=( `mke 10000 1` 0 0 0 )
603 ip link set dev vxlan0 up
606 msg="destroy VxLANs v4"
610 msg="recreate VxLANs v4"
611 exp0=( `mke 10000 1` 0 0 0 )
612 new_vxlan vxlan0 10000 $NSIM_NETDEV
618 echo $port > $NSIM_DEV_SYS/del_port
628 pfx="error injection"
630 echo $NSIM_ID > /sys/bus/netdevsim/new_device
631 echo 0 > $NSIM_DEV_SYS/del_port
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
639 echo $port > $NSIM_DEV_SYS/new_port
640 NSIM_NETDEV=`get_netdev_name old_netdevs`
641 ifconfig $NSIM_NETDEV up
643 echo 110 > $NSIM_DEV_DFS/ports/$port/udp_ports_inject_error
645 msg="1 - create VxLANs v6"
647 new_vxlan vxlanA0 10000 $NSIM_NETDEV 6
649 msg="1 - create VxLANs v4"
650 exp0=( `mke 10000 1` 0 0 0 )
651 new_vxlan vxlan0 10000 $NSIM_NETDEV
653 msg="1 - remove VxLANs v4"
656 msg="1 - remove VxLANs v6"
660 msg="2 - create GENEVE"
661 exp1=( `mke 20000 2` 0 0 0 )
662 new_geneve gnv0 20000
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 )
669 msg="2 - create second GENEVE"
670 exp1=( 0 `mke 20001 2` 0 0 )
671 new_geneve gnv0 20001
674 echo $port > $NSIM_DEV_SYS/del_port
686 echo $NSIM_ID > /sys/bus/netdevsim/new_device
687 echo 0 > $NSIM_DEV_SYS/del_port
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
695 echo $port > $NSIM_DEV_SYS/new_port
696 NSIM_NETDEV=`get_netdev_name old_netdevs`
697 ifconfig $NSIM_NETDEV up
699 msg="create VxLANs v6"
700 exp0=( `mke 10000 1` 0 0 0 )
701 new_vxlan vxlanA0 10000 $NSIM_NETDEV 6
703 msg="create VxLANs v4"
704 new_vxlan vxlan0 10000 $NSIM_NETDEV
708 ethtool -K $NSIM_NETDEV rx-udp_tunnel-port-offload off
712 exp0=( `mke 10000 1` 0 0 0 )
713 ethtool -K $NSIM_NETDEV rx-udp_tunnel-port-offload on
722 ethtool -K $NSIM_NETDEV rx-udp_tunnel-port-offload off
724 msg="create VxLANs v4 - off"
726 new_vxlan vxlan0 10000 $NSIM_NETDEV
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
734 echo $port > $NSIM_DEV_SYS/del_port
743 # device initiated reset
744 pfx="reset notification"
746 echo $NSIM_ID > /sys/bus/netdevsim/new_device
747 echo 0 > $NSIM_DEV_SYS/del_port
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
755 echo $port > $NSIM_DEV_SYS/new_port
756 NSIM_NETDEV=`get_netdev_name old_netdevs`
757 ifconfig $NSIM_NETDEV up
759 msg="create VxLANs v6"
760 exp0=( `mke 10000 1` 0 0 0 )
761 new_vxlan vxlanA0 10000 $NSIM_NETDEV 6
763 msg="create VxLANs v4"
764 new_vxlan vxlan0 10000 $NSIM_NETDEV
766 echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
769 msg="NIC device goes down"
770 ifconfig $NSIM_NETDEV down
771 if [ $port -eq 1 ]; then
777 echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
780 msg="NIC device goes up again"
781 ifconfig $NSIM_NETDEV up
782 exp0=( `mke 10000 1` 0 0 0 )
791 echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
795 echo $port > $NSIM_DEV_SYS/del_port
807 echo $NSIM_ID > /sys/bus/netdevsim/new_device
808 echo 0 > $NSIM_DEV_SYS/del_port
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
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`
821 msg="VxLAN v4 devices"
822 exp0=( `mke 4789 1` 0 0 0 )
824 new_vxlan vxlan0 4789 $NSIM_NETDEV
825 new_vxlan vxlan1 4789 $NSIM_NETDEV2
827 msg="VxLAN v4 devices go down"
833 for ifc in vxlan0 vxlan1; do
837 msg="VxLAN v6 device"
838 exp0=( `mke 4789 1` `mke 4790 1` 0 0 )
839 new_vxlan vxlanC 4790 $NSIM_NETDEV 6
842 exp1=( `mke 6081 2` 0 0 0 )
845 msg="NIC device goes down"
846 ifconfig $NSIM_NETDEV down
849 msg="NIC device goes up again"
850 ifconfig $NSIM_NETDEV up
854 msg="turn feature off - 1, rep $i"
855 ethtool -K $NSIM_NETDEV rx-udp_tunnel-port-offload off
858 msg="turn feature off - 2, rep $i"
861 ethtool -K $NSIM_NETDEV2 rx-udp_tunnel-port-offload off
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
870 msg="turn feature on - 2, rep $i"
871 ethtool -K $NSIM_NETDEV2 rx-udp_tunnel-port-offload on
875 msg="tunnels destroyed 1"
881 overflow_table0 "overflow NIC table"
885 echo 2 > $NSIM_DEV_SYS/del_port
886 echo 2 > $NSIM_DEV_SYS/new_port
887 NSIM_NETDEV=`get_netdev_name old_netdevs`
890 msg="replace VxLAN in overflow table"
891 exp0=( `mke 10000 1` `mke 10004 1` `mke 10002 1` `mke 10003 1` )
894 msg="vacate VxLAN in overflow table"
895 exp0=( `mke 10000 1` `mke 10004 1` 0 `mke 10003 1` )
898 echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
901 msg="tunnels destroyed 2"
907 echo 1 > $NSIM_DEV_SYS/del_port
908 echo 2 > $NSIM_DEV_SYS/del_port
913 pfx="static IANA vxlan"
915 echo $NSIM_ID > /sys/bus/netdevsim/new_device
916 echo 0 > $NSIM_DEV_SYS/del_port
918 echo 1 > $NSIM_DEV_DFS/udp_ports_static_iana_vxlan
919 STATIC_ENTRIES=( `mke 4789 1` )
922 old_netdevs=$(ls /sys/class/net)
923 echo $port > $NSIM_DEV_SYS/new_port
924 NSIM_NETDEV=`get_netdev_name old_netdevs`
931 msg="add on static port"
932 new_vxlan vxlan0 4789 $NSIM_NETDEV
933 new_vxlan vxlan1 4789 $NSIM_NETDEV
935 msg="add on different port"
936 exp0=( `mke 4790 1` 0 0 0 )
937 new_vxlan vxlan2 4790 $NSIM_NETDEV
941 msg="tunnels destroyed"
954 modprobe -r netdevsim
956 if [ $num_errors -eq 0 ]; then
957 echo "PASSED all $num_cases checks"
959 echo "FAILED $num_errors/$num_cases checks"