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