devlink_trap_l2_drops.sh (9966B)
1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# 4# Test devlink-trap L2 drops functionality over mlxsw. Each registered L2 drop 5# packet trap is tested to make sure it is triggered under the right 6# conditions. 7 8lib_dir=$(dirname $0)/../../../net/forwarding 9 10ALL_TESTS=" 11 source_mac_is_multicast_test 12 vlan_tag_mismatch_test 13 ingress_vlan_filter_test 14 ingress_stp_filter_test 15 port_list_is_empty_test 16 port_loopback_filter_test 17" 18NUM_NETIFS=4 19source $lib_dir/tc_common.sh 20source $lib_dir/lib.sh 21source $lib_dir/devlink_lib.sh 22 23h1_create() 24{ 25 simple_if_init $h1 26} 27 28h1_destroy() 29{ 30 simple_if_fini $h1 31} 32 33h2_create() 34{ 35 simple_if_init $h2 36} 37 38h2_destroy() 39{ 40 simple_if_fini $h2 41} 42 43switch_create() 44{ 45 ip link add dev br0 type bridge vlan_filtering 1 mcast_snooping 0 46 47 ip link set dev $swp1 master br0 48 ip link set dev $swp2 master br0 49 50 ip link set dev br0 up 51 ip link set dev $swp1 up 52 ip link set dev $swp2 up 53 54 tc qdisc add dev $swp2 clsact 55} 56 57switch_destroy() 58{ 59 tc qdisc del dev $swp2 clsact 60 61 ip link set dev $swp2 down 62 ip link set dev $swp1 down 63 64 ip link del dev br0 65} 66 67setup_prepare() 68{ 69 h1=${NETIFS[p1]} 70 swp1=${NETIFS[p2]} 71 72 swp2=${NETIFS[p3]} 73 h2=${NETIFS[p4]} 74 75 vrf_prepare 76 77 h1_create 78 h2_create 79 80 switch_create 81} 82 83cleanup() 84{ 85 pre_cleanup 86 87 switch_destroy 88 89 h2_destroy 90 h1_destroy 91 92 vrf_cleanup 93} 94 95source_mac_is_multicast_test() 96{ 97 local trap_name="source_mac_is_multicast" 98 local smac=01:02:03:04:05:06 99 local mz_pid 100 101 tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \ 102 flower src_mac $smac action drop 103 104 $MZ $h1 -c 0 -p 100 -a $smac -b bcast -t ip -d 1msec -q & 105 mz_pid=$! 106 107 RET=0 108 109 devlink_trap_drop_test $trap_name $swp2 101 110 111 log_test "Source MAC is multicast" 112 113 devlink_trap_drop_cleanup $mz_pid $swp2 ip 1 101 114} 115 116__vlan_tag_mismatch_test() 117{ 118 local trap_name="vlan_tag_mismatch" 119 local dmac=de:ad:be:ef:13:37 120 local opt=$1; shift 121 local mz_pid 122 123 # Remove PVID flag. This should prevent untagged and prio-tagged 124 # packets from entering the bridge. 125 bridge vlan add vid 1 dev $swp1 untagged master 126 127 tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \ 128 flower dst_mac $dmac action drop 129 130 $MZ $h1 "$opt" -c 0 -p 100 -a own -b $dmac -t ip -d 1msec -q & 131 mz_pid=$! 132 133 devlink_trap_drop_test $trap_name $swp2 101 134 135 # Add PVID and make sure packets are no longer dropped. 136 bridge vlan add vid 1 dev $swp1 pvid untagged master 137 devlink_trap_action_set $trap_name "trap" 138 139 devlink_trap_stats_idle_test $trap_name 140 check_err $? "Trap stats not idle when packets should not be dropped" 141 devlink_trap_group_stats_idle_test $(devlink_trap_group_get $trap_name) 142 check_err $? "Trap group stats not idle with when packets should not be dropped" 143 144 tc_check_packets "dev $swp2 egress" 101 0 145 check_fail $? "Packets not forwarded when should" 146 147 devlink_trap_action_set $trap_name "drop" 148 149 devlink_trap_drop_cleanup $mz_pid $swp2 ip 1 101 150} 151 152vlan_tag_mismatch_untagged_test() 153{ 154 RET=0 155 156 __vlan_tag_mismatch_test 157 158 log_test "VLAN tag mismatch - untagged packets" 159} 160 161vlan_tag_mismatch_vid_0_test() 162{ 163 RET=0 164 165 __vlan_tag_mismatch_test "-Q 0" 166 167 log_test "VLAN tag mismatch - prio-tagged packets" 168} 169 170vlan_tag_mismatch_test() 171{ 172 vlan_tag_mismatch_untagged_test 173 vlan_tag_mismatch_vid_0_test 174} 175 176ingress_vlan_filter_test() 177{ 178 local trap_name="ingress_vlan_filter" 179 local dmac=de:ad:be:ef:13:37 180 local mz_pid 181 local vid=10 182 183 bridge vlan add vid $vid dev $swp2 master 184 185 RET=0 186 187 tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \ 188 flower dst_mac $dmac action drop 189 190 $MZ $h1 -Q $vid -c 0 -p 100 -a own -b $dmac -t ip -d 1msec -q & 191 mz_pid=$! 192 193 devlink_trap_drop_test $trap_name $swp2 101 194 195 # Add the VLAN on the bridge port and make sure packets are no longer 196 # dropped. 197 bridge vlan add vid $vid dev $swp1 master 198 devlink_trap_action_set $trap_name "trap" 199 200 devlink_trap_stats_idle_test $trap_name 201 check_err $? "Trap stats not idle when packets should not be dropped" 202 devlink_trap_group_stats_idle_test $(devlink_trap_group_get $trap_name) 203 check_err $? "Trap group stats not idle with when packets should not be dropped" 204 205 tc_check_packets "dev $swp2 egress" 101 0 206 check_fail $? "Packets not forwarded when should" 207 208 devlink_trap_action_set $trap_name "drop" 209 210 log_test "Ingress VLAN filter" 211 212 devlink_trap_drop_cleanup $mz_pid $swp2 ip 1 101 213 214 bridge vlan del vid $vid dev $swp1 master 215 bridge vlan del vid $vid dev $swp2 master 216} 217 218__ingress_stp_filter_test() 219{ 220 local trap_name="ingress_spanning_tree_filter" 221 local dmac=de:ad:be:ef:13:37 222 local state=$1; shift 223 local mz_pid 224 local vid=20 225 226 bridge vlan add vid $vid dev $swp2 master 227 bridge vlan add vid $vid dev $swp1 master 228 ip link set dev $swp1 type bridge_slave state $state 229 230 tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \ 231 flower dst_mac $dmac action drop 232 233 $MZ $h1 -Q $vid -c 0 -p 100 -a own -b $dmac -t ip -d 1msec -q & 234 mz_pid=$! 235 236 devlink_trap_drop_test $trap_name $swp2 101 237 238 # Change STP state to forwarding and make sure packets are no longer 239 # dropped. 240 ip link set dev $swp1 type bridge_slave state 3 241 devlink_trap_action_set $trap_name "trap" 242 243 devlink_trap_stats_idle_test $trap_name 244 check_err $? "Trap stats not idle when packets should not be dropped" 245 devlink_trap_group_stats_idle_test $(devlink_trap_group_get $trap_name) 246 check_err $? "Trap group stats not idle with when packets should not be dropped" 247 248 tc_check_packets "dev $swp2 egress" 101 0 249 check_fail $? "Packets not forwarded when should" 250 251 devlink_trap_action_set $trap_name "drop" 252 253 devlink_trap_drop_cleanup $mz_pid $swp2 ip 1 101 254 255 bridge vlan del vid $vid dev $swp1 master 256 bridge vlan del vid $vid dev $swp2 master 257} 258 259ingress_stp_filter_listening_test() 260{ 261 local state=$1; shift 262 263 RET=0 264 265 __ingress_stp_filter_test $state 266 267 log_test "Ingress STP filter - listening state" 268} 269 270ingress_stp_filter_learning_test() 271{ 272 local state=$1; shift 273 274 RET=0 275 276 __ingress_stp_filter_test $state 277 278 log_test "Ingress STP filter - learning state" 279} 280 281ingress_stp_filter_test() 282{ 283 ingress_stp_filter_listening_test 1 284 ingress_stp_filter_learning_test 2 285} 286 287port_list_is_empty_uc_test() 288{ 289 local trap_name="port_list_is_empty" 290 local dmac=de:ad:be:ef:13:37 291 local mz_pid 292 293 # Disable unicast flooding on both ports, so that packets cannot egress 294 # any port. 295 ip link set dev $swp1 type bridge_slave flood off 296 ip link set dev $swp2 type bridge_slave flood off 297 298 RET=0 299 300 tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \ 301 flower dst_mac $dmac action drop 302 303 $MZ $h1 -c 0 -p 100 -a own -b $dmac -t ip -d 1msec -q & 304 mz_pid=$! 305 306 devlink_trap_drop_test $trap_name $swp2 101 307 308 # Allow packets to be flooded to one port. 309 ip link set dev $swp2 type bridge_slave flood on 310 devlink_trap_action_set $trap_name "trap" 311 312 devlink_trap_stats_idle_test $trap_name 313 check_err $? "Trap stats not idle when packets should not be dropped" 314 devlink_trap_group_stats_idle_test $(devlink_trap_group_get $trap_name) 315 check_err $? "Trap group stats not idle with when packets should not be dropped" 316 317 tc_check_packets "dev $swp2 egress" 101 0 318 check_fail $? "Packets not forwarded when should" 319 320 devlink_trap_action_set $trap_name "drop" 321 322 log_test "Port list is empty - unicast" 323 324 devlink_trap_drop_cleanup $mz_pid $swp2 ip 1 101 325 326 ip link set dev $swp1 type bridge_slave flood on 327} 328 329port_list_is_empty_mc_test() 330{ 331 local trap_name="port_list_is_empty" 332 local dmac=01:00:5e:00:00:01 333 local dip=239.0.0.1 334 local mz_pid 335 336 # Disable multicast flooding on both ports, so that packets cannot 337 # egress any port. We also need to flush IP addresses from the bridge 338 # in order to prevent packets from being flooded to the router port. 339 ip link set dev $swp1 type bridge_slave mcast_flood off 340 ip link set dev $swp2 type bridge_slave mcast_flood off 341 ip address flush dev br0 342 343 RET=0 344 345 tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \ 346 flower dst_mac $dmac action drop 347 348 $MZ $h1 -c 0 -p 100 -a own -b $dmac -t ip -B $dip -d 1msec -q & 349 mz_pid=$! 350 351 devlink_trap_drop_test $trap_name $swp2 101 352 353 # Allow packets to be flooded to one port. 354 ip link set dev $swp2 type bridge_slave mcast_flood on 355 devlink_trap_action_set $trap_name "trap" 356 357 devlink_trap_stats_idle_test $trap_name 358 check_err $? "Trap stats not idle when packets should not be dropped" 359 devlink_trap_group_stats_idle_test $(devlink_trap_group_get $trap_name) 360 check_err $? "Trap group stats not idle with when packets should not be dropped" 361 362 tc_check_packets "dev $swp2 egress" 101 0 363 check_fail $? "Packets not forwarded when should" 364 365 devlink_trap_action_set $trap_name "drop" 366 367 log_test "Port list is empty - multicast" 368 369 devlink_trap_drop_cleanup $mz_pid $swp2 ip 1 101 370 371 ip link set dev $swp1 type bridge_slave mcast_flood on 372} 373 374port_list_is_empty_test() 375{ 376 port_list_is_empty_uc_test 377 port_list_is_empty_mc_test 378} 379 380port_loopback_filter_uc_test() 381{ 382 local trap_name="port_loopback_filter" 383 local dmac=de:ad:be:ef:13:37 384 local mz_pid 385 386 # Make sure packets can only egress the input port. 387 ip link set dev $swp2 type bridge_slave flood off 388 389 RET=0 390 391 tc filter add dev $swp2 egress protocol ip pref 1 handle 101 \ 392 flower dst_mac $dmac action drop 393 394 $MZ $h1 -c 0 -p 100 -a own -b $dmac -t ip -d 1msec -q & 395 mz_pid=$! 396 397 devlink_trap_drop_test $trap_name $swp2 101 398 399 # Allow packets to be flooded. 400 ip link set dev $swp2 type bridge_slave flood on 401 devlink_trap_action_set $trap_name "trap" 402 403 devlink_trap_stats_idle_test $trap_name 404 check_err $? "Trap stats not idle when packets should not be dropped" 405 devlink_trap_group_stats_idle_test $(devlink_trap_group_get $trap_name) 406 check_err $? "Trap group stats not idle with when packets should not be dropped" 407 408 tc_check_packets "dev $swp2 egress" 101 0 409 check_fail $? "Packets not forwarded when should" 410 411 devlink_trap_action_set $trap_name "drop" 412 413 log_test "Port loopback filter - unicast" 414 415 devlink_trap_drop_cleanup $mz_pid $swp2 ip 1 101 416} 417 418port_loopback_filter_test() 419{ 420 port_loopback_filter_uc_test 421} 422 423trap cleanup EXIT 424 425setup_prepare 426setup_wait 427 428tests_run 429 430exit $EXIT_STATUS