diff mbox series

[net-next,v4,3/3] selftests: net: add tc flower cfm test

Message ID 20230425211630.698373-4-zahari.doychev@linux.com (mailing list archive)
State Deferred
Delegated to: Netdev Maintainers
Headers show
Series net: flower: add cfm support | expand

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 8 this patch: 8
netdev/cc_maintainers warning 7 maintainers not CCed: razor@blackwall.org idosch@nvidia.com vladimir.oltean@nxp.com liuhangbin@gmail.com shuah@kernel.org troglobit@gmail.com linux-kselftest@vger.kernel.org
netdev/build_clang success Errors and warnings before: 8 this patch: 8
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success net selftest script(s) already in Makefile
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 8 this patch: 8
netdev/checkpatch warning WARNING: added, moved or deleted file(s), does MAINTAINERS need updating?
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Zahari Doychev April 25, 2023, 9:16 p.m. UTC
From: Zahari Doychev <zdoychev@maxlinear.com>

New cfm flower test case is added to the net forwarding selfttests.

Signed-off-by: Zahari Doychev <zdoychev@maxlinear.com>
---
 .../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

Comments

Ido Schimmel April 30, 2023, 3:01 p.m. UTC | #1
On Tue, Apr 25, 2023 at 11:16:30PM +0200, Zahari Doychev wrote:
> From: Zahari Doychev <zdoychev@maxlinear.com>
> 
> New cfm flower test case is added to the net forwarding selfttests.
> 
> Signed-off-by: Zahari Doychev <zdoychev@maxlinear.com>
> ---
>  .../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
>
Zahari Doychev April 30, 2023, 4:37 p.m. UTC | #2
> > +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
> 
> > +

I will handle your comments in the next version.

thanks,
Zahari

[...]
diff mbox series

Patch

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
+}
+
+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
+
+	printf "%02x %02x %02x %02x"    \
+		   $((mdl << 5))             \
+		   $((op & 0xff))             \
+		   $((flags & 0xff)) \
+		   $tlv_offset
+}
+
+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
+
+	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"
+
+	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
+
+	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
+
+	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