From: Jiri Pirko <j...@mellanox.com> Add basic sanity tests for TC chain templates.
Signed-off-by: Jiri Pirko <j...@mellanox.com> --- tools/testing/selftests/net/forwarding/lib.sh | 9 ++ .../selftests/net/forwarding/tc_chaintemplates.sh | 160 +++++++++++++++++++++ 2 files changed, 169 insertions(+) create mode 100755 tools/testing/selftests/net/forwarding/tc_chaintemplates.sh diff --git a/tools/testing/selftests/net/forwarding/lib.sh b/tools/testing/selftests/net/forwarding/lib.sh index a736d1d7ecdb..128a5b5a8ea9 100644 --- a/tools/testing/selftests/net/forwarding/lib.sh +++ b/tools/testing/selftests/net/forwarding/lib.sh @@ -39,6 +39,15 @@ check_tc_shblock_support() fi } +check_tc_chaintemplate_support() +{ + tc filter help 2>&1|grep template &> /dev/null + if [[ $? -ne 0 ]]; then + echo "SKIP: iproute2 too old; tc is missing chain template support" + exit 1 + fi +} + if [[ "$(id -u)" -ne 0 ]]; then echo "SKIP: need root privileges" exit 0 diff --git a/tools/testing/selftests/net/forwarding/tc_chaintemplates.sh b/tools/testing/selftests/net/forwarding/tc_chaintemplates.sh new file mode 100755 index 000000000000..21f2c18e973a --- /dev/null +++ b/tools/testing/selftests/net/forwarding/tc_chaintemplates.sh @@ -0,0 +1,160 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +ALL_TESTS="template_create_destroy template_filter_fits \ + template_create_nonempty template_destroy_nonempty" +NUM_NETIFS=2 +source tc_common.sh +source lib.sh + +h1_create() +{ + simple_if_init $h1 192.0.2.1/24 +} + +h1_destroy() +{ + simple_if_fini $h1 192.0.2.1/24 +} + +h2_create() +{ + simple_if_init $h2 192.0.2.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 +} + +template_create_destroy() +{ + RET=0 + + tc filter template add dev $h2 ingress protocol ip \ + flower dst_mac 00:00:00:00:00:00/FF:FF:FF:FF:FF:FF + check_err $? "Failed to create template for default chain" + + tc filter template add dev $h2 ingress chain 1 protocol ip \ + flower dst_mac 00:00:00:00:00:00/FF:FF:FF:FF:FF:FF + check_err $? "Failed to create template for chain 1" + + tc filter template del dev $h2 ingress + check_err $? "Failed to destroy template for default chain" + + tc filter template del dev $h2 ingress chain 1 + check_err $? "Failed to destroy template for chain 1" + + log_test "template create destroy" +} + +template_filter_fits() +{ + RET=0 + + tc filter template add dev $h2 ingress protocol ip \ + flower dst_mac 00:00:00:00:00:00/FF:FF:FF:FF:FF:FF &> /dev/null + tc filter template add dev $h2 ingress chain 1 protocol ip \ + flower src_mac 00:00:00:00:00:00/FF:FF:FF:FF:FF:FF &> /dev/null + + tc filter add dev $h2 ingress protocol ip pref 1 handle 1101 \ + flower dst_mac $h2mac action drop + check_err $? "Failed to insert filter which fits template" + + tc filter add dev $h2 ingress protocol ip pref 1 handle 1102 \ + flower src_mac $h2mac action drop &> /dev/null + check_fail $? "Incorrectly succeded to insert filter which does not template" + + tc filter add dev $h2 ingress chain 1 protocol ip pref 1 handle 1101 \ + flower src_mac $h2mac action drop + check_err $? "Failed to insert filter which fits template" + + tc filter add dev $h2 ingress chain 1protocol ip pref 1 handle 1102 \ + flower dst_mac $h2mac action drop &> /dev/null + check_fail $? "Incorrectly succeded to insert filter which does not template" + + tc filter del dev $h2 ingress chain 1 protocol ip pref 1 handle 1102 \ + flower &> /dev/null + tc filter del dev $h2 ingress chain 1 protocol ip pref 1 handle 1101 \ + flower &> /dev/null + + tc filter del dev $h2 ingress protocol ip pref 1 handle 1102 \ + flower &> /dev/null + tc filter del dev $h2 ingress protocol ip pref 1 handle 1101 \ + flower &> /dev/null + + tc filter template del dev $h2 ingress chain 1 + tc filter template del dev $h2 ingress + + log_test "template filter fits" +} + +template_create_nonempty() +{ + RET=0 + + tc filter add dev $h2 ingress protocol ip pref 1 handle 1101 \ + flower dst_mac $h2mac action drop + tc filter template add dev $h2 ingress protocol ip \ + flower dst_mac 00:00:00:00:00:00/FF:FF:FF:FF:FF:FF &> /dev/null + check_fail $? "Incorrectly succeded to create template for non-empty chain" + + tc filter template del dev $h2 ingress &> /dev/null + tc filter del dev $h2 ingress protocol ip pref 1 handle 1101 flower + + log_test "template create non-empty" +} + +template_destroy_nonempty() +{ + RET=0 + + tc filter template add dev $h2 ingress protocol ip \ + flower dst_mac 00:00:00:00:00:00/FF:FF:FF:FF:FF:FF + tc filter add dev $h2 ingress protocol ip pref 1 handle 1101 \ + flower dst_mac $h2mac action drop + + tc filter template del dev $h2 ingress &> /dev/null + check_fail $? "Incorrectly succeded to destroy template for non-empty chain" + tc filter del dev $h2 ingress protocol ip pref 1 handle 1101 flower + tc filter template del dev $h2 ingress &> /dev/null + check_err $? "Failed to destroy template for empty chain" + + log_test "template destroy non-empty" +} + +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 +} + +check_tc_chaintemplate_support + +trap cleanup EXIT + +setup_prepare +setup_wait + +tests_run + +exit $EXIT_STATUS -- 2.14.4