1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4 5# +--------------------------------+ +-----------------------------+ 6# | vrf-h1 | | vrf-h2 | 7# | + $h1 | | + $h2 | 8# | | 2001:db8:1::1/64 | | | 2001:db8:2::1/64 | 9# | | default via 2001:db8:1::3 | | | default via 2001:db8:2::3 | 10# +----|---------------------------+ +-|---------------------------+ 11# | | 12# +----|------------------------------------------|---------------------------+ 13# | SW | | | 14# | +--|------------------------------------------|-------------------------+ | 15# | | + $swp1 br1 + $swp2 | | 16# | | vid 10 pvid untagged vid 20 pvid untagged | | 17# | | | | 18# | | + vx10 + vx20 | | 19# | | local 2001:db8:3::1 local 2001:db8:3::1 | | 20# | | remote 2001:db8:3::2 remote 2001:db8:3::2 | | 21# | | id 1010 id 1020 | | 22# | | dstport 4789 dstport 4789 | | 23# | | vid 10 pvid untagged vid 20 pvid untagged | | 24# | | | | 25# | | + vx4001 | | 26# | | local 2001:db8:3::1 | | 27# | | remote 2001:db8:3::2 | | 28# | | id 104001 | | 29# | | dstport 4789 | | 30# | | vid 4001 pvid untagged | | 31# | | | | 32# | +-----------------------------------+-----------------------------------+ | 33# | | | 34# | +-----------------------------------|-----------------------------------+ | 35# | | | | | 36# | | +--------------------------------+--------------------------------+ | | 37# | | | | | | | 38# | | + vlan10 | vlan20 + | | 39# | | | 2001:db8:1::2/64 | 2001:db8:2::2/64 | | | 40# | | | | | | | 41# | | + vlan10-v (macvlan) + vlan20-v (macvlan) + | | 42# | | 2001:db8:1::3/64 vlan4001 2001:db8:2::3/64 | | 43# | | 00:00:5e:00:01:01 00:00:5e:00:01:01 | | 44# | | vrf-green | | 45# | +-----------------------------------------------------------------------+ | 46# | | 47# | + $rp1 +lo | 48# | | 2001:db8:4::1/64 2001:db8:3::1 | 49# +----|----------------------------------------------------------------------+ 50# | 51# +----|--------------------------------------------------------+ 52# | | vrf-spine | 53# | + $rp2 | 54# | 2001:db8:4::2/64 | 55# | | (maybe) HW 56# ============================================================================= 57# | | (likely) SW 58# | | 59# | + v1 (veth) | 60# | | 2001:db8:5::2/64 | 61# +----|--------------------------------------------------------+ 62# | 63# +----|----------------------------------------------------------------------+ 64# | + v2 (veth) +lo NS1 (netns) | 65# | 2001:db8:5::1/64 2001:db8:3::2/128 | 66# | | 67# | +-----------------------------------------------------------------------+ | 68# | | vrf-green | | 69# | | + vlan10-v (macvlan) vlan20-v (macvlan) + | | 70# | | | 2001:db8:1::3/64 2001:db8:2::3/64 | | | 71# | | | 00:00:5e:00:01:01 00:00:5e:00:01:01 | | | 72# | | | vlan4001 | | | 73# | | + vlan10 + vlan20 + | | 74# | | | 2001:db8:1::3/64 | 2001:db8:2::3/64 | | | 75# | | | | | | | 76# | | +--------------------------------+--------------------------------+ | | 77# | | | | | 78# | +-----------------------------------|-----------------------------------+ | 79# | | | 80# | +-----------------------------------+-----------------------------------+ | 81# | | | | 82# | | + vx10 + vx20 | | 83# | | local 2001:db8:3::2 local 2001:db8:3::2 | | 84# | | remote 2001:db8:3::1 remote 2001:db8:3::1 | | 85# | | id 1010 id 1020 | | 86# | | dstport 4789 dstport 4789 | | 87# | | vid 10 pvid untagged vid 20 pvid untagged | | 88# | | | | 89# | | + vx4001 | | 90# | | local 2001:db8:3::2 | | 91# | | remote 2001:db8:3::1 | | 92# | | id 104001 | | 93# | | dstport 4789 | | 94# | | vid 4001 pvid untagged | | 95# | | | | 96# | | + w1 (veth) + w3 (veth) | | 97# | | | vid 10 pvid untagged br1 | vid 20 pvid untagged | | 98# | +--|------------------------------------------|-------------------------+ | 99# | | | | 100# | | | | 101# | +--|----------------------+ +--|-------------------------+ | 102# | | | vrf-h1 | | | vrf-h2 | | 103# | | + w2 (veth) | | + w4 (veth) | | 104# | | 2001:db8:1::4/64 | | 2001:db8:2::4/64 | | 105# | | default via | | default via | | 106# | | 2001:db8:1::3/64 | | 2001:db8:2::3/64 | | 107# | +-------------------------+ +----------------------------+ | 108# +---------------------------------------------------------------------------+ 109 110ALL_TESTS=" 111 ping_ipv6 112" 113NUM_NETIFS=6 114source lib.sh 115 116hx_create() 117{ 118 local vrf_name=$1; shift 119 local if_name=$1; shift 120 local ip_addr=$1; shift 121 local gw_ip=$1; shift 122 123 vrf_create $vrf_name 124 ip link set dev $if_name master $vrf_name 125 ip link set dev $vrf_name up 126 ip link set dev $if_name up 127 128 ip address add $ip_addr/64 dev $if_name 129 ip neigh replace $gw_ip lladdr 00:00:5e:00:01:01 nud permanent \ 130 dev $if_name 131 ip route add default vrf $vrf_name nexthop via $gw_ip 132} 133export -f hx_create 134 135hx_destroy() 136{ 137 local vrf_name=$1; shift 138 local if_name=$1; shift 139 local ip_addr=$1; shift 140 local gw_ip=$1; shift 141 142 ip route del default vrf $vrf_name nexthop via $gw_ip 143 ip neigh del $gw_ip dev $if_name 144 ip address del $ip_addr/64 dev $if_name 145 146 ip link set dev $if_name down 147 vrf_destroy $vrf_name 148} 149 150h1_create() 151{ 152 hx_create "vrf-h1" $h1 2001:db8:1::1 2001:db8:1::3 153} 154 155h1_destroy() 156{ 157 hx_destroy "vrf-h1" $h1 2001:db8:1::1 2001:db8:1::3 158} 159 160h2_create() 161{ 162 hx_create "vrf-h2" $h2 2001:db8:2::1 2001:db8:2::3 163} 164 165h2_destroy() 166{ 167 hx_destroy "vrf-h2" $h2 2001:db8:2::1 2001:db8:2::3 168} 169 170switch_create() 171{ 172 ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \ 173 mcast_snooping 0 174 # Make sure the bridge uses the MAC address of the local port and not 175 # that of the VxLAN's device. 176 ip link set dev br1 address $(mac_get $swp1) 177 ip link set dev br1 up 178 179 ip link set dev $rp1 up 180 ip address add dev $rp1 2001:db8:4::1/64 181 ip route add 2001:db8:3::2/128 nexthop via 2001:db8:4::2 182 183 ip link add name vx10 type vxlan id 1010 \ 184 local 2001:db8:3::1 remote 2001:db8:3::2 dstport 4789 \ 185 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100 186 ip link set dev vx10 up 187 188 ip link set dev vx10 master br1 189 bridge vlan add vid 10 dev vx10 pvid untagged 190 191 ip link add name vx20 type vxlan id 1020 \ 192 local 2001:db8:3::1 remote 2001:db8:3::2 dstport 4789 \ 193 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100 194 ip link set dev vx20 up 195 196 ip link set dev vx20 master br1 197 bridge vlan add vid 20 dev vx20 pvid untagged 198 199 ip link set dev $swp1 master br1 200 ip link set dev $swp1 up 201 202 ip link set dev $swp2 master br1 203 ip link set dev $swp2 up 204 205 ip link add name vx4001 type vxlan id 104001 \ 206 local 2001:db8:3::1 dstport 4789 \ 207 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100 208 ip link set dev vx4001 up 209 210 ip link set dev vx4001 master br1 211 bridge vlan add vid 4001 dev vx4001 pvid untagged 212 213 ip address add 2001:db8:3::1/128 dev lo 214 215 # Create SVIs 216 vrf_create "vrf-green" 217 ip link set dev vrf-green up 218 219 ip link add link br1 name vlan10 up master vrf-green type vlan id 10 220 ip address add 2001:db8:1::2/64 dev vlan10 221 ip link add link vlan10 name vlan10-v up master vrf-green \ 222 address 00:00:5e:00:01:01 type macvlan mode private 223 ip address add 2001:db8:1::3/64 dev vlan10-v 224 225 ip link add link br1 name vlan20 up master vrf-green type vlan id 20 226 ip address add 2001:db8:2::2/64 dev vlan20 227 ip link add link vlan20 name vlan20-v up master vrf-green \ 228 address 00:00:5e:00:01:01 type macvlan mode private 229 ip address add 2001:db8:2::3/64 dev vlan20-v 230 231 ip link add link br1 name vlan4001 up master vrf-green \ 232 type vlan id 4001 233 234 bridge vlan add vid 10 dev br1 self 235 bridge vlan add vid 20 dev br1 self 236 bridge vlan add vid 4001 dev br1 self 237 238 bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10 239 bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20 240 241 bridge vlan add vid 10 dev $swp1 pvid untagged 242 bridge vlan add vid 20 dev $swp2 pvid untagged 243} 244 245switch_destroy() 246{ 247 bridge vlan del vid 20 dev br1 self 248 bridge vlan del vid 10 dev br1 self 249 250 bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 20 251 bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 10 252 253 bridge vlan del vid 4001 dev br1 self 254 ip link del dev vlan4001 255 256 ip link del dev vlan20 257 258 ip link del dev vlan10 259 260 vrf_destroy "vrf-green" 261 262 ip address del 2001:db8:3::1/128 dev lo 263 264 bridge vlan del vid 20 dev $swp2 265 ip link set dev $swp2 down 266 ip link set dev $swp2 nomaster 267 268 bridge vlan del vid 10 dev $swp1 269 ip link set dev $swp1 down 270 ip link set dev $swp1 nomaster 271 272 bridge vlan del vid 4001 dev vx4001 273 ip link set dev vx4001 nomaster 274 275 ip link set dev vx4001 down 276 ip link del dev vx4001 277 278 bridge vlan del vid 20 dev vx20 279 ip link set dev vx20 nomaster 280 281 ip link set dev vx20 down 282 ip link del dev vx20 283 284 bridge vlan del vid 10 dev vx10 285 ip link set dev vx10 nomaster 286 287 ip link set dev vx10 down 288 ip link del dev vx10 289 290 ip route del 2001:db8:3::2 nexthop via 2001:db8:4::2 291 ip address del dev $rp1 2001:db8:4::1/64 292 ip link set dev $rp1 down 293 294 ip link set dev br1 down 295 ip link del dev br1 296} 297 298spine_create() 299{ 300 vrf_create "vrf-spine" 301 ip link set dev $rp2 master vrf-spine 302 ip link set dev v1 master vrf-spine 303 ip link set dev vrf-spine up 304 ip link set dev $rp2 up 305 ip link set dev v1 up 306 307 ip address add 2001:db8:4::2/64 dev $rp2 308 ip address add 2001:db8:5::2/64 dev v1 309 310 ip route add 2001:db8:3::1/128 vrf vrf-spine nexthop via \ 311 2001:db8:4::1 312 ip route add 2001:db8:3::2/128 vrf vrf-spine nexthop via \ 313 2001:db8:5::1 314} 315 316spine_destroy() 317{ 318 ip route del 2001:db8:3::2/128 vrf vrf-spine nexthop via \ 319 2001:db8:5::1 320 ip route del 2001:db8:3::1/128 vrf vrf-spine nexthop via \ 321 2001:db8:4::1 322 323 ip address del 2001:db8:5::2/64 dev v1 324 ip address del 2001:db8:4::2/64 dev $rp2 325 326 ip link set dev v1 down 327 ip link set dev $rp2 down 328 vrf_destroy "vrf-spine" 329} 330 331ns_h1_create() 332{ 333 hx_create "vrf-h1" w2 2001:db8:1::4 2001:db8:1::3 334} 335export -f ns_h1_create 336 337ns_h2_create() 338{ 339 hx_create "vrf-h2" w4 2001:db8:2::4 2001:db8:2::3 340} 341export -f ns_h2_create 342 343ns_switch_create() 344{ 345 ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \ 346 mcast_snooping 0 347 ip link set dev br1 up 348 349 ip link set dev v2 up 350 ip address add dev v2 2001:db8:5::1/64 351 ip route add 2001:db8:3::1 nexthop via 2001:db8:5::2 352 353 ip link add name vx10 type vxlan id 1010 \ 354 local 2001:db8:3::2 remote 2001:db8:3::1 dstport 4789 \ 355 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100 356 ip link set dev vx10 up 357 358 ip link set dev vx10 master br1 359 bridge vlan add vid 10 dev vx10 pvid untagged 360 361 ip link add name vx20 type vxlan id 1020 \ 362 local 2001:db8:3::2 remote 2001:db8:3::1 dstport 4789 \ 363 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100 364 ip link set dev vx20 up 365 366 ip link set dev vx20 master br1 367 bridge vlan add vid 20 dev vx20 pvid untagged 368 369 ip link add name vx4001 type vxlan id 104001 \ 370 local 2001:db8:3::2 dstport 4789 \ 371 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100 372 ip link set dev vx4001 up 373 374 ip link set dev vx4001 master br1 375 bridge vlan add vid 4001 dev vx4001 pvid untagged 376 377 ip link set dev w1 master br1 378 ip link set dev w1 up 379 bridge vlan add vid 10 dev w1 pvid untagged 380 381 ip link set dev w3 master br1 382 ip link set dev w3 up 383 bridge vlan add vid 20 dev w3 pvid untagged 384 385 ip address add 2001:db8:3::2/128 dev lo 386 387 # Create SVIs 388 vrf_create "vrf-green" 389 ip link set dev vrf-green up 390 391 ip link add link br1 name vlan10 up master vrf-green type vlan id 10 392 ip address add 2001:db8:1::3/64 dev vlan10 393 ip link add link vlan10 name vlan10-v up master vrf-green \ 394 address 00:00:5e:00:01:01 type macvlan mode private 395 ip address add 2001:db8:1::3/64 dev vlan10-v 396 397 ip link add link br1 name vlan20 up master vrf-green type vlan id 20 398 ip address add 2001:db8:2::3/64 dev vlan20 399 ip link add link vlan20 name vlan20-v up master vrf-green \ 400 address 00:00:5e:00:01:01 type macvlan mode private 401 ip address add 2001:db8:2::3/64 dev vlan20-v 402 403 ip link add link br1 name vlan4001 up master vrf-green \ 404 type vlan id 4001 405 406 bridge vlan add vid 10 dev br1 self 407 bridge vlan add vid 20 dev br1 self 408 bridge vlan add vid 4001 dev br1 self 409 410 bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10 411 bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20 412} 413export -f ns_switch_create 414 415ns_init() 416{ 417 ip link add name w1 type veth peer name w2 418 ip link add name w3 type veth peer name w4 419 420 ip link set dev lo up 421 422 ns_h1_create 423 ns_h2_create 424 ns_switch_create 425} 426export -f ns_init 427 428ns1_create() 429{ 430 ip netns add ns1 431 ip link set dev v2 netns ns1 432 in_ns ns1 ns_init 433} 434 435ns1_destroy() 436{ 437 ip netns exec ns1 ip link set dev v2 netns 1 438 ip netns del ns1 439} 440 441__l2_vni_init() 442{ 443 local mac1=$1; shift 444 local mac2=$1; shift 445 local ip1=$1; shift 446 local ip2=$1; shift 447 local dst=$1; shift 448 449 bridge fdb add $mac1 dev vx10 self master extern_learn static \ 450 dst $dst vlan 10 451 bridge fdb add $mac2 dev vx20 self master extern_learn static \ 452 dst $dst vlan 20 453 454 ip neigh add $ip1 lladdr $mac1 nud noarp dev vlan10 \ 455 extern_learn 456 ip neigh add $ip2 lladdr $mac2 nud noarp dev vlan20 \ 457 extern_learn 458} 459export -f __l2_vni_init 460 461l2_vni_init() 462{ 463 local h1_ns_mac=$(in_ns ns1 mac_get w2) 464 local h2_ns_mac=$(in_ns ns1 mac_get w4) 465 local h1_mac=$(mac_get $h1) 466 local h2_mac=$(mac_get $h2) 467 468 __l2_vni_init $h1_ns_mac $h2_ns_mac 2001:db8:1::4 2001:db8:2::4 \ 469 2001:db8:3::2 470 in_ns ns1 __l2_vni_init $h1_mac $h2_mac 2001:db8:1::1 2001:db8:2::1 \ 471 2001:db8:3::1 472} 473 474__l3_vni_init() 475{ 476 local mac=$1; shift 477 local vtep_ip=$1; shift 478 local host1_ip=$1; shift 479 local host2_ip=$1; shift 480 481 bridge fdb add $mac dev vx4001 self master extern_learn static \ 482 dst $vtep_ip vlan 4001 483 484 ip neigh add $vtep_ip lladdr $mac nud noarp dev vlan4001 extern_learn 485 486 ip route add $host1_ip/128 vrf vrf-green nexthop via $vtep_ip \ 487 dev vlan4001 onlink 488 ip route add $host2_ip/128 vrf vrf-green nexthop via $vtep_ip \ 489 dev vlan4001 onlink 490} 491export -f __l3_vni_init 492 493l3_vni_init() 494{ 495 local vlan4001_ns_mac=$(in_ns ns1 mac_get vlan4001) 496 local vlan4001_mac=$(mac_get vlan4001) 497 498 __l3_vni_init $vlan4001_ns_mac 2001:db8:3::2 2001:db8:1::4 \ 499 2001:db8:2::4 500 in_ns ns1 __l3_vni_init $vlan4001_mac 2001:db8:3::1 2001:db8:1::1 \ 501 2001:db8:2::1 502} 503 504setup_prepare() 505{ 506 h1=${NETIFS[p1]} 507 swp1=${NETIFS[p2]} 508 509 swp2=${NETIFS[p3]} 510 h2=${NETIFS[p4]} 511 512 rp1=${NETIFS[p5]} 513 rp2=${NETIFS[p6]} 514 515 vrf_prepare 516 forwarding_enable 517 518 h1_create 519 h2_create 520 switch_create 521 522 ip link add name v1 type veth peer name v2 523 spine_create 524 ns1_create 525 in_ns ns1 forwarding_enable 526 527 l2_vni_init 528 l3_vni_init 529} 530 531cleanup() 532{ 533 pre_cleanup 534 535 ns1_destroy 536 spine_destroy 537 ip link del dev v1 538 539 switch_destroy 540 h2_destroy 541 h1_destroy 542 543 forwarding_restore 544 vrf_cleanup 545} 546 547ping_ipv6() 548{ 549 ping6_test $h1 2001:db8:2::1 ": local->local vid 10->vid 20" 550 ping6_test $h1 2001:db8:1::4 ": local->remote vid 10->vid 10" 551 ping6_test $h2 2001:db8:2::4 ": local->remote vid 20->vid 20" 552 ping6_test $h1 2001:db8:2::4 ": local->remote vid 10->vid 20" 553 ping6_test $h2 2001:db8:1::4 ": local->remote vid 20->vid 10" 554} 555 556trap cleanup EXIT 557 558setup_prepare 559setup_wait 560 561tests_run 562 563exit $EXIT_STATUS 564