#!/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