Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: forwarding: Add test for dual VxLAN bridge

Configure VxLAN with an 802.1ad bridge and VxLAN with an 802.1d bridge
at the same time in same switch, verify that traffic passed as expected.

Signed-off-by: Amit Cohen <amcohen@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Amit Cohen and committed by
David S. Miller
35f15ab3 bf677bd2

+366
+366
tools/testing/selftests/net/forwarding/dual_vxlan_bridge.sh
··· 1 + #!/bin/bash 2 + # SPDX-License-Identifier: GPL-2.0 3 + 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) HW 39 + # ============================================================================= 40 + # | | (likely) SW 41 + # | + 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} 77 + export VXPORT 78 + 79 + : ${ALL_TESTS:=" 80 + ping_ipv4 81 + "} 82 + 83 + NUM_NETIFS=6 84 + source lib.sh 85 + 86 + h1_create() 87 + { 88 + simple_if_init $h1 89 + tc qdisc add dev $h1 clsact 90 + vlan_create $h1 10 v$h1 192.0.2.1/28 91 + } 92 + 93 + h1_destroy() 94 + { 95 + vlan_destroy $h1 10 96 + tc qdisc del dev $h1 clsact 97 + simple_if_fini $h1 98 + } 99 + 100 + h2_create() 101 + { 102 + simple_if_init $h2 103 + tc qdisc add dev $h2 clsact 104 + vlan_create $h2 20 v$h2 192.0.2.2/28 105 + } 106 + 107 + h2_destroy() 108 + { 109 + vlan_destroy $h2 20 110 + tc qdisc del dev $h2 clsact 111 + simple_if_fini $h2 112 + } 113 + 114 + rp1_set_addr() 115 + { 116 + ip address add dev $rp1 192.0.2.17/28 117 + 118 + ip route add 192.0.2.32/28 nexthop via 192.0.2.18 119 + ip route add 192.0.2.48/28 nexthop via 192.0.2.18 120 + } 121 + 122 + rp1_unset_addr() 123 + { 124 + ip route del 192.0.2.48/28 nexthop via 192.0.2.18 125 + ip route del 192.0.2.32/28 nexthop via 192.0.2.18 126 + 127 + ip address del dev $rp1 192.0.2.17/28 128 + } 129 + 130 + switch_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 0 135 + # Make sure the bridge uses the MAC address of the local port and not 136 + # that of the VxLAN's device. 137 + ip link set dev br1 address $(mac_get $swp1) 138 + ip link set dev br1 up 139 + 140 + #### BR2 #### 141 + ip link add name br2 type bridge vlan_filtering 0 mcast_snooping 0 142 + # Make sure the bridge uses the MAC address of the local port and not 143 + # that of the VxLAN's device. 144 + ip link set dev br2 address $(mac_get $swp2) 145 + ip link set dev br2 up 146 + 147 + ip link set dev $rp1 up 148 + rp1_set_addr 149 + 150 + #### VX100 #### 151 + ip link add name vx100 type vxlan id 1000 local 192.0.2.17 \ 152 + dstport "$VXPORT" nolearning noudpcsum tos inherit ttl 100 153 + ip link set dev vx100 up 154 + 155 + ip link set dev vx100 master br1 156 + bridge vlan add vid 100 dev vx100 pvid untagged 157 + 158 + ip link set dev $swp1 master br1 159 + ip link set dev $swp1 up 160 + bridge vlan add vid 100 dev $swp1 pvid untagged 161 + 162 + #### VX200 #### 163 + ip link add name vx200 type vxlan id 2000 local 192.0.2.17 \ 164 + dstport "$VXPORT" nolearning noudpcsum tos inherit ttl 100 165 + ip link set dev vx200 up 166 + 167 + ip link set dev vx200 master br2 168 + 169 + ip link set dev $swp2 up 170 + ip link add name $swp2.20 link $swp2 type vlan id 20 171 + ip link set dev $swp2.20 master br2 172 + ip link set dev $swp2.20 up 173 + 174 + bridge fdb append dev vx100 00:00:00:00:00:00 dst 192.0.2.34 self 175 + bridge fdb append dev vx200 00:00:00:00:00:00 dst 192.0.2.50 self 176 + } 177 + 178 + switch_destroy() 179 + { 180 + bridge fdb del dev vx200 00:00:00:00:00:00 dst 192.0.2.50 self 181 + bridge fdb del dev vx100 00:00:00:00:00:00 dst 192.0.2.34 self 182 + 183 + ip link set dev vx200 nomaster 184 + ip link set dev vx200 down 185 + ip link del dev vx200 186 + 187 + ip link del dev $swp2.20 188 + ip link set dev $swp2 down 189 + ip link set dev $swp2 nomaster 190 + 191 + bridge vlan del vid 100 dev $swp1 192 + ip link set dev $swp1 down 193 + ip link set dev $swp1 nomaster 194 + 195 + ip link set dev vx100 nomaster 196 + ip link set dev vx100 down 197 + ip link del dev vx100 198 + 199 + rp1_unset_addr 200 + ip link set dev $rp1 down 201 + 202 + ip link set dev br2 down 203 + ip link del dev br2 204 + 205 + ip link set dev br1 down 206 + ip link del dev br1 207 + } 208 + 209 + vrp2_create() 210 + { 211 + simple_if_init $rp2 192.0.2.18/28 212 + __simple_if_init v1 v$rp2 192.0.2.33/28 213 + __simple_if_init v3 v$rp2 192.0.2.49/28 214 + tc qdisc add dev v1 clsact 215 + } 216 + 217 + vrp2_destroy() 218 + { 219 + tc qdisc del dev v1 clsact 220 + __simple_if_fini v3 192.0.2.49/28 221 + __simple_if_fini v1 192.0.2.33/28 222 + simple_if_fini $rp2 192.0.2.18/28 223 + } 224 + 225 + ns_init_common() 226 + { 227 + local in_if=$1; shift 228 + local in_addr=$1; shift 229 + local other_in_addr=$1; shift 230 + local vxlan_name=$1; shift 231 + local vxlan_id=$1; shift 232 + local vlan_id=$1; shift 233 + local host_addr=$1; shift 234 + local nh_addr=$1; shift 235 + 236 + ip link set dev $in_if up 237 + ip address add dev $in_if $in_addr/28 238 + tc qdisc add dev $in_if clsact 239 + 240 + ip link add name br3 type bridge vlan_filtering 0 241 + ip link set dev br3 up 242 + 243 + ip link add name w1 type veth peer name w2 244 + 245 + ip link set dev w1 master br3 246 + ip link set dev w1 up 247 + 248 + ip link add name $vxlan_name type vxlan id $vxlan_id local $in_addr \ 249 + dstport "$VXPORT" 250 + ip link set dev $vxlan_name up 251 + bridge fdb append dev $vxlan_name 00:00:00:00:00:00 dst 192.0.2.17 self 252 + bridge fdb append dev $vxlan_name 00:00:00:00:00:00 dst $other_in_addr self 253 + 254 + ip link set dev $vxlan_name master br3 255 + tc qdisc add dev $vxlan_name clsact 256 + 257 + simple_if_init w2 258 + vlan_create w2 $vlan_id vw2 $host_addr/28 259 + 260 + ip route add 192.0.2.16/28 nexthop via $nh_addr 261 + ip route add $other_in_addr/32 nexthop via $nh_addr 262 + } 263 + export -f ns_init_common 264 + 265 + ns1_create() 266 + { 267 + ip netns add ns1 268 + ip link set dev v2 netns ns1 269 + in_ns ns1 \ 270 + ns_init_common v2 192.0.2.34 192.0.2.50 vx100 1000 10 192.0.2.3 \ 271 + 192.0.2.33 272 + 273 + in_ns ns1 bridge vlan add vid 100 dev vx100 pvid untagged 274 + } 275 + 276 + ns1_destroy() 277 + { 278 + ip netns exec ns1 ip link set dev v2 netns 1 279 + ip netns del ns1 280 + } 281 + 282 + ns2_create() 283 + { 284 + ip netns add ns2 285 + ip link set dev v4 netns ns2 286 + in_ns ns2 \ 287 + ns_init_common v4 192.0.2.50 192.0.2.34 vx200 2000 20 192.0.2.4 \ 288 + 192.0.2.49 289 + 290 + in_ns ns2 ip link add name w1.20 link w1 type vlan id 20 291 + in_ns ns2 ip link set dev w1.20 master br3 292 + in_ns ns2 ip link set dev w1.20 up 293 + } 294 + 295 + ns2_destroy() 296 + { 297 + ip netns exec ns2 ip link set dev v4 netns 1 298 + ip netns del ns2 299 + } 300 + 301 + setup_prepare() 302 + { 303 + h1=${NETIFS[p1]} 304 + swp1=${NETIFS[p2]} 305 + 306 + swp2=${NETIFS[p3]} 307 + h2=${NETIFS[p4]} 308 + 309 + rp1=${NETIFS[p5]} 310 + rp2=${NETIFS[p6]} 311 + 312 + vrf_prepare 313 + forwarding_enable 314 + 315 + h1_create 316 + h2_create 317 + switch_create 318 + 319 + ip link add name v1 type veth peer name v2 320 + ip link add name v3 type veth peer name v4 321 + vrp2_create 322 + ns1_create 323 + ns2_create 324 + 325 + r1_mac=$(in_ns ns1 mac_get w2) 326 + r2_mac=$(in_ns ns2 mac_get w2) 327 + h2_mac=$(mac_get $h2) 328 + } 329 + 330 + cleanup() 331 + { 332 + pre_cleanup 333 + 334 + ns2_destroy 335 + ns1_destroy 336 + vrp2_destroy 337 + ip link del dev v3 338 + ip link del dev v1 339 + 340 + switch_destroy 341 + h2_destroy 342 + h1_destroy 343 + 344 + forwarding_restore 345 + vrf_cleanup 346 + } 347 + 348 + ping_ipv4() 349 + { 350 + ping_test $h1 192.0.2.3 ": local->remote 1 through VxLAN with an 802.1ad bridge" 351 + ping_test $h2 192.0.2.4 ": local->remote 2 through VxLAN with an 802.1d bridge" 352 + } 353 + 354 + test_all() 355 + { 356 + echo "Running tests with UDP port $VXPORT" 357 + tests_run 358 + } 359 + 360 + trap cleanup EXIT 361 + 362 + setup_prepare 363 + setup_wait 364 + test_all 365 + 366 + exit $EXIT_STATUS