1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4# +-----------------------------------------+ 5# | + $h1.10 + $h1.20 | 6# | | 192.0.2.1/28 | 2001:db8:1::1/64 | 7# | \________ ________/ | 8# | \ / | 9# | + $h1 H1 (vrf) | 10# +-----------|-----------------------------+ 11# | 12# +-----------|----------------------------------------------------------------+ 13# | +---------|--------------------------------------+ SWITCH (main vrf) | 14# | | + $swp1 BR1 (802.1q) | | 15# | | vid 10 20 | | 16# | | | | 17# | | + vx10 (vxlan) + vx20 (vxlan) | + lo10 (dummy) | 18# | | local 192.0.2.100 local 2001:db8:4::1 | 192.0.2.100/28 | 19# | | group 233.252.0.1 group ff0e::1:2:3 | 2001:db8:4::1/64 | 20# | | id 1000 id 2000 | | 21# | | vid 10 pvid untagged vid 20 pvid untagged | | 22# | +------------------------------------------------+ | 23# | | 24# | + $swp2 $swp3 + | 25# | | 192.0.2.33/28 192.0.2.65/28 | | 26# | | 2001:db8:2::1/64 2001:db8:3::1/64 | | 27# | | | | 28# +---|--------------------------------------------------------------------|---+ 29# | | 30# +---|--------------------------------+ +--------------------------------|---+ 31# | | H2 (vrf) | | H3 (vrf) | | 32# | +-|----------------------------+ | | +-----------------------------|-+ | 33# | | + $h2 BR2 (802.1d) | | | | BR3 (802.1d) $h3 + | | 34# | | | | | | | | 35# | | + v1$h2 (veth) | | | | v1$h3 (veth) + | | 36# | +-|----------------------------+ | | +-----------------------------|-+ | 37# | | | | | | 38# +---|--------------------------------+ +--------------------------------|---+ 39# | | 40# +---|--------------------------------+ +--------------------------------|---+ 41# | + v2$h2 (veth) NS2 (netns) | | NS3 (netns) v2$h3 (veth) + | 42# | 192.0.2.34/28 | | 192.0.2.66/28 | 43# | 2001:db8:2::2/64 | | 2001:db8:3::2/64 | 44# | | | | 45# | +--------------------------------+ | | +--------------------------------+ | 46# | | BR1 (802.1q) | | | | BR1 (802.1q) | | 47# | | + vx10 (vxlan) | | | | + vx10 (vxlan) | | 48# | | local 192.0.2.34 | | | | local 192.0.2.50 | | 49# | | group 233.252.0.1 dev v2$h2 | | | | group 233.252.0.1 dev v2$h3 | | 50# | | id 1000 dstport $VXPORT | | | | id 1000 dstport $VXPORT | | 51# | | vid 10 pvid untagged | | | | vid 10 pvid untagged | | 52# | | | | | | | | 53# | | + vx20 (vxlan) | | | | + vx20 (vxlan) | | 54# | | local 2001:db8:2::2 | | | | local 2001:db8:3::2 | | 55# | | group ff0e::1:2:3 dev v2$h2 | | | | group ff0e::1:2:3 dev v2$h3 | | 56# | | id 2000 dstport $VXPORT | | | | id 2000 dstport $VXPORT | | 57# | | vid 20 pvid untagged | | | | vid 20 pvid untagged | | 58# | | | | | | | | 59# | | + w1 (veth) | | | | + w1 (veth) | | 60# | | | vid 10 20 | | | | | vid 10 20 | | 61# | +--|-----------------------------+ | | +--|-----------------------------+ | 62# | | | | | | 63# | +--|-----------------------------+ | | +--|-----------------------------+ | 64# | | + w2 (veth) VW2 (vrf) | | | | + w2 (veth) VW2 (vrf) | | 65# | | |\ | | | | |\ | | 66# | | | + w2.10 | | | | | + w2.10 | | 67# | | | 192.0.2.3/28 | | | | | 192.0.2.4/28 | | 68# | | | | | | | | | | 69# | | + w2.20 | | | | + w2.20 | | 70# | | 2001:db8:1::3/64 | | | | 2001:db8:1::4/64 | | 71# | +--------------------------------+ | | +--------------------------------+ | 72# +------------------------------------+ +------------------------------------+ 73# 74#shellcheck disable=SC2317 # SC doesn't see our uses of functions. 75 76: "${VXPORT:=4789}" 77export VXPORT 78 79: "${GROUP4:=233.252.0.1}" 80export GROUP4 81 82: "${GROUP6:=ff0e::1:2:3}" 83export GROUP6 84 85: "${IPMR:=lo10}" 86 87ALL_TESTS=" 88 ipv4_nomcroute 89 ipv4_mcroute 90 ipv4_mcroute_changelink 91 ipv4_mcroute_starg 92 ipv4_mcroute_noroute 93 ipv4_mcroute_fdb 94 ipv4_mcroute_fdb_oif0 95 ipv4_mcroute_fdb_oif0_sep 96 97 ipv6_nomcroute 98 ipv6_mcroute 99 ipv6_mcroute_changelink 100 ipv6_mcroute_starg 101 ipv6_mcroute_noroute 102 ipv6_mcroute_fdb 103 ipv6_mcroute_fdb_oif0 104 105 ipv4_nomcroute_rx 106 ipv4_mcroute_rx 107 ipv4_mcroute_starg_rx 108 ipv4_mcroute_fdb_oif0_sep_rx 109 ipv4_mcroute_fdb_sep_rx 110 111 ipv6_nomcroute_rx 112 ipv6_mcroute_rx 113 ipv6_mcroute_starg_rx 114 ipv6_mcroute_fdb_sep_rx 115" 116 117NUM_NETIFS=6 118source lib.sh 119 120h1_create() 121{ 122 adf_simple_if_init "$h1" 123 124 adf_ip_link_add "$h1.10" master "v$h1" link "$h1" type vlan id 10 125 adf_ip_link_set_up "$h1.10" 126 adf_ip_addr_add "$h1.10" 192.0.2.1/28 127 128 adf_ip_link_add "$h1.20" master "v$h1" link "$h1" type vlan id 20 129 adf_ip_link_set_up "$h1.20" 130 adf_ip_addr_add "$h1.20" 2001:db8:1::1/64 131} 132 133install_capture() 134{ 135 local dev=$1; shift 136 137 tc qdisc add dev "$dev" clsact 138 defer tc qdisc del dev "$dev" clsact 139 140 tc filter add dev "$dev" ingress proto ip pref 104 \ 141 u32 match ip protocol 0x11 0xff \ 142 match u16 "$VXPORT" 0xffff at 0x16 \ 143 match u16 0x0800 0xffff at 0x30 \ 144 action pass 145 defer tc filter del dev "$dev" ingress proto ip pref 104 146 147 tc filter add dev "$dev" ingress proto ipv6 pref 106 \ 148 u32 match ip6 protocol 0x11 0xff \ 149 match u16 "$VXPORT" 0xffff at 0x2a \ 150 match u16 0x86dd 0xffff at 0x44 \ 151 match u8 0x11 0xff at 0x4c \ 152 action pass 153 defer tc filter del dev "$dev" ingress proto ipv6 pref 106 154} 155 156h2_create() 157{ 158 # $h2 159 adf_ip_link_set_up "$h2" 160 161 # H2 162 vrf_create "v$h2" 163 defer vrf_destroy "v$h2" 164 165 adf_ip_link_set_up "v$h2" 166 167 # br2 168 adf_ip_link_add br2 type bridge vlan_filtering 0 mcast_snooping 0 169 adf_ip_link_set_master br2 "v$h2" 170 adf_ip_link_set_up br2 171 172 # $h2 173 adf_ip_link_set_master "$h2" br2 174 install_capture "$h2" 175 176 # v1$h2 177 adf_ip_link_set_up "v1$h2" 178 adf_ip_link_set_master "v1$h2" br2 179} 180 181h3_create() 182{ 183 # $h3 184 adf_ip_link_set_up "$h3" 185 186 # H3 187 vrf_create "v$h3" 188 defer vrf_destroy "v$h3" 189 190 adf_ip_link_set_up "v$h3" 191 192 # br3 193 adf_ip_link_add br3 type bridge vlan_filtering 0 mcast_snooping 0 194 adf_ip_link_set_master br3 "v$h3" 195 adf_ip_link_set_up br3 196 197 # $h3 198 adf_ip_link_set_master "$h3" br3 199 install_capture "$h3" 200 201 # v1$h3 202 adf_ip_link_set_up "v1$h3" 203 adf_ip_link_set_master "v1$h3" br3 204} 205 206switch_create() 207{ 208 local swp1_mac 209 210 # br1 211 swp1_mac=$(mac_get "$swp1") 212 adf_ip_link_add br1 type bridge vlan_filtering 1 \ 213 vlan_default_pvid 0 mcast_snooping 0 214 adf_ip_link_set_addr br1 "$swp1_mac" 215 adf_ip_link_set_up br1 216 217 # A dummy to force the IPv6 OIF=0 test to install a suitable MC route on 218 # $IPMR to be deterministic. Also used for the IPv6 RX!=TX ping test. 219 adf_ip_link_add "X$IPMR" up type dummy 220 221 # IPMR 222 adf_ip_link_add "$IPMR" up type dummy 223 adf_ip_addr_add "$IPMR" 192.0.2.100/28 224 adf_ip_addr_add "$IPMR" 2001:db8:4::1/64 225 226 # $swp1 227 adf_ip_link_set_up "$swp1" 228 adf_ip_link_set_master "$swp1" br1 229 adf_bridge_vlan_add vid 10 dev "$swp1" 230 adf_bridge_vlan_add vid 20 dev "$swp1" 231 232 # $swp2 233 adf_ip_link_set_up "$swp2" 234 adf_ip_addr_add "$swp2" 192.0.2.33/28 235 adf_ip_addr_add "$swp2" 2001:db8:2::1/64 236 237 # $swp3 238 adf_ip_link_set_up "$swp3" 239 adf_ip_addr_add "$swp3" 192.0.2.65/28 240 adf_ip_addr_add "$swp3" 2001:db8:3::1/64 241} 242 243vx_create() 244{ 245 local name=$1; shift 246 local vid=$1; shift 247 248 adf_ip_link_add "$name" up type vxlan dstport "$VXPORT" \ 249 nolearning noudpcsum tos inherit ttl 16 \ 250 "$@" 251 adf_ip_link_set_master "$name" br1 252 adf_bridge_vlan_add vid "$vid" dev "$name" pvid untagged 253} 254export -f vx_create 255 256vx10_create() 257{ 258 vx_create vx10 10 id 1000 "$@" 259} 260export -f vx10_create 261 262vx20_create() 263{ 264 vx_create vx20 20 id 2000 "$@" 265} 266export -f vx20_create 267 268ns_init_common() 269{ 270 local ns=$1; shift 271 local if_in=$1; shift 272 local ipv4_in=$1; shift 273 local ipv6_in=$1; shift 274 local ipv4_host=$1; shift 275 local ipv6_host=$1; shift 276 277 # v2$h2 / v2$h3 278 adf_ip_link_set_up "$if_in" 279 adf_ip_addr_add "$if_in" "$ipv4_in" 280 adf_ip_addr_add "$if_in" "$ipv6_in" 281 282 # br1 283 adf_ip_link_add br1 type bridge vlan_filtering 1 \ 284 vlan_default_pvid 0 mcast_snooping 0 285 adf_ip_link_set_up br1 286 287 # vx10, vx20 288 vx10_create local "${ipv4_in%/*}" group "$GROUP4" dev "$if_in" 289 vx20_create local "${ipv6_in%/*}" group "$GROUP6" dev "$if_in" 290 291 # w1 292 adf_ip_link_add w1 type veth peer name w2 293 adf_ip_link_set_master w1 br1 294 adf_ip_link_set_up w1 295 adf_bridge_vlan_add vid 10 dev w1 296 adf_bridge_vlan_add vid 20 dev w1 297 298 # w2 299 adf_simple_if_init w2 300 301 # w2.10 302 adf_ip_link_add w2.10 master vw2 link w2 type vlan id 10 303 adf_ip_link_set_up w2.10 304 adf_ip_addr_add w2.10 "$ipv4_host" 305 306 # w2.20 307 adf_ip_link_add w2.20 master vw2 link w2 type vlan id 20 308 adf_ip_link_set_up w2.20 309 adf_ip_addr_add w2.20 "$ipv6_host" 310} 311export -f ns_init_common 312 313ns2_create() 314{ 315 # NS2 316 ip netns add ns2 317 defer ip netns del ns2 318 319 # v2$h2 320 ip link set dev "v2$h2" netns ns2 321 defer ip -n ns2 link set dev "v2$h2" netns 1 322 323 in_ns ns2 \ 324 ns_init_common ns2 "v2$h2" \ 325 192.0.2.34/28 2001:db8:2::2/64 \ 326 192.0.2.3/28 2001:db8:1::3/64 327} 328 329ns3_create() 330{ 331 # NS3 332 ip netns add ns3 333 defer ip netns del ns3 334 335 # v2$h3 336 ip link set dev "v2$h3" netns ns3 337 defer ip -n ns3 link set dev "v2$h3" netns 1 338 339 ip -n ns3 link set dev "v2$h3" up 340 341 in_ns ns3 \ 342 ns_init_common ns3 "v2$h3" \ 343 192.0.2.66/28 2001:db8:3::2/64 \ 344 192.0.2.4/28 2001:db8:1::4/64 345} 346 347setup_prepare() 348{ 349 h1=${NETIFS[p1]} 350 swp1=${NETIFS[p2]} 351 352 swp2=${NETIFS[p3]} 353 h2=${NETIFS[p4]} 354 355 swp3=${NETIFS[p5]} 356 h3=${NETIFS[p6]} 357 358 adf_vrf_prepare 359 adf_forwarding_enable 360 361 adf_ip_link_add "v1$h2" type veth peer name "v2$h2" 362 adf_ip_link_add "v1$h3" type veth peer name "v2$h3" 363 364 h1_create 365 h2_create 366 h3_create 367 switch_create 368 ns2_create 369 ns3_create 370} 371 372adf_install_broken_sg() 373{ 374 adf_mcd_start "$IPMR" || exit "$EXIT_STATUS" 375 376 mc_cli add "$swp2" 192.0.2.100 "$GROUP4" "$swp1" "$swp3" 377 defer mc_cli remove "$swp2" 192.0.2.100 "$GROUP4" "$swp1" "$swp3" 378 379 mc_cli add "$swp2" 2001:db8:4::1 "$GROUP6" "$swp1" "$swp3" 380 defer mc_cli remove "$swp2" 2001:db8:4::1 "$GROUP6" "$swp1" "$swp3" 381} 382 383adf_install_rx() 384{ 385 mc_cli add "$swp2" 0.0.0.0 "$GROUP4" "$IPMR" 386 defer mc_cli remove "$swp2" 0.0.0.0 "$GROUP4" lo10 387 388 mc_cli add "$swp3" 0.0.0.0 "$GROUP4" "$IPMR" 389 defer mc_cli remove "$swp3" 0.0.0.0 "$GROUP4" lo10 390 391 mc_cli add "$swp2" :: "$GROUP6" "$IPMR" 392 defer mc_cli remove "$swp2" :: "$GROUP6" lo10 393 394 mc_cli add "$swp3" :: "$GROUP6" "$IPMR" 395 defer mc_cli remove "$swp3" :: "$GROUP6" lo10 396} 397 398adf_install_sg() 399{ 400 adf_mcd_start "$IPMR" || exit "$EXIT_STATUS" 401 402 mc_cli add "$IPMR" 192.0.2.100 "$GROUP4" "$swp2" "$swp3" 403 defer mc_cli remove "$IPMR" 192.0.2.33 "$GROUP4" "$swp2" "$swp3" 404 405 mc_cli add "$IPMR" 2001:db8:4::1 "$GROUP6" "$swp2" "$swp3" 406 defer mc_cli remove "$IPMR" 2001:db8:4::1 "$GROUP6" "$swp2" "$swp3" 407 408 adf_install_rx 409} 410 411adf_install_sg_sep() 412{ 413 adf_mcd_start lo || exit "$EXIT_STATUS" 414 415 mc_cli add lo 192.0.2.120 "$GROUP4" "$swp2" "$swp3" 416 defer mc_cli remove lo 192.0.2.120 "$GROUP4" "$swp2" "$swp3" 417 418 mc_cli add lo 2001:db8:5::1 "$GROUP6" "$swp2" "$swp3" 419 defer mc_cli remove lo 2001:db8:5::1 "$GROUP6" "$swp2" "$swp3" 420} 421 422adf_install_sg_sep_rx() 423{ 424 local lo=$1; shift 425 426 adf_mcd_start "$IPMR" "$lo" || exit "$EXIT_STATUS" 427 428 mc_cli add "$lo" 192.0.2.120 "$GROUP4" "$swp2" "$swp3" 429 defer mc_cli remove "$lo" 192.0.2.120 "$GROUP4" "$swp2" "$swp3" 430 431 mc_cli add "$lo" 2001:db8:5::1 "$GROUP6" "$swp2" "$swp3" 432 defer mc_cli remove "$lo" 2001:db8:5::1 "$GROUP6" "$swp2" "$swp3" 433 434 adf_install_rx 435} 436 437adf_install_starg() 438{ 439 adf_mcd_start "$IPMR" || exit "$EXIT_STATUS" 440 441 mc_cli add "$IPMR" 0.0.0.0 "$GROUP4" "$swp2" "$swp3" 442 defer mc_cli remove "$IPMR" 0.0.0.0 "$GROUP4" "$swp2" "$swp3" 443 444 mc_cli add "$IPMR" :: "$GROUP6" "$swp2" "$swp3" 445 defer mc_cli remove "$IPMR" :: "$GROUP6" "$swp2" "$swp3" 446 447 adf_install_rx 448} 449 450do_packets_v4() 451{ 452 local mac 453 454 mac=$(mac_get "$h2") 455 "$MZ" "$h1" -Q 10 -c 10 -d 100msec -p 64 -a own -b "$mac" \ 456 -A 192.0.2.1 -B 192.0.2.2 -t udp sp=1234,dp=2345 -q 457} 458 459do_packets_v6() 460{ 461 local mac 462 463 mac=$(mac_get "$h2") 464 "$MZ" -6 "$h1" -Q 20 -c 10 -d 100msec -p 64 -a own -b "$mac" \ 465 -A 2001:db8:1::1 -B 2001:db8:1::2 -t udp sp=1234,dp=2345 -q 466} 467 468do_test() 469{ 470 local ipv=$1; shift 471 local expect_h2=$1; shift 472 local expect_h3=$1; shift 473 local what=$1; shift 474 475 local pref=$((100 + ipv)) 476 local t0_h2 477 local t0_h3 478 local t1_h2 479 local t1_h3 480 local d_h2 481 local d_h3 482 483 RET=0 484 485 t0_h2=$(tc_rule_stats_get "$h2" "$pref" ingress) 486 t0_h3=$(tc_rule_stats_get "$h3" "$pref" ingress) 487 488 "do_packets_v$ipv" 489 sleep 1 490 491 t1_h2=$(tc_rule_stats_get "$h2" "$pref" ingress) 492 t1_h3=$(tc_rule_stats_get "$h3" "$pref" ingress) 493 494 d_h2=$((t1_h2 - t0_h2)) 495 d_h3=$((t1_h3 - t0_h3)) 496 497 ((d_h2 == expect_h2)) 498 check_err $? "Expected $expect_h2 packets on H2, got $d_h2" 499 500 ((d_h3 == expect_h3)) 501 check_err $? "Expected $expect_h3 packets on H3, got $d_h3" 502 503 log_test "VXLAN MC flood $what" 504} 505 506ipv4_do_test_rx() 507{ 508 local h3_should_fail=$1; shift 509 local what=$1; shift 510 511 RET=0 512 513 ping_do "$h1.10" 192.0.2.3 514 check_err $? "H2 should respond" 515 516 ping_do "$h1.10" 192.0.2.4 517 check_err_fail "$h3_should_fail" $? "H3 responds" 518 519 log_test "VXLAN MC flood $what" 520} 521 522ipv6_do_test_rx() 523{ 524 local h3_should_fail=$1; shift 525 local what=$1; shift 526 527 RET=0 528 529 ping6_do "$h1.20" 2001:db8:1::3 530 check_err $? "H2 should respond" 531 532 ping6_do "$h1.20" 2001:db8:1::4 533 check_err_fail "$h3_should_fail" $? "H3 responds" 534 535 log_test "VXLAN MC flood $what" 536} 537 538ipv4_nomcroute() 539{ 540 # Install a misleading (S,G) rule to attempt to trick the system into 541 # pushing the packets elsewhere. 542 adf_install_broken_sg 543 vx10_create local 192.0.2.100 group "$GROUP4" dev "$swp2" 544 do_test 4 10 0 "IPv4 nomcroute" 545} 546 547ipv6_nomcroute() 548{ 549 # Like for IPv4, install a misleading (S,G). 550 adf_install_broken_sg 551 vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$swp2" 552 do_test 6 10 0 "IPv6 nomcroute" 553} 554 555ipv4_nomcroute_rx() 556{ 557 vx10_create local 192.0.2.100 group "$GROUP4" dev "$swp2" 558 ipv4_do_test_rx 1 "IPv4 nomcroute ping" 559} 560 561ipv6_nomcroute_rx() 562{ 563 vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$swp2" 564 ipv6_do_test_rx 1 "IPv6 nomcroute ping" 565} 566 567ipv4_mcroute() 568{ 569 adf_install_sg 570 vx10_create local 192.0.2.100 group "$GROUP4" dev "$IPMR" mcroute 571 do_test 4 10 10 "IPv4 mcroute" 572} 573 574ipv6_mcroute() 575{ 576 adf_install_sg 577 vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$IPMR" mcroute 578 do_test 6 10 10 "IPv6 mcroute" 579} 580 581ipv4_mcroute_rx() 582{ 583 adf_install_sg 584 vx10_create local 192.0.2.100 group "$GROUP4" dev "$IPMR" mcroute 585 ipv4_do_test_rx 0 "IPv4 mcroute ping" 586} 587 588ipv6_mcroute_rx() 589{ 590 adf_install_sg 591 vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$IPMR" mcroute 592 ipv6_do_test_rx 0 "IPv6 mcroute ping" 593} 594 595ipv4_mcroute_changelink() 596{ 597 adf_install_sg 598 vx10_create local 192.0.2.100 group "$GROUP4" dev "$IPMR" 599 ip link set dev vx10 type vxlan mcroute 600 sleep 1 601 do_test 4 10 10 "IPv4 mcroute changelink" 602} 603 604ipv6_mcroute_changelink() 605{ 606 adf_install_sg 607 vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$IPMR" mcroute 608 ip link set dev vx20 type vxlan mcroute 609 sleep 1 610 do_test 6 10 10 "IPv6 mcroute changelink" 611} 612 613ipv4_mcroute_starg() 614{ 615 adf_install_starg 616 vx10_create local 192.0.2.100 group "$GROUP4" dev "$IPMR" mcroute 617 do_test 4 10 10 "IPv4 mcroute (*,G)" 618} 619 620ipv6_mcroute_starg() 621{ 622 adf_install_starg 623 vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$IPMR" mcroute 624 do_test 6 10 10 "IPv6 mcroute (*,G)" 625} 626 627ipv4_mcroute_starg_rx() 628{ 629 adf_install_starg 630 vx10_create local 192.0.2.100 group "$GROUP4" dev "$IPMR" mcroute 631 ipv4_do_test_rx 0 "IPv4 mcroute (*,G) ping" 632} 633 634ipv6_mcroute_starg_rx() 635{ 636 adf_install_starg 637 vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$IPMR" mcroute 638 ipv6_do_test_rx 0 "IPv6 mcroute (*,G) ping" 639} 640 641ipv4_mcroute_noroute() 642{ 643 vx10_create local 192.0.2.100 group "$GROUP4" dev "$IPMR" mcroute 644 do_test 4 0 0 "IPv4 mcroute, no route" 645} 646 647ipv6_mcroute_noroute() 648{ 649 vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$IPMR" mcroute 650 do_test 6 0 0 "IPv6 mcroute, no route" 651} 652 653ipv4_mcroute_fdb() 654{ 655 adf_install_sg 656 vx10_create local 192.0.2.100 dev "$IPMR" mcroute 657 bridge fdb add dev vx10 \ 658 00:00:00:00:00:00 self static dst "$GROUP4" via "$IPMR" 659 do_test 4 10 10 "IPv4 mcroute FDB" 660} 661 662ipv6_mcroute_fdb() 663{ 664 adf_install_sg 665 vx20_create local 2001:db8:4::1 dev "$IPMR" mcroute 666 bridge -6 fdb add dev vx20 \ 667 00:00:00:00:00:00 self static dst "$GROUP6" via "$IPMR" 668 do_test 6 10 10 "IPv6 mcroute FDB" 669} 670 671# Use FDB to configure VXLAN in a way where oif=0 for purposes of FIB lookup. 672ipv4_mcroute_fdb_oif0() 673{ 674 adf_install_sg 675 vx10_create local 192.0.2.100 group "$GROUP4" dev "$IPMR" mcroute 676 bridge fdb del dev vx10 00:00:00:00:00:00 677 bridge fdb add dev vx10 00:00:00:00:00:00 self static dst "$GROUP4" 678 do_test 4 10 10 "IPv4 mcroute oif=0" 679} 680 681ipv6_mcroute_fdb_oif0() 682{ 683 # The IPv6 tunnel lookup does not fall back to selection by source 684 # address. Instead it just does a FIB match, and that would find one of 685 # the several ff00::/8 multicast routes -- each device has one. In order 686 # to reliably force the $IPMR device, add a /128 route for the 687 # destination group address. 688 ip -6 route add table local multicast "$GROUP6/128" dev "$IPMR" 689 defer ip -6 route del table local multicast "$GROUP6/128" dev "$IPMR" 690 691 adf_install_sg 692 vx20_create local 2001:db8:4::1 group "$GROUP6" dev "$IPMR" mcroute 693 bridge -6 fdb del dev vx20 00:00:00:00:00:00 694 bridge -6 fdb add dev vx20 00:00:00:00:00:00 self static dst "$GROUP6" 695 do_test 6 10 10 "IPv6 mcroute oif=0" 696} 697 698# In oif=0 test as above, have FIB lookup resolve to loopback instead of IPMR. 699# This doesn't work with IPv6 -- a MC route on lo would be marked as RTF_REJECT. 700ipv4_mcroute_fdb_oif0_sep() 701{ 702 adf_install_sg_sep 703 704 adf_ip_addr_add lo 192.0.2.120/28 705 vx10_create local 192.0.2.120 group "$GROUP4" dev "$IPMR" mcroute 706 bridge fdb del dev vx10 00:00:00:00:00:00 707 bridge fdb add dev vx10 00:00:00:00:00:00 self static dst "$GROUP4" 708 do_test 4 10 10 "IPv4 mcroute TX!=RX oif=0" 709} 710 711ipv4_mcroute_fdb_oif0_sep_rx() 712{ 713 adf_install_sg_sep_rx lo 714 715 adf_ip_addr_add lo 192.0.2.120/28 716 vx10_create local 192.0.2.120 group "$GROUP4" dev "$IPMR" mcroute 717 bridge fdb del dev vx10 00:00:00:00:00:00 718 bridge fdb add dev vx10 00:00:00:00:00:00 self static dst "$GROUP4" 719 ipv4_do_test_rx 0 "IPv4 mcroute TX!=RX oif=0 ping" 720} 721 722ipv4_mcroute_fdb_sep_rx() 723{ 724 adf_install_sg_sep_rx lo 725 726 adf_ip_addr_add lo 192.0.2.120/28 727 vx10_create local 192.0.2.120 group "$GROUP4" dev "$IPMR" mcroute 728 bridge fdb del dev vx10 00:00:00:00:00:00 729 bridge fdb add \ 730 dev vx10 00:00:00:00:00:00 self static dst "$GROUP4" via lo 731 ipv4_do_test_rx 0 "IPv4 mcroute TX!=RX ping" 732} 733 734ipv6_mcroute_fdb_sep_rx() 735{ 736 adf_install_sg_sep_rx "X$IPMR" 737 738 adf_ip_addr_add "X$IPMR" 2001:db8:5::1/64 739 vx20_create local 2001:db8:5::1 group "$GROUP6" dev "$IPMR" mcroute 740 bridge -6 fdb del dev vx20 00:00:00:00:00:00 741 bridge -6 fdb add dev vx20 00:00:00:00:00:00 \ 742 self static dst "$GROUP6" via "X$IPMR" 743 ipv6_do_test_rx 0 "IPv6 mcroute TX!=RX ping" 744} 745 746trap cleanup EXIT 747 748setup_prepare 749setup_wait 750tests_run 751 752exit "$EXIT_STATUS" 753