diff options
author | Vadim Kochan <vadim4j@gmail.com> | 2015-11-07 16:55:16 +0200 |
---|---|---|
committer | Tobias Klauser <tklauser@distanz.ch> | 2015-11-09 13:41:24 +0100 |
commit | 66e558ed51ff7d3d7bebb5f5d56114df5eb77e96 (patch) | |
tree | 4740acd0e3e239e415008a93f572b15085e316fe /trafgen.c | |
parent | c6aeff438d452be679cc3ba0a600db1d204b49a6 (diff) |
trafgen: Allow to build packet from command line
Craft packet directly from command line with same syntax as for conf file.
It might be as first step to extend current syntax with specific proto fields.
Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Diffstat (limited to 'trafgen.c')
-rw-r--r-- | trafgen.c | 23 |
1 files changed, 18 insertions, 5 deletions
@@ -64,6 +64,7 @@ struct ctx { char *device, *device_trans, *rhost; struct timespec gap; struct sockaddr_in dest; + char *packet_str; }; struct cpu_stats { @@ -157,7 +158,7 @@ static void __noreturn help(void) { printf("trafgen %s, multithreaded zero-copy network packet generator\n", VERSION_STRING); puts("http://www.netsniff-ng.org\n\n" - "Usage: trafgen [options]\n" + "Usage: trafgen [options] [packet]\n" "Options:\n" " -i|-c|--in|--conf <cfg/-> Packet configuration file/stdin\n" " -o|-d|--out|--dev <netdev> Networking device i.e., eth0\n" @@ -189,7 +190,8 @@ static void __noreturn help(void) " trafgen --dev wlan0 --rfraw --conf beacon-test.txf -V --cpus 2\n" " trafgen --dev eth0 --conf frag_dos.cfg --rand --gap 1000us\n" " trafgen --dev eth0 --conf icmp.cfg --rand --num 1400000 -k1000\n" - " trafgen --dev eth0 --conf tcp_syn.cfg -u `id -u bob` -g `id -g bob`\n\n" + " trafgen --dev eth0 --conf tcp_syn.cfg -u `id -u bob` -g `id -g bob`\n" + " trafgen --dev eth0 '{ fill(0xff, 6), 0x00, 0x02, 0xb3, rnd(3), c16(0x0800), fill(0xca, 64) }'\n\n" "Arbitrary packet config examples (e.g. trafgen -e > trafgen.cfg):\n" " Run packet on all CPUs: { fill(0xff, 64) csum16(0, 64) }\n" " Run packet only on CPU1: cpu(1): { rnd(64), 0b11001100, 0xaa }\n" @@ -827,7 +829,11 @@ static void xmit_packet_precheck(struct ctx *ctx, unsigned int cpu) static void main_loop(struct ctx *ctx, char *confname, bool slow, unsigned int cpu, bool invoke_cpp, unsigned long orig_num) { - compile_packets(confname, ctx->verbose, cpu, invoke_cpp); + if (ctx->packet_str) + compile_packets_str(ctx->packet_str, ctx->verbose, cpu); + else + compile_packets(confname, ctx->verbose, cpu, invoke_cpp); + xmit_packet_precheck(ctx, cpu); if (cpu == 0) { @@ -891,6 +897,7 @@ int main(int argc, char **argv) unsigned long cpus_tmp, orig_num = 0; unsigned long long tx_packets, tx_bytes; struct ctx ctx; + int min_opts = 5; fmemset(&ctx, 0, sizeof(ctx)); ctx.cpus = get_number_cpus_online(); @@ -1067,11 +1074,16 @@ int main(int argc, char **argv) } } - if (argc < 5) + if (argc >= optind) { + min_opts = 4; + ctx.packet_str = argv2str(optind, argc, argv); + } + + if (argc < min_opts) help(); if (ctx.device == NULL) panic("No networking device given!\n"); - if (confname == NULL) + if (confname == NULL && !ctx.packet_str) panic("No configuration file given!\n"); if (device_mtu(ctx.device) == 0) panic("This is no networking device!\n"); @@ -1173,6 +1185,7 @@ thread_out: free(ctx.device_trans); free(ctx.rhost); free(confname); + free(ctx.packet_str); return 0; } |