162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# This test is for checking the FIB offload API on top of mlxsw.
562306a36Sopenharmony_ci
662306a36Sopenharmony_cilib_dir=$(dirname $0)/../../../net/forwarding
762306a36Sopenharmony_ci
862306a36Sopenharmony_ciALL_TESTS="
962306a36Sopenharmony_ci	ipv4_identical_routes
1062306a36Sopenharmony_ci	ipv4_tos
1162306a36Sopenharmony_ci	ipv4_metric
1262306a36Sopenharmony_ci	ipv4_replace
1362306a36Sopenharmony_ci	ipv4_delete
1462306a36Sopenharmony_ci	ipv4_plen
1562306a36Sopenharmony_ci	ipv4_replay
1662306a36Sopenharmony_ci	ipv4_flush
1762306a36Sopenharmony_ci	ipv4_local_replace
1862306a36Sopenharmony_ci	ipv6_add
1962306a36Sopenharmony_ci	ipv6_metric
2062306a36Sopenharmony_ci	ipv6_append_single
2162306a36Sopenharmony_ci	ipv6_replace_single
2262306a36Sopenharmony_ci	ipv6_metric_multipath
2362306a36Sopenharmony_ci	ipv6_append_multipath
2462306a36Sopenharmony_ci	ipv6_replace_multipath
2562306a36Sopenharmony_ci	ipv6_append_multipath_to_single
2662306a36Sopenharmony_ci	ipv6_delete_single
2762306a36Sopenharmony_ci	ipv6_delete_multipath
2862306a36Sopenharmony_ci	ipv6_replay_single
2962306a36Sopenharmony_ci	ipv6_replay_multipath
3062306a36Sopenharmony_ci	ipv6_local_replace
3162306a36Sopenharmony_ci"
3262306a36Sopenharmony_ciNUM_NETIFS=0
3362306a36Sopenharmony_cisource $lib_dir/lib.sh
3462306a36Sopenharmony_cisource $lib_dir/devlink_lib.sh
3562306a36Sopenharmony_cisource $lib_dir/fib_offload_lib.sh
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ciipv4_identical_routes()
3862306a36Sopenharmony_ci{
3962306a36Sopenharmony_ci	fib_ipv4_identical_routes_test "testns1"
4062306a36Sopenharmony_ci}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ciipv4_tos()
4362306a36Sopenharmony_ci{
4462306a36Sopenharmony_ci	fib_ipv4_tos_test "testns1"
4562306a36Sopenharmony_ci}
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ciipv4_metric()
4862306a36Sopenharmony_ci{
4962306a36Sopenharmony_ci	fib_ipv4_metric_test "testns1"
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ciipv4_replace()
5362306a36Sopenharmony_ci{
5462306a36Sopenharmony_ci	fib_ipv4_replace_test "testns1"
5562306a36Sopenharmony_ci}
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ciipv4_delete()
5862306a36Sopenharmony_ci{
5962306a36Sopenharmony_ci	fib_ipv4_delete_test "testns1"
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ciipv4_plen()
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	fib_ipv4_plen_test "testns1"
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ciipv4_replay_metric()
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci	fib_ipv4_replay_metric_test "testns1" "$DEVLINK_DEV"
7062306a36Sopenharmony_ci}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ciipv4_replay_tos()
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci	fib_ipv4_replay_tos_test "testns1" "$DEVLINK_DEV"
7562306a36Sopenharmony_ci}
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ciipv4_replay_plen()
7862306a36Sopenharmony_ci{
7962306a36Sopenharmony_ci	fib_ipv4_replay_plen_test "testns1" "$DEVLINK_DEV"
8062306a36Sopenharmony_ci}
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ciipv4_replay()
8362306a36Sopenharmony_ci{
8462306a36Sopenharmony_ci	ipv4_replay_metric
8562306a36Sopenharmony_ci	ipv4_replay_tos
8662306a36Sopenharmony_ci	ipv4_replay_plen
8762306a36Sopenharmony_ci}
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ciipv4_flush()
9062306a36Sopenharmony_ci{
9162306a36Sopenharmony_ci	fib_ipv4_flush_test "testns1"
9262306a36Sopenharmony_ci}
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ciipv4_local_replace()
9562306a36Sopenharmony_ci{
9662306a36Sopenharmony_ci	local ns="testns1"
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	RET=0
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci	ip -n $ns link add name dummy1 type dummy
10162306a36Sopenharmony_ci	ip -n $ns link set dev dummy1 up
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	ip -n $ns route add table local 192.0.2.1/32 dev dummy1
10462306a36Sopenharmony_ci	fib4_trap_check $ns "table local 192.0.2.1/32 dev dummy1" false
10562306a36Sopenharmony_ci	check_err $? "Local table route not in hardware when should"
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci	ip -n $ns route add table main 192.0.2.1/32 dev dummy1
10862306a36Sopenharmony_ci	fib4_trap_check $ns "table main 192.0.2.1/32 dev dummy1" true
10962306a36Sopenharmony_ci	check_err $? "Main table route in hardware when should not"
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	fib4_trap_check $ns "table local 192.0.2.1/32 dev dummy1" false
11262306a36Sopenharmony_ci	check_err $? "Local table route was replaced when should not"
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci	# Test that local routes can replace routes in main table.
11562306a36Sopenharmony_ci	ip -n $ns route add table main 192.0.2.2/32 dev dummy1
11662306a36Sopenharmony_ci	fib4_trap_check $ns "table main 192.0.2.2/32 dev dummy1" false
11762306a36Sopenharmony_ci	check_err $? "Main table route not in hardware when should"
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci	ip -n $ns route add table local 192.0.2.2/32 dev dummy1
12062306a36Sopenharmony_ci	fib4_trap_check $ns "table local 192.0.2.2/32 dev dummy1" false
12162306a36Sopenharmony_ci	check_err $? "Local table route did not replace route in main table when should"
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	fib4_trap_check $ns "table main 192.0.2.2/32 dev dummy1" true
12462306a36Sopenharmony_ci	check_err $? "Main table route was not replaced when should"
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci	log_test "IPv4 local table route replacement"
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci	ip -n $ns link del dev dummy1
12962306a36Sopenharmony_ci}
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ciipv6_add()
13262306a36Sopenharmony_ci{
13362306a36Sopenharmony_ci	fib_ipv6_add_test "testns1"
13462306a36Sopenharmony_ci}
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ciipv6_metric()
13762306a36Sopenharmony_ci{
13862306a36Sopenharmony_ci	fib_ipv6_metric_test "testns1"
13962306a36Sopenharmony_ci}
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ciipv6_append_single()
14262306a36Sopenharmony_ci{
14362306a36Sopenharmony_ci	fib_ipv6_append_single_test "testns1"
14462306a36Sopenharmony_ci}
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ciipv6_replace_single()
14762306a36Sopenharmony_ci{
14862306a36Sopenharmony_ci	fib_ipv6_replace_single_test "testns1"
14962306a36Sopenharmony_ci}
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ciipv6_metric_multipath()
15262306a36Sopenharmony_ci{
15362306a36Sopenharmony_ci	fib_ipv6_metric_multipath_test "testns1"
15462306a36Sopenharmony_ci}
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ciipv6_append_multipath()
15762306a36Sopenharmony_ci{
15862306a36Sopenharmony_ci	fib_ipv6_append_multipath_test "testns1"
15962306a36Sopenharmony_ci}
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ciipv6_replace_multipath()
16262306a36Sopenharmony_ci{
16362306a36Sopenharmony_ci	fib_ipv6_replace_multipath_test "testns1"
16462306a36Sopenharmony_ci}
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ciipv6_append_multipath_to_single()
16762306a36Sopenharmony_ci{
16862306a36Sopenharmony_ci	fib_ipv6_append_multipath_to_single_test "testns1"
16962306a36Sopenharmony_ci}
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ciipv6_delete_single()
17262306a36Sopenharmony_ci{
17362306a36Sopenharmony_ci	fib_ipv6_delete_single_test "testns1"
17462306a36Sopenharmony_ci}
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ciipv6_delete_multipath()
17762306a36Sopenharmony_ci{
17862306a36Sopenharmony_ci	fib_ipv6_delete_multipath_test "testns1"
17962306a36Sopenharmony_ci}
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ciipv6_replay_single()
18262306a36Sopenharmony_ci{
18362306a36Sopenharmony_ci	fib_ipv6_replay_single_test "testns1" "$DEVLINK_DEV"
18462306a36Sopenharmony_ci}
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ciipv6_replay_multipath()
18762306a36Sopenharmony_ci{
18862306a36Sopenharmony_ci	fib_ipv6_replay_multipath_test "testns1" "$DEVLINK_DEV"
18962306a36Sopenharmony_ci}
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ciipv6_local_replace()
19262306a36Sopenharmony_ci{
19362306a36Sopenharmony_ci	local ns="testns1"
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci	RET=0
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	ip -n $ns link add name dummy1 type dummy
19862306a36Sopenharmony_ci	ip -n $ns link set dev dummy1 up
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci	ip -n $ns route add table local 2001:db8:1::1/128 dev dummy1
20162306a36Sopenharmony_ci	fib6_trap_check $ns "table local 2001:db8:1::1/128 dev dummy1" false
20262306a36Sopenharmony_ci	check_err $? "Local table route not in hardware when should"
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci	ip -n $ns route add table main 2001:db8:1::1/128 dev dummy1
20562306a36Sopenharmony_ci	fib6_trap_check $ns "table main 2001:db8:1::1/128 dev dummy1" true
20662306a36Sopenharmony_ci	check_err $? "Main table route in hardware when should not"
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	fib6_trap_check $ns "table local 2001:db8:1::1/128 dev dummy1" false
20962306a36Sopenharmony_ci	check_err $? "Local table route was replaced when should not"
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci	# Test that local routes can replace routes in main table.
21262306a36Sopenharmony_ci	ip -n $ns route add table main 2001:db8:1::2/128 dev dummy1
21362306a36Sopenharmony_ci	fib6_trap_check $ns "table main 2001:db8:1::2/128 dev dummy1" false
21462306a36Sopenharmony_ci	check_err $? "Main table route not in hardware when should"
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci	ip -n $ns route add table local 2001:db8:1::2/128 dev dummy1
21762306a36Sopenharmony_ci	fib6_trap_check $ns "table local 2001:db8:1::2/128 dev dummy1" false
21862306a36Sopenharmony_ci	check_err $? "Local route route did not replace route in main table when should"
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci	fib6_trap_check $ns "table main 2001:db8:1::2/128 dev dummy1" true
22162306a36Sopenharmony_ci	check_err $? "Main table route was not replaced when should"
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	log_test "IPv6 local table route replacement"
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci	ip -n $ns link del dev dummy1
22662306a36Sopenharmony_ci}
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_cifib_notify_on_flag_change_set()
22962306a36Sopenharmony_ci{
23062306a36Sopenharmony_ci	local notify=$1; shift
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci	ip netns exec testns1 sysctl -qw net.ipv4.fib_notify_on_flag_change=$notify
23362306a36Sopenharmony_ci	ip netns exec testns1 sysctl -qw net.ipv6.fib_notify_on_flag_change=$notify
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci	log_info "Set fib_notify_on_flag_change to $notify"
23662306a36Sopenharmony_ci}
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_cisetup_prepare()
23962306a36Sopenharmony_ci{
24062306a36Sopenharmony_ci	ip netns add testns1
24162306a36Sopenharmony_ci	if [ $? -ne 0 ]; then
24262306a36Sopenharmony_ci		echo "Failed to add netns \"testns1\""
24362306a36Sopenharmony_ci		exit 1
24462306a36Sopenharmony_ci	fi
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ci	devlink dev reload $DEVLINK_DEV netns testns1
24762306a36Sopenharmony_ci	if [ $? -ne 0 ]; then
24862306a36Sopenharmony_ci		echo "Failed to reload into netns \"testns1\""
24962306a36Sopenharmony_ci		exit 1
25062306a36Sopenharmony_ci	fi
25162306a36Sopenharmony_ci}
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_cicleanup()
25462306a36Sopenharmony_ci{
25562306a36Sopenharmony_ci	pre_cleanup
25662306a36Sopenharmony_ci	devlink -N testns1 dev reload $DEVLINK_DEV netns $$
25762306a36Sopenharmony_ci	ip netns del testns1
25862306a36Sopenharmony_ci}
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_citrap cleanup EXIT
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_cisetup_prepare
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_cifib_notify_on_flag_change_set 1
26562306a36Sopenharmony_citests_run
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_cifib_notify_on_flag_change_set 0
26862306a36Sopenharmony_citests_run
26962306a36Sopenharmony_ci
27062306a36Sopenharmony_ciexit $EXIT_STATUS
271