1d3e985c9SAmit Cohen#!/bin/bash 2d3e985c9SAmit Cohen# SPDX-License-Identifier: GPL-2.0 3d3e985c9SAmit Cohen# 4d3e985c9SAmit Cohen# Test devlink-trap L3 drops functionality over mlxsw. Each registered L3 drop 5d3e985c9SAmit Cohen# packet trap is tested to make sure it is triggered under the right 6d3e985c9SAmit Cohen# conditions. 7d3e985c9SAmit Cohen 8d3e985c9SAmit Cohen# +---------------------------------+ 9d3e985c9SAmit Cohen# | H1 (vrf) | 10d3e985c9SAmit Cohen# | + $h1 | 11d3e985c9SAmit Cohen# | | 192.0.2.1/24 | 12d3e985c9SAmit Cohen# | | 2001:db8:1::1/64 | 13d3e985c9SAmit Cohen# | | | 14d3e985c9SAmit Cohen# | | default via 192.0.2.2 | 15d3e985c9SAmit Cohen# | | default via 2001:db8:1::2 | 16d3e985c9SAmit Cohen# +----|----------------------------+ 17d3e985c9SAmit Cohen# | 18d3e985c9SAmit Cohen# +----|----------------------------------------------------------------------+ 19d3e985c9SAmit Cohen# | SW | | 20d3e985c9SAmit Cohen# | + $rp1 | 21d3e985c9SAmit Cohen# | 192.0.2.2/24 | 22d3e985c9SAmit Cohen# | 2001:db8:1::2/64 | 23d3e985c9SAmit Cohen# | | 24d3e985c9SAmit Cohen# | 2001:db8:2::2/64 | 25d3e985c9SAmit Cohen# | 198.51.100.2/24 | 26d3e985c9SAmit Cohen# | + $rp2 | 27d3e985c9SAmit Cohen# | | | 28d3e985c9SAmit Cohen# +----|----------------------------------------------------------------------+ 29d3e985c9SAmit Cohen# | 30d3e985c9SAmit Cohen# +----|----------------------------+ 31d3e985c9SAmit Cohen# | | default via 198.51.100.2 | 32d3e985c9SAmit Cohen# | | default via 2001:db8:2::2 | 33d3e985c9SAmit Cohen# | | | 34d3e985c9SAmit Cohen# | | 2001:db8:2::1/64 | 35d3e985c9SAmit Cohen# | | 198.51.100.1/24 | 36d3e985c9SAmit Cohen# | + $h2 | 37d3e985c9SAmit Cohen# | H2 (vrf) | 38d3e985c9SAmit Cohen# +---------------------------------+ 39d3e985c9SAmit Cohen 40d3e985c9SAmit Cohenlib_dir=$(dirname $0)/../../../net/forwarding 41d3e985c9SAmit Cohen 42d3e985c9SAmit CohenALL_TESTS=" 43d3e985c9SAmit Cohen non_ip_test 44d3e985c9SAmit Cohen uc_dip_over_mc_dmac_test 45d3e985c9SAmit Cohen dip_is_loopback_test 46d3e985c9SAmit Cohen sip_is_mc_test 47d3e985c9SAmit Cohen sip_is_loopback_test 48d3e985c9SAmit Cohen ip_header_corrupted_test 49d3e985c9SAmit Cohen ipv4_sip_is_limited_bc_test 50d3e985c9SAmit Cohen ipv6_mc_dip_reserved_scope_test 51d3e985c9SAmit Cohen ipv6_mc_dip_interface_local_scope_test 52d3e985c9SAmit Cohen blackhole_route_test 53740e87bcSAmit Cohen irif_disabled_test 54740e87bcSAmit Cohen erif_disabled_test 5584e8feeaSIdo Schimmel blackhole_nexthop_test 56d3e985c9SAmit Cohen" 57d3e985c9SAmit Cohen 58d3e985c9SAmit CohenNUM_NETIFS=4 59d3e985c9SAmit Cohensource $lib_dir/lib.sh 60d3e985c9SAmit Cohensource $lib_dir/tc_common.sh 61d3e985c9SAmit Cohensource $lib_dir/devlink_lib.sh 62d3e985c9SAmit Cohen 63d3e985c9SAmit Cohenh1_create() 64d3e985c9SAmit Cohen{ 65d3e985c9SAmit Cohen simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/64 66d3e985c9SAmit Cohen 67d3e985c9SAmit Cohen ip -4 route add default vrf v$h1 nexthop via 192.0.2.2 68d3e985c9SAmit Cohen ip -6 route add default vrf v$h1 nexthop via 2001:db8:1::2 69d3e985c9SAmit Cohen} 70d3e985c9SAmit Cohen 71d3e985c9SAmit Cohenh1_destroy() 72d3e985c9SAmit Cohen{ 73d3e985c9SAmit Cohen ip -6 route del default vrf v$h1 nexthop via 2001:db8:1::2 74d3e985c9SAmit Cohen ip -4 route del default vrf v$h1 nexthop via 192.0.2.2 75d3e985c9SAmit Cohen 76d3e985c9SAmit Cohen simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/64 77d3e985c9SAmit Cohen} 78d3e985c9SAmit Cohen 79d3e985c9SAmit Cohenh2_create() 80d3e985c9SAmit Cohen{ 81d3e985c9SAmit Cohen simple_if_init $h2 $h2_ipv4/24 $h2_ipv6/64 82d3e985c9SAmit Cohen 83d3e985c9SAmit Cohen ip -4 route add default vrf v$h2 nexthop via 198.51.100.2 84d3e985c9SAmit Cohen ip -6 route add default vrf v$h2 nexthop via 2001:db8:2::2 85d3e985c9SAmit Cohen} 86d3e985c9SAmit Cohen 87d3e985c9SAmit Cohenh2_destroy() 88d3e985c9SAmit Cohen{ 89d3e985c9SAmit Cohen ip -6 route del default vrf v$h2 nexthop via 2001:db8:2::2 90d3e985c9SAmit Cohen ip -4 route del default vrf v$h2 nexthop via 198.51.100.2 91d3e985c9SAmit Cohen 92d3e985c9SAmit Cohen simple_if_fini $h2 $h2_ipv4/24 $h2_ipv6/64 93d3e985c9SAmit Cohen} 94d3e985c9SAmit Cohen 95d3e985c9SAmit Cohenrouter_create() 96d3e985c9SAmit Cohen{ 97d3e985c9SAmit Cohen ip link set dev $rp1 up 98d3e985c9SAmit Cohen ip link set dev $rp2 up 99d3e985c9SAmit Cohen 100d3e985c9SAmit Cohen tc qdisc add dev $rp2 clsact 101d3e985c9SAmit Cohen 102d3e985c9SAmit Cohen __addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64 103d3e985c9SAmit Cohen __addr_add_del $rp2 add 198.51.100.2/24 2001:db8:2::2/64 104d3e985c9SAmit Cohen} 105d3e985c9SAmit Cohen 106d3e985c9SAmit Cohenrouter_destroy() 107d3e985c9SAmit Cohen{ 108d3e985c9SAmit Cohen __addr_add_del $rp2 del 198.51.100.2/24 2001:db8:2::2/64 109d3e985c9SAmit Cohen __addr_add_del $rp1 del 192.0.2.2/24 2001:db8:1::2/64 110d3e985c9SAmit Cohen 111d3e985c9SAmit Cohen tc qdisc del dev $rp2 clsact 112e67dfb8dSAmit Cohen 113e67dfb8dSAmit Cohen ip link set dev $rp2 down 114e67dfb8dSAmit Cohen ip link set dev $rp1 down 115d3e985c9SAmit Cohen} 116d3e985c9SAmit Cohen 117d3e985c9SAmit Cohensetup_prepare() 118d3e985c9SAmit Cohen{ 119d3e985c9SAmit Cohen h1=${NETIFS[p1]} 120d3e985c9SAmit Cohen rp1=${NETIFS[p2]} 121d3e985c9SAmit Cohen 122d3e985c9SAmit Cohen rp2=${NETIFS[p3]} 123d3e985c9SAmit Cohen h2=${NETIFS[p4]} 124d3e985c9SAmit Cohen 125d3e985c9SAmit Cohen h1mac=$(mac_get $h1) 126d3e985c9SAmit Cohen rp1mac=$(mac_get $rp1) 127d3e985c9SAmit Cohen 128d3e985c9SAmit Cohen h1_ipv4=192.0.2.1 129d3e985c9SAmit Cohen h2_ipv4=198.51.100.1 130d3e985c9SAmit Cohen h1_ipv6=2001:db8:1::1 131d3e985c9SAmit Cohen h2_ipv6=2001:db8:2::1 132d3e985c9SAmit Cohen 133d3e985c9SAmit Cohen vrf_prepare 134d3e985c9SAmit Cohen forwarding_enable 135d3e985c9SAmit Cohen 136d3e985c9SAmit Cohen h1_create 137d3e985c9SAmit Cohen h2_create 138d3e985c9SAmit Cohen 139d3e985c9SAmit Cohen router_create 140d3e985c9SAmit Cohen} 141d3e985c9SAmit Cohen 142d3e985c9SAmit Cohencleanup() 143d3e985c9SAmit Cohen{ 144d3e985c9SAmit Cohen pre_cleanup 145d3e985c9SAmit Cohen 146d3e985c9SAmit Cohen router_destroy 147d3e985c9SAmit Cohen 148d3e985c9SAmit Cohen h2_destroy 149d3e985c9SAmit Cohen h1_destroy 150d3e985c9SAmit Cohen 151d3e985c9SAmit Cohen forwarding_restore 152d3e985c9SAmit Cohen vrf_cleanup 153d3e985c9SAmit Cohen} 154d3e985c9SAmit Cohen 155d3e985c9SAmit Cohenping_check() 156d3e985c9SAmit Cohen{ 157d3e985c9SAmit Cohen trap_name=$1; shift 158d3e985c9SAmit Cohen 159d3e985c9SAmit Cohen devlink_trap_action_set $trap_name "trap" 160d3e985c9SAmit Cohen ping_do $h1 $h2_ipv4 161d3e985c9SAmit Cohen check_err $? "Packets that should not be trapped were trapped" 162d3e985c9SAmit Cohen devlink_trap_action_set $trap_name "drop" 163d3e985c9SAmit Cohen} 164d3e985c9SAmit Cohen 165d3e985c9SAmit Cohennon_ip_test() 166d3e985c9SAmit Cohen{ 167d3e985c9SAmit Cohen local trap_name="non_ip" 168d3e985c9SAmit Cohen local mz_pid 169d3e985c9SAmit Cohen 170d3e985c9SAmit Cohen RET=0 171d3e985c9SAmit Cohen 172d3e985c9SAmit Cohen ping_check $trap_name 173d3e985c9SAmit Cohen 174d3e985c9SAmit Cohen tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \ 175d3e985c9SAmit Cohen flower dst_ip $h2_ipv4 action drop 176d3e985c9SAmit Cohen 177d3e985c9SAmit Cohen # Generate non-IP packets to the router 178d3e985c9SAmit Cohen $MZ $h1 -c 0 -p 100 -d 1msec -B $h2_ipv4 -q "$rp1mac $h1mac \ 179d3e985c9SAmit Cohen 00:00 de:ad:be:ef" & 180d3e985c9SAmit Cohen mz_pid=$! 181d3e985c9SAmit Cohen 18204cc99d9SIdo Schimmel devlink_trap_drop_test $trap_name $rp2 101 183d3e985c9SAmit Cohen 184d3e985c9SAmit Cohen log_test "Non IP" 185d3e985c9SAmit Cohen 186c902a52cSJiri Pirko devlink_trap_drop_cleanup $mz_pid $rp2 "ip" 1 101 187d3e985c9SAmit Cohen} 188d3e985c9SAmit Cohen 189d3e985c9SAmit Cohen__uc_dip_over_mc_dmac_test() 190d3e985c9SAmit Cohen{ 191d3e985c9SAmit Cohen local desc=$1; shift 192d3e985c9SAmit Cohen local proto=$1; shift 193d3e985c9SAmit Cohen local dip=$1; shift 194d3e985c9SAmit Cohen local flags=${1:-""}; shift 195d3e985c9SAmit Cohen local trap_name="uc_dip_over_mc_dmac" 196d3e985c9SAmit Cohen local dmac=01:02:03:04:05:06 197d3e985c9SAmit Cohen local mz_pid 198d3e985c9SAmit Cohen 199d3e985c9SAmit Cohen RET=0 200d3e985c9SAmit Cohen 201d3e985c9SAmit Cohen ping_check $trap_name 202d3e985c9SAmit Cohen 203d3e985c9SAmit Cohen tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \ 204d3e985c9SAmit Cohen flower ip_proto udp src_port 54321 dst_port 12345 action drop 205d3e985c9SAmit Cohen 206d3e985c9SAmit Cohen # Generate IP packets with a unicast IP and a multicast destination MAC 207d3e985c9SAmit Cohen $MZ $h1 $flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -b $dmac \ 208d3e985c9SAmit Cohen -B $dip -d 1msec -q & 209d3e985c9SAmit Cohen mz_pid=$! 210d3e985c9SAmit Cohen 21104cc99d9SIdo Schimmel devlink_trap_drop_test $trap_name $rp2 101 212d3e985c9SAmit Cohen 213d3e985c9SAmit Cohen log_test "Unicast destination IP over multicast destination MAC: $desc" 214d3e985c9SAmit Cohen 215c902a52cSJiri Pirko devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101 216d3e985c9SAmit Cohen} 217d3e985c9SAmit Cohen 218d3e985c9SAmit Cohenuc_dip_over_mc_dmac_test() 219d3e985c9SAmit Cohen{ 220d3e985c9SAmit Cohen __uc_dip_over_mc_dmac_test "IPv4" "ip" $h2_ipv4 221d3e985c9SAmit Cohen __uc_dip_over_mc_dmac_test "IPv6" "ipv6" $h2_ipv6 "-6" 222d3e985c9SAmit Cohen} 223d3e985c9SAmit Cohen 224d3e985c9SAmit Cohen__sip_is_loopback_test() 225d3e985c9SAmit Cohen{ 226d3e985c9SAmit Cohen local desc=$1; shift 227d3e985c9SAmit Cohen local proto=$1; shift 228d3e985c9SAmit Cohen local sip=$1; shift 229d3e985c9SAmit Cohen local dip=$1; shift 230d3e985c9SAmit Cohen local flags=${1:-""}; shift 231d3e985c9SAmit Cohen local trap_name="sip_is_loopback_address" 232d3e985c9SAmit Cohen local mz_pid 233d3e985c9SAmit Cohen 234d3e985c9SAmit Cohen RET=0 235d3e985c9SAmit Cohen 236d3e985c9SAmit Cohen ping_check $trap_name 237d3e985c9SAmit Cohen 238d3e985c9SAmit Cohen tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \ 239d3e985c9SAmit Cohen flower src_ip $sip action drop 240d3e985c9SAmit Cohen 241d3e985c9SAmit Cohen # Generate packets with loopback source IP 242d3e985c9SAmit Cohen $MZ $h1 $flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -A $sip \ 243d3e985c9SAmit Cohen -b $rp1mac -B $dip -d 1msec -q & 244d3e985c9SAmit Cohen mz_pid=$! 245d3e985c9SAmit Cohen 24604cc99d9SIdo Schimmel devlink_trap_drop_test $trap_name $rp2 101 247d3e985c9SAmit Cohen 248d3e985c9SAmit Cohen log_test "Source IP is loopback address: $desc" 249d3e985c9SAmit Cohen 250c902a52cSJiri Pirko devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101 251d3e985c9SAmit Cohen} 252d3e985c9SAmit Cohen 253d3e985c9SAmit Cohensip_is_loopback_test() 254d3e985c9SAmit Cohen{ 255d3e985c9SAmit Cohen __sip_is_loopback_test "IPv4" "ip" "127.0.0.0/8" $h2_ipv4 256d3e985c9SAmit Cohen __sip_is_loopback_test "IPv6" "ipv6" "::1" $h2_ipv6 "-6" 257d3e985c9SAmit Cohen} 258d3e985c9SAmit Cohen 259d3e985c9SAmit Cohen__dip_is_loopback_test() 260d3e985c9SAmit Cohen{ 261d3e985c9SAmit Cohen local desc=$1; shift 262d3e985c9SAmit Cohen local proto=$1; shift 263d3e985c9SAmit Cohen local dip=$1; shift 264d3e985c9SAmit Cohen local flags=${1:-""}; shift 265d3e985c9SAmit Cohen local trap_name="dip_is_loopback_address" 266d3e985c9SAmit Cohen local mz_pid 267d3e985c9SAmit Cohen 268d3e985c9SAmit Cohen RET=0 269d3e985c9SAmit Cohen 270d3e985c9SAmit Cohen ping_check $trap_name 271d3e985c9SAmit Cohen 272d3e985c9SAmit Cohen tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \ 273d3e985c9SAmit Cohen flower dst_ip $dip action drop 274d3e985c9SAmit Cohen 275d3e985c9SAmit Cohen # Generate packets with loopback destination IP 276d3e985c9SAmit Cohen $MZ $h1 $flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -b $rp1mac \ 277d3e985c9SAmit Cohen -B $dip -d 1msec -q & 278d3e985c9SAmit Cohen mz_pid=$! 279d3e985c9SAmit Cohen 28004cc99d9SIdo Schimmel devlink_trap_drop_test $trap_name $rp2 101 281d3e985c9SAmit Cohen 282d3e985c9SAmit Cohen log_test "Destination IP is loopback address: $desc" 283d3e985c9SAmit Cohen 284c902a52cSJiri Pirko devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101 285d3e985c9SAmit Cohen} 286d3e985c9SAmit Cohen 287d3e985c9SAmit Cohendip_is_loopback_test() 288d3e985c9SAmit Cohen{ 289d3e985c9SAmit Cohen __dip_is_loopback_test "IPv4" "ip" "127.0.0.0/8" 290d3e985c9SAmit Cohen __dip_is_loopback_test "IPv6" "ipv6" "::1" "-6" 291d3e985c9SAmit Cohen} 292d3e985c9SAmit Cohen 293d3e985c9SAmit Cohen__sip_is_mc_test() 294d3e985c9SAmit Cohen{ 295d3e985c9SAmit Cohen local desc=$1; shift 296d3e985c9SAmit Cohen local proto=$1; shift 297d3e985c9SAmit Cohen local sip=$1; shift 298d3e985c9SAmit Cohen local dip=$1; shift 299d3e985c9SAmit Cohen local flags=${1:-""}; shift 300d3e985c9SAmit Cohen local trap_name="sip_is_mc" 301d3e985c9SAmit Cohen local mz_pid 302d3e985c9SAmit Cohen 303d3e985c9SAmit Cohen RET=0 304d3e985c9SAmit Cohen 305d3e985c9SAmit Cohen ping_check $trap_name 306d3e985c9SAmit Cohen 307d3e985c9SAmit Cohen tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \ 308d3e985c9SAmit Cohen flower src_ip $sip action drop 309d3e985c9SAmit Cohen 310d3e985c9SAmit Cohen # Generate packets with multicast source IP 311d3e985c9SAmit Cohen $MZ $h1 $flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -A $sip \ 312d3e985c9SAmit Cohen -b $rp1mac -B $dip -d 1msec -q & 313d3e985c9SAmit Cohen mz_pid=$! 314d3e985c9SAmit Cohen 31504cc99d9SIdo Schimmel devlink_trap_drop_test $trap_name $rp2 101 316d3e985c9SAmit Cohen 317d3e985c9SAmit Cohen log_test "Source IP is multicast: $desc" 318d3e985c9SAmit Cohen 319c902a52cSJiri Pirko devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101 320d3e985c9SAmit Cohen} 321d3e985c9SAmit Cohen 322d3e985c9SAmit Cohensip_is_mc_test() 323d3e985c9SAmit Cohen{ 324d3e985c9SAmit Cohen __sip_is_mc_test "IPv4" "ip" "239.1.1.1" $h2_ipv4 325d3e985c9SAmit Cohen __sip_is_mc_test "IPv6" "ipv6" "FF02::2" $h2_ipv6 "-6" 326d3e985c9SAmit Cohen} 327d3e985c9SAmit Cohen 328d3e985c9SAmit Cohenipv4_sip_is_limited_bc_test() 329d3e985c9SAmit Cohen{ 330d3e985c9SAmit Cohen local trap_name="ipv4_sip_is_limited_bc" 331d3e985c9SAmit Cohen local sip=255.255.255.255 332d3e985c9SAmit Cohen local mz_pid 333d3e985c9SAmit Cohen 334d3e985c9SAmit Cohen RET=0 335d3e985c9SAmit Cohen 336d3e985c9SAmit Cohen ping_check $trap_name 337d3e985c9SAmit Cohen 338d3e985c9SAmit Cohen tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \ 339d3e985c9SAmit Cohen flower src_ip $sip action drop 340d3e985c9SAmit Cohen 341d3e985c9SAmit Cohen # Generate packets with limited broadcast source IP 342d3e985c9SAmit Cohen $MZ $h1 -t udp "sp=54321,dp=12345" -c 0 -p 100 -A $sip -b $rp1mac \ 343d3e985c9SAmit Cohen -B $h2_ipv4 -d 1msec -q & 344d3e985c9SAmit Cohen mz_pid=$! 345d3e985c9SAmit Cohen 34604cc99d9SIdo Schimmel devlink_trap_drop_test $trap_name $rp2 101 347d3e985c9SAmit Cohen 348d3e985c9SAmit Cohen log_test "IPv4 source IP is limited broadcast" 349d3e985c9SAmit Cohen 350c902a52cSJiri Pirko devlink_trap_drop_cleanup $mz_pid $rp2 "ip" 1 101 351d3e985c9SAmit Cohen} 352d3e985c9SAmit Cohen 353d3e985c9SAmit Cohenipv4_payload_get() 354d3e985c9SAmit Cohen{ 355d3e985c9SAmit Cohen local ipver=$1; shift 356d3e985c9SAmit Cohen local ihl=$1; shift 357d3e985c9SAmit Cohen local checksum=$1; shift 358d3e985c9SAmit Cohen 359d3e985c9SAmit Cohen p=$(: 360d3e985c9SAmit Cohen )"08:00:"$( : ETH type 361d3e985c9SAmit Cohen )"$ipver"$( : IP version 362d3e985c9SAmit Cohen )"$ihl:"$( : IHL 363d3e985c9SAmit Cohen )"00:"$( : IP TOS 364d3e985c9SAmit Cohen )"00:F4:"$( : IP total length 365d3e985c9SAmit Cohen )"00:00:"$( : IP identification 366d3e985c9SAmit Cohen )"20:00:"$( : IP flags + frag off 367d3e985c9SAmit Cohen )"30:"$( : IP TTL 368d3e985c9SAmit Cohen )"01:"$( : IP proto 369d3e985c9SAmit Cohen )"$checksum:"$( : IP header csum 370d3e985c9SAmit Cohen )"$h1_ipv4:"$( : IP saddr 371d3e985c9SAmit Cohen )"$h2_ipv4:"$( : IP daddr 372d3e985c9SAmit Cohen ) 373d3e985c9SAmit Cohen echo $p 374d3e985c9SAmit Cohen} 375d3e985c9SAmit Cohen 376d3e985c9SAmit Cohen__ipv4_header_corrupted_test() 377d3e985c9SAmit Cohen{ 378d3e985c9SAmit Cohen local desc=$1; shift 379d3e985c9SAmit Cohen local ipver=$1; shift 380d3e985c9SAmit Cohen local ihl=$1; shift 381d3e985c9SAmit Cohen local checksum=$1; shift 382d3e985c9SAmit Cohen local trap_name="ip_header_corrupted" 383d3e985c9SAmit Cohen local payload 384d3e985c9SAmit Cohen local mz_pid 385d3e985c9SAmit Cohen 386d3e985c9SAmit Cohen RET=0 387d3e985c9SAmit Cohen 388d3e985c9SAmit Cohen ping_check $trap_name 389d3e985c9SAmit Cohen 390d3e985c9SAmit Cohen tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \ 391d3e985c9SAmit Cohen flower dst_ip $h2_ipv4 action drop 392d3e985c9SAmit Cohen 393d3e985c9SAmit Cohen payload=$(ipv4_payload_get $ipver $ihl $checksum) 394d3e985c9SAmit Cohen 395d3e985c9SAmit Cohen # Generate packets with corrupted IP header 396d3e985c9SAmit Cohen $MZ $h1 -c 0 -d 1msec -a $h1mac -b $rp1mac -q p=$payload & 397d3e985c9SAmit Cohen mz_pid=$! 398d3e985c9SAmit Cohen 39904cc99d9SIdo Schimmel devlink_trap_drop_test $trap_name $rp2 101 400d3e985c9SAmit Cohen 401d3e985c9SAmit Cohen log_test "IP header corrupted: $desc: IPv4" 402d3e985c9SAmit Cohen 403c902a52cSJiri Pirko devlink_trap_drop_cleanup $mz_pid $rp2 "ip" 1 101 404d3e985c9SAmit Cohen} 405d3e985c9SAmit Cohen 406d3e985c9SAmit Cohenipv6_payload_get() 407d3e985c9SAmit Cohen{ 408d3e985c9SAmit Cohen local ipver=$1; shift 409d3e985c9SAmit Cohen 410d3e985c9SAmit Cohen p=$(: 411d3e985c9SAmit Cohen )"86:DD:"$( : ETH type 412d3e985c9SAmit Cohen )"$ipver"$( : IP version 413d3e985c9SAmit Cohen )"0:0:"$( : Traffic class 414d3e985c9SAmit Cohen )"0:00:00:"$( : Flow label 415d3e985c9SAmit Cohen )"00:00:"$( : Payload length 416d3e985c9SAmit Cohen )"01:"$( : Next header 417d3e985c9SAmit Cohen )"04:"$( : Hop limit 418d3e985c9SAmit Cohen )"$h1_ipv6:"$( : IP saddr 419d3e985c9SAmit Cohen )"$h2_ipv6:"$( : IP daddr 420d3e985c9SAmit Cohen ) 421d3e985c9SAmit Cohen echo $p 422d3e985c9SAmit Cohen} 423d3e985c9SAmit Cohen 424d3e985c9SAmit Cohen__ipv6_header_corrupted_test() 425d3e985c9SAmit Cohen{ 426d3e985c9SAmit Cohen local desc=$1; shift 427d3e985c9SAmit Cohen local ipver=$1; shift 428d3e985c9SAmit Cohen local trap_name="ip_header_corrupted" 429d3e985c9SAmit Cohen local payload 430d3e985c9SAmit Cohen local mz_pid 431d3e985c9SAmit Cohen 432d3e985c9SAmit Cohen RET=0 433d3e985c9SAmit Cohen 434d3e985c9SAmit Cohen ping_check $trap_name 435d3e985c9SAmit Cohen 436d3e985c9SAmit Cohen tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \ 437d3e985c9SAmit Cohen flower dst_ip $h2_ipv4 action drop 438d3e985c9SAmit Cohen 439d3e985c9SAmit Cohen payload=$(ipv6_payload_get $ipver) 440d3e985c9SAmit Cohen 441d3e985c9SAmit Cohen # Generate packets with corrupted IP header 442d3e985c9SAmit Cohen $MZ $h1 -c 0 -d 1msec -a $h1mac -b $rp1mac -q p=$payload & 443d3e985c9SAmit Cohen mz_pid=$! 444d3e985c9SAmit Cohen 44504cc99d9SIdo Schimmel devlink_trap_drop_test $trap_name $rp2 101 446d3e985c9SAmit Cohen 447d3e985c9SAmit Cohen log_test "IP header corrupted: $desc: IPv6" 448d3e985c9SAmit Cohen 449c902a52cSJiri Pirko devlink_trap_drop_cleanup $mz_pid $rp2 "ip" 1 101 450d3e985c9SAmit Cohen} 451d3e985c9SAmit Cohen 452d3e985c9SAmit Cohenip_header_corrupted_test() 453d3e985c9SAmit Cohen{ 454d3e985c9SAmit Cohen # Each test uses one wrong value. The three values below are correct. 455d3e985c9SAmit Cohen local ipv="4" 456d3e985c9SAmit Cohen local ihl="5" 457d3e985c9SAmit Cohen local checksum="00:F4" 458d3e985c9SAmit Cohen 459d3e985c9SAmit Cohen __ipv4_header_corrupted_test "wrong IP version" 5 $ihl $checksum 460d3e985c9SAmit Cohen __ipv4_header_corrupted_test "wrong IHL" $ipv 4 $checksum 461d3e985c9SAmit Cohen __ipv4_header_corrupted_test "wrong checksum" $ipv $ihl "00:00" 462d3e985c9SAmit Cohen __ipv6_header_corrupted_test "wrong IP version" 5 463d3e985c9SAmit Cohen} 464d3e985c9SAmit Cohen 465d3e985c9SAmit Cohenipv6_mc_dip_reserved_scope_test() 466d3e985c9SAmit Cohen{ 467d3e985c9SAmit Cohen local trap_name="ipv6_mc_dip_reserved_scope" 468d3e985c9SAmit Cohen local dip=FF00:: 469d3e985c9SAmit Cohen local mz_pid 470d3e985c9SAmit Cohen 471d3e985c9SAmit Cohen RET=0 472d3e985c9SAmit Cohen 473d3e985c9SAmit Cohen ping_check $trap_name 474d3e985c9SAmit Cohen 475d3e985c9SAmit Cohen tc filter add dev $rp2 egress protocol ipv6 pref 1 handle 101 \ 476d3e985c9SAmit Cohen flower dst_ip $dip action drop 477d3e985c9SAmit Cohen 478d3e985c9SAmit Cohen # Generate packets with reserved scope destination IP 479d3e985c9SAmit Cohen $MZ $h1 -6 -t udp "sp=54321,dp=12345" -c 0 -p 100 -b \ 480d3e985c9SAmit Cohen "33:33:00:00:00:00" -B $dip -d 1msec -q & 481d3e985c9SAmit Cohen mz_pid=$! 482d3e985c9SAmit Cohen 48304cc99d9SIdo Schimmel devlink_trap_drop_test $trap_name $rp2 101 484d3e985c9SAmit Cohen 485d3e985c9SAmit Cohen log_test "IPv6 multicast destination IP reserved scope" 486d3e985c9SAmit Cohen 487c902a52cSJiri Pirko devlink_trap_drop_cleanup $mz_pid $rp2 "ipv6" 1 101 488d3e985c9SAmit Cohen} 489d3e985c9SAmit Cohen 490d3e985c9SAmit Cohenipv6_mc_dip_interface_local_scope_test() 491d3e985c9SAmit Cohen{ 492d3e985c9SAmit Cohen local trap_name="ipv6_mc_dip_interface_local_scope" 493d3e985c9SAmit Cohen local dip=FF01:: 494d3e985c9SAmit Cohen local mz_pid 495d3e985c9SAmit Cohen 496d3e985c9SAmit Cohen RET=0 497d3e985c9SAmit Cohen 498d3e985c9SAmit Cohen ping_check $trap_name 499d3e985c9SAmit Cohen 500d3e985c9SAmit Cohen tc filter add dev $rp2 egress protocol ipv6 pref 1 handle 101 \ 501d3e985c9SAmit Cohen flower dst_ip $dip action drop 502d3e985c9SAmit Cohen 503d3e985c9SAmit Cohen # Generate packets with interface local scope destination IP 504d3e985c9SAmit Cohen $MZ $h1 -6 -t udp "sp=54321,dp=12345" -c 0 -p 100 -b \ 505d3e985c9SAmit Cohen "33:33:00:00:00:00" -B $dip -d 1msec -q & 506d3e985c9SAmit Cohen mz_pid=$! 507d3e985c9SAmit Cohen 50804cc99d9SIdo Schimmel devlink_trap_drop_test $trap_name $rp2 101 509d3e985c9SAmit Cohen 510d3e985c9SAmit Cohen log_test "IPv6 multicast destination IP interface-local scope" 511d3e985c9SAmit Cohen 512c902a52cSJiri Pirko devlink_trap_drop_cleanup $mz_pid $rp2 "ipv6" 1 101 513d3e985c9SAmit Cohen} 514d3e985c9SAmit Cohen 515d3e985c9SAmit Cohen__blackhole_route_test() 516d3e985c9SAmit Cohen{ 517d3e985c9SAmit Cohen local flags=$1; shift 518d3e985c9SAmit Cohen local subnet=$1; shift 519d3e985c9SAmit Cohen local proto=$1; shift 520d3e985c9SAmit Cohen local dip=$1; shift 521d3e985c9SAmit Cohen local ip_proto=${1:-"icmp"}; shift 522d3e985c9SAmit Cohen local trap_name="blackhole_route" 523d3e985c9SAmit Cohen local mz_pid 524d3e985c9SAmit Cohen 525d3e985c9SAmit Cohen RET=0 526d3e985c9SAmit Cohen 527d3e985c9SAmit Cohen ping_check $trap_name 528d3e985c9SAmit Cohen 529d3e985c9SAmit Cohen ip -$flags route add blackhole $subnet 530d3e985c9SAmit Cohen tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \ 531d3e985c9SAmit Cohen flower skip_hw dst_ip $dip ip_proto $ip_proto action drop 532d3e985c9SAmit Cohen 533d3e985c9SAmit Cohen # Generate packets to the blackhole route 534d3e985c9SAmit Cohen $MZ $h1 -$flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -b $rp1mac \ 535d3e985c9SAmit Cohen -B $dip -d 1msec -q & 536d3e985c9SAmit Cohen mz_pid=$! 537d3e985c9SAmit Cohen 53804cc99d9SIdo Schimmel devlink_trap_drop_test $trap_name $rp2 101 539d3e985c9SAmit Cohen log_test "Blackhole route: IPv$flags" 540d3e985c9SAmit Cohen 541c902a52cSJiri Pirko devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101 542d3e985c9SAmit Cohen ip -$flags route del blackhole $subnet 543d3e985c9SAmit Cohen} 544d3e985c9SAmit Cohen 545d3e985c9SAmit Cohenblackhole_route_test() 546d3e985c9SAmit Cohen{ 547d3e985c9SAmit Cohen __blackhole_route_test "4" "198.51.100.0/30" "ip" $h2_ipv4 548d3e985c9SAmit Cohen __blackhole_route_test "6" "2001:db8:2::/120" "ipv6" $h2_ipv6 "icmpv6" 549d3e985c9SAmit Cohen} 550d3e985c9SAmit Cohen 551740e87bcSAmit Cohenirif_disabled_test() 552740e87bcSAmit Cohen{ 553740e87bcSAmit Cohen local trap_name="irif_disabled" 554740e87bcSAmit Cohen local t0_packets t0_bytes 555740e87bcSAmit Cohen local t1_packets t1_bytes 556740e87bcSAmit Cohen local mz_pid 557740e87bcSAmit Cohen 558740e87bcSAmit Cohen RET=0 559740e87bcSAmit Cohen 560740e87bcSAmit Cohen ping_check $trap_name 561740e87bcSAmit Cohen 562740e87bcSAmit Cohen devlink_trap_action_set $trap_name "trap" 563740e87bcSAmit Cohen 564740e87bcSAmit Cohen # When RIF of a physical port ("Sub-port RIF") is destroyed, we first 565740e87bcSAmit Cohen # block the STP of the {Port, VLAN} so packets cannot get into the RIF. 566740e87bcSAmit Cohen # Using bridge enables us to see this trap because when bridge is 567740e87bcSAmit Cohen # destroyed, there is a small time window that packets can go into the 568740e87bcSAmit Cohen # RIF, while it is disabled. 569740e87bcSAmit Cohen ip link add dev br0 type bridge 570740e87bcSAmit Cohen ip link set dev $rp1 master br0 571740e87bcSAmit Cohen ip address flush dev $rp1 572740e87bcSAmit Cohen __addr_add_del br0 add 192.0.2.2/24 573740e87bcSAmit Cohen ip li set dev br0 up 574740e87bcSAmit Cohen 575740e87bcSAmit Cohen t0_packets=$(devlink_trap_rx_packets_get $trap_name) 576740e87bcSAmit Cohen t0_bytes=$(devlink_trap_rx_bytes_get $trap_name) 577740e87bcSAmit Cohen 578740e87bcSAmit Cohen # Generate packets to h2 through br0 RIF that will be removed later 579740e87bcSAmit Cohen $MZ $h1 -t udp "sp=54321,dp=12345" -c 0 -p 100 -a own -b $rp1mac \ 580740e87bcSAmit Cohen -B $h2_ipv4 -q & 581740e87bcSAmit Cohen mz_pid=$! 582740e87bcSAmit Cohen 583740e87bcSAmit Cohen # Wait before removing br0 RIF to allow packets to go into the bridge. 584740e87bcSAmit Cohen sleep 1 585740e87bcSAmit Cohen 586740e87bcSAmit Cohen # Flushing address will dismantle the RIF 587740e87bcSAmit Cohen ip address flush dev br0 588740e87bcSAmit Cohen 589740e87bcSAmit Cohen t1_packets=$(devlink_trap_rx_packets_get $trap_name) 590740e87bcSAmit Cohen t1_bytes=$(devlink_trap_rx_bytes_get $trap_name) 591740e87bcSAmit Cohen 592740e87bcSAmit Cohen if [[ $t0_packets -eq $t1_packets && $t0_bytes -eq $t1_bytes ]]; then 593740e87bcSAmit Cohen check_err 1 "Trap stats idle when packets should be trapped" 594740e87bcSAmit Cohen fi 595740e87bcSAmit Cohen 596740e87bcSAmit Cohen log_test "Ingress RIF disabled" 597740e87bcSAmit Cohen 598*46f6569cSPetr Machata kill_process $mz_pid 599740e87bcSAmit Cohen ip link set dev $rp1 nomaster 600740e87bcSAmit Cohen __addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64 601740e87bcSAmit Cohen ip link del dev br0 type bridge 602740e87bcSAmit Cohen devlink_trap_action_set $trap_name "drop" 603740e87bcSAmit Cohen} 604740e87bcSAmit Cohen 605740e87bcSAmit Cohenerif_disabled_test() 606740e87bcSAmit Cohen{ 607740e87bcSAmit Cohen local trap_name="erif_disabled" 608740e87bcSAmit Cohen local t0_packets t0_bytes 609740e87bcSAmit Cohen local t1_packets t1_bytes 610740e87bcSAmit Cohen local mz_pid 611740e87bcSAmit Cohen 612740e87bcSAmit Cohen RET=0 613740e87bcSAmit Cohen 614740e87bcSAmit Cohen ping_check $trap_name 615740e87bcSAmit Cohen 616740e87bcSAmit Cohen devlink_trap_action_set $trap_name "trap" 617740e87bcSAmit Cohen ip link add dev br0 type bridge 618740e87bcSAmit Cohen ip add flush dev $rp1 619740e87bcSAmit Cohen ip link set dev $rp1 master br0 620740e87bcSAmit Cohen __addr_add_del br0 add 192.0.2.2/24 621740e87bcSAmit Cohen ip link set dev br0 up 622740e87bcSAmit Cohen 623740e87bcSAmit Cohen t0_packets=$(devlink_trap_rx_packets_get $trap_name) 624740e87bcSAmit Cohen t0_bytes=$(devlink_trap_rx_bytes_get $trap_name) 625740e87bcSAmit Cohen 626740e87bcSAmit Cohen rp2mac=$(mac_get $rp2) 627740e87bcSAmit Cohen 628740e87bcSAmit Cohen # Generate packets that should go out through br0 RIF that will be 629740e87bcSAmit Cohen # removed later 630740e87bcSAmit Cohen $MZ $h2 -t udp "sp=54321,dp=12345" -c 0 -p 100 -a own -b $rp2mac \ 631740e87bcSAmit Cohen -B 192.0.2.1 -q & 632740e87bcSAmit Cohen mz_pid=$! 633740e87bcSAmit Cohen 634740e87bcSAmit Cohen sleep 5 6355d66773fSIdo Schimmel # Unlinking the port from the bridge will disable the RIF associated 6365d66773fSIdo Schimmel # with br0 as it is no longer an upper of any mlxsw port. 6375d66773fSIdo Schimmel ip link set dev $rp1 nomaster 638740e87bcSAmit Cohen 639740e87bcSAmit Cohen t1_packets=$(devlink_trap_rx_packets_get $trap_name) 640740e87bcSAmit Cohen t1_bytes=$(devlink_trap_rx_bytes_get $trap_name) 641740e87bcSAmit Cohen 642740e87bcSAmit Cohen if [[ $t0_packets -eq $t1_packets && $t0_bytes -eq $t1_bytes ]]; then 643740e87bcSAmit Cohen check_err 1 "Trap stats idle when packets should be trapped" 644740e87bcSAmit Cohen fi 645740e87bcSAmit Cohen 646740e87bcSAmit Cohen log_test "Egress RIF disabled" 647740e87bcSAmit Cohen 648*46f6569cSPetr Machata kill_process $mz_pid 649740e87bcSAmit Cohen __addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64 650740e87bcSAmit Cohen ip link del dev br0 type bridge 651740e87bcSAmit Cohen devlink_trap_action_set $trap_name "drop" 652740e87bcSAmit Cohen} 653740e87bcSAmit Cohen 65484e8feeaSIdo Schimmel__blackhole_nexthop_test() 65584e8feeaSIdo Schimmel{ 65684e8feeaSIdo Schimmel local flags=$1; shift 65784e8feeaSIdo Schimmel local subnet=$1; shift 65884e8feeaSIdo Schimmel local proto=$1; shift 65984e8feeaSIdo Schimmel local dip=$1; shift 66084e8feeaSIdo Schimmel local trap_name="blackhole_nexthop" 66184e8feeaSIdo Schimmel local mz_pid 66284e8feeaSIdo Schimmel 66384e8feeaSIdo Schimmel RET=0 66484e8feeaSIdo Schimmel 66584e8feeaSIdo Schimmel ip -$flags nexthop add id 1 blackhole 66684e8feeaSIdo Schimmel ip -$flags route add $subnet nhid 1 66784e8feeaSIdo Schimmel tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \ 66884e8feeaSIdo Schimmel flower skip_hw dst_ip $dip ip_proto udp action drop 66984e8feeaSIdo Schimmel 67084e8feeaSIdo Schimmel # Generate packets to the blackhole nexthop 67184e8feeaSIdo Schimmel $MZ $h1 -$flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -b $rp1mac \ 67284e8feeaSIdo Schimmel -B $dip -d 1msec -q & 67384e8feeaSIdo Schimmel mz_pid=$! 67484e8feeaSIdo Schimmel 67584e8feeaSIdo Schimmel devlink_trap_drop_test $trap_name $rp2 101 67684e8feeaSIdo Schimmel log_test "Blackhole nexthop: IPv$flags" 67784e8feeaSIdo Schimmel 67884e8feeaSIdo Schimmel devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101 67984e8feeaSIdo Schimmel ip -$flags route del $subnet 68084e8feeaSIdo Schimmel ip -$flags nexthop del id 1 68184e8feeaSIdo Schimmel} 68284e8feeaSIdo Schimmel 68384e8feeaSIdo Schimmelblackhole_nexthop_test() 68484e8feeaSIdo Schimmel{ 68584e8feeaSIdo Schimmel __blackhole_nexthop_test "4" "198.51.100.0/30" "ip" $h2_ipv4 68684e8feeaSIdo Schimmel __blackhole_nexthop_test "6" "2001:db8:2::/120" "ipv6" $h2_ipv6 68784e8feeaSIdo Schimmel} 68884e8feeaSIdo Schimmel 689d3e985c9SAmit Cohentrap cleanup EXIT 690d3e985c9SAmit Cohen 691d3e985c9SAmit Cohensetup_prepare 692d3e985c9SAmit Cohensetup_wait 693d3e985c9SAmit Cohen 694d3e985c9SAmit Cohentests_run 695d3e985c9SAmit Cohen 696d3e985c9SAmit Cohenexit $EXIT_STATUS 697