1a98232a1SIdo Schimmel#!/bin/bash 2a98232a1SIdo Schimmel# SPDX-License-Identifier: GPL-2.0 3a98232a1SIdo Schimmel# 4a98232a1SIdo Schimmel# Test that blackhole routes are marked as offloaded and that packets hitting 5a98232a1SIdo Schimmel# them are dropped by the ASIC and not by the kernel. 6a98232a1SIdo Schimmel# 7a98232a1SIdo Schimmel# +---------------------------------+ 8a98232a1SIdo Schimmel# | H1 (vrf) | 9a98232a1SIdo Schimmel# | + $h1 | 10a98232a1SIdo Schimmel# | | 192.0.2.1/24 | 11a98232a1SIdo Schimmel# | | 2001:db8:1::1/64 | 12a98232a1SIdo Schimmel# | | | 13a98232a1SIdo Schimmel# | | default via 192.0.2.2 | 14a98232a1SIdo Schimmel# | | default via 2001:db8:1::2 | 15a98232a1SIdo Schimmel# +----|----------------------------+ 16a98232a1SIdo Schimmel# | 17a98232a1SIdo Schimmel# +----|----------------------------------------------------------------------+ 18a98232a1SIdo Schimmel# | SW | | 19a98232a1SIdo Schimmel# | + $rp1 | 20a98232a1SIdo Schimmel# | 192.0.2.2/24 | 21a98232a1SIdo Schimmel# | 2001:db8:1::2/64 | 22a98232a1SIdo Schimmel# | | 23a98232a1SIdo Schimmel# | 2001:db8:2::2/64 | 24a98232a1SIdo Schimmel# | 198.51.100.2/24 | 25a98232a1SIdo Schimmel# | + $rp2 | 26a98232a1SIdo Schimmel# | | | 27a98232a1SIdo Schimmel# +----|----------------------------------------------------------------------+ 28a98232a1SIdo Schimmel# | 29a98232a1SIdo Schimmel# +----|----------------------------+ 30a98232a1SIdo Schimmel# | | default via 198.51.100.2 | 31a98232a1SIdo Schimmel# | | default via 2001:db8:2::2 | 32a98232a1SIdo Schimmel# | | | 33a98232a1SIdo Schimmel# | | 2001:db8:2::1/64 | 34a98232a1SIdo Schimmel# | | 198.51.100.1/24 | 35a98232a1SIdo Schimmel# | + $h2 | 36a98232a1SIdo Schimmel# | H2 (vrf) | 37a98232a1SIdo Schimmel# +---------------------------------+ 38a98232a1SIdo Schimmel 39a98232a1SIdo Schimmellib_dir=$(dirname $0)/../../../net/forwarding 40a98232a1SIdo Schimmel 41a98232a1SIdo SchimmelALL_TESTS=" 42a98232a1SIdo Schimmel ping_ipv4 43a98232a1SIdo Schimmel ping_ipv6 44a98232a1SIdo Schimmel blackhole_ipv4 45a98232a1SIdo Schimmel blackhole_ipv6 46a98232a1SIdo Schimmel" 47a98232a1SIdo SchimmelNUM_NETIFS=4 48*0c22f993SDanielle Ratson: ${TIMEOUT:=20000} # ms 49a98232a1SIdo Schimmelsource $lib_dir/tc_common.sh 50a98232a1SIdo Schimmelsource $lib_dir/lib.sh 51a98232a1SIdo Schimmel 52a98232a1SIdo Schimmelh1_create() 53a98232a1SIdo Schimmel{ 54a98232a1SIdo Schimmel simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/64 55a98232a1SIdo Schimmel 56a98232a1SIdo Schimmel ip -4 route add default vrf v$h1 nexthop via 192.0.2.2 57a98232a1SIdo Schimmel ip -6 route add default vrf v$h1 nexthop via 2001:db8:1::2 58a98232a1SIdo Schimmel} 59a98232a1SIdo Schimmel 60a98232a1SIdo Schimmelh1_destroy() 61a98232a1SIdo Schimmel{ 62a98232a1SIdo Schimmel ip -6 route del default vrf v$h1 nexthop via 2001:db8:1::2 63a98232a1SIdo Schimmel ip -4 route del default vrf v$h1 nexthop via 192.0.2.2 64a98232a1SIdo Schimmel 65a98232a1SIdo Schimmel simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/64 66a98232a1SIdo Schimmel} 67a98232a1SIdo Schimmel 68a98232a1SIdo Schimmelh2_create() 69a98232a1SIdo Schimmel{ 70a98232a1SIdo Schimmel simple_if_init $h2 198.51.100.1/24 2001:db8:2::1/64 71a98232a1SIdo Schimmel 72a98232a1SIdo Schimmel ip -4 route add default vrf v$h2 nexthop via 198.51.100.2 73a98232a1SIdo Schimmel ip -6 route add default vrf v$h2 nexthop via 2001:db8:2::2 74a98232a1SIdo Schimmel} 75a98232a1SIdo Schimmel 76a98232a1SIdo Schimmelh2_destroy() 77a98232a1SIdo Schimmel{ 78a98232a1SIdo Schimmel ip -6 route del default vrf v$h2 nexthop via 2001:db8:2::2 79a98232a1SIdo Schimmel ip -4 route del default vrf v$h2 nexthop via 198.51.100.2 80a98232a1SIdo Schimmel 81a98232a1SIdo Schimmel simple_if_fini $h2 198.51.100.1/24 2001:db8:2::1/64 82a98232a1SIdo Schimmel} 83a98232a1SIdo Schimmel 84a98232a1SIdo Schimmelrouter_create() 85a98232a1SIdo Schimmel{ 86a98232a1SIdo Schimmel ip link set dev $rp1 up 87a98232a1SIdo Schimmel ip link set dev $rp2 up 88a98232a1SIdo Schimmel 89a98232a1SIdo Schimmel tc qdisc add dev $rp1 clsact 90a98232a1SIdo Schimmel 91a98232a1SIdo Schimmel __addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64 92a98232a1SIdo Schimmel __addr_add_del $rp2 add 198.51.100.2/24 2001:db8:2::2/64 93a98232a1SIdo Schimmel} 94a98232a1SIdo Schimmel 95a98232a1SIdo Schimmelrouter_destroy() 96a98232a1SIdo Schimmel{ 97a98232a1SIdo Schimmel __addr_add_del $rp2 del 198.51.100.2/24 2001:db8:2::2/64 98a98232a1SIdo Schimmel __addr_add_del $rp1 del 192.0.2.2/24 2001:db8:1::2/64 99a98232a1SIdo Schimmel 100a98232a1SIdo Schimmel tc qdisc del dev $rp1 clsact 101a98232a1SIdo Schimmel 102a98232a1SIdo Schimmel ip link set dev $rp2 down 103a98232a1SIdo Schimmel ip link set dev $rp1 down 104a98232a1SIdo Schimmel} 105a98232a1SIdo Schimmel 106a98232a1SIdo Schimmelping_ipv4() 107a98232a1SIdo Schimmel{ 108a98232a1SIdo Schimmel ping_test $h1 198.51.100.1 ": h1->h2" 109a98232a1SIdo Schimmel} 110a98232a1SIdo Schimmel 111a98232a1SIdo Schimmelping_ipv6() 112a98232a1SIdo Schimmel{ 113a98232a1SIdo Schimmel ping6_test $h1 2001:db8:2::1 ": h1->h2" 114a98232a1SIdo Schimmel} 115a98232a1SIdo Schimmel 116a98232a1SIdo Schimmelblackhole_ipv4() 117a98232a1SIdo Schimmel{ 118a98232a1SIdo Schimmel # Transmit packets from H1 to H2 and make sure they are dropped by the 119a98232a1SIdo Schimmel # ASIC and not by the kernel 120a98232a1SIdo Schimmel RET=0 121a98232a1SIdo Schimmel 122a98232a1SIdo Schimmel ip -4 route add blackhole 198.51.100.0/30 123a98232a1SIdo Schimmel tc filter add dev $rp1 ingress protocol ip pref 1 handle 101 flower \ 124a98232a1SIdo Schimmel skip_hw dst_ip 198.51.100.1 src_ip 192.0.2.1 ip_proto icmp \ 125a98232a1SIdo Schimmel action pass 126a98232a1SIdo Schimmel 127*0c22f993SDanielle Ratson busywait "$TIMEOUT" wait_for_offload ip -4 route show 198.51.100.0/30 128a98232a1SIdo Schimmel check_err $? "route not marked as offloaded when should" 129a98232a1SIdo Schimmel 130a98232a1SIdo Schimmel ping_do $h1 198.51.100.1 131a98232a1SIdo Schimmel check_fail $? "ping passed when should not" 132a98232a1SIdo Schimmel 133a98232a1SIdo Schimmel tc_check_packets "dev $rp1 ingress" 101 0 134a98232a1SIdo Schimmel check_err $? "packets trapped and not dropped by ASIC" 135a98232a1SIdo Schimmel 136a98232a1SIdo Schimmel log_test "IPv4 blackhole route" 137a98232a1SIdo Schimmel 138a98232a1SIdo Schimmel tc filter del dev $rp1 ingress protocol ip pref 1 handle 101 flower 139a98232a1SIdo Schimmel ip -4 route del blackhole 198.51.100.0/30 140a98232a1SIdo Schimmel} 141a98232a1SIdo Schimmel 142a98232a1SIdo Schimmelblackhole_ipv6() 143a98232a1SIdo Schimmel{ 144a98232a1SIdo Schimmel RET=0 145a98232a1SIdo Schimmel 146a98232a1SIdo Schimmel ip -6 route add blackhole 2001:db8:2::/120 147a98232a1SIdo Schimmel tc filter add dev $rp1 ingress protocol ipv6 pref 1 handle 101 flower \ 148a98232a1SIdo Schimmel skip_hw dst_ip 2001:db8:2::1 src_ip 2001:db8:1::1 \ 149a98232a1SIdo Schimmel ip_proto icmpv6 action pass 150a98232a1SIdo Schimmel 151*0c22f993SDanielle Ratson busywait "$TIMEOUT" wait_for_offload ip -6 route show 2001:db8:2::/120 152a98232a1SIdo Schimmel check_err $? "route not marked as offloaded when should" 153a98232a1SIdo Schimmel 154a98232a1SIdo Schimmel ping6_do $h1 2001:db8:2::1 155a98232a1SIdo Schimmel check_fail $? "ping passed when should not" 156a98232a1SIdo Schimmel 157a98232a1SIdo Schimmel tc_check_packets "dev $rp1 ingress" 101 0 158a98232a1SIdo Schimmel check_err $? "packets trapped and not dropped by ASIC" 159a98232a1SIdo Schimmel 160a98232a1SIdo Schimmel log_test "IPv6 blackhole route" 161a98232a1SIdo Schimmel 162a98232a1SIdo Schimmel tc filter del dev $rp1 ingress protocol ipv6 pref 1 handle 101 flower 163a98232a1SIdo Schimmel ip -6 route del blackhole 2001:db8:2::/120 164a98232a1SIdo Schimmel} 165a98232a1SIdo Schimmel 166a98232a1SIdo Schimmelsetup_prepare() 167a98232a1SIdo Schimmel{ 168a98232a1SIdo Schimmel h1=${NETIFS[p1]} 169a98232a1SIdo Schimmel rp1=${NETIFS[p2]} 170a98232a1SIdo Schimmel 171a98232a1SIdo Schimmel rp2=${NETIFS[p3]} 172a98232a1SIdo Schimmel h2=${NETIFS[p4]} 173a98232a1SIdo Schimmel 174a98232a1SIdo Schimmel vrf_prepare 175a98232a1SIdo Schimmel forwarding_enable 176a98232a1SIdo Schimmel 177a98232a1SIdo Schimmel h1_create 178a98232a1SIdo Schimmel h2_create 179a98232a1SIdo Schimmel router_create 180a98232a1SIdo Schimmel} 181a98232a1SIdo Schimmel 182a98232a1SIdo Schimmelcleanup() 183a98232a1SIdo Schimmel{ 184a98232a1SIdo Schimmel pre_cleanup 185a98232a1SIdo Schimmel 186a98232a1SIdo Schimmel router_destroy 187a98232a1SIdo Schimmel h2_destroy 188a98232a1SIdo Schimmel h1_destroy 189a98232a1SIdo Schimmel 190a98232a1SIdo Schimmel forwarding_restore 191a98232a1SIdo Schimmel vrf_cleanup 192a98232a1SIdo Schimmel} 193a98232a1SIdo Schimmel 194a98232a1SIdo Schimmeltrap cleanup EXIT 195a98232a1SIdo Schimmel 196a98232a1SIdo Schimmelsetup_prepare 197a98232a1SIdo Schimmelsetup_wait 198a98232a1SIdo Schimmel 199a98232a1SIdo Schimmeltests_run 200a98232a1SIdo Schimmel 201a98232a1SIdo Schimmelexit $EXIT_STATUS 202