207 lines
4.9 KiB
Bash
Executable File
207 lines
4.9 KiB
Bash
Executable File
#!/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
|