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# +---------------------------+ 144 145h1_create() 146{ 147 simple_if_init $h1 192.0.2.1/28 2001:db8:1::1/64 148 ip route add vrf v$h1 192.0.2.16/28 via 192.0.2.2 149} 150 151h1_destroy() 152{ 153 ip route del vrf v$h1 192.0.2.16/28 via 192.0.2.2 154 simple_if_fini $h1 192.0.2.1/28 155} 156 157h2_create() 158{ 159 simple_if_init $h2 192.0.2.18/28 160 ip route add vrf v$h2 192.0.2.0/28 via 192.0.2.17 161} 162 163h2_destroy() 164{ 165 ip route del vrf v$h2 192.0.2.0/28 via 192.0.2.17 166 simple_if_fini $h2 192.0.2.18/28 167} 168 169sw1_flat_create() 170{ 171 local type=$1; shift 172 local ol1=$1; shift 173 local ul1=$1; shift 174 175 ip link set dev $ol1 up 176 __addr_add_del $ol1 add "192.0.2.2/28" 177 178 ip link set dev $ul1 up 179 vlan_create $ul1 111 "" 192.0.2.129/28 180 181 tunnel_create g1a $type 192.0.2.65 192.0.2.66 tos inherit "$@" 182 ip link set dev g1a up 183 __addr_add_del g1a add "192.0.2.65/32" 184 185 ip route add 192.0.2.66/32 via 192.0.2.130 186 187 ip route add 192.0.2.16/28 nexthop dev g1a 188} 189 190sw1_flat_destroy() 191{ 192 local ol1=$1; shift 193 local ul1=$1; shift 194 195 ip route del 192.0.2.16/28 196 197 ip route del 192.0.2.66/32 via 192.0.2.130 198 __simple_if_fini g1a 192.0.2.65/32 199 tunnel_destroy g1a 200 201 vlan_destroy $ul1 111 202 __simple_if_fini $ul1 203 __simple_if_fini $ol1 192.0.2.2/28 204} 205 206sw2_flat_create() 207{ 208 local type=$1; shift 209 local ol2=$1; shift 210 local ul2=$1; shift 211 212 simple_if_init $ol2 192.0.2.17/28 213 __simple_if_init $ul2 v$ol2 214 vlan_create $ul2 111 v$ol2 192.0.2.130/28 215 216 tunnel_create g2a $type 192.0.2.66 192.0.2.65 tos inherit dev v$ol2 \ 217 "$@" 218 __simple_if_init g2a v$ol2 192.0.2.66/32 219 220 ip route add vrf v$ol2 192.0.2.65/32 via 192.0.2.129 221 ip route add vrf v$ol2 192.0.2.0/28 nexthop dev g2a 222} 223 224sw2_flat_destroy() 225{ 226 local ol2=$1; shift 227 local ul2=$1; shift 228 229 ip route del vrf v$ol2 192.0.2.0/28 230 231 ip route del vrf v$ol2 192.0.2.65/32 via 192.0.2.129 232 __simple_if_fini g2a 192.0.2.66/32 233 tunnel_destroy g2a 234 235 vlan_destroy $ul2 111 236 __simple_if_fini $ul2 237 simple_if_fini $ol2 192.0.2.17/28 238} 239 240sw1_hierarchical_create() 241{ 242 local type=$1; shift 243 local ol1=$1; shift 244 local ul1=$1; shift 245 246 simple_if_init $ol1 192.0.2.2/28 247 simple_if_init $ul1 248 ip link add name dummy1 type dummy 249 __simple_if_init dummy1 v$ul1 192.0.2.65/32 250 251 vlan_create $ul1 111 v$ul1 192.0.2.129/28 252 tunnel_create g1a $type 192.0.2.65 192.0.2.66 tos inherit dev dummy1 \ 253 "$@" 254 ip link set dev g1a master v$ol1 255 256 ip route add vrf v$ul1 192.0.2.66/32 via 192.0.2.130 257 ip route add vrf v$ol1 192.0.2.16/28 nexthop dev g1a 258} 259 260sw1_hierarchical_destroy() 261{ 262 local ol1=$1; shift 263 local ul1=$1; shift 264 265 ip route del vrf v$ol1 192.0.2.16/28 266 ip route del vrf v$ul1 192.0.2.66/32 267 268 tunnel_destroy g1a 269 vlan_destroy $ul1 111 270 271 __simple_if_fini dummy1 192.0.2.65/32 272 ip link del dev dummy1 273 274 simple_if_fini $ul1 275 simple_if_fini $ol1 192.0.2.2/28 276} 277 278sw2_hierarchical_create() 279{ 280 local type=$1; shift 281 local ol2=$1; shift 282 local ul2=$1; shift 283 284 simple_if_init $ol2 192.0.2.17/28 285 simple_if_init $ul2 286 287 ip link add name dummy2 type dummy 288 __simple_if_init dummy2 v$ul2 192.0.2.66/32 289 290 vlan_create $ul2 111 v$ul2 192.0.2.130/28 291 tunnel_create g2a $type 192.0.2.66 192.0.2.65 tos inherit dev dummy2 \ 292 "$@" 293 ip link set dev g2a master v$ol2 294 295 ip route add vrf v$ul2 192.0.2.65/32 via 192.0.2.129 296 ip route add vrf v$ol2 192.0.2.0/28 nexthop dev g2a 297} 298 299sw2_hierarchical_destroy() 300{ 301 local ol2=$1; shift 302 local ul2=$1; shift 303 304 ip route del vrf v$ol2 192.0.2.0/28 305 ip route del vrf v$ul2 192.0.2.65/32 306 307 tunnel_destroy g2a 308 vlan_destroy $ul2 111 309 310 __simple_if_fini dummy2 192.0.2.66/32 311 ip link del dev dummy2 312 313 simple_if_fini $ul2 314 simple_if_fini $ol2 192.0.2.17/28 315} 316 317topo_mtu_change() 318{ 319 local mtu=$1 320 321 ip link set mtu $mtu dev $h1 322 ip link set mtu $mtu dev $ol1 323 ip link set mtu $mtu dev g1a 324 ip link set mtu $mtu dev $ul1 325 ip link set mtu $mtu dev $ul1.111 326 ip link set mtu $mtu dev $h2 327 ip link set mtu $mtu dev $ol2 328 ip link set mtu $mtu dev g2a 329 ip link set mtu $mtu dev $ul2 330 ip link set mtu $mtu dev $ul2.111 331} 332 333test_mtu_change() 334{ 335 local encap=$1; shift 336 337 RET=0 338 339 ping_do $h1 192.0.2.18 "-s 1800 -w 3" 340 check_fail $? "ping $encap should not pass with size 1800" 341 342 RET=0 343 344 topo_mtu_change 2000 345 ping_do $h1 192.0.2.18 "-s 1800 -w 3" 346 check_err $? 347 log_test "ping $encap packet size 1800 after MTU change" 348} 349