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