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