bpf: Selftests, add ktls tests to test_sockmap

Until now we have only had minimal ktls+sockmap testing when being
used with helpers and different sendmsg/sendpage patterns. Add a
pass with ktls here.

To run just ktls tests,

 $ ./test_sockmap --whitelist="ktls"

Signed-off-by: John Fastabend <john.fastabend@gmail.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Reviewed-by: Jakub Sitnicki <jakub@cloudflare.com>
Link: https://lore.kernel.org/bpf/158939736278.15176.5435314315563203761.stgit@john-Precision-5820-Tower
This commit is contained in:
John Fastabend 2020-05-13 12:16:02 -07:00 committed by Daniel Borkmann
parent a7238f7c79
commit 96586dd926
1 changed files with 44 additions and 26 deletions

View File

@ -115,6 +115,7 @@ static const struct option long_options[] = {
struct test_env {
const char *type;
const char *subtest;
const char *prepend;
int test_num;
int subtest_num;
@ -126,6 +127,26 @@ struct test_env {
struct test_env env;
struct sockmap_options {
int verbose;
bool base;
bool sendpage;
bool data_test;
bool drop_expected;
int iov_count;
int iov_length;
int rate;
char *map;
char *whitelist;
char *blacklist;
char *prepend;
};
struct _test {
char *title;
void (*tester)(int cg_fd, struct sockmap_options *opt);
};
static void test_start(void)
{
env.subtest_num++;
@ -151,10 +172,11 @@ static void test_reset(void)
txmsg_ingress = txmsg_skb = 0;
}
static int test_start_subtest(const char *name, const char *type)
static int test_start_subtest(const struct _test *t, struct sockmap_options *o)
{
env.type = type;
env.subtest = name;
env.type = o->map;
env.subtest = t->title;
env.prepend = o->prepend;
env.test_num++;
env.subtest_num = 0;
env.fail_last = env.fail_cnt;
@ -170,9 +192,10 @@ static void test_end_subtest(void)
if (!error)
test_pass();
fprintf(stdout, "#%2d/%2d %8s:%s:%s\n",
fprintf(stdout, "#%2d/%2d %8s:%s:%s:%s\n",
env.test_num, env.subtest_num,
!type ? "sockmap" : "sockhash",
env.prepend ? : "",
env.subtest, error ? "FAIL" : "OK");
}
@ -379,20 +402,6 @@ struct msg_stats {
struct timespec end;
};
struct sockmap_options {
int verbose;
bool base;
bool sendpage;
bool data_test;
bool drop_expected;
int iov_count;
int iov_length;
int rate;
char *map;
char *whitelist;
char *blacklist;
};
static int msg_loop_sendpage(int fd, int iov_length, int cnt,
struct msg_stats *s,
struct sockmap_options *opt)
@ -1606,11 +1615,6 @@ static int populate_progs(char *bpf_file)
return 0;
}
struct _test {
char *title;
void (*tester)(int cg_fd, struct sockmap_options *opt);
};
struct _test test[] = {
{"txmsg test passthrough", test_txmsg_pass},
{"txmsg test redirect", test_txmsg_redir},
@ -1636,7 +1640,9 @@ static int check_whitelist(struct _test *t, struct sockmap_options *opt)
return -ENOMEM;
entry = strtok(ptr, ",");
while (entry) {
if (strstr(opt->map, entry) != 0 || strstr(t->title, entry) != 0)
if ((opt->prepend && strstr(opt->prepend, entry) != 0) ||
strstr(opt->map, entry) != 0 ||
strstr(t->title, entry) != 0)
return 0;
entry = strtok(NULL, ",");
}
@ -1654,7 +1660,9 @@ static int check_blacklist(struct _test *t, struct sockmap_options *opt)
return -ENOMEM;
entry = strtok(ptr, ",");
while (entry) {
if (strstr(opt->map, entry) != 0 || strstr(t->title, entry) != 0)
if ((opt->prepend && strstr(opt->prepend, entry) != 0) ||
strstr(opt->map, entry) != 0 ||
strstr(t->title, entry) != 0)
return 0;
entry = strtok(NULL, ",");
}
@ -1680,7 +1688,7 @@ static int __test_selftests(int cg_fd, struct sockmap_options *opt)
if (check_blacklist(&t, opt) == 0)
continue;
test_start_subtest(t.title, opt->map);
test_start_subtest(&t, opt);
t.tester(cg_fd, opt);
test_end_subtest();
}
@ -1700,11 +1708,21 @@ static void test_selftests_sockhash(int cg_fd, struct sockmap_options *opt)
__test_selftests(cg_fd, opt);
}
static void test_selftests_ktls(int cg_fd, struct sockmap_options *opt)
{
opt->map = BPF_SOCKHASH_FILENAME;
opt->prepend = "ktls";
ktls = 1;
__test_selftests(cg_fd, opt);
ktls = 0;
}
static int test_selftest(int cg_fd, struct sockmap_options *opt)
{
test_selftests_sockmap(cg_fd, opt);
test_selftests_sockhash(cg_fd, opt);
test_selftests_ktls(cg_fd, opt);
test_print_results();
return 0;
}