1728b3525SAmit Cohen#!/bin/bash 2728b3525SAmit Cohen# SPDX-License-Identifier: GPL-2.0 3728b3525SAmit Cohen 4728b3525SAmit Cohen# +-----------------------+ +------------------------+ 5728b3525SAmit Cohen# | H1 (vrf) | | H2 (vrf) | 6728b3525SAmit Cohen# | + $h1.10 | | + $h2.10 | 7728b3525SAmit Cohen# | | 192.0.2.1/28 | | | 192.0.2.2/28 | 8728b3525SAmit Cohen# | | 2001:db8:1::1/64 | | | 2001:db8:1::2/64 | 9728b3525SAmit Cohen# | | | | | | 10728b3525SAmit Cohen# | | + $h1.20 | | | + $h2.20 | 11728b3525SAmit Cohen# | \ | 198.51.100.1/24 | | \ | 198.51.100.2/24 | 12728b3525SAmit Cohen# | \ | 2001:db8:2::1/64 | | \ | 2001:db8:2::2/64 | 13728b3525SAmit Cohen# | \| | | \| | 14728b3525SAmit Cohen# | + $h1 | | + $h2 | 15728b3525SAmit Cohen# +----|------------------+ +----|-------------------+ 16728b3525SAmit Cohen# | | 17728b3525SAmit Cohen# +----|--------------------------------------------------|-------------------+ 18728b3525SAmit Cohen# | SW | | | 19728b3525SAmit Cohen# | +--|--------------------------------------------------|-----------------+ | 20728b3525SAmit Cohen# | | + $swp1 BR1 (802.1q) + $swp2 | | 21728b3525SAmit Cohen# | | vid 10 vid 10 | | 22728b3525SAmit Cohen# | | vid 20 vid 20 | | 23728b3525SAmit Cohen# | | | | 24728b3525SAmit Cohen# | | + vx10 (vxlan) + vx20 (vxlan) | | 25728b3525SAmit Cohen# | | local: local: | | 26728b3525SAmit Cohen# | | 2001:db8:3::1 2001:db8:3::1 | | 27728b3525SAmit Cohen# | | remote: remote: | | 28728b3525SAmit Cohen# | | 2001:db8:4::1 2001:db8:5::1 2001:db8:4::1 2001:db8:5::1 | | 29728b3525SAmit Cohen# | | id 1000 dstport $VXPORT id 2000 dstport $VXPORT | | 30728b3525SAmit Cohen# | | vid 10 pvid untagged vid 20 pvid untagged | | 31728b3525SAmit Cohen# | +-----------------------------------------------------------------------+ | 32728b3525SAmit Cohen# | | 33728b3525SAmit Cohen# | 2001:db8:4::0/64 via 2001:db8:3::2 | 34728b3525SAmit Cohen# | 2001:db8:5::0/64 via 2001:db8:3::2 | 35728b3525SAmit Cohen# | | 36728b3525SAmit Cohen# | + $rp1 | 37728b3525SAmit Cohen# | | 2001:db8:3::1/64 | 38728b3525SAmit Cohen# +----|----------------------------------------------------------------------+ 39728b3525SAmit Cohen# | 40728b3525SAmit Cohen# +----|----------------------------------------------------------+ 41728b3525SAmit Cohen# | | VRP2 (vrf) | 42728b3525SAmit Cohen# | + $rp2 | 43728b3525SAmit Cohen# | 2001:db8:3::2/64 | 44728b3525SAmit Cohen# | | (maybe) HW 45728b3525SAmit Cohen# ============================================================================= 46728b3525SAmit Cohen# | | (likely) SW 47728b3525SAmit Cohen# | + v1 (veth) + v3 (veth) | 48728b3525SAmit Cohen# | | 2001:db8:4::2/64 | 2001:db8:5::2/64 | 49728b3525SAmit Cohen# +----|---------------------------------------|------------------+ 50728b3525SAmit Cohen# | | 51728b3525SAmit Cohen# +----|--------------------------------+ +----|-------------------------------+ 52728b3525SAmit Cohen# | + v2 (veth) NS1 (netns) | | + v4 (veth) NS2 (netns) | 53728b3525SAmit Cohen# | 2001:db8:4::1/64 | | 2001:db8:5::1/64 | 54728b3525SAmit Cohen# | | | | 55728b3525SAmit Cohen# | 2001:db8:3::0/64 via 2001:db8:4::2 | | 2001:db8:3::0/64 via 2001:db8:5::2 | 56728b3525SAmit Cohen# | 2001:db8:5::1/128 via 2001:db8:4::2 | | 2001:db8:4::1/128 via | 57728b3525SAmit Cohen# | | | 2001:db8:5::2 | 58728b3525SAmit Cohen# | | | | 59728b3525SAmit Cohen# | +-------------------------------+ | | +-------------------------------+ | 60728b3525SAmit Cohen# | | BR2 (802.1q) | | | | BR2 (802.1q) | | 61728b3525SAmit Cohen# | | + vx10 (vxlan) | | | | + vx10 (vxlan) | | 62728b3525SAmit Cohen# | | local 2001:db8:4::1 | | | | local 2001:db8:5::1 | | 63728b3525SAmit Cohen# | | remote 2001:db8:3::1 | | | | remote 2001:db8:3::1 | | 64728b3525SAmit Cohen# | | remote 2001:db8:5::1 | | | | remote 2001:db8:4::1 | | 65728b3525SAmit Cohen# | | id 1000 dstport $VXPORT | | | | id 1000 dstport $VXPORT | | 66728b3525SAmit Cohen# | | vid 10 pvid untagged | | | | vid 10 pvid untagged | | 67728b3525SAmit Cohen# | | | | | | | | 68728b3525SAmit Cohen# | | + vx20 (vxlan) | | | | + vx20 (vxlan) | | 69728b3525SAmit Cohen# | | local 2001:db8:4::1 | | | | local 2001:db8:5::1 | | 70728b3525SAmit Cohen# | | remote 2001:db8:3::1 | | | | remote 2001:db8:3::1 | | 71728b3525SAmit Cohen# | | remote 2001:db8:5::1 | | | | remote 2001:db8:4::1 | | 72728b3525SAmit Cohen# | | id 2000 dstport $VXPORT | | | | id 2000 dstport $VXPORT | | 73728b3525SAmit Cohen# | | vid 20 pvid untagged | | | | vid 20 pvid untagged | | 74728b3525SAmit Cohen# | | | | | | | | 75728b3525SAmit Cohen# | | + w1 (veth) | | | | + w1 (veth) | | 76728b3525SAmit Cohen# | | | vid 10 | | | | | vid 10 | | 77728b3525SAmit Cohen# | | | vid 20 | | | | | vid 20 | | 78728b3525SAmit Cohen# | +--|----------------------------+ | | +--|----------------------------+ | 79728b3525SAmit Cohen# | | | | | | 80728b3525SAmit Cohen# | +--|----------------------------+ | | +--|----------------------------+ | 81728b3525SAmit Cohen# | | + w2 (veth) VW2 (vrf) | | | | + w2 (veth) VW2 (vrf) | | 82728b3525SAmit Cohen# | | |\ | | | | |\ | | 83728b3525SAmit Cohen# | | | + w2.10 | | | | | + w2.10 | | 84728b3525SAmit Cohen# | | | 192.0.2.3/28 | | | | | 192.0.2.4/28 | | 85728b3525SAmit Cohen# | | | 2001:db8:1::3/64 | | | | | 2001:db8:1::4/64 | | 86728b3525SAmit Cohen# | | | | | | | | | | 87728b3525SAmit Cohen# | | + w2.20 | | | | + w2.20 | | 88728b3525SAmit Cohen# | | 198.51.100.3/24 | | | | 198.51.100.4/24 | | 89728b3525SAmit Cohen# | | 2001:db8:2::3/64 | | | | 2001:db8:2::4/64 | | 90728b3525SAmit Cohen# | +-------------------------------+ | | +-------------------------------+ | 91728b3525SAmit Cohen# +-------------------------------------+ +------------------------------------+ 92728b3525SAmit Cohen 93728b3525SAmit Cohen: ${VXPORT:=4789} 94728b3525SAmit Cohenexport VXPORT 95728b3525SAmit Cohen 96728b3525SAmit Cohen: ${ALL_TESTS:=" 97728b3525SAmit Cohen ping_ipv4 98728b3525SAmit Cohen ping_ipv6 99728b3525SAmit Cohen test_flood 100728b3525SAmit Cohen test_unicast 101728b3525SAmit Cohen reapply_config 102728b3525SAmit Cohen ping_ipv4 103728b3525SAmit Cohen ping_ipv6 104728b3525SAmit Cohen test_flood 105728b3525SAmit Cohen test_unicast 106728b3525SAmit Cohen test_pvid 107728b3525SAmit Cohen ping_ipv4 108728b3525SAmit Cohen ping_ipv6 109728b3525SAmit Cohen test_flood 110728b3525SAmit Cohen test_pvid 111728b3525SAmit Cohen"} 112728b3525SAmit Cohen 113728b3525SAmit CohenNUM_NETIFS=6 114728b3525SAmit Cohensource lib.sh 115728b3525SAmit Cohensource tc_common.sh 116728b3525SAmit Cohen 117728b3525SAmit Cohenh1_create() 118728b3525SAmit Cohen{ 119728b3525SAmit Cohen simple_if_init $h1 120728b3525SAmit Cohen tc qdisc add dev $h1 clsact 121728b3525SAmit Cohen vlan_create $h1 10 v$h1 192.0.2.1/28 2001:db8:1::1/64 122728b3525SAmit Cohen vlan_create $h1 20 v$h1 198.51.100.1/24 2001:db8:2::1/64 123728b3525SAmit Cohen} 124728b3525SAmit Cohen 125728b3525SAmit Cohenh1_destroy() 126728b3525SAmit Cohen{ 127728b3525SAmit Cohen vlan_destroy $h1 20 128728b3525SAmit Cohen vlan_destroy $h1 10 129728b3525SAmit Cohen tc qdisc del dev $h1 clsact 130728b3525SAmit Cohen simple_if_fini $h1 131728b3525SAmit Cohen} 132728b3525SAmit Cohen 133728b3525SAmit Cohenh2_create() 134728b3525SAmit Cohen{ 135728b3525SAmit Cohen simple_if_init $h2 136728b3525SAmit Cohen tc qdisc add dev $h2 clsact 137728b3525SAmit Cohen vlan_create $h2 10 v$h2 192.0.2.2/28 2001:db8:1::2/64 138728b3525SAmit Cohen vlan_create $h2 20 v$h2 198.51.100.2/24 2001:db8:2::2/64 139728b3525SAmit Cohen} 140728b3525SAmit Cohen 141728b3525SAmit Cohenh2_destroy() 142728b3525SAmit Cohen{ 143728b3525SAmit Cohen vlan_destroy $h2 20 144728b3525SAmit Cohen vlan_destroy $h2 10 145728b3525SAmit Cohen tc qdisc del dev $h2 clsact 146728b3525SAmit Cohen simple_if_fini $h2 147728b3525SAmit Cohen} 148728b3525SAmit Cohen 149728b3525SAmit Cohenrp1_set_addr() 150728b3525SAmit Cohen{ 151728b3525SAmit Cohen ip address add dev $rp1 2001:db8:3::1/64 152728b3525SAmit Cohen 153728b3525SAmit Cohen ip route add 2001:db8:4::0/64 nexthop via 2001:db8:3::2 154728b3525SAmit Cohen ip route add 2001:db8:5::0/64 nexthop via 2001:db8:3::2 155728b3525SAmit Cohen} 156728b3525SAmit Cohen 157728b3525SAmit Cohenrp1_unset_addr() 158728b3525SAmit Cohen{ 159728b3525SAmit Cohen ip route del 2001:db8:5::0/64 nexthop via 2001:db8:3::2 160728b3525SAmit Cohen ip route del 2001:db8:4::0/64 nexthop via 2001:db8:3::2 161728b3525SAmit Cohen 162728b3525SAmit Cohen ip address del dev $rp1 2001:db8:3::1/64 163728b3525SAmit Cohen} 164728b3525SAmit Cohen 165728b3525SAmit Cohenswitch_create() 166728b3525SAmit Cohen{ 167728b3525SAmit Cohen ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \ 168728b3525SAmit Cohen mcast_snooping 0 169728b3525SAmit Cohen # Make sure the bridge uses the MAC address of the local port and not 170728b3525SAmit Cohen # that of the VxLAN's device. 171728b3525SAmit Cohen ip link set dev br1 address $(mac_get $swp1) 172728b3525SAmit Cohen ip link set dev br1 up 173728b3525SAmit Cohen 174728b3525SAmit Cohen ip link set dev $rp1 up 175728b3525SAmit Cohen rp1_set_addr 176728b3525SAmit Cohen tc qdisc add dev $rp1 clsact 177728b3525SAmit Cohen 178728b3525SAmit Cohen ip link add name vx10 type vxlan id 1000 local 2001:db8:3::1 \ 179728b3525SAmit Cohen dstport "$VXPORT" nolearning udp6zerocsumrx udp6zerocsumtx \ 180728b3525SAmit Cohen tos inherit ttl 100 181728b3525SAmit Cohen ip link set dev vx10 up 182728b3525SAmit Cohen 183728b3525SAmit Cohen ip link set dev vx10 master br1 184728b3525SAmit Cohen bridge vlan add vid 10 dev vx10 pvid untagged 185728b3525SAmit Cohen 186728b3525SAmit Cohen ip link add name vx20 type vxlan id 2000 local 2001:db8:3::1 \ 187728b3525SAmit Cohen dstport "$VXPORT" nolearning udp6zerocsumrx udp6zerocsumtx \ 188728b3525SAmit Cohen tos inherit ttl 100 189728b3525SAmit Cohen ip link set dev vx20 up 190728b3525SAmit Cohen 191728b3525SAmit Cohen ip link set dev vx20 master br1 192728b3525SAmit Cohen bridge vlan add vid 20 dev vx20 pvid untagged 193728b3525SAmit Cohen 194728b3525SAmit Cohen ip link set dev $swp1 master br1 195728b3525SAmit Cohen ip link set dev $swp1 up 196728b3525SAmit Cohen tc qdisc add dev $swp1 clsact 197728b3525SAmit Cohen bridge vlan add vid 10 dev $swp1 198728b3525SAmit Cohen bridge vlan add vid 20 dev $swp1 199728b3525SAmit Cohen 200728b3525SAmit Cohen ip link set dev $swp2 master br1 201728b3525SAmit Cohen ip link set dev $swp2 up 202728b3525SAmit Cohen bridge vlan add vid 10 dev $swp2 203728b3525SAmit Cohen bridge vlan add vid 20 dev $swp2 204728b3525SAmit Cohen 205728b3525SAmit Cohen bridge fdb append dev vx10 00:00:00:00:00:00 dst 2001:db8:4::1 self 206728b3525SAmit Cohen bridge fdb append dev vx10 00:00:00:00:00:00 dst 2001:db8:5::1 self 207728b3525SAmit Cohen 208728b3525SAmit Cohen bridge fdb append dev vx20 00:00:00:00:00:00 dst 2001:db8:4::1 self 209728b3525SAmit Cohen bridge fdb append dev vx20 00:00:00:00:00:00 dst 2001:db8:5::1 self 210728b3525SAmit Cohen} 211728b3525SAmit Cohen 212728b3525SAmit Cohenswitch_destroy() 213728b3525SAmit Cohen{ 214728b3525SAmit Cohen bridge fdb del dev vx20 00:00:00:00:00:00 dst 2001:db8:5::1 self 215728b3525SAmit Cohen bridge fdb del dev vx20 00:00:00:00:00:00 dst 2001:db8:4::1 self 216728b3525SAmit Cohen 217728b3525SAmit Cohen bridge fdb del dev vx10 00:00:00:00:00:00 dst 2001:db8:5::1 self 218728b3525SAmit Cohen bridge fdb del dev vx10 00:00:00:00:00:00 dst 2001:db8:4::1 self 219728b3525SAmit Cohen 220728b3525SAmit Cohen bridge vlan del vid 20 dev $swp2 221728b3525SAmit Cohen bridge vlan del vid 10 dev $swp2 222728b3525SAmit Cohen ip link set dev $swp2 down 223728b3525SAmit Cohen ip link set dev $swp2 nomaster 224728b3525SAmit Cohen 225728b3525SAmit Cohen bridge vlan del vid 20 dev $swp1 226728b3525SAmit Cohen bridge vlan del vid 10 dev $swp1 227728b3525SAmit Cohen tc qdisc del dev $swp1 clsact 228728b3525SAmit Cohen ip link set dev $swp1 down 229728b3525SAmit Cohen ip link set dev $swp1 nomaster 230728b3525SAmit Cohen 231728b3525SAmit Cohen bridge vlan del vid 20 dev vx20 232728b3525SAmit Cohen ip link set dev vx20 nomaster 233728b3525SAmit Cohen 234728b3525SAmit Cohen ip link set dev vx20 down 235728b3525SAmit Cohen ip link del dev vx20 236728b3525SAmit Cohen 237728b3525SAmit Cohen bridge vlan del vid 10 dev vx10 238728b3525SAmit Cohen ip link set dev vx10 nomaster 239728b3525SAmit Cohen 240728b3525SAmit Cohen ip link set dev vx10 down 241728b3525SAmit Cohen ip link del dev vx10 242728b3525SAmit Cohen 243728b3525SAmit Cohen tc qdisc del dev $rp1 clsact 244728b3525SAmit Cohen rp1_unset_addr 245728b3525SAmit Cohen ip link set dev $rp1 down 246728b3525SAmit Cohen 247728b3525SAmit Cohen ip link set dev br1 down 248728b3525SAmit Cohen ip link del dev br1 249728b3525SAmit Cohen} 250728b3525SAmit Cohen 251728b3525SAmit Cohenvrp2_create() 252728b3525SAmit Cohen{ 253728b3525SAmit Cohen simple_if_init $rp2 2001:db8:3::2/64 254728b3525SAmit Cohen __simple_if_init v1 v$rp2 2001:db8:4::2/64 255728b3525SAmit Cohen __simple_if_init v3 v$rp2 2001:db8:5::2/64 256728b3525SAmit Cohen tc qdisc add dev v1 clsact 257728b3525SAmit Cohen} 258728b3525SAmit Cohen 259728b3525SAmit Cohenvrp2_destroy() 260728b3525SAmit Cohen{ 261728b3525SAmit Cohen tc qdisc del dev v1 clsact 262728b3525SAmit Cohen __simple_if_fini v3 2001:db8:5::2/64 263728b3525SAmit Cohen __simple_if_fini v1 2001:db8:4::2/64 264728b3525SAmit Cohen simple_if_fini $rp2 2001:db8:3::2/64 265728b3525SAmit Cohen} 266728b3525SAmit Cohen 267728b3525SAmit Cohenns_init_common() 268728b3525SAmit Cohen{ 269728b3525SAmit Cohen local in_if=$1; shift 270728b3525SAmit Cohen local in_addr=$1; shift 271728b3525SAmit Cohen local other_in_addr=$1; shift 272728b3525SAmit Cohen local nh_addr=$1; shift 273728b3525SAmit Cohen local host_addr1_ipv4=$1; shift 274728b3525SAmit Cohen local host_addr1_ipv6=$1; shift 275728b3525SAmit Cohen local host_addr2_ipv4=$1; shift 276728b3525SAmit Cohen local host_addr2_ipv6=$1; shift 277728b3525SAmit Cohen 278728b3525SAmit Cohen ip link set dev $in_if up 279728b3525SAmit Cohen ip address add dev $in_if $in_addr/64 280728b3525SAmit Cohen tc qdisc add dev $in_if clsact 281728b3525SAmit Cohen 282728b3525SAmit Cohen ip link add name br2 type bridge vlan_filtering 1 vlan_default_pvid 0 283728b3525SAmit Cohen ip link set dev br2 up 284728b3525SAmit Cohen 285728b3525SAmit Cohen ip link add name w1 type veth peer name w2 286728b3525SAmit Cohen 287728b3525SAmit Cohen ip link set dev w1 master br2 288728b3525SAmit Cohen ip link set dev w1 up 289728b3525SAmit Cohen 290728b3525SAmit Cohen bridge vlan add vid 10 dev w1 291728b3525SAmit Cohen bridge vlan add vid 20 dev w1 292728b3525SAmit Cohen 293728b3525SAmit Cohen ip link add name vx10 type vxlan id 1000 local $in_addr \ 294728b3525SAmit Cohen dstport "$VXPORT" udp6zerocsumrx 295728b3525SAmit Cohen ip link set dev vx10 up 296728b3525SAmit Cohen bridge fdb append dev vx10 00:00:00:00:00:00 dst 2001:db8:3::1 self 297728b3525SAmit Cohen bridge fdb append dev vx10 00:00:00:00:00:00 dst $other_in_addr self 298728b3525SAmit Cohen 299728b3525SAmit Cohen ip link set dev vx10 master br2 300728b3525SAmit Cohen tc qdisc add dev vx10 clsact 301728b3525SAmit Cohen 302728b3525SAmit Cohen bridge vlan add vid 10 dev vx10 pvid untagged 303728b3525SAmit Cohen 304728b3525SAmit Cohen ip link add name vx20 type vxlan id 2000 local $in_addr \ 305728b3525SAmit Cohen dstport "$VXPORT" udp6zerocsumrx 306728b3525SAmit Cohen ip link set dev vx20 up 307728b3525SAmit Cohen bridge fdb append dev vx20 00:00:00:00:00:00 dst 2001:db8:3::1 self 308728b3525SAmit Cohen bridge fdb append dev vx20 00:00:00:00:00:00 dst $other_in_addr self 309728b3525SAmit Cohen 310728b3525SAmit Cohen ip link set dev vx20 master br2 311728b3525SAmit Cohen tc qdisc add dev vx20 clsact 312728b3525SAmit Cohen 313728b3525SAmit Cohen bridge vlan add vid 20 dev vx20 pvid untagged 314728b3525SAmit Cohen 315728b3525SAmit Cohen simple_if_init w2 316728b3525SAmit Cohen vlan_create w2 10 vw2 $host_addr1_ipv4/28 $host_addr1_ipv6/64 317728b3525SAmit Cohen vlan_create w2 20 vw2 $host_addr2_ipv4/24 $host_addr2_ipv6/64 318728b3525SAmit Cohen 319728b3525SAmit Cohen ip route add 2001:db8:3::0/64 nexthop via $nh_addr 320728b3525SAmit Cohen ip route add $other_in_addr/128 nexthop via $nh_addr 321728b3525SAmit Cohen} 322728b3525SAmit Cohenexport -f ns_init_common 323728b3525SAmit Cohen 324728b3525SAmit Cohenns1_create() 325728b3525SAmit Cohen{ 326728b3525SAmit Cohen ip netns add ns1 327728b3525SAmit Cohen ip link set dev v2 netns ns1 328728b3525SAmit Cohen in_ns ns1 \ 329728b3525SAmit Cohen ns_init_common v2 2001:db8:4::1 2001:db8:5::1 2001:db8:4::2 \ 330728b3525SAmit Cohen 192.0.2.3 2001:db8:1::3 198.51.100.3 2001:db8:2::3 331728b3525SAmit Cohen} 332728b3525SAmit Cohen 333728b3525SAmit Cohenns1_destroy() 334728b3525SAmit Cohen{ 335728b3525SAmit Cohen ip netns exec ns1 ip link set dev v2 netns 1 336728b3525SAmit Cohen ip netns del ns1 337728b3525SAmit Cohen} 338728b3525SAmit Cohen 339728b3525SAmit Cohenns2_create() 340728b3525SAmit Cohen{ 341728b3525SAmit Cohen ip netns add ns2 342728b3525SAmit Cohen ip link set dev v4 netns ns2 343728b3525SAmit Cohen in_ns ns2 \ 344728b3525SAmit Cohen ns_init_common v4 2001:db8:5::1 2001:db8:4::1 2001:db8:5::2 \ 345728b3525SAmit Cohen 192.0.2.4 2001:db8:1::4 198.51.100.4 2001:db8:2::4 346728b3525SAmit Cohen} 347728b3525SAmit Cohen 348728b3525SAmit Cohenns2_destroy() 349728b3525SAmit Cohen{ 350728b3525SAmit Cohen ip netns exec ns2 ip link set dev v4 netns 1 351728b3525SAmit Cohen ip netns del ns2 352728b3525SAmit Cohen} 353728b3525SAmit Cohen 354728b3525SAmit Cohensetup_prepare() 355728b3525SAmit Cohen{ 356728b3525SAmit Cohen h1=${NETIFS[p1]} 357728b3525SAmit Cohen swp1=${NETIFS[p2]} 358728b3525SAmit Cohen 359728b3525SAmit Cohen swp2=${NETIFS[p3]} 360728b3525SAmit Cohen h2=${NETIFS[p4]} 361728b3525SAmit Cohen 362728b3525SAmit Cohen rp1=${NETIFS[p5]} 363728b3525SAmit Cohen rp2=${NETIFS[p6]} 364728b3525SAmit Cohen 365728b3525SAmit Cohen vrf_prepare 366728b3525SAmit Cohen forwarding_enable 367728b3525SAmit Cohen 368728b3525SAmit Cohen h1_create 369728b3525SAmit Cohen h2_create 370728b3525SAmit Cohen switch_create 371728b3525SAmit Cohen 372728b3525SAmit Cohen ip link add name v1 type veth peer name v2 373728b3525SAmit Cohen ip link add name v3 type veth peer name v4 374728b3525SAmit Cohen vrp2_create 375728b3525SAmit Cohen ns1_create 376728b3525SAmit Cohen ns2_create 377728b3525SAmit Cohen 378728b3525SAmit Cohen r1_mac=$(in_ns ns1 mac_get w2) 379728b3525SAmit Cohen r2_mac=$(in_ns ns2 mac_get w2) 380728b3525SAmit Cohen h2_mac=$(mac_get $h2) 381728b3525SAmit Cohen} 382728b3525SAmit Cohen 383728b3525SAmit Cohencleanup() 384728b3525SAmit Cohen{ 385728b3525SAmit Cohen pre_cleanup 386728b3525SAmit Cohen 387728b3525SAmit Cohen ns2_destroy 388728b3525SAmit Cohen ns1_destroy 389728b3525SAmit Cohen vrp2_destroy 390728b3525SAmit Cohen ip link del dev v3 391728b3525SAmit Cohen ip link del dev v1 392728b3525SAmit Cohen 393728b3525SAmit Cohen switch_destroy 394728b3525SAmit Cohen h2_destroy 395728b3525SAmit Cohen h1_destroy 396728b3525SAmit Cohen 397728b3525SAmit Cohen forwarding_restore 398728b3525SAmit Cohen vrf_cleanup 399728b3525SAmit Cohen} 400728b3525SAmit Cohen 401728b3525SAmit Cohen# For the first round of tests, vx10 and vx20 were the first devices to get 402728b3525SAmit Cohen# attached to the bridge, and at that point the local IP is already 403728b3525SAmit Cohen# configured. Try the other scenario of attaching these devices to a bridge 404728b3525SAmit Cohen# that already has local ports members, and only then assign the local IP. 405728b3525SAmit Cohenreapply_config() 406728b3525SAmit Cohen{ 407728b3525SAmit Cohen log_info "Reapplying configuration" 408728b3525SAmit Cohen 409728b3525SAmit Cohen bridge fdb del dev vx20 00:00:00:00:00:00 dst 2001:db8:5::1 self 410728b3525SAmit Cohen bridge fdb del dev vx20 00:00:00:00:00:00 dst 2001:db8:4::1 self 411728b3525SAmit Cohen 412728b3525SAmit Cohen bridge fdb del dev vx10 00:00:00:00:00:00 dst 2001:db8:5::1 self 413728b3525SAmit Cohen bridge fdb del dev vx10 00:00:00:00:00:00 dst 2001:db8:4::1 self 414728b3525SAmit Cohen 415728b3525SAmit Cohen ip link set dev vx20 nomaster 416728b3525SAmit Cohen ip link set dev vx10 nomaster 417728b3525SAmit Cohen 418728b3525SAmit Cohen rp1_unset_addr 419728b3525SAmit Cohen sleep 5 420728b3525SAmit Cohen 421728b3525SAmit Cohen ip link set dev vx10 master br1 422728b3525SAmit Cohen bridge vlan add vid 10 dev vx10 pvid untagged 423728b3525SAmit Cohen 424728b3525SAmit Cohen ip link set dev vx20 master br1 425728b3525SAmit Cohen bridge vlan add vid 20 dev vx20 pvid untagged 426728b3525SAmit Cohen 427728b3525SAmit Cohen bridge fdb append dev vx10 00:00:00:00:00:00 dst 2001:db8:4::1 self 428728b3525SAmit Cohen bridge fdb append dev vx10 00:00:00:00:00:00 dst 2001:db8:5::1 self 429728b3525SAmit Cohen 430728b3525SAmit Cohen bridge fdb append dev vx20 00:00:00:00:00:00 dst 2001:db8:4::1 self 431728b3525SAmit Cohen bridge fdb append dev vx20 00:00:00:00:00:00 dst 2001:db8:5::1 self 432728b3525SAmit Cohen 433728b3525SAmit Cohen rp1_set_addr 434728b3525SAmit Cohen sleep 5 435728b3525SAmit Cohen} 436728b3525SAmit Cohen 437728b3525SAmit Cohen__ping_ipv4() 438728b3525SAmit Cohen{ 439728b3525SAmit Cohen local vxlan_local_ip=$1; shift 440728b3525SAmit Cohen local vxlan_remote_ip=$1; shift 441728b3525SAmit Cohen local src_ip=$1; shift 442728b3525SAmit Cohen local dst_ip=$1; shift 443728b3525SAmit Cohen local dev=$1; shift 444728b3525SAmit Cohen local info=$1; shift 445728b3525SAmit Cohen 446728b3525SAmit Cohen RET=0 447728b3525SAmit Cohen 448728b3525SAmit Cohen tc filter add dev $rp1 egress protocol ipv6 pref 1 handle 101 \ 449728b3525SAmit Cohen flower ip_proto udp src_ip $vxlan_local_ip \ 450728b3525SAmit Cohen dst_ip $vxlan_remote_ip dst_port $VXPORT $TC_FLAG action pass 451728b3525SAmit Cohen # Match ICMP-reply packets after decapsulation, so source IP is 452728b3525SAmit Cohen # destination IP of the ping and destination IP is source IP of the 453728b3525SAmit Cohen # ping. 454728b3525SAmit Cohen tc filter add dev $swp1 egress protocol 802.1q pref 1 handle 101 \ 455728b3525SAmit Cohen flower vlan_ethtype ipv4 src_ip $dst_ip dst_ip $src_ip \ 456728b3525SAmit Cohen $TC_FLAG action pass 457728b3525SAmit Cohen 458728b3525SAmit Cohen # Send 100 packets and verify that at least 100 packets hit the rule, 459728b3525SAmit Cohen # to overcome ARP noise. 460*b6dfcdbcSIdo Schimmel PING_COUNT=100 PING_TIMEOUT=20 ping_do $dev $dst_ip 461728b3525SAmit Cohen check_err $? "Ping failed" 462728b3525SAmit Cohen 463728b3525SAmit Cohen tc_check_at_least_x_packets "dev $rp1 egress" 101 10 100 464728b3525SAmit Cohen check_err $? "Encapsulated packets did not go through router" 465728b3525SAmit Cohen 466728b3525SAmit Cohen tc_check_at_least_x_packets "dev $swp1 egress" 101 10 100 467728b3525SAmit Cohen check_err $? "Decapsulated packets did not go through switch" 468728b3525SAmit Cohen 469728b3525SAmit Cohen log_test "ping: $info" 470728b3525SAmit Cohen 471728b3525SAmit Cohen tc filter del dev $swp1 egress 472728b3525SAmit Cohen tc filter del dev $rp1 egress 473728b3525SAmit Cohen} 474728b3525SAmit Cohen 475728b3525SAmit Cohenping_ipv4() 476728b3525SAmit Cohen{ 477728b3525SAmit Cohen RET=0 478728b3525SAmit Cohen 479728b3525SAmit Cohen local local_sw_ip=2001:db8:3::1 480728b3525SAmit Cohen local remote_ns1_ip=2001:db8:4::1 481728b3525SAmit Cohen local remote_ns2_ip=2001:db8:5::1 482728b3525SAmit Cohen local h1_10_ip=192.0.2.1 483728b3525SAmit Cohen local h1_20_ip=198.51.100.1 484728b3525SAmit Cohen local w2_10_ns1_ip=192.0.2.3 485728b3525SAmit Cohen local w2_10_ns2_ip=192.0.2.4 486728b3525SAmit Cohen local w2_20_ns1_ip=198.51.100.3 487728b3525SAmit Cohen local w2_20_ns2_ip=198.51.100.4 488728b3525SAmit Cohen 489728b3525SAmit Cohen ping_test $h1.10 192.0.2.2 ": local->local vid 10" 490728b3525SAmit Cohen ping_test $h1.20 198.51.100.2 ": local->local vid 20" 491728b3525SAmit Cohen 492728b3525SAmit Cohen __ping_ipv4 $local_sw_ip $remote_ns1_ip $h1_10_ip $w2_10_ns1_ip $h1.10 \ 493728b3525SAmit Cohen "local->remote 1 vid 10" 494728b3525SAmit Cohen __ping_ipv4 $local_sw_ip $remote_ns2_ip $h1_10_ip $w2_10_ns2_ip $h1.10 \ 495728b3525SAmit Cohen "local->remote 2 vid 10" 496728b3525SAmit Cohen __ping_ipv4 $local_sw_ip $remote_ns1_ip $h1_20_ip $w2_20_ns1_ip $h1.20 \ 497728b3525SAmit Cohen "local->remote 1 vid 20" 498728b3525SAmit Cohen __ping_ipv4 $local_sw_ip $remote_ns2_ip $h1_20_ip $w2_20_ns2_ip $h1.20 \ 499728b3525SAmit Cohen "local->remote 2 vid 20" 500728b3525SAmit Cohen} 501728b3525SAmit Cohen 502728b3525SAmit Cohen__ping_ipv6() 503728b3525SAmit Cohen{ 504728b3525SAmit Cohen local vxlan_local_ip=$1; shift 505728b3525SAmit Cohen local vxlan_remote_ip=$1; shift 506728b3525SAmit Cohen local src_ip=$1; shift 507728b3525SAmit Cohen local dst_ip=$1; shift 508728b3525SAmit Cohen local dev=$1; shift 509728b3525SAmit Cohen local info=$1; shift 510728b3525SAmit Cohen 511728b3525SAmit Cohen RET=0 512728b3525SAmit Cohen 513728b3525SAmit Cohen tc filter add dev $rp1 egress protocol ipv6 pref 1 handle 101 \ 514728b3525SAmit Cohen flower ip_proto udp src_ip $vxlan_local_ip \ 515728b3525SAmit Cohen dst_ip $vxlan_remote_ip dst_port $VXPORT $TC_FLAG action pass 516728b3525SAmit Cohen # Match ICMP-reply packets after decapsulation, so source IP is 517728b3525SAmit Cohen # destination IP of the ping and destination IP is source IP of the 518728b3525SAmit Cohen # ping. 519728b3525SAmit Cohen tc filter add dev $swp1 egress protocol 802.1q pref 1 handle 101 \ 520728b3525SAmit Cohen flower vlan_ethtype ipv6 src_ip $dst_ip dst_ip $src_ip \ 521728b3525SAmit Cohen $TC_FLAG action pass 522728b3525SAmit Cohen 523728b3525SAmit Cohen # Send 100 packets and verify that at least 100 packets hit the rule, 524728b3525SAmit Cohen # to overcome neighbor discovery noise. 525*b6dfcdbcSIdo Schimmel PING_COUNT=100 PING_TIMEOUT=20 ping6_do $dev $dst_ip 526728b3525SAmit Cohen check_err $? "Ping failed" 527728b3525SAmit Cohen 528728b3525SAmit Cohen tc_check_at_least_x_packets "dev $rp1 egress" 101 100 529728b3525SAmit Cohen check_err $? "Encapsulated packets did not go through router" 530728b3525SAmit Cohen 531728b3525SAmit Cohen tc_check_at_least_x_packets "dev $swp1 egress" 101 100 532728b3525SAmit Cohen check_err $? "Decapsulated packets did not go through switch" 533728b3525SAmit Cohen 534728b3525SAmit Cohen log_test "ping6: $info" 535728b3525SAmit Cohen 536728b3525SAmit Cohen tc filter del dev $swp1 egress 537728b3525SAmit Cohen tc filter del dev $rp1 egress 538728b3525SAmit Cohen} 539728b3525SAmit Cohen 540728b3525SAmit Cohenping_ipv6() 541728b3525SAmit Cohen{ 542728b3525SAmit Cohen RET=0 543728b3525SAmit Cohen 544728b3525SAmit Cohen local local_sw_ip=2001:db8:3::1 545728b3525SAmit Cohen local remote_ns1_ip=2001:db8:4::1 546728b3525SAmit Cohen local remote_ns2_ip=2001:db8:5::1 547728b3525SAmit Cohen local h1_10_ip=2001:db8:1::1 548728b3525SAmit Cohen local h1_20_ip=2001:db8:2::1 549728b3525SAmit Cohen local w2_10_ns1_ip=2001:db8:1::3 550728b3525SAmit Cohen local w2_10_ns2_ip=2001:db8:1::4 551728b3525SAmit Cohen local w2_20_ns1_ip=2001:db8:2::3 552728b3525SAmit Cohen local w2_20_ns2_ip=2001:db8:2::4 553728b3525SAmit Cohen 554728b3525SAmit Cohen ping6_test $h1.10 2001:db8:1::2 ": local->local vid 10" 555728b3525SAmit Cohen ping6_test $h1.20 2001:db8:2::2 ": local->local vid 20" 556728b3525SAmit Cohen 557728b3525SAmit Cohen __ping_ipv6 $local_sw_ip $remote_ns1_ip $h1_10_ip $w2_10_ns1_ip $h1.10 \ 558728b3525SAmit Cohen "local->remote 1 vid 10" 559728b3525SAmit Cohen __ping_ipv6 $local_sw_ip $remote_ns2_ip $h1_10_ip $w2_10_ns2_ip $h1.10 \ 560728b3525SAmit Cohen "local->remote 2 vid 10" 561728b3525SAmit Cohen __ping_ipv6 $local_sw_ip $remote_ns1_ip $h1_20_ip $w2_20_ns1_ip $h1.20 \ 562728b3525SAmit Cohen "local->remote 1 vid 20" 563728b3525SAmit Cohen __ping_ipv6 $local_sw_ip $remote_ns2_ip $h1_20_ip $w2_20_ns2_ip $h1.20 \ 564728b3525SAmit Cohen "local->remote 2 vid 20" 565728b3525SAmit Cohen} 566728b3525SAmit Cohen 567728b3525SAmit Cohenmaybe_in_ns() 568728b3525SAmit Cohen{ 569728b3525SAmit Cohen echo ${1:+in_ns} $1 570728b3525SAmit Cohen} 571728b3525SAmit Cohen 572728b3525SAmit Cohen__flood_counter_add_del() 573728b3525SAmit Cohen{ 574728b3525SAmit Cohen local add_del=$1; shift 575728b3525SAmit Cohen local dst_ip=$1; shift 576728b3525SAmit Cohen local dev=$1; shift 577728b3525SAmit Cohen local ns=$1; shift 578728b3525SAmit Cohen 579728b3525SAmit Cohen # Putting the ICMP capture both to HW and to SW will end up 580728b3525SAmit Cohen # double-counting the packets that are trapped to slow path, such as for 581728b3525SAmit Cohen # the unicast test. Adding either skip_hw or skip_sw fixes this problem, 582728b3525SAmit Cohen # but with skip_hw, the flooded packets are not counted at all, because 583728b3525SAmit Cohen # those are dropped due to MAC address mismatch; and skip_sw is a no-go 584728b3525SAmit Cohen # for veth-based topologies. 585728b3525SAmit Cohen # 586728b3525SAmit Cohen # So try to install with skip_sw and fall back to skip_sw if that fails. 587728b3525SAmit Cohen 588728b3525SAmit Cohen $(maybe_in_ns $ns) tc filter $add_del dev "$dev" ingress \ 589728b3525SAmit Cohen proto ipv6 pref 100 flower dst_ip $dst_ip ip_proto \ 590728b3525SAmit Cohen icmpv6 skip_sw action pass 2>/dev/null || \ 591728b3525SAmit Cohen $(maybe_in_ns $ns) tc filter $add_del dev "$dev" ingress \ 592728b3525SAmit Cohen proto ipv6 pref 100 flower dst_ip $dst_ip ip_proto \ 593728b3525SAmit Cohen icmpv6 skip_hw action pass 594728b3525SAmit Cohen} 595728b3525SAmit Cohen 596728b3525SAmit Cohenflood_counter_install() 597728b3525SAmit Cohen{ 598728b3525SAmit Cohen __flood_counter_add_del add "$@" 599728b3525SAmit Cohen} 600728b3525SAmit Cohen 601728b3525SAmit Cohenflood_counter_uninstall() 602728b3525SAmit Cohen{ 603728b3525SAmit Cohen __flood_counter_add_del del "$@" 604728b3525SAmit Cohen} 605728b3525SAmit Cohen 606728b3525SAmit Cohenflood_fetch_stat() 607728b3525SAmit Cohen{ 608728b3525SAmit Cohen local dev=$1; shift 609728b3525SAmit Cohen local ns=$1; shift 610728b3525SAmit Cohen 611728b3525SAmit Cohen $(maybe_in_ns $ns) tc_rule_stats_get $dev 100 ingress 612728b3525SAmit Cohen} 613728b3525SAmit Cohen 614728b3525SAmit Cohenflood_fetch_stats() 615728b3525SAmit Cohen{ 616728b3525SAmit Cohen local counters=("${@}") 617728b3525SAmit Cohen local counter 618728b3525SAmit Cohen 619728b3525SAmit Cohen for counter in "${counters[@]}"; do 620728b3525SAmit Cohen flood_fetch_stat $counter 621728b3525SAmit Cohen done 622728b3525SAmit Cohen} 623728b3525SAmit Cohen 624728b3525SAmit Cohenvxlan_flood_test() 625728b3525SAmit Cohen{ 626728b3525SAmit Cohen local mac=$1; shift 627728b3525SAmit Cohen local dst=$1; shift 628728b3525SAmit Cohen local vid=$1; shift 629728b3525SAmit Cohen local -a expects=("${@}") 630728b3525SAmit Cohen 631728b3525SAmit Cohen local -a counters=($h2 "vx10 ns1" "vx20 ns1" "vx10 ns2" "vx20 ns2") 632728b3525SAmit Cohen local counter 633728b3525SAmit Cohen local key 634728b3525SAmit Cohen 635728b3525SAmit Cohen # Packets reach the local host tagged whereas they reach the VxLAN 636728b3525SAmit Cohen # devices untagged. In order to be able to use the same filter for 637728b3525SAmit Cohen # all counters, make sure the packets also reach the local host 638728b3525SAmit Cohen # untagged 639728b3525SAmit Cohen bridge vlan add vid $vid dev $swp2 untagged 640728b3525SAmit Cohen for counter in "${counters[@]}"; do 641728b3525SAmit Cohen flood_counter_install $dst $counter 642728b3525SAmit Cohen done 643728b3525SAmit Cohen 644728b3525SAmit Cohen local -a t0s=($(flood_fetch_stats "${counters[@]}")) 645728b3525SAmit Cohen $MZ -6 $h1 -Q $vid -c 10 -d 100msec -p 64 -b $mac -B $dst -t icmp6 type=128 -q 646728b3525SAmit Cohen sleep 1 647728b3525SAmit Cohen local -a t1s=($(flood_fetch_stats "${counters[@]}")) 648728b3525SAmit Cohen 649728b3525SAmit Cohen for key in ${!t0s[@]}; do 650728b3525SAmit Cohen local delta=$((t1s[$key] - t0s[$key])) 651728b3525SAmit Cohen local expect=${expects[$key]} 652728b3525SAmit Cohen 653728b3525SAmit Cohen ((expect == delta)) 654728b3525SAmit Cohen check_err $? "${counters[$key]}: Expected to capture $expect packets, got $delta." 655728b3525SAmit Cohen done 656728b3525SAmit Cohen 657728b3525SAmit Cohen for counter in "${counters[@]}"; do 658728b3525SAmit Cohen flood_counter_uninstall $dst $counter 659728b3525SAmit Cohen done 660728b3525SAmit Cohen bridge vlan add vid $vid dev $swp2 661728b3525SAmit Cohen} 662728b3525SAmit Cohen 663728b3525SAmit Cohen__test_flood() 664728b3525SAmit Cohen{ 665728b3525SAmit Cohen local mac=$1; shift 666728b3525SAmit Cohen local dst=$1; shift 667728b3525SAmit Cohen local vid=$1; shift 668728b3525SAmit Cohen local what=$1; shift 669728b3525SAmit Cohen local -a expects=("${@}") 670728b3525SAmit Cohen 671728b3525SAmit Cohen RET=0 672728b3525SAmit Cohen 673728b3525SAmit Cohen vxlan_flood_test $mac $dst $vid "${expects[@]}" 674728b3525SAmit Cohen 675728b3525SAmit Cohen log_test "VXLAN: $what" 676728b3525SAmit Cohen} 677728b3525SAmit Cohen 678728b3525SAmit Cohentest_flood() 679728b3525SAmit Cohen{ 680728b3525SAmit Cohen __test_flood de:ad:be:ef:13:37 2001:db8:1::100 10 "flood vlan 10" \ 681728b3525SAmit Cohen 10 10 0 10 0 682728b3525SAmit Cohen __test_flood ca:fe:be:ef:13:37 2001:db8:2::100 20 "flood vlan 20" \ 683728b3525SAmit Cohen 10 0 10 0 10 684728b3525SAmit Cohen} 685728b3525SAmit Cohen 686728b3525SAmit Cohenvxlan_fdb_add_del() 687728b3525SAmit Cohen{ 688728b3525SAmit Cohen local add_del=$1; shift 689728b3525SAmit Cohen local vid=$1; shift 690728b3525SAmit Cohen local mac=$1; shift 691728b3525SAmit Cohen local dev=$1; shift 692728b3525SAmit Cohen local dst=$1; shift 693728b3525SAmit Cohen 694728b3525SAmit Cohen bridge fdb $add_del dev $dev $mac self static permanent \ 695728b3525SAmit Cohen ${dst:+dst} $dst 2>/dev/null 696728b3525SAmit Cohen bridge fdb $add_del dev $dev $mac master static vlan $vid 2>/dev/null 697728b3525SAmit Cohen} 698728b3525SAmit Cohen 699728b3525SAmit Cohen__test_unicast() 700728b3525SAmit Cohen{ 701728b3525SAmit Cohen local mac=$1; shift 702728b3525SAmit Cohen local dst=$1; shift 703728b3525SAmit Cohen local hit_idx=$1; shift 704728b3525SAmit Cohen local vid=$1; shift 705728b3525SAmit Cohen local what=$1; shift 706728b3525SAmit Cohen 707728b3525SAmit Cohen RET=0 708728b3525SAmit Cohen 709728b3525SAmit Cohen local -a expects=(0 0 0 0 0) 710728b3525SAmit Cohen expects[$hit_idx]=10 711728b3525SAmit Cohen 712728b3525SAmit Cohen vxlan_flood_test $mac $dst $vid "${expects[@]}" 713728b3525SAmit Cohen 714728b3525SAmit Cohen log_test "VXLAN: $what" 715728b3525SAmit Cohen} 716728b3525SAmit Cohen 717728b3525SAmit Cohentest_unicast() 718728b3525SAmit Cohen{ 719728b3525SAmit Cohen local -a targets=("$h2_mac $h2" 720728b3525SAmit Cohen "$r1_mac vx10 2001:db8:4::1" 721728b3525SAmit Cohen "$r2_mac vx10 2001:db8:5::1") 722728b3525SAmit Cohen local target 723728b3525SAmit Cohen 724728b3525SAmit Cohen log_info "unicast vlan 10" 725728b3525SAmit Cohen 726728b3525SAmit Cohen for target in "${targets[@]}"; do 727728b3525SAmit Cohen vxlan_fdb_add_del add 10 $target 728728b3525SAmit Cohen done 729728b3525SAmit Cohen 730728b3525SAmit Cohen __test_unicast $h2_mac 2001:db8:1::2 0 10 "local MAC unicast" 731728b3525SAmit Cohen __test_unicast $r1_mac 2001:db8:1::3 1 10 "remote MAC 1 unicast" 732728b3525SAmit Cohen __test_unicast $r2_mac 2001:db8:1::4 3 10 "remote MAC 2 unicast" 733728b3525SAmit Cohen 734728b3525SAmit Cohen for target in "${targets[@]}"; do 735728b3525SAmit Cohen vxlan_fdb_add_del del 10 $target 736728b3525SAmit Cohen done 737728b3525SAmit Cohen 738728b3525SAmit Cohen log_info "unicast vlan 20" 739728b3525SAmit Cohen 740728b3525SAmit Cohen targets=("$h2_mac $h2" "$r1_mac vx20 2001:db8:4::1" \ 741728b3525SAmit Cohen "$r2_mac vx20 2001:db8:5::1") 742728b3525SAmit Cohen 743728b3525SAmit Cohen for target in "${targets[@]}"; do 744728b3525SAmit Cohen vxlan_fdb_add_del add 20 $target 745728b3525SAmit Cohen done 746728b3525SAmit Cohen 747728b3525SAmit Cohen __test_unicast $h2_mac 2001:db8:2::2 0 20 "local MAC unicast" 748728b3525SAmit Cohen __test_unicast $r1_mac 2001:db8:2::3 2 20 "remote MAC 1 unicast" 749728b3525SAmit Cohen __test_unicast $r2_mac 2001:db8:2::4 4 20 "remote MAC 2 unicast" 750728b3525SAmit Cohen 751728b3525SAmit Cohen for target in "${targets[@]}"; do 752728b3525SAmit Cohen vxlan_fdb_add_del del 20 $target 753728b3525SAmit Cohen done 754728b3525SAmit Cohen} 755728b3525SAmit Cohen 756728b3525SAmit Cohentest_pvid() 757728b3525SAmit Cohen{ 758728b3525SAmit Cohen local -a expects=(0 0 0 0 0) 759728b3525SAmit Cohen local mac=de:ad:be:ef:13:37 760728b3525SAmit Cohen local dst=2001:db8:1::100 761728b3525SAmit Cohen local vid=10 762728b3525SAmit Cohen 763728b3525SAmit Cohen # Check that flooding works 764728b3525SAmit Cohen RET=0 765728b3525SAmit Cohen 766728b3525SAmit Cohen expects[0]=10; expects[1]=10; expects[3]=10 767728b3525SAmit Cohen vxlan_flood_test $mac $dst $vid "${expects[@]}" 768728b3525SAmit Cohen 769728b3525SAmit Cohen log_test "VXLAN: flood before pvid off" 770728b3525SAmit Cohen 771728b3525SAmit Cohen # Toggle PVID off and test that flood to remote hosts does not work 772728b3525SAmit Cohen RET=0 773728b3525SAmit Cohen 774728b3525SAmit Cohen bridge vlan add vid 10 dev vx10 775728b3525SAmit Cohen 776728b3525SAmit Cohen expects[0]=10; expects[1]=0; expects[3]=0 777728b3525SAmit Cohen vxlan_flood_test $mac $dst $vid "${expects[@]}" 778728b3525SAmit Cohen 779728b3525SAmit Cohen log_test "VXLAN: flood after pvid off" 780728b3525SAmit Cohen 781728b3525SAmit Cohen # Toggle PVID on and test that flood to remote hosts does work 782728b3525SAmit Cohen RET=0 783728b3525SAmit Cohen 784728b3525SAmit Cohen bridge vlan add vid 10 dev vx10 pvid untagged 785728b3525SAmit Cohen 786728b3525SAmit Cohen expects[0]=10; expects[1]=10; expects[3]=10 787728b3525SAmit Cohen vxlan_flood_test $mac $dst $vid "${expects[@]}" 788728b3525SAmit Cohen 789728b3525SAmit Cohen log_test "VXLAN: flood after pvid on" 790728b3525SAmit Cohen 791728b3525SAmit Cohen # Add a new VLAN and test that it does not affect flooding 792728b3525SAmit Cohen RET=0 793728b3525SAmit Cohen 794728b3525SAmit Cohen bridge vlan add vid 30 dev vx10 795728b3525SAmit Cohen 796728b3525SAmit Cohen expects[0]=10; expects[1]=10; expects[3]=10 797728b3525SAmit Cohen vxlan_flood_test $mac $dst $vid "${expects[@]}" 798728b3525SAmit Cohen 799728b3525SAmit Cohen bridge vlan del vid 30 dev vx10 800728b3525SAmit Cohen 801728b3525SAmit Cohen log_test "VXLAN: flood after vlan add" 802728b3525SAmit Cohen 803728b3525SAmit Cohen # Remove currently mapped VLAN and test that flood to remote hosts does 804728b3525SAmit Cohen # not work 805728b3525SAmit Cohen RET=0 806728b3525SAmit Cohen 807728b3525SAmit Cohen bridge vlan del vid 10 dev vx10 808728b3525SAmit Cohen 809728b3525SAmit Cohen expects[0]=10; expects[1]=0; expects[3]=0 810728b3525SAmit Cohen vxlan_flood_test $mac $dst $vid "${expects[@]}" 811728b3525SAmit Cohen 812728b3525SAmit Cohen log_test "VXLAN: flood after vlan delete" 813728b3525SAmit Cohen 814728b3525SAmit Cohen # Re-add the VLAN and test that flood to remote hosts does work 815728b3525SAmit Cohen RET=0 816728b3525SAmit Cohen 817728b3525SAmit Cohen bridge vlan add vid 10 dev vx10 pvid untagged 818728b3525SAmit Cohen 819728b3525SAmit Cohen expects[0]=10; expects[1]=10; expects[3]=10 820728b3525SAmit Cohen vxlan_flood_test $mac $dst $vid "${expects[@]}" 821728b3525SAmit Cohen 822728b3525SAmit Cohen log_test "VXLAN: flood after vlan re-add" 823728b3525SAmit Cohen} 824728b3525SAmit Cohen 825728b3525SAmit Cohentest_all() 826728b3525SAmit Cohen{ 827728b3525SAmit Cohen log_info "Running tests with UDP port $VXPORT" 828728b3525SAmit Cohen tests_run 829728b3525SAmit Cohen} 830728b3525SAmit Cohen 831728b3525SAmit Cohentrap cleanup EXIT 832728b3525SAmit Cohen 833728b3525SAmit Cohensetup_prepare 834728b3525SAmit Cohensetup_wait 835728b3525SAmit Cohentest_all 836728b3525SAmit Cohen 837728b3525SAmit Cohenexit $EXIT_STATUS 838