函数逻辑报告

Linux Kernel

v5.5.9

Brick Technologies Co., Ltd

Source Code:kernel\bpf\verifier.c Create Date:2022-07-27 14:13:11
Last Modify:2022-05-19 20:02:10 Copyright©Brick
首页 函数Tree
注解内核,赢得工具下载SCCTEnglish

函数名称:check_map_func_compatibility

函数原型:static int check_map_func_compatibility(struct bpf_verifier_env *env, struct bpf_map *map, int func_id)

返回类型:int

参数:

类型参数名称
struct bpf_verifier_env *env
struct bpf_map *map
intfunc_id
3632  如果非map则返回:0
3637  :map_type恒等于BPF_MAP_TYPE_PROG_ARRAY
3638  如果func_id不等于BPF_FUNC_tail_call则转到:error
3640  退出
3641  :map_type恒等于BPF_MAP_TYPE_PERF_EVENT_ARRAY
3642  如果func_id不等于BPF_FUNC_perf_event_readfunc_id不等于BPF_FUNC_perf_event_outputfunc_id不等于BPF_FUNC_skb_outputfunc_id不等于BPF_FUNC_perf_event_read_value则转到:error
3647  退出
3648  :map_type恒等于BPF_MAP_TYPE_STACK_TRACE
3649  如果func_id不等于BPF_FUNC_get_stackid则转到:error
3651  退出
3652  :map_type恒等于BPF_MAP_TYPE_CGROUP_ARRAY
3653  如果func_id不等于BPF_FUNC_skb_under_cgroupfunc_id不等于BPF_FUNC_current_task_under_cgroup则转到:error
3656  退出
3657  :map_type恒等于BPF_MAP_TYPE_CGROUP_STORAGE
3658  :map_type恒等于BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE
3659  如果func_id不等于BPF_FUNC_get_local_storage则转到:error
3661  退出
3662  :map_type恒等于BPF_MAP_TYPE_DEVMAP
3663  :map_type恒等于BPF_MAP_TYPE_DEVMAP_HASH
3664  如果func_id不等于BPF_FUNC_redirect_mapfunc_id不等于BPF_FUNC_map_lookup_elem则转到:error
3667  退出
3671  :map_type恒等于BPF_MAP_TYPE_CPUMAP
3672  如果func_id不等于BPF_FUNC_redirect_map则转到:error
3674  退出
3675  :map_type恒等于BPF_MAP_TYPE_XSKMAP
3676  如果func_id不等于BPF_FUNC_redirect_mapfunc_id不等于BPF_FUNC_map_lookup_elem则转到:error
3679  退出
3680  :map_type恒等于BPF_MAP_TYPE_ARRAY_OF_MAPS
3681  :map_type恒等于BPF_MAP_TYPE_HASH_OF_MAPS
3682  如果func_id不等于BPF_FUNC_map_lookup_elem则转到:error
3684  退出
3685  :map_type恒等于BPF_MAP_TYPE_SOCKMAP
3686  如果func_id不等于BPF_FUNC_sk_redirect_mapfunc_id不等于BPF_FUNC_sock_map_updatefunc_id不等于BPF_FUNC_map_delete_elemfunc_id不等于BPF_FUNC_msg_redirect_map则转到:error
3691  退出
3692  :map_type恒等于BPF_MAP_TYPE_SOCKHASH
3693  如果func_id不等于BPF_FUNC_sk_redirect_hashfunc_id不等于BPF_FUNC_sock_hash_updatefunc_id不等于BPF_FUNC_map_delete_elemfunc_id不等于BPF_FUNC_msg_redirect_hash则转到:error
3698  退出
3699  :map_type恒等于BPF_MAP_TYPE_REUSEPORT_SOCKARRAY
3700  如果func_id不等于BPF_FUNC_sk_select_reuseport则转到:error
3702  退出
3703  :map_type恒等于BPF_MAP_TYPE_QUEUE
3704  :map_type恒等于BPF_MAP_TYPE_STACK
3705  如果func_id不等于BPF_FUNC_map_peek_elemfunc_id不等于BPF_FUNC_map_pop_elemfunc_id不等于BPF_FUNC_map_push_elem则转到:error
3709  退出
3710  :map_type恒等于BPF_MAP_TYPE_SK_STORAGE
3711  如果func_id不等于BPF_FUNC_sk_storage_getfunc_id不等于BPF_FUNC_sk_storage_delete则转到:error
3714  退出
3715  默认
3716  退出
3721  :func_id恒等于BPF_FUNC_tail_call
3722  如果map_type不等于BPF_MAP_TYPE_PROG_ARRAY则转到:error
3724  如果subprog_cnt大于1则
3725  verbose(env, "tail_calls are not allowed in programs with bpf-to-bpf calls\n")
3726  返回:负EINVAL
3728  退出
3729  :func_id恒等于BPF_FUNC_perf_event_read
3730  :func_id恒等于BPF_FUNC_perf_event_output
3731  :func_id恒等于BPF_FUNC_perf_event_read_value
3733  如果map_type不等于BPF_MAP_TYPE_PERF_EVENT_ARRAY则转到:error
3735  退出
3737  如果map_type不等于BPF_MAP_TYPE_STACK_TRACE则转到:error
3739  退出
3740  :func_id恒等于BPF_FUNC_current_task_under_cgroup
3742  如果map_type不等于BPF_MAP_TYPE_CGROUP_ARRAY则转到:error
3744  退出
3751  退出
3752  :func_id恒等于BPF_FUNC_sk_redirect_map
3753  :func_id恒等于BPF_FUNC_msg_redirect_map
3755  如果map_type不等于BPF_MAP_TYPE_SOCKMAP则转到:error
3757  退出
3758  :func_id恒等于BPF_FUNC_sk_redirect_hash
3759  :func_id恒等于BPF_FUNC_msg_redirect_hash
3761  如果map_type不等于BPF_MAP_TYPE_SOCKHASH则转到:error
3763  退出
3768  退出
3770  如果map_type不等于BPF_MAP_TYPE_REUSEPORT_SOCKARRAY则转到:error
3772  退出
3773  :func_id恒等于BPF_FUNC_map_peek_elem
3774  :func_id恒等于BPF_FUNC_map_pop_elem
3776  如果map_type不等于BPF_MAP_TYPE_QUEUEmap_type不等于BPF_MAP_TYPE_STACK则转到:error
3779  退出
3780  :func_id恒等于BPF_FUNC_sk_storage_get
3782  如果map_type不等于BPF_MAP_TYPE_SK_STORAGE则转到:error
3784  退出
3785  默认
3786  退出
3789  返回:0
3790  error :
3791  verbose(env, "cannot pass map_type %d into func %s#%d\n", map_type, func_id_name(func_id), func_id)
3793  返回:负EINVAL
调用者
名称描述
check_helper_call