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