mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-26 15:54:18 +08:00
3e689141e6
Fix all selftests to include libbpf header files with the bpf/ prefix, to
be consistent with external users of the library. Also ensure that all
includes of exported libbpf header files (those that are exported on 'make
install' of the library) use bracketed includes instead of quoted.
To not break the build, keep the old include path until everything has been
changed to the new one; a subsequent patch will remove that.
Fixes: 6910d7d386
("selftests/bpf: Ensure bpf_helper_defs.h are taken from selftests dir")
Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Andrii Nakryiko <andriin@fb.com>
Link: https://lore.kernel.org/bpf/157952560568.1683545.9649335788846513446.stgit@toke.dk
98 lines
2.3 KiB
C
98 lines
2.3 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <linux/bpf.h>
|
|
#include <bpf/bpf_helpers.h>
|
|
|
|
char _license[] SEC("license") = "GPL";
|
|
__u32 _version SEC("version") = 1;
|
|
|
|
#define SOL_CUSTOM 0xdeadbeef
|
|
#define CUSTOM_INHERIT1 0
|
|
#define CUSTOM_INHERIT2 1
|
|
#define CUSTOM_LISTENER 2
|
|
|
|
struct sockopt_inherit {
|
|
__u8 val;
|
|
};
|
|
|
|
struct {
|
|
__uint(type, BPF_MAP_TYPE_SK_STORAGE);
|
|
__uint(map_flags, BPF_F_NO_PREALLOC | BPF_F_CLONE);
|
|
__type(key, int);
|
|
__type(value, struct sockopt_inherit);
|
|
} cloned1_map SEC(".maps");
|
|
|
|
struct {
|
|
__uint(type, BPF_MAP_TYPE_SK_STORAGE);
|
|
__uint(map_flags, BPF_F_NO_PREALLOC | BPF_F_CLONE);
|
|
__type(key, int);
|
|
__type(value, struct sockopt_inherit);
|
|
} cloned2_map SEC(".maps");
|
|
|
|
struct {
|
|
__uint(type, BPF_MAP_TYPE_SK_STORAGE);
|
|
__uint(map_flags, BPF_F_NO_PREALLOC);
|
|
__type(key, int);
|
|
__type(value, struct sockopt_inherit);
|
|
} listener_only_map SEC(".maps");
|
|
|
|
static __inline struct sockopt_inherit *get_storage(struct bpf_sockopt *ctx)
|
|
{
|
|
if (ctx->optname == CUSTOM_INHERIT1)
|
|
return bpf_sk_storage_get(&cloned1_map, ctx->sk, 0,
|
|
BPF_SK_STORAGE_GET_F_CREATE);
|
|
else if (ctx->optname == CUSTOM_INHERIT2)
|
|
return bpf_sk_storage_get(&cloned2_map, ctx->sk, 0,
|
|
BPF_SK_STORAGE_GET_F_CREATE);
|
|
else
|
|
return bpf_sk_storage_get(&listener_only_map, ctx->sk, 0,
|
|
BPF_SK_STORAGE_GET_F_CREATE);
|
|
}
|
|
|
|
SEC("cgroup/getsockopt")
|
|
int _getsockopt(struct bpf_sockopt *ctx)
|
|
{
|
|
__u8 *optval_end = ctx->optval_end;
|
|
struct sockopt_inherit *storage;
|
|
__u8 *optval = ctx->optval;
|
|
|
|
if (ctx->level != SOL_CUSTOM)
|
|
return 1; /* only interested in SOL_CUSTOM */
|
|
|
|
if (optval + 1 > optval_end)
|
|
return 0; /* EPERM, bounds check */
|
|
|
|
storage = get_storage(ctx);
|
|
if (!storage)
|
|
return 0; /* EPERM, couldn't get sk storage */
|
|
|
|
ctx->retval = 0; /* Reset system call return value to zero */
|
|
|
|
optval[0] = storage->val;
|
|
ctx->optlen = 1;
|
|
|
|
return 1;
|
|
}
|
|
|
|
SEC("cgroup/setsockopt")
|
|
int _setsockopt(struct bpf_sockopt *ctx)
|
|
{
|
|
__u8 *optval_end = ctx->optval_end;
|
|
struct sockopt_inherit *storage;
|
|
__u8 *optval = ctx->optval;
|
|
|
|
if (ctx->level != SOL_CUSTOM)
|
|
return 1; /* only interested in SOL_CUSTOM */
|
|
|
|
if (optval + 1 > optval_end)
|
|
return 0; /* EPERM, bounds check */
|
|
|
|
storage = get_storage(ctx);
|
|
if (!storage)
|
|
return 0; /* EPERM, couldn't get sk storage */
|
|
|
|
storage->val = optval[0];
|
|
ctx->optlen = -1;
|
|
|
|
return 1;
|
|
}
|