3535enum jmp_type { JTL, JFL, JKL };
3636
3737extern FILE *yyin;
38+ extern int yylineno;
3839extern int yylex (void );
3940extern 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%%
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
175134ldh
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
229146ldi
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
777652void yyerror (const char *str)
778653{
654+ fprintf (stderr, " error: %s at line %d\n " , str, yylineno);
779655 exit (1 );
780656}
0 commit comments