brintos

brintos / linux-shallow public Read only

0
0
Text · 8.9 KiB · 5f6eb96 Raw
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