2 * netsniff-ng - the packet sniffing beast
3 * By Daniel Borkmann <daniel@netsniff-ng.org>
4 * Copyright 2012 Daniel Borkmann <dborkma@tik.ee.ethz.ch>,
5 * Swiss federal institute of technology (ETH Zurich)
6 * Subject to the GPL, version 2.
11 - intermediate representation
12 - code optimization (symbolic reduction?)
13 - linearization (jumps, etc)
26 #include "bpf_hla_parser.tab.h"
27 #include "bpf_symtab.h"
33 #define YYERROR_VERBOSE 0
35 #define YYENABLE_NLS 1
36 #define YYLTYPE_IS_TRIVIAL 1
40 extern
int zzlex
(void);
41 extern
void zzerror
(const char *);
45 int compile_hla_filter
(char *file
, int verbose
, int debug
);
47 static unsigned int num_vars
= 0;
48 static unsigned int num_ifs
= 0;
57 %token K_NAME K_DEF K_PKT K_RET K_IF K_ELIF K_ELSE
58 %token K_MACRO_IPV4 K_MACRO_IPV6 K_MACRO_IP K_MACRO_UDP K_MACRO_TCP
60 %token
'(' ')' '{' '}' '=' ';' '+' '-' '&' '|' '^' '!' '<' '>' '*' '/' '%' ','
62 %token number_hex number_dec number_oct number_bin
64 %type
<idx
> K_NAME var
65 %type
<number
> number_hex number_dec number_oct number_bin number
70 : declaration_list
{ printf
("_entry:\n"); } statement_list
71 | short_ret
/* for short filter statements */
75 : declaration
{ num_vars
++; } declaration_list
80 : statement statement_list
86 if
(bpf_symtab_declared
($2)) {
87 panic
("Variable \"%s\" already declared (l%d)\n",
88 bpf_symtab_name
($2), zzlineno
);
90 printf
("; @var %s\n", bpf_symtab_name
($2));
91 bpf_symtab_declare
($2);
110 : K_RET
{ printf
(" ret a\n"); }
111 | K_RET number
{ printf
(" ret #%ld\n", $2); }
112 | K_RET var
{ printf
(" ret a\n"); }
113 | K_RET expression
{ printf
(" ret macro\n"); }
117 : K_MACRO_IPV4
{ printf
("ipv4\n"); }
118 | K_MACRO_IPV6
{ printf
("ipv6\n"); }
119 | K_MACRO_IP
{ printf
("ip\n"); }
120 | K_MACRO_UDP
{ printf
("udp\n"); }
121 | K_MACRO_TCP
{ printf
("tcp\n"); }
125 : { num_ifs
++; } K_IF
'(' expression
')' '{'
126 { printf
("jpt_f%ld:\n", num_ifs
); }
127 statement_list
'}' condition_contd
131 : K_ELIF
'(' expression
')' '{' statement_list
'}' condition_contd
132 | K_ELSE
'{' { printf
("jpt_e%ld:\n", num_ifs
); } statement_list
'}'
137 : var
'=' expression
{ printf
("; @asn %s\n", bpf_symtab_name
($1)); }
138 | var
'=' K_PKT
'(' number
',' number
')' {
141 printf
(" ldb [%ld]\n", $5);
144 printf
(" ldh [%ld]\n", $5);
147 printf
(" ld [%ld]\n", $5);
150 panic
("Invalid argument (l%d)\n", zzlineno
);
157 |
'!' term
{ printf
("; @!\n"); }
158 | term
'+' term
{ printf
("; @+\n"); }
159 | term
'-' term
{ printf
("; @-\n"); }
160 | term
'/' term
{ printf
("; @/\n"); }
161 | term
'*' term
{ printf
("; @*\n"); }
162 | term
'%' term
{ printf
("; @\n"); }
163 | term
'&' term
{ printf
("; @&\n"); }
164 | term
'|' term
{ printf
("; @|\n"); }
165 | term
'^' term
{ printf
("; @^\n"); }
166 | term
'<' term
{ printf
("; @<\n"); }
167 | term
'>' term
{ printf
("; @>\n"); }
168 | term
'=' '=' term
{ printf
("; @==\n"); }
169 | term
'&' '&' term
{ printf
("; @&&\n"); }
170 | term
'|' '|' term
{ printf
("; @||\n"); }
171 | term
'<' '<' term
{ printf
("; @<<\n"); }
172 | term
'>' '>' term
{ printf
("; @>>\n"); }
176 : number
{ printf
("; @num %ld\n", $1); }
177 | var
{ printf
("; @var %s\n", bpf_symtab_name
($1)); }
184 if
(!bpf_symtab_declared
($1))
185 panic
("Variable \"%s\" not declared (l%d)\n",
186 bpf_symtab_name
($1), zzlineno
);
191 : number_dec
{ $$
= $1; }
192 | number_hex
{ $$
= $1; }
193 | number_oct
{ $$
= $1; }
194 | number_bin
{ $$
= $1; }
199 static void stage_1_compile
(void)
204 int compile_hla_filter
(char *file
, int verbose
, int debug
)
210 if
(!strncmp
("-", file
, strlen
("-")))
213 zzin
= fopen
(file
, "r");
215 panic
("Cannot open file!\n");
217 fd
= dup
(fileno
(stdout
));
219 slprintf
(file_tmp
, sizeof
(file_tmp
), ".%s", file
);
220 if
(freopen
(file_tmp
, "w", stdout
) == NULL
)
221 panic
("Cannot reopen file!\n");
228 dup2
(fd
, fileno
(stdout
));
232 fsetpos
(stdout
, &pos
);
237 bpf_symtab_cleanup
();
244 void zzerror
(const char *err
)
246 panic
("Syntax error at line %d: %s! %s!\n",
247 zzlineno
, zztext
, err
);