Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 #
0004 # Test a "one-armed router" [1] scenario. Packets forwarded between H1 and H2
0005 # should be forwarded by the ASIC, but also trapped so that ICMP redirect
0006 # packets could be potentially generated.
0007 #
0008 # 1. https://en.wikipedia.org/wiki/One-armed_router
0009 #
0010 # +---------------------------------+
0011 # | H1 (vrf)                        |
0012 # |    + $h1                        |
0013 # |    | 192.0.2.1/24               |
0014 # |    | 2001:db8:1::1/64           |
0015 # |    |                            |
0016 # |    |  default via 192.0.2.2     |
0017 # |    |  default via 2001:db8:1::2 |
0018 # +----|----------------------------+
0019 #      |
0020 # +----|----------------------------------------------------------------------+
0021 # | SW |                                                                      |
0022 # | +--|--------------------------------------------------------------------+ |
0023 # | |  + $swp1                   BR0 (802.1d)                               | |
0024 # | |                                                                       | |
0025 # | |                            192.0.2.2/24                               | |
0026 # | |                          2001:db8:1::2/64                             | |
0027 # | |                           198.51.100.2/24                             | |
0028 # | |                          2001:db8:2::2/64                             | |
0029 # | |                                                                       | |
0030 # | |  + $swp2                                                              | |
0031 # | +--|--------------------------------------------------------------------+ |
0032 # |    |                                                                      |
0033 # +----|----------------------------------------------------------------------+
0034 #      |
0035 # +----|----------------------------+
0036 # |    |  default via 198.51.100.2  |
0037 # |    |  default via 2001:db8:2::2 |
0038 # |    |                            |
0039 # |    | 2001:db8:2::1/64           |
0040 # |    | 198.51.100.1/24            |
0041 # |    + $h2                        |
0042 # | H2 (vrf)                        |
0043 # +---------------------------------+
0044 
0045 lib_dir=$(dirname $0)/../../../net/forwarding
0046 
0047 ALL_TESTS="ping_ipv4 ping_ipv6 fwd_mark_ipv4 fwd_mark_ipv6"
0048 NUM_NETIFS=4
0049 source $lib_dir/tc_common.sh
0050 source $lib_dir/lib.sh
0051 
0052 h1_create()
0053 {
0054         simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/64
0055 
0056         ip -4 route add default vrf v$h1 nexthop via 192.0.2.2
0057         ip -6 route add default vrf v$h1 nexthop via 2001:db8:1::2
0058 }
0059 
0060 h1_destroy()
0061 {
0062         ip -6 route del default vrf v$h1 nexthop via 2001:db8:1::2
0063         ip -4 route del default vrf v$h1 nexthop via 192.0.2.2
0064 
0065         simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/64
0066 }
0067 
0068 h2_create()
0069 {
0070         simple_if_init $h2 198.51.100.1/24 2001:db8:2::1/64
0071 
0072         ip -4 route add default vrf v$h2 nexthop via 198.51.100.2
0073         ip -6 route add default vrf v$h2 nexthop via 2001:db8:2::2
0074 }
0075 
0076 h2_destroy()
0077 {
0078         ip -6 route del default vrf v$h2 nexthop via 2001:db8:2::2
0079         ip -4 route del default vrf v$h2 nexthop via 198.51.100.2
0080 
0081         simple_if_fini $h2 198.51.100.1/24 2001:db8:2::1/64
0082 }
0083 
0084 switch_create()
0085 {
0086         ip link add name br0 type bridge mcast_snooping 0
0087         ip link set dev br0 up
0088 
0089         ip link set dev $swp1 master br0
0090         ip link set dev $swp1 up
0091         ip link set dev $swp2 master br0
0092         ip link set dev $swp2 up
0093 
0094         tc qdisc add dev $swp1 clsact
0095         tc qdisc add dev $swp2 clsact
0096 
0097         __addr_add_del br0 add 192.0.2.2/24 2001:db8:1::2/64
0098         __addr_add_del br0 add 198.51.100.2/24 2001:db8:2::2/64
0099 }
0100 
0101 switch_destroy()
0102 {
0103         __addr_add_del br0 del 198.51.100.2/24 2001:db8:2::2/64
0104         __addr_add_del br0 del 192.0.2.2/24 2001:db8:1::2/64
0105 
0106         tc qdisc del dev $swp2 clsact
0107         tc qdisc del dev $swp1 clsact
0108 
0109         ip link set dev $swp2 down
0110         ip link set dev $swp2 nomaster
0111         ip link set dev $swp1 down
0112         ip link set dev $swp1 nomaster
0113 
0114         ip link set dev br0 down
0115         ip link del dev br0
0116 }
0117 
0118 ping_ipv4()
0119 {
0120         ping_test $h1 198.51.100.1 ": h1->h2"
0121 }
0122 
0123 ping_ipv6()
0124 {
0125         ping6_test $h1 2001:db8:2::1 ": h1->h2"
0126 }
0127 
0128 fwd_mark_ipv4()
0129 {
0130         # Transmit packets from H1 to H2 and make sure they are trapped at
0131         # swp1 due to loopback error, but only forwarded by the ASIC through
0132         # swp2
0133 
0134         tc filter add dev $swp1 ingress protocol ip pref 1 handle 101 flower \
0135                 skip_hw dst_ip 198.51.100.1 ip_proto udp dst_port 52768 \
0136                 action pass
0137 
0138         tc filter add dev $swp2 egress protocol ip pref 1 handle 101 flower \
0139                 skip_hw dst_ip 198.51.100.1 ip_proto udp dst_port 52768 \
0140                 action pass
0141 
0142         tc filter add dev $swp2 egress protocol ip pref 2 handle 102 flower \
0143                 skip_sw dst_ip 198.51.100.1 ip_proto udp dst_port 52768 \
0144                 action pass
0145 
0146         ip vrf exec v$h1 $MZ $h1 -c 10 -d 100msec -p 64 -A 192.0.2.1 \
0147                 -B 198.51.100.1 -t udp dp=52768,sp=42768 -q
0148 
0149         RET=0
0150 
0151         tc_check_packets "dev $swp1 ingress" 101 10
0152         check_err $?
0153 
0154         log_test "fwd mark: trapping IPv4 packets due to LBERROR"
0155 
0156         RET=0
0157 
0158         tc_check_packets "dev $swp2 egress" 101 0
0159         check_err $?
0160 
0161         log_test "fwd mark: forwarding IPv4 packets in software"
0162 
0163         RET=0
0164 
0165         tc_check_packets "dev $swp2 egress" 102 10
0166         check_err $?
0167 
0168         log_test "fwd mark: forwarding IPv4 packets in hardware"
0169 
0170         tc filter del dev $swp2 egress protocol ip pref 2 handle 102 flower
0171         tc filter del dev $swp2 egress protocol ip pref 1 handle 101 flower
0172         tc filter del dev $swp1 ingress protocol ip pref 1 handle 101 flower
0173 }
0174 
0175 fwd_mark_ipv6()
0176 {
0177         tc filter add dev $swp1 ingress protocol ipv6 pref 1 handle 101 flower \
0178                 skip_hw dst_ip 2001:db8:2::1 ip_proto udp dst_port 52768 \
0179                 action pass
0180 
0181         tc filter add dev $swp2 egress protocol ipv6 pref 1 handle 101 flower \
0182                 skip_hw dst_ip 2001:db8:2::1 ip_proto udp dst_port 52768 \
0183                 action pass
0184 
0185         tc filter add dev $swp2 egress protocol ipv6 pref 2 handle 102 flower \
0186                 skip_sw dst_ip 2001:db8:2::1 ip_proto udp dst_port 52768 \
0187                 action pass
0188 
0189         ip vrf exec v$h1 $MZ $h1 -6 -c 10 -d 100msec -p 64 -A 2001:db8:1::1 \
0190                 -B 2001:db8:2::1 -t udp dp=52768,sp=42768 -q
0191 
0192         RET=0
0193 
0194         tc_check_packets "dev $swp1 ingress" 101 10
0195         check_err $?
0196 
0197         log_test "fwd mark: trapping IPv6 packets due to LBERROR"
0198 
0199         RET=0
0200 
0201         tc_check_packets "dev $swp2 egress" 101 0
0202         check_err $?
0203 
0204         log_test "fwd mark: forwarding IPv6 packets in software"
0205 
0206         RET=0
0207 
0208         tc_check_packets "dev $swp2 egress" 102 10
0209         check_err $?
0210 
0211         log_test "fwd mark: forwarding IPv6 packets in hardware"
0212 
0213         tc filter del dev $swp2 egress protocol ipv6 pref 2 handle 102 flower
0214         tc filter del dev $swp2 egress protocol ipv6 pref 1 handle 101 flower
0215         tc filter del dev $swp1 ingress protocol ipv6 pref 1 handle 101 flower
0216 }
0217 
0218 setup_prepare()
0219 {
0220         h1=${NETIFS[p1]}
0221         swp1=${NETIFS[p2]}
0222 
0223         swp2=${NETIFS[p3]}
0224         h2=${NETIFS[p4]}
0225 
0226         vrf_prepare
0227         forwarding_enable
0228 
0229         sysctl_set net.ipv4.conf.all.accept_redirects 0
0230         sysctl_set net.ipv6.conf.all.accept_redirects 0
0231 
0232         h1_create
0233         h2_create
0234         switch_create
0235 }
0236 
0237 cleanup()
0238 {
0239         pre_cleanup
0240 
0241         switch_destroy
0242         h2_destroy
0243         h1_destroy
0244 
0245         sysctl_restore net.ipv6.conf.all.accept_redirects
0246         sysctl_restore net.ipv4.conf.all.accept_redirects
0247 
0248         forwarding_restore
0249         vrf_cleanup
0250 }
0251 
0252 trap cleanup EXIT
0253 
0254 setup_prepare
0255 setup_wait
0256 
0257 tests_run
0258 
0259 exit $EXIT_STATUS