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
0038
0039
0040
0041
0042
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
0131
0132
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