-
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 testcase for xdp attaching failure tracepoint
Add a test case for the tracepoint of xdp attaching failure by bpf tracepoint when attach XDP to a device with invalid flags option. The bpf tracepoint retrieves error message from the tracepoint, and then put the error message to a perf buffer. The testing code receives error message from perf buffer, and then ASSERT "Invalid XDP flags for BPF link attachment". Signed-off-by: Leon Hwang <hffilwlqm@gmail.com> Link: https://lore.kernel.org/r/20230801142621.7925-3-hffilwlqm@gmail.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
- Loading branch information
Leon Hwang
authored and
Alexei Starovoitov
committed
Aug 2, 2023
1 parent
bf4ea1d
commit 7fedbf3
Showing
2 changed files
with
119 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
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,54 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* Copyright Leon Hwang */ | ||
|
||
#include <linux/bpf.h> | ||
#include <bpf/bpf_helpers.h> | ||
|
||
#define ERRMSG_LEN 64 | ||
|
||
struct xdp_errmsg { | ||
char msg[ERRMSG_LEN]; | ||
}; | ||
|
||
struct { | ||
__uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY); | ||
__type(key, int); | ||
__type(value, int); | ||
} xdp_errmsg_pb SEC(".maps"); | ||
|
||
struct xdp_attach_error_ctx { | ||
unsigned long unused; | ||
|
||
/* | ||
* bpf does not support tracepoint __data_loc directly. | ||
* | ||
* Actually, this field is a 32 bit integer whose value encodes | ||
* information on where to find the actual data. The first 2 bytes is | ||
* the size of the data. The last 2 bytes is the offset from the start | ||
* of the tracepoint struct where the data begins. | ||
* -- https://github.com/iovisor/bpftrace/pull/1542 | ||
*/ | ||
__u32 msg; // __data_loc char[] msg; | ||
}; | ||
|
||
/* | ||
* Catch the error message at the tracepoint. | ||
*/ | ||
|
||
SEC("tp/xdp/bpf_xdp_link_attach_failed") | ||
int tp__xdp__bpf_xdp_link_attach_failed(struct xdp_attach_error_ctx *ctx) | ||
{ | ||
char *msg = (void *)(__u64) ((void *) ctx + (__u16) ctx->msg); | ||
struct xdp_errmsg errmsg = {}; | ||
|
||
bpf_probe_read_kernel_str(&errmsg.msg, ERRMSG_LEN, msg); | ||
bpf_perf_event_output(ctx, &xdp_errmsg_pb, BPF_F_CURRENT_CPU, &errmsg, | ||
ERRMSG_LEN); | ||
return 0; | ||
} | ||
|
||
/* | ||
* Reuse the XDP program in xdp_dummy.c. | ||
*/ | ||
|
||
char LICENSE[] SEC("license") = "GPL"; |