diff options
Diffstat (limited to 'kernel/bpf/helpers.c')
| -rw-r--r-- | kernel/bpf/helpers.c | 31 | 
1 files changed, 25 insertions, 6 deletions
| diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c index 649f07623df6..01cfdf40c838 100644 --- a/kernel/bpf/helpers.c +++ b/kernel/bpf/helpers.c @@ -2,6 +2,7 @@  /* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com   */  #include <linux/bpf.h> +#include <linux/bpf-cgroup.h>  #include <linux/rcupdate.h>  #include <linux/random.h>  #include <linux/smp.h> @@ -530,7 +531,7 @@ const struct bpf_func_proto bpf_strtol_proto = {  	.func		= bpf_strtol,  	.gpl_only	= false,  	.ret_type	= RET_INTEGER, -	.arg1_type	= ARG_PTR_TO_MEM, +	.arg1_type	= ARG_PTR_TO_MEM | MEM_RDONLY,  	.arg2_type	= ARG_CONST_SIZE,  	.arg3_type	= ARG_ANYTHING,  	.arg4_type	= ARG_PTR_TO_LONG, @@ -558,13 +559,27 @@ const struct bpf_func_proto bpf_strtoul_proto = {  	.func		= bpf_strtoul,  	.gpl_only	= false,  	.ret_type	= RET_INTEGER, -	.arg1_type	= ARG_PTR_TO_MEM, +	.arg1_type	= ARG_PTR_TO_MEM | MEM_RDONLY,  	.arg2_type	= ARG_CONST_SIZE,  	.arg3_type	= ARG_ANYTHING,  	.arg4_type	= ARG_PTR_TO_LONG,  };  #endif +BPF_CALL_3(bpf_strncmp, const char *, s1, u32, s1_sz, const char *, s2) +{ +	return strncmp(s1, s2, s1_sz); +} + +const struct bpf_func_proto bpf_strncmp_proto = { +	.func		= bpf_strncmp, +	.gpl_only	= false, +	.ret_type	= RET_INTEGER, +	.arg1_type	= ARG_PTR_TO_MEM, +	.arg2_type	= ARG_CONST_SIZE, +	.arg3_type	= ARG_PTR_TO_CONST_STR, +}; +  BPF_CALL_4(bpf_get_ns_current_pid_tgid, u64, dev, u64, ino,  	   struct bpf_pidns_info *, nsdata, u32, size)  { @@ -630,7 +645,7 @@ const struct bpf_func_proto bpf_event_output_data_proto =  {  	.arg1_type      = ARG_PTR_TO_CTX,  	.arg2_type      = ARG_CONST_MAP_PTR,  	.arg3_type      = ARG_ANYTHING, -	.arg4_type      = ARG_PTR_TO_MEM, +	.arg4_type      = ARG_PTR_TO_MEM | MEM_RDONLY,  	.arg5_type      = ARG_CONST_SIZE_OR_ZERO,  }; @@ -667,7 +682,7 @@ BPF_CALL_2(bpf_per_cpu_ptr, const void *, ptr, u32, cpu)  const struct bpf_func_proto bpf_per_cpu_ptr_proto = {  	.func		= bpf_per_cpu_ptr,  	.gpl_only	= false, -	.ret_type	= RET_PTR_TO_MEM_OR_BTF_ID_OR_NULL, +	.ret_type	= RET_PTR_TO_MEM_OR_BTF_ID | PTR_MAYBE_NULL | MEM_RDONLY,  	.arg1_type	= ARG_PTR_TO_PERCPU_BTF_ID,  	.arg2_type	= ARG_ANYTHING,  }; @@ -680,7 +695,7 @@ BPF_CALL_1(bpf_this_cpu_ptr, const void *, percpu_ptr)  const struct bpf_func_proto bpf_this_cpu_ptr_proto = {  	.func		= bpf_this_cpu_ptr,  	.gpl_only	= false, -	.ret_type	= RET_PTR_TO_MEM_OR_BTF_ID, +	.ret_type	= RET_PTR_TO_MEM_OR_BTF_ID | MEM_RDONLY,  	.arg1_type	= ARG_PTR_TO_PERCPU_BTF_ID,  }; @@ -1011,7 +1026,7 @@ const struct bpf_func_proto bpf_snprintf_proto = {  	.arg1_type	= ARG_PTR_TO_MEM_OR_NULL,  	.arg2_type	= ARG_CONST_SIZE_OR_ZERO,  	.arg3_type	= ARG_PTR_TO_CONST_STR, -	.arg4_type	= ARG_PTR_TO_MEM_OR_NULL, +	.arg4_type	= ARG_PTR_TO_MEM | PTR_MAYBE_NULL | MEM_RDONLY,  	.arg5_type	= ARG_CONST_SIZE_OR_ZERO,  }; @@ -1376,6 +1391,10 @@ bpf_base_func_proto(enum bpf_func_id func_id)  		return &bpf_ringbuf_query_proto;  	case BPF_FUNC_for_each_map_elem:  		return &bpf_for_each_map_elem_proto; +	case BPF_FUNC_loop: +		return &bpf_loop_proto; +	case BPF_FUNC_strncmp: +		return &bpf_strncmp_proto;  	default:  		break;  	} |