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 lib_dir=$(dirname $0)/../../../net/forwarding
0035
0036 ALL_TESTS="
0037 decap_error_test
0038 "
0039
0040 NUM_NETIFS=4
0041 source $lib_dir/lib.sh
0042 source $lib_dir/tc_common.sh
0043 source $lib_dir/devlink_lib.sh
0044
0045 h1_create()
0046 {
0047 simple_if_init $h1 192.0.2.1/28
0048 }
0049
0050 h1_destroy()
0051 {
0052 simple_if_fini $h1 192.0.2.1/28
0053 }
0054
0055 vrf2_create()
0056 {
0057 simple_if_init $rp2 198.51.100.2/28
0058 }
0059
0060 vrf2_destroy()
0061 {
0062 simple_if_fini $rp2 198.51.100.2/28
0063 }
0064
0065 switch_create()
0066 {
0067 __addr_add_del $swp1 add 192.0.2.2/28
0068 tc qdisc add dev $swp1 clsact
0069 ip link set dev $swp1 up
0070
0071 tunnel_create g1 gre 192.0.2.65 192.0.2.66 tos inherit
0072 __addr_add_del g1 add 192.0.2.65/32
0073 ip link set dev g1 up
0074
0075 __addr_add_del $rp1 add 198.51.100.1/28
0076 ip link set dev $rp1 up
0077 }
0078
0079 switch_destroy()
0080 {
0081 ip link set dev $rp1 down
0082 __addr_add_del $rp1 del 198.51.100.1/28
0083
0084 ip link set dev g1 down
0085 __addr_add_del g1 del 192.0.2.65/32
0086 tunnel_destroy g1
0087
0088 ip link set dev $swp1 down
0089 tc qdisc del dev $swp1 clsact
0090 __addr_add_del $swp1 del 192.0.2.2/28
0091 }
0092
0093 setup_prepare()
0094 {
0095 h1=${NETIFS[p1]}
0096 swp1=${NETIFS[p2]}
0097
0098 rp1=${NETIFS[p3]}
0099 rp2=${NETIFS[p4]}
0100
0101 forwarding_enable
0102 vrf_prepare
0103 h1_create
0104 switch_create
0105 vrf2_create
0106 }
0107
0108 cleanup()
0109 {
0110 pre_cleanup
0111
0112 vrf2_destroy
0113 switch_destroy
0114 h1_destroy
0115 vrf_cleanup
0116 forwarding_restore
0117 }
0118
0119 ipip_payload_get()
0120 {
0121 local flags=$1; shift
0122 local key=$1; shift
0123
0124 p=$(:
0125 )"$flags"$( : GRE flags
0126 )"0:00:"$( : Reserved + version
0127 )"08:00:"$( : ETH protocol type
0128 )"$key"$( : Key
0129 )"4"$( : IP version
0130 )"5:"$( : IHL
0131 )"00:"$( : IP TOS
0132 )"00:14:"$( : IP total length
0133 )"00:00:"$( : IP identification
0134 )"20:00:"$( : IP flags + frag off
0135 )"30:"$( : IP TTL
0136 )"01:"$( : IP proto
0137 )"E7:E6:"$( : IP header csum
0138 )"C0:00:01:01:"$( : IP saddr : 192.0.1.1
0139 )"C0:00:02:01:"$( : IP daddr : 192.0.2.1
0140 )
0141 echo $p
0142 }
0143
0144 ecn_payload_get()
0145 {
0146 echo $(ipip_payload_get "0")
0147 }
0148
0149 ecn_decap_test()
0150 {
0151 local trap_name="decap_error"
0152 local desc=$1; shift
0153 local ecn_desc=$1; shift
0154 local outer_tos=$1; shift
0155 local mz_pid
0156
0157 RET=0
0158
0159 tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \
0160 flower src_ip 192.0.1.1 dst_ip 192.0.2.1 action pass
0161
0162 rp1_mac=$(mac_get $rp1)
0163 rp2_mac=$(mac_get $rp2)
0164 payload=$(ecn_payload_get)
0165
0166 ip vrf exec v$rp2 $MZ $rp2 -c 0 -d 1msec -a $rp2_mac -b $rp1_mac \
0167 -A 192.0.2.66 -B 192.0.2.65 -t ip \
0168 len=48,tos=$outer_tos,proto=47,p=$payload -q &
0169
0170 mz_pid=$!
0171
0172 devlink_trap_exception_test $trap_name
0173
0174 tc_check_packets "dev $swp1 egress" 101 0
0175 check_err $? "Packets were not dropped"
0176
0177 log_test "$desc: Inner ECN is not ECT and outer is $ecn_desc"
0178
0179 kill $mz_pid && wait $mz_pid &> /dev/null
0180 tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower
0181 }
0182
0183 no_matching_tunnel_test()
0184 {
0185 local trap_name="decap_error"
0186 local desc=$1; shift
0187 local sip=$1; shift
0188 local mz_pid
0189
0190 RET=0
0191
0192 tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \
0193 flower src_ip 192.0.1.1 dst_ip 192.0.2.1 action pass
0194
0195 rp1_mac=$(mac_get $rp1)
0196 rp2_mac=$(mac_get $rp2)
0197 payload=$(ipip_payload_get "$@")
0198
0199 ip vrf exec v$rp2 $MZ $rp2 -c 0 -d 1msec -a $rp2_mac -b $rp1_mac \
0200 -A $sip -B 192.0.2.65 -t ip len=48,proto=47,p=$payload -q &
0201 mz_pid=$!
0202
0203 devlink_trap_exception_test $trap_name
0204
0205 tc_check_packets "dev $swp1 egress" 101 0
0206 check_err $? "Packets were not dropped"
0207
0208 log_test "$desc"
0209
0210 kill $mz_pid && wait $mz_pid &> /dev/null
0211 tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower
0212 }
0213
0214 decap_error_test()
0215 {
0216
0217 local sip=192.0.2.66
0218
0219 ecn_decap_test "Decap error" "ECT(1)" 01
0220 ecn_decap_test "Decap error" "ECT(0)" 02
0221 ecn_decap_test "Decap error" "CE" 03
0222
0223 no_matching_tunnel_test "Decap error: Source IP check failed" \
0224 192.0.2.68 "0"
0225 no_matching_tunnel_test \
0226 "Decap error: Key exists but was not expected" $sip "2" \
0227 "00:00:00:E9:"
0228
0229
0230 __addr_add_del g1 del 192.0.2.65/32
0231 tunnel_destroy g1
0232
0233 tunnel_create g1 gre 192.0.2.65 192.0.2.66 tos inherit key 233
0234 __addr_add_del g1 add 192.0.2.65/32
0235
0236 no_matching_tunnel_test \
0237 "Decap error: Key does not exist but was expected" $sip "0"
0238 no_matching_tunnel_test \
0239 "Decap error: Packet has a wrong key field" $sip "2" \
0240 "00:00:00:E8:"
0241 }
0242
0243 trap cleanup EXIT
0244
0245 setup_prepare
0246 setup_wait
0247 tests_run
0248
0249 exit $EXIT_STATUS