| #!/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 | | |
| # +---------------------------+ | |
| h1_create() | |
| { | |
| simple_if_init $h1 192.0.2.1/28 | |
| 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" | |
| } |