Commit 549beec0 authored by Alexei Starovoitov's avatar Alexei Starovoitov
Browse files

Merge branch 'Add bpf_skc_to_unix_sock() helper'



Hengqi Chen says:

====================

This patch set adds a new BPF helper bpf_skc_to_unix_sock().
The helper is used in tracing programs to cast a socket
pointer to a unix_sock pointer.

v2->v3:
 - Use abstract socket in selftest (Alexei)
 - Run checkpatch script over patches (Andrii)

v1->v2:
 - Update selftest, remove trailing spaces changes (Song)
====================

Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parents 44ce0ac1 b6c4e715
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2093,6 +2093,7 @@ extern const struct bpf_func_proto bpf_skc_to_tcp_sock_proto;
extern const struct bpf_func_proto bpf_skc_to_tcp_timewait_sock_proto;
extern const struct bpf_func_proto bpf_skc_to_tcp_request_sock_proto;
extern const struct bpf_func_proto bpf_skc_to_udp6_sock_proto;
extern const struct bpf_func_proto bpf_skc_to_unix_sock_proto;
extern const struct bpf_func_proto bpf_copy_from_user_proto;
extern const struct bpf_func_proto bpf_snprintf_btf_proto;
extern const struct bpf_func_proto bpf_snprintf_proto;
+7 −0
Original line number Diff line number Diff line
@@ -4909,6 +4909,12 @@ union bpf_attr {
 *	Return
 *		The number of bytes written to the buffer, or a negative error
 *		in case of failure.
 *
 * struct unix_sock *bpf_skc_to_unix_sock(void *sk)
 * 	Description
 *		Dynamically cast a *sk* pointer to a *unix_sock* pointer.
 *	Return
 *		*sk* if casting is valid, or **NULL** otherwise.
 */
#define __BPF_FUNC_MAPPER(FN)		\
	FN(unspec),			\
@@ -5089,6 +5095,7 @@ union bpf_attr {
	FN(task_pt_regs),		\
	FN(get_branch_snapshot),	\
	FN(trace_vprintk),		\
	FN(skc_to_unix_sock),		\
	/* */

/* integer value in 'imm' field of BPF_CALL instruction selects which helper
+2 −0
Original line number Diff line number Diff line
@@ -1608,6 +1608,8 @@ tracing_prog_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
		return &bpf_skc_to_tcp_request_sock_proto;
	case BPF_FUNC_skc_to_udp6_sock:
		return &bpf_skc_to_udp6_sock_proto;
	case BPF_FUNC_skc_to_unix_sock:
		return &bpf_skc_to_unix_sock_proto;
	case BPF_FUNC_sk_storage_get:
		return &bpf_sk_storage_get_tracing_proto;
	case BPF_FUNC_sk_storage_delete:
+23 −0
Original line number Diff line number Diff line
@@ -10723,6 +10723,26 @@ const struct bpf_func_proto bpf_skc_to_udp6_sock_proto = {
	.ret_btf_id		= &btf_sock_ids[BTF_SOCK_TYPE_UDP6],
};

BPF_CALL_1(bpf_skc_to_unix_sock, struct sock *, sk)
{
	/* unix_sock type is not generated in dwarf and hence btf,
	 * trigger an explicit type generation here.
	 */
	BTF_TYPE_EMIT(struct unix_sock);
	if (sk && sk_fullsock(sk) && sk->sk_family == AF_UNIX)
		return (unsigned long)sk;

	return (unsigned long)NULL;
}

const struct bpf_func_proto bpf_skc_to_unix_sock_proto = {
	.func			= bpf_skc_to_unix_sock,
	.gpl_only		= false,
	.ret_type		= RET_PTR_TO_BTF_ID_OR_NULL,
	.arg1_type		= ARG_PTR_TO_BTF_ID_SOCK_COMMON,
	.ret_btf_id		= &btf_sock_ids[BTF_SOCK_TYPE_UNIX],
};

BPF_CALL_1(bpf_sock_from_file, struct file *, file)
{
	return (unsigned long)sock_from_file(file);
@@ -10762,6 +10782,9 @@ bpf_sk_base_func_proto(enum bpf_func_id func_id)
	case BPF_FUNC_skc_to_udp6_sock:
		func = &bpf_skc_to_udp6_sock_proto;
		break;
	case BPF_FUNC_skc_to_unix_sock:
		func = &bpf_skc_to_unix_sock_proto;
		break;
	default:
		return bpf_base_func_proto(func_id);
	}
+2 −0
Original line number Diff line number Diff line
@@ -537,6 +537,7 @@ class PrinterHelpers(Printer):
            'struct tcp_timewait_sock',
            'struct tcp_request_sock',
            'struct udp6_sock',
            'struct unix_sock',
            'struct task_struct',

            'struct __sk_buff',
@@ -589,6 +590,7 @@ class PrinterHelpers(Printer):
            'struct tcp_timewait_sock',
            'struct tcp_request_sock',
            'struct udp6_sock',
            'struct unix_sock',
            'struct task_struct',
            'struct path',
            'struct btf_ptr',
Loading