1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# 4# This test is for checking bridge neighbor suppression functionality. The 5# topology consists of two bridges (VTEPs) connected using VXLAN. A single 6# host is connected to each bridge over multiple VLANs. The test checks that 7# ARP/NS messages from the first host are suppressed on the VXLAN port when 8# should. 9# 10# +-----------------------+ +------------------------+ 11# | h1 | | h2 | 12# | | | | 13# | + eth0.10 | | + eth0.10 | 14# | | 192.0.2.1/28 | | | 192.0.2.2/28 | 15# | | 2001:db8:1::1/64 | | | 2001:db8:1::2/64 | 16# | | | | | | 17# | | + eth0.20 | | | + eth0.20 | 18# | \ | 192.0.2.17/28 | | \ | 192.0.2.18/28 | 19# | \ | 2001:db8:2::1/64 | | \ | 2001:db8:2::2/64 | 20# | \| | | \| | 21# | + eth0 | | + eth0 | 22# +----|------------------+ +----|-------------------+ 23# | | 24# | | 25# +----|-------------------------------+ +----|-------------------------------+ 26# | + swp1 + vx0 | | + swp1 + vx0 | 27# | | | | | | | | 28# | | br0 | | | | | | 29# | +------------+-----------+ | | +------------+-----------+ | 30# | | | | | | 31# | | | | | | 32# | +---+---+ | | +---+---+ | 33# | | | | | | | | 34# | | | | | | | | 35# | + + | | + + | 36# | br0.10 br0.20 | | br0.10 br0.20 | 37# | | | | 38# | 192.0.2.33 | | 192.0.2.34 | 39# | + lo | | + lo | 40# | | | | 41# | | | | 42# | 192.0.2.49/28 | | 192.0.2.50/28 | 43# | veth0 +-------+ veth0 | 44# | | | | 45# | sw1 | | sw2 | 46# +------------------------------------+ +------------------------------------+ 47 48source lib.sh 49ret=0 50 51# All tests in this script. Can be overridden with -t option. 52TESTS=" 53 neigh_suppress_arp 54 neigh_suppress_uc_arp 55 neigh_suppress_ns 56 neigh_suppress_uc_ns 57 neigh_vlan_suppress_arp 58 neigh_vlan_suppress_ns 59 neigh_suppress_arp_probe 60 neigh_suppress_dad_ns 61 neigh_forward_grat_arp 62 neigh_forward_grat_na 63 neigh_vlan_forward_grat_arp 64 neigh_vlan_forward_grat_na 65" 66VERBOSE=0 67PAUSE_ON_FAIL=no 68PAUSE=no 69 70################################################################################ 71# Utilities 72 73log_test() 74{ 75 local rc=$1 76 local expected=$2 77 local msg="$3" 78 79 if [ ${rc} -eq ${expected} ]; then 80 printf "TEST: %-60s [ OK ]\n" "${msg}" 81 nsuccess=$((nsuccess+1)) 82 else 83 # shellcheck disable=SC2154 84 ret=$(ksft_exit_status_merge "$ret" "$ksft_fail") 85 nfail=$((nfail+1)) 86 printf "TEST: %-60s [FAIL]\n" "${msg}" 87 if [ "$VERBOSE" = "1" ]; then 88 echo " rc=$rc, expected $expected" 89 fi 90 91 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then 92 echo 93 echo "hit enter to continue, 'q' to quit" 94 read a 95 [ "$a" = "q" ] && exit 1 96 fi 97 fi 98 99 if [ "${PAUSE}" = "yes" ]; then 100 echo 101 echo "hit enter to continue, 'q' to quit" 102 read a 103 [ "$a" = "q" ] && exit 1 104 fi 105 106 [ "$VERBOSE" = "1" ] && echo 107 return 0 108} 109 110run_cmd() 111{ 112 local cmd="$1" 113 local out 114 local stderr="2>/dev/null" 115 116 if [ "$VERBOSE" = "1" ]; then 117 printf "COMMAND: $cmd\n" 118 stderr= 119 fi 120 121 out=$(eval $cmd $stderr) 122 rc=$? 123 if [ "$VERBOSE" = "1" -a -n "$out" ]; then 124 echo " $out" 125 fi 126 127 return $rc 128} 129 130tc_check_packets() 131{ 132 local ns=$1; shift 133 local id=$1; shift 134 local handle=$1; shift 135 local count=$1; shift 136 local pkts 137 138 sleep 0.1 139 pkts=$(tc -n $ns -j -s filter show $id \ 140 | jq ".[] | select(.options.handle == $handle) | \ 141 .options.actions[0].stats.packets") 142 [[ $pkts == $count ]] 143} 144 145neigh_forward_grat_check() 146{ 147 if ! bridge link help 2>&1 | grep -q "neigh_forward_grat"; then 148 echo "SKIP: iproute2 bridge too old, missing gratuitous ARP/unsolicited NA forwarding control support" 149 # shellcheck disable=SC2154 150 return "$ksft_skip" 151 fi 152} 153 154################################################################################ 155# Setup 156 157setup_topo_ns() 158{ 159 local ns=$1; shift 160 161 ip netns exec $ns sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1 162 ip netns exec $ns sysctl -qw net.ipv6.conf.default.ignore_routes_with_linkdown=1 163 ip netns exec $ns sysctl -qw net.ipv6.conf.all.accept_dad=0 164 ip netns exec $ns sysctl -qw net.ipv6.conf.default.accept_dad=0 165} 166 167setup_topo() 168{ 169 local ns 170 171 setup_ns h1 h2 sw1 sw2 172 for ns in $h1 $h2 $sw1 $sw2; do 173 setup_topo_ns $ns 174 done 175 176 ip -n $h1 link add name eth0 type veth peer name swp1 netns $sw1 177 ip -n $sw1 link add name veth0 type veth peer name veth0 netns $sw2 178 ip -n $h2 link add name eth0 type veth peer name swp1 netns $sw2 179} 180 181setup_host_common() 182{ 183 local ns=$1; shift 184 local v4addr1=$1; shift 185 local v4addr2=$1; shift 186 local v6addr1=$1; shift 187 local v6addr2=$1; shift 188 189 ip -n $ns link set dev eth0 up 190 ip -n $ns link add link eth0 name eth0.10 up type vlan id 10 191 ip -n $ns link add link eth0 name eth0.20 up type vlan id 20 192 193 ip -n $ns address add $v4addr1 dev eth0.10 194 ip -n $ns address add $v4addr2 dev eth0.20 195 ip -n $ns address add $v6addr1 dev eth0.10 196 ip -n $ns address add $v6addr2 dev eth0.20 197} 198 199setup_h1() 200{ 201 local ns=$h1 202 local v4addr1=192.0.2.1/28 203 local v4addr2=192.0.2.17/28 204 local v6addr1=2001:db8:1::1/64 205 local v6addr2=2001:db8:2::1/64 206 207 setup_host_common $ns $v4addr1 $v4addr2 $v6addr1 $v6addr2 208} 209 210setup_h2() 211{ 212 local ns=$h2 213 local v4addr1=192.0.2.2/28 214 local v4addr2=192.0.2.18/28 215 local v6addr1=2001:db8:1::2/64 216 local v6addr2=2001:db8:2::2/64 217 218 setup_host_common $ns $v4addr1 $v4addr2 $v6addr1 $v6addr2 219} 220 221setup_sw_common() 222{ 223 local ns=$1; shift 224 local local_addr=$1; shift 225 local remote_addr=$1; shift 226 local veth_addr=$1; shift 227 local gw_addr=$1; shift 228 229 ip -n $ns address add $local_addr/32 dev lo 230 231 ip -n $ns link set dev veth0 up 232 ip -n $ns address add $veth_addr/28 dev veth0 233 ip -n $ns route add default via $gw_addr 234 235 ip -n $ns link add name br0 up type bridge vlan_filtering 1 \ 236 vlan_default_pvid 0 mcast_snooping 0 237 238 ip -n $ns link add link br0 name br0.10 up type vlan id 10 239 bridge -n $ns vlan add vid 10 dev br0 self 240 241 ip -n $ns link add link br0 name br0.20 up type vlan id 20 242 bridge -n $ns vlan add vid 20 dev br0 self 243 244 ip -n $ns link set dev swp1 up master br0 245 bridge -n $ns vlan add vid 10 dev swp1 246 bridge -n $ns vlan add vid 20 dev swp1 247 248 ip -n $ns link add name vx0 up master br0 type vxlan \ 249 local $local_addr dstport 4789 nolearning external 250 bridge -n $ns fdb add 00:00:00:00:00:00 dev vx0 self static \ 251 dst $remote_addr src_vni 10010 252 bridge -n $ns fdb add 00:00:00:00:00:00 dev vx0 self static \ 253 dst $remote_addr src_vni 10020 254 bridge -n $ns link set dev vx0 vlan_tunnel on learning off 255 256 bridge -n $ns vlan add vid 10 dev vx0 257 bridge -n $ns vlan add vid 10 dev vx0 tunnel_info id 10010 258 259 bridge -n $ns vlan add vid 20 dev vx0 260 bridge -n $ns vlan add vid 20 dev vx0 tunnel_info id 10020 261} 262 263setup_sw1() 264{ 265 local ns=$sw1 266 local local_addr=192.0.2.33 267 local remote_addr=192.0.2.34 268 local veth_addr=192.0.2.49 269 local gw_addr=192.0.2.50 270 271 setup_sw_common $ns $local_addr $remote_addr $veth_addr $gw_addr 272} 273 274setup_sw2() 275{ 276 local ns=$sw2 277 local local_addr=192.0.2.34 278 local remote_addr=192.0.2.33 279 local veth_addr=192.0.2.50 280 local gw_addr=192.0.2.49 281 282 setup_sw_common $ns $local_addr $remote_addr $veth_addr $gw_addr 283} 284 285setup() 286{ 287 set -e 288 289 setup_topo 290 setup_h1 291 setup_h2 292 setup_sw1 293 setup_sw2 294 295 sleep 5 296 297 set +e 298} 299 300cleanup() 301{ 302 cleanup_ns $h1 $h2 $sw1 $sw2 303} 304 305################################################################################ 306# Tests 307 308neigh_suppress_arp_common() 309{ 310 local vid=$1; shift 311 local sip=$1; shift 312 local tip=$1; shift 313 local h2_mac 314 315 echo 316 echo "Per-port ARP suppression - VLAN $vid" 317 echo "----------------------------------" 318 319 run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact" 320 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto 0x0806 flower indev swp1 arp_tip $tip arp_sip $sip arp_op request action pass" 321 322 # Initial state - check that ARP requests are not suppressed and that 323 # ARP replies are received. 324 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip -I eth0.$vid $tip" 325 log_test $? 0 "arping" 326 tc_check_packets $sw1 "dev vx0 egress" 101 1 327 log_test $? 0 "ARP suppression" 328 329 # Enable neighbor suppression and check that nothing changes compared 330 # to the initial state. 331 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on" 332 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\"" 333 log_test $? 0 "\"neigh_suppress\" is on" 334 335 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip -I eth0.$vid $tip" 336 log_test $? 0 "arping" 337 tc_check_packets $sw1 "dev vx0 egress" 101 2 338 log_test $? 0 "ARP suppression" 339 340 # Install an FDB entry for the remote host and check that nothing 341 # changes compared to the initial state. 342 h2_mac=$(ip -n $h2 -j -p link show eth0.$vid | jq -r '.[]["address"]') 343 run_cmd "bridge -n $sw1 fdb replace $h2_mac dev vx0 master static vlan $vid" 344 log_test $? 0 "FDB entry installation" 345 346 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip -I eth0.$vid $tip" 347 log_test $? 0 "arping" 348 tc_check_packets $sw1 "dev vx0 egress" 101 3 349 log_test $? 0 "ARP suppression" 350 351 # Install a neighbor on the matching SVI interface and check that ARP 352 # requests are suppressed. 353 run_cmd "ip -n $sw1 neigh replace $tip lladdr $h2_mac nud permanent dev br0.$vid" 354 log_test $? 0 "Neighbor entry installation" 355 356 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip -I eth0.$vid $tip" 357 log_test $? 0 "arping" 358 tc_check_packets $sw1 "dev vx0 egress" 101 3 359 log_test $? 0 "ARP suppression" 360 361 # Take the second host down and check that ARP requests are suppressed 362 # and that ARP replies are received. 363 run_cmd "ip -n $h2 link set dev eth0.$vid down" 364 log_test $? 0 "H2 down" 365 366 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip -I eth0.$vid $tip" 367 log_test $? 0 "arping" 368 tc_check_packets $sw1 "dev vx0 egress" 101 3 369 log_test $? 0 "ARP suppression" 370 371 run_cmd "ip -n $h2 link set dev eth0.$vid up" 372 log_test $? 0 "H2 up" 373 374 # Disable neighbor suppression and check that ARP requests are no 375 # longer suppressed. 376 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress off" 377 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress off\"" 378 log_test $? 0 "\"neigh_suppress\" is off" 379 380 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip -I eth0.$vid $tip" 381 log_test $? 0 "arping" 382 tc_check_packets $sw1 "dev vx0 egress" 101 4 383 log_test $? 0 "ARP suppression" 384 385 # Take the second host down and check that ARP requests are not 386 # suppressed and that ARP replies are not received. 387 run_cmd "ip -n $h2 link set dev eth0.$vid down" 388 log_test $? 0 "H2 down" 389 390 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip -I eth0.$vid $tip" 391 log_test $? 1 "arping" 392 tc_check_packets $sw1 "dev vx0 egress" 101 5 393 log_test $? 0 "ARP suppression" 394} 395 396neigh_suppress_arp() 397{ 398 local vid=10 399 local sip=192.0.2.1 400 local tip=192.0.2.2 401 402 neigh_suppress_arp_common $vid $sip $tip 403 404 vid=20 405 sip=192.0.2.17 406 tip=192.0.2.18 407 neigh_suppress_arp_common $vid $sip $tip 408} 409 410neigh_suppress_uc_arp_common() 411{ 412 local vid=$1; shift 413 local sip=$1; shift 414 local tip=$1; shift 415 local tmac 416 417 echo 418 echo "Unicast ARP, per-port ARP suppression - VLAN $vid" 419 echo "-----------------------------------------------" 420 421 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on" 422 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\"" 423 log_test $? 0 "\"neigh_suppress\" is on" 424 425 tmac=$(ip -n $h2 -j -p link show eth0.$vid | jq -r '.[]["address"]') 426 run_cmd "bridge -n $sw1 fdb replace $tmac dev vx0 master static vlan $vid" 427 run_cmd "ip -n $sw1 neigh replace $tip lladdr $tmac nud permanent dev br0.$vid" 428 429 run_cmd "tc -n $h1 qdisc replace dev eth0.$vid clsact" 430 run_cmd "tc -n $h1 filter replace dev eth0.$vid ingress pref 1 handle 101 proto arp flower arp_sip $tip arp_op reply action pass" 431 432 run_cmd "tc -n $h2 qdisc replace dev eth0.$vid clsact" 433 run_cmd "tc -n $h2 filter replace dev eth0.$vid egress pref 1 handle 101 proto arp flower arp_tip $sip arp_op reply action pass" 434 435 run_cmd "ip netns exec $h1 mausezahn eth0.$vid -c 1 -a own -b $tmac -t arp 'request sip=$sip, tip=$tip, tmac=$tmac' -q" 436 tc_check_packets $h1 "dev eth0.$vid ingress" 101 1 437 log_test $? 0 "Unicast ARP, suppression on, h1 filter" 438 tc_check_packets $h2 "dev eth0.$vid egress" 101 1 439 log_test $? 0 "Unicast ARP, suppression on, h2 filter" 440} 441 442neigh_suppress_uc_arp() 443{ 444 local vid=10 445 local sip=192.0.2.1 446 local tip=192.0.2.2 447 448 neigh_suppress_uc_arp_common $vid $sip $tip 449 450 vid=20 451 sip=192.0.2.17 452 tip=192.0.2.18 453 neigh_suppress_uc_arp_common $vid $sip $tip 454} 455 456neigh_suppress_ns_common() 457{ 458 local vid=$1; shift 459 local saddr=$1; shift 460 local daddr=$1; shift 461 local maddr=$1; shift 462 local h2_mac 463 464 echo 465 echo "Per-port NS suppression - VLAN $vid" 466 echo "---------------------------------" 467 468 run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact" 469 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $maddr src_ip $saddr type 135 code 0 action pass" 470 471 # Initial state - check that NS messages are not suppressed and that ND 472 # messages are received. 473 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr -w 5000 $daddr eth0.$vid" 474 log_test $? 0 "ndisc6" 475 tc_check_packets $sw1 "dev vx0 egress" 101 1 476 log_test $? 0 "NS suppression" 477 478 # Enable neighbor suppression and check that nothing changes compared 479 # to the initial state. 480 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on" 481 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\"" 482 log_test $? 0 "\"neigh_suppress\" is on" 483 484 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr -w 5000 $daddr eth0.$vid" 485 log_test $? 0 "ndisc6" 486 tc_check_packets $sw1 "dev vx0 egress" 101 2 487 log_test $? 0 "NS suppression" 488 489 # Install an FDB entry for the remote host and check that nothing 490 # changes compared to the initial state. 491 h2_mac=$(ip -n $h2 -j -p link show eth0.$vid | jq -r '.[]["address"]') 492 run_cmd "bridge -n $sw1 fdb replace $h2_mac dev vx0 master static vlan $vid" 493 log_test $? 0 "FDB entry installation" 494 495 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr -w 5000 $daddr eth0.$vid" 496 log_test $? 0 "ndisc6" 497 tc_check_packets $sw1 "dev vx0 egress" 101 3 498 log_test $? 0 "NS suppression" 499 500 # Install a neighbor on the matching SVI interface and check that NS 501 # messages are suppressed. 502 run_cmd "ip -n $sw1 neigh replace $daddr lladdr $h2_mac nud permanent dev br0.$vid" 503 log_test $? 0 "Neighbor entry installation" 504 505 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr -w 5000 $daddr eth0.$vid" 506 log_test $? 0 "ndisc6" 507 tc_check_packets $sw1 "dev vx0 egress" 101 3 508 log_test $? 0 "NS suppression" 509 510 # Take the second host down and check that NS messages are suppressed 511 # and that ND messages are received. 512 run_cmd "ip -n $h2 link set dev eth0.$vid down" 513 log_test $? 0 "H2 down" 514 515 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr -w 5000 $daddr eth0.$vid" 516 log_test $? 0 "ndisc6" 517 tc_check_packets $sw1 "dev vx0 egress" 101 3 518 log_test $? 0 "NS suppression" 519 520 run_cmd "ip -n $h2 link set dev eth0.$vid up" 521 log_test $? 0 "H2 up" 522 523 # Disable neighbor suppression and check that NS messages are no longer 524 # suppressed. 525 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress off" 526 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress off\"" 527 log_test $? 0 "\"neigh_suppress\" is off" 528 529 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr -w 5000 $daddr eth0.$vid" 530 log_test $? 0 "ndisc6" 531 tc_check_packets $sw1 "dev vx0 egress" 101 4 532 log_test $? 0 "NS suppression" 533 534 # Take the second host down and check that NS messages are not 535 # suppressed and that ND messages are not received. 536 run_cmd "ip -n $h2 link set dev eth0.$vid down" 537 log_test $? 0 "H2 down" 538 539 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr -w 5000 $daddr eth0.$vid" 540 log_test $? 2 "ndisc6" 541 tc_check_packets $sw1 "dev vx0 egress" 101 5 542 log_test $? 0 "NS suppression" 543} 544 545neigh_suppress_ns() 546{ 547 local vid=10 548 local saddr=2001:db8:1::1 549 local daddr=2001:db8:1::2 550 local maddr=ff02::1:ff00:2 551 552 neigh_suppress_ns_common $vid $saddr $daddr $maddr 553 554 vid=20 555 saddr=2001:db8:2::1 556 daddr=2001:db8:2::2 557 maddr=ff02::1:ff00:2 558 559 neigh_suppress_ns_common $vid $saddr $daddr $maddr 560} 561 562icmpv6_header_get() 563{ 564 local csum=$1; shift 565 local tip=$1; shift 566 local type 567 local p 568 569 # Type 135 (Neighbor Solicitation), hex format 570 type="87" 571 p=$(: 572 )"$type:"$( : ICMPv6.type 573 )"00:"$( : ICMPv6.code 574 )"$csum:"$( : ICMPv6.checksum 575 )"00:00:00:00:"$( : Reserved 576 )"$tip:"$( : Target Address 577 ) 578 echo $p 579} 580 581icmpv6_na_header_get() 582{ 583 local csum=$1; shift 584 local tip=$1; shift 585 586 # Type 136 (Neighbor Advertisement), hex format, Override flag set, 587 # Solicited flag clear (unsolicited NA). 588 # ICMPv6.type : ICMPv6.code : ICMPv6.checksum : Flags : Target Address 589 echo "88:00:$csum:20:00:00:00:$tip:" 590} 591 592neigh_suppress_uc_ns_common() 593{ 594 local vid=$1; shift 595 local sip=$1; shift 596 local dip=$1; shift 597 local full_dip=$1; shift 598 local csum=$1; shift 599 local tmac 600 601 echo 602 echo "Unicast NS, per-port NS suppression - VLAN $vid" 603 echo "---------------------------------------------" 604 605 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on" 606 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\"" 607 log_test $? 0 "\"neigh_suppress\" is on" 608 609 tmac=$(ip -n $h2 -j -p link show eth0.$vid | jq -r '.[]["address"]') 610 run_cmd "bridge -n $sw1 fdb replace $tmac dev vx0 master static vlan $vid" 611 run_cmd "ip -n $sw1 -6 neigh replace $dip lladdr $tmac nud permanent dev br0.$vid" 612 613 run_cmd "tc -n $h1 qdisc replace dev eth0.$vid clsact" 614 run_cmd "tc -n $h1 filter replace dev eth0.$vid ingress pref 1 handle 101 proto ipv6 flower ip_proto icmpv6 src_ip $dip type 136 code 0 action pass" 615 616 run_cmd "tc -n $h2 qdisc replace dev eth0.$vid clsact" 617 run_cmd "tc -n $h2 filter replace dev eth0.$vid egress pref 1 handle 101 proto ipv6 flower ip_proto icmpv6 dst_ip $sip type 136 code 0 action pass" 618 619 run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a own -b $tmac -A $sip -B $dip -t ip hop=255,next=58,payload=$(icmpv6_header_get $csum $full_dip) -q" 620 tc_check_packets $h1 "dev eth0.$vid ingress" 101 1 621 log_test $? 0 "Unicast NS, suppression on, h1 filter" 622 tc_check_packets $h2 "dev eth0.$vid egress" 101 1 623 log_test $? 0 "Unicast NS, suppression on, h2 filter" 624} 625 626neigh_suppress_uc_ns() 627{ 628 local vid=10 629 local saddr=2001:db8:1::1 630 local daddr=2001:db8:1::2 631 local full_daddr=20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:02 632 local csum="ef:79" 633 634 neigh_suppress_uc_ns_common $vid $saddr $daddr $full_daddr $csum 635 636 vid=20 637 saddr=2001:db8:2::1 638 daddr=2001:db8:2::2 639 full_daddr=20:01:0d:b8:00:02:00:00:00:00:00:00:00:00:00:02 640 csum="ef:76" 641 642 neigh_suppress_uc_ns_common $vid $saddr $daddr $full_daddr $csum 643} 644 645neigh_vlan_suppress_arp() 646{ 647 local vid1=10 648 local vid2=20 649 local sip1=192.0.2.1 650 local sip2=192.0.2.17 651 local tip1=192.0.2.2 652 local tip2=192.0.2.18 653 local h2_mac1 654 local h2_mac2 655 656 echo 657 echo "Per-{Port, VLAN} ARP suppression" 658 echo "--------------------------------" 659 660 run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact" 661 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto 0x0806 flower indev swp1 arp_tip $tip1 arp_sip $sip1 arp_op request action pass" 662 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 102 proto 0x0806 flower indev swp1 arp_tip $tip2 arp_sip $sip2 arp_op request action pass" 663 664 h2_mac1=$(ip -n $h2 -j -p link show eth0.$vid1 | jq -r '.[]["address"]') 665 h2_mac2=$(ip -n $h2 -j -p link show eth0.$vid2 | jq -r '.[]["address"]') 666 run_cmd "bridge -n $sw1 fdb replace $h2_mac1 dev vx0 master static vlan $vid1" 667 run_cmd "bridge -n $sw1 fdb replace $h2_mac2 dev vx0 master static vlan $vid2" 668 run_cmd "ip -n $sw1 neigh replace $tip1 lladdr $h2_mac1 nud permanent dev br0.$vid1" 669 run_cmd "ip -n $sw1 neigh replace $tip2 lladdr $h2_mac2 nud permanent dev br0.$vid2" 670 671 # Enable per-{Port, VLAN} neighbor suppression and check that ARP 672 # requests are not suppressed and that ARP replies are received. 673 run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress on" 674 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress on\"" 675 log_test $? 0 "\"neigh_vlan_suppress\" is on" 676 677 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip1 -I eth0.$vid1 $tip1" 678 log_test $? 0 "arping (VLAN $vid1)" 679 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip2 -I eth0.$vid2 $tip2" 680 log_test $? 0 "arping (VLAN $vid2)" 681 682 tc_check_packets $sw1 "dev vx0 egress" 101 1 683 log_test $? 0 "ARP suppression (VLAN $vid1)" 684 tc_check_packets $sw1 "dev vx0 egress" 102 1 685 log_test $? 0 "ARP suppression (VLAN $vid2)" 686 687 # Enable neighbor suppression on VLAN 10 and check that only on this 688 # VLAN ARP requests are suppressed. 689 run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress on" 690 run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress on\"" 691 log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid1)" 692 run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid2 | grep \"neigh_suppress off\"" 693 log_test $? 0 "\"neigh_suppress\" is off (VLAN $vid2)" 694 695 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip1 -I eth0.$vid1 $tip1" 696 log_test $? 0 "arping (VLAN $vid1)" 697 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip2 -I eth0.$vid2 $tip2" 698 log_test $? 0 "arping (VLAN $vid2)" 699 700 tc_check_packets $sw1 "dev vx0 egress" 101 1 701 log_test $? 0 "ARP suppression (VLAN $vid1)" 702 tc_check_packets $sw1 "dev vx0 egress" 102 2 703 log_test $? 0 "ARP suppression (VLAN $vid2)" 704 705 # Enable neighbor suppression on the port and check that it has no 706 # effect compared to previous state. 707 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on" 708 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\"" 709 log_test $? 0 "\"neigh_suppress\" is on" 710 711 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip1 -I eth0.$vid1 $tip1" 712 log_test $? 0 "arping (VLAN $vid1)" 713 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip2 -I eth0.$vid2 $tip2" 714 log_test $? 0 "arping (VLAN $vid2)" 715 716 tc_check_packets $sw1 "dev vx0 egress" 101 1 717 log_test $? 0 "ARP suppression (VLAN $vid1)" 718 tc_check_packets $sw1 "dev vx0 egress" 102 3 719 log_test $? 0 "ARP suppression (VLAN $vid2)" 720 721 # Disable neighbor suppression on the port and check that it has no 722 # effect compared to previous state. 723 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress off" 724 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress off\"" 725 log_test $? 0 "\"neigh_suppress\" is off" 726 727 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip1 -I eth0.$vid1 $tip1" 728 log_test $? 0 "arping (VLAN $vid1)" 729 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip2 -I eth0.$vid2 $tip2" 730 log_test $? 0 "arping (VLAN $vid2)" 731 732 tc_check_packets $sw1 "dev vx0 egress" 101 1 733 log_test $? 0 "ARP suppression (VLAN $vid1)" 734 tc_check_packets $sw1 "dev vx0 egress" 102 4 735 log_test $? 0 "ARP suppression (VLAN $vid2)" 736 737 # Disable neighbor suppression on VLAN 10 and check that ARP requests 738 # are no longer suppressed on this VLAN. 739 run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress off" 740 run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress off\"" 741 log_test $? 0 "\"neigh_suppress\" is off (VLAN $vid1)" 742 743 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip1 -I eth0.$vid1 $tip1" 744 log_test $? 0 "arping (VLAN $vid1)" 745 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip2 -I eth0.$vid2 $tip2" 746 log_test $? 0 "arping (VLAN $vid2)" 747 748 tc_check_packets $sw1 "dev vx0 egress" 101 2 749 log_test $? 0 "ARP suppression (VLAN $vid1)" 750 tc_check_packets $sw1 "dev vx0 egress" 102 5 751 log_test $? 0 "ARP suppression (VLAN $vid2)" 752 753 # Disable per-{Port, VLAN} neighbor suppression, enable neighbor 754 # suppression on the port and check that on both VLANs ARP requests are 755 # suppressed. 756 run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress off" 757 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress off\"" 758 log_test $? 0 "\"neigh_vlan_suppress\" is off" 759 760 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on" 761 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\"" 762 log_test $? 0 "\"neigh_suppress\" is on" 763 764 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip1 -I eth0.$vid1 $tip1" 765 log_test $? 0 "arping (VLAN $vid1)" 766 run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip2 -I eth0.$vid2 $tip2" 767 log_test $? 0 "arping (VLAN $vid2)" 768 769 tc_check_packets $sw1 "dev vx0 egress" 101 2 770 log_test $? 0 "ARP suppression (VLAN $vid1)" 771 tc_check_packets $sw1 "dev vx0 egress" 102 5 772 log_test $? 0 "ARP suppression (VLAN $vid2)" 773} 774 775neigh_vlan_suppress_ns() 776{ 777 local vid1=10 778 local vid2=20 779 local saddr1=2001:db8:1::1 780 local saddr2=2001:db8:2::1 781 local daddr1=2001:db8:1::2 782 local daddr2=2001:db8:2::2 783 local maddr=ff02::1:ff00:2 784 local h2_mac1 785 local h2_mac2 786 787 echo 788 echo "Per-{Port, VLAN} NS suppression" 789 echo "-------------------------------" 790 791 run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact" 792 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $maddr src_ip $saddr1 type 135 code 0 action pass" 793 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 102 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $maddr src_ip $saddr2 type 135 code 0 action pass" 794 795 h2_mac1=$(ip -n $h2 -j -p link show eth0.$vid1 | jq -r '.[]["address"]') 796 h2_mac2=$(ip -n $h2 -j -p link show eth0.$vid2 | jq -r '.[]["address"]') 797 run_cmd "bridge -n $sw1 fdb replace $h2_mac1 dev vx0 master static vlan $vid1" 798 run_cmd "bridge -n $sw1 fdb replace $h2_mac2 dev vx0 master static vlan $vid2" 799 run_cmd "ip -n $sw1 neigh replace $daddr1 lladdr $h2_mac1 nud permanent dev br0.$vid1" 800 run_cmd "ip -n $sw1 neigh replace $daddr2 lladdr $h2_mac2 nud permanent dev br0.$vid2" 801 802 # Enable per-{Port, VLAN} neighbor suppression and check that NS 803 # messages are not suppressed and that ND messages are received. 804 run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress on" 805 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress on\"" 806 log_test $? 0 "\"neigh_vlan_suppress\" is on" 807 808 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr1 -w 5000 $daddr1 eth0.$vid1" 809 log_test $? 0 "ndisc6 (VLAN $vid1)" 810 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr2 -w 5000 $daddr2 eth0.$vid2" 811 log_test $? 0 "ndisc6 (VLAN $vid2)" 812 813 tc_check_packets $sw1 "dev vx0 egress" 101 1 814 log_test $? 0 "NS suppression (VLAN $vid1)" 815 tc_check_packets $sw1 "dev vx0 egress" 102 1 816 log_test $? 0 "NS suppression (VLAN $vid2)" 817 818 # Enable neighbor suppression on VLAN 10 and check that only on this 819 # VLAN NS messages are suppressed. 820 run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress on" 821 run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress on\"" 822 log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid1)" 823 run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid2 | grep \"neigh_suppress off\"" 824 log_test $? 0 "\"neigh_suppress\" is off (VLAN $vid2)" 825 826 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr1 -w 5000 $daddr1 eth0.$vid1" 827 log_test $? 0 "ndisc6 (VLAN $vid1)" 828 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr2 -w 5000 $daddr2 eth0.$vid2" 829 log_test $? 0 "ndisc6 (VLAN $vid2)" 830 831 tc_check_packets $sw1 "dev vx0 egress" 101 1 832 log_test $? 0 "NS suppression (VLAN $vid1)" 833 tc_check_packets $sw1 "dev vx0 egress" 102 2 834 log_test $? 0 "NS suppression (VLAN $vid2)" 835 836 # Enable neighbor suppression on the port and check that it has no 837 # effect compared to previous state. 838 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on" 839 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\"" 840 log_test $? 0 "\"neigh_suppress\" is on" 841 842 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr1 -w 5000 $daddr1 eth0.$vid1" 843 log_test $? 0 "ndisc6 (VLAN $vid1)" 844 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr2 -w 5000 $daddr2 eth0.$vid2" 845 log_test $? 0 "ndisc6 (VLAN $vid2)" 846 847 tc_check_packets $sw1 "dev vx0 egress" 101 1 848 log_test $? 0 "NS suppression (VLAN $vid1)" 849 tc_check_packets $sw1 "dev vx0 egress" 102 3 850 log_test $? 0 "NS suppression (VLAN $vid2)" 851 852 # Disable neighbor suppression on the port and check that it has no 853 # effect compared to previous state. 854 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress off" 855 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress off\"" 856 log_test $? 0 "\"neigh_suppress\" is off" 857 858 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr1 -w 5000 $daddr1 eth0.$vid1" 859 log_test $? 0 "ndisc6 (VLAN $vid1)" 860 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr2 -w 5000 $daddr2 eth0.$vid2" 861 log_test $? 0 "ndisc6 (VLAN $vid2)" 862 863 tc_check_packets $sw1 "dev vx0 egress" 101 1 864 log_test $? 0 "NS suppression (VLAN $vid1)" 865 tc_check_packets $sw1 "dev vx0 egress" 102 4 866 log_test $? 0 "NS suppression (VLAN $vid2)" 867 868 # Disable neighbor suppression on VLAN 10 and check that NS messages 869 # are no longer suppressed on this VLAN. 870 run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress off" 871 run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress off\"" 872 log_test $? 0 "\"neigh_suppress\" is off (VLAN $vid1)" 873 874 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr1 -w 5000 $daddr1 eth0.$vid1" 875 log_test $? 0 "ndisc6 (VLAN $vid1)" 876 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr2 -w 5000 $daddr2 eth0.$vid2" 877 log_test $? 0 "ndisc6 (VLAN $vid2)" 878 879 tc_check_packets $sw1 "dev vx0 egress" 101 2 880 log_test $? 0 "NS suppression (VLAN $vid1)" 881 tc_check_packets $sw1 "dev vx0 egress" 102 5 882 log_test $? 0 "NS suppression (VLAN $vid2)" 883 884 # Disable per-{Port, VLAN} neighbor suppression, enable neighbor 885 # suppression on the port and check that on both VLANs NS messages are 886 # suppressed. 887 run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress off" 888 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress off\"" 889 log_test $? 0 "\"neigh_vlan_suppress\" is off" 890 891 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on" 892 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\"" 893 log_test $? 0 "\"neigh_suppress\" is on" 894 895 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr1 -w 5000 $daddr1 eth0.$vid1" 896 log_test $? 0 "ndisc6 (VLAN $vid1)" 897 run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr2 -w 5000 $daddr2 eth0.$vid2" 898 log_test $? 0 "ndisc6 (VLAN $vid2)" 899 900 tc_check_packets $sw1 "dev vx0 egress" 101 2 901 log_test $? 0 "NS suppression (VLAN $vid1)" 902 tc_check_packets $sw1 "dev vx0 egress" 102 5 903 log_test $? 0 "NS suppression (VLAN $vid2)" 904} 905 906neigh_suppress_arp_probe() 907{ 908 local vid=10 909 local tip=192.0.2.2 910 local h2_mac 911 912 echo 913 echo "Per-port ARP probe suppression" 914 echo "------------------------------" 915 916 run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact" 917 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto 0x0806 flower indev swp1 arp_tip $tip arp_sip 0.0.0.0 arp_op request action pass" 918 919 # Initial state - check that ARP probes are not suppressed. 920 run_cmd "ip netns exec $h1 arping -D -q -c 1 -w 5 -I eth0.$vid $tip" 921 tc_check_packets "$sw1" "dev vx0 egress" 101 1 922 log_test $? 0 "ARP probe suppression" 923 924 # Enable neighbor suppression and check that nothing changes. 925 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on" 926 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\"" 927 log_test $? 0 "\"neigh_suppress\" is on" 928 929 run_cmd "ip netns exec $h1 arping -D -q -c 1 -w 5 -I eth0.$vid $tip" 930 tc_check_packets "$sw1" "dev vx0 egress" 101 2 931 log_test $? 0 "ARP probe suppression" 932 933 # Install FDB and a neighbor and check that ARP probes are suppressed. 934 h2_mac=$(ip -n "$h2" -j -p link show eth0."$vid" | jq -r '.[]["address"]') 935 run_cmd "bridge -n $sw1 fdb replace $h2_mac dev vx0 master static vlan $vid" 936 run_cmd "ip -n $sw1 neigh replace $tip lladdr $h2_mac nud permanent dev br0.$vid" 937 log_test $? 0 "FDB and neighbor entry installation" 938 939 run_cmd "ip netns exec $h1 arping -D -q -c 1 -w 5 -I eth0.$vid $tip" 940 log_test $? 1 "arping" 941 tc_check_packets "$sw1" "dev vx0 egress" 101 2 942 log_test $? 0 "ARP probe suppression" 943 944 # Remove the neighbor entry and check that ARP probes are not suppressed. 945 run_cmd "ip -n $sw1 neigh del $tip dev br0.$vid" 946 log_test $? 0 "neighbor removal" 947 948 run_cmd "ip netns exec $h1 arping -D -q -c 1 -w 5 -I eth0.$vid $tip" 949 tc_check_packets "$sw1" "dev vx0 egress" 101 3 950 log_test $? 0 "ARP probe suppression" 951 952 # Disable neighbor suppression. 953 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress off" 954 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress off\"" 955 log_test $? 0 "\"neigh_suppress\" is off" 956 957 run_cmd "ip netns exec $h1 arping -D -q -c 1 -w 5 -I eth0.$vid $tip" 958 tc_check_packets "$sw1" "dev vx0 egress" 101 4 959 log_test $? 0 "ARP probe suppression" 960} 961 962neigh_suppress_dad_ns() 963{ 964 local vid=10 965 local tip=2001:db8:1::99 966 local mcast=ff02::1:ff00:99 967 local dmac=33:33:ff:00:00:99 968 local full_tip=20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:99 969 local csum="4b:bc" 970 local smac 971 local tmac 972 973 echo 974 echo "Per-port DAD NS suppression" 975 echo "---------------------------" 976 977 smac=$(ip -n "$h1" -j -p link show eth0."$vid" | jq -r '.[]["address"]') 978 979 run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact" 980 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $mcast src_ip :: type 135 code 0 action pass" 981 982 # Initial state - check that DAD NS are not suppressed. 983 run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A :: -B $mcast -t ip hop=255,next=58,payload=$(icmpv6_header_get "$csum" "$full_tip") -q" 984 tc_check_packets "$sw1" "dev vx0 egress" 101 1 985 log_test $? 0 "DAD NS suppression" 986 987 # Enable neighbor suppression and check that nothing changes. 988 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on" 989 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\"" 990 log_test $? 0 "\"neigh_suppress\" is on" 991 992 run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A :: -B $mcast -t ip hop=255,next=58,payload=$(icmpv6_header_get "$csum" "$full_tip") -q" 993 tc_check_packets "$sw1" "dev vx0 egress" 101 2 994 log_test $? 0 "DAD NS suppression" 995 996 # Install FDB and a neighbor and check that DAD NS are suppressed 997 # and that a proxy NA is sent back to h1. 998 tmac=$(ip -n "$h2" -j -p link show eth0."$vid" | jq -r '.[]["address"]') 999 run_cmd "bridge -n $sw1 fdb replace $tmac dev vx0 master static vlan $vid" 1000 run_cmd "ip -n $sw1 -6 neigh replace $tip lladdr $tmac nud permanent dev br0.$vid" 1001 log_test $? 0 "FDB and neighbor entry installation" 1002 1003 run_cmd "tc -n $h1 qdisc replace dev eth0.$vid clsact" 1004 run_cmd "tc -n $h1 filter replace dev eth0.$vid ingress pref 1 handle 101 proto ipv6 flower ip_proto icmpv6 dst_ip ff02::1 src_ip $tip type 136 code 0 action pass" 1005 1006 run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A :: -B $mcast -t ip hop=255,next=58,payload=$(icmpv6_header_get "$csum" "$full_tip") -q" 1007 tc_check_packets "$sw1" "dev vx0 egress" 101 2 1008 log_test $? 0 "DAD NS suppression" 1009 tc_check_packets "$h1" "dev eth0.$vid ingress" 101 1 1010 log_test $? 0 "DAD NS proxy NA reply" 1011 1012 # Remove the neighbor entry and check that DAD NS are not suppressed. 1013 run_cmd "ip -n $sw1 -6 neigh del $tip dev br0.$vid" 1014 log_test $? 0 "neighbor removal" 1015 1016 run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A :: -B $mcast -t ip hop=255,next=58,payload=$(icmpv6_header_get "$csum" "$full_tip") -q" 1017 tc_check_packets "$sw1" "dev vx0 egress" 101 3 1018 log_test $? 0 "DAD NS suppression" 1019 1020 # Disable neighbor suppression. 1021 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress off" 1022 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress off\"" 1023 log_test $? 0 "\"neigh_suppress\" is off" 1024 1025 run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A :: -B $mcast -t ip hop=255,next=58,payload=$(icmpv6_header_get "$csum" "$full_tip") -q" 1026 tc_check_packets "$sw1" "dev vx0 egress" 101 4 1027 log_test $? 0 "DAD NS suppression" 1028} 1029 1030neigh_forward_grat_arp() 1031{ 1032 local vid=10 1033 local sip=192.0.2.1 1034 local tip=$sip 1035 local h2_ip=192.0.2.2 1036 local h2_mac 1037 1038 neigh_forward_grat_check || return $? 1039 1040 echo 1041 echo "Gratuitous ARP forwarding" 1042 echo "-------------------------" 1043 1044 run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact" 1045 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto 0x0806 flower indev swp1 arp_tip $tip arp_sip $sip arp_op request action pass" 1046 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 102 proto 0x0806 flower indev swp1 arp_tip $h2_ip arp_sip $sip arp_op request action pass" 1047 1048 h2_mac=$(ip -n "$h2" -j -p link show eth0."$vid" | jq -r '.[]["address"]') 1049 run_cmd "bridge -n $sw1 fdb replace $h2_mac dev vx0 master static vlan $vid" 1050 run_cmd "ip -n $sw1 neigh replace $tip lladdr $h2_mac nud permanent dev br0.$vid" 1051 run_cmd "ip -n $sw1 neigh replace $h2_ip lladdr $h2_mac nud permanent dev br0.$vid" 1052 1053 # Enable neighbor suppression. Gratuitous ARP should be suppressed by 1054 # default (neigh_forward_grat defaults to off). 1055 run_cmd "ip -n $sw1 link set dev vx0 type bridge_slave neigh_suppress on" 1056 run_cmd "ip -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\"" 1057 log_test $? 0 "\"neigh_suppress\" is on" 1058 1059 # Send gratuitous ARP (sip == tip) and check it's suppressed. 1060 run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid $tip" 1061 tc_check_packets "$sw1" "dev vx0 egress" 101 0 1062 log_test $? 0 "Gratuitous ARP suppression" 1063 1064 # Explicitly enable neigh_forward_grat and verify gratuitous ARP is 1065 # now forwarded. 1066 run_cmd "ip -n $sw1 link set dev vx0 type bridge_slave neigh_forward_grat on" 1067 run_cmd "ip -n $sw1 -d link show dev vx0 | grep \"neigh_forward_grat on\"" 1068 log_test $? 0 "\"neigh_forward_grat\" is on" 1069 1070 run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid $tip" 1071 tc_check_packets "$sw1" "dev vx0 egress" 101 1 1072 log_test $? 0 "Gratuitous ARP forwarding" 1073 1074 # Verify that regular (non-gratuitous) ARP requests are still 1075 # suppressed when neigh_forward_grat is enabled. 1076 run_cmd "ip netns exec $h1 arping -c 1 -w 5 -I eth0.$vid $h2_ip" 1077 tc_check_packets "$sw1" "dev vx0 egress" 102 0 1078 log_test $? 0 "Regular ARP suppression with \"neigh_forward_grat\" on" 1079 1080 # Disable neigh_forward_grat and verify suppression resumes. 1081 run_cmd "ip -n $sw1 link set dev vx0 type bridge_slave neigh_forward_grat off" 1082 run_cmd "ip -n $sw1 -d link show dev vx0 | grep \"neigh_forward_grat off\"" 1083 log_test $? 0 "\"neigh_forward_grat\" is off" 1084 1085 run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid $tip" 1086 tc_check_packets "$sw1" "dev vx0 egress" 101 1 1087 log_test $? 0 "Gratuitous ARP suppression" 1088} 1089 1090# neigh_forward_grat_arp() uses 'ip link' interface, and neigh_forward_grat_na() 1091# uses 'bridge link' interface to exercise both paths. 1092neigh_forward_grat_na() 1093{ 1094 local vid=10 1095 local saddr=2001:db8:1::1 1096 local daddr=ff02::1 1097 local h2_addr=2001:db8:1::2 1098 local h2_maddr=ff02::1:ff00:2 1099 local full_addr=20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01 1100 local h2_full_addr=20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:02 1101 local csum="fd:32" 1102 local csum_ns="1f:2f" 1103 local dmac=33:33:00:00:00:01 1104 local h2_dmac=33:33:ff:00:00:02 1105 local h2_mac 1106 local smac 1107 1108 neigh_forward_grat_check || return $? 1109 1110 echo 1111 echo "Unsolicited NA forwarding" 1112 echo "-------------------------" 1113 1114 smac=$(ip -n "$h1" -j -p link show eth0."$vid" | jq -r '.[]["address"]') 1115 1116 run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact" 1117 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $daddr src_ip $saddr type 136 code 0 action pass" 1118 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 102 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $h2_maddr src_ip $saddr type 135 code 0 action pass" 1119 1120 h2_mac=$(ip -n "$h2" -j -p link show eth0."$vid" | jq -r '.[]["address"]') 1121 run_cmd "bridge -n $sw1 fdb replace $h2_mac dev vx0 master static vlan $vid" 1122 run_cmd "ip -n $sw1 neigh replace $saddr lladdr $h2_mac nud permanent dev br0.$vid" 1123 run_cmd "ip -n $sw1 neigh replace $h2_addr lladdr $h2_mac nud permanent dev br0.$vid" 1124 1125 # Enable neighbor suppression. Unsolicited NA should be suppressed by 1126 # default (neigh_forward_grat defaults to off). 1127 run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on" 1128 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\"" 1129 log_test $? 0 "\"neigh_suppress\" is on" 1130 1131 # Send unsolicited NA and check it's suppressed. 1132 run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A $saddr -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum" "$full_addr") -q" 1133 tc_check_packets "$sw1" "dev vx0 egress" 101 0 1134 log_test $? 0 "Unsolicited NA suppression" 1135 1136 # Explicitly enable neigh_forward_grat and verify unsolicited NA is 1137 # now forwarded. 1138 run_cmd "bridge -n $sw1 link set dev vx0 neigh_forward_grat on" 1139 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_forward_grat on\"" 1140 log_test $? 0 "\"neigh_forward_grat\" is on" 1141 1142 run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A $saddr -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum" "$full_addr") -q" 1143 tc_check_packets "$sw1" "dev vx0 egress" 101 1 1144 log_test $? 0 "Unsolicited NA forwarding" 1145 1146 # Verify that solicited NS messages are still suppressed when 1147 # neigh_forward_grat is enabled. 1148 run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $h2_dmac -A $saddr -B $h2_maddr -t ip hop=255,next=58,payload=$(icmpv6_header_get "$csum_ns" "$h2_full_addr") -q" 1149 tc_check_packets "$sw1" "dev vx0 egress" 102 0 1150 log_test $? 0 "Solicited NS suppression with \"neigh_forward_grat\" on" 1151 1152 # Disable neigh_forward_grat and verify suppression resumes. 1153 run_cmd "bridge -n $sw1 link set dev vx0 neigh_forward_grat off" 1154 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_forward_grat off\"" 1155 log_test $? 0 "\"neigh_forward_grat\" is off" 1156 1157 run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A $saddr -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum" "$full_addr") -q" 1158 tc_check_packets "$sw1" "dev vx0 egress" 101 1 1159 log_test $? 0 "Unsolicited NA suppression" 1160} 1161 1162neigh_vlan_forward_grat_arp() 1163{ 1164 local vid1=10 1165 local vid2=20 1166 local sip1=192.0.2.1 1167 local sip2=192.0.2.17 1168 local h2_ip1=192.0.2.2 1169 local h2_mac1 1170 local h2_mac2 1171 1172 neigh_forward_grat_check || return $? 1173 1174 echo 1175 echo "Per-VLAN gratuitous ARP forwarding" 1176 echo "----------------------------------" 1177 1178 run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact" 1179 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto 0x0806 flower indev swp1 arp_tip $sip1 arp_sip $sip1 arp_op request action pass" 1180 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 102 proto 0x0806 flower indev swp1 arp_tip $sip2 arp_sip $sip2 arp_op request action pass" 1181 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 103 proto 0x0806 flower indev swp1 arp_tip $h2_ip1 arp_sip $sip1 arp_op request action pass" 1182 1183 h2_mac1=$(ip -n "$h2" -j -p link show eth0."$vid1" | jq -r '.[]["address"]') 1184 h2_mac2=$(ip -n "$h2" -j -p link show eth0."$vid2" | jq -r '.[]["address"]') 1185 run_cmd "bridge -n $sw1 fdb replace $h2_mac1 dev vx0 master static vlan $vid1" 1186 run_cmd "bridge -n $sw1 fdb replace $h2_mac2 dev vx0 master static vlan $vid2" 1187 run_cmd "ip -n $sw1 neigh replace $sip1 lladdr $h2_mac1 nud permanent dev br0.$vid1" 1188 run_cmd "ip -n $sw1 neigh replace $sip2 lladdr $h2_mac2 nud permanent dev br0.$vid2" 1189 run_cmd "ip -n $sw1 neigh replace $h2_ip1 lladdr $h2_mac1 nud permanent dev br0.$vid1" 1190 1191 # Enable per-{Port, VLAN} neighbor suppression. 1192 run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress on" 1193 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress on\"" 1194 log_test $? 0 "\"neigh_vlan_suppress\" is on" 1195 1196 # Enable neighbor suppression on VLAN 10. Gratuitous ARP should be 1197 # suppressed by default on VLAN 10 (neigh_forward_grat defaults to off) 1198 # but not on VLAN 20. 1199 run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress on" 1200 run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress on\"" 1201 log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid1)" 1202 1203 run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid1 $sip1" 1204 tc_check_packets "$sw1" "dev vx0 egress" 101 0 1205 log_test $? 0 "Gratuitous ARP suppression (VLAN $vid1)" 1206 1207 run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid2 $sip2" 1208 tc_check_packets "$sw1" "dev vx0 egress" 102 1 1209 log_test $? 0 "Gratuitous ARP forwarding (VLAN $vid2)" 1210 1211 # Enable neigh_forward_grat on VLAN 10 and verify gratuitous ARP is 1212 # now forwarded. 1213 run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_forward_grat on" 1214 run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_forward_grat on\"" 1215 log_test $? 0 "\"neigh_forward_grat\" is on (VLAN $vid1)" 1216 1217 run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid1 $sip1" 1218 tc_check_packets "$sw1" "dev vx0 egress" 101 1 1219 log_test $? 0 "Gratuitous ARP forwarding (VLAN $vid1)" 1220 1221 # Verify that regular (non-gratuitous) ARP requests on VLAN $vid1 are 1222 # still suppressed when neigh_forward_grat is enabled. 1223 run_cmd "ip netns exec $h1 arping -c 1 -w 5 -I eth0.$vid1 $h2_ip1" 1224 tc_check_packets "$sw1" "dev vx0 egress" 103 0 1225 log_test $? 0 "Regular ARP suppression with \"neigh_forward_grat\" on (VLAN $vid1)" 1226 1227 # Enable neighbor suppression on VLAN 20 (neigh_forward_grat defaults to 1228 # off), and verify gratuitous ARP is suppressed on VLAN 20. 1229 run_cmd "bridge -n $sw1 vlan set vid $vid2 dev vx0 neigh_suppress on" 1230 run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid2 | grep \"neigh_suppress on\"" 1231 log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid2)" 1232 1233 # VLAN 10 should still forward (neigh_forward_grat is on). 1234 run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid1 $sip1" 1235 tc_check_packets "$sw1" "dev vx0 egress" 101 2 1236 log_test $? 0 "Gratuitous ARP forwarding (VLAN $vid1)" 1237 1238 # VLAN 20 should suppress (neigh_forward_grat defaults to off). 1239 run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid2 $sip2" 1240 tc_check_packets "$sw1" "dev vx0 egress" 102 1 1241 log_test $? 0 "Gratuitous ARP suppression (VLAN $vid2)" 1242} 1243 1244neigh_vlan_forward_grat_na() 1245{ 1246 local vid1=10 1247 local vid2=20 1248 local saddr1=2001:db8:1::1 1249 local daddr=ff02::1 1250 local h2_addr1=2001:db8:1::2 1251 local h2_maddr1=ff02::1:ff00:2 1252 local full_addr1=20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01 1253 local h2_full_addr1=20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:02 1254 local csum1="fd:32" 1255 local csum_ns1="1f:2f" 1256 local saddr2=2001:db8:2::1 1257 local full_addr2=20:01:0d:b8:00:02:00:00:00:00:00:00:00:00:00:01 1258 local csum2="fd:30" 1259 local dmac=33:33:00:00:00:01 1260 local h2_dmac1=33:33:ff:00:00:02 1261 local h2_mac1 1262 local h2_mac2 1263 local smac 1264 1265 neigh_forward_grat_check || return $? 1266 1267 echo 1268 echo "Per-VLAN unsolicited NA forwarding" 1269 echo "----------------------------------" 1270 1271 smac=$(ip -n "$h1" -j -p link show eth0."$vid1" | jq -r '.[]["address"]') 1272 1273 run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact" 1274 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $daddr src_ip $saddr1 type 136 code 0 action pass" 1275 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 102 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $daddr src_ip $saddr2 type 136 code 0 action pass" 1276 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 103 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $h2_maddr1 src_ip $saddr1 type 135 code 0 action pass" 1277 1278 h2_mac1=$(ip -n "$h2" -j -p link show eth0."$vid1" | jq -r '.[]["address"]') 1279 h2_mac2=$(ip -n "$h2" -j -p link show eth0."$vid2" | jq -r '.[]["address"]') 1280 run_cmd "bridge -n $sw1 fdb replace $h2_mac1 dev vx0 master static vlan $vid1" 1281 run_cmd "bridge -n $sw1 fdb replace $h2_mac2 dev vx0 master static vlan $vid2" 1282 run_cmd "ip -n $sw1 neigh replace $saddr1 lladdr $h2_mac1 nud permanent dev br0.$vid1" 1283 run_cmd "ip -n $sw1 neigh replace $saddr2 lladdr $h2_mac2 nud permanent dev br0.$vid2" 1284 run_cmd "ip -n $sw1 neigh replace $h2_addr1 lladdr $h2_mac1 nud permanent dev br0.$vid1" 1285 1286 # Enable per-{Port, VLAN} neighbor suppression. 1287 run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress on" 1288 run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress on\"" 1289 log_test $? 0 "\"neigh_vlan_suppress\" is on" 1290 1291 # Enable neighbor suppression on VLAN 10. Unsolicited NA should be 1292 # suppressed by default on VLAN 10 (neigh_forward_grat defaults to off) 1293 # but not on VLAN 20. 1294 run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress on" 1295 run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress on\"" 1296 log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid1)" 1297 1298 run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid1 -c 1 -a $smac -b $dmac -A $saddr1 -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum1" "$full_addr1") -q" 1299 tc_check_packets "$sw1" "dev vx0 egress" 101 0 1300 log_test $? 0 "Unsolicited NA suppression (VLAN $vid1)" 1301 1302 run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid2 -c 1 -a $smac -b $dmac -A $saddr2 -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum2" "$full_addr2") -q" 1303 tc_check_packets "$sw1" "dev vx0 egress" 102 1 1304 log_test $? 0 "Unsolicited NA forwarding (VLAN $vid2)" 1305 1306 # Enable neigh_forward_grat on VLAN 10 and verify unsolicited NA is 1307 # now forwarded. 1308 run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_forward_grat on" 1309 run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_forward_grat on\"" 1310 log_test $? 0 "\"neigh_forward_grat\" is on (VLAN $vid1)" 1311 1312 run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid1 -c 1 -a $smac -b $dmac -A $saddr1 -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum1" "$full_addr1") -q" 1313 tc_check_packets "$sw1" "dev vx0 egress" 101 1 1314 log_test $? 0 "Unsolicited NA forwarding (VLAN $vid1)" 1315 1316 # Verify that solicited NS messages on VLAN $vid1 are still suppressed 1317 # when neigh_forward_grat is enabled. 1318 run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid1 -c 1 -a $smac -b $h2_dmac1 -A $saddr1 -B $h2_maddr1 -t ip hop=255,next=58,payload=$(icmpv6_header_get "$csum_ns1" "$h2_full_addr1") -q" 1319 tc_check_packets "$sw1" "dev vx0 egress" 103 0 1320 log_test $? 0 "Solicited NS suppression with \"neigh_forward_grat\" on (VLAN $vid1)" 1321 1322 # Enable neighbor suppression on VLAN 20 (neigh_forward_grat defaults to 1323 # off), and verify unsolicited NA is suppressed on VLAN 20. 1324 run_cmd "bridge -n $sw1 vlan set vid $vid2 dev vx0 neigh_suppress on" 1325 run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid2 | grep \"neigh_suppress on\"" 1326 log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid2)" 1327 1328 # VLAN 10 should still forward (neigh_forward_grat is on). 1329 run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid1 -c 1 -a $smac -b $dmac -A $saddr1 -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum1" "$full_addr1") -q" 1330 tc_check_packets "$sw1" "dev vx0 egress" 101 2 1331 log_test $? 0 "Unsolicited NA forwarding (VLAN $vid1)" 1332 1333 # VLAN 20 should suppress (neigh_forward_grat defaults to off). 1334 run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid2 -c 1 -a $smac -b $dmac -A $saddr2 -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum2" "$full_addr2") -q" 1335 tc_check_packets "$sw1" "dev vx0 egress" 102 1 1336 log_test $? 0 "Unsolicited NA suppression (VLAN $vid2)" 1337} 1338 1339################################################################################ 1340# Usage 1341 1342usage() 1343{ 1344 cat <<EOF 1345usage: ${0##*/} OPTS 1346 1347 -t <test> Test(s) to run (default: all) 1348 (options: $TESTS) 1349 -p Pause on fail 1350 -P Pause after each test before cleanup 1351 -v Verbose mode (show commands and output) 1352EOF 1353} 1354 1355################################################################################ 1356# Main 1357 1358trap cleanup EXIT 1359 1360while getopts ":t:pPvh" opt; do 1361 case $opt in 1362 t) TESTS=$OPTARG;; 1363 p) PAUSE_ON_FAIL=yes;; 1364 P) PAUSE=yes;; 1365 v) VERBOSE=$(($VERBOSE + 1));; 1366 h) usage; exit 0;; 1367 *) usage; exit 1;; 1368 esac 1369done 1370 1371# Make sure we don't pause twice. 1372[ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no 1373 1374if [ "$(id -u)" -ne 0 ];then 1375 echo "SKIP: Need root privileges" 1376 exit $ksft_skip; 1377fi 1378 1379if [ ! -x "$(command -v ip)" ]; then 1380 echo "SKIP: Could not run test without ip tool" 1381 exit $ksft_skip 1382fi 1383 1384if [ ! -x "$(command -v bridge)" ]; then 1385 echo "SKIP: Could not run test without bridge tool" 1386 exit $ksft_skip 1387fi 1388 1389if [ ! -x "$(command -v tc)" ]; then 1390 echo "SKIP: Could not run test without tc tool" 1391 exit $ksft_skip 1392fi 1393 1394if [ ! -x "$(command -v arping)" ]; then 1395 echo "SKIP: Could not run test without arping tool" 1396 exit $ksft_skip 1397fi 1398 1399if [ ! -x "$(command -v ndisc6)" ]; then 1400 echo "SKIP: Could not run test without ndisc6 tool" 1401 exit $ksft_skip 1402fi 1403 1404if [ ! -x "$(command -v jq)" ]; then 1405 echo "SKIP: Could not run test without jq tool" 1406 exit $ksft_skip 1407fi 1408 1409if [ ! -x "$(command -v mausezahn)" ]; then 1410 echo "SKIP: Could not run test without mausezahn tool" 1411 exit $ksft_skip 1412fi 1413 1414bridge link help 2>&1 | grep -q "neigh_vlan_suppress" 1415if [ $? -ne 0 ]; then 1416 echo "SKIP: iproute2 bridge too old, missing per-VLAN neighbor suppression support" 1417 exit $ksft_skip 1418fi 1419 1420# Start clean. 1421cleanup 1422 1423for t in $TESTS 1424do 1425 setup 1426 $t 1427 ret=$(ksft_exit_status_merge "$ret" $?) 1428 cleanup 1429done 1430 1431if [ "$TESTS" != "none" ]; then 1432 printf "\nTests passed: %3d\n" ${nsuccess} 1433 printf "Tests failed: %3d\n" ${nfail} 1434fi 1435 1436exit $ret 1437