Skip to content

Commit b1d95ae

Browse files
raybellisdavem330
authored andcommitted
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 <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 0c71de6 commit b1d95ae

File tree

2 files changed

+79
-151
lines changed

2 files changed

+79
-151
lines changed

tools/net/bpf_exp.l

Lines changed: 68 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
#include <stdio.h>
2424
#include <stdint.h>
2525
#include <stdlib.h>
26+
#include <string.h>
27+
28+
#include <linux/filter.h>
2629

2730
#include "bpf_exp.yacc.h"
2831

@@ -79,22 +82,71 @@ extern void yyerror(const char *str);
7982
"txa" { return OP_TXA; }
8083

8184
"#"?("len") { return K_PKT_LEN; }
82-
"#"?("proto") { return K_PROTO; }
83-
"#"?("type") { return K_TYPE; }
84-
"#"?("poff") { return K_POFF; }
85-
"#"?("ifidx") { return K_IFIDX; }
86-
"#"?("nla") { return K_NLATTR; }
87-
"#"?("nlan") { return K_NLATTR_NEST; }
88-
"#"?("mark") { return K_MARK; }
89-
"#"?("queue") { return K_QUEUE; }
90-
"#"?("hatype") { return K_HATYPE; }
91-
"#"?("rxhash") { return K_RXHASH; }
92-
"#"?("cpu") { return K_CPU; }
93-
"#"?("vlan_tci") { return K_VLAN_TCI; }
94-
"#"?("vlan_pr") { return K_VLAN_AVAIL; }
95-
"#"?("vlan_avail") { return K_VLAN_AVAIL; }
96-
"#"?("vlan_tpid") { return K_VLAN_TPID; }
97-
"#"?("rand") { return K_RAND; }
85+
86+
"#"?("proto") {
87+
yylval.number = SKF_AD_PROTOCOL;
88+
return extension;
89+
}
90+
"#"?("type") {
91+
yylval.number = SKF_AD_PKTTYPE;
92+
return extension;
93+
}
94+
"#"?("poff") {
95+
yylval.number = SKF_AD_PAY_OFFSET;
96+
return extension;
97+
}
98+
"#"?("ifidx") {
99+
yylval.number = SKF_AD_IFINDEX;
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+
}
98150

99151
":" { return ':'; }
100152
"," { return ','; }

tools/net/bpf_exp.y

Lines changed: 11 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
enum jmp_type { JTL, JFL, JKL };
3636

3737
extern FILE *yyin;
38+
extern int yylineno;
3839
extern int yylex(void);
3940
extern void yyerror(const char *str);
4041

@@ -55,14 +56,14 @@ static void bpf_set_jmp_label(char *label, enum jmp_type type);
5556
%token OP_RET OP_TAX OP_TXA OP_LDXB OP_MOD OP_NEG OP_JNEQ OP_JLT OP_JLE OP_LDI
5657
%token OP_LDXI
5758

58-
%token K_PKT_LEN K_PROTO K_TYPE K_NLATTR K_NLATTR_NEST K_MARK K_QUEUE K_HATYPE
59-
%token K_RXHASH K_CPU K_IFIDX K_VLAN_TCI K_VLAN_AVAIL K_VLAN_TPID K_POFF K_RAND
59+
%token K_PKT_LEN
6060

6161
%token ':' ',' '[' ']' '(' ')' 'x' 'a' '+' 'M' '*' '&' '#' '%'
6262

63-
%token number label
63+
%token extension number label
6464

6565
%type <label> label
66+
%type <number> extension
6667
%type <number> number
6768

6869
%%
@@ -125,51 +126,9 @@ ldb
125126
bpf_set_curr_instr(BPF_LD | BPF_B | BPF_IND, 0, 0, $6); }
126127
| OP_LDB '[' number ']' {
127128
bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0, $3); }
128-
| OP_LDB K_PROTO {
129+
| OP_LDB extension {
129130
bpf_set_curr_instr(BPF_LD | BPF_B | BPF_ABS, 0, 0,
130-
SKF_AD_OFF + SKF_AD_PROTOCOL); }
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); }
131+
SKF_AD_OFF + $2); }
173132
;
174133

175134
ldh
@@ -179,51 +138,9 @@ ldh
179138
bpf_set_curr_instr(BPF_LD | BPF_H | BPF_IND, 0, 0, $6); }
180139
| OP_LDH '[' number ']' {
181140
bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0, $3); }
182-
| OP_LDH K_PROTO {
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 {
141+
| OP_LDH extension {
204142
bpf_set_curr_instr(BPF_LD | BPF_H | BPF_ABS, 0, 0,
205-
SKF_AD_OFF + SKF_AD_HATYPE); }
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); }
143+
SKF_AD_OFF + $2); }
227144
;
228145

229146
ldi
@@ -238,51 +155,9 @@ ld
238155
bpf_set_curr_instr(BPF_LD | BPF_IMM, 0, 0, $3); }
239156
| OP_LD K_PKT_LEN {
240157
bpf_set_curr_instr(BPF_LD | BPF_W | BPF_LEN, 0, 0, 0); }
241-
| OP_LD K_PROTO {
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 {
158+
| OP_LD extension {
284159
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); }
286161
| OP_LD 'M' '[' number ']' {
287162
bpf_set_curr_instr(BPF_LD | BPF_MEM, 0, 0, $4); }
288163
| OP_LD '[' 'x' '+' number ']' {
@@ -776,5 +651,6 @@ void bpf_asm_compile(FILE *fp, bool cstyle)
776651

777652
void yyerror(const char *str)
778653
{
654+
fprintf(stderr, "error: %s at line %d\n", str, yylineno);
779655
exit(1);
780656
}

0 commit comments

Comments
 (0)