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 "trafgen_parser.tab.h"
19 #include "trafgen_conf.h"
24 #define YYERROR_VERBOSE 0
26 #define YYENABLE_NLS 1
27 #define YYLTYPE_IS_TRIVIAL 1
31 extern
int yylex(void);
32 extern
void yyerror(const char *);
36 static struct pktconf
*conf
= NULL
;
37 static int note_flag
= 0;
39 #define am(x) ((x)->len - 1)
41 static void give_note_dynamic
(void)
44 printf
("Note: dynamic elements like drnd, dinc, ddec and "
45 "others make trafgen slower!\n");
50 static void dump_conf
(struct pktconf
*cfg
)
54 printf
("n %lu, gap %lu us, pkts %zu\n", cfg
->num
, cfg
->gap
, cfg
->len
);
57 for
(i
= 0; i
< cfg
->len
; ++i
) {
58 printf
("[%zu] pkt\n", i
);
59 printf
(" len %zu cnts %zu rnds %zu\n", cfg
->pkts
[i
].plen
,
60 cfg
->pkts
[i
].clen
, cfg
->pkts
[i
].rlen
);
62 for
(j
= 0; j
< cfg
->pkts
[i
].plen
; ++j
)
63 printf
("%02x ", cfg
->pkts
[i
].payload
[j
]);
65 for
(j
= 0; j
< cfg
->pkts
[i
].clen
; ++j
)
66 printf
(" cnt%zu [%u,%u], inc %u, off %ld type %s\n",
67 j
, cfg
->pkts
[i
].cnt
[j
].min
,
68 cfg
->pkts
[i
].cnt
[j
].max
,
69 cfg
->pkts
[i
].cnt
[j
].inc
,
70 cfg
->pkts
[i
].cnt
[j
].off
,
71 cfg
->pkts
[i
].cnt
[j
].type
== TYPE_INC ?
73 for
(j
= 0; j
< cfg
->pkts
[i
].rlen
; ++j
)
74 printf
(" rnd%zu off %ld\n",
75 j
, cfg
->pkts
[i
].rnd
[j
].off
);
79 static void realloc_packet
(void)
82 conf
->pkts
= xrealloc
(conf
->pkts
, 1, conf
->len
* sizeof
(*conf
->pkts
));
83 fmemset
(&conf
->pkts
[am
(conf
)], 0, sizeof
(conf
->pkts
[am
(conf
)]));
86 static void set_byte
(uint8_t val
)
90 conf
->pkts
[am
(conf
)].plen
++;
91 conf
->pkts
[am
(conf
)].payload
= xrealloc
(conf
->pkts
[am
(conf
)].payload
,
92 1, conf
->pkts
[am
(conf
)].plen
);
94 base
= conf
->pkts
[am
(conf
)].plen
- 1;
95 conf
->pkts
[am
(conf
)].payload
[base
] = val
;
98 static void set_fill
(uint8_t val
, size_t len
)
102 conf
->pkts
[am
(conf
)].plen
+= len
;
103 conf
->pkts
[am
(conf
)].payload
= xrealloc
(conf
->pkts
[am
(conf
)].payload
,
104 1, conf
->pkts
[am
(conf
)].plen
);
106 base
= conf
->pkts
[am
(conf
)].plen
- 1;
107 for
(i
= 0; i
< len
; ++i
) {
108 conf
->pkts
[am
(conf
)].payload
[base
- i
] = val
;
112 static void set_rnd
(size_t len
)
116 conf
->pkts
[am
(conf
)].plen
+= len
;
117 conf
->pkts
[am
(conf
)].payload
= xrealloc
(conf
->pkts
[am
(conf
)].payload
,
118 1, conf
->pkts
[am
(conf
)].plen
);
120 base
= conf
->pkts
[am
(conf
)].plen
- 1;
121 for
(i
= 0; i
< len
; ++i
) {
122 conf
->pkts
[am
(conf
)].payload
[base
- i
] = (uint8_t) mt_rand_int32
();
126 static void set_seqinc
(uint8_t start
, size_t len
, uint8_t stepping
)
130 conf
->pkts
[am
(conf
)].plen
+= len
;
131 conf
->pkts
[am
(conf
)].payload
= xrealloc
(conf
->pkts
[am
(conf
)].payload
,
132 1, conf
->pkts
[am
(conf
)].plen
);
134 base
= conf
->pkts
[am
(conf
)].plen
- 1;
135 for
(i
= 0; i
< len
; ++i
) {
136 int off
= len
- 1 - i
;
137 conf
->pkts
[am
(conf
)].payload
[base
- off
] = start
;
142 static void set_seqdec
(uint8_t start
, size_t len
, uint8_t stepping
)
146 conf
->pkts
[am
(conf
)].plen
+= len
;
147 conf
->pkts
[am
(conf
)].payload
= xrealloc
(conf
->pkts
[am
(conf
)].payload
,
148 1, conf
->pkts
[am
(conf
)].plen
);
150 base
= conf
->pkts
[am
(conf
)].plen
- 1;
151 for
(i
= 0; i
< len
; ++i
) {
152 int off
= len
- 1 - i
;
153 conf
->pkts
[am
(conf
)].payload
[base
- off
] = start
;
158 static void set_drnd
(void)
161 struct randomizer
*new
;
165 conf
->pkts
[am
(conf
)].plen
++;
166 conf
->pkts
[am
(conf
)].payload
= xrealloc
(conf
->pkts
[am
(conf
)].payload
,
167 1, conf
->pkts
[am
(conf
)].plen
);
169 base
= conf
->pkts
[am
(conf
)].plen
- 1;
170 rnds
= ++(conf
->pkts
[am
(conf
)].rlen
);
172 conf
->pkts
[am
(conf
)].rnd
= xrealloc
(conf
->pkts
[am
(conf
)].rnd
,
173 1, rnds
* sizeof
(struct randomizer
));
175 new
= &conf
->pkts
[am
(conf
)].rnd
[rnds
- 1];
176 new
->val
= (uint8_t) mt_rand_int32
();
180 static void set_dincdec
(uint8_t start
, uint8_t stop
, uint8_t stepping
, int type
)
187 conf
->pkts
[am
(conf
)].plen
++;
188 conf
->pkts
[am
(conf
)].payload
= xrealloc
(conf
->pkts
[am
(conf
)].payload
,
189 1, conf
->pkts
[am
(conf
)].plen
);
191 base
= conf
->pkts
[am
(conf
)].plen
- 1;
192 cnts
= ++(conf
->pkts
[am
(conf
)].clen
);
194 conf
->pkts
[am
(conf
)].cnt
= xrealloc
(conf
->pkts
[am
(conf
)].cnt
,
195 1, cnts
* sizeof
(struct counter
));
197 new
= &conf
->pkts
[am
(conf
)].cnt
[cnts
- 1];
201 new
->val
= type
== TYPE_INC ? start
: stop
;
212 %token K_COMMENT K_FILL K_RND K_SEQINC K_SEQDEC K_DRND K_DINC K_DDEC K_WHITE
215 %token
',' '{' '}' '(' ')' '[' ']'
217 %token number_hex number_dec number_ascii number_bin number_oct
219 %type
<number
> number_hex number_dec number_ascii number_bin number_oct number
226 | packets inline_comment
{ }
235 : '{' delimiter payload delimiter
'}' { realloc_packet
(); }
240 | payload elem_delimiter
{ }
261 : number_dec
{ $$
= $1; }
262 | number_hex
{ $$
= $1; }
263 | number_ascii
{ $$
= $1; }
264 | number_bin
{ $$
= $1; }
265 | number_oct
{ $$
= $1; }
269 : K_FILL
'(' number delimiter number
')'
270 { set_fill
($3, $5); }
274 : K_RND
'(' number
')'
279 : K_SEQINC
'(' number delimiter number
')'
280 { set_seqinc
($3, $5, 1); }
281 | K_SEQINC
'(' number delimiter number delimiter number
')'
282 { set_seqinc
($3, $5, $7); }
286 : K_SEQDEC
'(' number delimiter number
')'
287 { set_seqdec
($3, $5, 1); }
288 | K_SEQDEC
'(' number delimiter number delimiter number
')'
289 { set_seqdec
($3, $5, $7); }
298 : K_DINC
'(' number delimiter number
')'
299 { set_dincdec
($3, $5, 1, TYPE_INC
); }
300 | K_DINC
'(' number delimiter number delimiter number
')'
301 { set_dincdec
($3, $5, $7, TYPE_INC
); }
305 : K_DDEC
'(' number delimiter number
')'
306 { set_dincdec
($3, $5, 1, TYPE_DEC
); }
307 | K_DDEC
'(' number delimiter number delimiter number
')'
308 { set_dincdec
($3, $5, $7, TYPE_DEC
); }
312 : number
{ set_byte
((uint8_t) $1); }
325 int compile_packets
(char *file
, struct pktconf
*cfg
, int verbose
)
327 yyin
= fopen
(file
, "r");
329 panic
("Cannot open file!\n");
331 panic
("No config given!\n");
333 mt_init_by_seed_time
();
345 size_t total_len
= 0;
347 printf
("%zu packets to schedule\n", conf
->len
);
349 for
(i
= 0; i
< conf
->len
; ++i
)
350 total_len
+= conf
->pkts
[i
].plen
;
351 printf
("%zu bytes in total\n", total_len
);
358 void yyerror(const char *err
)
360 panic
("Syntax error at line %d: '%s'! %s!\n",
361 yylineno
, yytext
, err
);