diff options
author | Ray Bellis <ray@isc.org> | 2016-02-22 05:02:40 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-02-22 13:29:42 -0500 |
commit | b1d95ae5c5bd3deba84d00c4f83d7d0836b5936f (patch) | |
tree | 720f4a334f3bab64b586866165b158903c8efb7f /tools/net | |
parent | 0c71de6634c5c1b6c9dcb80049680ad334205c23 (diff) |
tools, bpf_asm: simplify parser rule for BPF extensions
We can already use yylval in the lexer for encoding the BPF extension
number, so that the parser rules can be further reduced to a single one
for each B/H/W case.
Signed-off-by: Ray Bellis <ray@isc.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'tools/net')
-rw-r--r-- | tools/net/bpf_exp.l | 84 | ||||
-rw-r--r-- | tools/net/bpf_exp.y | 146 |
2 files changed, 79 insertions, 151 deletions
diff --git a/tools/net/bpf_exp.l b/tools/net/bpf_exp.l index 7cc72a336645..bd83149e7be0 100644 --- a/tools/net/bpf_exp.l +++ b/tools/net/bpf_exp.l | |||
@@ -23,6 +23,9 @@ | |||
23 | #include <stdio.h> | 23 | #include <stdio.h> |
24 | #include <stdint.h> | 24 | #include <stdint.h> |
25 | #include <stdlib.h> | 25 | #include <stdlib.h> |
26 | #include <string.h> | ||
27 | |||
28 | #include <linux/filter.h> | ||
26 | 29 | ||
27 | #include "bpf_exp.yacc.h" | 30 | #include "bpf_exp.yacc.h" |
28 | 31 | ||
@@ -79,22 +82,71 @@ extern void yyerror(const char *str); | |||
79 | "txa" { return OP_TXA; } | 82 | "txa" { return OP_TXA; } |
80 | 83 | ||
81 | "#"?("len") { return K_PKT_LEN; } | 84 | "#"?("len") { return K_PKT_LEN; } |
82 | "#"?("proto") { return K_PROTO; } | 85 | |
83 | "#"?("type") { return K_TYPE; } | 86 | "#"?("proto") { |
84 | "#"?("poff") { return K_POFF; } | 87 | yylval.number = SKF_AD_PROTOCOL; |
85 | "#"?("ifidx") { return K_IFIDX; } | 88 | return extension; |
86 | "#"?("nla") { return K_NLATTR; } | 89 | } |
87 | "#"?("nlan") { return K_NLATTR_NEST; } | 90 | "#"?("type") { |
88 | "#"?("mark") { return K_MARK; } | 91 | yylval.number = SKF_AD_PKTTYPE; |
89 | "#"?("queue") { return K_QUEUE; } | 92 | return extension; |
90 | "#"?("hatype") { return K_HATYPE; } | 93 | } |
91 | "#"?("rxhash") { return K_RXHASH; } | 94 | "#"?("poff") { |
92 | "#"?("cpu") { return K_CPU; } | 95 | yylval.number = SKF_AD_PAY_OFFSET; |
93 | "#"?("vlan_tci") { return K_VLAN_TCI; } | 96 | return extension; |
94 | "#"?("vlan_pr") { return K_VLAN_AVAIL; } | 97 | } |
95 | "#"?("vlan_avail") { return K_VLAN_AVAIL; } | 98 | "#"?("ifidx") { |
96 | "#"?("vlan_tpid") { return K_VLAN_TPID; } | 99 | yylval.number = SKF_AD_IFINDEX; |
97 | "#"?("rand") { return K_RAND; } | 100 | return extension; |
101 | } | ||
102 | "#"?("nla") { | ||
103 | yylval.number = SKF_AD_NLATTR; | ||
104 | return extension; | ||
105 | } | ||
106 | "#"?("nlan") { | ||
107 | yylval.number = SKF_AD_NLATTR_NEST; | ||
108 | return extension; | ||
109 | } | ||
110 | "#"?("mark") { | ||
111 | yylval.number = SKF_AD_MARK; | ||
112 | return extension; | ||
113 | } | ||
114 | "#"?("queue") { | ||
115 | yylval.number = SKF_AD_QUEUE; | ||
116 | return extension; | ||
117 | } | ||
118 | "#"?("hatype") { | ||
119 | yylval.number = SKF_AD_HATYPE; | ||
120 | return extension; | ||
121 | } | ||
122 | "#"?("rxhash") { | ||
123 | yylval.number = SKF_AD_RXHASH; | ||
124 | return extension; | ||
125 | } | ||
126 | "#"?("cpu") { | ||
127 | yylval.number = SKF_AD_CPU; | ||
128 | return extension; | ||
129 | } | ||
130 | "#"?("vlan_tci") { | ||
131 | yylval.number = SKF_AD_VLAN_TAG; | ||
132 | return extension; | ||
133 | } | ||
134 | "#"?("vlan_pr") { | ||
135 | yylval.number = SKF_AD_VLAN_TAG_PRESENT; | ||
136 | return extension; | ||
137 | } | ||
138 | "#"?("vlan_avail") { | ||
139 | yylval.number = SKF_AD_VLAN_TAG_PRESENT; | ||
140 | return extension; | ||
141 | } | ||
142 | "#"?("vlan_tpid") { | ||
143 | yylval.number = SKF_AD_VLAN_TPID; | ||
144 | return extension; | ||
145 | } | ||
146 | "#"?("rand") { | ||
147 | yylval.number = SKF_AD_RANDOM; | ||
148 | return extension; | ||
149 | } | ||
98 | 150 | ||
99 | ":" { return ':'; } | 151 | ":" { return ':'; } |
100 | "," { return ','; } | 152 | "," { return ','; } |
diff --git a/tools/net/bpf_exp.y b/tools/net/bpf_exp.y index e24eea1b0db5..56ba1de50784 100644 --- a/tools/net/bpf_exp.y +++ b/tools/net/bpf_exp.y | |||
@@ -35,6 +35,7 @@ | |||
35 | enum jmp_type { JTL, JFL, JKL }; | 35 | enum jmp_type { JTL, JFL, JKL }; |
36 | 36 | ||
37 | extern FILE *yyin; | 37 | extern FILE *yyin; |
38 | extern int yylineno; | ||
38 | extern int yylex(void); | 39 | extern int yylex(void); |
39 | extern void yyerror(const char *str); | 40 | extern void yyerror(const char *str); |
40 | 41 | ||
@@ -55,14 +56,14 @@ static void bpf_set_jmp_label(char *label, enum jmp_type type); | |||
55 | %token OP_RET OP_TAX OP_TXA OP_LDXB OP_MOD OP_NEG OP_JNEQ OP_JLT OP_JLE OP_LDI | 56 | %token OP_RET OP_TAX OP_TXA OP_LDXB OP_MOD OP_NEG OP_JNEQ OP_JLT OP_JLE OP_LDI |
56 | %token OP_LDXI | 57 | %token OP_LDXI |
57 | 58 | ||
58 | %token K_PKT_LEN K_PROTO K_TYPE K_NLATTR K_NLATTR_NEST K_MARK K_QUEUE K_HATYPE | 59 | %token K_PKT_LEN |
59 | %token K_RXHASH K_CPU K_IFIDX K_VLAN_TCI K_VLAN_AVAIL K_VLAN_TPID K_POFF K_RAND | ||
60 | 60 | ||
61 | %token ':' ',' '[' ']' '(' ')' 'x' 'a' '+' 'M' '*' '&' '#' '%' | 61 | %token ':' ',' '[' ']' '(' ')' 'x' 'a' '+' 'M' '*' '&' '#' '%' |
62 | 62 | ||
63 | %token number label | 63 | %token extension number label |
64 | 64 | ||
65 | %type <label> label | 65 | %type <label> label |
66 | %type <number> extension | ||
66 | %type <number> number | 67 | %type <number> number |
67 | 68 | ||
68 | %% | 69 | %% |
@@ -125,51 +126,9 @@ ldb | |||
125 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_IND, 0, 0, $6); } | 126 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_IND, 0, 0, $6); } |
126 | | OP_LDB '[' number ']' { | 127 | | OP_LDB '[' number ']' { |
127 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, $3); } | 128 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, $3); } |
128 | | OP_LDB K_PROTO { | 129 | | OP_LDB extension { |
129 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | 130 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, |
130 | SKF_AD_OFF + SKF_AD_PROTOCOL); } | 131 | SKF_AD_OFF + $2); } |
131 | | OP_LDB K_TYPE { | ||
132 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | ||
133 | SKF_AD_OFF + SKF_AD_PKTTYPE); } | ||
134 | | OP_LDB K_IFIDX { | ||
135 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | ||
136 | SKF_AD_OFF + SKF_AD_IFINDEX); } | ||
137 | | OP_LDB K_NLATTR { | ||
138 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | ||
139 | SKF_AD_OFF + SKF_AD_NLATTR); } | ||
140 | | OP_LDB K_NLATTR_NEST { | ||
141 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | ||
142 | SKF_AD_OFF + SKF_AD_NLATTR_NEST); } | ||
143 | | OP_LDB K_MARK { | ||
144 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | ||
145 | SKF_AD_OFF + SKF_AD_MARK); } | ||
146 | | OP_LDB K_QUEUE { | ||
147 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | ||
148 | SKF_AD_OFF + SKF_AD_QUEUE); } | ||
149 | | OP_LDB K_HATYPE { | ||
150 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | ||
151 | SKF_AD_OFF + SKF_AD_HATYPE); } | ||
152 | | OP_LDB K_RXHASH { | ||
153 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | ||
154 | SKF_AD_OFF + SKF_AD_RXHASH); } | ||
155 | | OP_LDB K_CPU { | ||
156 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | ||
157 | SKF_AD_OFF + SKF_AD_CPU); } | ||
158 | | OP_LDB K_VLAN_TCI { | ||
159 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | ||
160 | SKF_AD_OFF + SKF_AD_VLAN_TAG); } | ||
161 | | OP_LDB K_VLAN_AVAIL { | ||
162 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | ||
163 | SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT); } | ||
164 | | OP_LDB K_POFF { | ||
165 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | ||
166 | SKF_AD_OFF + SKF_AD_PAY_OFFSET); } | ||
167 | | OP_LDB K_RAND { | ||
168 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | ||
169 | SKF_AD_OFF + SKF_AD_RANDOM); } | ||
170 | | OP_LDB K_VLAN_TPID { | ||
171 | bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, | ||
172 | SKF_AD_OFF + SKF_AD_VLAN_TPID); } | ||
173 | ; | 132 | ; |
174 | 133 | ||
175 | ldh | 134 | ldh |
@@ -179,51 +138,9 @@ ldh | |||
179 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_IND, 0, 0, $6); } | 138 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_IND, 0, 0, $6); } |
180 | | OP_LDH '[' number ']' { | 139 | | OP_LDH '[' number ']' { |
181 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, $3); } | 140 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, $3); } |
182 | | OP_LDH K_PROTO { | 141 | | OP_LDH extension { |
183 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | ||
184 | SKF_AD_OFF + SKF_AD_PROTOCOL); } | ||
185 | | OP_LDH K_TYPE { | ||
186 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | ||
187 | SKF_AD_OFF + SKF_AD_PKTTYPE); } | ||
188 | | OP_LDH K_IFIDX { | ||
189 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | ||
190 | SKF_AD_OFF + SKF_AD_IFINDEX); } | ||
191 | | OP_LDH K_NLATTR { | ||
192 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | ||
193 | SKF_AD_OFF + SKF_AD_NLATTR); } | ||
194 | | OP_LDH K_NLATTR_NEST { | ||
195 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | ||
196 | SKF_AD_OFF + SKF_AD_NLATTR_NEST); } | ||
197 | | OP_LDH K_MARK { | ||
198 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | ||
199 | SKF_AD_OFF + SKF_AD_MARK); } | ||
200 | | OP_LDH K_QUEUE { | ||
201 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | ||
202 | SKF_AD_OFF + SKF_AD_QUEUE); } | ||
203 | | OP_LDH K_HATYPE { | ||
204 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | 142 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, |
205 | SKF_AD_OFF + SKF_AD_HATYPE); } | 143 | SKF_AD_OFF + $2); } |
206 | | OP_LDH K_RXHASH { | ||
207 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | ||
208 | SKF_AD_OFF + SKF_AD_RXHASH); } | ||
209 | | OP_LDH K_CPU { | ||
210 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | ||
211 | SKF_AD_OFF + SKF_AD_CPU); } | ||
212 | | OP_LDH K_VLAN_TCI { | ||
213 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | ||
214 | SKF_AD_OFF + SKF_AD_VLAN_TAG); } | ||
215 | | OP_LDH K_VLAN_AVAIL { | ||
216 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | ||
217 | SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT); } | ||
218 | | OP_LDH K_POFF { | ||
219 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | ||
220 | SKF_AD_OFF + SKF_AD_PAY_OFFSET); } | ||
221 | | OP_LDH K_RAND { | ||
222 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | ||
223 | SKF_AD_OFF + SKF_AD_RANDOM); } | ||
224 | | OP_LDH K_VLAN_TPID { | ||
225 | bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, | ||
226 | SKF_AD_OFF + SKF_AD_VLAN_TPID); } | ||
227 | ; | 144 | ; |
228 | 145 | ||
229 | ldi | 146 | ldi |
@@ -238,51 +155,9 @@ ld | |||
238 | bpf_set_curr_instr(BPF_LD | BPF_IMM, 0, 0, $3); } | 155 | bpf_set_curr_instr(BPF_LD | BPF_IMM, 0, 0, $3); } |
239 | | OP_LD K_PKT_LEN { | 156 | | OP_LD K_PKT_LEN { |
240 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_LEN, 0, 0, 0); } | 157 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_LEN, 0, 0, 0); } |
241 | | OP_LD K_PROTO { | 158 | | OP_LD extension { |
242 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | ||
243 | SKF_AD_OFF + SKF_AD_PROTOCOL); } | ||
244 | | OP_LD K_TYPE { | ||
245 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | ||
246 | SKF_AD_OFF + SKF_AD_PKTTYPE); } | ||
247 | | OP_LD K_IFIDX { | ||
248 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | ||
249 | SKF_AD_OFF + SKF_AD_IFINDEX); } | ||
250 | | OP_LD K_NLATTR { | ||
251 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | ||
252 | SKF_AD_OFF + SKF_AD_NLATTR); } | ||
253 | | OP_LD K_NLATTR_NEST { | ||
254 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | ||
255 | SKF_AD_OFF + SKF_AD_NLATTR_NEST); } | ||
256 | | OP_LD K_MARK { | ||
257 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | ||
258 | SKF_AD_OFF + SKF_AD_MARK); } | ||
259 | | OP_LD K_QUEUE { | ||
260 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | ||
261 | SKF_AD_OFF + SKF_AD_QUEUE); } | ||
262 | | OP_LD K_HATYPE { | ||
263 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | ||
264 | SKF_AD_OFF + SKF_AD_HATYPE); } | ||
265 | | OP_LD K_RXHASH { | ||
266 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | ||
267 | SKF_AD_OFF + SKF_AD_RXHASH); } | ||
268 | | OP_LD K_CPU { | ||
269 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | ||
270 | SKF_AD_OFF + SKF_AD_CPU); } | ||
271 | | OP_LD K_VLAN_TCI { | ||
272 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | ||
273 | SKF_AD_OFF + SKF_AD_VLAN_TAG); } | ||
274 | | OP_LD K_VLAN_AVAIL { | ||
275 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | ||
276 | SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT); } | ||
277 | | OP_LD K_POFF { | ||
278 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | ||
279 | SKF_AD_OFF + SKF_AD_PAY_OFFSET); } | ||
280 | | OP_LD K_RAND { | ||
281 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | ||
282 | SKF_AD_OFF + SKF_AD_RANDOM); } | ||
283 | | OP_LD K_VLAN_TPID { | ||
284 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, | 159 | bpf_set_curr_instr(BPF_LD | BPF_W | BPF_ABS, 0, 0, |
285 | SKF_AD_OFF + SKF_AD_VLAN_TPID); } | 160 | SKF_AD_OFF + $2); } |
286 | | OP_LD 'M' '[' number ']' { | 161 | | OP_LD 'M' '[' number ']' { |
287 | bpf_set_curr_instr(BPF_LD | BPF_MEM, 0, 0, $4); } | 162 | bpf_set_curr_instr(BPF_LD | BPF_MEM, 0, 0, $4); } |
288 | | OP_LD '[' 'x' '+' number ']' { | 163 | | OP_LD '[' 'x' '+' number ']' { |
@@ -776,5 +651,6 @@ void bpf_asm_compile(FILE *fp, bool cstyle) | |||
776 | 651 | ||
777 | void yyerror(const char *str) | 652 | void yyerror(const char *str) |
778 | { | 653 | { |
654 | fprintf(stderr, "error: %s at line %d\n", str, yylineno); | ||
779 | exit(1); | 655 | exit(1); |
780 | } | 656 | } |