diff options
Diffstat (limited to 'tools/lib/bpf/bpf.c')
| -rw-r--r-- | tools/lib/bpf/bpf.c | 32 | 
1 files changed, 29 insertions, 3 deletions
| diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index 8143536b462a..ae752fa4eaa7 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -54,7 +54,7 @@ static int sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr,  }  int bpf_create_map(enum bpf_map_type map_type, int key_size, -		   int value_size, int max_entries) +		   int value_size, int max_entries, __u32 map_flags)  {  	union bpf_attr attr; @@ -64,13 +64,14 @@ int bpf_create_map(enum bpf_map_type map_type, int key_size,  	attr.key_size = key_size;  	attr.value_size = value_size;  	attr.max_entries = max_entries; +	attr.map_flags = map_flags;  	return sys_bpf(BPF_MAP_CREATE, &attr, sizeof(attr));  }  int bpf_load_program(enum bpf_prog_type type, struct bpf_insn *insns,  		     size_t insns_cnt, char *license, -		     u32 kern_version, char *log_buf, size_t log_buf_sz) +		     __u32 kern_version, char *log_buf, size_t log_buf_sz)  {  	int fd;  	union bpf_attr attr; @@ -98,7 +99,7 @@ int bpf_load_program(enum bpf_prog_type type, struct bpf_insn *insns,  }  int bpf_map_update_elem(int fd, void *key, void *value, -			u64 flags) +			__u64 flags)  {  	union bpf_attr attr; @@ -166,3 +167,28 @@ int bpf_obj_get(const char *pathname)  	return sys_bpf(BPF_OBJ_GET, &attr, sizeof(attr));  } + +int bpf_prog_attach(int prog_fd, int target_fd, enum bpf_attach_type type, +		    unsigned int flags) +{ +	union bpf_attr attr; + +	bzero(&attr, sizeof(attr)); +	attr.target_fd	   = target_fd; +	attr.attach_bpf_fd = prog_fd; +	attr.attach_type   = type; +	attr.attach_flags  = flags; + +	return sys_bpf(BPF_PROG_ATTACH, &attr, sizeof(attr)); +} + +int bpf_prog_detach(int target_fd, enum bpf_attach_type type) +{ +	union bpf_attr attr; + +	bzero(&attr, sizeof(attr)); +	attr.target_fd	 = target_fd; +	attr.attach_type = type; + +	return sys_bpf(BPF_PROG_DETACH, &attr, sizeof(attr)); +} |