202 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03#4# Test that blackhole routes are marked as offloaded and that packets hitting5# them are dropped by the ASIC and not by the kernel.6#7# +---------------------------------+8# | H1 (vrf) |9# | + $h1 |10# | | 192.0.2.1/24 |11# | | 2001:db8:1::1/64 |12# | | |13# | | default via 192.0.2.2 |14# | | default via 2001:db8:1::2 |15# +----|----------------------------+16# |17# +----|----------------------------------------------------------------------+18# | SW | |19# | + $rp1 |20# | 192.0.2.2/24 |21# | 2001:db8:1::2/64 |22# | |23# | 2001:db8:2::2/64 |24# | 198.51.100.2/24 |25# | + $rp2 |26# | | |27# +----|----------------------------------------------------------------------+28# |29# +----|----------------------------+30# | | default via 198.51.100.2 |31# | | default via 2001:db8:2::2 |32# | | |33# | | 2001:db8:2::1/64 |34# | | 198.51.100.1/24 |35# | + $h2 |36# | H2 (vrf) |37# +---------------------------------+38 39lib_dir=$(dirname $0)/../../../net/forwarding40 41ALL_TESTS="42 ping_ipv443 ping_ipv644 blackhole_ipv445 blackhole_ipv646"47NUM_NETIFS=448: ${TIMEOUT:=20000} # ms49source $lib_dir/tc_common.sh50source $lib_dir/lib.sh51 52h1_create()53{54 simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/6455 56 ip -4 route add default vrf v$h1 nexthop via 192.0.2.257 ip -6 route add default vrf v$h1 nexthop via 2001:db8:1::258}59 60h1_destroy()61{62 ip -6 route del default vrf v$h1 nexthop via 2001:db8:1::263 ip -4 route del default vrf v$h1 nexthop via 192.0.2.264 65 simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/6466}67 68h2_create()69{70 simple_if_init $h2 198.51.100.1/24 2001:db8:2::1/6471 72 ip -4 route add default vrf v$h2 nexthop via 198.51.100.273 ip -6 route add default vrf v$h2 nexthop via 2001:db8:2::274}75 76h2_destroy()77{78 ip -6 route del default vrf v$h2 nexthop via 2001:db8:2::279 ip -4 route del default vrf v$h2 nexthop via 198.51.100.280 81 simple_if_fini $h2 198.51.100.1/24 2001:db8:2::1/6482}83 84router_create()85{86 ip link set dev $rp1 up87 ip link set dev $rp2 up88 89 tc qdisc add dev $rp1 clsact90 91 __addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/6492 __addr_add_del $rp2 add 198.51.100.2/24 2001:db8:2::2/6493}94 95router_destroy()96{97 __addr_add_del $rp2 del 198.51.100.2/24 2001:db8:2::2/6498 __addr_add_del $rp1 del 192.0.2.2/24 2001:db8:1::2/6499 100 tc qdisc del dev $rp1 clsact101 102 ip link set dev $rp2 down103 ip link set dev $rp1 down104}105 106ping_ipv4()107{108 ping_test $h1 198.51.100.1 ": h1->h2"109}110 111ping_ipv6()112{113 ping6_test $h1 2001:db8:2::1 ": h1->h2"114}115 116blackhole_ipv4()117{118 # Transmit packets from H1 to H2 and make sure they are dropped by the119 # ASIC and not by the kernel120 RET=0121 122 ip -4 route add blackhole 198.51.100.0/30123 tc filter add dev $rp1 ingress protocol ip pref 1 handle 101 flower \124 skip_hw dst_ip 198.51.100.1 src_ip 192.0.2.1 ip_proto icmp \125 action pass126 127 busywait "$TIMEOUT" wait_for_offload ip -4 route show 198.51.100.0/30128 check_err $? "route not marked as offloaded when should"129 130 ping_do $h1 198.51.100.1131 check_fail $? "ping passed when should not"132 133 tc_check_packets "dev $rp1 ingress" 101 0134 check_err $? "packets trapped and not dropped by ASIC"135 136 log_test "IPv4 blackhole route"137 138 tc filter del dev $rp1 ingress protocol ip pref 1 handle 101 flower139 ip -4 route del blackhole 198.51.100.0/30140}141 142blackhole_ipv6()143{144 RET=0145 146 ip -6 route add blackhole 2001:db8:2::/120147 tc filter add dev $rp1 ingress protocol ipv6 pref 1 handle 101 flower \148 skip_hw dst_ip 2001:db8:2::1 src_ip 2001:db8:1::1 \149 ip_proto icmpv6 action pass150 151 busywait "$TIMEOUT" wait_for_offload ip -6 route show 2001:db8:2::/120152 check_err $? "route not marked as offloaded when should"153 154 ping6_do $h1 2001:db8:2::1155 check_fail $? "ping passed when should not"156 157 tc_check_packets "dev $rp1 ingress" 101 0158 check_err $? "packets trapped and not dropped by ASIC"159 160 log_test "IPv6 blackhole route"161 162 tc filter del dev $rp1 ingress protocol ipv6 pref 1 handle 101 flower163 ip -6 route del blackhole 2001:db8:2::/120164}165 166setup_prepare()167{168 h1=${NETIFS[p1]}169 rp1=${NETIFS[p2]}170 171 rp2=${NETIFS[p3]}172 h2=${NETIFS[p4]}173 174 vrf_prepare175 forwarding_enable176 177 h1_create178 h2_create179 router_create180}181 182cleanup()183{184 pre_cleanup185 186 router_destroy187 h2_destroy188 h1_destroy189 190 forwarding_restore191 vrf_cleanup192}193 194trap cleanup EXIT195 196setup_prepare197setup_wait198 199tests_run200 201exit $EXIT_STATUS202