editcap: add seed option

Implement a --seed option to be used in conjunction with -E. The option
allows the user to set the seed for the pseudo-random number generator,
which can be useful for recreating a particular sequence of errors.

Change-Id: Id427ab5fd7711652ad56c72271b2e0acb7380858
Reviewed-on: https://code.wireshark.org/review/29306
Reviewed-by: Gerald Combs <gerald@wireshark.org>
Petri-Dish: Gerald Combs <gerald@wireshark.org>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
Nils Björklund 2018-08-22 10:17:02 +02:00 committed by Anders Broman
parent 4a4c6209a4
commit 8332b718a2
2 changed files with 35 additions and 2 deletions

View File

@ -224,6 +224,11 @@ appear to reject Ethernet packets larger than the standard Ethernet MTU,
making them incapable of handling gigabit Ethernet captures if jumbo
packets were used).
=item --seed E<lt>seedE<gt>
When used in conjunction with -E, set the seed for the pseudo-random number generator.
This is useful for recreating a particular sequence of errors.
=item --skip-radiotap-header
Skip the readiotap header of each frame when checking for packet duplicates. This is useful

View File

@ -162,7 +162,7 @@ static int out_frame_type = -2; /* Leave frame typ
static int verbose = 0; /* Not so verbose */
static struct time_adjustment time_adj = {NSTIME_INIT_ZERO, 0}; /* no adjustment */
static nstime_t relative_time_window = NSTIME_INIT_ZERO; /* de-dup time window */
static double err_prob = 0.0;
static double err_prob = -1.0;
static time_t starttime = 0;
static time_t stoptime = 0;
static gboolean check_startstop = FALSE;
@ -799,6 +799,9 @@ print_usage(FILE *output)
fprintf(output, " -o <change offset> When used in conjunction with -E, skip some bytes from the\n");
fprintf(output, " beginning of the packet. This allows one to preserve some\n");
fprintf(output, " bytes, in order to have some headers untouched.\n");
fprintf(output, " --seed <seed> When used in conjunction with -E, set the seed to use for\n");
fprintf(output, " the pseudo-random number generator. This allows one to\n");
fprintf(output, " repeat a particular sequence of errors.\n");
fprintf(output, " -I <bytes to ignore> ignore the specified number of bytes at the beginning\n");
fprintf(output, " of the frame during MD5 hash calculation, unless the\n");
fprintf(output, " frame is too short, then the full frame is used.\n");
@ -965,6 +968,7 @@ main(int argc, char *argv[])
static const struct option long_options[] = {
{"novlan", no_argument, NULL, 0x8100},
{"skip-radiotap-header", no_argument, NULL, 0x8101},
{"seed", required_argument, NULL, 0x8102},
{"help", no_argument, NULL, 'h'},
{"version", no_argument, NULL, 'V'},
{0, 0, 0, 0 }
@ -1001,6 +1005,8 @@ main(int argc, char *argv[])
gboolean do_mutation;
guint32 caplen;
int ret = EXIT_SUCCESS;
gboolean valid_seed = FALSE;
unsigned int seed = 0;
cmdarg_err_init(failure_warning_message, failure_message_cont);
@ -1062,6 +1068,18 @@ main(int argc, char *argv[])
break;
}
case 0x8102:
{
if (sscanf(optarg, "%u", &seed) != 1) {
fprintf(stderr, "editcap: \"%s\" isn't a valid seed\n\n",
optarg);
ret = INVALID_OPTION;
goto clean_exit;
}
valid_seed = TRUE;
break;
}
case 'a':
{
guint frame_number;
@ -1189,7 +1207,6 @@ main(int argc, char *argv[])
ret = INVALID_OPTION;
goto clean_exit;
}
srand( (unsigned int) (time(NULL) + ws_getpid()) );
break;
case 'F':
@ -1317,6 +1334,17 @@ main(int argc, char *argv[])
print_usage(stderr);
ret = INVALID_OPTION;
goto clean_exit;
}
if (err_prob >= 0.0) {
if (!valid_seed) {
seed = (unsigned int) (time(NULL) + ws_getpid());
}
if (verbose) {
fprintf(stderr, "Using seed %u\n", seed);
}
srand(seed);
}
if (check_startstop && !stoptime) {