blob: 833a96611da6d042e089294990801817d0f1ade9 [file] [log] [blame]
Daniel Borkmann3f356382013-12-11 23:43:44 +01001/*
2 * BPF asm code lexer
3 *
4 * This program is free software; you can distribute it and/or modify
5 * it under the terms of the GNU General Public License as published
6 * by the Free Software Foundation; either version 2 of the License,
7 * or (at your option) any later version.
8 *
9 * Syntax kept close to:
10 *
11 * Steven McCanne and Van Jacobson. 1993. The BSD packet filter: a new
12 * architecture for user-level packet capture. In Proceedings of the
13 * USENIX Winter 1993 Conference Proceedings on USENIX Winter 1993
14 * Conference Proceedings (USENIX'93). USENIX Association, Berkeley,
15 * CA, USA, 2-2.
16 *
17 * Copyright 2013 Daniel Borkmann <borkmann@redhat.com>
18 * Licensed under the GNU General Public License, version 2.0 (GPLv2)
19 */
20
21%{
22
23#include <stdio.h>
24#include <stdint.h>
25#include <stdlib.h>
26
27#include "bpf_exp.yacc.h"
28
29extern void yyerror(const char *str);
30
31%}
32
33%option align
34%option ecs
35
36%option nounput
37%option noreject
38%option noinput
39%option noyywrap
40
41%option 8bit
42%option caseless
43%option yylineno
44
45%%
46
47"ldb" { return OP_LDB; }
48"ldh" { return OP_LDH; }
49"ld" { return OP_LD; }
50"ldi" { return OP_LDI; }
51"ldx" { return OP_LDX; }
52"ldxi" { return OP_LDXI; }
53"ldxb" { return OP_LDXB; }
54"st" { return OP_ST; }
55"stx" { return OP_STX; }
56"jmp" { return OP_JMP; }
57"ja" { return OP_JMP; }
58"jeq" { return OP_JEQ; }
59"jneq" { return OP_JNEQ; }
60"jne" { return OP_JNEQ; }
61"jlt" { return OP_JLT; }
62"jle" { return OP_JLE; }
63"jgt" { return OP_JGT; }
64"jge" { return OP_JGE; }
65"jset" { return OP_JSET; }
66"add" { return OP_ADD; }
67"sub" { return OP_SUB; }
68"mul" { return OP_MUL; }
69"div" { return OP_DIV; }
70"mod" { return OP_MOD; }
71"neg" { return OP_NEG; }
72"and" { return OP_AND; }
73"xor" { return OP_XOR; }
74"or" { return OP_OR; }
75"lsh" { return OP_LSH; }
76"rsh" { return OP_RSH; }
77"ret" { return OP_RET; }
78"tax" { return OP_TAX; }
79"txa" { return OP_TXA; }
80
81"#"?("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_VLANT; }
94"#"?("vlan_pr") { return K_VLANP; }
Chema Gonzalez4cd36752014-04-21 09:21:24 -070095"#"?("rand") { return K_RAND; }
Daniel Borkmann3f356382013-12-11 23:43:44 +010096
97":" { return ':'; }
98"," { return ','; }
99"#" { return '#'; }
100"%" { return '%'; }
101"[" { return '['; }
102"]" { return ']'; }
103"(" { return '('; }
104")" { return ')'; }
105"x" { return 'x'; }
106"a" { return 'a'; }
107"+" { return '+'; }
108"M" { return 'M'; }
109"*" { return '*'; }
110"&" { return '&'; }
111
112([0][x][a-fA-F0-9]+) {
113 yylval.number = strtoul(yytext, NULL, 16);
114 return number;
115 }
116([0][b][0-1]+) {
117 yylval.number = strtol(yytext + 2, NULL, 2);
118 return number;
119 }
120(([0])|([-+]?[1-9][0-9]*)) {
121 yylval.number = strtol(yytext, NULL, 10);
122 return number;
123 }
124([0][0-9]+) {
125 yylval.number = strtol(yytext + 1, NULL, 8);
126 return number;
127 }
128[a-zA-Z_][a-zA-Z0-9_]+ {
129 yylval.label = strdup(yytext);
130 return label;
131 }
132
133"/*"([^\*]|\*[^/])*"*/" { /* NOP */ }
134";"[^\n]* { /* NOP */ }
135^#.* { /* NOP */ }
136[ \t]+ { /* NOP */ }
137[ \n]+ { /* NOP */ }
138
139. {
140 printf("unknown character \'%s\'", yytext);
141 yyerror("lex unknown character");
142 }
143
144%%