Commit 62476cc1 authored by Stanislav Fomichev's avatar Stanislav Fomichev Committed by Daniel Borkmann
Browse files

bpf: Enable bpf_{g,s}etsockopt in BPF_CGROUP_UDP{4,6}_SENDMSG



Can be used to query/modify socket state for unconnected UDP sendmsg.
Those hooks run as BPF_CGROUP_RUN_SA_PROG_LOCK and operate on
a locked socket.

Signed-off-by: default avatarStanislav Fomichev <sdf@google.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20210127232853.3753823-2-sdf@google.com
parent 211a741c
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -7023,6 +7023,8 @@ sock_addr_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
		case BPF_CGROUP_INET6_BIND:
		case BPF_CGROUP_INET4_CONNECT:
		case BPF_CGROUP_INET6_CONNECT:
		case BPF_CGROUP_UDP4_SENDMSG:
		case BPF_CGROUP_UDP6_SENDMSG:
			return &bpf_sock_addr_setsockopt_proto;
		default:
			return NULL;
@@ -7033,6 +7035,8 @@ sock_addr_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
		case BPF_CGROUP_INET6_BIND:
		case BPF_CGROUP_INET4_CONNECT:
		case BPF_CGROUP_INET6_CONNECT:
		case BPF_CGROUP_UDP4_SENDMSG:
		case BPF_CGROUP_UDP6_SENDMSG:
			return &bpf_sock_addr_getsockopt_proto;
		default:
			return NULL;
+21 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */

#include <sys/socket.h>
#include <bpf/bpf_helpers.h>

int get_set_sk_priority(void *ctx)
{
	int prio;

	/* Verify that context allows calling bpf_getsockopt and
	 * bpf_setsockopt by reading and writing back socket
	 * priority.
	 */

	if (bpf_getsockopt(ctx, SOL_SOCKET, SO_PRIORITY, &prio, sizeof(prio)))
		return 0;
	if (bpf_setsockopt(ctx, SOL_SOCKET, SO_PRIORITY, &prio, sizeof(prio)))
		return 0;

	return 1;
}
+7 −0
Original line number Diff line number Diff line
@@ -8,6 +8,8 @@
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_endian.h>

#include <bpf_sockopt_helpers.h>

#define SRC1_IP4		0xAC100001U /* 172.16.0.1 */
#define SRC2_IP4		0x00000000U
#define SRC_REWRITE_IP4		0x7f000004U
@@ -21,9 +23,14 @@ int _version SEC("version") = 1;
SEC("cgroup/sendmsg4")
int sendmsg_v4_prog(struct bpf_sock_addr *ctx)
{
	int prio;

	if (ctx->type != SOCK_DGRAM)
		return 0;

	if (!get_set_sk_priority(ctx))
		return 0;

	/* Rewrite source. */
	if (ctx->msg_src_ip4 == bpf_htonl(SRC1_IP4) ||
	    ctx->msg_src_ip4 == bpf_htonl(SRC2_IP4)) {
+5 −0
Original line number Diff line number Diff line
@@ -8,6 +8,8 @@
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_endian.h>

#include <bpf_sockopt_helpers.h>

#define SRC_REWRITE_IP6_0	0
#define SRC_REWRITE_IP6_1	0
#define SRC_REWRITE_IP6_2	0
@@ -28,6 +30,9 @@ int sendmsg_v6_prog(struct bpf_sock_addr *ctx)
	if (ctx->type != SOCK_DGRAM)
		return 0;

	if (!get_set_sk_priority(ctx))
		return 0;

	/* Rewrite source. */
	if (ctx->msg_src_ip6[3] == bpf_htonl(1) ||
	    ctx->msg_src_ip6[3] == bpf_htonl(0)) {