summaryrefslogtreecommitdiffstats
path: root/tools/net
diff options
context:
space:
mode:
authorRay Bellis <ray@isc.org>2016-02-22 05:02:40 -0500
committerDavid S. Miller <davem@davemloft.net>2016-02-22 13:29:42 -0500
commitb1d95ae5c5bd3deba84d00c4f83d7d0836b5936f (patch)
tree720f4a334f3bab64b586866165b158903c8efb7f /tools/net
parent0c71de6634c5c1b6c9dcb80049680ad334205c23 (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.l84
-rw-r--r--tools/net/bpf_exp.y146
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 @@
35enum jmp_type { JTL, JFL, JKL }; 35enum jmp_type { JTL, JFL, JKL };
36 36
37extern FILE *yyin; 37extern FILE *yyin;
38extern int yylineno;
38extern int yylex(void); 39extern int yylex(void);
39extern void yyerror(const char *str); 40extern 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
175ldh 134ldh
@@ -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
229ldi 146ldi
@@ -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
777void yyerror(const char *str) 652void 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}