Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 #
0004 # Test devlink-trap L3 drops functionality over mlxsw. Each registered L3 drop
0005 # packet trap is tested to make sure it is triggered under the right
0006 # conditions.
0007 
0008 # +---------------------------------+
0009 # | H1 (vrf)                        |
0010 # |    + $h1                        |
0011 # |    | 192.0.2.1/24               |
0012 # |    | 2001:db8:1::1/64           |
0013 # |    |                            |
0014 # |    |  default via 192.0.2.2     |
0015 # |    |  default via 2001:db8:1::2 |
0016 # +----|----------------------------+
0017 #      |
0018 # +----|----------------------------------------------------------------------+
0019 # | SW |                                                                      |
0020 # |    + $rp1                                                                 |
0021 # |        192.0.2.2/24                                                       |
0022 # |        2001:db8:1::2/64                                                   |
0023 # |                                                                           |
0024 # |        2001:db8:2::2/64                                                   |
0025 # |        198.51.100.2/24                                                    |
0026 # |    + $rp2                                                                 |
0027 # |    |                                                                      |
0028 # +----|----------------------------------------------------------------------+
0029 #      |
0030 # +----|----------------------------+
0031 # |    |  default via 198.51.100.2  |
0032 # |    |  default via 2001:db8:2::2 |
0033 # |    |                            |
0034 # |    | 2001:db8:2::1/64           |
0035 # |    | 198.51.100.1/24            |
0036 # |    + $h2                        |
0037 # | H2 (vrf)                        |
0038 # +---------------------------------+
0039 
0040 lib_dir=$(dirname $0)/../../../net/forwarding
0041 
0042 ALL_TESTS="
0043         non_ip_test
0044         uc_dip_over_mc_dmac_test
0045         dip_is_loopback_test
0046         sip_is_mc_test
0047         sip_is_loopback_test
0048         ip_header_corrupted_test
0049         ipv4_sip_is_limited_bc_test
0050         ipv6_mc_dip_reserved_scope_test
0051         ipv6_mc_dip_interface_local_scope_test
0052         blackhole_route_test
0053         irif_disabled_test
0054         erif_disabled_test
0055         blackhole_nexthop_test
0056 "
0057 
0058 NUM_NETIFS=4
0059 source $lib_dir/lib.sh
0060 source $lib_dir/tc_common.sh
0061 source $lib_dir/devlink_lib.sh
0062 
0063 h1_create()
0064 {
0065         simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/64
0066 
0067         ip -4 route add default vrf v$h1 nexthop via 192.0.2.2
0068         ip -6 route add default vrf v$h1 nexthop via 2001:db8:1::2
0069 }
0070 
0071 h1_destroy()
0072 {
0073         ip -6 route del default vrf v$h1 nexthop via 2001:db8:1::2
0074         ip -4 route del default vrf v$h1 nexthop via 192.0.2.2
0075 
0076         simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/64
0077 }
0078 
0079 h2_create()
0080 {
0081         simple_if_init $h2 $h2_ipv4/24 $h2_ipv6/64
0082 
0083         ip -4 route add default vrf v$h2 nexthop via 198.51.100.2
0084         ip -6 route add default vrf v$h2 nexthop via 2001:db8:2::2
0085 }
0086 
0087 h2_destroy()
0088 {
0089         ip -6 route del default vrf v$h2 nexthop via 2001:db8:2::2
0090         ip -4 route del default vrf v$h2 nexthop via 198.51.100.2
0091 
0092         simple_if_fini $h2 $h2_ipv4/24 $h2_ipv6/64
0093 }
0094 
0095 router_create()
0096 {
0097         ip link set dev $rp1 up
0098         ip link set dev $rp2 up
0099 
0100         tc qdisc add dev $rp2 clsact
0101 
0102         __addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64
0103         __addr_add_del $rp2 add 198.51.100.2/24 2001:db8:2::2/64
0104 }
0105 
0106 router_destroy()
0107 {
0108         __addr_add_del $rp2 del 198.51.100.2/24 2001:db8:2::2/64
0109         __addr_add_del $rp1 del 192.0.2.2/24 2001:db8:1::2/64
0110 
0111         tc qdisc del dev $rp2 clsact
0112 
0113         ip link set dev $rp2 down
0114         ip link set dev $rp1 down
0115 }
0116 
0117 setup_prepare()
0118 {
0119         h1=${NETIFS[p1]}
0120         rp1=${NETIFS[p2]}
0121 
0122         rp2=${NETIFS[p3]}
0123         h2=${NETIFS[p4]}
0124 
0125         h1mac=$(mac_get $h1)
0126         rp1mac=$(mac_get $rp1)
0127 
0128         h1_ipv4=192.0.2.1
0129         h2_ipv4=198.51.100.1
0130         h1_ipv6=2001:db8:1::1
0131         h2_ipv6=2001:db8:2::1
0132 
0133         vrf_prepare
0134         forwarding_enable
0135 
0136         h1_create
0137         h2_create
0138 
0139         router_create
0140 }
0141 
0142 cleanup()
0143 {
0144         pre_cleanup
0145 
0146         router_destroy
0147 
0148         h2_destroy
0149         h1_destroy
0150 
0151         forwarding_restore
0152         vrf_cleanup
0153 }
0154 
0155 ping_check()
0156 {
0157         trap_name=$1; shift
0158 
0159         devlink_trap_action_set $trap_name "trap"
0160         ping_do $h1 $h2_ipv4
0161         check_err $? "Packets that should not be trapped were trapped"
0162         devlink_trap_action_set $trap_name "drop"
0163 }
0164 
0165 non_ip_test()
0166 {
0167         local trap_name="non_ip"
0168         local mz_pid
0169 
0170         RET=0
0171 
0172         ping_check $trap_name
0173 
0174         tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
0175                 flower dst_ip $h2_ipv4 action drop
0176 
0177         # Generate non-IP packets to the router
0178         $MZ $h1 -c 0 -p 100 -d 1msec -B $h2_ipv4 -q "$rp1mac $h1mac \
0179                 00:00 de:ad:be:ef" &
0180         mz_pid=$!
0181 
0182         devlink_trap_drop_test $trap_name $rp2 101
0183 
0184         log_test "Non IP"
0185 
0186         devlink_trap_drop_cleanup $mz_pid $rp2 "ip" 1 101
0187 }
0188 
0189 __uc_dip_over_mc_dmac_test()
0190 {
0191         local desc=$1; shift
0192         local proto=$1; shift
0193         local dip=$1; shift
0194         local flags=${1:-""}; shift
0195         local trap_name="uc_dip_over_mc_dmac"
0196         local dmac=01:02:03:04:05:06
0197         local mz_pid
0198 
0199         RET=0
0200 
0201         ping_check $trap_name
0202 
0203         tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
0204                 flower ip_proto udp src_port 54321 dst_port 12345 action drop
0205 
0206         # Generate IP packets with a unicast IP and a multicast destination MAC
0207         $MZ $h1 $flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -b $dmac \
0208                 -B $dip -d 1msec -q &
0209         mz_pid=$!
0210 
0211         devlink_trap_drop_test $trap_name $rp2 101
0212 
0213         log_test "Unicast destination IP over multicast destination MAC: $desc"
0214 
0215         devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
0216 }
0217 
0218 uc_dip_over_mc_dmac_test()
0219 {
0220         __uc_dip_over_mc_dmac_test "IPv4" "ip" $h2_ipv4
0221         __uc_dip_over_mc_dmac_test "IPv6" "ipv6" $h2_ipv6 "-6"
0222 }
0223 
0224 __sip_is_loopback_test()
0225 {
0226         local desc=$1; shift
0227         local proto=$1; shift
0228         local sip=$1; shift
0229         local dip=$1; shift
0230         local flags=${1:-""}; shift
0231         local trap_name="sip_is_loopback_address"
0232         local mz_pid
0233 
0234         RET=0
0235 
0236         ping_check $trap_name
0237 
0238         tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
0239                 flower src_ip $sip action drop
0240 
0241         # Generate packets with loopback source IP
0242         $MZ $h1 $flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -A $sip \
0243                 -b $rp1mac -B $dip -d 1msec -q &
0244         mz_pid=$!
0245 
0246         devlink_trap_drop_test $trap_name $rp2 101
0247 
0248         log_test "Source IP is loopback address: $desc"
0249 
0250         devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
0251 }
0252 
0253 sip_is_loopback_test()
0254 {
0255         __sip_is_loopback_test "IPv4" "ip" "127.0.0.0/8" $h2_ipv4
0256         __sip_is_loopback_test "IPv6" "ipv6" "::1" $h2_ipv6 "-6"
0257 }
0258 
0259 __dip_is_loopback_test()
0260 {
0261         local desc=$1; shift
0262         local proto=$1; shift
0263         local dip=$1; shift
0264         local flags=${1:-""}; shift
0265         local trap_name="dip_is_loopback_address"
0266         local mz_pid
0267 
0268         RET=0
0269 
0270         ping_check $trap_name
0271 
0272         tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
0273                 flower dst_ip $dip action drop
0274 
0275         # Generate packets with loopback destination IP
0276         $MZ $h1 $flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -b $rp1mac \
0277                 -B $dip -d 1msec -q &
0278         mz_pid=$!
0279 
0280         devlink_trap_drop_test $trap_name $rp2 101
0281 
0282         log_test "Destination IP is loopback address: $desc"
0283 
0284         devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
0285 }
0286 
0287 dip_is_loopback_test()
0288 {
0289         __dip_is_loopback_test "IPv4" "ip" "127.0.0.0/8"
0290         __dip_is_loopback_test "IPv6" "ipv6" "::1" "-6"
0291 }
0292 
0293 __sip_is_mc_test()
0294 {
0295         local desc=$1; shift
0296         local proto=$1; shift
0297         local sip=$1; shift
0298         local dip=$1; shift
0299         local flags=${1:-""}; shift
0300         local trap_name="sip_is_mc"
0301         local mz_pid
0302 
0303         RET=0
0304 
0305         ping_check $trap_name
0306 
0307         tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
0308                 flower src_ip $sip action drop
0309 
0310         # Generate packets with multicast source IP
0311         $MZ $h1 $flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -A $sip \
0312                 -b $rp1mac -B $dip -d 1msec -q &
0313         mz_pid=$!
0314 
0315         devlink_trap_drop_test $trap_name $rp2 101
0316 
0317         log_test "Source IP is multicast: $desc"
0318 
0319         devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
0320 }
0321 
0322 sip_is_mc_test()
0323 {
0324         __sip_is_mc_test "IPv4" "ip" "239.1.1.1" $h2_ipv4
0325         __sip_is_mc_test "IPv6" "ipv6" "FF02::2" $h2_ipv6 "-6"
0326 }
0327 
0328 ipv4_sip_is_limited_bc_test()
0329 {
0330         local trap_name="ipv4_sip_is_limited_bc"
0331         local sip=255.255.255.255
0332         local mz_pid
0333 
0334         RET=0
0335 
0336         ping_check $trap_name
0337 
0338         tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
0339                 flower src_ip $sip action drop
0340 
0341         # Generate packets with limited broadcast source IP
0342         $MZ $h1 -t udp "sp=54321,dp=12345" -c 0 -p 100 -A $sip -b $rp1mac \
0343                 -B $h2_ipv4 -d 1msec -q &
0344         mz_pid=$!
0345 
0346         devlink_trap_drop_test $trap_name $rp2 101
0347 
0348         log_test "IPv4 source IP is limited broadcast"
0349 
0350         devlink_trap_drop_cleanup $mz_pid $rp2 "ip" 1 101
0351 }
0352 
0353 ipv4_payload_get()
0354 {
0355         local ipver=$1; shift
0356         local ihl=$1; shift
0357         local checksum=$1; shift
0358 
0359         p=$(:
0360                 )"08:00:"$(                   : ETH type
0361                 )"$ipver"$(                   : IP version
0362                 )"$ihl:"$(                    : IHL
0363                 )"00:"$(                      : IP TOS
0364                 )"00:F4:"$(                   : IP total length
0365                 )"00:00:"$(                   : IP identification
0366                 )"20:00:"$(                   : IP flags + frag off
0367                 )"30:"$(                      : IP TTL
0368                 )"01:"$(                      : IP proto
0369                 )"$checksum:"$(               : IP header csum
0370                 )"$h1_ipv4:"$(                : IP saddr
0371                 )"$h2_ipv4:"$(                : IP daddr
0372                 )
0373         echo $p
0374 }
0375 
0376 __ipv4_header_corrupted_test()
0377 {
0378         local desc=$1; shift
0379         local ipver=$1; shift
0380         local ihl=$1; shift
0381         local checksum=$1; shift
0382         local trap_name="ip_header_corrupted"
0383         local payload
0384         local mz_pid
0385 
0386         RET=0
0387 
0388         ping_check $trap_name
0389 
0390         tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
0391                 flower dst_ip $h2_ipv4 action drop
0392 
0393         payload=$(ipv4_payload_get $ipver $ihl $checksum)
0394 
0395         # Generate packets with corrupted IP header
0396         $MZ $h1 -c 0 -d 1msec -a $h1mac -b $rp1mac -q p=$payload &
0397         mz_pid=$!
0398 
0399         devlink_trap_drop_test $trap_name $rp2 101
0400 
0401         log_test "IP header corrupted: $desc: IPv4"
0402 
0403         devlink_trap_drop_cleanup $mz_pid $rp2 "ip" 1 101
0404 }
0405 
0406 ipv6_payload_get()
0407 {
0408         local ipver=$1; shift
0409 
0410         p=$(:
0411                 )"86:DD:"$(                  : ETH type
0412                 )"$ipver"$(                  : IP version
0413                 )"0:0:"$(                    : Traffic class
0414                 )"0:00:00:"$(                : Flow label
0415                 )"00:00:"$(                  : Payload length
0416                 )"01:"$(                     : Next header
0417                 )"04:"$(                     : Hop limit
0418                 )"$h1_ipv6:"$(               : IP saddr
0419                 )"$h2_ipv6:"$(               : IP daddr
0420                 )
0421         echo $p
0422 }
0423 
0424 __ipv6_header_corrupted_test()
0425 {
0426         local desc=$1; shift
0427         local ipver=$1; shift
0428         local trap_name="ip_header_corrupted"
0429         local payload
0430         local mz_pid
0431 
0432         RET=0
0433 
0434         ping_check $trap_name
0435 
0436         tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
0437                 flower dst_ip $h2_ipv4 action drop
0438 
0439         payload=$(ipv6_payload_get $ipver)
0440 
0441         # Generate packets with corrupted IP header
0442         $MZ $h1 -c 0 -d 1msec -a $h1mac -b $rp1mac -q p=$payload &
0443         mz_pid=$!
0444 
0445         devlink_trap_drop_test $trap_name $rp2 101
0446 
0447         log_test "IP header corrupted: $desc: IPv6"
0448 
0449         devlink_trap_drop_cleanup $mz_pid $rp2 "ip" 1 101
0450 }
0451 
0452 ip_header_corrupted_test()
0453 {
0454         # Each test uses one wrong value. The three values below are correct.
0455         local ipv="4"
0456         local ihl="5"
0457         local checksum="00:F4"
0458 
0459         __ipv4_header_corrupted_test "wrong IP version" 5 $ihl $checksum
0460         __ipv4_header_corrupted_test "wrong IHL" $ipv 4 $checksum
0461         __ipv4_header_corrupted_test "wrong checksum" $ipv $ihl "00:00"
0462         __ipv6_header_corrupted_test "wrong IP version" 5
0463 }
0464 
0465 ipv6_mc_dip_reserved_scope_test()
0466 {
0467         local trap_name="ipv6_mc_dip_reserved_scope"
0468         local dip=FF00::
0469         local mz_pid
0470 
0471         RET=0
0472 
0473         ping_check $trap_name
0474 
0475         tc filter add dev $rp2 egress protocol ipv6 pref 1 handle 101 \
0476                 flower dst_ip $dip action drop
0477 
0478         # Generate packets with reserved scope destination IP
0479         $MZ $h1 -6 -t udp "sp=54321,dp=12345" -c 0 -p 100 -b \
0480                 "33:33:00:00:00:00" -B $dip -d 1msec -q &
0481         mz_pid=$!
0482 
0483         devlink_trap_drop_test $trap_name $rp2 101
0484 
0485         log_test "IPv6 multicast destination IP reserved scope"
0486 
0487         devlink_trap_drop_cleanup $mz_pid $rp2 "ipv6" 1 101
0488 }
0489 
0490 ipv6_mc_dip_interface_local_scope_test()
0491 {
0492         local trap_name="ipv6_mc_dip_interface_local_scope"
0493         local dip=FF01::
0494         local mz_pid
0495 
0496         RET=0
0497 
0498         ping_check $trap_name
0499 
0500         tc filter add dev $rp2 egress protocol ipv6 pref 1 handle 101 \
0501                 flower dst_ip $dip action drop
0502 
0503         # Generate packets with interface local scope destination IP
0504         $MZ $h1 -6 -t udp "sp=54321,dp=12345" -c 0 -p 100 -b \
0505                 "33:33:00:00:00:00" -B $dip -d 1msec -q &
0506         mz_pid=$!
0507 
0508         devlink_trap_drop_test $trap_name $rp2 101
0509 
0510         log_test "IPv6 multicast destination IP interface-local scope"
0511 
0512         devlink_trap_drop_cleanup $mz_pid $rp2 "ipv6" 1 101
0513 }
0514 
0515 __blackhole_route_test()
0516 {
0517         local flags=$1; shift
0518         local subnet=$1; shift
0519         local proto=$1; shift
0520         local dip=$1; shift
0521         local ip_proto=${1:-"icmp"}; shift
0522         local trap_name="blackhole_route"
0523         local mz_pid
0524 
0525         RET=0
0526 
0527         ping_check $trap_name
0528 
0529         ip -$flags route add blackhole $subnet
0530         tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
0531                 flower skip_hw dst_ip $dip ip_proto $ip_proto action drop
0532 
0533         # Generate packets to the blackhole route
0534         $MZ $h1 -$flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -b $rp1mac \
0535                 -B $dip -d 1msec -q &
0536         mz_pid=$!
0537 
0538         devlink_trap_drop_test $trap_name $rp2 101
0539         log_test "Blackhole route: IPv$flags"
0540 
0541         devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
0542         ip -$flags route del blackhole $subnet
0543 }
0544 
0545 blackhole_route_test()
0546 {
0547         __blackhole_route_test "4" "198.51.100.0/30" "ip" $h2_ipv4
0548         __blackhole_route_test "6" "2001:db8:2::/120" "ipv6" $h2_ipv6 "icmpv6"
0549 }
0550 
0551 irif_disabled_test()
0552 {
0553         local trap_name="irif_disabled"
0554         local t0_packets t0_bytes
0555         local t1_packets t1_bytes
0556         local mz_pid
0557 
0558         RET=0
0559 
0560         ping_check $trap_name
0561 
0562         devlink_trap_action_set $trap_name "trap"
0563 
0564         # When RIF of a physical port ("Sub-port RIF") is destroyed, we first
0565         # block the STP of the {Port, VLAN} so packets cannot get into the RIF.
0566         # Using bridge enables us to see this trap because when bridge is
0567         # destroyed, there is a small time window that packets can go into the
0568         # RIF, while it is disabled.
0569         ip link add dev br0 type bridge
0570         ip link set dev $rp1 master br0
0571         ip address flush dev $rp1
0572         __addr_add_del br0 add 192.0.2.2/24
0573         ip li set dev br0 up
0574 
0575         t0_packets=$(devlink_trap_rx_packets_get $trap_name)
0576         t0_bytes=$(devlink_trap_rx_bytes_get $trap_name)
0577 
0578         # Generate packets to h2 through br0 RIF that will be removed later
0579         $MZ $h1 -t udp "sp=54321,dp=12345" -c 0 -p 100 -a own -b $rp1mac \
0580                 -B $h2_ipv4 -q &
0581         mz_pid=$!
0582 
0583         # Wait before removing br0 RIF to allow packets to go into the bridge.
0584         sleep 1
0585 
0586         # Flushing address will dismantle the RIF
0587         ip address flush dev br0
0588 
0589         t1_packets=$(devlink_trap_rx_packets_get $trap_name)
0590         t1_bytes=$(devlink_trap_rx_bytes_get $trap_name)
0591 
0592         if [[ $t0_packets -eq $t1_packets && $t0_bytes -eq $t1_bytes ]]; then
0593                 check_err 1 "Trap stats idle when packets should be trapped"
0594         fi
0595 
0596         log_test "Ingress RIF disabled"
0597 
0598         kill $mz_pid && wait $mz_pid &> /dev/null
0599         ip link set dev $rp1 nomaster
0600         __addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64
0601         ip link del dev br0 type bridge
0602         devlink_trap_action_set $trap_name "drop"
0603 }
0604 
0605 erif_disabled_test()
0606 {
0607         local trap_name="erif_disabled"
0608         local t0_packets t0_bytes
0609         local t1_packets t1_bytes
0610         local mz_pid
0611 
0612         RET=0
0613 
0614         ping_check $trap_name
0615 
0616         devlink_trap_action_set $trap_name "trap"
0617         ip link add dev br0 type bridge
0618         ip add flush dev $rp1
0619         ip link set dev $rp1 master br0
0620         __addr_add_del br0 add 192.0.2.2/24
0621         ip link set dev br0 up
0622 
0623         t0_packets=$(devlink_trap_rx_packets_get $trap_name)
0624         t0_bytes=$(devlink_trap_rx_bytes_get $trap_name)
0625 
0626         rp2mac=$(mac_get $rp2)
0627 
0628         # Generate packets that should go out through br0 RIF that will be
0629         # removed later
0630         $MZ $h2 -t udp "sp=54321,dp=12345" -c 0 -p 100 -a own -b $rp2mac \
0631                 -B 192.0.2.1 -q &
0632         mz_pid=$!
0633 
0634         sleep 5
0635         # Unlinking the port from the bridge will disable the RIF associated
0636         # with br0 as it is no longer an upper of any mlxsw port.
0637         ip link set dev $rp1 nomaster
0638 
0639         t1_packets=$(devlink_trap_rx_packets_get $trap_name)
0640         t1_bytes=$(devlink_trap_rx_bytes_get $trap_name)
0641 
0642         if [[ $t0_packets -eq $t1_packets && $t0_bytes -eq $t1_bytes ]]; then
0643                 check_err 1 "Trap stats idle when packets should be trapped"
0644         fi
0645 
0646         log_test "Egress RIF disabled"
0647 
0648         kill $mz_pid && wait $mz_pid &> /dev/null
0649         __addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64
0650         ip link del dev br0 type bridge
0651         devlink_trap_action_set $trap_name "drop"
0652 }
0653 
0654 __blackhole_nexthop_test()
0655 {
0656         local flags=$1; shift
0657         local subnet=$1; shift
0658         local proto=$1; shift
0659         local dip=$1; shift
0660         local trap_name="blackhole_nexthop"
0661         local mz_pid
0662 
0663         RET=0
0664 
0665         ip -$flags nexthop add id 1 blackhole
0666         ip -$flags route add $subnet nhid 1
0667         tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
0668                 flower skip_hw dst_ip $dip ip_proto udp action drop
0669 
0670         # Generate packets to the blackhole nexthop
0671         $MZ $h1 -$flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -b $rp1mac \
0672                 -B $dip -d 1msec -q &
0673         mz_pid=$!
0674 
0675         devlink_trap_drop_test $trap_name $rp2 101
0676         log_test "Blackhole nexthop: IPv$flags"
0677 
0678         devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
0679         ip -$flags route del $subnet
0680         ip -$flags nexthop del id 1
0681 }
0682 
0683 blackhole_nexthop_test()
0684 {
0685         __blackhole_nexthop_test "4" "198.51.100.0/30" "ip" $h2_ipv4
0686         __blackhole_nexthop_test "6" "2001:db8:2::/120" "ipv6" $h2_ipv6
0687 }
0688 
0689 trap cleanup EXIT
0690 
0691 setup_prepare
0692 setup_wait
0693 
0694 tests_run
0695 
0696 exit $EXIT_STATUS