0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
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 }