mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
349 lines
8.4 KiB
349 lines
8.4 KiB
#!/bin/bash |
|
# SPDX-License-Identifier: GPL-2.0 |
|
|
|
# Handles creation and destruction of IP-in-IP or GRE tunnels over the given |
|
# topology. Supports both flat and hierarchical models. |
|
# |
|
# Flat Model: |
|
# Overlay and underlay share the same VRF. |
|
# SW1 uses default VRF so tunnel has no bound dev. |
|
# SW2 uses non-default VRF tunnel has a bound dev. |
|
# +-------------------------+ |
|
# | H1 | |
|
# | $h1 + | |
|
# | 192.0.2.1/28 | | |
|
# +-------------------|-----+ |
|
# | |
|
# +-------------------|-----+ |
|
# | SW1 | | |
|
# | $ol1 + | |
|
# | 192.0.2.2/28 | |
|
# | | |
|
# | + g1a (gre) | |
|
# | loc=192.0.2.65 | |
|
# | rem=192.0.2.66 --. | |
|
# | tos=inherit | | |
|
# | .------------------' | |
|
# | | | |
|
# | v | |
|
# | + $ul1.111 (vlan) | |
|
# | | 192.0.2.129/28 | |
|
# | \ | |
|
# | \_______ | |
|
# | | | |
|
# |VRF default + $ul1 | |
|
# +------------|------------+ |
|
# | |
|
# +------------|------------+ |
|
# | SW2 + $ul2 | |
|
# | _______| | |
|
# | / | |
|
# | / | |
|
# | + $ul2.111 (vlan) | |
|
# | ^ 192.0.2.130/28 | |
|
# | | | |
|
# | | | |
|
# | '------------------. | |
|
# | + g2a (gre) | | |
|
# | loc=192.0.2.66 | | |
|
# | rem=192.0.2.65 --' | |
|
# | tos=inherit | |
|
# | | |
|
# | $ol2 + | |
|
# | 192.0.2.17/28 | | |
|
# | VRF v$ol2 | | |
|
# +-------------------|-----+ |
|
# | |
|
# +-------------------|-----+ |
|
# | H2 | | |
|
# | $h2 + | |
|
# | 192.0.2.18/28 | |
|
# +-------------------------+ |
|
# |
|
# Hierarchical model: |
|
# The tunnel is bound to a device in a different VRF |
|
# |
|
# +---------------------------+ |
|
# | H1 | |
|
# | $h1 + | |
|
# | 192.0.2.1/28 | | |
|
# +-------------------|-------+ |
|
# | |
|
# +-------------------|-------+ |
|
# | SW1 | | |
|
# | +-----------------|-----+ | |
|
# | | $ol1 + | | |
|
# | | 192.0.2.2/28 | | |
|
# | | | | |
|
# | | + g1a (gre) | | |
|
# | | rem=192.0.2.66 | | |
|
# | | tos=inherit | | |
|
# | | loc=192.0.2.65 | | |
|
# | | ^ | | |
|
# | | VRF v$ol1 | | | |
|
# | +-----------|-----------+ | |
|
# | | | |
|
# | +-----------|-----------+ | |
|
# | | VRF v$ul1 | | | |
|
# | | | | | |
|
# | | | | | |
|
# | | v | | |
|
# | | dummy1 + | | |
|
# | | 192.0.2.65 | | |
|
# | | .-------' | | |
|
# | | | | | |
|
# | | v | | |
|
# | | + $ul1.111 (vlan) | | |
|
# | | | 192.0.2.129/28 | | |
|
# | | \ | | |
|
# | | \_____ | | |
|
# | | | | | |
|
# | | + $ul1 | | |
|
# | +----------|------------+ | |
|
# +------------|--------------+ |
|
# | |
|
# +------------|--------------+ |
|
# | SW2 | | |
|
# | +----------|------------+ | |
|
# | | + $ul2 | | |
|
# | | _____| | | |
|
# | | / | | |
|
# | | / | | |
|
# | | | $ul2.111 (vlan) | | |
|
# | | + 192.0.2.130/28 | | |
|
# | | ^ | | |
|
# | | | | | |
|
# | | '-------. | | |
|
# | | dummy2 + | | |
|
# | | 192.0.2.66 | | |
|
# | | ^ | | |
|
# | | | | | |
|
# | | | | | |
|
# | | VRF v$ul2 | | | |
|
# | +-----------|-----------+ | |
|
# | | | |
|
# | +-----------|-----------+ | |
|
# | | VRF v$ol2 | | | |
|
# | | | | | |
|
# | | v | | |
|
# | | g2a (gre)+ | | |
|
# | | loc=192.0.2.66 | | |
|
# | | rem=192.0.2.65 | | |
|
# | | tos=inherit | | |
|
# | | | | |
|
# | | $ol2 + | | |
|
# | | 192.0.2.17/28 | | | |
|
# | +-----------------|-----+ | |
|
# +-------------------|-------+ |
|
# | |
|
# +-------------------|-------+ |
|
# | H2 | | |
|
# | $h2 + | |
|
# | 192.0.2.18/28 | |
|
# +---------------------------+ |
|
source lib.sh |
|
|
|
h1_create() |
|
{ |
|
simple_if_init $h1 192.0.2.1/28 2001:db8:1::1/64 |
|
ip route add vrf v$h1 192.0.2.16/28 via 192.0.2.2 |
|
} |
|
|
|
h1_destroy() |
|
{ |
|
ip route del vrf v$h1 192.0.2.16/28 via 192.0.2.2 |
|
simple_if_fini $h1 192.0.2.1/28 |
|
} |
|
|
|
h2_create() |
|
{ |
|
simple_if_init $h2 192.0.2.18/28 |
|
ip route add vrf v$h2 192.0.2.0/28 via 192.0.2.17 |
|
} |
|
|
|
h2_destroy() |
|
{ |
|
ip route del vrf v$h2 192.0.2.0/28 via 192.0.2.17 |
|
simple_if_fini $h2 192.0.2.18/28 |
|
} |
|
|
|
sw1_flat_create() |
|
{ |
|
local type=$1; shift |
|
local ol1=$1; shift |
|
local ul1=$1; shift |
|
|
|
ip link set dev $ol1 up |
|
__addr_add_del $ol1 add "192.0.2.2/28" |
|
|
|
ip link set dev $ul1 up |
|
vlan_create $ul1 111 "" 192.0.2.129/28 |
|
|
|
tunnel_create g1a $type 192.0.2.65 192.0.2.66 tos inherit "$@" |
|
ip link set dev g1a up |
|
__addr_add_del g1a add "192.0.2.65/32" |
|
|
|
ip route add 192.0.2.66/32 via 192.0.2.130 |
|
|
|
ip route add 192.0.2.16/28 nexthop dev g1a |
|
} |
|
|
|
sw1_flat_destroy() |
|
{ |
|
local ol1=$1; shift |
|
local ul1=$1; shift |
|
|
|
ip route del 192.0.2.16/28 |
|
|
|
ip route del 192.0.2.66/32 via 192.0.2.130 |
|
__simple_if_fini g1a 192.0.2.65/32 |
|
tunnel_destroy g1a |
|
|
|
vlan_destroy $ul1 111 |
|
__simple_if_fini $ul1 |
|
__simple_if_fini $ol1 192.0.2.2/28 |
|
} |
|
|
|
sw2_flat_create() |
|
{ |
|
local type=$1; shift |
|
local ol2=$1; shift |
|
local ul2=$1; shift |
|
|
|
simple_if_init $ol2 192.0.2.17/28 |
|
__simple_if_init $ul2 v$ol2 |
|
vlan_create $ul2 111 v$ol2 192.0.2.130/28 |
|
|
|
tunnel_create g2a $type 192.0.2.66 192.0.2.65 tos inherit dev v$ol2 \ |
|
"$@" |
|
__simple_if_init g2a v$ol2 192.0.2.66/32 |
|
|
|
ip route add vrf v$ol2 192.0.2.65/32 via 192.0.2.129 |
|
ip route add vrf v$ol2 192.0.2.0/28 nexthop dev g2a |
|
} |
|
|
|
sw2_flat_destroy() |
|
{ |
|
local ol2=$1; shift |
|
local ul2=$1; shift |
|
|
|
ip route del vrf v$ol2 192.0.2.0/28 |
|
|
|
ip route del vrf v$ol2 192.0.2.65/32 via 192.0.2.129 |
|
__simple_if_fini g2a 192.0.2.66/32 |
|
tunnel_destroy g2a |
|
|
|
vlan_destroy $ul2 111 |
|
__simple_if_fini $ul2 |
|
simple_if_fini $ol2 192.0.2.17/28 |
|
} |
|
|
|
sw1_hierarchical_create() |
|
{ |
|
local type=$1; shift |
|
local ol1=$1; shift |
|
local ul1=$1; shift |
|
|
|
simple_if_init $ol1 192.0.2.2/28 |
|
simple_if_init $ul1 |
|
ip link add name dummy1 type dummy |
|
__simple_if_init dummy1 v$ul1 192.0.2.65/32 |
|
|
|
vlan_create $ul1 111 v$ul1 192.0.2.129/28 |
|
tunnel_create g1a $type 192.0.2.65 192.0.2.66 tos inherit dev dummy1 \ |
|
"$@" |
|
ip link set dev g1a master v$ol1 |
|
|
|
ip route add vrf v$ul1 192.0.2.66/32 via 192.0.2.130 |
|
ip route add vrf v$ol1 192.0.2.16/28 nexthop dev g1a |
|
} |
|
|
|
sw1_hierarchical_destroy() |
|
{ |
|
local ol1=$1; shift |
|
local ul1=$1; shift |
|
|
|
ip route del vrf v$ol1 192.0.2.16/28 |
|
ip route del vrf v$ul1 192.0.2.66/32 |
|
|
|
tunnel_destroy g1a |
|
vlan_destroy $ul1 111 |
|
|
|
__simple_if_fini dummy1 192.0.2.65/32 |
|
ip link del dev dummy1 |
|
|
|
simple_if_fini $ul1 |
|
simple_if_fini $ol1 192.0.2.2/28 |
|
} |
|
|
|
sw2_hierarchical_create() |
|
{ |
|
local type=$1; shift |
|
local ol2=$1; shift |
|
local ul2=$1; shift |
|
|
|
simple_if_init $ol2 192.0.2.17/28 |
|
simple_if_init $ul2 |
|
|
|
ip link add name dummy2 type dummy |
|
__simple_if_init dummy2 v$ul2 192.0.2.66/32 |
|
|
|
vlan_create $ul2 111 v$ul2 192.0.2.130/28 |
|
tunnel_create g2a $type 192.0.2.66 192.0.2.65 tos inherit dev dummy2 \ |
|
"$@" |
|
ip link set dev g2a master v$ol2 |
|
|
|
ip route add vrf v$ul2 192.0.2.65/32 via 192.0.2.129 |
|
ip route add vrf v$ol2 192.0.2.0/28 nexthop dev g2a |
|
} |
|
|
|
sw2_hierarchical_destroy() |
|
{ |
|
local ol2=$1; shift |
|
local ul2=$1; shift |
|
|
|
ip route del vrf v$ol2 192.0.2.0/28 |
|
ip route del vrf v$ul2 192.0.2.65/32 |
|
|
|
tunnel_destroy g2a |
|
vlan_destroy $ul2 111 |
|
|
|
__simple_if_fini dummy2 192.0.2.66/32 |
|
ip link del dev dummy2 |
|
|
|
simple_if_fini $ul2 |
|
simple_if_fini $ol2 192.0.2.17/28 |
|
} |
|
|
|
topo_mtu_change() |
|
{ |
|
local mtu=$1 |
|
|
|
ip link set mtu $mtu dev $h1 |
|
ip link set mtu $mtu dev $ol1 |
|
ip link set mtu $mtu dev g1a |
|
ip link set mtu $mtu dev $ul1 |
|
ip link set mtu $mtu dev $ul1.111 |
|
ip link set mtu $mtu dev $h2 |
|
ip link set mtu $mtu dev $ol2 |
|
ip link set mtu $mtu dev g2a |
|
ip link set mtu $mtu dev $ul2 |
|
ip link set mtu $mtu dev $ul2.111 |
|
} |
|
|
|
test_mtu_change() |
|
{ |
|
local encap=$1; shift |
|
|
|
RET=0 |
|
|
|
ping_do $h1 192.0.2.18 "-s 1800 -w 3" |
|
check_fail $? "ping $encap should not pass with size 1800" |
|
|
|
RET=0 |
|
|
|
topo_mtu_change 2000 |
|
ping_do $h1 192.0.2.18 "-s 1800 -w 3" |
|
check_err $? |
|
log_test "ping $encap packet size 1800 after MTU change" |
|
}
|
|
|