Back to home page

OSCL-LXR

 
 

    


0001 # SPDX-License-Identifier: GPL-2.0
0002 
0003 # Test offloading a number of mirrors-to-gretap. The test creates a number of
0004 # tunnels. Then it adds one flower mirror for each of the tunnels, matching a
0005 # given host IP. Then it generates traffic at each of the host IPs and checks
0006 # that the traffic has been mirrored at the appropriate tunnel.
0007 #
0008 #   +--------------------------+                   +--------------------------+
0009 #   | H1                       |                   |                       H2 |
0010 #   |     + $h1                |                   |                $h2 +     |
0011 #   |     | 2001:db8:1:X::1/64 |                   | 2001:db8:1:X::2/64 |     |
0012 #   +-----|--------------------+                   +--------------------|-----+
0013 #         |                                                             |
0014 #   +-----|-------------------------------------------------------------|-----+
0015 #   | SW  o--> mirrors                                                  |     |
0016 #   | +---|-------------------------------------------------------------|---+ |
0017 #   | |   + $swp1                    BR                           $swp2 +   | |
0018 #   | +---------------------------------------------------------------------+ |
0019 #   |                                                                         |
0020 #   |     + $swp3                          + gt6-<X> (ip6gretap)              |
0021 #   |     | 2001:db8:2:X::1/64             : loc=2001:db8:2:X::1              |
0022 #   |     |                                : rem=2001:db8:2:X::2              |
0023 #   |     |                                : ttl=100                          |
0024 #   |     |                                : tos=inherit                      |
0025 #   |     |                                :                                  |
0026 #   +-----|--------------------------------:----------------------------------+
0027 #         |                                :
0028 #   +-----|--------------------------------:----------------------------------+
0029 #   | H3  + $h3                            + h3-gt6-<X> (ip6gretap)           |
0030 #   |       2001:db8:2:X::2/64               loc=2001:db8:2:X::2              |
0031 #   |                                        rem=2001:db8:2:X::1              |
0032 #   |                                        ttl=100                          |
0033 #   |                                        tos=inherit                      |
0034 #   |                                                                         |
0035 #   +-------------------------------------------------------------------------+
0036 
0037 source ../../../../net/forwarding/mirror_lib.sh
0038 
0039 MIRROR_NUM_NETIFS=6
0040 
0041 mirror_gre_ipv6_addr()
0042 {
0043         local net=$1; shift
0044         local num=$1; shift
0045 
0046         printf "2001:db8:%x:%x" $net $num
0047 }
0048 
0049 mirror_gre_tunnels_create()
0050 {
0051         local count=$1; shift
0052         local should_fail=$1; shift
0053 
0054         MIRROR_GRE_BATCH_FILE="$(mktemp)"
0055         for ((i=0; i < count; ++i)); do
0056                 local match_dip=$(mirror_gre_ipv6_addr 1 $i)::2
0057                 local htun=h3-gt6-$i
0058                 local tun=gt6-$i
0059 
0060                 ((mirror_gre_tunnels++))
0061 
0062                 ip address add dev $h1 $(mirror_gre_ipv6_addr 1 $i)::1/64
0063                 ip address add dev $h2 $(mirror_gre_ipv6_addr 1 $i)::2/64
0064 
0065                 ip address add dev $swp3 $(mirror_gre_ipv6_addr 2 $i)::1/64
0066                 ip address add dev $h3 $(mirror_gre_ipv6_addr 2 $i)::2/64
0067 
0068                 tunnel_create $tun ip6gretap \
0069                               $(mirror_gre_ipv6_addr 2 $i)::1 \
0070                               $(mirror_gre_ipv6_addr 2 $i)::2 \
0071                               ttl 100 tos inherit allow-localremote
0072 
0073                 tunnel_create $htun ip6gretap \
0074                               $(mirror_gre_ipv6_addr 2 $i)::2 \
0075                               $(mirror_gre_ipv6_addr 2 $i)::1
0076                 ip link set $htun vrf v$h3
0077                 matchall_sink_create $htun
0078 
0079                 cat >> $MIRROR_GRE_BATCH_FILE <<-EOF
0080                         filter add dev $swp1 ingress pref 1000 \
0081                                 protocol ipv6 \
0082                                 flower $tcflags dst_ip $match_dip \
0083                                 action mirred egress mirror dev $tun
0084                 EOF
0085         done
0086 
0087         tc -b $MIRROR_GRE_BATCH_FILE
0088         check_err_fail $should_fail $? "Mirror rule insertion"
0089 }
0090 
0091 mirror_gre_tunnels_destroy()
0092 {
0093         local count=$1; shift
0094 
0095         for ((i=0; i < count; ++i)); do
0096                 local htun=h3-gt6-$i
0097                 local tun=gt6-$i
0098 
0099                 ip address del dev $h3 $(mirror_gre_ipv6_addr 2 $i)::2/64
0100                 ip address del dev $swp3 $(mirror_gre_ipv6_addr 2 $i)::1/64
0101 
0102                 ip address del dev $h2 $(mirror_gre_ipv6_addr 1 $i)::2/64
0103                 ip address del dev $h1 $(mirror_gre_ipv6_addr 1 $i)::1/64
0104 
0105                 tunnel_destroy $htun
0106                 tunnel_destroy $tun
0107         done
0108 }
0109 
0110 __mirror_gre_test()
0111 {
0112         local count=$1; shift
0113         local should_fail=$1; shift
0114 
0115         mirror_gre_tunnels_create $count $should_fail
0116         if ((should_fail)); then
0117             return
0118         fi
0119 
0120         sleep 5
0121 
0122         for ((i = 0; i < count; ++i)); do
0123                 local sip=$(mirror_gre_ipv6_addr 1 $i)::1
0124                 local dip=$(mirror_gre_ipv6_addr 1 $i)::2
0125                 local htun=h3-gt6-$i
0126                 local message
0127 
0128                 icmp6_capture_install $htun
0129                 mirror_test v$h1 $sip $dip $htun 100 10
0130                 icmp6_capture_uninstall $htun
0131         done
0132 }
0133 
0134 mirror_gre_test()
0135 {
0136         local count=$1; shift
0137         local should_fail=$1; shift
0138 
0139         if ! tc_offload_check $TC_FLOWER_NUM_NETIFS; then
0140                 check_err 1 "Could not test offloaded functionality"
0141                 return
0142         fi
0143 
0144         tcflags="skip_sw"
0145         __mirror_gre_test $count $should_fail
0146 }
0147 
0148 mirror_gre_setup_prepare()
0149 {
0150         h1=${NETIFS[p1]}
0151         swp1=${NETIFS[p2]}
0152 
0153         swp2=${NETIFS[p3]}
0154         h2=${NETIFS[p4]}
0155 
0156         swp3=${NETIFS[p5]}
0157         h3=${NETIFS[p6]}
0158 
0159         mirror_gre_tunnels=0
0160 
0161         vrf_prepare
0162 
0163         simple_if_init $h1
0164         simple_if_init $h2
0165         simple_if_init $h3
0166 
0167         ip link add name br1 type bridge vlan_filtering 1
0168         ip link set dev br1 up
0169 
0170         ip link set dev $swp1 master br1
0171         ip link set dev $swp1 up
0172         tc qdisc add dev $swp1 clsact
0173 
0174         ip link set dev $swp2 master br1
0175         ip link set dev $swp2 up
0176 
0177         ip link set dev $swp3 up
0178 }
0179 
0180 mirror_gre_cleanup()
0181 {
0182         mirror_gre_tunnels_destroy $mirror_gre_tunnels
0183 
0184         ip link set dev $swp3 down
0185 
0186         ip link set dev $swp2 down
0187 
0188         tc qdisc del dev $swp1 clsact
0189         ip link set dev $swp1 down
0190 
0191         ip link del dev br1
0192 
0193         simple_if_fini $h3
0194         simple_if_fini $h2
0195         simple_if_fini $h1
0196 
0197         vrf_cleanup
0198 }