xref: /openbmc/linux/tools/bpf/bpf_exp.l (revision 3eb66e91a25497065c5322b1268cbc3953642227)
1a92bb546SJakub Kicinski /*
2a92bb546SJakub Kicinski  * BPF asm code lexer
3a92bb546SJakub Kicinski  *
4a92bb546SJakub Kicinski  * This program is free software; you can distribute it and/or modify
5a92bb546SJakub Kicinski  * it under the terms of the GNU General Public License as published
6a92bb546SJakub Kicinski  * by the Free Software Foundation; either version 2 of the License,
7a92bb546SJakub Kicinski  * or (at your option) any later version.
8a92bb546SJakub Kicinski  *
9a92bb546SJakub Kicinski  * Syntax kept close to:
10a92bb546SJakub Kicinski  *
11a92bb546SJakub Kicinski  * Steven McCanne and Van Jacobson. 1993. The BSD packet filter: a new
12a92bb546SJakub Kicinski  * architecture for user-level packet capture. In Proceedings of the
13a92bb546SJakub Kicinski  * USENIX Winter 1993 Conference Proceedings on USENIX Winter 1993
14a92bb546SJakub Kicinski  * Conference Proceedings (USENIX'93). USENIX Association, Berkeley,
15a92bb546SJakub Kicinski  * CA, USA, 2-2.
16a92bb546SJakub Kicinski  *
17a92bb546SJakub Kicinski  * Copyright 2013 Daniel Borkmann <borkmann@redhat.com>
18a92bb546SJakub Kicinski  * Licensed under the GNU General Public License, version 2.0 (GPLv2)
19a92bb546SJakub Kicinski  */
20a92bb546SJakub Kicinski 
21a92bb546SJakub Kicinski %{
22a92bb546SJakub Kicinski 
23a92bb546SJakub Kicinski #include <stdio.h>
24a92bb546SJakub Kicinski #include <stdint.h>
25a92bb546SJakub Kicinski #include <stdlib.h>
26a92bb546SJakub Kicinski #include <string.h>
27a92bb546SJakub Kicinski 
28a92bb546SJakub Kicinski #include <linux/filter.h>
29a92bb546SJakub Kicinski 
30a92bb546SJakub Kicinski #include "bpf_exp.yacc.h"
31a92bb546SJakub Kicinski 
32a92bb546SJakub Kicinski extern void yyerror(const char *str);
33a92bb546SJakub Kicinski 
34a92bb546SJakub Kicinski %}
35a92bb546SJakub Kicinski 
36a92bb546SJakub Kicinski %option align
37a92bb546SJakub Kicinski %option ecs
38a92bb546SJakub Kicinski 
39a92bb546SJakub Kicinski %option nounput
40a92bb546SJakub Kicinski %option noreject
41a92bb546SJakub Kicinski %option noinput
42a92bb546SJakub Kicinski %option noyywrap
43a92bb546SJakub Kicinski 
44a92bb546SJakub Kicinski %option 8bit
45a92bb546SJakub Kicinski %option caseless
46a92bb546SJakub Kicinski %option yylineno
47a92bb546SJakub Kicinski 
48a92bb546SJakub Kicinski %%
49a92bb546SJakub Kicinski 
50a92bb546SJakub Kicinski "ldb"		{ return OP_LDB; }
51a92bb546SJakub Kicinski "ldh"		{ return OP_LDH; }
52a92bb546SJakub Kicinski "ld"		{ return OP_LD; }
53a92bb546SJakub Kicinski "ldi"		{ return OP_LDI; }
54a92bb546SJakub Kicinski "ldx"		{ return OP_LDX; }
55a92bb546SJakub Kicinski "ldxi"		{ return OP_LDXI; }
56a92bb546SJakub Kicinski "ldxb"		{ return OP_LDXB; }
57a92bb546SJakub Kicinski "st"		{ return OP_ST; }
58a92bb546SJakub Kicinski "stx"		{ return OP_STX; }
59a92bb546SJakub Kicinski "jmp"		{ return OP_JMP; }
60a92bb546SJakub Kicinski "ja"		{ return OP_JMP; }
61a92bb546SJakub Kicinski "jeq"		{ return OP_JEQ; }
62a92bb546SJakub Kicinski "jneq"		{ return OP_JNEQ; }
63a92bb546SJakub Kicinski "jne"		{ return OP_JNEQ; }
64a92bb546SJakub Kicinski "jlt"		{ return OP_JLT; }
65a92bb546SJakub Kicinski "jle"		{ return OP_JLE; }
66a92bb546SJakub Kicinski "jgt"		{ return OP_JGT; }
67a92bb546SJakub Kicinski "jge"		{ return OP_JGE; }
68a92bb546SJakub Kicinski "jset"		{ return OP_JSET; }
69a92bb546SJakub Kicinski "add"		{ return OP_ADD; }
70a92bb546SJakub Kicinski "sub"		{ return OP_SUB; }
71a92bb546SJakub Kicinski "mul"		{ return OP_MUL; }
72a92bb546SJakub Kicinski "div"		{ return OP_DIV; }
73a92bb546SJakub Kicinski "mod"		{ return OP_MOD; }
74a92bb546SJakub Kicinski "neg"		{ return OP_NEG; }
75a92bb546SJakub Kicinski "and"		{ return OP_AND; }
76a92bb546SJakub Kicinski "xor"		{ return OP_XOR; }
77a92bb546SJakub Kicinski "or"		{ return OP_OR; }
78a92bb546SJakub Kicinski "lsh"		{ return OP_LSH; }
79a92bb546SJakub Kicinski "rsh"		{ return OP_RSH; }
80a92bb546SJakub Kicinski "ret"		{ return OP_RET; }
81a92bb546SJakub Kicinski "tax"		{ return OP_TAX; }
82a92bb546SJakub Kicinski "txa"		{ return OP_TXA; }
83a92bb546SJakub Kicinski 
84a92bb546SJakub Kicinski "#"?("len")	{ return K_PKT_LEN; }
85a92bb546SJakub Kicinski 
86a92bb546SJakub Kicinski "#"?("proto")	{
87a92bb546SJakub Kicinski 		yylval.number = SKF_AD_PROTOCOL;
88a92bb546SJakub Kicinski 		return extension;
89a92bb546SJakub Kicinski 	}
90a92bb546SJakub Kicinski "#"?("type")	{
91a92bb546SJakub Kicinski 		yylval.number = SKF_AD_PKTTYPE;
92a92bb546SJakub Kicinski 		return extension;
93a92bb546SJakub Kicinski 	}
94a92bb546SJakub Kicinski "#"?("poff")	{
95a92bb546SJakub Kicinski 		yylval.number = SKF_AD_PAY_OFFSET;
96a92bb546SJakub Kicinski 		return extension;
97a92bb546SJakub Kicinski 	}
98a92bb546SJakub Kicinski "#"?("ifidx")	{
99a92bb546SJakub Kicinski 		yylval.number = SKF_AD_IFINDEX;
100a92bb546SJakub Kicinski 		return extension;
101a92bb546SJakub Kicinski 	}
102a92bb546SJakub Kicinski "#"?("nla")	{
103a92bb546SJakub Kicinski 		yylval.number = SKF_AD_NLATTR;
104a92bb546SJakub Kicinski 		return extension;
105a92bb546SJakub Kicinski 	}
106a92bb546SJakub Kicinski "#"?("nlan")	{
107a92bb546SJakub Kicinski 		yylval.number = SKF_AD_NLATTR_NEST;
108a92bb546SJakub Kicinski 		return extension;
109a92bb546SJakub Kicinski 	}
110a92bb546SJakub Kicinski "#"?("mark")	{
111a92bb546SJakub Kicinski 		yylval.number = SKF_AD_MARK;
112a92bb546SJakub Kicinski 		return extension;
113a92bb546SJakub Kicinski 	}
114a92bb546SJakub Kicinski "#"?("queue")	{
115a92bb546SJakub Kicinski 		yylval.number = SKF_AD_QUEUE;
116a92bb546SJakub Kicinski 		return extension;
117a92bb546SJakub Kicinski 	}
118a92bb546SJakub Kicinski "#"?("hatype")	{
119a92bb546SJakub Kicinski 		yylval.number = SKF_AD_HATYPE;
120a92bb546SJakub Kicinski 		return extension;
121a92bb546SJakub Kicinski 	}
122a92bb546SJakub Kicinski "#"?("rxhash")	{
123a92bb546SJakub Kicinski 		yylval.number = SKF_AD_RXHASH;
124a92bb546SJakub Kicinski 		return extension;
125a92bb546SJakub Kicinski 	}
126a92bb546SJakub Kicinski "#"?("cpu")	{
127a92bb546SJakub Kicinski 		yylval.number = SKF_AD_CPU;
128a92bb546SJakub Kicinski 		return extension;
129a92bb546SJakub Kicinski 	}
130a92bb546SJakub Kicinski "#"?("vlan_tci") {
131a92bb546SJakub Kicinski 		yylval.number = SKF_AD_VLAN_TAG;
132a92bb546SJakub Kicinski 		return extension;
133a92bb546SJakub Kicinski 	}
134a92bb546SJakub Kicinski "#"?("vlan_pr")	{
135a92bb546SJakub Kicinski 		yylval.number = SKF_AD_VLAN_TAG_PRESENT;
136a92bb546SJakub Kicinski 		return extension;
137a92bb546SJakub Kicinski 	}
138a92bb546SJakub Kicinski "#"?("vlan_avail") {
139a92bb546SJakub Kicinski 		yylval.number = SKF_AD_VLAN_TAG_PRESENT;
140a92bb546SJakub Kicinski 		return extension;
141a92bb546SJakub Kicinski 	}
142a92bb546SJakub Kicinski "#"?("vlan_tpid") {
143a92bb546SJakub Kicinski 		yylval.number = SKF_AD_VLAN_TPID;
144a92bb546SJakub Kicinski 		return extension;
145a92bb546SJakub Kicinski 	}
146a92bb546SJakub Kicinski "#"?("rand")	{
147a92bb546SJakub Kicinski 		yylval.number = SKF_AD_RANDOM;
148a92bb546SJakub Kicinski 		return extension;
149a92bb546SJakub Kicinski 	}
150a92bb546SJakub Kicinski 
151a92bb546SJakub Kicinski ":"		{ return ':'; }
152a92bb546SJakub Kicinski ","		{ return ','; }
153a92bb546SJakub Kicinski "#"		{ return '#'; }
154a92bb546SJakub Kicinski "%"		{ return '%'; }
155a92bb546SJakub Kicinski "["		{ return '['; }
156a92bb546SJakub Kicinski "]"		{ return ']'; }
157a92bb546SJakub Kicinski "("		{ return '('; }
158a92bb546SJakub Kicinski ")"		{ return ')'; }
159a92bb546SJakub Kicinski "x"		{ return 'x'; }
160a92bb546SJakub Kicinski "a"		{ return 'a'; }
161a92bb546SJakub Kicinski "+"		{ return '+'; }
162a92bb546SJakub Kicinski "M"		{ return 'M'; }
163a92bb546SJakub Kicinski "*"		{ return '*'; }
164a92bb546SJakub Kicinski "&"		{ return '&'; }
165a92bb546SJakub Kicinski 
166a92bb546SJakub Kicinski ([0][x][a-fA-F0-9]+) {
167a92bb546SJakub Kicinski 			yylval.number = strtoul(yytext, NULL, 16);
168a92bb546SJakub Kicinski 			return number;
169a92bb546SJakub Kicinski 		}
170a92bb546SJakub Kicinski ([0][b][0-1]+)	{
171a92bb546SJakub Kicinski 			yylval.number = strtol(yytext + 2, NULL, 2);
172a92bb546SJakub Kicinski 			return number;
173a92bb546SJakub Kicinski 		}
174a92bb546SJakub Kicinski (([0])|([-+]?[1-9][0-9]*)) {
175a92bb546SJakub Kicinski 			yylval.number = strtol(yytext, NULL, 10);
176a92bb546SJakub Kicinski 			return number;
177a92bb546SJakub Kicinski 		}
178*b3bbba35SDaniel Borkmann ([0][0-7]+)	{
179a92bb546SJakub Kicinski 			yylval.number = strtol(yytext + 1, NULL, 8);
180a92bb546SJakub Kicinski 			return number;
181a92bb546SJakub Kicinski 		}
182a92bb546SJakub Kicinski [a-zA-Z_][a-zA-Z0-9_]+ {
183a92bb546SJakub Kicinski 			yylval.label = strdup(yytext);
184a92bb546SJakub Kicinski 			return label;
185a92bb546SJakub Kicinski 		}
186a92bb546SJakub Kicinski 
187a92bb546SJakub Kicinski "/*"([^\*]|\*[^/])*"*/"		{ /* NOP */ }
188a92bb546SJakub Kicinski ";"[^\n]*			{ /* NOP */ }
189a92bb546SJakub Kicinski ^#.*				{ /* NOP */ }
190a92bb546SJakub Kicinski [ \t]+				{ /* NOP */ }
191a92bb546SJakub Kicinski [ \n]+				{ /* NOP */ }
192a92bb546SJakub Kicinski 
193a92bb546SJakub Kicinski .		{
194a92bb546SJakub Kicinski 			printf("unknown character \'%s\'", yytext);
195a92bb546SJakub Kicinski 			yyerror("lex unknown character");
196a92bb546SJakub Kicinski 		}
197a92bb546SJakub Kicinski 
198a92bb546SJakub Kicinski %%
199