Subject: Re: [PATCH net-next v4 3/3] selftests: net: add tc flower cfm test

From: Ido Schimmel <[email-masked]>
Date: Sun, 30 Apr 2023 18:01:23 +0300

On Tue, Apr 25, 2023 at 11:16:30PM +0200, Zahari Doychev wrote:
> From: Zahari Doychev <[email-masked]>
> 
> New cfm flower test case is added to the net forwarding selfttests.
> 
> Signed-off-by: Zahari Doychev <[email-masked]>
> ---
>  .../testing/selftests/net/forwarding/Makefile |   1 +
>  .../selftests/net/forwarding/tc_flower_cfm.sh | 175 ++++++++++++++++++
>  2 files changed, 176 insertions(+)
>  create mode 100755 tools/testing/selftests/net/forwarding/tc_flower_cfm.sh
> 
> diff --git a/tools/testing/selftests/net/forwarding/Makefile b/tools/testing/selftests/net/forwarding/Makefile
> index a474c60fe348..11fb97a63646 100644
> --- a/tools/testing/selftests/net/forwarding/Makefile
> +++ b/tools/testing/selftests/net/forwarding/Makefile
> @@ -83,6 +83,7 @@ TEST_PROGS = bridge_igmp.sh \
>  	tc_chains.sh \
>  	tc_flower_router.sh \
>  	tc_flower.sh \
> +	tc_flower_cfm.sh \
>  	tc_mpls_l2vpn.sh \
>  	tc_police.sh \
>  	tc_shblocks.sh \
> diff --git a/tools/testing/selftests/net/forwarding/tc_flower_cfm.sh b/tools/testing/selftests/net/forwarding/tc_flower_cfm.sh
> new file mode 100755
> index 000000000000..0509bc3c9f75
> --- /dev/null
> +++ b/tools/testing/selftests/net/forwarding/tc_flower_cfm.sh
> @@ -0,0 +1,175 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +
> +ALL_TESTS="match_cfm_opcode match_cfm_level match_cfm_level_and_opcode"
> +NUM_NETIFS=2
> +source tc_common.sh
> +source lib.sh
> +
> +tcflags="skip_hw"
> +
> +h1_create()
> +{
> +	simple_if_init $h1 192.0.2.1/24 198.51.100.1/24

The IP address are not used in the test. Can be omitted.

> +}
> +
> +h1_destroy()
> +{
> +	simple_if_fini $h1 192.0.2.1/24 198.51.100.1/24
> +}
> +
> +h2_create()
> +{
> +	simple_if_init $h2 192.0.2.2/24 198.51.100.2/24
> +	tc qdisc add dev $h2 clsact
> +}
> +
> +h2_destroy()
> +{
> +	tc qdisc del dev $h2 clsact
> +	simple_if_fini $h2 192.0.2.2/24 198.51.100.2/24
> +}
> +
> +cfm_mdl_opcode()
> +{
> +	local mdl=$1
> +	local op=$2
> +	local flags=$3
> +	local tlv_offset=$4

If you use something like:

local mdl=$1; shift
local op=$1; shift

Then minimal changes are required if the order changes

> +
> +	printf "%02x %02x %02x %02x"    \
> +		   $((mdl << 5))             \
> +		   $((op & 0xff))             \
> +		   $((flags & 0xff)) \
> +		   $tlv_offset
> +}

See mldv2_is_in_get() in tools/testing/selftests/net/forwarding/lib.sh
and related functions for a more readable way to achieve the above.

