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.
18 #include "bpf_hla_parser.tab.h"
19 #include "bpf_symtab.h"
35 int compile_hla_filter
(char *file
, int verbose
, int debug
);
37 #define YYERROR_VERBOSE 0
39 #define YYENABLE_NLS 1
40 #define YYLTYPE_IS_TRIVIAL 1
44 extern
int zzlex
(void);
45 extern
void zzerror
(const char *);
56 %token K_NAME K_DEF K_PKT K_RET K_IF K_ELIF K_ELSE
57 %token
'(' ')' '{' '}' '=' ';' '+' '-' '&' '|' '^' '!' '<' '>' '*' '/' '%' ','
59 %token number_hex number_dec number_oct number_bin
61 %type
<idx
> K_NAME var
62 %type
<number
> number_hex number_dec number_oct number_bin number
67 : '{' declaration_list statement_list
'}'
71 : declaration
';' declaration_list
76 : statement
';' statement_list
82 if
(bpf_symtab_declared
($2)) {
83 panic
("Variable \"%s\" already declared (l%d)\n",
84 bpf_symtab_name
($2), zzlineno
);
86 printf
("; @var %s\n", bpf_symtab_name
($2));
87 bpf_symtab_declare
($2);
97 : K_RET
{ printf
("ret a\n"); }
98 | K_RET number
{ printf
("ret #%ld\n", $2); }
99 | K_RET var
{ printf
("ret a\n"); }
103 : var
'=' expression
{ printf
("; @asn %s\n", bpf_symtab_name
($1)); }
104 | var
'=' K_PKT
'(' number
',' number
')' {
107 printf
("ldb [%ld]\n", $5);
110 printf
("ldh [%ld]\n", $5);
113 printf
("ld [%ld]\n", $5);
116 panic
("Invalid argument (l%d)\n", zzlineno
);
123 | term
'+' term
{ printf
("; @+\n"); }
124 | term
'-' term
{ printf
("; @-\n"); }
128 : number
{ printf
("; @num %ld\n", $1); }
129 | var
{ printf
("; @var %s\n", bpf_symtab_name
($1)); }
135 if
(!bpf_symtab_declared
($1))
136 panic
("Variable \"%s\" not declared (l%d)\n",
137 bpf_symtab_name
($1), zzlineno
);
142 : number_dec
{ $$
= $1; }
143 | number_hex
{ $$
= $1; }
144 | number_oct
{ $$
= $1; }
145 | number_bin
{ $$
= $1; }
150 static void stage_1_compile
(void)
155 int compile_hla_filter
(char *file
, int verbose
, int debug
)
161 if
(!strncmp
("-", file
, strlen
("-")))
164 zzin
= fopen
(file
, "r");
166 panic
("Cannot open file!\n");
168 fd
= dup
(fileno
(stdout
));
170 slprintf
(file_tmp
, sizeof
(file_tmp
), ".%s", file
);
171 if
(freopen
(file_tmp
, "w", stdout
) == NULL
)
172 panic
("Cannot reopen file!\n");
179 dup2
(fd
, fileno
(stdout
));
183 fsetpos
(stdout
, &pos
);
188 bpf_symtab_cleanup
();
195 void zzerror
(const char *err
)
197 panic
("Syntax error at line %d: %s! %s!\n",
198 zzlineno
, zztext
, err
);