diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2018-06-22 21:20:35 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2018-06-22 21:20:35 +0200 | 
| commit | 7731b8bc94e599c9a79e428f3359ff2c34b7576a (patch) | |
| tree | 879f18ccbe274122f2d4f095b43cbc7f953e0ada /tools/testing/selftests/bpf/sendmsg6_prog.c | |
| parent | 48e315618dc4dc8904182cd221e3d395d5d97005 (diff) | |
| parent | 9ffc59d57228d74809700be6f7ecb1db10292f05 (diff) | |
Merge branch 'linus' into x86/urgent
Required to queue a dependent fix.
Diffstat (limited to 'tools/testing/selftests/bpf/sendmsg6_prog.c')
| -rw-r--r-- | tools/testing/selftests/bpf/sendmsg6_prog.c | 60 | 
1 files changed, 60 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/sendmsg6_prog.c b/tools/testing/selftests/bpf/sendmsg6_prog.c new file mode 100644 index 000000000000..5aeaa284fc47 --- /dev/null +++ b/tools/testing/selftests/bpf/sendmsg6_prog.c @@ -0,0 +1,60 @@ +// SPDX-License-Identifier: GPL-2.0 +// Copyright (c) 2018 Facebook + +#include <linux/stddef.h> +#include <linux/bpf.h> +#include <sys/socket.h> + +#include "bpf_helpers.h" +#include "bpf_endian.h" + +#define SRC_REWRITE_IP6_0	0 +#define SRC_REWRITE_IP6_1	0 +#define SRC_REWRITE_IP6_2	0 +#define SRC_REWRITE_IP6_3	6 + +#define DST_REWRITE_IP6_0	0 +#define DST_REWRITE_IP6_1	0 +#define DST_REWRITE_IP6_2	0 +#define DST_REWRITE_IP6_3	1 + +#define DST_REWRITE_PORT6	6666 + +int _version SEC("version") = 1; + +SEC("cgroup/sendmsg6") +int sendmsg_v6_prog(struct bpf_sock_addr *ctx) +{ +	if (ctx->type != SOCK_DGRAM) +		return 0; + +	/* Rewrite source. */ +	if (ctx->msg_src_ip6[3] == bpf_htonl(1) || +	    ctx->msg_src_ip6[3] == bpf_htonl(0)) { +		ctx->msg_src_ip6[0] = bpf_htonl(SRC_REWRITE_IP6_0); +		ctx->msg_src_ip6[1] = bpf_htonl(SRC_REWRITE_IP6_1); +		ctx->msg_src_ip6[2] = bpf_htonl(SRC_REWRITE_IP6_2); +		ctx->msg_src_ip6[3] = bpf_htonl(SRC_REWRITE_IP6_3); +	} else { +		/* Unexpected source. Reject sendmsg. */ +		return 0; +	} + +	/* Rewrite destination. */ +	if ((ctx->user_ip6[0] & 0xFFFF) == bpf_htons(0xFACE) && +	     ctx->user_ip6[0] >> 16 == bpf_htons(0xB00C)) { +		ctx->user_ip6[0] = bpf_htonl(DST_REWRITE_IP6_0); +		ctx->user_ip6[1] = bpf_htonl(DST_REWRITE_IP6_1); +		ctx->user_ip6[2] = bpf_htonl(DST_REWRITE_IP6_2); +		ctx->user_ip6[3] = bpf_htonl(DST_REWRITE_IP6_3); + +		ctx->user_port = bpf_htons(DST_REWRITE_PORT6); +	} else { +		/* Unexpected destination. Reject sendmsg. */ +		return 0; +	} + +	return 1; +} + +char _license[] SEC("license") = "GPL";  | 
