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

selftests: router_bridge_lag: Add a new selftest

Add a selftest to verify that routing through a bridge works when LAG is
used instead of physical ports.

Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Danielle Ratson <danieller@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Petr Machata and committed by
David S. Miller
3f0c4e70 49e15dec

+324
+1
tools/testing/selftests/net/forwarding/Makefile
··· 65 65 q_in_vni.sh \ 66 66 router_bridge.sh \ 67 67 router_bridge_1d.sh \ 68 + router_bridge_lag.sh \ 68 69 router_bridge_vlan.sh \ 69 70 router_bridge_vlan_upper.sh \ 70 71 router_bridge_pvid_vlan_upper.sh \
+323
tools/testing/selftests/net/forwarding/router_bridge_lag.sh
··· 1 + #!/bin/bash 2 + # SPDX-License-Identifier: GPL-2.0 3 + 4 + # +----------------------------+ +--------------------------+ 5 + # | H1 (vrf) | | H2 (vrf) | 6 + # | | | | 7 + # | + LAG1 (team) | | + LAG4 (team) | 8 + # | | 192.0.2.1/28 | | | 192.0.2.130/28 | 9 + # | | 2001:db8:1::1/64 | | | 2001:db8:2::2/64 | 10 + # | __^___ | | __^_____ | 11 + # | / \ | | / \ | 12 + # | + $h1 + $h4 | | + $h2 + $h3 | 13 + # | | | | | | | | 14 + # +----|--------|--------------+ +-|----------|-------------+ 15 + # | | | | 16 + # +----|--------|------------------------------------|----------|-------------+ 17 + # | SW | | | | | 18 + # | + $swp1 + $swp4 + $swp2 + $swp3 | 19 + # | \__ ___/ \__ _____/ | 20 + # | v v | 21 + # | +------|-------------------------------+ | | 22 + # | | + LAG2 BR1 (802.1q) | + LAG3 (team) | 23 + # | | (team) 192.0.2.2/28 | 192.0.2.129/28 | 24 + # | | 2001:db8:1::2/64 | 2001:db8:2::1/64 | 25 + # | | | | 26 + # | +--------------------------------------+ | 27 + # +---------------------------------------------------------------------------+ 28 + 29 + : ${ALL_TESTS:=" 30 + ping_ipv4 31 + ping_ipv6 32 + 33 + $(: exercise remastering of LAG2 slaves ) 34 + config_deslave_swp4 35 + config_wait 36 + ping_ipv4 37 + ping_ipv6 38 + config_enslave_swp4 39 + config_deslave_swp1 40 + config_wait 41 + ping_ipv4 42 + ping_ipv6 43 + config_deslave_swp4 44 + config_enslave_swp1 45 + config_enslave_swp4 46 + config_wait 47 + ping_ipv4 48 + ping_ipv6 49 + 50 + $(: exercise remastering of LAG2 itself ) 51 + config_remaster_lag2 52 + config_wait 53 + ping_ipv4 54 + ping_ipv6 55 + 56 + $(: exercise remastering of LAG3 slaves ) 57 + config_deslave_swp2 58 + config_wait 59 + ping_ipv4 60 + ping_ipv6 61 + config_enslave_swp2 62 + config_deslave_swp3 63 + config_wait 64 + ping_ipv4 65 + ping_ipv6 66 + config_deslave_swp2 67 + config_enslave_swp3 68 + config_enslave_swp2 69 + config_wait 70 + ping_ipv4 71 + ping_ipv6 72 + 73 + $(: move LAG3 to a bridge and then out ) 74 + config_remaster_lag3 75 + config_wait 76 + ping_ipv4 77 + ping_ipv6 78 + "} 79 + NUM_NETIFS=8 80 + : ${lib_dir:=.} 81 + source $lib_dir/lib.sh 82 + $EXTRA_SOURCE 83 + 84 + h1_create() 85 + { 86 + team_create lag1 lacp 87 + ip link set dev lag1 address $(mac_get $h1) 88 + ip link set dev $h1 master lag1 89 + ip link set dev $h4 master lag1 90 + simple_if_init lag1 192.0.2.1/28 2001:db8:1::1/64 91 + ip link set dev $h1 up 92 + ip link set dev $h4 up 93 + ip -4 route add 192.0.2.128/28 vrf vlag1 nexthop via 192.0.2.2 94 + ip -6 route add 2001:db8:2::/64 vrf vlag1 nexthop via 2001:db8:1::2 95 + } 96 + 97 + h1_destroy() 98 + { 99 + ip -6 route del 2001:db8:2::/64 vrf vlag1 100 + ip -4 route del 192.0.2.128/28 vrf vlag1 101 + ip link set dev $h4 down 102 + ip link set dev $h1 down 103 + simple_if_fini lag1 192.0.2.1/28 2001:db8:1::1/64 104 + ip link set dev $h4 nomaster 105 + ip link set dev $h1 nomaster 106 + team_destroy lag1 107 + } 108 + 109 + h2_create() 110 + { 111 + team_create lag4 lacp 112 + ip link set dev lag4 address $(mac_get $h2) 113 + ip link set dev $h2 master lag4 114 + ip link set dev $h3 master lag4 115 + simple_if_init lag4 192.0.2.130/28 2001:db8:2::2/64 116 + ip link set dev $h2 up 117 + ip link set dev $h3 up 118 + ip -4 route add 192.0.2.0/28 vrf vlag4 nexthop via 192.0.2.129 119 + ip -6 route add 2001:db8:1::/64 vrf vlag4 nexthop via 2001:db8:2::1 120 + } 121 + 122 + h2_destroy() 123 + { 124 + ip -6 route del 2001:db8:1::/64 vrf vlag4 125 + ip -4 route del 192.0.2.0/28 vrf vlag4 126 + ip link set dev $h3 down 127 + ip link set dev $h2 down 128 + simple_if_fini lag4 192.0.2.130/28 2001:db8:2::2/64 129 + ip link set dev $h3 nomaster 130 + ip link set dev $h2 nomaster 131 + team_destroy lag4 132 + } 133 + 134 + router_create() 135 + { 136 + team_create lag2 lacp 137 + ip link set dev lag2 address $(mac_get $swp1) 138 + ip link set dev $swp1 master lag2 139 + ip link set dev $swp4 master lag2 140 + 141 + ip link add name br1 address $(mac_get lag2) \ 142 + type bridge vlan_filtering 1 143 + ip link set dev lag2 master br1 144 + 145 + ip link set dev $swp1 up 146 + ip link set dev $swp4 up 147 + ip link set dev br1 up 148 + 149 + __addr_add_del br1 add 192.0.2.2/28 2001:db8:1::2/64 150 + 151 + team_create lag3 lacp 152 + ip link set dev lag3 address $(mac_get $swp2) 153 + ip link set dev $swp2 master lag3 154 + ip link set dev $swp3 master lag3 155 + ip link set dev $swp2 up 156 + ip link set dev $swp3 up 157 + __addr_add_del lag3 add 192.0.2.129/28 2001:db8:2::1/64 158 + } 159 + 160 + router_destroy() 161 + { 162 + __addr_add_del lag3 del 192.0.2.129/28 2001:db8:2::1/64 163 + ip link set dev $swp3 down 164 + ip link set dev $swp2 down 165 + ip link set dev $swp3 nomaster 166 + ip link set dev $swp2 nomaster 167 + team_destroy lag3 168 + 169 + __addr_add_del br1 del 192.0.2.2/28 2001:db8:1::2/64 170 + 171 + ip link set dev $swp4 down 172 + ip link set dev $swp1 down 173 + ip link set dev br1 down 174 + 175 + ip link set dev lag2 nomaster 176 + ip link del dev br1 177 + 178 + ip link set dev $swp4 nomaster 179 + ip link set dev $swp1 nomaster 180 + team_destroy lag2 181 + } 182 + 183 + config_remaster_lag2() 184 + { 185 + log_info "Remaster bridge slave" 186 + 187 + ip link set dev lag2 nomaster 188 + sleep 2 189 + ip link set dev lag2 master br1 190 + } 191 + 192 + config_remaster_lag3() 193 + { 194 + log_info "Move lag3 to the bridge, then out again" 195 + 196 + ip link set dev lag3 master br1 197 + sleep 2 198 + ip link set dev lag3 nomaster 199 + } 200 + 201 + config_deslave() 202 + { 203 + local netdev=$1; shift 204 + 205 + log_info "Deslave $netdev" 206 + ip link set dev $netdev down 207 + ip link set dev $netdev nomaster 208 + ip link set dev $netdev up 209 + } 210 + 211 + config_deslave_swp1() 212 + { 213 + config_deslave $swp1 214 + } 215 + 216 + config_deslave_swp2() 217 + { 218 + config_deslave $swp2 219 + } 220 + 221 + config_deslave_swp3() 222 + { 223 + config_deslave $swp3 224 + } 225 + 226 + config_deslave_swp4() 227 + { 228 + config_deslave $swp4 229 + } 230 + 231 + config_enslave() 232 + { 233 + local netdev=$1; shift 234 + local master=$1; shift 235 + 236 + log_info "Enslave $netdev to $master" 237 + ip link set dev $netdev down 238 + ip link set dev $netdev master $master 239 + ip link set dev $netdev up 240 + } 241 + 242 + config_enslave_swp1() 243 + { 244 + config_enslave $swp1 lag2 245 + } 246 + 247 + config_enslave_swp2() 248 + { 249 + config_enslave $swp2 lag3 250 + } 251 + 252 + config_enslave_swp3() 253 + { 254 + config_enslave $swp3 lag3 255 + } 256 + 257 + config_enslave_swp4() 258 + { 259 + config_enslave $swp4 lag2 260 + } 261 + 262 + config_wait() 263 + { 264 + setup_wait_dev lag2 265 + setup_wait_dev lag3 266 + } 267 + 268 + setup_prepare() 269 + { 270 + h1=${NETIFS[p1]} 271 + swp1=${NETIFS[p2]} 272 + 273 + swp2=${NETIFS[p3]} 274 + h2=${NETIFS[p4]} 275 + 276 + swp3=${NETIFS[p5]} 277 + h3=${NETIFS[p6]} 278 + 279 + h4=${NETIFS[p7]} 280 + swp4=${NETIFS[p8]} 281 + 282 + vrf_prepare 283 + 284 + h1_create 285 + h2_create 286 + 287 + router_create 288 + 289 + forwarding_enable 290 + } 291 + 292 + cleanup() 293 + { 294 + pre_cleanup 295 + 296 + forwarding_restore 297 + 298 + router_destroy 299 + 300 + h2_destroy 301 + h1_destroy 302 + 303 + vrf_cleanup 304 + } 305 + 306 + ping_ipv4() 307 + { 308 + ping_test lag1 192.0.2.130 309 + } 310 + 311 + ping_ipv6() 312 + { 313 + ping6_test lag1 2001:db8:2::2 314 + } 315 + 316 + trap cleanup EXIT 317 + 318 + setup_prepare 319 + setup_wait 320 + 321 + tests_run 322 + 323 + exit $EXIT_STATUS