tools: bpftool: add "prog run" subcommand to test-run programs
Add a new "bpftool prog run" subcommand to run a loaded program on input data (and possibly with input context) passed by the user. Print output data (and output context if relevant) into a file or into the console. Print return value and duration for the test run into the console. A "repeat" argument can be passed to run the program several times in a row. The command does not perform any kind of verification based on program type (Is this program type allowed to use an input context?) or on data consistency (Can I work with empty input data?), this is left to the kernel. Example invocation: # perl -e 'print "\x0" x 14' | ./bpftool prog run \ pinned /sys/fs/bpf/sample_ret0 \ data_in - data_out - repeat 5 0000000 0000 0000 0000 0000 0000 0000 0000 | ........ ...... Return value: 0, duration (average): 260ns When one of data_in or ctx_in is "-", bpftool reads from standard input, in binary format. Other formats (JSON, hexdump) might be supported (via an optional command line keyword like "data_fmt_in") in the future if relevant, but this would require doing more parsing in bpftool. v2: - Fix argument names for function check_single_stdin(). (Yonghong) Signed-off-by: Quentin Monnet <quentin.monnet@netronome.com> Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com> Acked-by: Yonghong Song <yhs@fb.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
This commit is contained in:

committed by
Daniel Borkmann

parent
e232cb6ff7
commit
ba95c74524
@@ -117,6 +117,35 @@ bool is_prefix(const char *pfx, const char *str)
|
||||
return !memcmp(str, pfx, strlen(pfx));
|
||||
}
|
||||
|
||||
/* Last argument MUST be NULL pointer */
|
||||
int detect_common_prefix(const char *arg, ...)
|
||||
{
|
||||
unsigned int count = 0;
|
||||
const char *ref;
|
||||
char msg[256];
|
||||
va_list ap;
|
||||
|
||||
snprintf(msg, sizeof(msg), "ambiguous prefix: '%s' could be '", arg);
|
||||
va_start(ap, arg);
|
||||
while ((ref = va_arg(ap, const char *))) {
|
||||
if (!is_prefix(arg, ref))
|
||||
continue;
|
||||
count++;
|
||||
if (count > 1)
|
||||
strncat(msg, "' or '", sizeof(msg) - strlen(msg) - 1);
|
||||
strncat(msg, ref, sizeof(msg) - strlen(msg) - 1);
|
||||
}
|
||||
va_end(ap);
|
||||
strncat(msg, "'", sizeof(msg) - strlen(msg) - 1);
|
||||
|
||||
if (count >= 2) {
|
||||
p_err(msg);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void fprint_hex(FILE *f, void *arg, unsigned int n, const char *sep)
|
||||
{
|
||||
unsigned char *data = arg;
|
||||
|
Reference in New Issue
Block a user