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.
9 /* yaac-func-prefix: yy */
20 #include "trafgen_parser.tab.h"
21 #include "trafgen_conf.h"
26 #define YYERROR_VERBOSE 0
28 #define YYENABLE_NLS 1
29 #define YYLTYPE_IS_TRIVIAL 1
33 extern
int yylex(void);
34 extern
void yyerror(const char *);
38 extern
struct packet
*packets
;
40 #define packet_last (plen - 1)
41 #define payload_last (packets[packet_last].len - 1)
43 extern
struct packet_dyn
*packet_dyn
;
45 #define packetd_last (dlen - 1)
46 #define packetdc_last (packet_dyn[packetd_last].clen - 1)
47 #define packetdr_last (packet_dyn[packetd_last].rlen - 1)
49 static int dfunc_note_flag
= 0, our_cpu
, min_cpu
= -1, max_cpu
= -1;
51 static inline
int test_ignore
(void)
53 if
(min_cpu
< 0 && max_cpu
< 0)
55 else if
(max_cpu
>= our_cpu
&& min_cpu
<= our_cpu
)
61 static void give_note_dynamic
(void)
63 if
(!dfunc_note_flag
) {
64 printf
("Note: dynamic elements like drnd, dinc, ddec and "
65 "others make trafgen slower!\n");
70 static inline
void __init_new_packet_slot
(struct packet
*slot
)
76 static inline
void __init_new_counter_slot
(struct packet_dyn
*slot
)
82 static inline
void __init_new_randomizer_slot
(struct packet_dyn
*slot
)
88 static void realloc_packet
(void)
94 packets
= xrealloc
(packets
, 1, plen
* sizeof
(*packets
));
96 __init_new_packet_slot
(&packets
[packet_last
]);
99 packet_dyn
= xrealloc
(packet_dyn
, 1, dlen
* sizeof
(*packet_dyn
));
101 __init_new_counter_slot
(&packet_dyn
[packetd_last
]);
102 __init_new_randomizer_slot
(&packet_dyn
[packetd_last
]);
105 static void set_byte
(uint8_t val
)
107 struct packet
*pkt
= &packets
[packet_last
];
113 pkt
->payload
= xrealloc
(pkt
->payload
, 1, pkt
->len
);
114 pkt
->payload
[payload_last
] = val
;
117 static void set_fill
(uint8_t val
, size_t len
)
120 struct packet
*pkt
= &packets
[packet_last
];
126 pkt
->payload
= xrealloc
(pkt
->payload
, 1, pkt
->len
);
127 for
(i
= 0; i
< len
; ++i
)
128 pkt
->payload
[payload_last
- i
] = val
;
131 static void set_csum16
(size_t from
, size_t to
)
133 struct packet
*pkt
= &packets
[packet_last
];
147 bug_on
(!(from
< to
));
152 sum
= htons
(calc_csum
(pkt
->payload
+ from
, to
- from
, 0));
153 psum
= (uint8_t *) &sum
;
159 static void set_rnd
(size_t len
)
162 struct packet
*pkt
= &packets
[packet_last
];
168 pkt
->payload
= xrealloc
(pkt
->payload
, 1, pkt
->len
);
169 for
(i
= 0; i
< len
; ++i
)
170 pkt
->payload
[payload_last
- i
] = (uint8_t) rand
();
173 static void set_seqinc
(uint8_t start
, size_t len
, uint8_t stepping
)
176 struct packet
*pkt
= &packets
[packet_last
];
182 pkt
->payload
= xrealloc
(pkt
->payload
, 1, pkt
->len
);
183 for
(i
= 0; i
< len
; ++i
) {
184 off_t off
= len
- 1 - i
;
186 pkt
->payload
[payload_last
- off
] = start
;
191 static void set_seqdec
(uint8_t start
, size_t len
, uint8_t stepping
)
194 struct packet
*pkt
= &packets
[packet_last
];
200 pkt
->payload
= xrealloc
(pkt
->payload
, 1, pkt
->len
);
201 for
(i
= 0; i
< len
; ++i
) {
202 int off
= len
- 1 - i
;
204 pkt
->payload
[payload_last
- off
] = start
;
209 static inline
void __setup_new_counter
(struct counter
*c
, uint8_t start
,
210 uint8_t stop
, uint8_t stepping
,
216 c
->val
= (type
== TYPE_INC
) ? start
: stop
;
217 c
->off
= payload_last
;
221 static inline
void __setup_new_randomizer
(struct randomizer
*r
)
223 r
->val
= (uint8_t) rand
();
224 r
->off
= payload_last
;
227 static void set_drnd
(void)
229 struct packet
*pkt
= &packets
[packet_last
];
230 struct packet_dyn
*pktd
= &packet_dyn
[packetd_last
];
238 pkt
->payload
= xrealloc
(pkt
->payload
, 1, pkt
->len
);
241 pktd
->rnd
= xrealloc
(pktd
->rnd
, 1, pktd
->rlen
* sizeof
(struct randomizer
));
243 __setup_new_randomizer
(&pktd
->rnd
[packetdr_last
]);
246 static void set_dincdec
(uint8_t start
, uint8_t stop
, uint8_t stepping
, int type
)
248 struct packet
*pkt
= &packets
[packet_last
];
249 struct packet_dyn
*pktd
= &packet_dyn
[packetd_last
];
257 pkt
->payload
= xrealloc
(pkt
->payload
, 1, pkt
->len
);
260 pktd
->cnt
=xrealloc
(pktd
->cnt
, 1, pktd
->clen
* sizeof
(struct counter
));
262 __setup_new_counter
(&pktd
->cnt
[packetdc_last
], start
, stop
, stepping
, type
);
271 %token K_COMMENT K_FILL K_RND K_SEQINC K_SEQDEC K_DRND K_DINC K_DDEC K_WHITE
272 %token K_CPU K_CSUM16
274 %token
',' '{' '}' '(' ')' '[' ']' ':'
278 %type
<number
> number
285 | packets inline_comment
{ }
286 | packets K_WHITE
{ }
294 : '{' delimiter payload delimiter
'}' {
295 min_cpu
= max_cpu
= -1;
298 | K_CPU
'(' number
':' number
')' ':' K_WHITE
'{' delimiter payload delimiter
'}' {
302 if
(min_cpu
> max_cpu
) {
311 | K_CPU
'(' number
')' ':' K_WHITE
'{' delimiter payload delimiter
'}' {
312 min_cpu
= max_cpu
= $3;
319 | payload elem_delimiter
{ }
333 : number
{ set_byte
((uint8_t) $1); }
346 : K_FILL
'(' number delimiter number
')'
347 { set_fill
($3, $5); }
351 : K_RND
'(' number
')'
356 : K_CSUM16
'(' number delimiter number
')'
357 { set_csum16
($3, $5); }
361 : K_SEQINC
'(' number delimiter number
')'
362 { set_seqinc
($3, $5, 1); }
363 | K_SEQINC
'(' number delimiter number delimiter number
')'
364 { set_seqinc
($3, $5, $7); }
368 : K_SEQDEC
'(' number delimiter number
')'
369 { set_seqdec
($3, $5, 1); }
370 | K_SEQDEC
'(' number delimiter number delimiter number
')'
371 { set_seqdec
($3, $5, $7); }
377 | K_DRND
'(' number
')'
380 for
(i
= 0; i
< max
; ++i
)
386 : K_DINC
'(' number delimiter number
')'
387 { set_dincdec
($3, $5, 1, TYPE_INC
); }
388 | K_DINC
'(' number delimiter number delimiter number
')'
389 { set_dincdec
($3, $5, $7, TYPE_INC
); }
393 : K_DDEC
'(' number delimiter number
')'
394 { set_dincdec
($3, $5, 1, TYPE_DEC
); }
395 | K_DDEC
'(' number delimiter number delimiter number
')'
396 { set_dincdec
($3, $5, $7, TYPE_DEC
); }
401 static void finalize_packet
(void)
403 /* XXX hack ... we allocated one packet pointer too much */
408 static void dump_conf
(void)
412 for
(i
= 0; i
< plen
; ++i
) {
413 printf
("[%zu] pkt\n", i
);
414 printf
(" len %zu cnts %zu rnds %zu\n",
420 for
(j
= 0; j
< packets
[i
].len
; ++j
)
421 printf
("%02x ", packets
[i
].payload
[j
]);
424 for
(j
= 0; j
< packet_dyn
[i
].clen
; ++j
)
425 printf
(" cnt%zu [%u,%u], inc %u, off %ld type %s\n", j
,
426 packet_dyn
[i
].cnt
[j
].min
,
427 packet_dyn
[i
].cnt
[j
].max
,
428 packet_dyn
[i
].cnt
[j
].inc
,
429 packet_dyn
[i
].cnt
[j
].off
,
430 packet_dyn
[i
].cnt
[j
].type
== TYPE_INC ?
433 for
(j
= 0; j
< packet_dyn
[i
].rlen
; ++j
)
434 printf
(" rnd%zu off %ld\n", j
,
435 packet_dyn
[i
].rnd
[j
].off
);
439 void cleanup_packets
(void)
443 for
(i
= 0; i
< plen
; ++i
) {
444 if
(packets
[i
].len
> 0)
445 xfree
(packets
[i
].payload
);
450 for
(i
= 0; i
< dlen
; ++i
) {
451 free
(packet_dyn
[i
].cnt
);
452 free
(packet_dyn
[i
].rnd
);
458 int compile_packets
(char *file
, int verbose
, int cpu
)
462 yyin
= fopen
(file
, "r");
464 panic
("Cannot open file!\n");
470 if
(our_cpu
== 0 && verbose
)
477 void yyerror(const char *err
)
479 panic
("Syntax error at line%d, at char '%s'! %s!\n", yylineno
, yytext
, err
);