Function report |
Source Code:kernel\bpf\verifier.c |
Create Date:2022-07-28 12:59:21 |
| Last Modify:2022-05-19 20:02:10 | Copyright©Brick |
| home page | Tree |
| Annotation kernel can get tool activity | Download SCCT | Chinese |
Name:check_map_func_compatibility
Proto:static int check_map_func_compatibility(struct bpf_verifier_env *env, struct bpf_map *map, int func_id)
Type:int
Parameter:
| Type | Parameter | Name |
|---|---|---|
| struct bpf_verifier_env * | env | |
| struct bpf_map * | map | |
| int | func_id |
| 3632 | If Not map Then Return 0 |
| 3637 | Case map_type == BPF_MAP_TYPE_PROG_ARRAY |
| 3638 | If func_id != BPF_FUNC_tail_call Then Go to error |
| 3640 | Break |
| 3641 | Case map_type == BPF_MAP_TYPE_PERF_EVENT_ARRAY |
| 3642 | If func_id != BPF_FUNC_perf_event_read && func_id != BPF_FUNC_perf_event_output && func_id != BPF_FUNC_skb_output && func_id != BPF_FUNC_perf_event_read_value Then Go to error |
| 3647 | Break |
| 3648 | Case map_type == BPF_MAP_TYPE_STACK_TRACE |
| 3649 | If func_id != BPF_FUNC_get_stackid Then Go to error |
| 3651 | Break |
| 3652 | Case map_type == BPF_MAP_TYPE_CGROUP_ARRAY |
| 3653 | If func_id != BPF_FUNC_skb_under_cgroup && func_id != BPF_FUNC_current_task_under_cgroup Then Go to error |
| 3656 | Break |
| 3657 | Case map_type == BPF_MAP_TYPE_CGROUP_STORAGE |
| 3658 | Case map_type == BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE |
| 3659 | If func_id != BPF_FUNC_get_local_storage Then Go to error |
| 3661 | Break |
| 3662 | Case map_type == BPF_MAP_TYPE_DEVMAP |
| 3663 | Case map_type == BPF_MAP_TYPE_DEVMAP_HASH |
| 3664 | If func_id != BPF_FUNC_redirect_map && func_id != BPF_FUNC_map_lookup_elem Then Go to error |
| 3667 | Break |
| 3671 | Case map_type == BPF_MAP_TYPE_CPUMAP |
| 3672 | If func_id != BPF_FUNC_redirect_map Then Go to error |
| 3674 | Break |
| 3675 | Case map_type == BPF_MAP_TYPE_XSKMAP |
| 3676 | If func_id != BPF_FUNC_redirect_map && func_id != BPF_FUNC_map_lookup_elem Then Go to error |
| 3679 | Break |
| 3680 | Case map_type == BPF_MAP_TYPE_ARRAY_OF_MAPS |
| 3681 | Case map_type == BPF_MAP_TYPE_HASH_OF_MAPS |
| 3682 | If func_id != BPF_FUNC_map_lookup_elem Then Go to error |
| 3684 | Break |
| 3685 | Case map_type == BPF_MAP_TYPE_SOCKMAP |
| 3686 | If func_id != BPF_FUNC_sk_redirect_map && func_id != BPF_FUNC_sock_map_update && func_id != BPF_FUNC_map_delete_elem && func_id != BPF_FUNC_msg_redirect_map Then Go to error |
| 3691 | Break |
| 3692 | Case map_type == BPF_MAP_TYPE_SOCKHASH |
| 3693 | If func_id != BPF_FUNC_sk_redirect_hash && func_id != BPF_FUNC_sock_hash_update && func_id != BPF_FUNC_map_delete_elem && func_id != BPF_FUNC_msg_redirect_hash Then Go to error |
| 3698 | Break |
| 3699 | Case map_type == BPF_MAP_TYPE_REUSEPORT_SOCKARRAY |
| 3700 | If func_id != BPF_FUNC_sk_select_reuseport Then Go to error |
| 3702 | Break |
| 3703 | Case map_type == BPF_MAP_TYPE_QUEUE |
| 3704 | Case map_type == BPF_MAP_TYPE_STACK |
| 3705 | If func_id != BPF_FUNC_map_peek_elem && func_id != BPF_FUNC_map_pop_elem && func_id != BPF_FUNC_map_push_elem Then Go to error |
| 3709 | Break |
| 3710 | Case map_type == BPF_MAP_TYPE_SK_STORAGE |
| 3711 | If func_id != BPF_FUNC_sk_storage_get && func_id != BPF_FUNC_sk_storage_delete Then Go to error |
| 3714 | Break |
| 3715 | Default |
| 3716 | Break |
| 3721 | Case func_id == BPF_FUNC_tail_call |
| 3722 | If map_type != BPF_MAP_TYPE_PROG_ARRAY Then Go to error |
| 3724 | If subprog_cnt > 1 Then |
| 3726 | Return -EINVAL |
| 3728 | Break |
| 3729 | Case func_id == BPF_FUNC_perf_event_read |
| 3730 | Case func_id == BPF_FUNC_perf_event_output |
| 3731 | Case func_id == BPF_FUNC_perf_event_read_value |
| 3732 | Case func_id == BPF_FUNC_skb_output |
| 3733 | If map_type != BPF_MAP_TYPE_PERF_EVENT_ARRAY Then Go to error |
| 3735 | Break |
| 3736 | Case func_id == BPF_FUNC_get_stackid |
| 3737 | If map_type != BPF_MAP_TYPE_STACK_TRACE Then Go to error |
| 3739 | Break |
| 3740 | Case func_id == BPF_FUNC_current_task_under_cgroup |
| 3741 | Case func_id == BPF_FUNC_skb_under_cgroup |
| 3742 | If map_type != BPF_MAP_TYPE_CGROUP_ARRAY Then Go to error |
| 3744 | Break |
| 3745 | Case func_id == BPF_FUNC_redirect_map |
| 3746 | If map_type != BPF_MAP_TYPE_DEVMAP && map_type != BPF_MAP_TYPE_DEVMAP_HASH && map_type != BPF_MAP_TYPE_CPUMAP && map_type != BPF_MAP_TYPE_XSKMAP Then Go to error |
| 3751 | Break |
| 3752 | Case func_id == BPF_FUNC_sk_redirect_map |
| 3753 | Case func_id == BPF_FUNC_msg_redirect_map |
| 3754 | Case func_id == BPF_FUNC_sock_map_update |
| 3755 | If map_type != BPF_MAP_TYPE_SOCKMAP Then Go to error |
| 3757 | Break |
| 3758 | Case func_id == BPF_FUNC_sk_redirect_hash |
| 3759 | Case func_id == BPF_FUNC_msg_redirect_hash |
| 3760 | Case func_id == BPF_FUNC_sock_hash_update |
| 3761 | If map_type != BPF_MAP_TYPE_SOCKHASH Then Go to error |
| 3763 | Break |
| 3764 | Case func_id == BPF_FUNC_get_local_storage |
| 3765 | If map_type != BPF_MAP_TYPE_CGROUP_STORAGE && map_type != BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE Then Go to error |
| 3768 | Break |
| 3769 | Case func_id == BPF_FUNC_sk_select_reuseport |
| 3770 | If map_type != BPF_MAP_TYPE_REUSEPORT_SOCKARRAY Then Go to error |
| 3772 | Break |
| 3773 | Case func_id == BPF_FUNC_map_peek_elem |
| 3774 | Case func_id == BPF_FUNC_map_pop_elem |
| 3775 | Case func_id == BPF_FUNC_map_push_elem |
| 3776 | If map_type != BPF_MAP_TYPE_QUEUE && map_type != BPF_MAP_TYPE_STACK Then Go to error |
| 3779 | Break |
| 3780 | Case func_id == BPF_FUNC_sk_storage_get |
| 3781 | Case func_id == BPF_FUNC_sk_storage_delete |
| 3782 | If map_type != BPF_MAP_TYPE_SK_STORAGE Then Go to error |
| 3784 | Break |
| 3785 | Default |
| 3786 | Break |
| 3789 | Return 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 | Return -EINVAL |
| Name | Describe |
|---|---|
| check_helper_call |
| Source code conversion tool public plug-in interface | X |
|---|---|
| Support c/c++/esqlc/java Oracle/Informix/Mysql Plug-in can realize: logical Report Code generation and batch code conversion |