mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 13:11:40 +00:00
selftests: bpf: break up test_progs - xdp
Move xdp prog tests into separate files. Signed-off-by: Stanislav Fomichev <sdf@google.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
7395724b40
commit
eaf90740f5
46
tools/testing/selftests/bpf/prog_tests/xdp.c
Normal file
46
tools/testing/selftests/bpf/prog_tests/xdp.c
Normal file
@ -0,0 +1,46 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <test_progs.h>
|
||||
|
||||
void test_xdp(void)
|
||||
{
|
||||
struct vip key4 = {.protocol = 6, .family = AF_INET};
|
||||
struct vip key6 = {.protocol = 6, .family = AF_INET6};
|
||||
struct iptnl_info value4 = {.family = AF_INET};
|
||||
struct iptnl_info value6 = {.family = AF_INET6};
|
||||
const char *file = "./test_xdp.o";
|
||||
struct bpf_object *obj;
|
||||
char buf[128];
|
||||
struct ipv6hdr *iph6 = (void *)buf + sizeof(struct ethhdr);
|
||||
struct iphdr *iph = (void *)buf + sizeof(struct ethhdr);
|
||||
__u32 duration, retval, size;
|
||||
int err, prog_fd, map_fd;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
if (err) {
|
||||
error_cnt++;
|
||||
return;
|
||||
}
|
||||
|
||||
map_fd = bpf_find_map(__func__, obj, "vip2tnl");
|
||||
if (map_fd < 0)
|
||||
goto out;
|
||||
bpf_map_update_elem(map_fd, &key4, &value4, 0);
|
||||
bpf_map_update_elem(map_fd, &key6, &value6, 0);
|
||||
|
||||
err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4),
|
||||
buf, &size, &retval, &duration);
|
||||
|
||||
CHECK(err || retval != XDP_TX || size != 74 ||
|
||||
iph->protocol != IPPROTO_IPIP, "ipv4",
|
||||
"err %d errno %d retval %d size %d\n",
|
||||
err, errno, retval, size);
|
||||
|
||||
err = bpf_prog_test_run(prog_fd, 1, &pkt_v6, sizeof(pkt_v6),
|
||||
buf, &size, &retval, &duration);
|
||||
CHECK(err || retval != XDP_TX || size != 114 ||
|
||||
iph6->nexthdr != IPPROTO_IPV6, "ipv6",
|
||||
"err %d errno %d retval %d size %d\n",
|
||||
err, errno, retval, size);
|
||||
out:
|
||||
bpf_object__close(obj);
|
||||
}
|
31
tools/testing/selftests/bpf/prog_tests/xdp_adjust_tail.c
Normal file
31
tools/testing/selftests/bpf/prog_tests/xdp_adjust_tail.c
Normal file
@ -0,0 +1,31 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <test_progs.h>
|
||||
|
||||
void test_xdp_adjust_tail(void)
|
||||
{
|
||||
const char *file = "./test_adjust_tail.o";
|
||||
struct bpf_object *obj;
|
||||
char buf[128];
|
||||
__u32 duration, retval, size;
|
||||
int err, prog_fd;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
if (err) {
|
||||
error_cnt++;
|
||||
return;
|
||||
}
|
||||
|
||||
err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4),
|
||||
buf, &size, &retval, &duration);
|
||||
|
||||
CHECK(err || retval != XDP_DROP,
|
||||
"ipv4", "err %d errno %d retval %d size %d\n",
|
||||
err, errno, retval, size);
|
||||
|
||||
err = bpf_prog_test_run(prog_fd, 1, &pkt_v6, sizeof(pkt_v6),
|
||||
buf, &size, &retval, &duration);
|
||||
CHECK(err || retval != XDP_TX || size != 54,
|
||||
"ipv6", "err %d errno %d retval %d size %d\n",
|
||||
err, errno, retval, size);
|
||||
bpf_object__close(obj);
|
||||
}
|
82
tools/testing/selftests/bpf/prog_tests/xdp_noinline.c
Normal file
82
tools/testing/selftests/bpf/prog_tests/xdp_noinline.c
Normal file
@ -0,0 +1,82 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <test_progs.h>
|
||||
|
||||
void test_xdp_noinline(void)
|
||||
{
|
||||
const char *file = "./test_xdp_noinline.o";
|
||||
unsigned int nr_cpus = bpf_num_possible_cpus();
|
||||
struct vip key = {.protocol = 6};
|
||||
struct vip_meta {
|
||||
__u32 flags;
|
||||
__u32 vip_num;
|
||||
} value = {.vip_num = VIP_NUM};
|
||||
__u32 stats_key = VIP_NUM;
|
||||
struct vip_stats {
|
||||
__u64 bytes;
|
||||
__u64 pkts;
|
||||
} stats[nr_cpus];
|
||||
struct real_definition {
|
||||
union {
|
||||
__be32 dst;
|
||||
__be32 dstv6[4];
|
||||
};
|
||||
__u8 flags;
|
||||
} real_def = {.dst = MAGIC_VAL};
|
||||
__u32 ch_key = 11, real_num = 3;
|
||||
__u32 duration, retval, size;
|
||||
int err, i, prog_fd, map_fd;
|
||||
__u64 bytes = 0, pkts = 0;
|
||||
struct bpf_object *obj;
|
||||
char buf[128];
|
||||
u32 *magic = (u32 *)buf;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
if (err) {
|
||||
error_cnt++;
|
||||
return;
|
||||
}
|
||||
|
||||
map_fd = bpf_find_map(__func__, obj, "vip_map");
|
||||
if (map_fd < 0)
|
||||
goto out;
|
||||
bpf_map_update_elem(map_fd, &key, &value, 0);
|
||||
|
||||
map_fd = bpf_find_map(__func__, obj, "ch_rings");
|
||||
if (map_fd < 0)
|
||||
goto out;
|
||||
bpf_map_update_elem(map_fd, &ch_key, &real_num, 0);
|
||||
|
||||
map_fd = bpf_find_map(__func__, obj, "reals");
|
||||
if (map_fd < 0)
|
||||
goto out;
|
||||
bpf_map_update_elem(map_fd, &real_num, &real_def, 0);
|
||||
|
||||
err = bpf_prog_test_run(prog_fd, NUM_ITER, &pkt_v4, sizeof(pkt_v4),
|
||||
buf, &size, &retval, &duration);
|
||||
CHECK(err || retval != 1 || size != 54 ||
|
||||
*magic != MAGIC_VAL, "ipv4",
|
||||
"err %d errno %d retval %d size %d magic %x\n",
|
||||
err, errno, retval, size, *magic);
|
||||
|
||||
err = bpf_prog_test_run(prog_fd, NUM_ITER, &pkt_v6, sizeof(pkt_v6),
|
||||
buf, &size, &retval, &duration);
|
||||
CHECK(err || retval != 1 || size != 74 ||
|
||||
*magic != MAGIC_VAL, "ipv6",
|
||||
"err %d errno %d retval %d size %d magic %x\n",
|
||||
err, errno, retval, size, *magic);
|
||||
|
||||
map_fd = bpf_find_map(__func__, obj, "stats");
|
||||
if (map_fd < 0)
|
||||
goto out;
|
||||
bpf_map_lookup_elem(map_fd, &stats_key, stats);
|
||||
for (i = 0; i < nr_cpus; i++) {
|
||||
bytes += stats[i].bytes;
|
||||
pkts += stats[i].pkts;
|
||||
}
|
||||
if (bytes != MAGIC_BYTES * NUM_ITER * 2 || pkts != NUM_ITER * 2) {
|
||||
error_cnt++;
|
||||
printf("test_xdp_noinline:FAIL:stats %lld %lld\n", bytes, pkts);
|
||||
}
|
||||
out:
|
||||
bpf_object__close(obj);
|
||||
}
|
@ -87,85 +87,6 @@ static void test_prog_run_xattr(void)
|
||||
bpf_object__close(obj);
|
||||
}
|
||||
|
||||
static void test_xdp(void)
|
||||
{
|
||||
struct vip key4 = {.protocol = 6, .family = AF_INET};
|
||||
struct vip key6 = {.protocol = 6, .family = AF_INET6};
|
||||
struct iptnl_info value4 = {.family = AF_INET};
|
||||
struct iptnl_info value6 = {.family = AF_INET6};
|
||||
const char *file = "./test_xdp.o";
|
||||
struct bpf_object *obj;
|
||||
char buf[128];
|
||||
struct ipv6hdr *iph6 = (void *)buf + sizeof(struct ethhdr);
|
||||
struct iphdr *iph = (void *)buf + sizeof(struct ethhdr);
|
||||
__u32 duration, retval, size;
|
||||
int err, prog_fd, map_fd;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
if (err) {
|
||||
error_cnt++;
|
||||
return;
|
||||
}
|
||||
|
||||
map_fd = bpf_find_map(__func__, obj, "vip2tnl");
|
||||
if (map_fd < 0)
|
||||
goto out;
|
||||
bpf_map_update_elem(map_fd, &key4, &value4, 0);
|
||||
bpf_map_update_elem(map_fd, &key6, &value6, 0);
|
||||
|
||||
err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4),
|
||||
buf, &size, &retval, &duration);
|
||||
|
||||
CHECK(err || retval != XDP_TX || size != 74 ||
|
||||
iph->protocol != IPPROTO_IPIP, "ipv4",
|
||||
"err %d errno %d retval %d size %d\n",
|
||||
err, errno, retval, size);
|
||||
|
||||
err = bpf_prog_test_run(prog_fd, 1, &pkt_v6, sizeof(pkt_v6),
|
||||
buf, &size, &retval, &duration);
|
||||
CHECK(err || retval != XDP_TX || size != 114 ||
|
||||
iph6->nexthdr != IPPROTO_IPV6, "ipv6",
|
||||
"err %d errno %d retval %d size %d\n",
|
||||
err, errno, retval, size);
|
||||
out:
|
||||
bpf_object__close(obj);
|
||||
}
|
||||
|
||||
static void test_xdp_adjust_tail(void)
|
||||
{
|
||||
const char *file = "./test_adjust_tail.o";
|
||||
struct bpf_object *obj;
|
||||
char buf[128];
|
||||
__u32 duration, retval, size;
|
||||
int err, prog_fd;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
if (err) {
|
||||
error_cnt++;
|
||||
return;
|
||||
}
|
||||
|
||||
err = bpf_prog_test_run(prog_fd, 1, &pkt_v4, sizeof(pkt_v4),
|
||||
buf, &size, &retval, &duration);
|
||||
|
||||
CHECK(err || retval != XDP_DROP,
|
||||
"ipv4", "err %d errno %d retval %d size %d\n",
|
||||
err, errno, retval, size);
|
||||
|
||||
err = bpf_prog_test_run(prog_fd, 1, &pkt_v6, sizeof(pkt_v6),
|
||||
buf, &size, &retval, &duration);
|
||||
CHECK(err || retval != XDP_TX || size != 54,
|
||||
"ipv6", "err %d errno %d retval %d size %d\n",
|
||||
err, errno, retval, size);
|
||||
bpf_object__close(obj);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define MAGIC_VAL 0x1234
|
||||
#define NUM_ITER 100000
|
||||
#define VIP_NUM 5
|
||||
|
||||
static void test_l4lb(const char *file)
|
||||
{
|
||||
unsigned int nr_cpus = bpf_num_possible_cpus();
|
||||
@ -254,86 +175,6 @@ static void test_l4lb_all(void)
|
||||
test_l4lb(file2);
|
||||
}
|
||||
|
||||
static void test_xdp_noinline(void)
|
||||
{
|
||||
const char *file = "./test_xdp_noinline.o";
|
||||
unsigned int nr_cpus = bpf_num_possible_cpus();
|
||||
struct vip key = {.protocol = 6};
|
||||
struct vip_meta {
|
||||
__u32 flags;
|
||||
__u32 vip_num;
|
||||
} value = {.vip_num = VIP_NUM};
|
||||
__u32 stats_key = VIP_NUM;
|
||||
struct vip_stats {
|
||||
__u64 bytes;
|
||||
__u64 pkts;
|
||||
} stats[nr_cpus];
|
||||
struct real_definition {
|
||||
union {
|
||||
__be32 dst;
|
||||
__be32 dstv6[4];
|
||||
};
|
||||
__u8 flags;
|
||||
} real_def = {.dst = MAGIC_VAL};
|
||||
__u32 ch_key = 11, real_num = 3;
|
||||
__u32 duration, retval, size;
|
||||
int err, i, prog_fd, map_fd;
|
||||
__u64 bytes = 0, pkts = 0;
|
||||
struct bpf_object *obj;
|
||||
char buf[128];
|
||||
u32 *magic = (u32 *)buf;
|
||||
|
||||
err = bpf_prog_load(file, BPF_PROG_TYPE_XDP, &obj, &prog_fd);
|
||||
if (err) {
|
||||
error_cnt++;
|
||||
return;
|
||||
}
|
||||
|
||||
map_fd = bpf_find_map(__func__, obj, "vip_map");
|
||||
if (map_fd < 0)
|
||||
goto out;
|
||||
bpf_map_update_elem(map_fd, &key, &value, 0);
|
||||
|
||||
map_fd = bpf_find_map(__func__, obj, "ch_rings");
|
||||
if (map_fd < 0)
|
||||
goto out;
|
||||
bpf_map_update_elem(map_fd, &ch_key, &real_num, 0);
|
||||
|
||||
map_fd = bpf_find_map(__func__, obj, "reals");
|
||||
if (map_fd < 0)
|
||||
goto out;
|
||||
bpf_map_update_elem(map_fd, &real_num, &real_def, 0);
|
||||
|
||||
err = bpf_prog_test_run(prog_fd, NUM_ITER, &pkt_v4, sizeof(pkt_v4),
|
||||
buf, &size, &retval, &duration);
|
||||
CHECK(err || retval != 1 || size != 54 ||
|
||||
*magic != MAGIC_VAL, "ipv4",
|
||||
"err %d errno %d retval %d size %d magic %x\n",
|
||||
err, errno, retval, size, *magic);
|
||||
|
||||
err = bpf_prog_test_run(prog_fd, NUM_ITER, &pkt_v6, sizeof(pkt_v6),
|
||||
buf, &size, &retval, &duration);
|
||||
CHECK(err || retval != 1 || size != 74 ||
|
||||
*magic != MAGIC_VAL, "ipv6",
|
||||
"err %d errno %d retval %d size %d magic %x\n",
|
||||
err, errno, retval, size, *magic);
|
||||
|
||||
map_fd = bpf_find_map(__func__, obj, "stats");
|
||||
if (map_fd < 0)
|
||||
goto out;
|
||||
bpf_map_lookup_elem(map_fd, &stats_key, stats);
|
||||
for (i = 0; i < nr_cpus; i++) {
|
||||
bytes += stats[i].bytes;
|
||||
pkts += stats[i].pkts;
|
||||
}
|
||||
if (bytes != MAGIC_BYTES * NUM_ITER * 2 || pkts != NUM_ITER * 2) {
|
||||
error_cnt++;
|
||||
printf("test_xdp_noinline:FAIL:stats %lld %lld\n", bytes, pkts);
|
||||
}
|
||||
out:
|
||||
bpf_object__close(obj);
|
||||
}
|
||||
|
||||
static void test_tcp_estats(void)
|
||||
{
|
||||
const char *file = "./test_tcp_estats.o";
|
||||
@ -2047,10 +1888,7 @@ int main(void)
|
||||
#include <prog_tests/tests.h>
|
||||
#undef CALL
|
||||
test_prog_run_xattr();
|
||||
test_xdp();
|
||||
test_xdp_adjust_tail();
|
||||
test_l4lb_all();
|
||||
test_xdp_noinline();
|
||||
test_tcp_estats();
|
||||
test_bpf_obj_id();
|
||||
test_obj_name();
|
||||
|
@ -77,4 +77,8 @@ extern struct ipv6_packet pkt_v6;
|
||||
#define CHECK_ATTR(condition, tag, format...) \
|
||||
_CHECK(condition, tag, tattr.duration, format)
|
||||
|
||||
#define MAGIC_VAL 0x1234
|
||||
#define NUM_ITER 100000
|
||||
#define VIP_NUM 5
|
||||
|
||||
int bpf_find_map(const char *test, struct bpf_object *obj, const char *name);
|
||||
|
Loading…
Reference in New Issue
Block a user