Commit e4009250 authored by Martin KaFai Lau's avatar Martin KaFai Lau
Browse files

Merge branch 'libbpf: add bpf_core_cast() helper'



Andrii Nakryiko says:

====================
Add bpf_core_cast(<ptr>, <type>) macro wrapper around bpf_rdonly_cast() kfunc
to make it easier to use this functionality in BPF code. See patch #2 for
BPF selftests conversions demonstrating improvements in code succinctness.
====================

Signed-off-by: default avatarMartin KaFai Lau <martin.lau@kernel.org>
parents 4d8ebe13 ea9d5616
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -2,6 +2,8 @@
#ifndef __BPF_CORE_READ_H__
#define __BPF_CORE_READ_H__

#include <bpf/bpf_helpers.h>

/*
 * enum bpf_field_info_kind is passed as a second argument into
 * __builtin_preserve_field_info() built-in to get a specific aspect of
@@ -292,6 +294,17 @@ enum bpf_enum_value_kind {
#define bpf_core_read_user_str(dst, sz, src)				    \
	bpf_probe_read_user_str(dst, sz, (const void *)__builtin_preserve_access_index(src))

extern void *bpf_rdonly_cast(const void *obj, __u32 btf_id) __ksym __weak;

/*
 * Cast provided pointer *ptr* into a pointer to a specified *type* in such
 * a way that BPF verifier will become aware of associated kernel-side BTF
 * type. This allows to access members of kernel types directly without the
 * need to use BPF_CORE_READ() macros.
 */
#define bpf_core_cast(ptr, type)					    \
	((typeof(type) *)bpf_rdonly_cast((ptr), bpf_core_type_id_kernel(type)))

#define ___concat(a, b) a ## b
#define ___apply(fn, n) ___concat(fn, n)
#define ___nth(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, __11, N, ...) N
+1 −1
Original line number Diff line number Diff line
@@ -63,7 +63,7 @@ extern int bpf_sk_assign_tcp_reqsk(struct __sk_buff *skb, struct sock *sk,

void *bpf_cast_to_kern_ctx(void *) __ksym;

void *bpf_rdonly_cast(void *obj, __u32 btf_id) __ksym;
extern void *bpf_rdonly_cast(const void *obj, __u32 btf_id) __ksym __weak;

extern int bpf_get_file_xattr(struct file *file, const char *name,
			      struct bpf_dynptr *value_ptr) __ksym;
+1 −2
Original line number Diff line number Diff line
@@ -28,8 +28,7 @@ int connect_unix_prog(struct bpf_sock_addr *ctx)
	if (sa_kern->uaddrlen != unaddrlen)
		return 0;

	sa_kern_unaddr = bpf_rdonly_cast(sa_kern->uaddr,
						bpf_core_type_id_kernel(struct sockaddr_un));
	sa_kern_unaddr = bpf_core_cast(sa_kern->uaddr, struct sockaddr_un);
	if (memcmp(sa_kern_unaddr->sun_path, SERVUN_REWRITE_ADDRESS,
			sizeof(SERVUN_REWRITE_ADDRESS) - 1) != 0)
		return 0;
+1 −2
Original line number Diff line number Diff line
@@ -27,8 +27,7 @@ int getpeername_unix_prog(struct bpf_sock_addr *ctx)
	if (sa_kern->uaddrlen != unaddrlen)
		return 1;

	sa_kern_unaddr = bpf_rdonly_cast(sa_kern->uaddr,
						bpf_core_type_id_kernel(struct sockaddr_un));
	sa_kern_unaddr = bpf_core_cast(sa_kern->uaddr, struct sockaddr_un);
	if (memcmp(sa_kern_unaddr->sun_path, SERVUN_REWRITE_ADDRESS,
			sizeof(SERVUN_REWRITE_ADDRESS) - 1) != 0)
		return 1;
+1 −2
Original line number Diff line number Diff line
@@ -27,8 +27,7 @@ int getsockname_unix_prog(struct bpf_sock_addr *ctx)
	if (sa_kern->uaddrlen != unaddrlen)
		return 1;

	sa_kern_unaddr = bpf_rdonly_cast(sa_kern->uaddr,
						bpf_core_type_id_kernel(struct sockaddr_un));
	sa_kern_unaddr = bpf_core_cast(sa_kern->uaddr, struct sockaddr_un);
	if (memcmp(sa_kern_unaddr->sun_path, SERVUN_REWRITE_ADDRESS,
			sizeof(SERVUN_REWRITE_ADDRESS) - 1) != 0)
		return 1;
Loading