331 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03#4# Test devlink-trap tunnel drops and exceptions functionality over mlxsw.5# Check all traps to make sure they are triggered under the right6# conditions.7 8# +--------------------+9# | H1 (vrf) |10# | + $h1 |11# | | 192.0.2.1/28 |12# +----|---------------+13# |14# +----|----------------------------------------------------------------------+15# | SW | |16# | +--|--------------------------------------------------------------------+ |17# | | + $swp1 BR1 (802.1d) | |18# | | | |19# | | + vx1 (vxlan) | |20# | | local 192.0.2.17 | |21# | | id 1000 dstport $VXPORT | |22# | +-----------------------------------------------------------------------+ |23# | |24# | + $rp1 |25# | | 192.0.2.17/28 |26# +----|----------------------------------------------------------------------+27# |28# +----|--------------------------------------------------------+29# | | VRF2 |30# | + $rp2 |31# | 192.0.2.18/28 |32# | |33# +-------------------------------------------------------------+34 35lib_dir=$(dirname $0)/../../../net/forwarding36 37ALL_TESTS="38 decap_error_test39 overlay_smac_is_mc_test40"41 42NUM_NETIFS=443source $lib_dir/lib.sh44source $lib_dir/tc_common.sh45source $lib_dir/devlink_lib.sh46 47: ${VXPORT:=4789}48export VXPORT49 50h1_create()51{52 simple_if_init $h1 192.0.2.1/2853}54 55h1_destroy()56{57 simple_if_fini $h1 192.0.2.1/2858}59 60switch_create()61{62 ip link add name br1 type bridge vlan_filtering 0 mcast_snooping 063 # Make sure the bridge uses the MAC address of the local port and not64 # that of the VxLAN's device.65 ip link set dev br1 address $(mac_get $swp1)66 ip link set dev br1 up67 68 tc qdisc add dev $swp1 clsact69 ip link set dev $swp1 master br170 ip link set dev $swp1 up71 72 ip link add name vx1 type vxlan id 1000 local 192.0.2.17 \73 dstport "$VXPORT" nolearning noudpcsum tos inherit ttl 10074 ip link set dev vx1 master br175 ip link set dev vx1 up76 77 ip address add dev $rp1 192.0.2.17/2878 ip link set dev $rp1 up79}80 81switch_destroy()82{83 ip link set dev $rp1 down84 ip address del dev $rp1 192.0.2.17/2885 86 ip link set dev vx1 down87 ip link set dev vx1 nomaster88 ip link del dev vx189 90 ip link set dev $swp1 down91 ip link set dev $swp1 nomaster92 tc qdisc del dev $swp1 clsact93 94 ip link set dev br1 down95 ip link del dev br196}97 98vrf2_create()99{100 simple_if_init $rp2 192.0.2.18/28101}102 103vrf2_destroy()104{105 simple_if_fini $rp2 192.0.2.18/28106}107 108setup_prepare()109{110 h1=${NETIFS[p1]}111 swp1=${NETIFS[p2]}112 113 rp1=${NETIFS[p3]}114 rp2=${NETIFS[p4]}115 116 vrf_prepare117 forwarding_enable118 h1_create119 switch_create120 vrf2_create121}122 123cleanup()124{125 pre_cleanup126 127 vrf2_destroy128 switch_destroy129 h1_destroy130 forwarding_restore131 vrf_cleanup132}133 134ecn_payload_get()135{136 dest_mac=$(mac_get $h1)137 p=$(:138 )"08:"$( : VXLAN flags139 )"00:00:00:"$( : VXLAN reserved140 )"00:03:e8:"$( : VXLAN VNI : 1000141 )"00:"$( : VXLAN reserved142 )"$dest_mac:"$( : ETH daddr143 )"00:00:00:00:00:00:"$( : ETH saddr144 )"08:00:"$( : ETH type145 )"45:"$( : IP version + IHL146 )"00:"$( : IP TOS147 )"00:14:"$( : IP total length148 )"00:00:"$( : IP identification149 )"20:00:"$( : IP flags + frag off150 )"40:"$( : IP TTL151 )"00:"$( : IP proto152 )"D6:E5:"$( : IP header csum153 )"c0:00:02:03:"$( : IP saddr: 192.0.2.3154 )"c0:00:02:01:"$( : IP daddr: 192.0.2.1155 )156 echo $p157}158 159ecn_decap_test()160{161 local trap_name="decap_error"162 local desc=$1; shift163 local ecn_desc=$1; shift164 local outer_tos=$1; shift165 local mz_pid166 167 RET=0168 169 tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \170 flower src_ip 192.0.2.3 dst_ip 192.0.2.1 action pass171 172 rp1_mac=$(mac_get $rp1)173 payload=$(ecn_payload_get)174 175 ip vrf exec v$rp2 $MZ $rp2 -c 0 -d 1msec -b $rp1_mac -B 192.0.2.17 \176 -t udp sp=12345,dp=$VXPORT,tos=$outer_tos,p=$payload -q &177 mz_pid=$!178 179 devlink_trap_exception_test $trap_name180 181 tc_check_packets "dev $swp1 egress" 101 0182 check_err $? "Packets were not dropped"183 184 log_test "$desc: Inner ECN is not ECT and outer is $ecn_desc"185 186 kill $mz_pid && wait $mz_pid &> /dev/null187 tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower188}189 190reserved_bits_payload_get()191{192 dest_mac=$(mac_get $h1)193 p=$(:194 )"08:"$( : VXLAN flags195 )"01:00:00:"$( : VXLAN reserved196 )"00:03:e8:"$( : VXLAN VNI : 1000197 )"00:"$( : VXLAN reserved198 )"$dest_mac:"$( : ETH daddr199 )"00:00:00:00:00:00:"$( : ETH saddr200 )"08:00:"$( : ETH type201 )"45:"$( : IP version + IHL202 )"00:"$( : IP TOS203 )"00:14:"$( : IP total length204 )"00:00:"$( : IP identification205 )"20:00:"$( : IP flags + frag off206 )"40:"$( : IP TTL207 )"00:"$( : IP proto208 )"00:00:"$( : IP header csum209 )"c0:00:02:03:"$( : IP saddr: 192.0.2.3210 )"c0:00:02:01:"$( : IP daddr: 192.0.2.1211 )212 echo $p213}214 215short_payload_get()216{217 dest_mac=$(mac_get $h1)218 p=$(:219 )"08:"$( : VXLAN flags220 )"00:00:00:"$( : VXLAN reserved221 )"00:03:e8:"$( : VXLAN VNI : 1000222 )"00:"$( : VXLAN reserved223 )"$dest_mac:"$( : ETH daddr224 )"00:00:00:00:00:00:"$( : ETH saddr225 )226 echo $p227}228 229corrupted_packet_test()230{231 local trap_name="decap_error"232 local desc=$1; shift233 local payload_get=$1; shift234 local mz_pid235 236 RET=0237 238 # In case of too short packet, there is no any inner packet,239 # so the matching will always succeed240 tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \241 flower skip_hw src_ip 192.0.2.3 dst_ip 192.0.2.1 action pass242 243 rp1_mac=$(mac_get $rp1)244 payload=$($payload_get)245 ip vrf exec v$rp2 $MZ $rp2 -c 0 -d 1msec -b $rp1_mac \246 -B 192.0.2.17 -t udp sp=12345,dp=$VXPORT,p=$payload -q &247 mz_pid=$!248 249 devlink_trap_exception_test $trap_name250 251 tc_check_packets "dev $swp1 egress" 101 0252 check_err $? "Packets were not dropped"253 254 log_test "$desc"255 256 kill $mz_pid && wait $mz_pid &> /dev/null257 tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower258}259 260decap_error_test()261{262 ecn_decap_test "Decap error" "ECT(1)" 01263 ecn_decap_test "Decap error" "ECT(0)" 02264 ecn_decap_test "Decap error" "CE" 03265 266 corrupted_packet_test "Decap error: Reserved bits in use" \267 "reserved_bits_payload_get"268 corrupted_packet_test "Decap error: Too short inner packet" \269 "short_payload_get"270}271 272mc_smac_payload_get()273{274 dest_mac=$(mac_get $h1)275 source_mac=01:02:03:04:05:06276 p=$(:277 )"08:"$( : VXLAN flags278 )"00:00:00:"$( : VXLAN reserved279 )"00:03:e8:"$( : VXLAN VNI : 1000280 )"00:"$( : VXLAN reserved281 )"$dest_mac:"$( : ETH daddr282 )"$source_mac:"$( : ETH saddr283 )"08:00:"$( : ETH type284 )"45:"$( : IP version + IHL285 )"00:"$( : IP TOS286 )"00:14:"$( : IP total length287 )"00:00:"$( : IP identification288 )"20:00:"$( : IP flags + frag off289 )"40:"$( : IP TTL290 )"00:"$( : IP proto291 )"00:00:"$( : IP header csum292 )"c0:00:02:03:"$( : IP saddr: 192.0.2.3293 )"c0:00:02:01:"$( : IP daddr: 192.0.2.1294 )295 echo $p296}297 298overlay_smac_is_mc_test()299{300 local trap_name="overlay_smac_is_mc"301 local mz_pid302 303 RET=0304 305 # The matching will be checked on devlink_trap_drop_test()306 # and the filter will be removed on devlink_trap_drop_cleanup()307 tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \308 flower src_mac 01:02:03:04:05:06 action pass309 310 rp1_mac=$(mac_get $rp1)311 payload=$(mc_smac_payload_get)312 313 ip vrf exec v$rp2 $MZ $rp2 -c 0 -d 1msec -b $rp1_mac \314 -B 192.0.2.17 -t udp sp=12345,dp=$VXPORT,p=$payload -q &315 mz_pid=$!316 317 devlink_trap_drop_test $trap_name $swp1 101318 319 log_test "Overlay source MAC is multicast"320 321 devlink_trap_drop_cleanup $mz_pid $swp1 "ip" 1 101322}323 324trap cleanup EXIT325 326setup_prepare327setup_wait328tests_run329 330exit $EXIT_STATUS331