> +
> +match_cfm_opcode()
> +{
> +	local ethtype="89 02"; readonly ethtype
> +	RET=0
> +
> +	tc filter add dev $h2 ingress protocol cfm pref 1 handle 101 \
> +	   flower cfm op 47 action drop
> +	tc filter add dev $h2 ingress protocol cfm pref 2 handle 102 \
> +	   flower cfm op 43 action drop

Both filters can use the same preference since the same mask is used.

> +
> +	pkt="$ethtype $(cfm_mdl_opcode 7 47 0 4)"
> +	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
> +	pkt="$ethtype $(cfm_mdl_opcode 6 5 0 4)"
> +	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
> +
> +	tc_check_packets "dev $h2 ingress" 101 1
> +	check_err $? "Did not match on correct opcode"
> +
> +	tc_check_packets "dev $h2 ingress" 102 0
> +	check_err $? "Matched on the wrong opcode"

For good measures you can send a packet with opcode 43 and check that
only 102 is hit.

> +
> +	tc filter del dev $h2 ingress protocol cfm pref 1 handle 101 flower
> +	tc filter del dev $h2 ingress protocol cfm pref 2 handle 102 flower
> +
> +	log_test "CFM opcode match test"
> +}
> +
> +match_cfm_level()
> +{
> +	local ethtype="89 02"; readonly ethtype
> +	RET=0
> +
> +	tc filter add dev $h2 ingress protocol cfm pref 1 handle 101 \
> +	   flower cfm mdl 5 action drop
> +	tc filter add dev $h2 ingress protocol cfm pref 2 handle 102 \
> +	   flower cfm mdl 3 action drop
> +	tc filter add dev $h2 ingress protocol cfm pref 3 handle 103 \
> +	   flower cfm mdl 0 action drop

Same comment about the preference.

> +
> +	pkt="$ethtype $(cfm_mdl_opcode 5 42 0 4)"
> +	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
> +	pkt="$ethtype $(cfm_mdl_opcode 6 1 0 4)"
> +	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
> +	pkt="$ethtype $(cfm_mdl_opcode 0 1 0 4)"
> +	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
> +
> +	tc_check_packets "dev $h2 ingress" 101 1
> +	check_err $? "Did not match on correct level"
> +
> +	tc_check_packets "dev $h2 ingress" 102 0
> +	check_err $? "Matched on the wrong level"
> +
> +	tc_check_packets "dev $h2 ingress" 103 1
> +	check_err $? "Did not match on correct level"
> +
> +	tc filter del dev $h2 ingress protocol cfm pref 1 handle 101 flower
> +	tc filter del dev $h2 ingress protocol cfm pref 2 handle 102 flower
> +	tc filter del dev $h2 ingress protocol cfm pref 3 handle 103 flower
> +
> +	log_test "CFM level match test"
> +}
> +
> +match_cfm_level_and_opcode()
> +{
> +	local ethtype="89 02"; readonly ethtype
> +	RET=0
> +
> +	tc filter add dev $h2 ingress protocol cfm pref 1 handle 101 \
> +	   flower cfm mdl 5 op 41 action drop
> +	tc filter add dev $h2 ingress protocol cfm pref 2 handle 102 \
> +	   flower cfm mdl 7 op 42 action drop

Likewise

> +
> +	pkt="$ethtype $(cfm_mdl_opcode 5 41 0 4)"
> +	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
> +	pkt="$ethtype $(cfm_mdl_opcode 7 3 0 4)"
> +	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
> +	pkt="$ethtype $(cfm_mdl_opcode 3 42 0 4)"
> +	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
> +
> +	tc_check_packets "dev $h2 ingress" 101 1
> +	check_err $? "Did not match on correct level and opcode"
> +	tc_check_packets "dev $h2 ingress" 102 0
> +	check_err $? "Matched on the wrong level and opcode"
> +
> +	tc filter del dev $h2 ingress protocol cfm pref 1 handle 101 flower
> +	tc filter del dev $h2 ingress protocol cfm pref 2 handle 102 flower
> +
> +	log_test "CFM opcode and level match test"
> +}
> +
> +setup_prepare()
> +{
> +	h1=${NETIFS[p1]}
> +	h2=${NETIFS[p2]}
> +	h1mac=$(mac_get $h1)
> +	h2mac=$(mac_get $h2)
> +
> +	vrf_prepare
> +
> +	h1_create
> +	h2_create
> +}
> +
> +cleanup()
> +{
> +	pre_cleanup
> +
> +	h2_destroy
> +	h1_destroy
> +
> +	vrf_cleanup
> +}
> +
> +trap cleanup EXIT
> +
> +setup_prepare
> +setup_wait
> +
> +tests_run
> +
> +tc_offload_check
> +if [[ $? -ne 0 ]]; then
> +	log_info "Could not test offloaded functionality"
> +else
> +	tcflags="skip_sw"
> +	tests_run
> +fi
> +
> +exit $EXIT_STATUS
> -- 
> 2.40.0
>