brintos

brintos / linux-shallow public Read only

0
0
Text · 11.2 KiB · 68ee92d Raw
368 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4# +--------------------+                               +----------------------+5# | H1 (vrf)           |                               |             H2 (vrf) |6# |    + h1.10         |                               |  + h2.20             |7# |    | 192.0.2.1/28  |                               |  | 192.0.2.2/28      |8# |    |               |                               |  |                   |9# |    + $h1           |                               |  + $h2               |10# |    |               |                               |  |                   |11# +----|---------------+                               +--|-------------------+12#      |                                                  |13# +----|--------------------------------------------------|--------------------+14# | SW |                                                  |                    |15# | +--|-------------------------------+ +----------------|------------------+ |16# | |  + $swp1         BR1 (802.1ad)   | | BR2 (802.1d)   + $swp2            | |17# | |    vid 100 pvid untagged         | |                |                  | |18# | |                                  | |                + $swp2.20         | |19# | |                                  | |                                   | |20# | |  + vx100 (vxlan)                 | |  + vx200 (vxlan)                  | |21# | |    local 192.0.2.17              | |    local 192.0.2.17               | |22# | |    remote 192.0.2.34             | |    remote 192.0.2.50              | |23# | |    id 1000 dstport $VXPORT       | |    id 2000 dstport $VXPORT        | |24# | |    vid 100 pvid untagged         | |                                   | |25# | +--------------------------------- + +-----------------------------------+ |26# |                                                                            |27# |  192.0.2.32/28 via 192.0.2.18                                              |28# |  192.0.2.48/28 via 192.0.2.18                                              |29# |                                                                            |30# |    + $rp1                                                                  |31# |    | 192.0.2.17/28                                                         |32# +----|-----------------------------------------------------------------------+33#      |34# +----|--------------------------------------------------------+35# |    |                                             VRP2 (vrf) |36# |    + $rp2                                                   |37# |      192.0.2.18/28                                          |38# |                                                             |   (maybe) HW39# =============================================================================40# |                                                             |  (likely) SW41# |    + v1 (veth)                             + v3 (veth)      |42# |    | 192.0.2.33/28                         | 192.0.2.49/28  |43# +----|---------------------------------------|----------------+44#      |                                       |45# +----|------------------------------+   +----|------------------------------+46# |    + v2 (veth)        NS1 (netns) |   |    + v4 (veth)        NS2 (netns) |47# |      192.0.2.34/28                |   |      192.0.2.50/28                |48# |                                   |   |                                   |49# |   192.0.2.16/28 via 192.0.2.33    |   |   192.0.2.16/28 via 192.0.2.49    |50# |   192.0.2.50/32 via 192.0.2.33    |   |   192.0.2.34/32 via 192.0.2.49    |51# |                                   |   |                                   |52# | +-------------------------------+ |   | +-------------------------------+ |53# | |                 BR3 (802.1ad) | |   | |                  BR3 (802.1d) | |54# | |  + vx100 (vxlan)              | |   | |  + vx200 (vxlan)              | |55# | |    local 192.0.2.34           | |   | |    local 192.0.2.50           | |56# | |    remote 192.0.2.17          | |   | |    remote 192.0.2.17          | |57# | |    remote 192.0.2.50          | |   | |    remote 192.0.2.34          | |58# | |    id 1000 dstport $VXPORT    | |   | |    id 2000 dstport $VXPORT    | |59# | |    vid 100 pvid untagged      | |   | |                               | |60# | |                               | |   | |  + w1.20                      | |61# | |                               | |   | |  |                            | |62# | |  + w1 (veth)                  | |   | |  + w1 (veth)                  | |63# | |  | vid 100 pvid untagged      | |   | |  |                            | |64# | +--|----------------------------+ |   | +--|----------------------------+ |65# |    |                              |   |    |                              |66# | +--|----------------------------+ |   | +--|----------------------------+ |67# | |  |                  VW2 (vrf) | |   | |  |                  VW2 (vrf) | |68# | |  + w2 (veth)                  | |   | |  + w2 (veth)                  | |69# | |  |                            | |   | |  |                            | |70# | |  |                            | |   | |  |                            | |71# | |  + w2.10                      | |   | |  + w2.20                      | |72# | |    192.0.2.3/28               | |   | |    192.0.2.4/28               | |73# | +-------------------------------+ |   | +-------------------------------+ |74# +-----------------------------------+   +-----------------------------------+75 76: ${VXPORT:=4789}77export VXPORT78 79: ${ALL_TESTS:="80	ping_ipv481    "}82 83NUM_NETIFS=684source lib.sh85 86h1_create()87{88	simple_if_init $h189	tc qdisc add dev $h1 clsact90	vlan_create $h1 10 v$h1 192.0.2.1/2891}92 93h1_destroy()94{95	vlan_destroy $h1 1096	tc qdisc del dev $h1 clsact97	simple_if_fini $h198}99 100h2_create()101{102	simple_if_init $h2103	tc qdisc add dev $h2 clsact104	vlan_create $h2 20 v$h2 192.0.2.2/28105}106 107h2_destroy()108{109	vlan_destroy $h2 20110	tc qdisc del dev $h2 clsact111	simple_if_fini $h2112}113 114rp1_set_addr()115{116	ip address add dev $rp1 192.0.2.17/28117 118	ip route add 192.0.2.32/28 nexthop via 192.0.2.18119	ip route add 192.0.2.48/28 nexthop via 192.0.2.18120}121 122rp1_unset_addr()123{124	ip route del 192.0.2.48/28 nexthop via 192.0.2.18125	ip route del 192.0.2.32/28 nexthop via 192.0.2.18126 127	ip address del dev $rp1 192.0.2.17/28128}129 130switch_create()131{132	#### BR1 ####133	ip link add name br1 type bridge vlan_filtering 1 \134		vlan_protocol 802.1ad vlan_default_pvid 0 mcast_snooping 0135	ip link set dev br1 addrgenmode none136	# Make sure the bridge uses the MAC address of the local port and not137	# that of the VxLAN's device.138	ip link set dev br1 address $(mac_get $swp1)139	ip link set dev br1 up140 141	#### BR2 ####142	ip link add name br2 type bridge vlan_filtering 0 mcast_snooping 0143	# Make sure the bridge uses the MAC address of the local port and not144	# that of the VxLAN's device.145	ip link set dev br2 address $(mac_get $swp2)146	ip link set dev br2 up147 148	ip link set dev $rp1 up149	rp1_set_addr150 151	#### VX100 ####152	ip link add name vx100 type vxlan id 1000 local 192.0.2.17 \153		dstport "$VXPORT" nolearning noudpcsum tos inherit ttl 100154	ip link set dev vx100 up155 156	ip link set dev vx100 master br1157	bridge vlan add vid 100 dev vx100 pvid untagged158 159	ip link set dev $swp1 master br1160	ip link set dev $swp1 up161	bridge vlan add vid 100 dev $swp1 pvid untagged162 163	#### VX200 ####164	ip link add name vx200 type vxlan id 2000 local 192.0.2.17 \165		dstport "$VXPORT" nolearning noudpcsum tos inherit ttl 100166	ip link set dev vx200 up167 168	ip link set dev vx200 master br2169 170	ip link set dev $swp2 up171	ip link add name $swp2.20 link $swp2 type vlan id 20172	ip link set dev $swp2.20 master br2173	ip link set dev $swp2.20 up174 175	bridge fdb append dev vx100 00:00:00:00:00:00 dst 192.0.2.34 self176	bridge fdb append dev vx200 00:00:00:00:00:00 dst 192.0.2.50 self177}178 179switch_destroy()180{181	bridge fdb del dev vx200 00:00:00:00:00:00 dst 192.0.2.50 self182	bridge fdb del dev vx100 00:00:00:00:00:00 dst 192.0.2.34 self183 184	ip link set dev vx200 nomaster185	ip link set dev vx200 down186	ip link del dev vx200187 188	ip link del dev $swp2.20189	ip link set dev $swp2 down190	ip link set dev $swp2 nomaster191 192	bridge vlan del vid 100 dev $swp1193	ip link set dev $swp1 down194	ip link set dev $swp1 nomaster195 196	ip link set dev vx100 nomaster197	ip link set dev vx100 down198	ip link del dev vx100199 200	rp1_unset_addr201	ip link set dev $rp1 down202 203	ip link set dev br2 down204	ip link del dev br2205 206	ip link set dev br1 down207	ip link del dev br1208}209 210vrp2_create()211{212	simple_if_init $rp2 192.0.2.18/28213	__simple_if_init v1 v$rp2 192.0.2.33/28214	__simple_if_init v3 v$rp2 192.0.2.49/28215	tc qdisc add dev v1 clsact216}217 218vrp2_destroy()219{220	tc qdisc del dev v1 clsact221	__simple_if_fini v3 192.0.2.49/28222	__simple_if_fini v1 192.0.2.33/28223	simple_if_fini $rp2 192.0.2.18/28224}225 226ns_init_common()227{228	local in_if=$1; shift229	local in_addr=$1; shift230	local other_in_addr=$1; shift231	local vxlan_name=$1; shift232	local vxlan_id=$1; shift233	local vlan_id=$1; shift234	local host_addr=$1; shift235	local nh_addr=$1; shift236 237	ip link set dev $in_if up238	ip address add dev $in_if $in_addr/28239	tc qdisc add dev $in_if clsact240 241	ip link add name br3 type bridge vlan_filtering 0242	ip link set dev br3 up243 244	ip link add name w1 type veth peer name w2245 246	ip link set dev w1 master br3247	ip link set dev w1 up248 249	ip link add name $vxlan_name type vxlan id $vxlan_id local $in_addr \250		dstport "$VXPORT"251	ip link set dev $vxlan_name up252	bridge fdb append dev $vxlan_name 00:00:00:00:00:00 dst 192.0.2.17 self253	bridge fdb append dev $vxlan_name 00:00:00:00:00:00 dst $other_in_addr self254 255	ip link set dev $vxlan_name master br3256	tc qdisc add dev $vxlan_name clsact257 258	simple_if_init w2259	vlan_create w2 $vlan_id vw2 $host_addr/28260 261	ip route add 192.0.2.16/28 nexthop via $nh_addr262	ip route add $other_in_addr/32 nexthop via $nh_addr263}264export -f ns_init_common265 266ns1_create()267{268	ip netns add ns1269	ip link set dev v2 netns ns1270	in_ns ns1 \271	      ns_init_common v2 192.0.2.34 192.0.2.50 vx100 1000 10 192.0.2.3 \272	      192.0.2.33273 274	in_ns ns1 bridge vlan add vid 100 dev vx100 pvid untagged275}276 277ns1_destroy()278{279	ip netns exec ns1 ip link set dev v2 netns 1280	ip netns del ns1281}282 283ns2_create()284{285	ip netns add ns2286	ip link set dev v4 netns ns2287	in_ns ns2 \288	      ns_init_common v4 192.0.2.50 192.0.2.34 vx200 2000 20 192.0.2.4 \289	      192.0.2.49290 291	in_ns ns2 ip link add name w1.20 link w1 type vlan id 20292	in_ns ns2 ip link set dev w1.20 master br3293	in_ns ns2 ip link set dev w1.20 up294}295 296ns2_destroy()297{298	ip netns exec ns2 ip link set dev v4 netns 1299	ip netns del ns2300}301 302setup_prepare()303{304	h1=${NETIFS[p1]}305	swp1=${NETIFS[p2]}306 307	swp2=${NETIFS[p3]}308	h2=${NETIFS[p4]}309 310	rp1=${NETIFS[p5]}311	rp2=${NETIFS[p6]}312 313	vrf_prepare314	forwarding_enable315 316	h1_create317	h2_create318	switch_create319 320	ip link add name v1 type veth peer name v2321	ip link add name v3 type veth peer name v4322	vrp2_create323	ns1_create324	ns2_create325 326	r1_mac=$(in_ns ns1 mac_get w2)327	r2_mac=$(in_ns ns2 mac_get w2)328	h2_mac=$(mac_get $h2)329}330 331cleanup()332{333	pre_cleanup334 335	ns2_destroy336	ns1_destroy337	vrp2_destroy338	ip link del dev v3339	ip link del dev v1340 341	switch_destroy342	h2_destroy343	h1_destroy344 345	forwarding_restore346	vrf_cleanup347}348 349ping_ipv4()350{351	ping_test $h1 192.0.2.3 ": local->remote 1 through VxLAN with an 802.1ad bridge"352	ping_test $h2 192.0.2.4 ": local->remote 2 through VxLAN with an 802.1d bridge"353}354 355test_all()356{357	echo "Running tests with UDP port $VXPORT"358	tests_run359}360 361trap cleanup EXIT362 363setup_prepare364setup_wait365test_all366 367exit $EXIT_STATUS368