brintos

brintos / linux-shallow public Read only

0
0
Text · 15.7 KiB · 2d91281 Raw
519 lines · bash
1# SPDX-License-Identifier: GPL-2.02#!/bin/bash3 4# Handles creation and destruction of IP-in-IP or GRE tunnels over the given5# 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# |        198.51.100.1/24  |      |15# |        2001:db8:1::1/64 |      |16# +-------------------------|------+17#                           |18# +-------------------------|-------------------+19# | SW1                     |                   |20# |                    $ol1 +                   |21# |        198.51.100.2/24                      |22# |        2001:db8:1::2/64                     |23# |                                             |24# |      + g1a (ip6gre)                         |25# |        loc=2001:db8:3::1                    |26# |        rem=2001:db8:3::2 --.                |27# |        tos=inherit         |                |28# |                            .                |29# |      .---------------------                 |30# |      |                                      |31# |      v                                      |32# |      + $ul1.111 (vlan)                      |33# |      | 2001:db8:10::1/64                    |34# |       \                                     |35# |        \____________                        |36# |                     |                       |37# | VRF default         + $ul1                  |38# +---------------------|-----------------------+39#                       |40# +---------------------|-----------------------+41# | SW2                 |                       |42# |                $ul2 +                       |43# |          ___________|                       |44# |         /                                   |45# |        /                                    |46# |       + $ul2.111 (vlan)                     |47# |       ^ 2001:db8:10::2/64                   |48# |       |                                     |49# |       |                                     |50# |       '----------------------.              |51# |       + g2a (ip6gre)         |              |52# |         loc=2001:db8:3::2    |              |53# |         rem=2001:db8:3::1  --'              |54# |         tos=inherit                         |55# |                                             |56# |                     + $ol2                  |57# |                     | 203.0.113.2/24        |58# | VRF v$ol2           | 2001:db8:2::2/64      |59# +---------------------|-----------------------+60# +---------------------|----------+61# | H2                  |          |62# |                 $h2 +          |63# |    203.0.113.1/24              |64# |    2001:db8:2::1/64            |65# +--------------------------------+66#67# Hierarchical model:68# The tunnel is bound to a device in a different VRF69#70# +--------------------------------+71# | H1                             |72# |                     $h1 +      |73# |        198.51.100.1/24  |      |74# |        2001:db8:1::1/64 |      |75# +-------------------------|------+76#                           |77# +-------------------------|-------------------+78# | SW1                     |                   |79# | +-----------------------|-----------------+ |80# | |                  $ol1 +                 | |81# | |      198.51.100.2/24                    | |82# | |      2001:db8:1::2/64                   | |83# | |                                         | |84# | |              + g1a (ip6gre)             | |85# | |                loc=2001:db8:3::1        | |86# | |                rem=2001:db8:3::2        | |87# | |                tos=inherit              | |88# | |                    ^                    | |89# | |   VRF v$ol1        |                    | |90# | +--------------------|--------------------+ |91# |                      |                      |92# | +--------------------|--------------------+ |93# | |   VRF v$ul1        |                    | |94# | |                    |                    | |95# | |                    v                    | |96# | |             dummy1 +                    | |97# | |       2001:db8:3::1/64                  | |98# | |         .-----------'                   | |99# | |         |                               | |100# | |         v                               | |101# | |         + $ul1.111 (vlan)               | |102# | |         | 2001:db8:10::1/64             | |103# | |         \                               | |104# | |          \__________                    | |105# | |                     |                   | |106# | |                     + $ul1              | |107# | +---------------------|-------------------+ |108# +-----------------------|---------------------+109#                         |110# +-----------------------|---------------------+111# | SW2                   |                     |112# | +---------------------|-------------------+ |113# | |                     + $ul2              | |114# | |                _____|                   | |115# | |               /                         | |116# | |              /                          | |117# | |              | $ul2.111 (vlan)          | |118# | |              + 2001:db8:10::2/64        | |119# | |              ^                          | |120# | |              |                          | |121# | |              '------.                   | |122# | |              dummy2 +                   | |123# | |              2001:db8:3::2/64           | |124# | |                     ^                   | |125# | |                     |                   | |126# | |                     |                   | |127# | | VRF v$ul2           |                   | |128# | +---------------------|-------------------+ |129# |                       |                     |130# | +---------------------|-------------------+ |131# | | VRF v$ol2           |                   | |132# | |                     |                   | |133# | |                     v                   | |134# | |        g2a (ip6gre) +                   | |135# | |        loc=2001:db8:3::2                | |136# | |        rem=2001:db8:3::1                | |137# | |        tos=inherit                      | |138# | |                                         | |139# | |                $ol2 +                   | |140# | |    203.0.113.2/24   |                   | |141# | |    2001:db8:2::2/64 |                   | |142# | +---------------------|-------------------+ |143# +-----------------------|---------------------+144#                         |145# +-----------------------|--------+146# | H2                    |        |147# |                   $h2 +        |148# |      203.0.113.1/24            |149# |      2001:db8:2::1/64          |150# +--------------------------------+151 152source lib.sh153source tc_common.sh154 155h1_create()156{157	simple_if_init $h1 198.51.100.1/24 2001:db8:1::1/64158	ip route add vrf v$h1 203.0.113.0/24 via 198.51.100.2159	ip -6 route add vrf v$h1 2001:db8:2::/64 via 2001:db8:1::2160}161 162h1_destroy()163{164	ip -6 route del vrf v$h1 2001:db8:2::/64 via 2001:db8:1::2165	ip route del vrf v$h1 203.0.113.0/24 via 198.51.100.2166	simple_if_fini $h1 198.51.100.1/24 2001:db8:1::1/64167}168 169h2_create()170{171	simple_if_init $h2 203.0.113.1/24 2001:db8:2::1/64172	ip route add vrf v$h2 198.51.100.0/24 via 203.0.113.2173	ip -6 route add vrf v$h2 2001:db8:1::/64 via 2001:db8:2::2174}175 176h2_destroy()177{178	ip -6 route del vrf v$h2 2001:db8:1::/64 via 2001:db8:2::2179	ip route del vrf v$h2 198.51.100.0/24 via 203.0.113.2180	simple_if_fini $h2 203.0.113.1/24 2001:db8:2::1/64181}182 183sw1_flat_create()184{185	local ol1=$1; shift186	local ul1=$1; shift187 188	ip link set dev $ol1 up189        __addr_add_del $ol1 add 198.51.100.2/24 2001:db8:1::2/64190 191	ip link set dev $ul1 up192	vlan_create $ul1 111 "" 2001:db8:10::1/64193 194	tunnel_create g1a ip6gre 2001:db8:3::1 2001:db8:3::2 tos inherit \195		ttl inherit "$@"196	ip link set dev g1a up197        __addr_add_del g1a add "2001:db8:3::1/128"198 199	ip -6 route add 2001:db8:3::2/128 via 2001:db8:10::2200	ip route add 203.0.113.0/24 dev g1a201	ip -6 route add 2001:db8:2::/64 dev g1a202}203 204sw1_flat_destroy()205{206	local ol1=$1; shift207	local ul1=$1; shift208 209	ip -6 route del 2001:db8:2::/64210	ip route del 203.0.113.0/24211	ip -6 route del 2001:db8:3::2/128 via 2001:db8:10::2212 213	__simple_if_fini g1a 2001:db8:3::1/128214	tunnel_destroy g1a215 216	vlan_destroy $ul1 111217	__simple_if_fini $ul1218	__simple_if_fini $ol1 198.51.100.2/24 2001:db8:1::2/64219}220 221sw2_flat_create()222{223	local ol2=$1; shift224	local ul2=$1; shift225 226	simple_if_init $ol2 203.0.113.2/24 2001:db8:2::2/64227	__simple_if_init $ul2 v$ol2228	vlan_create $ul2 111 v$ol2 2001:db8:10::2/64229 230	tunnel_create g2a ip6gre 2001:db8:3::2 2001:db8:3::1 tos inherit \231		ttl inherit dev v$ol2 "$@"232	__simple_if_init g2a v$ol2 2001:db8:3::2/128233 234	# Replace neighbor to avoid 1 dropped packet due to "unresolved neigh"235	ip neigh replace dev $ol2 203.0.113.1 lladdr $(mac_get $h2)236	ip -6 neigh replace dev $ol2 2001:db8:2::1 lladdr $(mac_get $h2)237 238	ip -6 route add vrf v$ol2 2001:db8:3::1/128 via 2001:db8:10::1239	ip route add vrf v$ol2 198.51.100.0/24 dev g2a240	ip -6 route add vrf v$ol2 2001:db8:1::/64 dev g2a241}242 243sw2_flat_destroy()244{245	local ol2=$1; shift246	local ul2=$1; shift247 248	ip -6 route del vrf v$ol2 2001:db8:2::/64249	ip route del vrf v$ol2 198.51.100.0/24250	ip -6 route del vrf v$ol2 2001:db8:3::1/128 via 2001:db8:10::1251 252	__simple_if_fini g2a 2001:db8:3::2/128253	tunnel_destroy g2a254 255	vlan_destroy $ul2 111256	__simple_if_fini $ul2257	simple_if_fini $ol2 203.0.113.2/24 2001:db8:2::2/64258}259 260sw1_hierarchical_create()261{262	local ol1=$1; shift263	local ul1=$1; shift264 265	simple_if_init $ol1 198.51.100.2/24 2001:db8:1::2/64266	simple_if_init $ul1267	ip link add name dummy1 type dummy268	__simple_if_init dummy1 v$ul1 2001:db8:3::1/64269 270	vlan_create $ul1 111 v$ul1 2001:db8:10::1/64271	tunnel_create g1a ip6gre 2001:db8:3::1 2001:db8:3::2 tos inherit \272		ttl inherit dev dummy1 "$@"273	ip link set dev g1a master v$ol1274 275	ip -6 route add vrf v$ul1 2001:db8:3::2/128 via 2001:db8:10::2276	ip route add vrf v$ol1 203.0.113.0/24 dev g1a277	ip -6 route add vrf v$ol1 2001:db8:2::/64 dev g1a278}279 280sw1_hierarchical_destroy()281{282	local ol1=$1; shift283	local ul1=$1; shift284 285	ip -6 route del vrf v$ol1 2001:db8:2::/64286	ip route del vrf v$ol1 203.0.113.0/24287	ip -6 route del vrf v$ul1 2001:db8:3::2/128288 289	tunnel_destroy g1a290	vlan_destroy $ul1 111291 292	__simple_if_fini dummy1 2001:db8:3::1/64293	ip link del dev dummy1294 295	simple_if_fini $ul1296	simple_if_fini $ol1 198.51.100.2/24 2001:db8:1::2/64297}298 299sw2_hierarchical_create()300{301	local ol2=$1; shift302	local ul2=$1; shift303 304	simple_if_init $ol2 203.0.113.2/24 2001:db8:2::2/64305	simple_if_init $ul2306 307	ip link add name dummy2 type dummy308	__simple_if_init dummy2 v$ul2 2001:db8:3::2/64309 310	vlan_create $ul2 111 v$ul2 2001:db8:10::2/64311	tunnel_create g2a ip6gre 2001:db8:3::2 2001:db8:3::1 tos inherit \312		ttl inherit dev dummy2 "$@"313	ip link set dev g2a master v$ol2314 315	# Replace neighbor to avoid 1 dropped packet due to "unresolved neigh"316	ip neigh replace dev $ol2 203.0.113.1 lladdr $(mac_get $h2)317	ip -6 neigh replace dev $ol2 2001:db8:2::1 lladdr $(mac_get $h2)318 319	ip -6 route add vrf v$ul2 2001:db8:3::1/128 via 2001:db8:10::1320	ip route add vrf v$ol2 198.51.100.0/24 dev g2a321	ip -6 route add vrf v$ol2 2001:db8:1::/64 dev g2a322}323 324sw2_hierarchical_destroy()325{326	local ol2=$1; shift327	local ul2=$1; shift328 329	ip -6 route del vrf v$ol2 2001:db8:2::/64330	ip route del vrf v$ol2 198.51.100.0/24331	ip -6 route del vrf v$ul2 2001:db8:3::1/128332 333	tunnel_destroy g2a334	vlan_destroy $ul2 111335 336	__simple_if_fini dummy2 2001:db8:3::2/64337	ip link del dev dummy2338 339	simple_if_fini $ul2340	simple_if_fini $ol2 203.0.113.2/24 2001:db8:2::2/64341}342 343test_traffic_ip4ip6()344{345	RET=0346 347	h1mac=$(mac_get $h1)348	ol1mac=$(mac_get $ol1)349 350	tc qdisc add dev $ul1 clsact351	tc filter add dev $ul1 egress proto all pref 1 handle 101 \352		flower $TC_FLAG action pass353 354	tc qdisc add dev $ol2 clsact355	tc filter add dev $ol2 egress protocol ipv4 pref 1 handle 101 \356		flower $TC_FLAG dst_ip 203.0.113.1 action pass357 358	$MZ $h1 -c 1000 -p 64 -a $h1mac -b $ol1mac -A 198.51.100.1 \359		-B 203.0.113.1 -t ip -q -d $MZ_DELAY360 361	# Check ports after encap and after decap.362	tc_check_at_least_x_packets "dev $ul1 egress" 101 1000363	check_err $? "Packets did not go through $ul1, tc_flag = $TC_FLAG"364 365	tc_check_at_least_x_packets "dev $ol2 egress" 101 1000366	check_err $? "Packets did not go through $ol2, tc_flag = $TC_FLAG"367 368	log_test "$@"369 370	tc filter del dev $ol2 egress protocol ipv4 pref 1 handle 101 flower371	tc qdisc del dev $ol2 clsact372	tc filter del dev $ul1 egress proto all pref 1 handle 101 flower373	tc qdisc del dev $ul1 clsact374}375 376test_traffic_ip6ip6()377{378	RET=0379 380	h1mac=$(mac_get $h1)381	ol1mac=$(mac_get $ol1)382 383	tc qdisc add dev $ul1 clsact384	tc filter add dev $ul1 egress proto all pref 1 handle 101 \385		flower $TC_FLAG action pass386 387	tc qdisc add dev $ol2 clsact388	tc filter add dev $ol2 egress protocol ipv6 pref 1 handle 101 \389		flower $TC_FLAG dst_ip 2001:db8:2::1 action pass390 391	$MZ -6 $h1 -c 1000 -p 64 -a $h1mac -b $ol1mac -A 2001:db8:1::1 \392		-B 2001:db8:2::1 -t ip -q -d $MZ_DELAY393 394	# Check ports after encap and after decap.395	tc_check_at_least_x_packets "dev $ul1 egress" 101 1000396	check_err $? "Packets did not go through $ul1, tc_flag = $TC_FLAG"397 398	tc_check_at_least_x_packets "dev $ol2 egress" 101 1000399	check_err $? "Packets did not go through $ol2, tc_flag = $TC_FLAG"400 401	log_test "$@"402 403	tc filter del dev $ol2 egress protocol ipv6 pref 1 handle 101 flower404	tc qdisc del dev $ol2 clsact405	tc filter del dev $ul1 egress proto all pref 1 handle 101 flower406	tc qdisc del dev $ul1 clsact407}408 409topo_mtu_change()410{411	local mtu=$1412 413	ip link set mtu $mtu dev $h1414	ip link set mtu $mtu dev $ol1415	ip link set mtu $mtu dev g1a416	ip link set mtu $mtu dev $ul1417	ip link set mtu $mtu dev $ul1.111418	ip link set mtu $mtu dev $h2419	ip link set mtu $mtu dev $ol2420	ip link set mtu $mtu dev g2a421	ip link set mtu $mtu dev $ul2422	ip link set mtu $mtu dev $ul2.111423}424 425test_mtu_change()426{427	RET=0428 429	ping6_do $h1 2001:db8:2::1 "-s 1800 -w 3"430	check_fail $? "ping GRE IPv6 should not pass with packet size 1800"431 432	RET=0433 434	topo_mtu_change	2000435	ping6_do $h1 2001:db8:2::1 "-s 1800 -w 3"436	check_err $?437	log_test "ping GRE IPv6, packet size 1800 after MTU change"438}439 440topo_flat_remote_change()441{442	local old1=$1; shift443	local new1=$1; shift444	local old2=$1; shift445	local new2=$1; shift446 447	ip link set dev g1a type ip6gre local $new1 remote $new2448        __addr_add_del g1a add "$new1/128"449        __addr_add_del g1a del "$old1/128"450	ip -6 route add $new2/128 via 2001:db8:10::2451	ip -6 route del $old2/128452 453	ip link set dev g2a type ip6gre local $new2 remote $new1454        __addr_add_del g2a add "$new2/128"455        __addr_add_del g2a del "$old2/128"456	ip -6 route add vrf v$ol2 $new1/128 via 2001:db8:10::1457	ip -6 route del vrf v$ol2 $old1/128458}459 460flat_remote_change()461{462	local old1=2001:db8:3::1463	local new1=2001:db8:3::10464	local old2=2001:db8:3::2465	local new2=2001:db8:3::20466 467	topo_flat_remote_change $old1 $new1 $old2 $new2468}469 470flat_remote_restore()471{472	local old1=2001:db8:3::10473	local new1=2001:db8:3::1474	local old2=2001:db8:3::20475	local new2=2001:db8:3::2476 477	topo_flat_remote_change $old1 $new1 $old2 $new2478}479 480topo_hier_remote_change()481{482	local old1=$1; shift483	local new1=$1; shift484	local old2=$1; shift485	local new2=$1; shift486 487        __addr_add_del dummy1 del "$old1/64"488        __addr_add_del dummy1 add "$new1/64"489	ip link set dev g1a type ip6gre local $new1 remote $new2490	ip -6 route add vrf v$ul1 $new2/128 via 2001:db8:10::2491	ip -6 route del vrf v$ul1 $old2/128492 493        __addr_add_del dummy2 del "$old2/64"494        __addr_add_del dummy2 add "$new2/64"495	ip link set dev g2a type ip6gre local $new2 remote $new1496	ip -6 route add vrf v$ul2 $new1/128 via 2001:db8:10::1497	ip -6 route del vrf v$ul2 $old1/128498}499 500hier_remote_change()501{502	local old1=2001:db8:3::1503	local new1=2001:db8:3::10504	local old2=2001:db8:3::2505	local new2=2001:db8:3::20506 507	topo_hier_remote_change $old1 $new1 $old2 $new2508}509 510hier_remote_restore()511{512	local old1=2001:db8:3::10513	local new1=2001:db8:3::1514	local old2=2001:db8:3::20515	local new2=2001:db8:3::2516 517	topo_hier_remote_change $old1 $new1 $old2 $new2518}519