349 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4# +-----------------------+ +------------------------+5# | H1 (vrf) | | H2 (vrf) |6# | + $h1.10 | | + $h2.10 |7# | | 192.0.2.1/28 | | | 192.0.2.2/28 |8# | | | | | |9# | | + $h1.20 | | | + $h2.20 |10# | \ | 198.51.100.1/24 | | \ | 198.51.100.2/24 |11# | \| | | \| |12# | + $h1 | | + $h2 |13# +----|------------------+ +----|-------------------+14# | |15# +----|--------------------------------------------------|-------------------+16# | SW | | |17# | +--|--------------------------------------------------|-----------------+ |18# | | + $swp1 BR1 (802.1ad) + $swp2 | |19# | | vid 100 pvid untagged vid 100 pvid | |20# | | untagged | |21# | | + vx100 (vxlan) | |22# | | local 192.0.2.17 | |23# | | remote 192.0.2.34 192.0.2.50 | |24# | | id 1000 dstport $VXPORT | |25# | | vid 100 pvid untagged | |26# | +-----------------------------------------------------------------------+ |27# | |28# | 192.0.2.32/28 via 192.0.2.18 |29# | 192.0.2.48/28 via 192.0.2.18 |30# | |31# | + $rp1 |32# | | 192.0.2.17/28 |33# +----|----------------------------------------------------------------------+34# |35# +----|--------------------------------------------------------+36# | | VRP2 (vrf) |37# | + $rp2 |38# | 192.0.2.18/28 |39# | | (maybe) HW40# =============================================================================41# | | (likely) SW42# | + v1 (veth) + v3 (veth) |43# | | 192.0.2.33/28 | 192.0.2.49/28 |44# +----|---------------------------------------|----------------+45# | |46# +----|------------------------------+ +----|------------------------------+47# | + v2 (veth) NS1 (netns) | | + v4 (veth) NS2 (netns) |48# | 192.0.2.34/28 | | 192.0.2.50/28 |49# | | | |50# | 192.0.2.16/28 via 192.0.2.33 | | 192.0.2.16/28 via 192.0.2.49 |51# | 192.0.2.50/32 via 192.0.2.33 | | 192.0.2.34/32 via 192.0.2.49 |52# | | | |53# | +-------------------------------+ | | +-------------------------------+ |54# | | BR2 (802.1ad) | | | | BR2 (802.1ad) | |55# | | + vx100 (vxlan) | | | | + vx100 (vxlan) | |56# | | local 192.0.2.34 | | | | local 192.0.2.50 | |57# | | remote 192.0.2.17 | | | | remote 192.0.2.17 | |58# | | remote 192.0.2.50 | | | | remote 192.0.2.34 | |59# | | id 1000 dstport $VXPORT | | | | id 1000 dstport $VXPORT | |60# | | vid 100 pvid untagged | | | | vid 100 pvid untagged | |61# | | | | | | | |62# | | + w1 (veth) | | | | + w1 (veth) | |63# | | | vid 100 pvid untagged | | | | | vid 100 pvid untagged | |64# | +--|----------------------------+ | | +--|----------------------------+ |65# | | | | | |66# | +--|----------------------------+ | | +--|----------------------------+ |67# | | | VW2 (vrf) | | | | | VW2 (vrf) | |68# | | + w2 (veth) | | | | + w2 (veth) | |69# | | |\ | | | | |\ | |70# | | | + w2.10 | | | | | + w2.10 | |71# | | | 192.0.2.3/28 | | | | | 192.0.2.4/28 | |72# | | | | | | | | | |73# | | + w2.20 | | | | + w2.20 | |74# | | 198.51.100.3/24 | | | | 198.51.100.4/24 | |75# | +-------------------------------+ | | +-------------------------------+ |76# +-----------------------------------+ +-----------------------------------+77 78: ${VXPORT:=4789}79export VXPORT80 81: ${ALL_TESTS:="82 ping_ipv483 "}84 85NUM_NETIFS=686source lib.sh87 88h1_create()89{90 simple_if_init $h191 tc qdisc add dev $h1 clsact92 vlan_create $h1 10 v$h1 192.0.2.1/2893 vlan_create $h1 20 v$h1 198.51.100.1/2494}95 96h1_destroy()97{98 vlan_destroy $h1 2099 vlan_destroy $h1 10100 tc qdisc del dev $h1 clsact101 simple_if_fini $h1102}103 104h2_create()105{106 simple_if_init $h2107 tc qdisc add dev $h2 clsact108 vlan_create $h2 10 v$h2 192.0.2.2/28109 vlan_create $h2 20 v$h2 198.51.100.2/24110}111 112h2_destroy()113{114 vlan_destroy $h2 20115 vlan_destroy $h2 10116 tc qdisc del dev $h2 clsact117 simple_if_fini $h2118}119 120rp1_set_addr()121{122 ip address add dev $rp1 192.0.2.17/28123 124 ip route add 192.0.2.32/28 nexthop via 192.0.2.18125 ip route add 192.0.2.48/28 nexthop via 192.0.2.18126}127 128rp1_unset_addr()129{130 ip route del 192.0.2.48/28 nexthop via 192.0.2.18131 ip route del 192.0.2.32/28 nexthop via 192.0.2.18132 133 ip address del dev $rp1 192.0.2.17/28134}135 136switch_create()137{138 ip link add name br1 type bridge vlan_filtering 1 vlan_protocol 802.1ad \139 vlan_default_pvid 0 mcast_snooping 0140 ip link set dev br1 addrgenmode none141 # Make sure the bridge uses the MAC address of the local port and not142 # that of the VxLAN's device.143 ip link set dev br1 address $(mac_get $swp1)144 ip link set dev br1 up145 146 ip link set dev $rp1 up147 rp1_set_addr148 149 ip link add name vx100 type vxlan id 1000 \150 local 192.0.2.17 dstport "$VXPORT" \151 nolearning noudpcsum tos inherit ttl 100152 ip link set dev vx100 up153 154 ip link set dev vx100 master br1155 bridge vlan add vid 100 dev vx100 pvid untagged156 157 ip link set dev $swp1 master br1158 ip link set dev $swp1 up159 bridge vlan add vid 100 dev $swp1 pvid untagged160 161 ip link set dev $swp2 master br1162 ip link set dev $swp2 up163 bridge vlan add vid 100 dev $swp2 pvid untagged164 165 bridge fdb append dev vx100 00:00:00:00:00:00 dst 192.0.2.34 self166 bridge fdb append dev vx100 00:00:00:00:00:00 dst 192.0.2.50 self167}168 169switch_destroy()170{171 bridge fdb del dev vx100 00:00:00:00:00:00 dst 192.0.2.50 self172 bridge fdb del dev vx100 00:00:00:00:00:00 dst 192.0.2.34 self173 174 bridge vlan del vid 100 dev $swp2175 ip link set dev $swp2 down176 ip link set dev $swp2 nomaster177 178 bridge vlan del vid 100 dev $swp1179 ip link set dev $swp1 down180 ip link set dev $swp1 nomaster181 182 ip link set dev vx100 nomaster183 ip link set dev vx100 down184 ip link del dev vx100185 186 rp1_unset_addr187 ip link set dev $rp1 down188 189 ip link set dev br1 down190 ip link del dev br1191}192 193vrp2_create()194{195 simple_if_init $rp2 192.0.2.18/28196 __simple_if_init v1 v$rp2 192.0.2.33/28197 __simple_if_init v3 v$rp2 192.0.2.49/28198 tc qdisc add dev v1 clsact199}200 201vrp2_destroy()202{203 tc qdisc del dev v1 clsact204 __simple_if_fini v3 192.0.2.49/28205 __simple_if_fini v1 192.0.2.33/28206 simple_if_fini $rp2 192.0.2.18/28207}208 209ns_init_common()210{211 local in_if=$1; shift212 local in_addr=$1; shift213 local other_in_addr=$1; shift214 local nh_addr=$1; shift215 local host_addr1=$1; shift216 local host_addr2=$1; shift217 218 ip link set dev $in_if up219 ip address add dev $in_if $in_addr/28220 tc qdisc add dev $in_if clsact221 222 ip link add name br2 type bridge vlan_filtering 1 vlan_protocol 802.1ad \223 vlan_default_pvid 0224 ip link set dev br2 up225 226 ip link add name w1 type veth peer name w2227 228 ip link set dev w1 master br2229 ip link set dev w1 up230 bridge vlan add vid 100 dev w1 pvid untagged231 232 ip link add name vx100 type vxlan id 1000 local $in_addr \233 dstport "$VXPORT"234 ip link set dev vx100 up235 bridge fdb append dev vx100 00:00:00:00:00:00 dst 192.0.2.17 self236 bridge fdb append dev vx100 00:00:00:00:00:00 dst $other_in_addr self237 238 ip link set dev vx100 master br2239 tc qdisc add dev vx100 clsact240 241 bridge vlan add vid 100 dev vx100 pvid untagged242 243 simple_if_init w2244 vlan_create w2 10 vw2 $host_addr1/28245 vlan_create w2 20 vw2 $host_addr2/24246 247 ip route add 192.0.2.16/28 nexthop via $nh_addr248 ip route add $other_in_addr/32 nexthop via $nh_addr249}250export -f ns_init_common251 252ns1_create()253{254 ip netns add ns1255 ip link set dev v2 netns ns1256 in_ns ns1 \257 ns_init_common v2 192.0.2.34 192.0.2.50 192.0.2.33 \258 192.0.2.3 198.51.100.3259}260 261ns1_destroy()262{263 ip netns exec ns1 ip link set dev v2 netns 1264 ip netns del ns1265}266 267ns2_create()268{269 ip netns add ns2270 ip link set dev v4 netns ns2271 in_ns ns2 \272 ns_init_common v4 192.0.2.50 192.0.2.34 192.0.2.49 \273 192.0.2.4 198.51.100.4274}275 276ns2_destroy()277{278 ip netns exec ns2 ip link set dev v4 netns 1279 ip netns del ns2280}281 282setup_prepare()283{284 h1=${NETIFS[p1]}285 swp1=${NETIFS[p2]}286 287 swp2=${NETIFS[p3]}288 h2=${NETIFS[p4]}289 290 rp1=${NETIFS[p5]}291 rp2=${NETIFS[p6]}292 293 vrf_prepare294 forwarding_enable295 296 h1_create297 h2_create298 switch_create299 300 ip link add name v1 type veth peer name v2301 ip link add name v3 type veth peer name v4302 vrp2_create303 ns1_create304 ns2_create305 306 r1_mac=$(in_ns ns1 mac_get w2)307 r2_mac=$(in_ns ns2 mac_get w2)308 h2_mac=$(mac_get $h2)309}310 311cleanup()312{313 pre_cleanup314 315 ns2_destroy316 ns1_destroy317 vrp2_destroy318 ip link del dev v3319 ip link del dev v1320 321 switch_destroy322 h2_destroy323 h1_destroy324 325 forwarding_restore326 vrf_cleanup327}328 329ping_ipv4()330{331 ping_test $h1 192.0.2.2 ": local->local"332 ping_test $h1 192.0.2.3 ": local->remote 1"333 ping_test $h1 192.0.2.4 ": local->remote 2"334}335 336test_all()337{338 echo "Running tests with UDP port $VXPORT"339 tests_run340}341 342trap cleanup EXIT343 344setup_prepare345setup_wait346test_all347 348exit $EXIT_STATUS349