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