1*1668a55aSZahari Doychev#!/bin/bash
2*1668a55aSZahari Doychev# SPDX-License-Identifier: GPL-2.0
3*1668a55aSZahari Doychev
4*1668a55aSZahari DoychevALL_TESTS="match_cfm_opcode match_cfm_level match_cfm_level_and_opcode"
5*1668a55aSZahari DoychevNUM_NETIFS=2
6*1668a55aSZahari Doychevsource tc_common.sh
7*1668a55aSZahari Doychevsource lib.sh
8*1668a55aSZahari Doychev
9*1668a55aSZahari Doychevh1_create()
10*1668a55aSZahari Doychev{
11*1668a55aSZahari Doychev	simple_if_init $h1
12*1668a55aSZahari Doychev}
13*1668a55aSZahari Doychev
14*1668a55aSZahari Doychevh1_destroy()
15*1668a55aSZahari Doychev{
16*1668a55aSZahari Doychev	simple_if_fini $h1
17*1668a55aSZahari Doychev}
18*1668a55aSZahari Doychev
19*1668a55aSZahari Doychevh2_create()
20*1668a55aSZahari Doychev{
21*1668a55aSZahari Doychev	simple_if_init $h2
22*1668a55aSZahari Doychev	tc qdisc add dev $h2 clsact
23*1668a55aSZahari Doychev}
24*1668a55aSZahari Doychev
25*1668a55aSZahari Doychevh2_destroy()
26*1668a55aSZahari Doychev{
27*1668a55aSZahari Doychev	tc qdisc del dev $h2 clsact
28*1668a55aSZahari Doychev	simple_if_fini $h2
29*1668a55aSZahari Doychev}
30*1668a55aSZahari Doychev
31*1668a55aSZahari Doychevu8_to_hex()
32*1668a55aSZahari Doychev{
33*1668a55aSZahari Doychev	local u8=$1; shift
34*1668a55aSZahari Doychev
35*1668a55aSZahari Doychev	printf "%02x" $u8
36*1668a55aSZahari Doychev}
37*1668a55aSZahari Doychev
38*1668a55aSZahari Doychevgenerate_cfm_hdr()
39*1668a55aSZahari Doychev{
40*1668a55aSZahari Doychev	local mdl=$1; shift
41*1668a55aSZahari Doychev	local op=$1; shift
42*1668a55aSZahari Doychev	local flags=$1; shift
43*1668a55aSZahari Doychev	local tlv_offset=$1; shift
44*1668a55aSZahari Doychev
45*1668a55aSZahari Doychev	local cfm_hdr=$(:
46*1668a55aSZahari Doychev	               )"$(u8_to_hex $((mdl << 5))):"$( 	: MD level and Version
47*1668a55aSZahari Doychev	               )"$(u8_to_hex $op):"$(			: OpCode
48*1668a55aSZahari Doychev	               )"$(u8_to_hex $flags):"$(		: Flags
49*1668a55aSZahari Doychev	               )"$(u8_to_hex $tlv_offset)"$(		: TLV offset
50*1668a55aSZahari Doychev	               )
51*1668a55aSZahari Doychev
52*1668a55aSZahari Doychev	echo $cfm_hdr
53*1668a55aSZahari Doychev}
54*1668a55aSZahari Doychev
55*1668a55aSZahari Doychevmatch_cfm_opcode()
56*1668a55aSZahari Doychev{
57*1668a55aSZahari Doychev	local ethtype="89 02"; readonly ethtype
58*1668a55aSZahari Doychev	RET=0
59*1668a55aSZahari Doychev
60*1668a55aSZahari Doychev	tc filter add dev $h2 ingress protocol cfm pref 1 handle 101 \
61*1668a55aSZahari Doychev	   flower cfm op 47 action drop
62*1668a55aSZahari Doychev	tc filter add dev $h2 ingress protocol cfm pref 1 handle 102 \
63*1668a55aSZahari Doychev	   flower cfm op 43 action drop
64*1668a55aSZahari Doychev
65*1668a55aSZahari Doychev	pkt="$ethtype $(generate_cfm_hdr 7 47 0 32)"
66*1668a55aSZahari Doychev	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
67*1668a55aSZahari Doychev	pkt="$ethtype $(generate_cfm_hdr 6 5 0 4)"
68*1668a55aSZahari Doychev	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
69*1668a55aSZahari Doychev
70*1668a55aSZahari Doychev	tc_check_packets "dev $h2 ingress" 101 1
71*1668a55aSZahari Doychev	check_err $? "Did not match on correct opcode"
72*1668a55aSZahari Doychev
73*1668a55aSZahari Doychev	tc_check_packets "dev $h2 ingress" 102 0
74*1668a55aSZahari Doychev	check_err $? "Matched on the wrong opcode"
75*1668a55aSZahari Doychev
76*1668a55aSZahari Doychev	pkt="$ethtype $(generate_cfm_hdr 0 43 0 12)"
77*1668a55aSZahari Doychev	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
78*1668a55aSZahari Doychev
79*1668a55aSZahari Doychev	tc_check_packets "dev $h2 ingress" 101 1
80*1668a55aSZahari Doychev	check_err $? "Matched on the wrong opcode"
81*1668a55aSZahari Doychev
82*1668a55aSZahari Doychev	tc_check_packets "dev $h2 ingress" 102 1
83*1668a55aSZahari Doychev	check_err $? "Did not match on correct opcode"
84*1668a55aSZahari Doychev
85*1668a55aSZahari Doychev	tc filter del dev $h2 ingress protocol cfm pref 1 handle 101 flower
86*1668a55aSZahari Doychev	tc filter del dev $h2 ingress protocol cfm pref 1 handle 102 flower
87*1668a55aSZahari Doychev
88*1668a55aSZahari Doychev	log_test "CFM opcode match test"
89*1668a55aSZahari Doychev}
90*1668a55aSZahari Doychev
91*1668a55aSZahari Doychevmatch_cfm_level()
92*1668a55aSZahari Doychev{
93*1668a55aSZahari Doychev	local ethtype="89 02"; readonly ethtype
94*1668a55aSZahari Doychev	RET=0
95*1668a55aSZahari Doychev
96*1668a55aSZahari Doychev	tc filter add dev $h2 ingress protocol cfm pref 1 handle 101 \
97*1668a55aSZahari Doychev	   flower cfm mdl 5 action drop
98*1668a55aSZahari Doychev	tc filter add dev $h2 ingress protocol cfm pref 1 handle 102 \
99*1668a55aSZahari Doychev	   flower cfm mdl 3 action drop
100*1668a55aSZahari Doychev	tc filter add dev $h2 ingress protocol cfm pref 1 handle 103 \
101*1668a55aSZahari Doychev	   flower cfm mdl 0 action drop
102*1668a55aSZahari Doychev
103*1668a55aSZahari Doychev	pkt="$ethtype $(generate_cfm_hdr 5 42 0 12)"
104*1668a55aSZahari Doychev	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
105*1668a55aSZahari Doychev	pkt="$ethtype $(generate_cfm_hdr 6 1 0 70)"
106*1668a55aSZahari Doychev	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
107*1668a55aSZahari Doychev	pkt="$ethtype $(generate_cfm_hdr 0 1 0 70)"
108*1668a55aSZahari Doychev	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
109*1668a55aSZahari Doychev
110*1668a55aSZahari Doychev	tc_check_packets "dev $h2 ingress" 101 1
111*1668a55aSZahari Doychev	check_err $? "Did not match on correct level"
112*1668a55aSZahari Doychev
113*1668a55aSZahari Doychev	tc_check_packets "dev $h2 ingress" 102 0
114*1668a55aSZahari Doychev	check_err $? "Matched on the wrong level"
115*1668a55aSZahari Doychev
116*1668a55aSZahari Doychev	tc_check_packets "dev $h2 ingress" 103 1
117*1668a55aSZahari Doychev	check_err $? "Did not match on correct level"
118*1668a55aSZahari Doychev
119*1668a55aSZahari Doychev	pkt="$ethtype $(generate_cfm_hdr 3 0 0 4)"
120*1668a55aSZahari Doychev	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
121*1668a55aSZahari Doychev
122*1668a55aSZahari Doychev	tc_check_packets "dev $h2 ingress" 101 1
123*1668a55aSZahari Doychev	check_err $? "Matched on the wrong level"
124*1668a55aSZahari Doychev
125*1668a55aSZahari Doychev	tc_check_packets "dev $h2 ingress" 102 1
126*1668a55aSZahari Doychev	check_err $? "Did not match on correct level"
127*1668a55aSZahari Doychev
128*1668a55aSZahari Doychev	tc_check_packets "dev $h2 ingress" 103 1
129*1668a55aSZahari Doychev	check_err $? "Matched on the wrong level"
130*1668a55aSZahari Doychev
131*1668a55aSZahari Doychev	tc filter del dev $h2 ingress protocol cfm pref 1 handle 101 flower
132*1668a55aSZahari Doychev	tc filter del dev $h2 ingress protocol cfm pref 1 handle 102 flower
133*1668a55aSZahari Doychev	tc filter del dev $h2 ingress protocol cfm pref 1 handle 103 flower
134*1668a55aSZahari Doychev
135*1668a55aSZahari Doychev	log_test "CFM level match test"
136*1668a55aSZahari Doychev}
137*1668a55aSZahari Doychev
138*1668a55aSZahari Doychevmatch_cfm_level_and_opcode()
139*1668a55aSZahari Doychev{
140*1668a55aSZahari Doychev	local ethtype="89 02"; readonly ethtype
141*1668a55aSZahari Doychev	RET=0
142*1668a55aSZahari Doychev
143*1668a55aSZahari Doychev	tc filter add dev $h2 ingress protocol cfm pref 1 handle 101 \
144*1668a55aSZahari Doychev	   flower cfm mdl 5 op 41 action drop
145*1668a55aSZahari Doychev	tc filter add dev $h2 ingress protocol cfm pref 1 handle 102 \
146*1668a55aSZahari Doychev	   flower cfm mdl 7 op 42 action drop
147*1668a55aSZahari Doychev
148*1668a55aSZahari Doychev	pkt="$ethtype $(generate_cfm_hdr 5 41 0 4)"
149*1668a55aSZahari Doychev	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
150*1668a55aSZahari Doychev	pkt="$ethtype $(generate_cfm_hdr 7 3 0 4)"
151*1668a55aSZahari Doychev	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
152*1668a55aSZahari Doychev	pkt="$ethtype $(generate_cfm_hdr 3 42 0 12)"
153*1668a55aSZahari Doychev	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
154*1668a55aSZahari Doychev
155*1668a55aSZahari Doychev	tc_check_packets "dev $h2 ingress" 101 1
156*1668a55aSZahari Doychev	check_err $? "Did not match on correct level and opcode"
157*1668a55aSZahari Doychev
158*1668a55aSZahari Doychev	tc_check_packets "dev $h2 ingress" 102 0
159*1668a55aSZahari Doychev	check_err $? "Matched on the wrong level and opcode"
160*1668a55aSZahari Doychev
161*1668a55aSZahari Doychev	pkt="$ethtype $(generate_cfm_hdr 7 42 0 12)"
162*1668a55aSZahari Doychev	$MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac "$pkt" -q
163*1668a55aSZahari Doychev
164*1668a55aSZahari Doychev	tc_check_packets "dev $h2 ingress" 101 1
165*1668a55aSZahari Doychev	check_err $? "Matched on the wrong level and opcode"
166*1668a55aSZahari Doychev
167*1668a55aSZahari Doychev	tc_check_packets "dev $h2 ingress" 102 1
168*1668a55aSZahari Doychev	check_err $? "Did not match on correct level and opcode"
169*1668a55aSZahari Doychev
170*1668a55aSZahari Doychev	tc filter del dev $h2 ingress protocol cfm pref 1 handle 101 flower
171*1668a55aSZahari Doychev	tc filter del dev $h2 ingress protocol cfm pref 1 handle 102 flower
172*1668a55aSZahari Doychev
173*1668a55aSZahari Doychev	log_test "CFM opcode and level match test"
174*1668a55aSZahari Doychev}
175*1668a55aSZahari Doychev
176*1668a55aSZahari Doychevsetup_prepare()
177*1668a55aSZahari Doychev{
178*1668a55aSZahari Doychev	h1=${NETIFS[p1]}
179*1668a55aSZahari Doychev	h2=${NETIFS[p2]}
180*1668a55aSZahari Doychev	h1mac=$(mac_get $h1)
181*1668a55aSZahari Doychev	h2mac=$(mac_get $h2)
182*1668a55aSZahari Doychev
183*1668a55aSZahari Doychev	vrf_prepare
184*1668a55aSZahari Doychev
185*1668a55aSZahari Doychev	h1_create
186*1668a55aSZahari Doychev	h2_create
187*1668a55aSZahari Doychev}
188*1668a55aSZahari Doychev
189*1668a55aSZahari Doychevcleanup()
190*1668a55aSZahari Doychev{
191*1668a55aSZahari Doychev	pre_cleanup
192*1668a55aSZahari Doychev
193*1668a55aSZahari Doychev	h2_destroy
194*1668a55aSZahari Doychev	h1_destroy
195*1668a55aSZahari Doychev
196*1668a55aSZahari Doychev	vrf_cleanup
197*1668a55aSZahari Doychev}
198*1668a55aSZahari Doychev
199*1668a55aSZahari Doychevtrap cleanup EXIT
200*1668a55aSZahari Doychev
201*1668a55aSZahari Doychevsetup_prepare
202*1668a55aSZahari Doychevsetup_wait
203*1668a55aSZahari Doychev
204*1668a55aSZahari Doychevtests_run
205*1668a55aSZahari Doychev
206*1668a55aSZahari Doychevexit $EXIT_STATUS
207