diff options
Diffstat (limited to 'tools/testing/selftests/bpf/dev_cgroup.c')
| -rw-r--r-- | tools/testing/selftests/bpf/dev_cgroup.c | 60 | 
1 files changed, 60 insertions, 0 deletions
diff --git a/tools/testing/selftests/bpf/dev_cgroup.c b/tools/testing/selftests/bpf/dev_cgroup.c new file mode 100644 index 000000000000..ce41a3475f27 --- /dev/null +++ b/tools/testing/selftests/bpf/dev_cgroup.c @@ -0,0 +1,60 @@ +/* Copyright (c) 2017 Facebook + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + */ + +#include <linux/bpf.h> +#include <linux/version.h> +#include "bpf_helpers.h" + +SEC("cgroup/dev") +int bpf_prog1(struct bpf_cgroup_dev_ctx *ctx) +{ +	short type = ctx->access_type & 0xFFFF; +#ifdef DEBUG +	short access = ctx->access_type >> 16; +	char fmt[] = "  %d:%d    \n"; + +	switch (type) { +	case BPF_DEVCG_DEV_BLOCK: +		fmt[0] = 'b'; +		break; +	case BPF_DEVCG_DEV_CHAR: +		fmt[0] = 'c'; +		break; +	default: +		fmt[0] = '?'; +		break; +	} + +	if (access & BPF_DEVCG_ACC_READ) +		fmt[8] = 'r'; + +	if (access & BPF_DEVCG_ACC_WRITE) +		fmt[9] = 'w'; + +	if (access & BPF_DEVCG_ACC_MKNOD) +		fmt[10] = 'm'; + +	bpf_trace_printk(fmt, sizeof(fmt), ctx->major, ctx->minor); +#endif + +	/* Allow access to /dev/zero and /dev/random. +	 * Forbid everything else. +	 */ +	if (ctx->major != 1 || type != BPF_DEVCG_DEV_CHAR) +		return 0; + +	switch (ctx->minor) { +	case 5: /* 1:5 /dev/zero */ +	case 9: /* 1:9 /dev/urandom */ +		return 1; +	} + +	return 0; +} + +char _license[] SEC("license") = "GPL"; +__u32 _version SEC("version") = LINUX_VERSION_CODE;  | 
