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