autogen definitions options; copyright = { date = "2004-2005"; owner = "Aaron Turner"; type = "bsd"; author = <<- EOText Copyright 2000-2005 Aaron Turner For support please use the tcpreplay-users@lists.sourceforge.net mailing list. EOText; }; package = "flowreplay"; prog-name = "flowreplay"; prog-title = "Connect to servers based on network traffic stored in pcap files"; long-opts; gnu-usage; help-value = "H"; save-opts-value = ""; load-opts-value = ""; argument = ""; config-header = "config.h"; include = "#include \"defines.h\"\n" "#include \"flowreplay.h\"\n" "#include \"common.h\"\n" "extern char pcap_version[];\n" "extern flowreplay_opt_t options;\n"; homerc = "$$/"; explain = <<- EOExplain flowreplay is a tool for using network traffic stored in pcap(3) files as the basis for replaying connections to servers. EOExplain; detail = <<- EODetail Please note that flowreplay is currently in *alpha*. As such, it is still very much a work in progress and currently will not work for most uses. If you have the skill and interest to help make flowreplay work better, please contact Aaron Turner. EODetail; flag = { name = dbug; value = d; arg-type = number; max = 1; immediate; arg-range = "0->5"; arg-default = 0; descrip = "Enable debugging output"; doc = <<- EOText If configured with --enable-debug, then you can specify a verbosity level for debugging output. Higher numbers increase verbosity. EOText; }; /* Verbose decoding via tcpdump */ flag = { ifdef = HAVE_TCPDUMP; name = verbose; value = v; max = 1; immediate; descrip = "Print decoded packets via tcpdump to STDOUT"; settable; doc = ""; }; flag = { ifdef = HAVE_TCPDUMP; name = decode; flags-must = verbose; value = A; arg-type = string; max = 1; descrip = "Arguments passed to tcpdump decoder"; doc = <<- EOText When enabling verbose mode (@var{-v}) you may also specify one or more additional arguments to pass to @code{tcpdump} to modify the way packets are decoded. By default, -n and -l are used. Be sure to quote the arguments like: -A "-axxx" so that they are not interpreted by tcpreplay. The following arguments are vaild: [ -aAeNqRStuvxX ] [ -E spi@ipaddr algo:secret,... ] [ -s snaplen ] EOText; }; flag = { name = mode; value = m; arg-type = string; max = 1; must-set; descrip = "Replay mode"; doc = <<- EOText Flowreplay needs to know handle client/server exchanges to properly time. The options are: @table @bullet @item @var{send} Replay traffic as fast as possible. Do not wait for server to reply. @item @var{wait} Wait @var{--wait} sec.usec for the server to reply before sending. @item @var{bytes} Wait until the server has sent the number of bytes stored in the pcap file. @item @var{user} Send packets based on user interaction. @end table EOText; flag-code = <<- EOText if (strcasecmp(OPT_ARG(MODE), "send") == 0) { options.sendmode = MODE_SEND; } else if (strcasecmp(OPT_ARG(MODE), "wait") == 0) { options.sendmode = MODE_WAIT; } else if (strcasecmp(OPT_ARG(MODE), "bytes") == 0) { options.sendmode = MODE_BYTES; } else if (strcasecmp(OPT_ARG(MODE), "user") == 0) { options.sendmode = MODE_USER; } else { errx(1, "Invalid --mode: %s", OPT_ARG(MODE)); } EOText; }; flag = { name = wait; value = w; arg-type = string; max = 1; default = "2.0"; descrip = "Number of sec.usec to wait between client's turn to send"; doc = <<- EOText If @var{--mode} is @var{wait}, then you can specify the amount of time to wait for the server to complete it's side of the transaction before starting to send the client side again. EOText; flag-code = <<- EOText float2timer(atof(OPT_ARG(WAIT)), &options.timeout); EOText; }; flag = { name = targetip; value = t; arg-type = string; max = 1; must-set; descrip = "Target host to connect to"; flag-code = <<- EOText #ifdef INET_ATON if (inet_aton(OPT_ARG(TARGETIP), &options.targetaddr) == 0) errx(1, "Invalid target IP address: %s", OPT_ARG(TARGETIP)); #else if ((options.targetaddr.s_addr = inet_addr(OPT_ARG(TARGETIP))) == -1) errx(1, "Invalid target IP address: %s", OPT_ARG(TARGETIP)); #endif EOText; }; flag = { name = filter; value = f; arg-type = string; max = 1; descrip = "BPF filter to limit which flows are replayed"; doc = ""; }; flag = { name = clientnet; value = c; arg-type = string; descrip = "Client network(s)"; flag-code = <<- EOText char *cidr = safe_strdup(OPT_ARG(CLIENTNET)); if (!parse_cidr(&options.clients, cidr, ",")) errx(1, "Unable to parse CIDR: %s", OPT_ARG(CLIENTNET)); free(cidr); EOText; }; flag = { name = servernet; value = s; arg-type = string; descrip = "Server network(s)"; flag-code = <<- EOText char *cidr = safe_strdup(OPT_ARG(SERVERNET)); if (!parse_cidr(&options.servers, cidr, ",")) errx(1, "Unable to parse CIDR: %s", OPT_ARG(SERVERNET)); free(cidr); EOText; }; flag = { name = nosyn; value = n; descrip = "Disable Syn packet requirement to start connections"; flag-code = <<- EOText options.nosyn = 1; EOText; }; flag = { name = slimit; value = l; descrip = "Service limit to proto/port"; arg-type = string; flag-code = <<- EOText char *p_parse = NULL, *myarg; myarg = safe_strdup(OPT_ARG(SLIMIT)); p_parse = strtok(myarg, "/"); if (strcasecmp(p_parse, "TCP") == 0) { options.proto = IPPROTO_TCP; } else if (strcasecmp(p_parse, "UDP") == 0) { options.proto = IPPROTO_UDP; } else { errx(1, "Unsupported protocol: %s", p_parse); } /* if port is specified, set it */ if ((p_parse = strtok(NULL, "/"))) options.port = htons(atoi(p_parse)); EOText; }; flag = { name = version; value = V; descrip = "Print version information"; flag-code = <<- EOVersion fprintf(stderr, "flowreplay version: %s (build %s)", VERSION, svn_version()); #ifdef DEBUG fprintf(stderr, " (debug)"); #endif fprintf(stderr, "\n"); fprintf(stderr, "Copyright 2001-2006 by Aaron Turner \n"); fprintf(stderr, "Compiled against libnet: %s\n", LIBNET_VERSION); fprintf(stderr, "Compiled against libpcap: %s\n", pcap_version); #ifdef ENABLE_64BITS fprintf(stderr, "64 bit packet counters: enabled\n"); #else fprintf(stderr, "64 bit packet counters: disabled\n"); #endif #ifdef HAVE_TCPDUMP fprintf(stderr, "Verbose printing via tcpdump: enabled\n"); #else fprintf(stderr, "Verbose printing via tcpdump: disabled\n"); #endif exit(0); EOVersion; doc = ""; }; flag = { name = less-help; value = "h"; immediate; descrip = "Display less usage information and exit"; flag-code = <<- EOHelp USAGE(EXIT_FAILURE); EOHelp; doc = ""; };