brintos

brintos / linux-shallow public Read only

0
0
Text · 9.6 KiB · 0bd5ffc Raw
370 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03#4# Test devlink-trap policer functionality over mlxsw.5 6# +---------------------------------+7# | H1 (vrf)                        |8# |    + $h1                        |9# |    | 192.0.2.1/24               |10# |    |                            |11# |    |  default via 192.0.2.2     |12# +----|----------------------------+13#      |14# +----|----------------------------------------------------------------------+15# | SW |                                                                      |16# |    + $rp1                                                                 |17# |        192.0.2.2/24                                                       |18# |                                                                           |19# |        198.51.100.2/24                                                    |20# |    + $rp2                                                                 |21# |    |                                                                      |22# +----|----------------------------------------------------------------------+23#      |24# +----|----------------------------+25# |    |  default via 198.51.100.2  |26# |    |                            |27# |    | 198.51.100.1/24            |28# |    + $h2                        |29# | H2 (vrf)                        |30# +---------------------------------+31 32lib_dir=$(dirname $0)/../../../net/forwarding33 34ALL_TESTS="35	rate_limits_test36	burst_limits_test37	rate_test38	burst_test39"40NUM_NETIFS=441source $lib_dir/tc_common.sh42source $lib_dir/lib.sh43source $lib_dir/devlink_lib.sh44 45h1_create()46{47	simple_if_init $h1 192.0.2.1/2448	mtu_set $h1 1000049 50	ip -4 route add default vrf v$h1 nexthop via 192.0.2.251}52 53h1_destroy()54{55	ip -4 route del default vrf v$h1 nexthop via 192.0.2.256 57	mtu_restore $h158	simple_if_fini $h1 192.0.2.1/2459}60 61h2_create()62{63	simple_if_init $h2 198.51.100.1/2464	mtu_set $h2 1000065 66	ip -4 route add default vrf v$h2 nexthop via 198.51.100.267}68 69h2_destroy()70{71	ip -4 route del default vrf v$h2 nexthop via 198.51.100.272 73	mtu_restore $h274	simple_if_fini $h2 198.51.100.1/2475}76 77router_create()78{79	ip link set dev $rp1 up80	ip link set dev $rp2 up81 82	__addr_add_del $rp1 add 192.0.2.2/2483	__addr_add_del $rp2 add 198.51.100.2/2484	mtu_set $rp1 1000085	mtu_set $rp2 1000086 87	ip -4 route add blackhole 198.51.100.10088 89	devlink trap set $DEVLINK_DEV trap blackhole_route action trap90}91 92router_destroy()93{94	devlink trap set $DEVLINK_DEV trap blackhole_route action drop95 96	ip -4 route del blackhole 198.51.100.10097 98	mtu_restore $rp299	mtu_restore $rp1100	__addr_add_del $rp2 del 198.51.100.2/24101	__addr_add_del $rp1 del 192.0.2.2/24102 103	ip link set dev $rp2 down104	ip link set dev $rp1 down105}106 107setup_prepare()108{109	h1=${NETIFS[p1]}110	rp1=${NETIFS[p2]}111 112	rp2=${NETIFS[p3]}113	h2=${NETIFS[p4]}114 115	rp1_mac=$(mac_get $rp1)116 117	vrf_prepare118 119	h1_create120	h2_create121 122	router_create123}124 125cleanup()126{127	pre_cleanup128 129	router_destroy130 131	h2_destroy132	h1_destroy133 134	vrf_cleanup135 136	# Reload to ensure devlink-trap settings are back to default.137	devlink_reload138}139 140rate_limits_test()141{142	RET=0143 144	devlink trap policer set $DEVLINK_DEV policer 1 rate 0 &> /dev/null145	check_fail $? "Policer rate was changed to rate lower than limit"146	devlink trap policer set $DEVLINK_DEV policer 1 \147		rate 2000000001 &> /dev/null148	check_fail $? "Policer rate was changed to rate higher than limit"149 150	devlink trap policer set $DEVLINK_DEV policer 1 rate 1151	check_err $? "Failed to set policer rate to minimum"152	devlink trap policer set $DEVLINK_DEV policer 1 rate 2000000000153	check_err $? "Failed to set policer rate to maximum"154 155	log_test "Trap policer rate limits"156}157 158burst_limits_test()159{160	RET=0161 162	devlink trap policer set $DEVLINK_DEV policer 1 burst 0 &> /dev/null163	check_fail $? "Policer burst size was changed to 0"164	devlink trap policer set $DEVLINK_DEV policer 1 burst 17 &> /dev/null165	check_fail $? "Policer burst size was changed to burst size that is not power of 2"166	devlink trap policer set $DEVLINK_DEV policer 1 burst 8 &> /dev/null167	check_fail $? "Policer burst size was changed to burst size lower than limit"168	devlink trap policer set $DEVLINK_DEV policer 1 \169		burst $((2**25)) &> /dev/null170	check_fail $? "Policer burst size was changed to burst size higher than limit"171 172	devlink trap policer set $DEVLINK_DEV policer 1 burst 16173	check_err $? "Failed to set policer burst size to minimum"174	devlink trap policer set $DEVLINK_DEV policer 1 burst $((2**24))175	check_err $? "Failed to set policer burst size to maximum"176 177	log_test "Trap policer burst size limits"178}179 180trap_rate_get()181{182	local t0 t1183 184	t0=$(devlink_trap_rx_packets_get blackhole_route)185	sleep 10186	t1=$(devlink_trap_rx_packets_get blackhole_route)187 188	echo $(((t1 - t0) / 10))189}190 191policer_drop_rate_get()192{193	local id=$1; shift194	local t0 t1195 196	t0=$(devlink_trap_policer_rx_dropped_get $id)197	sleep 10198	t1=$(devlink_trap_policer_rx_dropped_get $id)199 200	echo $(((t1 - t0) / 10))201}202 203__rate_test()204{205	local rate pct drop_rate206	local id=$1; shift207 208	RET=0209 210	devlink trap policer set $DEVLINK_DEV policer $id rate 1000 burst 512211	devlink trap group set $DEVLINK_DEV group l3_drops policer $id212 213	# Send packets at highest possible rate and make sure they are dropped214	# by the policer. Make sure measured received rate is about 1000 pps215	log_info "=== Tx rate: Highest, Policer rate: 1000 pps ==="216 217	start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac218 219	sleep 5 # Take measurements when rate is stable220 221	rate=$(trap_rate_get)222	pct=$((100 * (rate - 1000) / 1000))223	((-10 <= pct && pct <= 10))224	check_err $? "Expected rate 1000 pps, got $rate pps, which is $pct% off. Required accuracy is +-10%"225	log_info "Expected rate 1000 pps, measured rate $rate pps"226 227	drop_rate=$(policer_drop_rate_get $id)228	(( drop_rate > 0 ))229	check_err $? "Expected non-zero policer drop rate, got 0"230	log_info "Measured policer drop rate of $drop_rate pps"231 232	stop_traffic233 234	# Send packets at a rate of 1000 pps and make sure they are not dropped235	# by the policer236	log_info "=== Tx rate: 1000 pps, Policer rate: 1000 pps ==="237 238	start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac -d 1msec239 240	sleep 5 # Take measurements when rate is stable241 242	drop_rate=$(policer_drop_rate_get $id)243	(( drop_rate == 0 ))244	check_err $? "Expected zero policer drop rate, got a drop rate of $drop_rate pps"245	log_info "Measured policer drop rate of $drop_rate pps"246 247	stop_traffic248 249	# Unbind the policer and send packets at highest possible rate. Make250	# sure they are not dropped by the policer and that the measured251	# received rate is higher than 1000 pps252	log_info "=== Tx rate: Highest, Policer rate: No policer ==="253 254	devlink trap group set $DEVLINK_DEV group l3_drops nopolicer255 256	start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac257 258	rate=$(trap_rate_get)259	(( rate > 1000 ))260	check_err $? "Expected rate higher than 1000 pps, got $rate pps"261	log_info "Measured rate $rate pps"262 263	drop_rate=$(policer_drop_rate_get $id)264	(( drop_rate == 0 ))265	check_err $? "Expected zero policer drop rate, got a drop rate of $drop_rate pps"266	log_info "Measured policer drop rate of $drop_rate pps"267 268	stop_traffic269 270	log_test "Trap policer rate"271}272 273rate_test()274{275	local last_policer=$(devlink -j -p trap policer show |276			     jq '[.[]["'$DEVLINK_DEV'"][].policer] | max')277 278	log_info "Running rate test for policer 1"279	__rate_test 1280 281	log_info "Running rate test for policer $((last_policer / 2))"282	__rate_test $((last_policer / 2))283 284	log_info "Running rate test for policer $last_policer"285	__rate_test $last_policer286}287 288__burst_test()289{290	local t0_rx t0_drop t1_rx t1_drop rx drop291	local id=$1; shift292 293	RET=0294 295	devlink trap policer set $DEVLINK_DEV policer $id rate 1000 burst 512296	devlink trap group set $DEVLINK_DEV group l3_drops policer $id297 298	# Send a burst of 16 packets and make sure that 16 are received299	# and that none are dropped by the policer300	log_info "=== Tx burst size: 16, Policer burst size: 512 ==="301 302	t0_rx=$(devlink_trap_rx_packets_get blackhole_route)303	t0_drop=$(devlink_trap_policer_rx_dropped_get $id)304 305	start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac -c 16306 307	t1_rx=$(devlink_trap_rx_packets_get blackhole_route)308	t1_drop=$(devlink_trap_policer_rx_dropped_get $id)309 310	rx=$((t1_rx - t0_rx))311	(( rx == 16 ))312	check_err $? "Expected burst size of 16 packets, got $rx packets"313	log_info "Expected burst size of 16 packets, measured burst size of $rx packets"314 315	drop=$((t1_drop - t0_drop))316	(( drop == 0 ))317	check_err $? "Expected zero policer drops, got $drop"318	log_info "Measured policer drops of $drop packets"319 320	# Unbind the policer and send a burst of 64 packets. Make sure that321	# 64 packets are received and that none are dropped by the policer322	log_info "=== Tx burst size: 64, Policer burst size: No policer ==="323 324	devlink trap group set $DEVLINK_DEV group l3_drops nopolicer325 326	t0_rx=$(devlink_trap_rx_packets_get blackhole_route)327	t0_drop=$(devlink_trap_policer_rx_dropped_get $id)328 329	start_traffic $h1 192.0.2.1 198.51.100.100 $rp1_mac -c 64330 331	t1_rx=$(devlink_trap_rx_packets_get blackhole_route)332	t1_drop=$(devlink_trap_policer_rx_dropped_get $id)333 334	rx=$((t1_rx - t0_rx))335	(( rx == 64 ))336	check_err $? "Expected burst size of 64 packets, got $rx packets"337	log_info "Expected burst size of 64 packets, measured burst size of $rx packets"338 339	drop=$((t1_drop - t0_drop))340	(( drop == 0 ))341	check_err $? "Expected zero policer drops, got $drop"342	log_info "Measured policer drops of $drop packets"343 344	log_test "Trap policer burst size"345}346 347burst_test()348{349	local last_policer=$(devlink -j -p trap policer show |350			     jq '[.[]["'$DEVLINK_DEV'"][].policer] | max')351 352	log_info "Running burst test for policer 1"353	__burst_test 1354 355	log_info "Running burst test for policer $((last_policer / 2))"356	__burst_test $((last_policer / 2))357 358	log_info "Running burst test for policer $last_policer"359	__burst_test $last_policer360}361 362trap cleanup EXIT363 364setup_prepare365setup_wait366 367tests_run368 369exit $EXIT_STATUS370