1*fed926d4SNir Dotan#!/bin/bash 2*fed926d4SNir Dotan# SPDX-License-Identifier: GPL-2.0 3*fed926d4SNir Dotan 4*fed926d4SNir Dotan# Handles creation and destruction of IP-in-IP or GRE tunnels over the given 5*fed926d4SNir Dotan# topology. Supports both flat and hierarchical models. 6*fed926d4SNir Dotan# 7*fed926d4SNir Dotan# Flat Model: 8*fed926d4SNir Dotan# Overlay and underlay share the same VRF. 9*fed926d4SNir Dotan# SW1 uses default VRF so tunnel has no bound dev. 10*fed926d4SNir Dotan# SW2 uses non-default VRF tunnel has a bound dev. 11*fed926d4SNir Dotan# +-------------------------+ 12*fed926d4SNir Dotan# | H1 | 13*fed926d4SNir Dotan# | $h1 + | 14*fed926d4SNir Dotan# | 192.0.2.1/28 | | 15*fed926d4SNir Dotan# +-------------------|-----+ 16*fed926d4SNir Dotan# | 17*fed926d4SNir Dotan# +-------------------|-----+ 18*fed926d4SNir Dotan# | SW1 | | 19*fed926d4SNir Dotan# | $ol1 + | 20*fed926d4SNir Dotan# | 192.0.2.2/28 | 21*fed926d4SNir Dotan# | | 22*fed926d4SNir Dotan# | + g1a (gre) | 23*fed926d4SNir Dotan# | loc=192.0.2.65 | 24*fed926d4SNir Dotan# | rem=192.0.2.66 --. | 25*fed926d4SNir Dotan# | tos=inherit | | 26*fed926d4SNir Dotan# | .------------------' | 27*fed926d4SNir Dotan# | | | 28*fed926d4SNir Dotan# | v | 29*fed926d4SNir Dotan# | + $ul1.111 (vlan) | 30*fed926d4SNir Dotan# | | 192.0.2.129/28 | 31*fed926d4SNir Dotan# | \ | 32*fed926d4SNir Dotan# | \_______ | 33*fed926d4SNir Dotan# | | | 34*fed926d4SNir Dotan# |VRF default + $ul1 | 35*fed926d4SNir Dotan# +------------|------------+ 36*fed926d4SNir Dotan# | 37*fed926d4SNir Dotan# +------------|------------+ 38*fed926d4SNir Dotan# | SW2 + $ul2 | 39*fed926d4SNir Dotan# | _______| | 40*fed926d4SNir Dotan# | / | 41*fed926d4SNir Dotan# | / | 42*fed926d4SNir Dotan# | + $ul2.111 (vlan) | 43*fed926d4SNir Dotan# | ^ 192.0.2.130/28 | 44*fed926d4SNir Dotan# | | | 45*fed926d4SNir Dotan# | | | 46*fed926d4SNir Dotan# | '------------------. | 47*fed926d4SNir Dotan# | + g2a (gre) | | 48*fed926d4SNir Dotan# | loc=192.0.2.66 | | 49*fed926d4SNir Dotan# | rem=192.0.2.65 --' | 50*fed926d4SNir Dotan# | tos=inherit | 51*fed926d4SNir Dotan# | | 52*fed926d4SNir Dotan# | $ol2 + | 53*fed926d4SNir Dotan# | 192.0.2.17/28 | | 54*fed926d4SNir Dotan# | VRF v$ol2 | | 55*fed926d4SNir Dotan# +-------------------|-----+ 56*fed926d4SNir Dotan# | 57*fed926d4SNir Dotan# +-------------------|-----+ 58*fed926d4SNir Dotan# | H2 | | 59*fed926d4SNir Dotan# | $h2 + | 60*fed926d4SNir Dotan# | 192.0.2.18/28 | 61*fed926d4SNir Dotan# +-------------------------+ 62*fed926d4SNir Dotan# 63*fed926d4SNir Dotan# Hierarchical model: 64*fed926d4SNir Dotan# The tunnel is bound to a device in a different VRF 65*fed926d4SNir Dotan# 66*fed926d4SNir Dotan# +---------------------------+ 67*fed926d4SNir Dotan# | H1 | 68*fed926d4SNir Dotan# | $h1 + | 69*fed926d4SNir Dotan# | 192.0.2.1/28 | | 70*fed926d4SNir Dotan# +-------------------|-------+ 71*fed926d4SNir Dotan# | 72*fed926d4SNir Dotan# +-------------------|-------+ 73*fed926d4SNir Dotan# | SW1 | | 74*fed926d4SNir Dotan# | +-----------------|-----+ | 75*fed926d4SNir Dotan# | | $ol1 + | | 76*fed926d4SNir Dotan# | | 192.0.2.2/28 | | 77*fed926d4SNir Dotan# | | | | 78*fed926d4SNir Dotan# | | + g1a (gre) | | 79*fed926d4SNir Dotan# | | rem=192.0.2.66 | | 80*fed926d4SNir Dotan# | | tos=inherit | | 81*fed926d4SNir Dotan# | | loc=192.0.2.65 | | 82*fed926d4SNir Dotan# | | ^ | | 83*fed926d4SNir Dotan# | | VRF v$ol1 | | | 84*fed926d4SNir Dotan# | +-----------|-----------+ | 85*fed926d4SNir Dotan# | | | 86*fed926d4SNir Dotan# | +-----------|-----------+ | 87*fed926d4SNir Dotan# | | VRF v$ul1 | | | 88*fed926d4SNir Dotan# | | | | | 89*fed926d4SNir Dotan# | | | | | 90*fed926d4SNir Dotan# | | v | | 91*fed926d4SNir Dotan# | | dummy1 + | | 92*fed926d4SNir Dotan# | | 192.0.2.65 | | 93*fed926d4SNir Dotan# | | .-------' | | 94*fed926d4SNir Dotan# | | | | | 95*fed926d4SNir Dotan# | | v | | 96*fed926d4SNir Dotan# | | + $ul1.111 (vlan) | | 97*fed926d4SNir Dotan# | | | 192.0.2.129/28 | | 98*fed926d4SNir Dotan# | | \ | | 99*fed926d4SNir Dotan# | | \_____ | | 100*fed926d4SNir Dotan# | | | | | 101*fed926d4SNir Dotan# | | + $ul1 | | 102*fed926d4SNir Dotan# | +----------|------------+ | 103*fed926d4SNir Dotan# +------------|--------------+ 104*fed926d4SNir Dotan# | 105*fed926d4SNir Dotan# +------------|--------------+ 106*fed926d4SNir Dotan# | SW2 | | 107*fed926d4SNir Dotan# | +----------|------------+ | 108*fed926d4SNir Dotan# | | + $ul2 | | 109*fed926d4SNir Dotan# | | _____| | | 110*fed926d4SNir Dotan# | | / | | 111*fed926d4SNir Dotan# | | / | | 112*fed926d4SNir Dotan# | | | $ul2.111 (vlan) | | 113*fed926d4SNir Dotan# | | + 192.0.2.130/28 | | 114*fed926d4SNir Dotan# | | ^ | | 115*fed926d4SNir Dotan# | | | | | 116*fed926d4SNir Dotan# | | '-------. | | 117*fed926d4SNir Dotan# | | dummy2 + | | 118*fed926d4SNir Dotan# | | 192.0.2.66 | | 119*fed926d4SNir Dotan# | | ^ | | 120*fed926d4SNir Dotan# | | | | | 121*fed926d4SNir Dotan# | | | | | 122*fed926d4SNir Dotan# | | VRF v$ul2 | | | 123*fed926d4SNir Dotan# | +-----------|-----------+ | 124*fed926d4SNir Dotan# | | | 125*fed926d4SNir Dotan# | +-----------|-----------+ | 126*fed926d4SNir Dotan# | | VRF v$ol2 | | | 127*fed926d4SNir Dotan# | | | | | 128*fed926d4SNir Dotan# | | v | | 129*fed926d4SNir Dotan# | | g2a (gre)+ | | 130*fed926d4SNir Dotan# | | loc=192.0.2.66 | | 131*fed926d4SNir Dotan# | | rem=192.0.2.65 | | 132*fed926d4SNir Dotan# | | tos=inherit | | 133*fed926d4SNir Dotan# | | | | 134*fed926d4SNir Dotan# | | $ol2 + | | 135*fed926d4SNir Dotan# | | 192.0.2.17/28 | | | 136*fed926d4SNir Dotan# | +-----------------|-----+ | 137*fed926d4SNir Dotan# +-------------------|-------+ 138*fed926d4SNir Dotan# | 139*fed926d4SNir Dotan# +-------------------|-------+ 140*fed926d4SNir Dotan# | H2 | | 141*fed926d4SNir Dotan# | $h2 + | 142*fed926d4SNir Dotan# | 192.0.2.18/28 | 143*fed926d4SNir Dotan# +---------------------------+ 144*fed926d4SNir Dotansource lib.sh 145*fed926d4SNir Dotan 146*fed926d4SNir Dotanh1_create() 147*fed926d4SNir Dotan{ 148*fed926d4SNir Dotan simple_if_init $h1 192.0.2.1/28 2001:db8:1::1/64 149*fed926d4SNir Dotan ip route add vrf v$h1 192.0.2.16/28 via 192.0.2.2 150*fed926d4SNir Dotan} 151*fed926d4SNir Dotan 152*fed926d4SNir Dotanh1_destroy() 153*fed926d4SNir Dotan{ 154*fed926d4SNir Dotan ip route del vrf v$h1 192.0.2.16/28 via 192.0.2.2 155*fed926d4SNir Dotan simple_if_fini $h1 192.0.2.1/28 156*fed926d4SNir Dotan} 157*fed926d4SNir Dotan 158*fed926d4SNir Dotanh2_create() 159*fed926d4SNir Dotan{ 160*fed926d4SNir Dotan simple_if_init $h2 192.0.2.18/28 161*fed926d4SNir Dotan ip route add vrf v$h2 192.0.2.0/28 via 192.0.2.17 162*fed926d4SNir Dotan} 163*fed926d4SNir Dotan 164*fed926d4SNir Dotanh2_destroy() 165*fed926d4SNir Dotan{ 166*fed926d4SNir Dotan ip route del vrf v$h2 192.0.2.0/28 via 192.0.2.17 167*fed926d4SNir Dotan simple_if_fini $h2 192.0.2.18/28 168*fed926d4SNir Dotan} 169*fed926d4SNir Dotan 170*fed926d4SNir Dotansw1_flat_create() 171*fed926d4SNir Dotan{ 172*fed926d4SNir Dotan local type=$1; shift 173*fed926d4SNir Dotan local ol1=$1; shift 174*fed926d4SNir Dotan local ul1=$1; shift 175*fed926d4SNir Dotan 176*fed926d4SNir Dotan ip link set dev $ol1 up 177*fed926d4SNir Dotan __addr_add_del $ol1 add "192.0.2.2/28" 178*fed926d4SNir Dotan 179*fed926d4SNir Dotan ip link set dev $ul1 up 180*fed926d4SNir Dotan vlan_create $ul1 111 "" 192.0.2.129/28 181*fed926d4SNir Dotan 182*fed926d4SNir Dotan tunnel_create g1a $type 192.0.2.65 192.0.2.66 tos inherit "$@" 183*fed926d4SNir Dotan ip link set dev g1a up 184*fed926d4SNir Dotan __addr_add_del g1a add "192.0.2.65/32" 185*fed926d4SNir Dotan 186*fed926d4SNir Dotan ip route add 192.0.2.66/32 via 192.0.2.130 187*fed926d4SNir Dotan 188*fed926d4SNir Dotan ip route add 192.0.2.16/28 nexthop dev g1a 189*fed926d4SNir Dotan} 190*fed926d4SNir Dotan 191*fed926d4SNir Dotansw1_flat_destroy() 192*fed926d4SNir Dotan{ 193*fed926d4SNir Dotan local ol1=$1; shift 194*fed926d4SNir Dotan local ul1=$1; shift 195*fed926d4SNir Dotan 196*fed926d4SNir Dotan ip route del 192.0.2.16/28 197*fed926d4SNir Dotan 198*fed926d4SNir Dotan ip route del 192.0.2.66/32 via 192.0.2.130 199*fed926d4SNir Dotan __simple_if_fini g1a 192.0.2.65/32 200*fed926d4SNir Dotan tunnel_destroy g1a 201*fed926d4SNir Dotan 202*fed926d4SNir Dotan vlan_destroy $ul1 111 203*fed926d4SNir Dotan __simple_if_fini $ul1 204*fed926d4SNir Dotan __simple_if_fini $ol1 192.0.2.2/28 205*fed926d4SNir Dotan} 206*fed926d4SNir Dotan 207*fed926d4SNir Dotansw2_flat_create() 208*fed926d4SNir Dotan{ 209*fed926d4SNir Dotan local type=$1; shift 210*fed926d4SNir Dotan local ol2=$1; shift 211*fed926d4SNir Dotan local ul2=$1; shift 212*fed926d4SNir Dotan 213*fed926d4SNir Dotan simple_if_init $ol2 192.0.2.17/28 214*fed926d4SNir Dotan __simple_if_init $ul2 v$ol2 215*fed926d4SNir Dotan vlan_create $ul2 111 v$ol2 192.0.2.130/28 216*fed926d4SNir Dotan 217*fed926d4SNir Dotan tunnel_create g2a $type 192.0.2.66 192.0.2.65 tos inherit dev v$ol2 \ 218*fed926d4SNir Dotan "$@" 219*fed926d4SNir Dotan __simple_if_init g2a v$ol2 192.0.2.66/32 220*fed926d4SNir Dotan 221*fed926d4SNir Dotan ip route add vrf v$ol2 192.0.2.65/32 via 192.0.2.129 222*fed926d4SNir Dotan ip route add vrf v$ol2 192.0.2.0/28 nexthop dev g2a 223*fed926d4SNir Dotan} 224*fed926d4SNir Dotan 225*fed926d4SNir Dotansw2_flat_destroy() 226*fed926d4SNir Dotan{ 227*fed926d4SNir Dotan local ol2=$1; shift 228*fed926d4SNir Dotan local ul2=$1; shift 229*fed926d4SNir Dotan 230*fed926d4SNir Dotan ip route del vrf v$ol2 192.0.2.0/28 231*fed926d4SNir Dotan 232*fed926d4SNir Dotan ip route del vrf v$ol2 192.0.2.65/32 via 192.0.2.129 233*fed926d4SNir Dotan __simple_if_fini g2a 192.0.2.66/32 234*fed926d4SNir Dotan tunnel_destroy g2a 235*fed926d4SNir Dotan 236*fed926d4SNir Dotan vlan_destroy $ul2 111 237*fed926d4SNir Dotan __simple_if_fini $ul2 238*fed926d4SNir Dotan simple_if_fini $ol2 192.0.2.17/28 239*fed926d4SNir Dotan} 240*fed926d4SNir Dotan 241*fed926d4SNir Dotansw1_hierarchical_create() 242*fed926d4SNir Dotan{ 243*fed926d4SNir Dotan local type=$1; shift 244*fed926d4SNir Dotan local ol1=$1; shift 245*fed926d4SNir Dotan local ul1=$1; shift 246*fed926d4SNir Dotan 247*fed926d4SNir Dotan simple_if_init $ol1 192.0.2.2/28 248*fed926d4SNir Dotan simple_if_init $ul1 249*fed926d4SNir Dotan ip link add name dummy1 type dummy 250*fed926d4SNir Dotan __simple_if_init dummy1 v$ul1 192.0.2.65/32 251*fed926d4SNir Dotan 252*fed926d4SNir Dotan vlan_create $ul1 111 v$ul1 192.0.2.129/28 253*fed926d4SNir Dotan tunnel_create g1a $type 192.0.2.65 192.0.2.66 tos inherit dev dummy1 \ 254*fed926d4SNir Dotan "$@" 255*fed926d4SNir Dotan ip link set dev g1a master v$ol1 256*fed926d4SNir Dotan 257*fed926d4SNir Dotan ip route add vrf v$ul1 192.0.2.66/32 via 192.0.2.130 258*fed926d4SNir Dotan ip route add vrf v$ol1 192.0.2.16/28 nexthop dev g1a 259*fed926d4SNir Dotan} 260*fed926d4SNir Dotan 261*fed926d4SNir Dotansw1_hierarchical_destroy() 262*fed926d4SNir Dotan{ 263*fed926d4SNir Dotan local ol1=$1; shift 264*fed926d4SNir Dotan local ul1=$1; shift 265*fed926d4SNir Dotan 266*fed926d4SNir Dotan ip route del vrf v$ol1 192.0.2.16/28 267*fed926d4SNir Dotan ip route del vrf v$ul1 192.0.2.66/32 268*fed926d4SNir Dotan 269*fed926d4SNir Dotan tunnel_destroy g1a 270*fed926d4SNir Dotan vlan_destroy $ul1 111 271*fed926d4SNir Dotan 272*fed926d4SNir Dotan __simple_if_fini dummy1 192.0.2.65/32 273*fed926d4SNir Dotan ip link del dev dummy1 274*fed926d4SNir Dotan 275*fed926d4SNir Dotan simple_if_fini $ul1 276*fed926d4SNir Dotan simple_if_fini $ol1 192.0.2.2/28 277*fed926d4SNir Dotan} 278*fed926d4SNir Dotan 279*fed926d4SNir Dotansw2_hierarchical_create() 280*fed926d4SNir Dotan{ 281*fed926d4SNir Dotan local type=$1; shift 282*fed926d4SNir Dotan local ol2=$1; shift 283*fed926d4SNir Dotan local ul2=$1; shift 284*fed926d4SNir Dotan 285*fed926d4SNir Dotan simple_if_init $ol2 192.0.2.17/28 286*fed926d4SNir Dotan simple_if_init $ul2 287*fed926d4SNir Dotan 288*fed926d4SNir Dotan ip link add name dummy2 type dummy 289*fed926d4SNir Dotan __simple_if_init dummy2 v$ul2 192.0.2.66/32 290*fed926d4SNir Dotan 291*fed926d4SNir Dotan vlan_create $ul2 111 v$ul2 192.0.2.130/28 292*fed926d4SNir Dotan tunnel_create g2a $type 192.0.2.66 192.0.2.65 tos inherit dev dummy2 \ 293*fed926d4SNir Dotan "$@" 294*fed926d4SNir Dotan ip link set dev g2a master v$ol2 295*fed926d4SNir Dotan 296*fed926d4SNir Dotan ip route add vrf v$ul2 192.0.2.65/32 via 192.0.2.129 297*fed926d4SNir Dotan ip route add vrf v$ol2 192.0.2.0/28 nexthop dev g2a 298*fed926d4SNir Dotan} 299*fed926d4SNir Dotan 300*fed926d4SNir Dotansw2_hierarchical_destroy() 301*fed926d4SNir Dotan{ 302*fed926d4SNir Dotan local ol2=$1; shift 303*fed926d4SNir Dotan local ul2=$1; shift 304*fed926d4SNir Dotan 305*fed926d4SNir Dotan ip route del vrf v$ol2 192.0.2.0/28 306*fed926d4SNir Dotan ip route del vrf v$ul2 192.0.2.65/32 307*fed926d4SNir Dotan 308*fed926d4SNir Dotan tunnel_destroy g2a 309*fed926d4SNir Dotan vlan_destroy $ul2 111 310*fed926d4SNir Dotan 311*fed926d4SNir Dotan __simple_if_fini dummy2 192.0.2.66/32 312*fed926d4SNir Dotan ip link del dev dummy2 313*fed926d4SNir Dotan 314*fed926d4SNir Dotan simple_if_fini $ul2 315*fed926d4SNir Dotan simple_if_fini $ol2 192.0.2.17/28 316*fed926d4SNir Dotan} 317*fed926d4SNir Dotan 318*fed926d4SNir Dotantopo_mtu_change() 319*fed926d4SNir Dotan{ 320*fed926d4SNir Dotan local mtu=$1 321*fed926d4SNir Dotan 322*fed926d4SNir Dotan ip link set mtu $mtu dev $h1 323*fed926d4SNir Dotan ip link set mtu $mtu dev $ol1 324*fed926d4SNir Dotan ip link set mtu $mtu dev g1a 325*fed926d4SNir Dotan ip link set mtu $mtu dev $ul1 326*fed926d4SNir Dotan ip link set mtu $mtu dev $ul1.111 327*fed926d4SNir Dotan ip link set mtu $mtu dev $h2 328*fed926d4SNir Dotan ip link set mtu $mtu dev $ol2 329*fed926d4SNir Dotan ip link set mtu $mtu dev g2a 330*fed926d4SNir Dotan ip link set mtu $mtu dev $ul2 331*fed926d4SNir Dotan ip link set mtu $mtu dev $ul2.111 332*fed926d4SNir Dotan} 333*fed926d4SNir Dotan 334*fed926d4SNir Dotantest_mtu_change() 335*fed926d4SNir Dotan{ 336*fed926d4SNir Dotan local encap=$1; shift 337*fed926d4SNir Dotan 338*fed926d4SNir Dotan RET=0 339*fed926d4SNir Dotan 340*fed926d4SNir Dotan ping_do $h1 192.0.2.18 "-s 1800 -w 3" 341*fed926d4SNir Dotan check_fail $? "ping $encap should not pass with size 1800" 342*fed926d4SNir Dotan 343*fed926d4SNir Dotan RET=0 344*fed926d4SNir Dotan 345*fed926d4SNir Dotan topo_mtu_change 2000 346*fed926d4SNir Dotan ping_do $h1 192.0.2.18 "-s 1800 -w 3" 347*fed926d4SNir Dotan check_err $? 348*fed926d4SNir Dotan log_test "ping $encap packet size 1800 after MTU change" 349*fed926d4SNir Dotan} 350