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 lib_dir=$(dirname $0)/../../../net/forwarding
0036
0037 ALL_TESTS="
0038 decap_error_test
0039 overlay_smac_is_mc_test
0040 "
0041
0042 NUM_NETIFS=4
0043 source $lib_dir/lib.sh
0044 source $lib_dir/tc_common.sh
0045 source $lib_dir/devlink_lib.sh
0046
0047 : ${VXPORT:=4789}
0048 export VXPORT
0049
0050 h1_create()
0051 {
0052 simple_if_init $h1 192.0.2.1/28
0053 }
0054
0055 h1_destroy()
0056 {
0057 simple_if_fini $h1 192.0.2.1/28
0058 }
0059
0060 switch_create()
0061 {
0062 ip link add name br1 type bridge vlan_filtering 0 mcast_snooping 0
0063
0064
0065 ip link set dev br1 address $(mac_get $swp1)
0066 ip link set dev br1 up
0067
0068 tc qdisc add dev $swp1 clsact
0069 ip link set dev $swp1 master br1
0070 ip link set dev $swp1 up
0071
0072 ip link add name vx1 type vxlan id 1000 local 192.0.2.17 \
0073 dstport "$VXPORT" nolearning noudpcsum tos inherit ttl 100
0074 ip link set dev vx1 master br1
0075 ip link set dev vx1 up
0076
0077 ip address add dev $rp1 192.0.2.17/28
0078 ip link set dev $rp1 up
0079 }
0080
0081 switch_destroy()
0082 {
0083 ip link set dev $rp1 down
0084 ip address del dev $rp1 192.0.2.17/28
0085
0086 ip link set dev vx1 down
0087 ip link set dev vx1 nomaster
0088 ip link del dev vx1
0089
0090 ip link set dev $swp1 down
0091 ip link set dev $swp1 nomaster
0092 tc qdisc del dev $swp1 clsact
0093
0094 ip link set dev br1 down
0095 ip link del dev br1
0096 }
0097
0098 vrf2_create()
0099 {
0100 simple_if_init $rp2 192.0.2.18/28
0101 }
0102
0103 vrf2_destroy()
0104 {
0105 simple_if_fini $rp2 192.0.2.18/28
0106 }
0107
0108 setup_prepare()
0109 {
0110 h1=${NETIFS[p1]}
0111 swp1=${NETIFS[p2]}
0112
0113 rp1=${NETIFS[p3]}
0114 rp2=${NETIFS[p4]}
0115
0116 vrf_prepare
0117 forwarding_enable
0118 h1_create
0119 switch_create
0120 vrf2_create
0121 }
0122
0123 cleanup()
0124 {
0125 pre_cleanup
0126
0127 vrf2_destroy
0128 switch_destroy
0129 h1_destroy
0130 forwarding_restore
0131 vrf_cleanup
0132 }
0133
0134 ecn_payload_get()
0135 {
0136 dest_mac=$(mac_get $h1)
0137 p=$(:
0138 )"08:"$( : VXLAN flags
0139 )"00:00:00:"$( : VXLAN reserved
0140 )"00:03:e8:"$( : VXLAN VNI : 1000
0141 )"00:"$( : VXLAN reserved
0142 )"$dest_mac:"$( : ETH daddr
0143 )"00:00:00:00:00:00:"$( : ETH saddr
0144 )"08:00:"$( : ETH type
0145 )"45:"$( : IP version + IHL
0146 )"00:"$( : IP TOS
0147 )"00:14:"$( : IP total length
0148 )"00:00:"$( : IP identification
0149 )"20:00:"$( : IP flags + frag off
0150 )"40:"$( : IP TTL
0151 )"00:"$( : IP proto
0152 )"D6:E5:"$( : IP header csum
0153 )"c0:00:02:03:"$( : IP saddr: 192.0.2.3
0154 )"c0:00:02:01:"$( : IP daddr: 192.0.2.1
0155 )
0156 echo $p
0157 }
0158
0159 ecn_decap_test()
0160 {
0161 local trap_name="decap_error"
0162 local desc=$1; shift
0163 local ecn_desc=$1; shift
0164 local outer_tos=$1; shift
0165 local mz_pid
0166
0167 RET=0
0168
0169 tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \
0170 flower src_ip 192.0.2.3 dst_ip 192.0.2.1 action pass
0171
0172 rp1_mac=$(mac_get $rp1)
0173 payload=$(ecn_payload_get)
0174
0175 ip vrf exec v$rp2 $MZ $rp2 -c 0 -d 1msec -b $rp1_mac -B 192.0.2.17 \
0176 -t udp sp=12345,dp=$VXPORT,tos=$outer_tos,p=$payload -q &
0177 mz_pid=$!
0178
0179 devlink_trap_exception_test $trap_name
0180
0181 tc_check_packets "dev $swp1 egress" 101 0
0182 check_err $? "Packets were not dropped"
0183
0184 log_test "$desc: Inner ECN is not ECT and outer is $ecn_desc"
0185
0186 kill $mz_pid && wait $mz_pid &> /dev/null
0187 tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower
0188 }
0189
0190 reserved_bits_payload_get()
0191 {
0192 dest_mac=$(mac_get $h1)
0193 p=$(:
0194 )"08:"$( : VXLAN flags
0195 )"01:00:00:"$( : VXLAN reserved
0196 )"00:03:e8:"$( : VXLAN VNI : 1000
0197 )"00:"$( : VXLAN reserved
0198 )"$dest_mac:"$( : ETH daddr
0199 )"00:00:00:00:00:00:"$( : ETH saddr
0200 )"08:00:"$( : ETH type
0201 )"45:"$( : IP version + IHL
0202 )"00:"$( : IP TOS
0203 )"00:14:"$( : IP total length
0204 )"00:00:"$( : IP identification
0205 )"20:00:"$( : IP flags + frag off
0206 )"40:"$( : IP TTL
0207 )"00:"$( : IP proto
0208 )"00:00:"$( : IP header csum
0209 )"c0:00:02:03:"$( : IP saddr: 192.0.2.3
0210 )"c0:00:02:01:"$( : IP daddr: 192.0.2.1
0211 )
0212 echo $p
0213 }
0214
0215 short_payload_get()
0216 {
0217 dest_mac=$(mac_get $h1)
0218 p=$(:
0219 )"08:"$( : VXLAN flags
0220 )"00:00:00:"$( : VXLAN reserved
0221 )"00:03:e8:"$( : VXLAN VNI : 1000
0222 )"00:"$( : VXLAN reserved
0223 )"$dest_mac:"$( : ETH daddr
0224 )"00:00:00:00:00:00:"$( : ETH saddr
0225 )
0226 echo $p
0227 }
0228
0229 corrupted_packet_test()
0230 {
0231 local trap_name="decap_error"
0232 local desc=$1; shift
0233 local payload_get=$1; shift
0234 local mz_pid
0235
0236 RET=0
0237
0238
0239
0240 tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \
0241 flower skip_hw src_ip 192.0.2.3 dst_ip 192.0.2.1 action pass
0242
0243 rp1_mac=$(mac_get $rp1)
0244 payload=$($payload_get)
0245 ip vrf exec v$rp2 $MZ $rp2 -c 0 -d 1msec -b $rp1_mac \
0246 -B 192.0.2.17 -t udp sp=12345,dp=$VXPORT,p=$payload -q &
0247 mz_pid=$!
0248
0249 devlink_trap_exception_test $trap_name
0250
0251 tc_check_packets "dev $swp1 egress" 101 0
0252 check_err $? "Packets were not dropped"
0253
0254 log_test "$desc"
0255
0256 kill $mz_pid && wait $mz_pid &> /dev/null
0257 tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower
0258 }
0259
0260 decap_error_test()
0261 {
0262 ecn_decap_test "Decap error" "ECT(1)" 01
0263 ecn_decap_test "Decap error" "ECT(0)" 02
0264 ecn_decap_test "Decap error" "CE" 03
0265
0266 corrupted_packet_test "Decap error: Reserved bits in use" \
0267 "reserved_bits_payload_get"
0268 corrupted_packet_test "Decap error: Too short inner packet" \
0269 "short_payload_get"
0270 }
0271
0272 mc_smac_payload_get()
0273 {
0274 dest_mac=$(mac_get $h1)
0275 source_mac=01:02:03:04:05:06
0276 p=$(:
0277 )"08:"$( : VXLAN flags
0278 )"00:00:00:"$( : VXLAN reserved
0279 )"00:03:e8:"$( : VXLAN VNI : 1000
0280 )"00:"$( : VXLAN reserved
0281 )"$dest_mac:"$( : ETH daddr
0282 )"$source_mac:"$( : ETH saddr
0283 )"08:00:"$( : ETH type
0284 )"45:"$( : IP version + IHL
0285 )"00:"$( : IP TOS
0286 )"00:14:"$( : IP total length
0287 )"00:00:"$( : IP identification
0288 )"20:00:"$( : IP flags + frag off
0289 )"40:"$( : IP TTL
0290 )"00:"$( : IP proto
0291 )"00:00:"$( : IP header csum
0292 )"c0:00:02:03:"$( : IP saddr: 192.0.2.3
0293 )"c0:00:02:01:"$( : IP daddr: 192.0.2.1
0294 )
0295 echo $p
0296 }
0297
0298 overlay_smac_is_mc_test()
0299 {
0300 local trap_name="overlay_smac_is_mc"
0301 local mz_pid
0302
0303 RET=0
0304
0305
0306
0307 tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \
0308 flower src_mac 01:02:03:04:05:06 action pass
0309
0310 rp1_mac=$(mac_get $rp1)
0311 payload=$(mc_smac_payload_get)
0312
0313 ip vrf exec v$rp2 $MZ $rp2 -c 0 -d 1msec -b $rp1_mac \
0314 -B 192.0.2.17 -t udp sp=12345,dp=$VXPORT,p=$payload -q &
0315 mz_pid=$!
0316
0317 devlink_trap_drop_test $trap_name $swp1 101
0318
0319 log_test "Overlay source MAC is multicast"
0320
0321 devlink_trap_drop_cleanup $mz_pid $swp1 "ip" 1 101
0322 }
0323
0324 trap cleanup EXIT
0325
0326 setup_prepare
0327 setup_wait
0328 tests_run
0329
0330 exit $EXIT_STATUS