-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests/bpf: Add a test for attaching a bpf fentry/fexit trace to a…
…n XDP program Add a test that will attach a FENTRY and FEXIT program to the XDP test program. It will also verify data from the XDP context on FENTRY and verifies the return code on exit. Signed-off-by: Eelco Chaudron <echaudro@redhat.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Acked-by: Andrii Nakryiko <andriin@fb.com> Link: https://lore.kernel.org/bpf/157909410480.47481.11202505690938004673.stgit@xdp-tutorial
- Loading branch information
Eelco Chaudron
authored and
Alexei Starovoitov
committed
Jan 15, 2020
1 parent
9173cac
commit 83e4b88
Showing
2 changed files
with
109 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
#include <test_progs.h> | ||
#include <net/if.h> | ||
#include "test_xdp.skel.h" | ||
#include "test_xdp_bpf2bpf.skel.h" | ||
|
||
void test_xdp_bpf2bpf(void) | ||
{ | ||
__u32 duration = 0, retval, size; | ||
char buf[128]; | ||
int err, pkt_fd, map_fd; | ||
struct iphdr *iph = (void *)buf + sizeof(struct ethhdr); | ||
struct iptnl_info value4 = {.family = AF_INET}; | ||
struct test_xdp *pkt_skel = NULL; | ||
struct test_xdp_bpf2bpf *ftrace_skel = NULL; | ||
struct vip key4 = {.protocol = 6, .family = AF_INET}; | ||
DECLARE_LIBBPF_OPTS(bpf_object_open_opts, opts); | ||
|
||
/* Load XDP program to introspect */ | ||
pkt_skel = test_xdp__open_and_load(); | ||
if (CHECK(!pkt_skel, "pkt_skel_load", "test_xdp skeleton failed\n")) | ||
return; | ||
|
||
pkt_fd = bpf_program__fd(pkt_skel->progs._xdp_tx_iptunnel); | ||
|
||
map_fd = bpf_map__fd(pkt_skel->maps.vip2tnl); | ||
bpf_map_update_elem(map_fd, &key4, &value4, 0); | ||
|
||
/* Load trace program */ | ||
opts.attach_prog_fd = pkt_fd, | ||
ftrace_skel = test_xdp_bpf2bpf__open_opts(&opts); | ||
if (CHECK(!ftrace_skel, "__open", "ftrace skeleton failed\n")) | ||
goto out; | ||
|
||
err = test_xdp_bpf2bpf__load(ftrace_skel); | ||
if (CHECK(err, "__load", "ftrace skeleton failed\n")) | ||
goto out; | ||
|
||
err = test_xdp_bpf2bpf__attach(ftrace_skel); | ||
if (CHECK(err, "ftrace_attach", "ftrace attach failed: %d\n", err)) | ||
goto out; | ||
|
||
/* Run test program */ | ||
err = bpf_prog_test_run(pkt_fd, 1, &pkt_v4, sizeof(pkt_v4), | ||
buf, &size, &retval, &duration); | ||
|
||
if (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)) | ||
goto out; | ||
|
||
/* Verify test results */ | ||
if (CHECK(ftrace_skel->bss->test_result_fentry != if_nametoindex("lo"), | ||
"result", "fentry failed err %llu\n", | ||
ftrace_skel->bss->test_result_fentry)) | ||
goto out; | ||
|
||
CHECK(ftrace_skel->bss->test_result_fexit != XDP_TX, "result", | ||
"fexit failed err %llu\n", ftrace_skel->bss->test_result_fexit); | ||
|
||
out: | ||
test_xdp__destroy(pkt_skel); | ||
test_xdp_bpf2bpf__destroy(ftrace_skel); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
#include <linux/bpf.h> | ||
#include "bpf_helpers.h" | ||
#include "bpf_trace_helpers.h" | ||
|
||
struct net_device { | ||
/* Structure does not need to contain all entries, | ||
* as "preserve_access_index" will use BTF to fix this... | ||
*/ | ||
int ifindex; | ||
} __attribute__((preserve_access_index)); | ||
|
||
struct xdp_rxq_info { | ||
/* Structure does not need to contain all entries, | ||
* as "preserve_access_index" will use BTF to fix this... | ||
*/ | ||
struct net_device *dev; | ||
__u32 queue_index; | ||
} __attribute__((preserve_access_index)); | ||
|
||
struct xdp_buff { | ||
void *data; | ||
void *data_end; | ||
void *data_meta; | ||
void *data_hard_start; | ||
unsigned long handle; | ||
struct xdp_rxq_info *rxq; | ||
} __attribute__((preserve_access_index)); | ||
|
||
__u64 test_result_fentry = 0; | ||
SEC("fentry/_xdp_tx_iptunnel") | ||
int BPF_PROG(trace_on_entry, struct xdp_buff *xdp) | ||
{ | ||
test_result_fentry = xdp->rxq->dev->ifindex; | ||
return 0; | ||
} | ||
|
||
__u64 test_result_fexit = 0; | ||
SEC("fexit/_xdp_tx_iptunnel") | ||
int BPF_PROG(trace_on_exit, struct xdp_buff *xdp, int ret) | ||
{ | ||
test_result_fexit = ret; | ||
return 0; | ||
} |