diff options
Diffstat (limited to 'tools/lib/bpf/bpf.c')
| -rw-r--r-- | tools/lib/bpf/bpf.c | 64 | 
1 files changed, 64 insertions, 0 deletions
| diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index a9c3e33d0f8a..ab40dbf9f020 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -837,6 +837,50 @@ int bpf_link_create(int prog_fd, int target_fd,  		if (!OPTS_ZEROED(opts, netkit))  			return libbpf_err(-EINVAL);  		break; +	case BPF_CGROUP_INET_INGRESS: +	case BPF_CGROUP_INET_EGRESS: +	case BPF_CGROUP_INET_SOCK_CREATE: +	case BPF_CGROUP_INET_SOCK_RELEASE: +	case BPF_CGROUP_INET4_BIND: +	case BPF_CGROUP_INET6_BIND: +	case BPF_CGROUP_INET4_POST_BIND: +	case BPF_CGROUP_INET6_POST_BIND: +	case BPF_CGROUP_INET4_CONNECT: +	case BPF_CGROUP_INET6_CONNECT: +	case BPF_CGROUP_UNIX_CONNECT: +	case BPF_CGROUP_INET4_GETPEERNAME: +	case BPF_CGROUP_INET6_GETPEERNAME: +	case BPF_CGROUP_UNIX_GETPEERNAME: +	case BPF_CGROUP_INET4_GETSOCKNAME: +	case BPF_CGROUP_INET6_GETSOCKNAME: +	case BPF_CGROUP_UNIX_GETSOCKNAME: +	case BPF_CGROUP_UDP4_SENDMSG: +	case BPF_CGROUP_UDP6_SENDMSG: +	case BPF_CGROUP_UNIX_SENDMSG: +	case BPF_CGROUP_UDP4_RECVMSG: +	case BPF_CGROUP_UDP6_RECVMSG: +	case BPF_CGROUP_UNIX_RECVMSG: +	case BPF_CGROUP_SOCK_OPS: +	case BPF_CGROUP_DEVICE: +	case BPF_CGROUP_SYSCTL: +	case BPF_CGROUP_GETSOCKOPT: +	case BPF_CGROUP_SETSOCKOPT: +	case BPF_LSM_CGROUP: +		relative_fd = OPTS_GET(opts, cgroup.relative_fd, 0); +		relative_id = OPTS_GET(opts, cgroup.relative_id, 0); +		if (relative_fd && relative_id) +			return libbpf_err(-EINVAL); +		if (relative_id) { +			attr.link_create.cgroup.relative_id = relative_id; +			attr.link_create.flags |= BPF_F_ID; +		} else { +			attr.link_create.cgroup.relative_fd = relative_fd; +		} +		attr.link_create.cgroup.expected_revision = +			OPTS_GET(opts, cgroup.expected_revision, 0); +		if (!OPTS_ZEROED(opts, cgroup)) +			return libbpf_err(-EINVAL); +		break;  	default:  		if (!OPTS_ZEROED(opts, flags))  			return libbpf_err(-EINVAL); @@ -1331,3 +1375,23 @@ int bpf_token_create(int bpffs_fd, struct bpf_token_create_opts *opts)  	fd = sys_bpf_fd(BPF_TOKEN_CREATE, &attr, attr_sz);  	return libbpf_err_errno(fd);  } + +int bpf_prog_stream_read(int prog_fd, __u32 stream_id, void *buf, __u32 buf_len, +			 struct bpf_prog_stream_read_opts *opts) +{ +	const size_t attr_sz = offsetofend(union bpf_attr, prog_stream_read); +	union bpf_attr attr; +	int err; + +	if (!OPTS_VALID(opts, bpf_prog_stream_read_opts)) +		return libbpf_err(-EINVAL); + +	memset(&attr, 0, attr_sz); +	attr.prog_stream_read.stream_buf = ptr_to_u64(buf); +	attr.prog_stream_read.stream_buf_len = buf_len; +	attr.prog_stream_read.stream_id = stream_id; +	attr.prog_stream_read.prog_fd = prog_fd; + +	err = sys_bpf(BPF_PROG_STREAM_READ_BY_FD, &attr, attr_sz); +	return libbpf_err_errno(err); +} | 
