348 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03 4# +-----------------------+ +------------------------+5# | H1 (vrf) | | H2 (vrf) |6# | + $h1.10 | | + $h2.10 |7# | | 2001:db8:1::1/64 | | | 2001:db8:1::2/64 |8# | | | | | |9# | | + $h1.20 | | | + $h2.20 |10# | \ | 2001:db8:2::1/64 | | \ | 2001:db8:2::2/64 |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 2001:db8:3::1 | |23# | | remote 2001:db8:4::1 2001:db8:5::1 | |24# | | id 1000 dstport $VXPORT | |25# | | vid 100 pvid untagged | |26# | +-----------------------------------------------------------------------+ |27# | |28# | 2001:db8:4::0/64 via 2001:db8:3::2 |29# | 2001:db8:5::0/64 via 2001:db8:3::2 |30# | |31# | + $rp1 |32# | | 2001:db8:3::1/64 |33# +----|----------------------------------------------------------------------+34# |35# +----|----------------------------------------------------------+36# | | VRP2 (vrf) |37# | + $rp2 |38# | 2001:db8:3::2/64 |39# | | (maybe) HW40# =============================================================================41# | | (likely) SW42# | + v1 (veth) + v3 (veth) |43# | | 2001:db8:4::2/64 | 2001:db8:5::2/64 |44# +----|---------------------------------------|------------------+45# | |46# +----|--------------------------------+ +----|-------------------------------+47# | + v2 (veth) NS1 (netns) | | + v4 (veth) NS2 (netns) |48# | 2001:db8:4::1/64 | | 2001:db8:5::1/64 |49# | | | |50# | 2001:db8:3::0/64 via 2001:db8:4::2 | | 2001:db8:3::0/64 via 2001:db8:5::2 |51# | 2001:db8:5::1/128 via 2001:db8:4::2 | | 2001:db8:4::1/128 via |52# | | | 2001:db8:5::2 |53# | +-------------------------------+ | | +-------------------------------+ |54# | | BR2 (802.1ad) | | | | BR2 (802.1ad) | |55# | | + vx100 (vxlan) | | | | + vx100 (vxlan) | |56# | | local 2001:db8:4::1 | | | | local 2001:db8:5::1 | |57# | | remote 2001:db8:3::1 | | | | remote 2001:db8:3::1 | |58# | | remote 2001:db8:5::1 | | | | remote 2001:db8:4::1 | |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# | | | 2001:db8:1::3/64 | | | | | 2001:db8:1::4/64 | |72# | | | | | | | | | |73# | | + w2.20 | | | | + w2.20 | |74# | | 2001:db8:2::3/64 | | | | 2001:db8:2::4/64 | |75# | +-------------------------------+ | | +-------------------------------+ |76# +-------------------------------------+ +------------------------------------+77 78: ${VXPORT:=4789}79export VXPORT80 81: ${ALL_TESTS:="82 ping_ipv683 "}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 2001:db8:1::1/6493 vlan_create $h1 20 v$h1 2001:db8:2::1/6494}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 2001:db8:1::2/64109 vlan_create $h2 20 v$h2 2001:db8:2::2/64110}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 2001:db8:3::1/64123 124 ip route add 2001:db8:4::0/64 nexthop via 2001:db8:3::2125 ip route add 2001:db8:5::0/64 nexthop via 2001:db8:3::2126}127 128rp1_unset_addr()129{130 ip route del 2001:db8:5::0/64 nexthop via 2001:db8:3::2131 ip route del 2001:db8:4::0/64 nexthop via 2001:db8:3::2132 133 ip address del dev $rp1 2001:db8:3::1/64134}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 # Make sure the bridge uses the MAC address of the local port and not141 # that of the VxLAN's device.142 ip link set dev br1 address $(mac_get $swp1)143 ip link set dev br1 up144 145 ip link set dev $rp1 up146 rp1_set_addr147 148 ip link add name vx100 type vxlan id 1000 \149 local 2001:db8:3::1 dstport "$VXPORT" \150 nolearning udp6zerocsumrx udp6zerocsumtx tos inherit ttl 100151 ip link set dev vx100 up152 153 ip link set dev vx100 master br1154 bridge vlan add vid 100 dev vx100 pvid untagged155 156 ip link set dev $swp1 master br1157 ip link set dev $swp1 up158 bridge vlan add vid 100 dev $swp1 pvid untagged159 160 ip link set dev $swp2 master br1161 ip link set dev $swp2 up162 bridge vlan add vid 100 dev $swp2 pvid untagged163 164 bridge fdb append dev vx100 00:00:00:00:00:00 dst 2001:db8:4::1 self165 bridge fdb append dev vx100 00:00:00:00:00:00 dst 2001:db8:5::1 self166}167 168switch_destroy()169{170 bridge fdb del dev vx100 00:00:00:00:00:00 dst 2001:db8:5::1 self171 bridge fdb del dev vx100 00:00:00:00:00:00 dst 2001:db8:4::1 self172 173 bridge vlan del vid 100 dev $swp2174 ip link set dev $swp2 down175 ip link set dev $swp2 nomaster176 177 bridge vlan del vid 100 dev $swp1178 ip link set dev $swp1 down179 ip link set dev $swp1 nomaster180 181 ip link set dev vx100 nomaster182 ip link set dev vx100 down183 ip link del dev vx100184 185 rp1_unset_addr186 ip link set dev $rp1 down187 188 ip link set dev br1 down189 ip link del dev br1190}191 192vrp2_create()193{194 simple_if_init $rp2 2001:db8:3::2/64195 __simple_if_init v1 v$rp2 2001:db8:4::2/64196 __simple_if_init v3 v$rp2 2001:db8:5::2/64197 tc qdisc add dev v1 clsact198}199 200vrp2_destroy()201{202 tc qdisc del dev v1 clsact203 __simple_if_fini v3 2001:db8:5::2/64204 __simple_if_fini v1 2001:db8:4::2/64205 simple_if_fini $rp2 2001:db8:3::2/64206}207 208ns_init_common()209{210 local in_if=$1; shift211 local in_addr=$1; shift212 local other_in_addr=$1; shift213 local nh_addr=$1; shift214 local host_addr1=$1; shift215 local host_addr2=$1; shift216 217 ip link set dev $in_if up218 ip address add dev $in_if $in_addr/64219 tc qdisc add dev $in_if clsact220 221 ip link add name br2 type bridge vlan_filtering 1 vlan_protocol 802.1ad \222 vlan_default_pvid 0223 ip link set dev br2 up224 225 ip link add name w1 type veth peer name w2226 227 ip link set dev w1 master br2228 ip link set dev w1 up229 bridge vlan add vid 100 dev w1 pvid untagged230 231 ip link add name vx100 type vxlan id 1000 local $in_addr \232 dstport "$VXPORT" udp6zerocsumrx233 ip link set dev vx100 up234 bridge fdb append dev vx100 00:00:00:00:00:00 dst 2001:db8:3::1 self235 bridge fdb append dev vx100 00:00:00:00:00:00 dst $other_in_addr self236 237 ip link set dev vx100 master br2238 tc qdisc add dev vx100 clsact239 240 bridge vlan add vid 100 dev vx100 pvid untagged241 242 simple_if_init w2243 vlan_create w2 10 vw2 $host_addr1/64244 vlan_create w2 20 vw2 $host_addr2/64245 246 ip route add 2001:db8:3::0/64 nexthop via $nh_addr247 ip route add $other_in_addr/128 nexthop via $nh_addr248}249export -f ns_init_common250 251ns1_create()252{253 ip netns add ns1254 ip link set dev v2 netns ns1255 in_ns ns1 \256 ns_init_common v2 2001:db8:4::1 2001:db8:5::1 2001:db8:4::2 \257 2001:db8:1::3 2001:db8:2::3258}259 260ns1_destroy()261{262 ip netns exec ns1 ip link set dev v2 netns 1263 ip netns del ns1264}265 266ns2_create()267{268 ip netns add ns2269 ip link set dev v4 netns ns2270 in_ns ns2 \271 ns_init_common v4 2001:db8:5::1 2001:db8:4::1 2001:db8:5::2 \272 2001:db8:1::4 2001:db8:2::4273}274 275ns2_destroy()276{277 ip netns exec ns2 ip link set dev v4 netns 1278 ip netns del ns2279}280 281setup_prepare()282{283 h1=${NETIFS[p1]}284 swp1=${NETIFS[p2]}285 286 swp2=${NETIFS[p3]}287 h2=${NETIFS[p4]}288 289 rp1=${NETIFS[p5]}290 rp2=${NETIFS[p6]}291 292 vrf_prepare293 forwarding_enable294 295 h1_create296 h2_create297 switch_create298 299 ip link add name v1 type veth peer name v2300 ip link add name v3 type veth peer name v4301 vrp2_create302 ns1_create303 ns2_create304 305 r1_mac=$(in_ns ns1 mac_get w2)306 r2_mac=$(in_ns ns2 mac_get w2)307 h2_mac=$(mac_get $h2)308}309 310cleanup()311{312 pre_cleanup313 314 ns2_destroy315 ns1_destroy316 vrp2_destroy317 ip link del dev v3318 ip link del dev v1319 320 switch_destroy321 h2_destroy322 h1_destroy323 324 forwarding_restore325 vrf_cleanup326}327 328ping_ipv6()329{330 ping6_test $h1 2001:db8:1::2 ": local->local"331 ping6_test $h1 2001:db8:1::3 ": local->remote 1"332 ping6_test $h1 2001:db8:1::4 ": local->remote 2"333}334 335test_all()336{337 echo "Running tests with UDP port $VXPORT"338 tests_run339}340 341trap cleanup EXIT342 343setup_prepare344setup_wait345test_all346 347exit $EXIT_STATUS348