261 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03#4# Test a "one-armed router" [1] scenario. Packets forwarded between H1 and H25# should be forwarded by the ASIC, but also trapped so that ICMP redirect6# packets could be potentially generated.7#8# 1. https://en.wikipedia.org/wiki/One-armed_router9#10# +---------------------------------+11# | H1 (vrf) |12# | + $h1 |13# | | 192.0.2.1/24 |14# | | 2001:db8:1::1/64 |15# | | |16# | | default via 192.0.2.2 |17# | | default via 2001:db8:1::2 |18# +----|----------------------------+19# |20# +----|----------------------------------------------------------------------+21# | SW | |22# | +--|--------------------------------------------------------------------+ |23# | | + $swp1 BR0 (802.1d) | |24# | | | |25# | | 192.0.2.2/24 | |26# | | 2001:db8:1::2/64 | |27# | | 198.51.100.2/24 | |28# | | 2001:db8:2::2/64 | |29# | | | |30# | | + $swp2 | |31# | +--|--------------------------------------------------------------------+ |32# | | |33# +----|----------------------------------------------------------------------+34# |35# +----|----------------------------+36# | | default via 198.51.100.2 |37# | | default via 2001:db8:2::2 |38# | | |39# | | 2001:db8:2::1/64 |40# | | 198.51.100.1/24 |41# | + $h2 |42# | H2 (vrf) |43# +---------------------------------+44 45lib_dir=$(dirname $0)/../../../net/forwarding46 47ALL_TESTS="ping_ipv4 ping_ipv6 fwd_mark_ipv4 fwd_mark_ipv6"48NUM_NETIFS=449source $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 84switch_create()85{86 ip link add name br0 address $(mac_get $swp1) \87 type bridge mcast_snooping 088 ip link set dev br0 up89 90 ip link set dev $swp1 master br091 ip link set dev $swp1 up92 ip link set dev $swp2 master br093 ip link set dev $swp2 up94 95 tc qdisc add dev $swp1 clsact96 tc qdisc add dev $swp2 clsact97 98 __addr_add_del br0 add 192.0.2.2/24 2001:db8:1::2/6499 __addr_add_del br0 add 198.51.100.2/24 2001:db8:2::2/64100}101 102switch_destroy()103{104 __addr_add_del br0 del 198.51.100.2/24 2001:db8:2::2/64105 __addr_add_del br0 del 192.0.2.2/24 2001:db8:1::2/64106 107 tc qdisc del dev $swp2 clsact108 tc qdisc del dev $swp1 clsact109 110 ip link set dev $swp2 down111 ip link set dev $swp2 nomaster112 ip link set dev $swp1 down113 ip link set dev $swp1 nomaster114 115 ip link set dev br0 down116 ip link del dev br0117}118 119ping_ipv4()120{121 ping_test $h1 198.51.100.1 ": h1->h2"122}123 124ping_ipv6()125{126 ping6_test $h1 2001:db8:2::1 ": h1->h2"127}128 129fwd_mark_ipv4()130{131 # Transmit packets from H1 to H2 and make sure they are trapped at132 # swp1 due to loopback error, but only forwarded by the ASIC through133 # swp2134 135 tc filter add dev $swp1 ingress protocol ip pref 1 handle 101 flower \136 skip_hw dst_ip 198.51.100.1 ip_proto udp dst_port 52768 \137 action pass138 139 tc filter add dev $swp2 egress protocol ip pref 1 handle 101 flower \140 skip_hw dst_ip 198.51.100.1 ip_proto udp dst_port 52768 \141 action pass142 143 tc filter add dev $swp2 egress protocol ip pref 2 handle 102 flower \144 skip_sw dst_ip 198.51.100.1 ip_proto udp dst_port 52768 \145 action pass146 147 ip vrf exec v$h1 $MZ $h1 -c 10 -d 100msec -p 64 -A 192.0.2.1 \148 -B 198.51.100.1 -t udp dp=52768,sp=42768 -q149 150 RET=0151 152 tc_check_packets "dev $swp1 ingress" 101 10153 check_err $?154 155 log_test "fwd mark: trapping IPv4 packets due to LBERROR"156 157 RET=0158 159 tc_check_packets "dev $swp2 egress" 101 0160 check_err $?161 162 log_test "fwd mark: forwarding IPv4 packets in software"163 164 RET=0165 166 tc_check_packets "dev $swp2 egress" 102 10167 check_err $?168 169 log_test "fwd mark: forwarding IPv4 packets in hardware"170 171 tc filter del dev $swp2 egress protocol ip pref 2 handle 102 flower172 tc filter del dev $swp2 egress protocol ip pref 1 handle 101 flower173 tc filter del dev $swp1 ingress protocol ip pref 1 handle 101 flower174}175 176fwd_mark_ipv6()177{178 tc filter add dev $swp1 ingress protocol ipv6 pref 1 handle 101 flower \179 skip_hw dst_ip 2001:db8:2::1 ip_proto udp dst_port 52768 \180 action pass181 182 tc filter add dev $swp2 egress protocol ipv6 pref 1 handle 101 flower \183 skip_hw dst_ip 2001:db8:2::1 ip_proto udp dst_port 52768 \184 action pass185 186 tc filter add dev $swp2 egress protocol ipv6 pref 2 handle 102 flower \187 skip_sw dst_ip 2001:db8:2::1 ip_proto udp dst_port 52768 \188 action pass189 190 ip vrf exec v$h1 $MZ $h1 -6 -c 10 -d 100msec -p 64 -A 2001:db8:1::1 \191 -B 2001:db8:2::1 -t udp dp=52768,sp=42768 -q192 193 RET=0194 195 tc_check_packets "dev $swp1 ingress" 101 10196 check_err $?197 198 log_test "fwd mark: trapping IPv6 packets due to LBERROR"199 200 RET=0201 202 tc_check_packets "dev $swp2 egress" 101 0203 check_err $?204 205 log_test "fwd mark: forwarding IPv6 packets in software"206 207 RET=0208 209 tc_check_packets "dev $swp2 egress" 102 10210 check_err $?211 212 log_test "fwd mark: forwarding IPv6 packets in hardware"213 214 tc filter del dev $swp2 egress protocol ipv6 pref 2 handle 102 flower215 tc filter del dev $swp2 egress protocol ipv6 pref 1 handle 101 flower216 tc filter del dev $swp1 ingress protocol ipv6 pref 1 handle 101 flower217}218 219setup_prepare()220{221 h1=${NETIFS[p1]}222 swp1=${NETIFS[p2]}223 224 swp2=${NETIFS[p3]}225 h2=${NETIFS[p4]}226 227 vrf_prepare228 forwarding_enable229 230 sysctl_set net.ipv4.conf.all.accept_redirects 0231 sysctl_set net.ipv6.conf.all.accept_redirects 0232 233 h1_create234 h2_create235 switch_create236}237 238cleanup()239{240 pre_cleanup241 242 switch_destroy243 h2_destroy244 h1_destroy245 246 sysctl_restore net.ipv6.conf.all.accept_redirects247 sysctl_restore net.ipv4.conf.all.accept_redirects248 249 forwarding_restore250 vrf_cleanup251}252 253trap cleanup EXIT254 255setup_prepare256setup_wait257 258tests_run259 260exit $EXIT_STATUS261