505 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4# +--------------------------------+ +-----------------------------+5# | vrf-h1 | | vrf-h2 |6# | + $h1 | | + $h2 |7# | | 2001:db8:1::1/64 | | | 2001:db8:2::1/64 |8# | | default via 2001:db8:1::3 | | | default via 2001:db8:2::3 |9# +----|---------------------------+ +-|---------------------------+10# | |11# +----|------------------------------------------|---------------------------+12# | SW | | |13# | +--|------------------------------------------|-------------------------+ |14# | | + $swp1 br1 + $swp2 | |15# | | vid 10 pvid untagged vid 20 pvid untagged | |16# | | | |17# | | + vx10 + vx20 | |18# | | local 2001:db8:3::1 local 2001:db8:3::1 | |19# | | remote 2001:db8:3::2 remote 2001:db8:3::2 | |20# | | id 1000 id 2000 | |21# | | dstport 4789 dstport 4789 | |22# | | vid 10 pvid untagged vid 20 pvid untagged | |23# | | | |24# | +-----------------------------------+-----------------------------------+ |25# | | |26# | +-----------------------------------|-----------------------------------+ |27# | | | | |28# | | +--------------------------------+--------------------------------+ | |29# | | | | | |30# | | + vlan10 vlan20 + | |31# | | | 2001:db8:1::2/64 2001:db8:2::2/64 | | |32# | | | | | |33# | | + vlan10-v (macvlan) vlan20-v (macvlan) + | |34# | | 2001:db8:1::3/64 2001:db8:2::3/64 | |35# | | 00:00:5e:00:01:01 00:00:5e:00:01:01 | |36# | | vrf-green | |37# | +-----------------------------------------------------------------------+ |38# | |39# | + $rp1 +lo |40# | | 2001:db8:4::1/64 2001:db8:3::1/128 |41# +----|----------------------------------------------------------------------+42# |43# +----|--------------------------------------------------------+44# | | vrf-spine |45# | + $rp2 |46# | 2001:db8:4::2/64 |47# | | (maybe) HW48# =============================================================================49# | | (likely) SW50# | |51# | + v1 (veth) |52# | | 2001:db8:5::2/64 |53# +----|--------------------------------------------------------+54# |55# +----|----------------------------------------------------------------------+56# | + v2 (veth) +lo NS1 (netns) |57# | 2001:db8:5::1/64 2001:db8:3::2/128 |58# | |59# | +-----------------------------------------------------------------------+ |60# | | vrf-green | |61# | | + vlan10-v (macvlan) vlan20-v (macvlan) + | |62# | | | 2001:db8:1::3/64 2001:db8:2::3/64 | | |63# | | | 00:00:5e:00:01:01 00:00:5e:00:01:01 | | |64# | | | | | |65# | | + vlan10 vlan20 + | |66# | | | 2001:db8:1::3/64 2001:db8:2::3/64 | | |67# | | | | | |68# | | +--------------------------------+--------------------------------+ | |69# | | | | |70# | +-----------------------------------|-----------------------------------+ |71# | | |72# | +-----------------------------------+-----------------------------------+ |73# | | | |74# | | + vx10 + vx20 | |75# | | local 2001:db8:3::2 local 2001:db8:3::2 | |76# | | remote 2001:db8:3::1 remote 2001:db8:3::1 | |77# | | id 1000 id 2000 | |78# | | dstport 4789 dstport 4789 | |79# | | vid 10 pvid untagged vid 20 pvid untagged | |80# | | | |81# | | + w1 (veth) + w3 (veth) | |82# | | | vid 10 pvid untagged br1 | vid 20 pvid untagged | |83# | +--|------------------------------------------|-------------------------+ |84# | | | |85# | | | |86# | +--|----------------------+ +--|-------------------------+ |87# | | | vrf-h1 | | | vrf-h2 | |88# | | + w2 (veth) | | + w4 (veth) | |89# | | 2001:db8:1::4/64 | | 2001:db8:2::4/64 | |90# | | default via | | default via | |91# | | 2001:db8:1::3/64 | | 2001:db8:2::3/64 | |92# | +-------------------------+ +----------------------------+ |93# +---------------------------------------------------------------------------+94 95ALL_TESTS="96 ping_ipv697 arp_decap98"99NUM_NETIFS=6100source lib.sh101 102require_command $ARPING103 104hx_create()105{106 local vrf_name=$1; shift107 local if_name=$1; shift108 local ip_addr=$1; shift109 local gw_ip=$1; shift110 111 vrf_create $vrf_name112 ip link set dev $if_name master $vrf_name113 ip link set dev $vrf_name up114 ip link set dev $if_name up115 116 ip address add $ip_addr/64 dev $if_name117 ip neigh replace $gw_ip lladdr 00:00:5e:00:01:01 nud permanent \118 dev $if_name119 ip route add default vrf $vrf_name nexthop via $gw_ip120}121export -f hx_create122 123hx_destroy()124{125 local vrf_name=$1; shift126 local if_name=$1; shift127 local ip_addr=$1; shift128 local gw_ip=$1; shift129 130 ip route del default vrf $vrf_name nexthop via $gw_ip131 ip neigh del $gw_ip dev $if_name132 ip address del $ip_addr/64 dev $if_name133 134 ip link set dev $if_name down135 vrf_destroy $vrf_name136}137 138h1_create()139{140 hx_create "vrf-h1" $h1 2001:db8:1::1 2001:db8:1::3141}142 143h1_destroy()144{145 hx_destroy "vrf-h1" $h1 2001:db8:1::1 2001:db8:1::3146}147 148h2_create()149{150 hx_create "vrf-h2" $h2 2001:db8:2::1 2001:db8:2::3151}152 153h2_destroy()154{155 hx_destroy "vrf-h2" $h2 2001:db8:2::1 2001:db8:2::3156}157 158switch_create()159{160 ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \161 mcast_snooping 0162 # Make sure the bridge uses the MAC address of the local port and not163 # that of the VxLAN's device.164 ip link set dev br1 address $(mac_get $swp1)165 ip link set dev br1 up166 167 ip link set dev $rp1 up168 ip address add dev $rp1 2001:db8:4::1/64169 ip route add 2001:db8:3::2/128 nexthop via 2001:db8:4::2170 171 ip link add name vx10 type vxlan id 1000 \172 local 2001:db8:3::1 remote 2001:db8:3::2 dstport 4789 \173 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100174 ip link set dev vx10 up175 176 ip link set dev vx10 master br1177 bridge vlan add vid 10 dev vx10 pvid untagged178 179 ip link add name vx20 type vxlan id 2000 \180 local 2001:db8:3::1 remote 2001:db8:3::2 dstport 4789 \181 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100182 ip link set dev vx20 up183 184 ip link set dev vx20 master br1185 bridge vlan add vid 20 dev vx20 pvid untagged186 187 ip link set dev $swp1 master br1188 ip link set dev $swp1 up189 bridge vlan add vid 10 dev $swp1 pvid untagged190 191 ip link set dev $swp2 master br1192 ip link set dev $swp2 up193 bridge vlan add vid 20 dev $swp2 pvid untagged194 195 ip address add 2001:db8:3::1/128 dev lo196 197 # Create SVIs198 vrf_create "vrf-green"199 ip link set dev vrf-green up200 201 ip link add link br1 name vlan10 up master vrf-green type vlan id 10202 ip address add 2001:db8:1::2/64 dev vlan10203 ip link add link vlan10 name vlan10-v up master vrf-green \204 address 00:00:5e:00:01:01 type macvlan mode private205 ip address add 2001:db8:1::3/64 dev vlan10-v206 207 ip link add link br1 name vlan20 up master vrf-green type vlan id 20208 ip address add 2001:db8:2::2/64 dev vlan20209 ip link add link vlan20 name vlan20-v up master vrf-green \210 address 00:00:5e:00:01:01 type macvlan mode private211 ip address add 2001:db8:2::3/64 dev vlan20-v212 213 bridge vlan add vid 10 dev br1 self214 bridge vlan add vid 20 dev br1 self215 216 bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10217 bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20218 219}220 221switch_destroy()222{223 bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 20224 bridge fdb del 00:00:5e:00:01:01 dev br1 self local vlan 10225 226 bridge vlan del vid 20 dev br1 self227 bridge vlan del vid 10 dev br1 self228 229 ip link del dev vlan20230 231 ip link del dev vlan10232 233 vrf_destroy "vrf-green"234 235 ip address del 2001:db8:3::1/128 dev lo236 237 bridge vlan del vid 20 dev $swp2238 ip link set dev $swp2 down239 ip link set dev $swp2 nomaster240 241 bridge vlan del vid 10 dev $swp1242 ip link set dev $swp1 down243 ip link set dev $swp1 nomaster244 245 bridge vlan del vid 20 dev vx20246 ip link set dev vx20 nomaster247 248 ip link set dev vx20 down249 ip link del dev vx20250 251 bridge vlan del vid 10 dev vx10252 ip link set dev vx10 nomaster253 254 ip link set dev vx10 down255 ip link del dev vx10256 257 ip route del 2001:db8:3::2 nexthop via 2001:db8:4::2258 ip address del dev $rp1 2001:db8:4::1/64259 ip link set dev $rp1 down260 261 ip link set dev br1 down262 ip link del dev br1263}264 265spine_create()266{267 vrf_create "vrf-spine"268 ip link set dev $rp2 master vrf-spine269 ip link set dev v1 master vrf-spine270 ip link set dev vrf-spine up271 ip link set dev $rp2 up272 ip link set dev v1 up273 274 ip address add 2001:db8:4::2/64 dev $rp2275 ip address add 2001:db8:5::2/64 dev v1276 277 ip route add 2001:db8:3::1/128 vrf vrf-spine nexthop via \278 2001:db8:4::1279 ip route add 2001:db8:3::2/128 vrf vrf-spine nexthop via \280 2001:db8:5::1281}282 283spine_destroy()284{285 ip route del 2001:db8:3::2/128 vrf vrf-spine nexthop via \286 2001:db8:5::1287 ip route del 2001:db8:3::1/128 vrf vrf-spine nexthop via \288 2001:db8:4::1289 290 ip address del 2001:db8:5::2/64 dev v1291 ip address del 2001:db8:4::2/64 dev $rp2292 293 ip link set dev v1 down294 ip link set dev $rp2 down295 vrf_destroy "vrf-spine"296}297 298ns_h1_create()299{300 hx_create "vrf-h1" w2 2001:db8:1::4 2001:db8:1::3301}302export -f ns_h1_create303 304ns_h2_create()305{306 hx_create "vrf-h2" w4 2001:db8:2::4 2001:db8:2::3307}308export -f ns_h2_create309 310ns_switch_create()311{312 ip link add name br1 type bridge vlan_filtering 1 vlan_default_pvid 0 \313 mcast_snooping 0314 ip link set dev br1 up315 316 ip link set dev v2 up317 ip address add dev v2 2001:db8:5::1/64318 ip route add 2001:db8:3::1 nexthop via 2001:db8:5::2319 320 ip link add name vx10 type vxlan id 1000 \321 local 2001:db8:3::2 remote 2001:db8:3::1 dstport 4789 \322 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100323 ip link set dev vx10 up324 325 ip link set dev vx10 master br1326 bridge vlan add vid 10 dev vx10 pvid untagged327 328 ip link add name vx20 type vxlan id 2000 \329 local 2001:db8:3::2 remote 2001:db8:3::1 dstport 4789 \330 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100331 ip link set dev vx20 up332 333 ip link set dev vx20 master br1334 bridge vlan add vid 20 dev vx20 pvid untagged335 336 ip link set dev w1 master br1337 ip link set dev w1 up338 bridge vlan add vid 10 dev w1 pvid untagged339 340 ip link set dev w3 master br1341 ip link set dev w3 up342 bridge vlan add vid 20 dev w3 pvid untagged343 344 ip address add 2001:db8:3::2/128 dev lo345 346 # Create SVIs347 vrf_create "vrf-green"348 ip link set dev vrf-green up349 350 ip link add link br1 name vlan10 up master vrf-green type vlan id 10351 ip address add 2001:db8:1::3/64 dev vlan10352 ip link add link vlan10 name vlan10-v up master vrf-green \353 address 00:00:5e:00:01:01 type macvlan mode private354 ip address add 2001:db8:1::3/64 dev vlan10-v355 356 ip link add link br1 name vlan20 up master vrf-green type vlan id 20357 ip address add 2001:db8:2::3/64 dev vlan20358 ip link add link vlan20 name vlan20-v up master vrf-green \359 address 00:00:5e:00:01:01 type macvlan mode private360 ip address add 2001:db8:2::3/64 dev vlan20-v361 362 bridge vlan add vid 10 dev br1 self363 bridge vlan add vid 20 dev br1 self364 365 bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 10366 bridge fdb add 00:00:5e:00:01:01 dev br1 self local vlan 20367}368export -f ns_switch_create369 370ns_init()371{372 ip link add name w1 type veth peer name w2373 ip link add name w3 type veth peer name w4374 375 ip link set dev lo up376 377 ns_h1_create378 ns_h2_create379 ns_switch_create380}381export -f ns_init382 383ns1_create()384{385 ip netns add ns1386 ip link set dev v2 netns ns1387 in_ns ns1 ns_init388}389 390ns1_destroy()391{392 ip netns exec ns1 ip link set dev v2 netns 1393 ip netns del ns1394}395 396macs_populate()397{398 local mac1=$1; shift399 local mac2=$1; shift400 local ip1=$1; shift401 local ip2=$1; shift402 local dst=$1; shift403 404 bridge fdb add $mac1 dev vx10 self master extern_learn static \405 dst $dst vlan 10406 bridge fdb add $mac2 dev vx20 self master extern_learn static \407 dst $dst vlan 20408 409 ip neigh add $ip1 lladdr $mac1 nud noarp dev vlan10 \410 extern_learn411 ip neigh add $ip2 lladdr $mac2 nud noarp dev vlan20 \412 extern_learn413}414export -f macs_populate415 416macs_initialize()417{418 local h1_ns_mac=$(in_ns ns1 mac_get w2)419 local h2_ns_mac=$(in_ns ns1 mac_get w4)420 local h1_mac=$(mac_get $h1)421 local h2_mac=$(mac_get $h2)422 423 macs_populate $h1_ns_mac $h2_ns_mac 2001:db8:1::4 2001:db8:2::4 \424 2001:db8:3::2425 in_ns ns1 macs_populate $h1_mac $h2_mac 2001:db8:1::1 2001:db8:2::1 \426 2001:db8:3::1427}428 429setup_prepare()430{431 h1=${NETIFS[p1]}432 swp1=${NETIFS[p2]}433 434 swp2=${NETIFS[p3]}435 h2=${NETIFS[p4]}436 437 rp1=${NETIFS[p5]}438 rp2=${NETIFS[p6]}439 440 vrf_prepare441 forwarding_enable442 443 h1_create444 h2_create445 switch_create446 447 ip link add name v1 type veth peer name v2448 spine_create449 ns1_create450 in_ns ns1 forwarding_enable451 452 macs_initialize453}454 455cleanup()456{457 pre_cleanup458 459 ns1_destroy460 spine_destroy461 ip link del dev v1462 463 switch_destroy464 h2_destroy465 h1_destroy466 467 forwarding_restore468 vrf_cleanup469}470 471ping_ipv6()472{473 ping6_test $h1 2001:db8:2::1 ": local->local vid 10->vid 20"474 ping6_test $h1 2001:db8:1::4 ": local->remote vid 10->vid 10"475 ping6_test $h2 2001:db8:2::4 ": local->remote vid 20->vid 20"476 ping6_test $h1 2001:db8:2::4 ": local->remote vid 10->vid 20"477 ping6_test $h2 2001:db8:1::4 ": local->remote vid 20->vid 10"478}479 480arp_decap()481{482 # Repeat the ping tests, but without populating the neighbours. This483 # makes sure we correctly decapsulate ARP packets484 log_info "deleting neighbours from vlan interfaces"485 486 ip neigh del 2001:db8:1::4 dev vlan10487 ip neigh del 2001:db8:2::4 dev vlan20488 489 ping_ipv6490 491 ip neigh replace 2001:db8:1::4 lladdr $(in_ns ns1 mac_get w2) \492 nud noarp dev vlan10 extern_learn493 ip neigh replace 2001:db8:2::4 lladdr $(in_ns ns1 mac_get w4) \494 nud noarp dev vlan20 extern_learn495}496 497trap cleanup EXIT498 499setup_prepare500setup_wait501 502tests_run503 504exit $EXIT_STATUS505