#!/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 h1_create() { simple_if_init $h1 } h1_destroy() { simple_if_fini $h1 } h2_create() { simple_if_init $h2 tc qdisc add dev $h2 clsact } h2_destroy() { tc qdisc del dev $h2 clsact simple_if_fini $h2 } u8_to_hex() { local u8=$1; shift printf "%02x" $u8 } generate_cfm_hdr() { local mdl=$1; shift local op=$1; shift local flags=$1; shift local tlv_offset=$1; shift local cfm_hdr=$(: )"$(u8_to_hex $((mdl << 5))):"$( : MD level and Version )"$(u8_to_hex $op):"$( : OpCode )"$(u8_to_hex $flags):"$( : Flags )"$(u8_to_hex $tlv_offset)"$( : TLV offset ) echo $cfm_hdr } 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 1 handle 102 \ flower cfm op 43 action drop pkt="$ethtype $(generate_cfm_hdr 7 47 0 32)" $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q pkt="$ethtype $(generate_cfm_hdr 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" pkt="$ethtype $(generate_cfm_hdr 0 43 0 12)" $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q tc_check_packets "dev $h2 ingress" 101 1 check_err $? "Matched on the wrong opcode" tc_check_packets "dev $h2 ingress" 102 1 check_err $? "Did not match on correct opcode" tc filter del dev $h2 ingress protocol cfm pref 1 handle 101 flower tc filter del dev $h2 ingress protocol cfm pref 1 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 1 handle 102 \ flower cfm mdl 3 action drop tc filter add dev $h2 ingress protocol cfm pref 1 handle 103 \ flower cfm mdl 0 action drop pkt="$ethtype $(generate_cfm_hdr 5 42 0 12)" $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q pkt="$ethtype $(generate_cfm_hdr 6 1 0 70)" $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q pkt="$ethtype $(generate_cfm_hdr 0 1 0 70)" $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" pkt="$ethtype $(generate_cfm_hdr 3 0 0 4)" $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q tc_check_packets "dev $h2 ingress" 101 1 check_err $? "Matched on the wrong level" tc_check_packets "dev $h2 ingress" 102 1 check_err $? "Did not match on correct level" tc_check_packets "dev $h2 ingress" 103 1 check_err $? "Matched on the wrong level" tc filter del dev $h2 ingress protocol cfm pref 1 handle 101 flower tc filter del dev $h2 ingress protocol cfm pref 1 handle 102 flower tc filter del dev $h2 ingress protocol cfm pref 1 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 1 handle 102 \ flower cfm mdl 7 op 42 action drop pkt="$ethtype $(generate_cfm_hdr 5 41 0 4)" $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q pkt="$ethtype $(generate_cfm_hdr 7 3 0 4)" $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q pkt="$ethtype $(generate_cfm_hdr 3 42 0 12)" $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" pkt="$ethtype $(generate_cfm_hdr 7 42 0 12)" $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q tc_check_packets "dev $h2 ingress" 101 1 check_err $? "Matched on the wrong level and opcode" tc_check_packets "dev $h2 ingress" 102 1 check_err $? "Did not match on correct 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 1 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 exit $EXIT_STATUS