linux/tools/testing/selftests/net/fcnal-test.sh
<<
>>
Prefs
   1#!/bin/bash
   2# SPDX-License-Identifier: GPL-2.0
   3#
   4# Copyright (c) 2019 David Ahern <dsahern@gmail.com>. All rights reserved.
   5#
   6# IPv4 and IPv6 functional tests focusing on VRF and routing lookups
   7# for various permutations:
   8#   1. icmp, tcp, udp and netfilter
   9#   2. client, server, no-server
  10#   3. global address on interface
  11#   4. global address on 'lo'
  12#   5. remote and local traffic
  13#   6. VRF and non-VRF permutations
  14#
  15# Setup:
  16#                     ns-A     |     ns-B
  17# No VRF case:
  18#    [ lo ]         [ eth1 ]---|---[ eth1 ]      [ lo ]
  19#                                                remote address
  20# VRF case:
  21#         [ red ]---[ eth1 ]---|---[ eth1 ]      [ lo ]
  22#
  23# ns-A:
  24#     eth1: 172.16.1.1/24, 2001:db8:1::1/64
  25#       lo: 127.0.0.1/8, ::1/128
  26#           172.16.2.1/32, 2001:db8:2::1/128
  27#      red: 127.0.0.1/8, ::1/128
  28#           172.16.3.1/32, 2001:db8:3::1/128
  29#
  30# ns-B:
  31#     eth1: 172.16.1.2/24, 2001:db8:1::2/64
  32#      lo2: 127.0.0.1/8, ::1/128
  33#           172.16.2.2/32, 2001:db8:2::2/128
  34#
  35# server / client nomenclature relative to ns-A
  36
  37VERBOSE=0
  38
  39NSA_DEV=eth1
  40NSB_DEV=eth1
  41VRF=red
  42VRF_TABLE=1101
  43
  44# IPv4 config
  45NSA_IP=172.16.1.1
  46NSB_IP=172.16.1.2
  47VRF_IP=172.16.3.1
  48
  49# IPv6 config
  50NSA_IP6=2001:db8:1::1
  51NSB_IP6=2001:db8:1::2
  52VRF_IP6=2001:db8:3::1
  53
  54NSA_LO_IP=172.16.2.1
  55NSB_LO_IP=172.16.2.2
  56NSA_LO_IP6=2001:db8:2::1
  57NSB_LO_IP6=2001:db8:2::2
  58
  59MCAST=ff02::1
  60# set after namespace create
  61NSA_LINKIP6=
  62NSB_LINKIP6=
  63
  64NSA=ns-A
  65NSB=ns-B
  66
  67NSA_CMD="ip netns exec ${NSA}"
  68NSB_CMD="ip netns exec ${NSB}"
  69
  70which ping6 > /dev/null 2>&1 && ping6=$(which ping6) || ping6=$(which ping)
  71
  72################################################################################
  73# utilities
  74
  75log_test()
  76{
  77        local rc=$1
  78        local expected=$2
  79        local msg="$3"
  80
  81        [ "${VERBOSE}" = "1" ] && echo
  82
  83        if [ ${rc} -eq ${expected} ]; then
  84                nsuccess=$((nsuccess+1))
  85                printf "TEST: %-70s  [ OK ]\n" "${msg}"
  86        else
  87                nfail=$((nfail+1))
  88                printf "TEST: %-70s  [FAIL]\n" "${msg}"
  89                if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
  90                        echo
  91                        echo "hit enter to continue, 'q' to quit"
  92                        read a
  93                        [ "$a" = "q" ] && exit 1
  94                fi
  95        fi
  96
  97        if [ "${PAUSE}" = "yes" ]; then
  98                echo
  99                echo "hit enter to continue, 'q' to quit"
 100                read a
 101                [ "$a" = "q" ] && exit 1
 102        fi
 103
 104        kill_procs
 105}
 106
 107log_test_addr()
 108{
 109        local addr=$1
 110        local rc=$2
 111        local expected=$3
 112        local msg="$4"
 113        local astr
 114
 115        astr=$(addr2str ${addr})
 116        log_test $rc $expected "$msg - ${astr}"
 117}
 118
 119log_section()
 120{
 121        echo
 122        echo "###########################################################################"
 123        echo "$*"
 124        echo "###########################################################################"
 125        echo
 126}
 127
 128log_subsection()
 129{
 130        echo
 131        echo "#################################################################"
 132        echo "$*"
 133        echo
 134}
 135
 136log_start()
 137{
 138        # make sure we have no test instances running
 139        kill_procs
 140
 141        if [ "${VERBOSE}" = "1" ]; then
 142                echo
 143                echo "#######################################################"
 144        fi
 145}
 146
 147log_debug()
 148{
 149        if [ "${VERBOSE}" = "1" ]; then
 150                echo
 151                echo "$*"
 152                echo
 153        fi
 154}
 155
 156show_hint()
 157{
 158        if [ "${VERBOSE}" = "1" ]; then
 159                echo "HINT: $*"
 160                echo
 161        fi
 162}
 163
 164kill_procs()
 165{
 166        killall nettest ping ping6 >/dev/null 2>&1
 167        sleep 1
 168}
 169
 170do_run_cmd()
 171{
 172        local cmd="$*"
 173        local out
 174
 175        if [ "$VERBOSE" = "1" ]; then
 176                echo "COMMAND: ${cmd}"
 177        fi
 178
 179        out=$($cmd 2>&1)
 180        rc=$?
 181        if [ "$VERBOSE" = "1" -a -n "$out" ]; then
 182                echo "$out"
 183        fi
 184
 185        return $rc
 186}
 187
 188run_cmd()
 189{
 190        do_run_cmd ${NSA_CMD} $*
 191}
 192
 193run_cmd_nsb()
 194{
 195        do_run_cmd ${NSB_CMD} $*
 196}
 197
 198setup_cmd()
 199{
 200        local cmd="$*"
 201        local rc
 202
 203        run_cmd ${cmd}
 204        rc=$?
 205        if [ $rc -ne 0 ]; then
 206                # show user the command if not done so already
 207                if [ "$VERBOSE" = "0" ]; then
 208                        echo "setup command: $cmd"
 209                fi
 210                echo "failed. stopping tests"
 211                if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
 212                        echo
 213                        echo "hit enter to continue"
 214                        read a
 215                fi
 216                exit $rc
 217        fi
 218}
 219
 220setup_cmd_nsb()
 221{
 222        local cmd="$*"
 223        local rc
 224
 225        run_cmd_nsb ${cmd}
 226        rc=$?
 227        if [ $rc -ne 0 ]; then
 228                # show user the command if not done so already
 229                if [ "$VERBOSE" = "0" ]; then
 230                        echo "setup command: $cmd"
 231                fi
 232                echo "failed. stopping tests"
 233                if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
 234                        echo
 235                        echo "hit enter to continue"
 236                        read a
 237                fi
 238                exit $rc
 239        fi
 240}
 241
 242# set sysctl values in NS-A
 243set_sysctl()
 244{
 245        echo "SYSCTL: $*"
 246        echo
 247        run_cmd sysctl -q -w $*
 248}
 249
 250################################################################################
 251# Setup for tests
 252
 253addr2str()
 254{
 255        case "$1" in
 256        127.0.0.1) echo "loopback";;
 257        ::1) echo "IPv6 loopback";;
 258
 259        ${NSA_IP})      echo "ns-A IP";;
 260        ${NSA_IP6})     echo "ns-A IPv6";;
 261        ${NSA_LO_IP})   echo "ns-A loopback IP";;
 262        ${NSA_LO_IP6})  echo "ns-A loopback IPv6";;
 263        ${NSA_LINKIP6}|${NSA_LINKIP6}%*) echo "ns-A IPv6 LLA";;
 264
 265        ${NSB_IP})      echo "ns-B IP";;
 266        ${NSB_IP6})     echo "ns-B IPv6";;
 267        ${NSB_LO_IP})   echo "ns-B loopback IP";;
 268        ${NSB_LO_IP6})  echo "ns-B loopback IPv6";;
 269        ${NSB_LINKIP6}|${NSB_LINKIP6}%*) echo "ns-B IPv6 LLA";;
 270
 271        ${VRF_IP})      echo "VRF IP";;
 272        ${VRF_IP6})     echo "VRF IPv6";;
 273
 274        ${MCAST}%*)     echo "multicast IP";;
 275
 276        *) echo "unknown";;
 277        esac
 278}
 279
 280get_linklocal()
 281{
 282        local ns=$1
 283        local dev=$2
 284        local addr
 285
 286        addr=$(ip -netns ${ns} -6 -br addr show dev ${dev} | \
 287        awk '{
 288                for (i = 3; i <= NF; ++i) {
 289                        if ($i ~ /^fe80/)
 290                                print $i
 291                }
 292        }'
 293        )
 294        addr=${addr/\/*}
 295
 296        [ -z "$addr" ] && return 1
 297
 298        echo $addr
 299
 300        return 0
 301}
 302
 303################################################################################
 304# create namespaces and vrf
 305
 306create_vrf()
 307{
 308        local ns=$1
 309        local vrf=$2
 310        local table=$3
 311        local addr=$4
 312        local addr6=$5
 313
 314        ip -netns ${ns} link add ${vrf} type vrf table ${table}
 315        ip -netns ${ns} link set ${vrf} up
 316        ip -netns ${ns} route add vrf ${vrf} unreachable default metric 8192
 317        ip -netns ${ns} -6 route add vrf ${vrf} unreachable default metric 8192
 318
 319        ip -netns ${ns} addr add 127.0.0.1/8 dev ${vrf}
 320        ip -netns ${ns} -6 addr add ::1 dev ${vrf} nodad
 321        if [ "${addr}" != "-" ]; then
 322                ip -netns ${ns} addr add dev ${vrf} ${addr}
 323        fi
 324        if [ "${addr6}" != "-" ]; then
 325                ip -netns ${ns} -6 addr add dev ${vrf} ${addr6}
 326        fi
 327
 328        ip -netns ${ns} ru del pref 0
 329        ip -netns ${ns} ru add pref 32765 from all lookup local
 330        ip -netns ${ns} -6 ru del pref 0
 331        ip -netns ${ns} -6 ru add pref 32765 from all lookup local
 332}
 333
 334create_ns()
 335{
 336        local ns=$1
 337        local addr=$2
 338        local addr6=$3
 339
 340        ip netns add ${ns}
 341
 342        ip -netns ${ns} link set lo up
 343        if [ "${addr}" != "-" ]; then
 344                ip -netns ${ns} addr add dev lo ${addr}
 345        fi
 346        if [ "${addr6}" != "-" ]; then
 347                ip -netns ${ns} -6 addr add dev lo ${addr6}
 348        fi
 349
 350        ip -netns ${ns} ro add unreachable default metric 8192
 351        ip -netns ${ns} -6 ro add unreachable default metric 8192
 352
 353        ip netns exec ${ns} sysctl -qw net.ipv4.ip_forward=1
 354        ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1
 355        ip netns exec ${ns} sysctl -qw net.ipv6.conf.all.forwarding=1
 356        ip netns exec ${ns} sysctl -qw net.ipv6.conf.default.forwarding=1
 357}
 358
 359# create veth pair to connect namespaces and apply addresses.
 360connect_ns()
 361{
 362        local ns1=$1
 363        local ns1_dev=$2
 364        local ns1_addr=$3
 365        local ns1_addr6=$4
 366        local ns2=$5
 367        local ns2_dev=$6
 368        local ns2_addr=$7
 369        local ns2_addr6=$8
 370
 371        ip -netns ${ns1} li add ${ns1_dev} type veth peer name tmp
 372        ip -netns ${ns1} li set ${ns1_dev} up
 373        ip -netns ${ns1} li set tmp netns ${ns2} name ${ns2_dev}
 374        ip -netns ${ns2} li set ${ns2_dev} up
 375
 376        if [ "${ns1_addr}" != "-" ]; then
 377                ip -netns ${ns1} addr add dev ${ns1_dev} ${ns1_addr}
 378                ip -netns ${ns2} addr add dev ${ns2_dev} ${ns2_addr}
 379        fi
 380
 381        if [ "${ns1_addr6}" != "-" ]; then
 382                ip -netns ${ns1} addr add dev ${ns1_dev} ${ns1_addr6}
 383                ip -netns ${ns2} addr add dev ${ns2_dev} ${ns2_addr6}
 384        fi
 385}
 386
 387cleanup()
 388{
 389        # explicit cleanups to check those code paths
 390        ip netns | grep -q ${NSA}
 391        if [ $? -eq 0 ]; then
 392                ip -netns ${NSA} link delete ${VRF}
 393                ip -netns ${NSA} ro flush table ${VRF_TABLE}
 394
 395                ip -netns ${NSA} addr flush dev ${NSA_DEV}
 396                ip -netns ${NSA} -6 addr flush dev ${NSA_DEV}
 397                ip -netns ${NSA} link set dev ${NSA_DEV} down
 398                ip -netns ${NSA} link del dev ${NSA_DEV}
 399
 400                ip netns del ${NSA}
 401        fi
 402
 403        ip netns del ${NSB}
 404}
 405
 406setup()
 407{
 408        local with_vrf=${1}
 409
 410        # make sure we are starting with a clean slate
 411        kill_procs
 412        cleanup 2>/dev/null
 413
 414        log_debug "Configuring network namespaces"
 415        set -e
 416
 417        create_ns ${NSA} ${NSA_LO_IP}/32 ${NSA_LO_IP6}/128
 418        create_ns ${NSB} ${NSB_LO_IP}/32 ${NSB_LO_IP6}/128
 419        connect_ns ${NSA} ${NSA_DEV} ${NSA_IP}/24 ${NSA_IP6}/64 \
 420                   ${NSB} ${NSB_DEV} ${NSB_IP}/24 ${NSB_IP6}/64
 421
 422        NSA_LINKIP6=$(get_linklocal ${NSA} ${NSA_DEV})
 423        NSB_LINKIP6=$(get_linklocal ${NSB} ${NSB_DEV})
 424
 425        # tell ns-A how to get to remote addresses of ns-B
 426        if [ "${with_vrf}" = "yes" ]; then
 427                create_vrf ${NSA} ${VRF} ${VRF_TABLE} ${VRF_IP} ${VRF_IP6}
 428
 429                ip -netns ${NSA} link set dev ${NSA_DEV} vrf ${VRF}
 430                ip -netns ${NSA} ro add vrf ${VRF} ${NSB_LO_IP}/32 via ${NSB_IP} dev ${NSA_DEV}
 431                ip -netns ${NSA} -6 ro add vrf ${VRF} ${NSB_LO_IP6}/128 via ${NSB_IP6} dev ${NSA_DEV}
 432
 433                ip -netns ${NSB} ro add ${VRF_IP}/32 via ${NSA_IP} dev ${NSB_DEV}
 434                ip -netns ${NSB} -6 ro add ${VRF_IP6}/128 via ${NSA_IP6} dev ${NSB_DEV}
 435        else
 436                ip -netns ${NSA} ro add ${NSB_LO_IP}/32 via ${NSB_IP} dev ${NSA_DEV}
 437                ip -netns ${NSA} ro add ${NSB_LO_IP6}/128 via ${NSB_IP6} dev ${NSA_DEV}
 438        fi
 439
 440
 441        # tell ns-B how to get to remote addresses of ns-A
 442        ip -netns ${NSB} ro add ${NSA_LO_IP}/32 via ${NSA_IP} dev ${NSB_DEV}
 443        ip -netns ${NSB} ro add ${NSA_LO_IP6}/128 via ${NSA_IP6} dev ${NSB_DEV}
 444
 445        set +e
 446
 447        sleep 1
 448}
 449
 450################################################################################
 451# IPv4
 452
 453ipv4_ping_novrf()
 454{
 455        local a
 456
 457        #
 458        # out
 459        #
 460        for a in ${NSB_IP} ${NSB_LO_IP}
 461        do
 462                log_start
 463                run_cmd ping -c1 -w1 ${a}
 464                log_test_addr ${a} $? 0 "ping out"
 465
 466                log_start
 467                run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
 468                log_test_addr ${a} $? 0 "ping out, device bind"
 469
 470                log_start
 471                run_cmd ping -c1 -w1 -I ${NSA_LO_IP} ${a}
 472                log_test_addr ${a} $? 0 "ping out, address bind"
 473        done
 474
 475        #
 476        # in
 477        #
 478        for a in ${NSA_IP} ${NSA_LO_IP}
 479        do
 480                log_start
 481                run_cmd_nsb ping -c1 -w1 ${a}
 482                log_test_addr ${a} $? 0 "ping in"
 483        done
 484
 485        #
 486        # local traffic
 487        #
 488        for a in ${NSA_IP} ${NSA_LO_IP} 127.0.0.1
 489        do
 490                log_start
 491                run_cmd ping -c1 -w1 ${a}
 492                log_test_addr ${a} $? 0 "ping local"
 493        done
 494
 495        #
 496        # local traffic, socket bound to device
 497        #
 498        # address on device
 499        a=${NSA_IP}
 500        log_start
 501        run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
 502        log_test_addr ${a} $? 0 "ping local, device bind"
 503
 504        # loopback addresses not reachable from device bind
 505        # fails in a really weird way though because ipv4 special cases
 506        # route lookups with oif set.
 507        for a in ${NSA_LO_IP} 127.0.0.1
 508        do
 509                log_start
 510                show_hint "Fails since address on loopback device is out of device scope"
 511                run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
 512                log_test_addr ${a} $? 1 "ping local, device bind"
 513        done
 514
 515        #
 516        # ip rule blocks reachability to remote address
 517        #
 518        log_start
 519        setup_cmd ip rule add pref 32765 from all lookup local
 520        setup_cmd ip rule del pref 0 from all lookup local
 521        setup_cmd ip rule add pref 50 to ${NSB_LO_IP} prohibit
 522        setup_cmd ip rule add pref 51 from ${NSB_IP} prohibit
 523
 524        a=${NSB_LO_IP}
 525        run_cmd ping -c1 -w1 ${a}
 526        log_test_addr ${a} $? 2 "ping out, blocked by rule"
 527
 528        # NOTE: ipv4 actually allows the lookup to fail and yet still create
 529        # a viable rtable if the oif (e.g., bind to device) is set, so this
 530        # case succeeds despite the rule
 531        # run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
 532
 533        a=${NSA_LO_IP}
 534        log_start
 535        show_hint "Response generates ICMP (or arp request is ignored) due to ip rule"
 536        run_cmd_nsb ping -c1 -w1 ${a}
 537        log_test_addr ${a} $? 1 "ping in, blocked by rule"
 538
 539        [ "$VERBOSE" = "1" ] && echo
 540        setup_cmd ip rule del pref 32765 from all lookup local
 541        setup_cmd ip rule add pref 0 from all lookup local
 542        setup_cmd ip rule del pref 50 to ${NSB_LO_IP} prohibit
 543        setup_cmd ip rule del pref 51 from ${NSB_IP} prohibit
 544
 545        #
 546        # route blocks reachability to remote address
 547        #
 548        log_start
 549        setup_cmd ip route replace unreachable ${NSB_LO_IP}
 550        setup_cmd ip route replace unreachable ${NSB_IP}
 551
 552        a=${NSB_LO_IP}
 553        run_cmd ping -c1 -w1 ${a}
 554        log_test_addr ${a} $? 2 "ping out, blocked by route"
 555
 556        # NOTE: ipv4 actually allows the lookup to fail and yet still create
 557        # a viable rtable if the oif (e.g., bind to device) is set, so this
 558        # case succeeds despite not having a route for the address
 559        # run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
 560
 561        a=${NSA_LO_IP}
 562        log_start
 563        show_hint "Response is dropped (or arp request is ignored) due to ip route"
 564        run_cmd_nsb ping -c1 -w1 ${a}
 565        log_test_addr ${a} $? 1 "ping in, blocked by route"
 566
 567        #
 568        # remove 'remote' routes; fallback to default
 569        #
 570        log_start
 571        setup_cmd ip ro del ${NSB_LO_IP}
 572
 573        a=${NSB_LO_IP}
 574        run_cmd ping -c1 -w1 ${a}
 575        log_test_addr ${a} $? 2 "ping out, unreachable default route"
 576
 577        # NOTE: ipv4 actually allows the lookup to fail and yet still create
 578        # a viable rtable if the oif (e.g., bind to device) is set, so this
 579        # case succeeds despite not having a route for the address
 580        # run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
 581}
 582
 583ipv4_ping_vrf()
 584{
 585        local a
 586
 587        # should default on; does not exist on older kernels
 588        set_sysctl net.ipv4.raw_l3mdev_accept=1 2>/dev/null
 589
 590        #
 591        # out
 592        #
 593        for a in ${NSB_IP} ${NSB_LO_IP}
 594        do
 595                log_start
 596                run_cmd ping -c1 -w1 -I ${VRF} ${a}
 597                log_test_addr ${a} $? 0 "ping out, VRF bind"
 598
 599                log_start
 600                run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
 601                log_test_addr ${a} $? 0 "ping out, device bind"
 602
 603                log_start
 604                run_cmd ip vrf exec ${VRF} ping -c1 -w1 -I ${NSA_IP} ${a}
 605                log_test_addr ${a} $? 0 "ping out, vrf device + dev address bind"
 606
 607                log_start
 608                run_cmd ip vrf exec ${VRF} ping -c1 -w1 -I ${VRF_IP} ${a}
 609                log_test_addr ${a} $? 0 "ping out, vrf device + vrf address bind"
 610        done
 611
 612        #
 613        # in
 614        #
 615        for a in ${NSA_IP} ${VRF_IP}
 616        do
 617                log_start
 618                run_cmd_nsb ping -c1 -w1 ${a}
 619                log_test_addr ${a} $? 0 "ping in"
 620        done
 621
 622        #
 623        # local traffic, local address
 624        #
 625        for a in ${NSA_IP} ${VRF_IP} 127.0.0.1
 626        do
 627                log_start
 628                show_hint "Source address should be ${a}"
 629                run_cmd ping -c1 -w1 -I ${VRF} ${a}
 630                log_test_addr ${a} $? 0 "ping local, VRF bind"
 631        done
 632
 633        #
 634        # local traffic, socket bound to device
 635        #
 636        # address on device
 637        a=${NSA_IP}
 638        log_start
 639        run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
 640        log_test_addr ${a} $? 0 "ping local, device bind"
 641
 642        # vrf device is out of scope
 643        for a in ${VRF_IP} 127.0.0.1
 644        do
 645                log_start
 646                show_hint "Fails since address on vrf device is out of device scope"
 647                run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
 648                log_test_addr ${a} $? 1 "ping local, device bind"
 649        done
 650
 651        #
 652        # ip rule blocks address
 653        #
 654        log_start
 655        setup_cmd ip rule add pref 50 to ${NSB_LO_IP} prohibit
 656        setup_cmd ip rule add pref 51 from ${NSB_IP} prohibit
 657
 658        a=${NSB_LO_IP}
 659        run_cmd ping -c1 -w1 -I ${VRF} ${a}
 660        log_test_addr ${a} $? 2 "ping out, vrf bind, blocked by rule"
 661
 662        log_start
 663        run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
 664        log_test_addr ${a} $? 2 "ping out, device bind, blocked by rule"
 665
 666        a=${NSA_LO_IP}
 667        log_start
 668        show_hint "Response lost due to ip rule"
 669        run_cmd_nsb ping -c1 -w1 ${a}
 670        log_test_addr ${a} $? 1 "ping in, blocked by rule"
 671
 672        [ "$VERBOSE" = "1" ] && echo
 673        setup_cmd ip rule del pref 50 to ${NSB_LO_IP} prohibit
 674        setup_cmd ip rule del pref 51 from ${NSB_IP} prohibit
 675
 676        #
 677        # remove 'remote' routes; fallback to default
 678        #
 679        log_start
 680        setup_cmd ip ro del vrf ${VRF} ${NSB_LO_IP}
 681
 682        a=${NSB_LO_IP}
 683        run_cmd ping -c1 -w1 -I ${VRF} ${a}
 684        log_test_addr ${a} $? 2 "ping out, vrf bind, unreachable route"
 685
 686        log_start
 687        run_cmd ping -c1 -w1 -I ${NSA_DEV} ${a}
 688        log_test_addr ${a} $? 2 "ping out, device bind, unreachable route"
 689
 690        a=${NSA_LO_IP}
 691        log_start
 692        show_hint "Response lost by unreachable route"
 693        run_cmd_nsb ping -c1 -w1 ${a}
 694        log_test_addr ${a} $? 1 "ping in, unreachable route"
 695}
 696
 697ipv4_ping()
 698{
 699        log_section "IPv4 ping"
 700
 701        log_subsection "No VRF"
 702        setup
 703        set_sysctl net.ipv4.raw_l3mdev_accept=0 2>/dev/null
 704        ipv4_ping_novrf
 705        setup
 706        set_sysctl net.ipv4.raw_l3mdev_accept=1 2>/dev/null
 707        ipv4_ping_novrf
 708
 709        log_subsection "With VRF"
 710        setup "yes"
 711        ipv4_ping_vrf
 712}
 713
 714################################################################################
 715# IPv4 TCP
 716
 717ipv4_tcp_novrf()
 718{
 719        local a
 720
 721        #
 722        # server tests
 723        #
 724        for a in ${NSA_IP} ${NSA_LO_IP}
 725        do
 726                log_start
 727                run_cmd nettest -s &
 728                sleep 1
 729                run_cmd_nsb nettest -r ${a}
 730                log_test_addr ${a} $? 0 "Global server"
 731        done
 732
 733        a=${NSA_IP}
 734        log_start
 735        run_cmd nettest -s -d ${NSA_DEV} &
 736        sleep 1
 737        run_cmd_nsb nettest -r ${a}
 738        log_test_addr ${a} $? 0 "Device server"
 739
 740        # verify TCP reset sent and received
 741        for a in ${NSA_IP} ${NSA_LO_IP}
 742        do
 743                log_start
 744                show_hint "Should fail 'Connection refused' since there is no server"
 745                run_cmd_nsb nettest -r ${a}
 746                log_test_addr ${a} $? 1 "No server"
 747        done
 748
 749        #
 750        # client
 751        #
 752        for a in ${NSB_IP} ${NSB_LO_IP}
 753        do
 754                log_start
 755                run_cmd_nsb nettest -s &
 756                sleep 1
 757                run_cmd nettest -r ${a} -0 ${NSA_IP}
 758                log_test_addr ${a} $? 0 "Client"
 759
 760                log_start
 761                run_cmd_nsb nettest -s &
 762                sleep 1
 763                run_cmd nettest -r ${a} -d ${NSA_DEV}
 764                log_test_addr ${a} $? 0 "Client, device bind"
 765
 766                log_start
 767                show_hint "Should fail 'Connection refused'"
 768                run_cmd nettest -r ${a}
 769                log_test_addr ${a} $? 1 "No server, unbound client"
 770
 771                log_start
 772                show_hint "Should fail 'Connection refused'"
 773                run_cmd nettest -r ${a} -d ${NSA_DEV}
 774                log_test_addr ${a} $? 1 "No server, device client"
 775        done
 776
 777        #
 778        # local address tests
 779        #
 780        for a in ${NSA_IP} ${NSA_LO_IP} 127.0.0.1
 781        do
 782                log_start
 783                run_cmd nettest -s &
 784                sleep 1
 785                run_cmd nettest -r ${a} -0 ${a} -1 ${a}
 786                log_test_addr ${a} $? 0 "Global server, local connection"
 787        done
 788
 789        a=${NSA_IP}
 790        log_start
 791        run_cmd nettest -s -d ${NSA_DEV} &
 792        sleep 1
 793        run_cmd nettest -r ${a} -0 ${a}
 794        log_test_addr ${a} $? 0 "Device server, unbound client, local connection"
 795
 796        for a in ${NSA_LO_IP} 127.0.0.1
 797        do
 798                log_start
 799                show_hint "Should fail 'Connection refused' since addresses on loopback are out of device scope"
 800                run_cmd nettest -s -d ${NSA_DEV} &
 801                sleep 1
 802                run_cmd nettest -r ${a}
 803                log_test_addr ${a} $? 1 "Device server, unbound client, local connection"
 804        done
 805
 806        a=${NSA_IP}
 807        log_start
 808        run_cmd nettest -s &
 809        sleep 1
 810        run_cmd nettest -r ${a} -0 ${a} -d ${NSA_DEV}
 811        log_test_addr ${a} $? 0 "Global server, device client, local connection"
 812
 813        for a in ${NSA_LO_IP} 127.0.0.1
 814        do
 815                log_start
 816                show_hint "Should fail 'No route to host' since addresses on loopback are out of device scope"
 817                run_cmd nettest -s &
 818                sleep 1
 819                run_cmd nettest -r ${a} -d ${NSA_DEV}
 820                log_test_addr ${a} $? 1 "Global server, device client, local connection"
 821        done
 822
 823        a=${NSA_IP}
 824        log_start
 825        run_cmd nettest -s -d ${NSA_DEV} -2 ${NSA_DEV} &
 826        sleep 1
 827        run_cmd nettest  -d ${NSA_DEV} -r ${a} -0 ${a}
 828        log_test_addr ${a} $? 0 "Device server, device client, local connection"
 829
 830        log_start
 831        show_hint "Should fail 'Connection refused'"
 832        run_cmd nettest -d ${NSA_DEV} -r ${a}
 833        log_test_addr ${a} $? 1 "No server, device client, local conn"
 834}
 835
 836ipv4_tcp_vrf()
 837{
 838        local a
 839
 840        # disable global server
 841        log_subsection "Global server disabled"
 842
 843        set_sysctl net.ipv4.tcp_l3mdev_accept=0
 844
 845        #
 846        # server tests
 847        #
 848        for a in ${NSA_IP} ${VRF_IP}
 849        do
 850                log_start
 851                show_hint "Should fail 'Connection refused' since global server with VRF is disabled"
 852                run_cmd nettest -s &
 853                sleep 1
 854                run_cmd_nsb nettest -r ${a}
 855                log_test_addr ${a} $? 1 "Global server"
 856
 857                log_start
 858                run_cmd nettest -s -d ${VRF} -2 ${VRF} &
 859                sleep 1
 860                run_cmd_nsb nettest -r ${a}
 861                log_test_addr ${a} $? 0 "VRF server"
 862
 863                log_start
 864                run_cmd nettest -s -d ${NSA_DEV} -2 ${NSA_DEV} &
 865                sleep 1
 866                run_cmd_nsb nettest -r ${a}
 867                log_test_addr ${a} $? 0 "Device server"
 868
 869                # verify TCP reset received
 870                log_start
 871                show_hint "Should fail 'Connection refused' since there is no server"
 872                run_cmd_nsb nettest -r ${a}
 873                log_test_addr ${a} $? 1 "No server"
 874        done
 875
 876        # local address tests
 877        # (${VRF_IP} and 127.0.0.1 both timeout)
 878        a=${NSA_IP}
 879        log_start
 880        show_hint "Should fail 'Connection refused' since global server with VRF is disabled"
 881        run_cmd nettest -s &
 882        sleep 1
 883        run_cmd nettest -r ${a} -d ${NSA_DEV}
 884        log_test_addr ${a} $? 1 "Global server, local connection"
 885
 886        #
 887        # enable VRF global server
 888        #
 889        log_subsection "VRF Global server enabled"
 890        set_sysctl net.ipv4.tcp_l3mdev_accept=1
 891
 892        for a in ${NSA_IP} ${VRF_IP}
 893        do
 894                log_start
 895                show_hint "client socket should be bound to VRF"
 896                run_cmd nettest -s -2 ${VRF} &
 897                sleep 1
 898                run_cmd_nsb nettest -r ${a}
 899                log_test_addr ${a} $? 0 "Global server"
 900
 901                log_start
 902                show_hint "client socket should be bound to VRF"
 903                run_cmd nettest -s -d ${VRF} -2 ${VRF} &
 904                sleep 1
 905                run_cmd_nsb nettest -r ${a}
 906                log_test_addr ${a} $? 0 "VRF server"
 907
 908                # verify TCP reset received
 909                log_start
 910                show_hint "Should fail 'Connection refused'"
 911                run_cmd_nsb nettest -r ${a}
 912                log_test_addr ${a} $? 1 "No server"
 913        done
 914
 915        a=${NSA_IP}
 916        log_start
 917        show_hint "client socket should be bound to device"
 918        run_cmd nettest -s -d ${NSA_DEV} -2 ${NSA_DEV} &
 919        sleep 1
 920        run_cmd_nsb nettest -r ${a}
 921        log_test_addr ${a} $? 0 "Device server"
 922
 923        # local address tests
 924        for a in ${NSA_IP} ${VRF_IP}
 925        do
 926                log_start
 927                show_hint "Should fail 'No route to host' since client is not bound to VRF"
 928                run_cmd nettest -s -2 ${VRF} &
 929                sleep 1
 930                run_cmd nettest -r ${a}
 931                log_test_addr ${a} $? 1 "Global server, local connection"
 932        done
 933
 934        #
 935        # client
 936        #
 937        for a in ${NSB_IP} ${NSB_LO_IP}
 938        do
 939                log_start
 940                run_cmd_nsb nettest -s &
 941                sleep 1
 942                run_cmd nettest -r ${a} -d ${VRF}
 943                log_test_addr ${a} $? 0 "Client, VRF bind"
 944
 945                log_start
 946                run_cmd_nsb nettest -s &
 947                sleep 1
 948                run_cmd nettest -r ${a} -d ${NSA_DEV}
 949                log_test_addr ${a} $? 0 "Client, device bind"
 950
 951                log_start
 952                show_hint "Should fail 'Connection refused'"
 953                run_cmd nettest -r ${a} -d ${VRF}
 954                log_test_addr ${a} $? 1 "No server, VRF client"
 955
 956                log_start
 957                show_hint "Should fail 'Connection refused'"
 958                run_cmd nettest -r ${a} -d ${NSA_DEV}
 959                log_test_addr ${a} $? 1 "No server, device client"
 960        done
 961
 962        for a in ${NSA_IP} ${VRF_IP} 127.0.0.1
 963        do
 964                log_start
 965                run_cmd nettest -s -d ${VRF} -2 ${VRF} &
 966                sleep 1
 967                run_cmd nettest -r ${a} -d ${VRF} -0 ${a}
 968                log_test_addr ${a} $? 0 "VRF server, VRF client, local connection"
 969        done
 970
 971        a=${NSA_IP}
 972        log_start
 973        run_cmd nettest -s -d ${VRF} -2 ${VRF} &
 974        sleep 1
 975        run_cmd nettest -r ${a} -d ${NSA_DEV} -0 ${a}
 976        log_test_addr ${a} $? 0 "VRF server, device client, local connection"
 977
 978        log_start
 979        show_hint "Should fail 'No route to host' since client is out of VRF scope"
 980        run_cmd nettest -s -d ${VRF} &
 981        sleep 1
 982        run_cmd nettest -r ${a}
 983        log_test_addr ${a} $? 1 "VRF server, unbound client, local connection"
 984
 985        log_start
 986        run_cmd nettest -s -d ${NSA_DEV} -2 ${NSA_DEV} &
 987        sleep 1
 988        run_cmd nettest -r ${a} -d ${VRF} -0 ${a}
 989        log_test_addr ${a} $? 0 "Device server, VRF client, local connection"
 990
 991        log_start
 992        run_cmd nettest -s -d ${NSA_DEV} -2 ${NSA_DEV} &
 993        sleep 1
 994        run_cmd nettest -r ${a} -d ${NSA_DEV} -0 ${a}
 995        log_test_addr ${a} $? 0 "Device server, device client, local connection"
 996}
 997
 998ipv4_tcp()
 999{
1000        log_section "IPv4/TCP"
1001        log_subsection "No VRF"
1002        setup
1003
1004        # tcp_l3mdev_accept should have no affect without VRF;
1005        # run tests with it enabled and disabled to verify
1006        log_subsection "tcp_l3mdev_accept disabled"
1007        set_sysctl net.ipv4.tcp_l3mdev_accept=0
1008        ipv4_tcp_novrf
1009        log_subsection "tcp_l3mdev_accept enabled"
1010        set_sysctl net.ipv4.tcp_l3mdev_accept=1
1011        ipv4_tcp_novrf
1012
1013        log_subsection "With VRF"
1014        setup "yes"
1015        ipv4_tcp_vrf
1016}
1017
1018################################################################################
1019# IPv4 UDP
1020
1021ipv4_udp_novrf()
1022{
1023        local a
1024
1025        #
1026        # server tests
1027        #
1028        for a in ${NSA_IP} ${NSA_LO_IP}
1029        do
1030                log_start
1031                run_cmd nettest -D -s -2 ${NSA_DEV} &
1032                sleep 1
1033                run_cmd_nsb nettest -D -r ${a}
1034                log_test_addr ${a} $? 0 "Global server"
1035
1036                log_start
1037                show_hint "Should fail 'Connection refused' since there is no server"
1038                run_cmd_nsb nettest -D -r ${a}
1039                log_test_addr ${a} $? 1 "No server"
1040        done
1041
1042        a=${NSA_IP}
1043        log_start
1044        run_cmd nettest -D -d ${NSA_DEV} -s -2 ${NSA_DEV} &
1045        sleep 1
1046        run_cmd_nsb nettest -D -r ${a}
1047        log_test_addr ${a} $? 0 "Device server"
1048
1049        #
1050        # client
1051        #
1052        for a in ${NSB_IP} ${NSB_LO_IP}
1053        do
1054                log_start
1055                run_cmd_nsb nettest -D -s &
1056                sleep 1
1057                run_cmd nettest -D -r ${a} -0 ${NSA_IP}
1058                log_test_addr ${a} $? 0 "Client"
1059
1060                log_start
1061                run_cmd_nsb nettest -D -s &
1062                sleep 1
1063                run_cmd nettest -D -r ${a} -d ${NSA_DEV} -0 ${NSA_IP}
1064                log_test_addr ${a} $? 0 "Client, device bind"
1065
1066                log_start
1067                run_cmd_nsb nettest -D -s &
1068                sleep 1
1069                run_cmd nettest -D -r ${a} -d ${NSA_DEV} -C -0 ${NSA_IP}
1070                log_test_addr ${a} $? 0 "Client, device send via cmsg"
1071
1072                log_start
1073                run_cmd_nsb nettest -D -s &
1074                sleep 1
1075                run_cmd nettest -D -r ${a} -d ${NSA_DEV} -S -0 ${NSA_IP}
1076                log_test_addr ${a} $? 0 "Client, device bind via IP_UNICAST_IF"
1077
1078                log_start
1079                show_hint "Should fail 'Connection refused'"
1080                run_cmd nettest -D -r ${a}
1081                log_test_addr ${a} $? 1 "No server, unbound client"
1082
1083                log_start
1084                show_hint "Should fail 'Connection refused'"
1085                run_cmd nettest -D -r ${a} -d ${NSA_DEV}
1086                log_test_addr ${a} $? 1 "No server, device client"
1087        done
1088
1089        #
1090        # local address tests
1091        #
1092        for a in ${NSA_IP} ${NSA_LO_IP} 127.0.0.1
1093        do
1094                log_start
1095                run_cmd nettest -D -s &
1096                sleep 1
1097                run_cmd nettest -D -r ${a} -0 ${a} -1 ${a}
1098                log_test_addr ${a} $? 0 "Global server, local connection"
1099        done
1100
1101        a=${NSA_IP}
1102        log_start
1103        run_cmd nettest -s -D -d ${NSA_DEV} -2 ${NSA_DEV} &
1104        sleep 1
1105        run_cmd nettest -D -r ${a}
1106        log_test_addr ${a} $? 0 "Device server, unbound client, local connection"
1107
1108        for a in ${NSA_LO_IP} 127.0.0.1
1109        do
1110                log_start
1111                show_hint "Should fail 'Connection refused' since address is out of device scope"
1112                run_cmd nettest -s -D -d ${NSA_DEV} &
1113                sleep 1
1114                run_cmd nettest -D -r ${a}
1115                log_test_addr ${a} $? 1 "Device server, unbound client, local connection"
1116        done
1117
1118        a=${NSA_IP}
1119        log_start
1120        run_cmd nettest -s -D &
1121        sleep 1
1122        run_cmd nettest -D -d ${NSA_DEV} -r ${a}
1123        log_test_addr ${a} $? 0 "Global server, device client, local connection"
1124
1125        log_start
1126        run_cmd nettest -s -D &
1127        sleep 1
1128        run_cmd nettest -D -d ${NSA_DEV} -C -r ${a}
1129        log_test_addr ${a} $? 0 "Global server, device send via cmsg, local connection"
1130
1131        log_start
1132        run_cmd nettest -s -D &
1133        sleep 1
1134        run_cmd nettest -D -d ${NSA_DEV} -S -r ${a}
1135        log_test_addr ${a} $? 0 "Global server, device client via IP_UNICAST_IF, local connection"
1136
1137        # IPv4 with device bind has really weird behavior - it overrides the
1138        # fib lookup, generates an rtable and tries to send the packet. This
1139        # causes failures for local traffic at different places
1140        for a in ${NSA_LO_IP} 127.0.0.1
1141        do
1142                log_start
1143                show_hint "Should fail since addresses on loopback are out of device scope"
1144                run_cmd nettest -D -s &
1145                sleep 1
1146                run_cmd nettest -D -r ${a} -d ${NSA_DEV}
1147                log_test_addr ${a} $? 2 "Global server, device client, local connection"
1148
1149                log_start
1150                show_hint "Should fail since addresses on loopback are out of device scope"
1151                run_cmd nettest -D -s &
1152                sleep 1
1153                run_cmd nettest -D -r ${a} -d ${NSA_DEV} -C
1154                log_test_addr ${a} $? 1 "Global server, device send via cmsg, local connection"
1155
1156                log_start
1157                show_hint "Should fail since addresses on loopback are out of device scope"
1158                run_cmd nettest -D -s &
1159                sleep 1
1160                run_cmd nettest -D -r ${a} -d ${NSA_DEV} -S
1161                log_test_addr ${a} $? 1 "Global server, device client via IP_UNICAST_IF, local connection"
1162        done
1163
1164        a=${NSA_IP}
1165        log_start
1166        run_cmd nettest -D -s -d ${NSA_DEV} -2 ${NSA_DEV} &
1167        sleep 1
1168        run_cmd nettest -D -d ${NSA_DEV} -r ${a} -0 ${a}
1169        log_test_addr ${a} $? 0 "Device server, device client, local conn"
1170
1171        log_start
1172        run_cmd nettest -D -d ${NSA_DEV} -r ${a}
1173        log_test_addr ${a} $? 2 "No server, device client, local conn"
1174}
1175
1176ipv4_udp_vrf()
1177{
1178        local a
1179
1180        # disable global server
1181        log_subsection "Global server disabled"
1182        set_sysctl net.ipv4.udp_l3mdev_accept=0
1183
1184        #
1185        # server tests
1186        #
1187        for a in ${NSA_IP} ${VRF_IP}
1188        do
1189                log_start
1190                show_hint "Fails because ingress is in a VRF and global server is disabled"
1191                run_cmd nettest -D -s &
1192                sleep 1
1193                run_cmd_nsb nettest -D -r ${a}
1194                log_test_addr ${a} $? 1 "Global server"
1195
1196                log_start
1197                run_cmd nettest -D -d ${VRF} -s -2 ${NSA_DEV} &
1198                sleep 1
1199                run_cmd_nsb nettest -D -r ${a}
1200                log_test_addr ${a} $? 0 "VRF server"
1201
1202                log_start
1203                run_cmd nettest -D -d ${NSA_DEV} -s -2 ${NSA_DEV} &
1204                sleep 1
1205                run_cmd_nsb nettest -D -r ${a}
1206                log_test_addr ${a} $? 0 "Enslaved device server"
1207
1208                log_start
1209                show_hint "Should fail 'Connection refused' since there is no server"
1210                run_cmd_nsb nettest -D -r ${a}
1211                log_test_addr ${a} $? 1 "No server"
1212
1213                log_start
1214                show_hint "Should fail 'Connection refused' since global server is out of scope"
1215                run_cmd nettest -D -s &
1216                sleep 1
1217                run_cmd nettest -D -d ${VRF} -r ${a}
1218                log_test_addr ${a} $? 1 "Global server, VRF client, local connection"
1219        done
1220
1221        a=${NSA_IP}
1222        log_start
1223        run_cmd nettest -s -D -d ${VRF} -2 ${NSA_DEV} &
1224        sleep 1
1225        run_cmd nettest -D -d ${VRF} -r ${a}
1226        log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
1227
1228        log_start
1229        run_cmd nettest -s -D -d ${VRF} -2 ${NSA_DEV} &
1230        sleep 1
1231        run_cmd nettest -D -d ${NSA_DEV} -r ${a}
1232        log_test_addr ${a} $? 0 "VRF server, enslaved device client, local connection"
1233
1234        a=${NSA_IP}
1235        log_start
1236        run_cmd nettest -s -D -d ${NSA_DEV} -2 ${NSA_DEV} &
1237        sleep 1
1238        run_cmd nettest -D -d ${VRF} -r ${a}
1239        log_test_addr ${a} $? 0 "Enslaved device server, VRF client, local conn"
1240
1241        log_start
1242        run_cmd nettest -s -D -d ${NSA_DEV} -2 ${NSA_DEV} &
1243        sleep 1
1244        run_cmd nettest -D -d ${NSA_DEV} -r ${a}
1245        log_test_addr ${a} $? 0 "Enslaved device server, device client, local conn"
1246
1247        # enable global server
1248        log_subsection "Global server enabled"
1249        set_sysctl net.ipv4.udp_l3mdev_accept=1
1250
1251        #
1252        # server tests
1253        #
1254        for a in ${NSA_IP} ${VRF_IP}
1255        do
1256                log_start
1257                run_cmd nettest -D -s -2 ${NSA_DEV} &
1258                sleep 1
1259                run_cmd_nsb nettest -D -r ${a}
1260                log_test_addr ${a} $? 0 "Global server"
1261
1262                log_start
1263                run_cmd nettest -D -d ${VRF} -s -2 ${NSA_DEV} &
1264                sleep 1
1265                run_cmd_nsb nettest -D -r ${a}
1266                log_test_addr ${a} $? 0 "VRF server"
1267
1268                log_start
1269                run_cmd nettest -D -d ${NSA_DEV} -s -2 ${NSA_DEV} &
1270                sleep 1
1271                run_cmd_nsb nettest -D -r ${a}
1272                log_test_addr ${a} $? 0 "Enslaved device server"
1273
1274                log_start
1275                show_hint "Should fail 'Connection refused'"
1276                run_cmd_nsb nettest -D -r ${a}
1277                log_test_addr ${a} $? 1 "No server"
1278        done
1279
1280        #
1281        # client tests
1282        #
1283        log_start
1284        run_cmd_nsb nettest -D -s &
1285        sleep 1
1286        run_cmd nettest -d ${VRF} -D -r ${NSB_IP} -1 ${NSA_IP}
1287        log_test $? 0 "VRF client"
1288
1289        log_start
1290        run_cmd_nsb nettest -D -s &
1291        sleep 1
1292        run_cmd nettest -d ${NSA_DEV} -D -r ${NSB_IP} -1 ${NSA_IP}
1293        log_test $? 0 "Enslaved device client"
1294
1295        # negative test - should fail
1296        log_start
1297        show_hint "Should fail 'Connection refused'"
1298        run_cmd nettest -D -d ${VRF} -r ${NSB_IP}
1299        log_test $? 1 "No server, VRF client"
1300
1301        log_start
1302        show_hint "Should fail 'Connection refused'"
1303        run_cmd nettest -D -d ${NSA_DEV} -r ${NSB_IP}
1304        log_test $? 1 "No server, enslaved device client"
1305
1306        #
1307        # local address tests
1308        #
1309        a=${NSA_IP}
1310        log_start
1311        run_cmd nettest -D -s -2 ${NSA_DEV} &
1312        sleep 1
1313        run_cmd nettest -D -d ${VRF} -r ${a}
1314        log_test_addr ${a} $? 0 "Global server, VRF client, local conn"
1315
1316        log_start
1317        run_cmd nettest -s -D -d ${VRF} -2 ${NSA_DEV} &
1318        sleep 1
1319        run_cmd nettest -D -d ${VRF} -r ${a}
1320        log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
1321
1322        log_start
1323        run_cmd nettest -s -D -d ${VRF} -2 ${NSA_DEV} &
1324        sleep 1
1325        run_cmd nettest -D -d ${NSA_DEV} -r ${a}
1326        log_test_addr ${a} $? 0 "VRF server, device client, local conn"
1327
1328        log_start
1329        run_cmd nettest -s -D -d ${NSA_DEV} -2 ${NSA_DEV} &
1330        sleep 1
1331        run_cmd nettest -D -d ${VRF} -r ${a}
1332        log_test_addr ${a} $? 0 "Enslaved device server, VRF client, local conn"
1333
1334        log_start
1335        run_cmd nettest -s -D -d ${NSA_DEV} -2 ${NSA_DEV} &
1336        sleep 1
1337        run_cmd nettest -D -d ${NSA_DEV} -r ${a}
1338        log_test_addr ${a} $? 0 "Enslaved device server, device client, local conn"
1339
1340        for a in ${VRF_IP} 127.0.0.1
1341        do
1342                log_start
1343                run_cmd nettest -D -s -2 ${VRF} &
1344                sleep 1
1345                run_cmd nettest -D -d ${VRF} -r ${a}
1346                log_test_addr ${a} $? 0 "Global server, VRF client, local conn"
1347        done
1348
1349        for a in ${VRF_IP} 127.0.0.1
1350        do
1351                log_start
1352                run_cmd nettest -s -D -d ${VRF} -2 ${VRF} &
1353                sleep 1
1354                run_cmd nettest -D -d ${VRF} -r ${a}
1355                log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
1356        done
1357
1358        # negative test - should fail
1359        # verifies ECONNREFUSED
1360        for a in ${NSA_IP} ${VRF_IP} 127.0.0.1
1361        do
1362                log_start
1363                show_hint "Should fail 'Connection refused'"
1364                run_cmd nettest -D -d ${VRF} -r ${a}
1365                log_test_addr ${a} $? 1 "No server, VRF client, local conn"
1366        done
1367}
1368
1369ipv4_udp()
1370{
1371        log_section "IPv4/UDP"
1372        log_subsection "No VRF"
1373
1374        setup
1375
1376        # udp_l3mdev_accept should have no affect without VRF;
1377        # run tests with it enabled and disabled to verify
1378        log_subsection "udp_l3mdev_accept disabled"
1379        set_sysctl net.ipv4.udp_l3mdev_accept=0
1380        ipv4_udp_novrf
1381        log_subsection "udp_l3mdev_accept enabled"
1382        set_sysctl net.ipv4.udp_l3mdev_accept=1
1383        ipv4_udp_novrf
1384
1385        log_subsection "With VRF"
1386        setup "yes"
1387        ipv4_udp_vrf
1388}
1389
1390################################################################################
1391# IPv4 address bind
1392#
1393# verifies ability or inability to bind to an address / device
1394
1395ipv4_addr_bind_novrf()
1396{
1397        #
1398        # raw socket
1399        #
1400        for a in ${NSA_IP} ${NSA_LO_IP}
1401        do
1402                log_start
1403                run_cmd nettest -s -R -P icmp -l ${a} -b
1404                log_test_addr ${a} $? 0 "Raw socket bind to local address"
1405
1406                log_start
1407                run_cmd nettest -s -R -P icmp -l ${a} -d ${NSA_DEV} -b
1408                log_test_addr ${a} $? 0 "Raw socket bind to local address after device bind"
1409        done
1410
1411        #
1412        # tcp sockets
1413        #
1414        a=${NSA_IP}
1415        log_start
1416        run_cmd nettest -l ${a} -r ${NSB_IP} -t1 -b
1417        log_test_addr ${a} $? 0 "TCP socket bind to local address"
1418
1419        log_start
1420        run_cmd nettest -l ${a} -r ${NSB_IP} -d ${NSA_DEV} -t1 -b
1421        log_test_addr ${a} $? 0 "TCP socket bind to local address after device bind"
1422
1423        # Sadly, the kernel allows binding a socket to a device and then
1424        # binding to an address not on the device. The only restriction
1425        # is that the address is valid in the L3 domain. So this test
1426        # passes when it really should not
1427        #a=${NSA_LO_IP}
1428        #log_start
1429        #show_hint "Should fail with 'Cannot assign requested address'"
1430        #run_cmd nettest -s -l ${a} -d ${NSA_DEV} -t1 -b
1431        #log_test_addr ${a} $? 1 "TCP socket bind to out of scope local address"
1432}
1433
1434ipv4_addr_bind_vrf()
1435{
1436        #
1437        # raw socket
1438        #
1439        for a in ${NSA_IP} ${VRF_IP}
1440        do
1441                log_start
1442                run_cmd nettest -s -R -P icmp -l ${a} -b
1443                log_test_addr ${a} $? 0 "Raw socket bind to local address"
1444
1445                log_start
1446                run_cmd nettest -s -R -P icmp -l ${a} -d ${NSA_DEV} -b
1447                log_test_addr ${a} $? 0 "Raw socket bind to local address after device bind"
1448                log_start
1449                run_cmd nettest -s -R -P icmp -l ${a} -d ${VRF} -b
1450                log_test_addr ${a} $? 0 "Raw socket bind to local address after VRF bind"
1451        done
1452
1453        a=${NSA_LO_IP}
1454        log_start
1455        show_hint "Address on loopback is out of VRF scope"
1456        run_cmd nettest -s -R -P icmp -l ${a} -d ${VRF} -b
1457        log_test_addr ${a} $? 1 "Raw socket bind to out of scope address after VRF bind"
1458
1459        #
1460        # tcp sockets
1461        #
1462        for a in ${NSA_IP} ${VRF_IP}
1463        do
1464                log_start
1465                run_cmd nettest -s -l ${a} -d ${VRF} -t1 -b
1466                log_test_addr ${a} $? 0 "TCP socket bind to local address"
1467
1468                log_start
1469                run_cmd nettest -s -l ${a} -d ${NSA_DEV} -t1 -b
1470                log_test_addr ${a} $? 0 "TCP socket bind to local address after device bind"
1471        done
1472
1473        a=${NSA_LO_IP}
1474        log_start
1475        show_hint "Address on loopback out of scope for VRF"
1476        run_cmd nettest -s -l ${a} -d ${VRF} -t1 -b
1477        log_test_addr ${a} $? 1 "TCP socket bind to invalid local address for VRF"
1478
1479        log_start
1480        show_hint "Address on loopback out of scope for device in VRF"
1481        run_cmd nettest -s -l ${a} -d ${NSA_DEV} -t1 -b
1482        log_test_addr ${a} $? 1 "TCP socket bind to invalid local address for device bind"
1483}
1484
1485ipv4_addr_bind()
1486{
1487        log_section "IPv4 address binds"
1488
1489        log_subsection "No VRF"
1490        setup
1491        ipv4_addr_bind_novrf
1492
1493        log_subsection "With VRF"
1494        setup "yes"
1495        ipv4_addr_bind_vrf
1496}
1497
1498################################################################################
1499# IPv4 runtime tests
1500
1501ipv4_rt()
1502{
1503        local desc="$1"
1504        local varg="$2"
1505        local with_vrf="yes"
1506        local a
1507
1508        #
1509        # server tests
1510        #
1511        for a in ${NSA_IP} ${VRF_IP}
1512        do
1513                log_start
1514                run_cmd nettest ${varg} -s &
1515                sleep 1
1516                run_cmd_nsb nettest ${varg} -r ${a} &
1517                sleep 3
1518                run_cmd ip link del ${VRF}
1519                sleep 1
1520                log_test_addr ${a} 0 0 "${desc}, global server"
1521
1522                setup ${with_vrf}
1523        done
1524
1525        for a in ${NSA_IP} ${VRF_IP}
1526        do
1527                log_start
1528                run_cmd nettest ${varg} -s -d ${VRF} &
1529                sleep 1
1530                run_cmd_nsb nettest ${varg} -r ${a} &
1531                sleep 3
1532                run_cmd ip link del ${VRF}
1533                sleep 1
1534                log_test_addr ${a} 0 0 "${desc}, VRF server"
1535
1536                setup ${with_vrf}
1537        done
1538
1539        a=${NSA_IP}
1540        log_start
1541        run_cmd nettest ${varg} -s -d ${NSA_DEV} &
1542        sleep 1
1543        run_cmd_nsb nettest ${varg} -r ${a} &
1544        sleep 3
1545        run_cmd ip link del ${VRF}
1546        sleep 1
1547        log_test_addr ${a} 0 0 "${desc}, enslaved device server"
1548
1549        setup ${with_vrf}
1550
1551        #
1552        # client test
1553        #
1554        log_start
1555        run_cmd_nsb nettest ${varg} -s &
1556        sleep 1
1557        run_cmd nettest ${varg} -d ${VRF} -r ${NSB_IP} &
1558        sleep 3
1559        run_cmd ip link del ${VRF}
1560        sleep 1
1561        log_test_addr ${a} 0 0 "${desc}, VRF client"
1562
1563        setup ${with_vrf}
1564
1565        log_start
1566        run_cmd_nsb nettest ${varg} -s &
1567        sleep 1
1568        run_cmd nettest ${varg} -d ${NSA_DEV} -r ${NSB_IP} &
1569        sleep 3
1570        run_cmd ip link del ${VRF}
1571        sleep 1
1572        log_test_addr ${a} 0 0 "${desc}, enslaved device client"
1573
1574        setup ${with_vrf}
1575
1576        #
1577        # local address tests
1578        #
1579        for a in ${NSA_IP} ${VRF_IP}
1580        do
1581                log_start
1582                run_cmd nettest ${varg} -s &
1583                sleep 1
1584                run_cmd nettest ${varg} -d ${VRF} -r ${a} &
1585                sleep 3
1586                run_cmd ip link del ${VRF}
1587                sleep 1
1588                log_test_addr ${a} 0 0 "${desc}, global server, VRF client, local"
1589
1590                setup ${with_vrf}
1591        done
1592
1593        for a in ${NSA_IP} ${VRF_IP}
1594        do
1595                log_start
1596                run_cmd nettest ${varg} -d ${VRF} -s &
1597                sleep 1
1598                run_cmd nettest ${varg} -d ${VRF} -r ${a} &
1599                sleep 3
1600                run_cmd ip link del ${VRF}
1601                sleep 1
1602                log_test_addr ${a} 0 0 "${desc}, VRF server and client, local"
1603
1604                setup ${with_vrf}
1605        done
1606
1607        a=${NSA_IP}
1608        log_start
1609        run_cmd nettest ${varg} -s &
1610        sleep 1
1611        run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} &
1612        sleep 3
1613        run_cmd ip link del ${VRF}
1614        sleep 1
1615        log_test_addr ${a} 0 0 "${desc}, global server, enslaved device client, local"
1616
1617        setup ${with_vrf}
1618
1619        log_start
1620        run_cmd nettest ${varg} -d ${VRF} -s &
1621        sleep 1
1622        run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} &
1623        sleep 3
1624        run_cmd ip link del ${VRF}
1625        sleep 1
1626        log_test_addr ${a} 0 0 "${desc}, VRF server, enslaved device client, local"
1627
1628        setup ${with_vrf}
1629
1630        log_start
1631        run_cmd nettest ${varg} -d ${NSA_DEV} -s &
1632        sleep 1
1633        run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} &
1634        sleep 3
1635        run_cmd ip link del ${VRF}
1636        sleep 1
1637        log_test_addr ${a} 0 0 "${desc}, enslaved device server and client, local"
1638}
1639
1640ipv4_ping_rt()
1641{
1642        local with_vrf="yes"
1643        local a
1644
1645        for a in ${NSA_IP} ${VRF_IP}
1646        do
1647                log_start
1648                run_cmd_nsb ping -f ${a} &
1649                sleep 3
1650                run_cmd ip link del ${VRF}
1651                sleep 1
1652                log_test_addr ${a} 0 0 "Device delete with active traffic - ping in"
1653
1654                setup ${with_vrf}
1655        done
1656
1657        a=${NSB_IP}
1658        log_start
1659        run_cmd ping -f -I ${VRF} ${a} &
1660        sleep 3
1661        run_cmd ip link del ${VRF}
1662        sleep 1
1663        log_test_addr ${a} 0 0 "Device delete with active traffic - ping out"
1664}
1665
1666ipv4_runtime()
1667{
1668        log_section "Run time tests - ipv4"
1669
1670        setup "yes"
1671        ipv4_ping_rt
1672
1673        setup "yes"
1674        ipv4_rt "TCP active socket"  "-n -1"
1675
1676        setup "yes"
1677        ipv4_rt "TCP passive socket" "-i"
1678}
1679
1680################################################################################
1681# IPv6
1682
1683ipv6_ping_novrf()
1684{
1685        local a
1686
1687        # should not have an impact, but make a known state
1688        set_sysctl net.ipv4.raw_l3mdev_accept=0 2>/dev/null
1689
1690        #
1691        # out
1692        #
1693        for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV} ${MCAST}%${NSA_DEV}
1694        do
1695                log_start
1696                run_cmd ${ping6} -c1 -w1 ${a}
1697                log_test_addr ${a} $? 0 "ping out"
1698        done
1699
1700        for a in ${NSB_IP6} ${NSB_LO_IP6}
1701        do
1702                log_start
1703                run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1704                log_test_addr ${a} $? 0 "ping out, device bind"
1705
1706                log_start
1707                run_cmd ${ping6} -c1 -w1 -I ${NSA_LO_IP6} ${a}
1708                log_test_addr ${a} $? 0 "ping out, loopback address bind"
1709        done
1710
1711        #
1712        # in
1713        #
1714        for a in ${NSA_IP6} ${NSA_LO_IP6} ${NSA_LINKIP6}%${NSB_DEV} ${MCAST}%${NSB_DEV}
1715        do
1716                log_start
1717                run_cmd_nsb ${ping6} -c1 -w1 ${a}
1718                log_test_addr ${a} $? 0 "ping in"
1719        done
1720
1721        #
1722        # local traffic, local address
1723        #
1724        for a in ${NSA_IP6} ${NSA_LO_IP6} ::1 ${NSA_LINKIP6}%${NSA_DEV} ${MCAST}%${NSA_DEV}
1725        do
1726                log_start
1727                run_cmd ${ping6} -c1 -w1 ${a}
1728                log_test_addr ${a} $? 0 "ping local, no bind"
1729        done
1730
1731        for a in ${NSA_IP6} ${NSA_LINKIP6}%${NSA_DEV} ${MCAST}%${NSA_DEV}
1732        do
1733                log_start
1734                run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1735                log_test_addr ${a} $? 0 "ping local, device bind"
1736        done
1737
1738        for a in ${NSA_LO_IP6} ::1
1739        do
1740                log_start
1741                show_hint "Fails since address on loopback is out of device scope"
1742                run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1743                log_test_addr ${a} $? 2 "ping local, device bind"
1744        done
1745
1746        #
1747        # ip rule blocks address
1748        #
1749        log_start
1750        setup_cmd ip -6 rule add pref 32765 from all lookup local
1751        setup_cmd ip -6 rule del pref 0 from all lookup local
1752        setup_cmd ip -6 rule add pref 50 to ${NSB_LO_IP6} prohibit
1753        setup_cmd ip -6 rule add pref 51 from ${NSB_IP6} prohibit
1754
1755        a=${NSB_LO_IP6}
1756        run_cmd ${ping6} -c1 -w1 ${a}
1757        log_test_addr ${a} $? 2 "ping out, blocked by rule"
1758
1759        log_start
1760        run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1761        log_test_addr ${a} $? 2 "ping out, device bind, blocked by rule"
1762
1763        a=${NSA_LO_IP6}
1764        log_start
1765        show_hint "Response lost due to ip rule"
1766        run_cmd_nsb ${ping6} -c1 -w1 ${a}
1767        log_test_addr ${a} $? 1 "ping in, blocked by rule"
1768
1769        setup_cmd ip -6 rule add pref 0 from all lookup local
1770        setup_cmd ip -6 rule del pref 32765 from all lookup local
1771        setup_cmd ip -6 rule del pref 50 to ${NSB_LO_IP6} prohibit
1772        setup_cmd ip -6 rule del pref 51 from ${NSB_IP6} prohibit
1773
1774        #
1775        # route blocks reachability to remote address
1776        #
1777        log_start
1778        setup_cmd ip -6 route del ${NSB_LO_IP6}
1779        setup_cmd ip -6 route add unreachable ${NSB_LO_IP6} metric 10
1780        setup_cmd ip -6 route add unreachable ${NSB_IP6} metric 10
1781
1782        a=${NSB_LO_IP6}
1783        run_cmd ${ping6} -c1 -w1 ${a}
1784        log_test_addr ${a} $? 2 "ping out, blocked by route"
1785
1786        log_start
1787        run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1788        log_test_addr ${a} $? 2 "ping out, device bind, blocked by route"
1789
1790        a=${NSA_LO_IP6}
1791        log_start
1792        show_hint "Response lost due to ip route"
1793        run_cmd_nsb ${ping6} -c1 -w1 ${a}
1794        log_test_addr ${a} $? 1 "ping in, blocked by route"
1795
1796
1797        #
1798        # remove 'remote' routes; fallback to default
1799        #
1800        log_start
1801        setup_cmd ip -6 ro del unreachable ${NSB_LO_IP6}
1802        setup_cmd ip -6 ro del unreachable ${NSB_IP6}
1803
1804        a=${NSB_LO_IP6}
1805        run_cmd ${ping6} -c1 -w1 ${a}
1806        log_test_addr ${a} $? 2 "ping out, unreachable route"
1807
1808        log_start
1809        run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1810        log_test_addr ${a} $? 2 "ping out, device bind, unreachable route"
1811}
1812
1813ipv6_ping_vrf()
1814{
1815        local a
1816
1817        # should default on; does not exist on older kernels
1818        set_sysctl net.ipv4.raw_l3mdev_accept=1 2>/dev/null
1819
1820        #
1821        # out
1822        #
1823        for a in ${NSB_IP6} ${NSB_LO_IP6}
1824        do
1825                log_start
1826                run_cmd ${ping6} -c1 -w1 -I ${VRF} ${a}
1827                log_test_addr ${a} $? 0 "ping out, VRF bind"
1828        done
1829
1830        for a in ${NSB_LINKIP6}%${VRF} ${MCAST}%${VRF}
1831        do
1832                log_start
1833                show_hint "Fails since VRF device does not support linklocal or multicast"
1834                run_cmd ${ping6} -c1 -w1 ${a}
1835                log_test_addr ${a} $? 2 "ping out, VRF bind"
1836        done
1837
1838        for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV} ${MCAST}%${NSA_DEV}
1839        do
1840                log_start
1841                run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1842                log_test_addr ${a} $? 0 "ping out, device bind"
1843        done
1844
1845        for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV}
1846        do
1847                log_start
1848                run_cmd ip vrf exec ${VRF} ${ping6} -c1 -w1 -I ${VRF_IP6} ${a}
1849                log_test_addr ${a} $? 0 "ping out, vrf device+address bind"
1850        done
1851
1852        #
1853        # in
1854        #
1855        for a in ${NSA_IP6} ${VRF_IP6} ${NSA_LINKIP6}%${NSB_DEV} ${MCAST}%${NSB_DEV}
1856        do
1857                log_start
1858                run_cmd_nsb ${ping6} -c1 -w1 ${a}
1859                log_test_addr ${a} $? 0 "ping in"
1860        done
1861
1862        a=${NSA_LO_IP6}
1863        log_start
1864        show_hint "Fails since loopback address is out of VRF scope"
1865        run_cmd_nsb ${ping6} -c1 -w1 ${a}
1866        log_test_addr ${a} $? 1 "ping in"
1867
1868        #
1869        # local traffic, local address
1870        #
1871        for a in ${NSA_IP6} ${VRF_IP6} ::1
1872        do
1873                log_start
1874                show_hint "Source address should be ${a}"
1875                run_cmd ${ping6} -c1 -w1 -I ${VRF} ${a}
1876                log_test_addr ${a} $? 0 "ping local, VRF bind"
1877        done
1878
1879        for a in ${NSA_IP6} ${NSA_LINKIP6}%${NSA_DEV} ${MCAST}%${NSA_DEV}
1880        do
1881                log_start
1882                run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1883                log_test_addr ${a} $? 0 "ping local, device bind"
1884        done
1885
1886        # LLA to GUA - remove ipv6 global addresses from ns-B
1887        setup_cmd_nsb ip -6 addr del ${NSB_IP6}/64 dev ${NSB_DEV}
1888        setup_cmd_nsb ip -6 addr del ${NSB_LO_IP6}/128 dev lo
1889        setup_cmd_nsb ip -6 ro add ${NSA_IP6}/128 via ${NSA_LINKIP6} dev ${NSB_DEV}
1890
1891        for a in ${NSA_IP6} ${VRF_IP6}
1892        do
1893                log_start
1894                run_cmd_nsb ${ping6} -c1 -w1 ${NSA_IP6}
1895                log_test_addr ${a} $? 0 "ping in, LLA to GUA"
1896        done
1897
1898        setup_cmd_nsb ip -6 ro del ${NSA_IP6}/128 via ${NSA_LINKIP6} dev ${NSB_DEV}
1899        setup_cmd_nsb ip -6 addr add ${NSB_IP6}/64 dev ${NSB_DEV}
1900        setup_cmd_nsb ip -6 addr add ${NSB_LO_IP6}/128 dev lo
1901
1902        #
1903        # ip rule blocks address
1904        #
1905        log_start
1906        setup_cmd ip -6 rule add pref 50 to ${NSB_LO_IP6} prohibit
1907        setup_cmd ip -6 rule add pref 51 from ${NSB_IP6} prohibit
1908
1909        a=${NSB_LO_IP6}
1910        run_cmd ${ping6} -c1 -w1 ${a}
1911        log_test_addr ${a} $? 2 "ping out, blocked by rule"
1912
1913        log_start
1914        run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1915        log_test_addr ${a} $? 2 "ping out, device bind, blocked by rule"
1916
1917        a=${NSA_LO_IP6}
1918        log_start
1919        show_hint "Response lost due to ip rule"
1920        run_cmd_nsb ${ping6} -c1 -w1 ${a}
1921        log_test_addr ${a} $? 1 "ping in, blocked by rule"
1922
1923        log_start
1924        setup_cmd ip -6 rule del pref 50 to ${NSB_LO_IP6} prohibit
1925        setup_cmd ip -6 rule del pref 51 from ${NSB_IP6} prohibit
1926
1927        #
1928        # remove 'remote' routes; fallback to default
1929        #
1930        log_start
1931        setup_cmd ip -6 ro del ${NSB_LO_IP6} vrf ${VRF}
1932
1933        a=${NSB_LO_IP6}
1934        run_cmd ${ping6} -c1 -w1 ${a}
1935        log_test_addr ${a} $? 2 "ping out, unreachable route"
1936
1937        log_start
1938        run_cmd ${ping6} -c1 -w1 -I ${NSA_DEV} ${a}
1939        log_test_addr ${a} $? 2 "ping out, device bind, unreachable route"
1940
1941        ip -netns ${NSB} -6 ro del ${NSA_LO_IP6}
1942        a=${NSA_LO_IP6}
1943        log_start
1944        run_cmd_nsb ${ping6} -c1 -w1 ${a}
1945        log_test_addr ${a} $? 2 "ping in, unreachable route"
1946}
1947
1948ipv6_ping()
1949{
1950        log_section "IPv6 ping"
1951
1952        log_subsection "No VRF"
1953        setup
1954        ipv6_ping_novrf
1955
1956        log_subsection "With VRF"
1957        setup "yes"
1958        ipv6_ping_vrf
1959}
1960
1961################################################################################
1962# IPv6 TCP
1963
1964ipv6_tcp_novrf()
1965{
1966        local a
1967
1968        #
1969        # server tests
1970        #
1971        for a in ${NSA_IP6} ${NSA_LO_IP6} ${NSA_LINKIP6}%${NSB_DEV}
1972        do
1973                log_start
1974                run_cmd nettest -6 -s &
1975                sleep 1
1976                run_cmd_nsb nettest -6 -r ${a}
1977                log_test_addr ${a} $? 0 "Global server"
1978        done
1979
1980        # verify TCP reset received
1981        for a in ${NSA_IP6} ${NSA_LO_IP6} ${NSA_LINKIP6}%${NSB_DEV}
1982        do
1983                log_start
1984                show_hint "Should fail 'Connection refused'"
1985                run_cmd_nsb nettest -6 -r ${a}
1986                log_test_addr ${a} $? 1 "No server"
1987        done
1988
1989        #
1990        # client
1991        #
1992        for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV}
1993        do
1994                log_start
1995                run_cmd_nsb nettest -6 -s &
1996                sleep 1
1997                run_cmd nettest -6 -r ${a}
1998                log_test_addr ${a} $? 0 "Client"
1999        done
2000
2001        for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV}
2002        do
2003                log_start
2004                run_cmd_nsb nettest -6 -s &
2005                sleep 1
2006                run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
2007                log_test_addr ${a} $? 0 "Client, device bind"
2008        done
2009
2010        for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV}
2011        do
2012                log_start
2013                show_hint "Should fail 'Connection refused'"
2014                run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
2015                log_test_addr ${a} $? 1 "No server, device client"
2016        done
2017
2018        #
2019        # local address tests
2020        #
2021        for a in ${NSA_IP6} ${NSA_LO_IP6} ::1
2022        do
2023                log_start
2024                run_cmd nettest -6 -s &
2025                sleep 1
2026                run_cmd nettest -6 -r ${a}
2027                log_test_addr ${a} $? 0 "Global server, local connection"
2028        done
2029
2030        a=${NSA_IP6}
2031        log_start
2032        run_cmd nettest -6 -s -d ${NSA_DEV} -2 ${NSA_DEV} &
2033        sleep 1
2034        run_cmd nettest -6 -r ${a} -0 ${a}
2035        log_test_addr ${a} $? 0 "Device server, unbound client, local connection"
2036
2037        for a in ${NSA_LO_IP6} ::1
2038        do
2039                log_start
2040                show_hint "Should fail 'Connection refused' since addresses on loopback are out of device scope"
2041                run_cmd nettest -6 -s -d ${NSA_DEV} &
2042                sleep 1
2043                run_cmd nettest -6 -r ${a}
2044                log_test_addr ${a} $? 1 "Device server, unbound client, local connection"
2045        done
2046
2047        a=${NSA_IP6}
2048        log_start
2049        run_cmd nettest -6 -s &
2050        sleep 1
2051        run_cmd nettest -6 -r ${a} -d ${NSA_DEV} -0 ${a}
2052        log_test_addr ${a} $? 0 "Global server, device client, local connection"
2053
2054        for a in ${NSA_LO_IP6} ::1
2055        do
2056                log_start
2057                show_hint "Should fail 'Connection refused' since addresses on loopback are out of device scope"
2058                run_cmd nettest -6 -s &
2059                sleep 1
2060                run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
2061                log_test_addr ${a} $? 1 "Global server, device client, local connection"
2062        done
2063
2064        for a in ${NSA_IP6} ${NSA_LINKIP6}
2065        do
2066                log_start
2067                run_cmd nettest -6 -s -d ${NSA_DEV} -2 ${NSA_DEV} &
2068                sleep 1
2069                run_cmd nettest -6  -d ${NSA_DEV} -r ${a}
2070                log_test_addr ${a} $? 0 "Device server, device client, local conn"
2071        done
2072
2073        for a in ${NSA_IP6} ${NSA_LINKIP6}
2074        do
2075                log_start
2076                show_hint "Should fail 'Connection refused'"
2077                run_cmd nettest -6 -d ${NSA_DEV} -r ${a}
2078                log_test_addr ${a} $? 1 "No server, device client, local conn"
2079        done
2080}
2081
2082ipv6_tcp_vrf()
2083{
2084        local a
2085
2086        # disable global server
2087        log_subsection "Global server disabled"
2088
2089        set_sysctl net.ipv4.tcp_l3mdev_accept=0
2090
2091        #
2092        # server tests
2093        #
2094        for a in ${NSA_IP6} ${VRF_IP6} ${NSA_LINKIP6}%${NSB_DEV}
2095        do
2096                log_start
2097                show_hint "Should fail 'Connection refused' since global server with VRF is disabled"
2098                run_cmd nettest -6 -s &
2099                sleep 1
2100                run_cmd_nsb nettest -6 -r ${a}
2101                log_test_addr ${a} $? 1 "Global server"
2102        done
2103
2104        for a in ${NSA_IP6} ${VRF_IP6}
2105        do
2106                log_start
2107                run_cmd nettest -6 -s -d ${VRF} -2 ${VRF} &
2108                sleep 1
2109                run_cmd_nsb nettest -6 -r ${a}
2110                log_test_addr ${a} $? 0 "VRF server"
2111        done
2112
2113        # link local is always bound to ingress device
2114        a=${NSA_LINKIP6}%${NSB_DEV}
2115        log_start
2116        run_cmd nettest -6 -s -d ${VRF} -2 ${NSA_DEV} &
2117        sleep 1
2118        run_cmd_nsb nettest -6 -r ${a}
2119        log_test_addr ${a} $? 0 "VRF server"
2120
2121        for a in ${NSA_IP6} ${VRF_IP6} ${NSA_LINKIP6}%${NSB_DEV}
2122        do
2123                log_start
2124                run_cmd nettest -6 -s -d ${NSA_DEV} -2 ${NSA_DEV} &
2125                sleep 1
2126                run_cmd_nsb nettest -6 -r ${a}
2127                log_test_addr ${a} $? 0 "Device server"
2128        done
2129
2130        # verify TCP reset received
2131        for a in ${NSA_IP6} ${VRF_IP6} ${NSA_LINKIP6}%${NSB_DEV}
2132        do
2133                log_start
2134                show_hint "Should fail 'Connection refused'"
2135                run_cmd_nsb nettest -6 -r ${a}
2136                log_test_addr ${a} $? 1 "No server"
2137        done
2138
2139        # local address tests
2140        a=${NSA_IP6}
2141        log_start
2142        show_hint "Should fail 'Connection refused' since global server with VRF is disabled"
2143        run_cmd nettest -6 -s &
2144        sleep 1
2145        run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
2146        log_test_addr ${a} $? 1 "Global server, local connection"
2147
2148        #
2149        # enable VRF global server
2150        #
2151        log_subsection "VRF Global server enabled"
2152        set_sysctl net.ipv4.tcp_l3mdev_accept=1
2153
2154        for a in ${NSA_IP6} ${VRF_IP6}
2155        do
2156                log_start
2157                run_cmd nettest -6 -s -2 ${VRF} &
2158                sleep 1
2159                run_cmd_nsb nettest -6 -r ${a}
2160                log_test_addr ${a} $? 0 "Global server"
2161        done
2162
2163        for a in ${NSA_IP6} ${VRF_IP6}
2164        do
2165                log_start
2166                run_cmd nettest -6 -s -d ${VRF} -2 ${VRF} &
2167                sleep 1
2168                run_cmd_nsb nettest -6 -r ${a}
2169                log_test_addr ${a} $? 0 "VRF server"
2170        done
2171
2172        # For LLA, child socket is bound to device
2173        a=${NSA_LINKIP6}%${NSB_DEV}
2174        log_start
2175        run_cmd nettest -6 -s -2 ${NSA_DEV} &
2176        sleep 1
2177        run_cmd_nsb nettest -6 -r ${a}
2178        log_test_addr ${a} $? 0 "Global server"
2179
2180        log_start
2181        run_cmd nettest -6 -s -d ${VRF} -2 ${NSA_DEV} &
2182        sleep 1
2183        run_cmd_nsb nettest -6 -r ${a}
2184        log_test_addr ${a} $? 0 "VRF server"
2185
2186        for a in ${NSA_IP6} ${NSA_LINKIP6}%${NSB_DEV}
2187        do
2188                log_start
2189                run_cmd nettest -6 -s -d ${NSA_DEV} -2 ${NSA_DEV} &
2190                sleep 1
2191                run_cmd_nsb nettest -6 -r ${a}
2192                log_test_addr ${a} $? 0 "Device server"
2193        done
2194
2195        # verify TCP reset received
2196        for a in ${NSA_IP6} ${VRF_IP6} ${NSA_LINKIP6}%${NSB_DEV}
2197        do
2198                log_start
2199                show_hint "Should fail 'Connection refused'"
2200                run_cmd_nsb nettest -6 -r ${a}
2201                log_test_addr ${a} $? 1 "No server"
2202        done
2203
2204        # local address tests
2205        for a in ${NSA_IP6} ${VRF_IP6}
2206        do
2207                log_start
2208                show_hint "Fails 'No route to host' since client is not in VRF"
2209                run_cmd nettest -6 -s -2 ${VRF} &
2210                sleep 1
2211                run_cmd nettest -6 -r ${a}
2212                log_test_addr ${a} $? 1 "Global server, local connection"
2213        done
2214
2215
2216        #
2217        # client
2218        #
2219        for a in ${NSB_IP6} ${NSB_LO_IP6}
2220        do
2221                log_start
2222                run_cmd_nsb nettest -6 -s &
2223                sleep 1
2224                run_cmd nettest -6 -r ${a} -d ${VRF}
2225                log_test_addr ${a} $? 0 "Client, VRF bind"
2226        done
2227
2228        a=${NSB_LINKIP6}
2229        log_start
2230        show_hint "Fails since VRF device does not allow linklocal addresses"
2231        run_cmd_nsb nettest -6 -s &
2232        sleep 1
2233        run_cmd nettest -6 -r ${a} -d ${VRF}
2234        log_test_addr ${a} $? 1 "Client, VRF bind"
2235
2236        for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}
2237        do
2238                log_start
2239                run_cmd_nsb nettest -6 -s &
2240                sleep 1
2241                run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
2242                log_test_addr ${a} $? 0 "Client, device bind"
2243        done
2244
2245        for a in ${NSB_IP6} ${NSB_LO_IP6}
2246        do
2247                log_start
2248                show_hint "Should fail 'Connection refused'"
2249                run_cmd nettest -6 -r ${a} -d ${VRF}
2250                log_test_addr ${a} $? 1 "No server, VRF client"
2251        done
2252
2253        for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}
2254        do
2255                log_start
2256                show_hint "Should fail 'Connection refused'"
2257                run_cmd nettest -6 -r ${a} -d ${NSA_DEV}
2258                log_test_addr ${a} $? 1 "No server, device client"
2259        done
2260
2261        for a in ${NSA_IP6} ${VRF_IP6} ::1
2262        do
2263                log_start
2264                run_cmd nettest -6 -s -d ${VRF} -2 ${VRF} &
2265                sleep 1
2266                run_cmd nettest -6 -r ${a} -d ${VRF} -0 ${a}
2267                log_test_addr ${a} $? 0 "VRF server, VRF client, local connection"
2268        done
2269
2270        a=${NSA_IP6}
2271        log_start
2272        run_cmd nettest -6 -s -d ${VRF} -2 ${VRF} &
2273        sleep 1
2274        run_cmd nettest -6 -r ${a} -d ${NSA_DEV} -0 ${a}
2275        log_test_addr ${a} $? 0 "VRF server, device client, local connection"
2276
2277        a=${NSA_IP6}
2278        log_start
2279        show_hint "Should fail since unbound client is out of VRF scope"
2280        run_cmd nettest -6 -s -d ${VRF} &
2281        sleep 1
2282        run_cmd nettest -6 -r ${a}
2283        log_test_addr ${a} $? 1 "VRF server, unbound client, local connection"
2284
2285        log_start
2286        run_cmd nettest -6 -s -d ${NSA_DEV} -2 ${NSA_DEV} &
2287        sleep 1
2288        run_cmd nettest -6 -r ${a} -d ${VRF} -0 ${a}
2289        log_test_addr ${a} $? 0 "Device server, VRF client, local connection"
2290
2291        for a in ${NSA_IP6} ${NSA_LINKIP6}
2292        do
2293                log_start
2294                run_cmd nettest -6 -s -d ${NSA_DEV} -2 ${NSA_DEV} &
2295                sleep 1
2296                run_cmd nettest -6 -r ${a} -d ${NSA_DEV} -0 ${a}
2297                log_test_addr ${a} $? 0 "Device server, device client, local connection"
2298        done
2299}
2300
2301ipv6_tcp()
2302{
2303        log_section "IPv6/TCP"
2304        log_subsection "No VRF"
2305        setup
2306
2307        # tcp_l3mdev_accept should have no affect without VRF;
2308        # run tests with it enabled and disabled to verify
2309        log_subsection "tcp_l3mdev_accept disabled"
2310        set_sysctl net.ipv4.tcp_l3mdev_accept=0
2311        ipv6_tcp_novrf
2312        log_subsection "tcp_l3mdev_accept enabled"
2313        set_sysctl net.ipv4.tcp_l3mdev_accept=1
2314        ipv6_tcp_novrf
2315
2316        log_subsection "With VRF"
2317        setup "yes"
2318        ipv6_tcp_vrf
2319}
2320
2321################################################################################
2322# IPv6 UDP
2323
2324ipv6_udp_novrf()
2325{
2326        local a
2327
2328        #
2329        # server tests
2330        #
2331        for a in ${NSA_IP6} ${NSA_LINKIP6}%${NSB_DEV}
2332        do
2333                log_start
2334                run_cmd nettest -6 -D -s -2 ${NSA_DEV} &
2335                sleep 1
2336                run_cmd_nsb nettest -6 -D -r ${a}
2337                log_test_addr ${a} $? 0 "Global server"
2338
2339                log_start
2340                run_cmd nettest -6 -D -d ${NSA_DEV} -s -2 ${NSA_DEV} &
2341                sleep 1
2342                run_cmd_nsb nettest -6 -D -r ${a}
2343                log_test_addr ${a} $? 0 "Device server"
2344        done
2345
2346        a=${NSA_LO_IP6}
2347        log_start
2348        run_cmd nettest -6 -D -s -2 ${NSA_DEV} &
2349        sleep 1
2350        run_cmd_nsb nettest -6 -D -r ${a}
2351        log_test_addr ${a} $? 0 "Global server"
2352
2353        # should fail since loopback address is out of scope for a device
2354        # bound server, but it does not - hence this is more documenting
2355        # behavior.
2356        #log_start
2357        #show_hint "Should fail since loopback address is out of scope"
2358        #run_cmd nettest -6 -D -d ${NSA_DEV} -s -2 ${NSA_DEV} &
2359        #sleep 1
2360        #run_cmd_nsb nettest -6 -D -r ${a}
2361        #log_test_addr ${a} $? 1 "Device server"
2362
2363        # negative test - should fail
2364        for a in ${NSA_IP6} ${NSA_LO_IP6} ${NSA_LINKIP6}%${NSB_DEV}
2365        do
2366                log_start
2367                show_hint "Should fail 'Connection refused' since there is no server"
2368                run_cmd_nsb nettest -6 -D -r ${a}
2369                log_test_addr ${a} $? 1 "No server"
2370        done
2371
2372        #
2373        # client
2374        #
2375        for a in ${NSB_IP6} ${NSB_LO_IP6} ${NSB_LINKIP6}%${NSA_DEV}
2376        do
2377                log_start
2378                run_cmd_nsb nettest -6 -D -s &
2379                sleep 1
2380                run_cmd nettest -6 -D -r ${a} -0 ${NSA_IP6}
2381                log_test_addr ${a} $? 0 "Client"
2382
2383                log_start
2384                run_cmd_nsb nettest -6 -D -s &
2385                sleep 1
2386                run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -0 ${NSA_IP6}
2387                log_test_addr ${a} $? 0 "Client, device bind"
2388
2389                log_start
2390                run_cmd_nsb nettest -6 -D -s &
2391                sleep 1
2392                run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -C -0 ${NSA_IP6}
2393                log_test_addr ${a} $? 0 "Client, device send via cmsg"
2394
2395                log_start
2396                run_cmd_nsb nettest -6 -D -s &
2397                sleep 1
2398                run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -S -0 ${NSA_IP6}
2399                log_test_addr ${a} $? 0 "Client, device bind via IPV6_UNICAST_IF"
2400
2401                log_start
2402                show_hint "Should fail 'Connection refused'"
2403                run_cmd nettest -6 -D -r ${a}
2404                log_test_addr ${a} $? 1 "No server, unbound client"
2405
2406                log_start
2407                show_hint "Should fail 'Connection refused'"
2408                run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV}
2409                log_test_addr ${a} $? 1 "No server, device client"
2410        done
2411
2412        #
2413        # local address tests
2414        #
2415        for a in ${NSA_IP6} ${NSA_LO_IP6} ::1
2416        do
2417                log_start
2418                run_cmd nettest -6 -D -s &
2419                sleep 1
2420                run_cmd nettest -6 -D -r ${a} -0 ${a} -1 ${a}
2421                log_test_addr ${a} $? 0 "Global server, local connection"
2422        done
2423
2424        a=${NSA_IP6}
2425        log_start
2426        run_cmd nettest -6 -s -D -d ${NSA_DEV} -2 ${NSA_DEV} &
2427        sleep 1
2428        run_cmd nettest -6 -D -r ${a}
2429        log_test_addr ${a} $? 0 "Device server, unbound client, local connection"
2430
2431        for a in ${NSA_LO_IP6} ::1
2432        do
2433                log_start
2434                show_hint "Should fail 'Connection refused' since address is out of device scope"
2435                run_cmd nettest -6 -s -D -d ${NSA_DEV} &
2436                sleep 1
2437                run_cmd nettest -6 -D -r ${a}
2438                log_test_addr ${a} $? 1 "Device server, local connection"
2439        done
2440
2441        a=${NSA_IP6}
2442        log_start
2443        run_cmd nettest -6 -s -D &
2444        sleep 1
2445        run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
2446        log_test_addr ${a} $? 0 "Global server, device client, local connection"
2447
2448        log_start
2449        run_cmd nettest -6 -s -D &
2450        sleep 1
2451        run_cmd nettest -6 -D -d ${NSA_DEV} -C -r ${a}
2452        log_test_addr ${a} $? 0 "Global server, device send via cmsg, local connection"
2453
2454        log_start
2455        run_cmd nettest -6 -s -D &
2456        sleep 1
2457        run_cmd nettest -6 -D -d ${NSA_DEV} -S -r ${a}
2458        log_test_addr ${a} $? 0 "Global server, device client via IPV6_UNICAST_IF, local connection"
2459
2460        for a in ${NSA_LO_IP6} ::1
2461        do
2462                log_start
2463                show_hint "Should fail 'No route to host' since addresses on loopback are out of device scope"
2464                run_cmd nettest -6 -D -s &
2465                sleep 1
2466                run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV}
2467                log_test_addr ${a} $? 1 "Global server, device client, local connection"
2468
2469                log_start
2470                show_hint "Should fail 'No route to host' since addresses on loopback are out of device scope"
2471                run_cmd nettest -6 -D -s &
2472                sleep 1
2473                run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -C
2474                log_test_addr ${a} $? 1 "Global server, device send via cmsg, local connection"
2475
2476                log_start
2477                show_hint "Should fail 'No route to host' since addresses on loopback are out of device scope"
2478                run_cmd nettest -6 -D -s &
2479                sleep 1
2480                run_cmd nettest -6 -D -r ${a} -d ${NSA_DEV} -S
2481                log_test_addr ${a} $? 1 "Global server, device client via IP_UNICAST_IF, local connection"
2482        done
2483
2484        a=${NSA_IP6}
2485        log_start
2486        run_cmd nettest -6 -D -s -d ${NSA_DEV} -2 ${NSA_DEV} &
2487        sleep 1
2488        run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a} -0 ${a}
2489        log_test_addr ${a} $? 0 "Device server, device client, local conn"
2490
2491        log_start
2492        show_hint "Should fail 'Connection refused'"
2493        run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
2494        log_test_addr ${a} $? 1 "No server, device client, local conn"
2495
2496        # LLA to GUA
2497        run_cmd_nsb ip -6 addr del ${NSB_IP6}/64 dev ${NSB_DEV}
2498        run_cmd_nsb ip -6 ro add ${NSA_IP6}/128 dev ${NSB_DEV}
2499        log_start
2500        run_cmd nettest -6 -s -D &
2501        sleep 1
2502        run_cmd_nsb nettest -6 -D -r ${NSA_IP6}
2503        log_test $? 0 "UDP in - LLA to GUA"
2504
2505        run_cmd_nsb ip -6 ro del ${NSA_IP6}/128 dev ${NSB_DEV}
2506        run_cmd_nsb ip -6 addr add ${NSB_IP6}/64 dev ${NSB_DEV} nodad
2507}
2508
2509ipv6_udp_vrf()
2510{
2511        local a
2512
2513        # disable global server
2514        log_subsection "Global server disabled"
2515        set_sysctl net.ipv4.udp_l3mdev_accept=0
2516
2517        #
2518        # server tests
2519        #
2520        for a in ${NSA_IP6} ${VRF_IP6}
2521        do
2522                log_start
2523                show_hint "Should fail 'Connection refused' since global server is disabled"
2524                run_cmd nettest -6 -D -s &
2525                sleep 1
2526                run_cmd_nsb nettest -6 -D -r ${a}
2527                log_test_addr ${a} $? 1 "Global server"
2528        done
2529
2530        for a in ${NSA_IP6} ${VRF_IP6}
2531        do
2532                log_start
2533                run_cmd nettest -6 -D -d ${VRF} -s -2 ${NSA_DEV} &
2534                sleep 1
2535                run_cmd_nsb nettest -6 -D -r ${a}
2536                log_test_addr ${a} $? 0 "VRF server"
2537        done
2538
2539        for a in ${NSA_IP6} ${VRF_IP6}
2540        do
2541                log_start
2542                run_cmd nettest -6 -D -d ${NSA_DEV} -s -2 ${NSA_DEV} &
2543                sleep 1
2544                run_cmd_nsb nettest -6 -D -r ${a}
2545                log_test_addr ${a} $? 0 "Enslaved device server"
2546        done
2547
2548        # negative test - should fail
2549        for a in ${NSA_IP6} ${VRF_IP6}
2550        do
2551                log_start
2552                show_hint "Should fail 'Connection refused' since there is no server"
2553                run_cmd_nsb nettest -6 -D -r ${a}
2554                log_test_addr ${a} $? 1 "No server"
2555        done
2556
2557        #
2558        # local address tests
2559        #
2560        for a in ${NSA_IP6} ${VRF_IP6}
2561        do
2562                log_start
2563                show_hint "Should fail 'Connection refused' since global server is disabled"
2564                run_cmd nettest -6 -D -s &
2565                sleep 1
2566                run_cmd nettest -6 -D -d ${VRF} -r ${a}
2567                log_test_addr ${a} $? 1 "Global server, VRF client, local conn"
2568        done
2569
2570        for a in ${NSA_IP6} ${VRF_IP6}
2571        do
2572                log_start
2573                run_cmd nettest -6 -D -d ${VRF} -s &
2574                sleep 1
2575                run_cmd nettest -6 -D -d ${VRF} -r ${a}
2576                log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
2577        done
2578
2579        a=${NSA_IP6}
2580        log_start
2581        show_hint "Should fail 'Connection refused' since global server is disabled"
2582        run_cmd nettest -6 -D -s &
2583        sleep 1
2584        run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
2585        log_test_addr ${a} $? 1 "Global server, device client, local conn"
2586
2587        log_start
2588        run_cmd nettest -6 -D -d ${VRF} -s -2 ${NSA_DEV} &
2589        sleep 1
2590        run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
2591        log_test_addr ${a} $? 0 "VRF server, device client, local conn"
2592
2593        log_start
2594        run_cmd nettest -6 -D -d ${NSA_DEV} -s -2 ${NSA_DEV} &
2595        sleep 1
2596        run_cmd nettest -6 -D -d ${VRF} -r ${a}
2597        log_test_addr ${a} $? 0 "Enslaved device server, VRF client, local conn"
2598
2599        log_start
2600        run_cmd nettest -6 -D -d ${NSA_DEV} -s -2 ${NSA_DEV} &
2601        sleep 1
2602        run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
2603        log_test_addr ${a} $? 0 "Enslaved device server, device client, local conn"
2604
2605        # disable global server
2606        log_subsection "Global server enabled"
2607        set_sysctl net.ipv4.udp_l3mdev_accept=1
2608
2609        #
2610        # server tests
2611        #
2612        for a in ${NSA_IP6} ${VRF_IP6}
2613        do
2614                log_start
2615                run_cmd nettest -6 -D -s -2 ${NSA_DEV} &
2616                sleep 1
2617                run_cmd_nsb nettest -6 -D -r ${a}
2618                log_test_addr ${a} $? 0 "Global server"
2619        done
2620
2621        for a in ${NSA_IP6} ${VRF_IP6}
2622        do
2623                log_start
2624                run_cmd nettest -6 -D -d ${VRF} -s -2 ${NSA_DEV} &
2625                sleep 1
2626                run_cmd_nsb nettest -6 -D -r ${a}
2627                log_test_addr ${a} $? 0 "VRF server"
2628        done
2629
2630        for a in ${NSA_IP6} ${VRF_IP6}
2631        do
2632                log_start
2633                run_cmd nettest -6 -D -d ${NSA_DEV} -s -2 ${NSA_DEV} &
2634                sleep 1
2635                run_cmd_nsb nettest -6 -D -r ${a}
2636                log_test_addr ${a} $? 0 "Enslaved device server"
2637        done
2638
2639        # negative test - should fail
2640        for a in ${NSA_IP6} ${VRF_IP6}
2641        do
2642                log_start
2643                run_cmd_nsb nettest -6 -D -r ${a}
2644                log_test_addr ${a} $? 1 "No server"
2645        done
2646
2647        #
2648        # client tests
2649        #
2650        log_start
2651        run_cmd_nsb nettest -6 -D -s &
2652        sleep 1
2653        run_cmd nettest -6 -D -d ${VRF} -r ${NSB_IP6}
2654        log_test $? 0 "VRF client"
2655
2656        # negative test - should fail
2657        log_start
2658        run_cmd nettest -6 -D -d ${VRF} -r ${NSB_IP6}
2659        log_test $? 1 "No server, VRF client"
2660
2661        log_start
2662        run_cmd_nsb nettest -6 -D -s &
2663        sleep 1
2664        run_cmd nettest -6 -D -d ${NSA_DEV} -r ${NSB_IP6}
2665        log_test $? 0 "Enslaved device client"
2666
2667        # negative test - should fail
2668        log_start
2669        run_cmd nettest -6 -D -d ${NSA_DEV} -r ${NSB_IP6}
2670        log_test $? 1 "No server, enslaved device client"
2671
2672        #
2673        # local address tests
2674        #
2675        a=${NSA_IP6}
2676        log_start
2677        run_cmd nettest -6 -D -s -2 ${NSA_DEV} &
2678        sleep 1
2679        run_cmd nettest -6 -D -d ${VRF} -r ${a}
2680        log_test_addr ${a} $? 0 "Global server, VRF client, local conn"
2681
2682        #log_start
2683        run_cmd nettest -6 -D -d ${VRF} -s -2 ${NSA_DEV} &
2684        sleep 1
2685        run_cmd nettest -6 -D -d ${VRF} -r ${a}
2686        log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
2687
2688
2689        a=${VRF_IP6}
2690        log_start
2691        run_cmd nettest -6 -D -s -2 ${VRF} &
2692        sleep 1
2693        run_cmd nettest -6 -D -d ${VRF} -r ${a}
2694        log_test_addr ${a} $? 0 "Global server, VRF client, local conn"
2695
2696        log_start
2697        run_cmd nettest -6 -D -d ${VRF} -s -2 ${VRF} &
2698        sleep 1
2699        run_cmd nettest -6 -D -d ${VRF} -r ${a}
2700        log_test_addr ${a} $? 0 "VRF server, VRF client, local conn"
2701
2702        # negative test - should fail
2703        for a in ${NSA_IP6} ${VRF_IP6}
2704        do
2705                log_start
2706                run_cmd nettest -6 -D -d ${VRF} -r ${a}
2707                log_test_addr ${a} $? 1 "No server, VRF client, local conn"
2708        done
2709
2710        # device to global IP
2711        a=${NSA_IP6}
2712        log_start
2713        run_cmd nettest -6 -D -s -2 ${NSA_DEV} &
2714        sleep 1
2715        run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
2716        log_test_addr ${a} $? 0 "Global server, device client, local conn"
2717
2718        log_start
2719        run_cmd nettest -6 -D -d ${VRF} -s -2 ${NSA_DEV} &
2720        sleep 1
2721        run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
2722        log_test_addr ${a} $? 0 "VRF server, device client, local conn"
2723
2724        log_start
2725        run_cmd nettest -6 -D -d ${NSA_DEV} -s -2 ${NSA_DEV} &
2726        sleep 1
2727        run_cmd nettest -6 -D -d ${VRF} -r ${a}
2728        log_test_addr ${a} $? 0 "Device server, VRF client, local conn"
2729
2730        log_start
2731        run_cmd nettest -6 -D -d ${NSA_DEV} -s -2 ${NSA_DEV} &
2732        sleep 1
2733        run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
2734        log_test_addr ${a} $? 0 "Device server, device client, local conn"
2735
2736        log_start
2737        run_cmd nettest -6 -D -d ${NSA_DEV} -r ${a}
2738        log_test_addr ${a} $? 1 "No server, device client, local conn"
2739
2740
2741        # link local addresses
2742        log_start
2743        run_cmd nettest -6 -D -s &
2744        sleep 1
2745        run_cmd_nsb nettest -6 -D -d ${NSB_DEV} -r ${NSA_LINKIP6}
2746        log_test $? 0 "Global server, linklocal IP"
2747
2748        log_start
2749        run_cmd_nsb nettest -6 -D -d ${NSB_DEV} -r ${NSA_LINKIP6}
2750        log_test $? 1 "No server, linklocal IP"
2751
2752
2753        log_start
2754        run_cmd_nsb nettest -6 -D -s &
2755        sleep 1
2756        run_cmd nettest -6 -D -d ${NSA_DEV} -r ${NSB_LINKIP6}
2757        log_test $? 0 "Enslaved device client, linklocal IP"
2758
2759        log_start
2760        run_cmd nettest -6 -D -d ${NSA_DEV} -r ${NSB_LINKIP6}
2761        log_test $? 1 "No server, device client, peer linklocal IP"
2762
2763
2764        log_start
2765        run_cmd nettest -6 -D -s &
2766        sleep 1
2767        run_cmd nettest -6 -D -d ${NSA_DEV} -r ${NSA_LINKIP6}
2768        log_test $? 0 "Enslaved device client, local conn - linklocal IP"
2769
2770        log_start
2771        run_cmd nettest -6 -D -d ${NSA_DEV} -r ${NSA_LINKIP6}
2772        log_test $? 1 "No server, device client, local conn  - linklocal IP"
2773
2774        # LLA to GUA
2775        run_cmd_nsb ip -6 addr del ${NSB_IP6}/64 dev ${NSB_DEV}
2776        run_cmd_nsb ip -6 ro add ${NSA_IP6}/128 dev ${NSB_DEV}
2777        log_start
2778        run_cmd nettest -6 -s -D &
2779        sleep 1
2780        run_cmd_nsb nettest -6 -D -r ${NSA_IP6}
2781        log_test $? 0 "UDP in - LLA to GUA"
2782
2783        run_cmd_nsb ip -6 ro del ${NSA_IP6}/128 dev ${NSB_DEV}
2784        run_cmd_nsb ip -6 addr add ${NSB_IP6}/64 dev ${NSB_DEV} nodad
2785}
2786
2787ipv6_udp()
2788{
2789        # should not matter, but set to known state
2790        set_sysctl net.ipv4.udp_early_demux=1
2791
2792        log_section "IPv6/UDP"
2793        log_subsection "No VRF"
2794        setup
2795
2796        # udp_l3mdev_accept should have no affect without VRF;
2797        # run tests with it enabled and disabled to verify
2798        log_subsection "udp_l3mdev_accept disabled"
2799        set_sysctl net.ipv4.udp_l3mdev_accept=0
2800        ipv6_udp_novrf
2801        log_subsection "udp_l3mdev_accept enabled"
2802        set_sysctl net.ipv4.udp_l3mdev_accept=1
2803        ipv6_udp_novrf
2804
2805        log_subsection "With VRF"
2806        setup "yes"
2807        ipv6_udp_vrf
2808}
2809
2810################################################################################
2811# IPv6 address bind
2812
2813ipv6_addr_bind_novrf()
2814{
2815        #
2816        # raw socket
2817        #
2818        for a in ${NSA_IP6} ${NSA_LO_IP6}
2819        do
2820                log_start
2821                run_cmd nettest -6 -s -R -P ipv6-icmp -l ${a} -b
2822                log_test_addr ${a} $? 0 "Raw socket bind to local address"
2823
2824                log_start
2825                run_cmd nettest -6 -s -R -P ipv6-icmp -l ${a} -d ${NSA_DEV} -b
2826                log_test_addr ${a} $? 0 "Raw socket bind to local address after device bind"
2827        done
2828
2829        #
2830        # tcp sockets
2831        #
2832        a=${NSA_IP6}
2833        log_start
2834        run_cmd nettest -6 -s -l ${a} -t1 -b
2835        log_test_addr ${a} $? 0 "TCP socket bind to local address"
2836
2837        log_start
2838        run_cmd nettest -6 -s -l ${a} -d ${NSA_DEV} -t1 -b
2839        log_test_addr ${a} $? 0 "TCP socket bind to local address after device bind"
2840
2841        a=${NSA_LO_IP6}
2842        log_start
2843        show_hint "Should fail with 'Cannot assign requested address'"
2844        run_cmd nettest -6 -s -l ${a} -d ${NSA_DEV} -t1 -b
2845        log_test_addr ${a} $? 1 "TCP socket bind to out of scope local address"
2846}
2847
2848ipv6_addr_bind_vrf()
2849{
2850        #
2851        # raw socket
2852        #
2853        for a in ${NSA_IP6} ${VRF_IP6}
2854        do
2855                log_start
2856                run_cmd nettest -6 -s -R -P ipv6-icmp -l ${a} -d ${VRF} -b
2857                log_test_addr ${a} $? 0 "Raw socket bind to local address after vrf bind"
2858
2859                log_start
2860                run_cmd nettest -6 -s -R -P ipv6-icmp -l ${a} -d ${NSA_DEV} -b
2861                log_test_addr ${a} $? 0 "Raw socket bind to local address after device bind"
2862        done
2863
2864        a=${NSA_LO_IP6}
2865        log_start
2866        show_hint "Address on loopback is out of VRF scope"
2867        run_cmd nettest -6 -s -R -P ipv6-icmp -l ${a} -d ${VRF} -b
2868        log_test_addr ${a} $? 1 "Raw socket bind to invalid local address after vrf bind"
2869
2870        #
2871        # tcp sockets
2872        #
2873        # address on enslaved device is valid for the VRF or device in a VRF
2874        for a in ${NSA_IP6} ${VRF_IP6}
2875        do
2876                log_start
2877                run_cmd nettest -6 -s -l ${a} -d ${VRF} -t1 -b
2878                log_test_addr ${a} $? 0 "TCP socket bind to local address with VRF bind"
2879        done
2880
2881        a=${NSA_IP6}
2882        log_start
2883        run_cmd nettest -6 -s -l ${a} -d ${NSA_DEV} -t1 -b
2884        log_test_addr ${a} $? 0 "TCP socket bind to local address with device bind"
2885
2886        a=${VRF_IP6}
2887        log_start
2888        run_cmd nettest -6 -s -l ${a} -d ${NSA_DEV} -t1 -b
2889        log_test_addr ${a} $? 1 "TCP socket bind to VRF address with device bind"
2890
2891        a=${NSA_LO_IP6}
2892        log_start
2893        show_hint "Address on loopback out of scope for VRF"
2894        run_cmd nettest -6 -s -l ${a} -d ${VRF} -t1 -b
2895        log_test_addr ${a} $? 1 "TCP socket bind to invalid local address for VRF"
2896
2897        log_start
2898        show_hint "Address on loopback out of scope for device in VRF"
2899        run_cmd nettest -6 -s -l ${a} -d ${NSA_DEV} -t1 -b
2900        log_test_addr ${a} $? 1 "TCP socket bind to invalid local address for device bind"
2901
2902}
2903
2904ipv6_addr_bind()
2905{
2906        log_section "IPv6 address binds"
2907
2908        log_subsection "No VRF"
2909        setup
2910        ipv6_addr_bind_novrf
2911
2912        log_subsection "With VRF"
2913        setup "yes"
2914        ipv6_addr_bind_vrf
2915}
2916
2917################################################################################
2918# IPv6 runtime tests
2919
2920ipv6_rt()
2921{
2922        local desc="$1"
2923        local varg="-6 $2"
2924        local with_vrf="yes"
2925        local a
2926
2927        #
2928        # server tests
2929        #
2930        for a in ${NSA_IP6} ${VRF_IP6}
2931        do
2932                log_start
2933                run_cmd nettest ${varg} -s &
2934                sleep 1
2935                run_cmd_nsb nettest ${varg} -r ${a} &
2936                sleep 3
2937                run_cmd ip link del ${VRF}
2938                sleep 1
2939                log_test_addr ${a} 0 0 "${desc}, global server"
2940
2941                setup ${with_vrf}
2942        done
2943
2944        for a in ${NSA_IP6} ${VRF_IP6}
2945        do
2946                log_start
2947                run_cmd nettest ${varg} -d ${VRF} -s &
2948                sleep 1
2949                run_cmd_nsb nettest ${varg} -r ${a} &
2950                sleep 3
2951                run_cmd ip link del ${VRF}
2952                sleep 1
2953                log_test_addr ${a} 0 0 "${desc}, VRF server"
2954
2955                setup ${with_vrf}
2956        done
2957
2958        for a in ${NSA_IP6} ${VRF_IP6}
2959        do
2960                log_start
2961                run_cmd nettest ${varg} -d ${NSA_DEV} -s &
2962                sleep 1
2963                run_cmd_nsb nettest ${varg} -r ${a} &
2964                sleep 3
2965                run_cmd ip link del ${VRF}
2966                sleep 1
2967                log_test_addr ${a} 0 0 "${desc}, enslaved device server"
2968
2969                setup ${with_vrf}
2970        done
2971
2972        #
2973        # client test
2974        #
2975        log_start
2976        run_cmd_nsb nettest ${varg} -s &
2977        sleep 1
2978        run_cmd nettest ${varg} -d ${VRF} -r ${NSB_IP6} &
2979        sleep 3
2980        run_cmd ip link del ${VRF}
2981        sleep 1
2982        log_test  0 0 "${desc}, VRF client"
2983
2984        setup ${with_vrf}
2985
2986        log_start
2987        run_cmd_nsb nettest ${varg} -s &
2988        sleep 1
2989        run_cmd nettest ${varg} -d ${NSA_DEV} -r ${NSB_IP6} &
2990        sleep 3
2991        run_cmd ip link del ${VRF}
2992        sleep 1
2993        log_test  0 0 "${desc}, enslaved device client"
2994
2995        setup ${with_vrf}
2996
2997
2998        #
2999        # local address tests
3000        #
3001        for a in ${NSA_IP6} ${VRF_IP6}
3002        do
3003                log_start
3004                run_cmd nettest ${varg} -s &
3005                sleep 1
3006                run_cmd nettest ${varg} -d ${VRF} -r ${a} &
3007                sleep 3
3008                run_cmd ip link del ${VRF}
3009                sleep 1
3010                log_test_addr ${a} 0 0 "${desc}, global server, VRF client"
3011
3012                setup ${with_vrf}
3013        done
3014
3015        for a in ${NSA_IP6} ${VRF_IP6}
3016        do
3017                log_start
3018                run_cmd nettest ${varg} -d ${VRF} -s &
3019                sleep 1
3020                run_cmd nettest ${varg} -d ${VRF} -r ${a} &
3021                sleep 3
3022                run_cmd ip link del ${VRF}
3023                sleep 1
3024                log_test_addr ${a} 0 0 "${desc}, VRF server and client"
3025
3026                setup ${with_vrf}
3027        done
3028
3029        a=${NSA_IP6}
3030        log_start
3031        run_cmd nettest ${varg} -s &
3032        sleep 1
3033        run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} &
3034        sleep 3
3035        run_cmd ip link del ${VRF}
3036        sleep 1
3037        log_test_addr ${a} 0 0 "${desc}, global server, device client"
3038
3039        setup ${with_vrf}
3040
3041        log_start
3042        run_cmd nettest ${varg} -d ${VRF} -s &
3043        sleep 1
3044        run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} &
3045        sleep 3
3046        run_cmd ip link del ${VRF}
3047        sleep 1
3048        log_test_addr ${a} 0 0 "${desc}, VRF server, device client"
3049
3050        setup ${with_vrf}
3051
3052        log_start
3053        run_cmd nettest ${varg} -d ${NSA_DEV} -s &
3054        sleep 1
3055        run_cmd nettest ${varg} -d ${NSA_DEV} -r ${a} &
3056        sleep 3
3057        run_cmd ip link del ${VRF}
3058        sleep 1
3059        log_test_addr ${a} 0 0 "${desc}, device server, device client"
3060}
3061
3062ipv6_ping_rt()
3063{
3064        local with_vrf="yes"
3065        local a
3066
3067        a=${NSA_IP6}
3068        log_start
3069        run_cmd_nsb ${ping6} -f ${a} &
3070        sleep 3
3071        run_cmd ip link del ${VRF}
3072        sleep 1
3073        log_test_addr ${a} 0 0 "Device delete with active traffic - ping in"
3074
3075        setup ${with_vrf}
3076
3077        log_start
3078        run_cmd ${ping6} -f ${NSB_IP6} -I ${VRF} &
3079        sleep 1
3080        run_cmd ip link del ${VRF}
3081        sleep 1
3082        log_test_addr ${a} 0 0 "Device delete with active traffic - ping out"
3083}
3084
3085ipv6_runtime()
3086{
3087        log_section "Run time tests - ipv6"
3088
3089        setup "yes"
3090        ipv6_ping_rt
3091
3092        setup "yes"
3093        ipv6_rt "TCP active socket"  "-n -1"
3094
3095        setup "yes"
3096        ipv6_rt "TCP passive socket" "-i"
3097
3098        setup "yes"
3099        ipv6_rt "UDP active socket"  "-D -n -1"
3100}
3101
3102################################################################################
3103# netfilter blocking connections
3104
3105netfilter_tcp_reset()
3106{
3107        local a
3108
3109        for a in ${NSA_IP} ${VRF_IP}
3110        do
3111                log_start
3112                run_cmd nettest -s &
3113                sleep 1
3114                run_cmd_nsb nettest -r ${a}
3115                log_test_addr ${a} $? 1 "Global server, reject with TCP-reset on Rx"
3116        done
3117}
3118
3119netfilter_icmp()
3120{
3121        local stype="$1"
3122        local arg
3123        local a
3124
3125        [ "${stype}" = "UDP" ] && arg="-D"
3126
3127        for a in ${NSA_IP} ${VRF_IP}
3128        do
3129                log_start
3130                run_cmd nettest ${arg} -s &
3131                sleep 1
3132                run_cmd_nsb nettest ${arg} -r ${a}
3133                log_test_addr ${a} $? 1 "Global ${stype} server, Rx reject icmp-port-unreach"
3134        done
3135}
3136
3137ipv4_netfilter()
3138{
3139        log_section "IPv4 Netfilter"
3140        log_subsection "TCP reset"
3141
3142        setup "yes"
3143        run_cmd iptables -A INPUT -p tcp --dport 12345 -j REJECT --reject-with tcp-reset
3144
3145        netfilter_tcp_reset
3146
3147        log_start
3148        log_subsection "ICMP unreachable"
3149
3150        log_start
3151        run_cmd iptables -F
3152        run_cmd iptables -A INPUT -p tcp --dport 12345 -j REJECT --reject-with icmp-port-unreachable
3153        run_cmd iptables -A INPUT -p udp --dport 12345 -j REJECT --reject-with icmp-port-unreachable
3154
3155        netfilter_icmp "TCP"
3156        netfilter_icmp "UDP"
3157
3158        log_start
3159        iptables -F
3160}
3161
3162netfilter_tcp6_reset()
3163{
3164        local a
3165
3166        for a in ${NSA_IP6} ${VRF_IP6}
3167        do
3168                log_start
3169                run_cmd nettest -6 -s &
3170                sleep 1
3171                run_cmd_nsb nettest -6 -r ${a}
3172                log_test_addr ${a} $? 1 "Global server, reject with TCP-reset on Rx"
3173        done
3174}
3175
3176netfilter_icmp6()
3177{
3178        local stype="$1"
3179        local arg
3180        local a
3181
3182        [ "${stype}" = "UDP" ] && arg="$arg -D"
3183
3184        for a in ${NSA_IP6} ${VRF_IP6}
3185        do
3186                log_start
3187                run_cmd nettest -6 -s ${arg} &
3188                sleep 1
3189                run_cmd_nsb nettest -6 ${arg} -r ${a}
3190                log_test_addr ${a} $? 1 "Global ${stype} server, Rx reject icmp-port-unreach"
3191        done
3192}
3193
3194ipv6_netfilter()
3195{
3196        log_section "IPv6 Netfilter"
3197        log_subsection "TCP reset"
3198
3199        setup "yes"
3200        run_cmd ip6tables -A INPUT -p tcp --dport 12345 -j REJECT --reject-with tcp-reset
3201
3202        netfilter_tcp6_reset
3203
3204        log_subsection "ICMP unreachable"
3205
3206        log_start
3207        run_cmd ip6tables -F
3208        run_cmd ip6tables -A INPUT -p tcp --dport 12345 -j REJECT --reject-with icmp6-port-unreachable
3209        run_cmd ip6tables -A INPUT -p udp --dport 12345 -j REJECT --reject-with icmp6-port-unreachable
3210
3211        netfilter_icmp6 "TCP"
3212        netfilter_icmp6 "UDP"
3213
3214        log_start
3215        ip6tables -F
3216}
3217
3218################################################################################
3219# specific use cases
3220
3221# VRF only.
3222# ns-A device enslaved to bridge. Verify traffic with and without
3223# br_netfilter module loaded. Repeat with SVI on bridge.
3224use_case_br()
3225{
3226        setup "yes"
3227
3228        setup_cmd ip link set ${NSA_DEV} down
3229        setup_cmd ip addr del dev ${NSA_DEV} ${NSA_IP}/24
3230        setup_cmd ip -6 addr del dev ${NSA_DEV} ${NSA_IP6}/64
3231
3232        setup_cmd ip link add br0 type bridge
3233        setup_cmd ip addr add dev br0 ${NSA_IP}/24
3234        setup_cmd ip -6 addr add dev br0 ${NSA_IP6}/64 nodad
3235
3236        setup_cmd ip li set ${NSA_DEV} master br0
3237        setup_cmd ip li set ${NSA_DEV} up
3238        setup_cmd ip li set br0 up
3239        setup_cmd ip li set br0 vrf ${VRF}
3240
3241        rmmod br_netfilter 2>/dev/null
3242        sleep 5 # DAD
3243
3244        run_cmd ip neigh flush all
3245        run_cmd ping -c1 -w1 -I br0 ${NSB_IP}
3246        log_test $? 0 "Bridge into VRF - IPv4 ping out"
3247
3248        run_cmd ip neigh flush all
3249        run_cmd ${ping6} -c1 -w1 -I br0 ${NSB_IP6}
3250        log_test $? 0 "Bridge into VRF - IPv6 ping out"
3251
3252        run_cmd ip neigh flush all
3253        run_cmd_nsb ping -c1 -w1 ${NSA_IP}
3254        log_test $? 0 "Bridge into VRF - IPv4 ping in"
3255
3256        run_cmd ip neigh flush all
3257        run_cmd_nsb ${ping6} -c1 -w1 ${NSA_IP6}
3258        log_test $? 0 "Bridge into VRF - IPv6 ping in"
3259
3260        modprobe br_netfilter
3261        if [ $? -eq 0 ]; then
3262                run_cmd ip neigh flush all
3263                run_cmd ping -c1 -w1 -I br0 ${NSB_IP}
3264                log_test $? 0 "Bridge into VRF with br_netfilter - IPv4 ping out"
3265
3266                run_cmd ip neigh flush all
3267                run_cmd ${ping6} -c1 -w1 -I br0 ${NSB_IP6}
3268                log_test $? 0 "Bridge into VRF with br_netfilter - IPv6 ping out"
3269
3270                run_cmd ip neigh flush all
3271                run_cmd_nsb ping -c1 -w1 ${NSA_IP}
3272                log_test $? 0 "Bridge into VRF with br_netfilter - IPv4 ping in"
3273
3274                run_cmd ip neigh flush all
3275                run_cmd_nsb ${ping6} -c1 -w1 ${NSA_IP6}
3276                log_test $? 0 "Bridge into VRF with br_netfilter - IPv6 ping in"
3277        fi
3278
3279        setup_cmd ip li set br0 nomaster
3280        setup_cmd ip li add br0.100 link br0 type vlan id 100
3281        setup_cmd ip li set br0.100 vrf ${VRF} up
3282        setup_cmd ip    addr add dev br0.100 172.16.101.1/24
3283        setup_cmd ip -6 addr add dev br0.100 2001:db8:101::1/64 nodad
3284
3285        setup_cmd_nsb ip li add vlan100 link ${NSB_DEV} type vlan id 100
3286        setup_cmd_nsb ip addr add dev vlan100 172.16.101.2/24
3287        setup_cmd_nsb ip -6 addr add dev vlan100 2001:db8:101::2/64 nodad
3288        setup_cmd_nsb ip li set vlan100 up
3289        sleep 1
3290
3291        rmmod br_netfilter 2>/dev/null
3292
3293        run_cmd ip neigh flush all
3294        run_cmd ping -c1 -w1 -I br0.100 172.16.101.2
3295        log_test $? 0 "Bridge vlan into VRF - IPv4 ping out"
3296
3297        run_cmd ip neigh flush all
3298        run_cmd ${ping6} -c1 -w1 -I br0.100 2001:db8:101::2
3299        log_test $? 0 "Bridge vlan into VRF - IPv6 ping out"
3300
3301        run_cmd ip neigh flush all
3302        run_cmd_nsb ping -c1 -w1 172.16.101.1
3303        log_test $? 0 "Bridge vlan into VRF - IPv4 ping in"
3304
3305        run_cmd ip neigh flush all
3306        run_cmd_nsb ${ping6} -c1 -w1 2001:db8:101::1
3307        log_test $? 0 "Bridge vlan into VRF - IPv6 ping in"
3308
3309        modprobe br_netfilter
3310        if [ $? -eq 0 ]; then
3311                run_cmd ip neigh flush all
3312                run_cmd ping -c1 -w1 -I br0.100 172.16.101.2
3313                log_test $? 0 "Bridge vlan into VRF with br_netfilter - IPv4 ping out"
3314
3315                run_cmd ip neigh flush all
3316                run_cmd ${ping6} -c1 -w1 -I br0.100 2001:db8:101::2
3317                log_test $? 0 "Bridge vlan into VRF with br_netfilter - IPv6 ping out"
3318
3319                run_cmd ip neigh flush all
3320                run_cmd_nsb ping -c1 -w1 172.16.101.1
3321                log_test $? 0 "Bridge vlan into VRF - IPv4 ping in"
3322
3323                run_cmd ip neigh flush all
3324                run_cmd_nsb ${ping6} -c1 -w1 2001:db8:101::1
3325                log_test $? 0 "Bridge vlan into VRF - IPv6 ping in"
3326        fi
3327
3328        setup_cmd ip li del br0 2>/dev/null
3329        setup_cmd_nsb ip li del vlan100 2>/dev/null
3330}
3331
3332use_cases()
3333{
3334        log_section "Use cases"
3335        use_case_br
3336}
3337
3338################################################################################
3339# usage
3340
3341usage()
3342{
3343        cat <<EOF
3344usage: ${0##*/} OPTS
3345
3346        -4          IPv4 tests only
3347        -6          IPv6 tests only
3348        -t <test>   Test name/set to run
3349        -p          Pause on fail
3350        -P          Pause after each test
3351        -v          Be verbose
3352EOF
3353}
3354
3355################################################################################
3356# main
3357
3358TESTS_IPV4="ipv4_ping ipv4_tcp ipv4_udp ipv4_addr_bind ipv4_runtime ipv4_netfilter"
3359TESTS_IPV6="ipv6_ping ipv6_tcp ipv6_udp ipv6_addr_bind ipv6_runtime ipv6_netfilter"
3360TESTS_OTHER="use_cases"
3361
3362PAUSE_ON_FAIL=no
3363PAUSE=no
3364
3365while getopts :46t:pPvh o
3366do
3367        case $o in
3368                4) TESTS=ipv4;;
3369                6) TESTS=ipv6;;
3370                t) TESTS=$OPTARG;;
3371                p) PAUSE_ON_FAIL=yes;;
3372                P) PAUSE=yes;;
3373                v) VERBOSE=1;;
3374                h) usage; exit 0;;
3375                *) usage; exit 1;;
3376        esac
3377done
3378
3379# make sure we don't pause twice
3380[ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no
3381
3382#
3383# show user test config
3384#
3385if [ -z "$TESTS" ]; then
3386        TESTS="$TESTS_IPV4 $TESTS_IPV6 $TESTS_OTHER"
3387elif [ "$TESTS" = "ipv4" ]; then
3388        TESTS="$TESTS_IPV4"
3389elif [ "$TESTS" = "ipv6" ]; then
3390        TESTS="$TESTS_IPV6"
3391fi
3392
3393which nettest >/dev/null
3394if [ $? -ne 0 ]; then
3395        echo "'nettest' command not found; skipping tests"
3396        exit 0
3397fi
3398
3399declare -i nfail=0
3400declare -i nsuccess=0
3401
3402for t in $TESTS
3403do
3404        case $t in
3405        ipv4_ping|ping)  ipv4_ping;;
3406        ipv4_tcp|tcp)    ipv4_tcp;;
3407        ipv4_udp|udp)    ipv4_udp;;
3408        ipv4_bind|bind)  ipv4_addr_bind;;
3409        ipv4_runtime)    ipv4_runtime;;
3410        ipv4_netfilter)  ipv4_netfilter;;
3411
3412        ipv6_ping|ping6) ipv6_ping;;
3413        ipv6_tcp|tcp6)   ipv6_tcp;;
3414        ipv6_udp|udp6)   ipv6_udp;;
3415        ipv6_bind|bind6) ipv6_addr_bind;;
3416        ipv6_runtime)    ipv6_runtime;;
3417        ipv6_netfilter)  ipv6_netfilter;;
3418
3419        use_cases)       use_cases;;
3420
3421        # setup namespaces and config, but do not run any tests
3422        setup)           setup; exit 0;;
3423        vrf_setup)       setup "yes"; exit 0;;
3424
3425        help)            echo "Test names: $TESTS"; exit 0;;
3426        esac
3427done
3428
3429cleanup 2>/dev/null
3430
3431printf "\nTests passed: %3d\n" ${nsuccess}
3432printf "Tests failed: %3d\n"   ${nfail}
3433