| Function report | 
| Source Code: kernel\bpf\verifier.c | Create Date:2022-07-28 13:04:02 | 
| Last Modify:2022-05-19 20:02:10 | Copyright©Brick | 
| home page | Tree | 
| Annotation kernel can get tool activity | Download SCCT | Chinese | 
Name:look for pseudo eBPF instructions that access map FDs and* replace them with actual map pointers
Proto:static int replace_map_fd_with_map_ptr(struct bpf_verifier_env *env)
Type:int
Parameter:
| Type | Parameter | Name | 
|---|---|---|
| struct bpf_verifier_env * | env | 
| 8167 | insn_cnt = Number of filter blocks | 
| 8175 | If Instruction classes ( opcode ) == BPF_LDX && ( BPF BPF_DW 0x18 64-bit ( opcode ) != BPF_MEM || signed immediate constant != 0 ) Then | 
| 8181 | If Instruction classes ( opcode ) == BPF_STX && ( BPF BPF_DW 0x18 64-bit ( opcode ) != BPF_MEM && BPF BPF_DW 0x18 64-bit ( opcode ) != xclusive add || signed immediate constant != 0 ) Then | 
| 8188 | If opcode == ( BPF_LD | BPF_IMM | double word (64-bit) ) Then | 
| 8194 | If i == insn_cnt - 1 || opcode != 0 || dest register != 0 || source register != 0 || signed offset != 0 Then | 
| 8201 | If source register == 0 Then Go to next_insn | 
| 8208 | If source register != When BPF ldimm64's insn[0] && source register != BPF_PSEUDO_MAP_VALUE || source register == When BPF ldimm64's insn[0] && signed immediate constant != 0 Then | 
| 8217 | f = fdget( signed immediate constant ) | 
| 8218 | map = error is returned, fd is released.* On success caller should complete fd access with matching fdput() | 
| 8220 | verbose(env, "fd %d is not pointing to valid bpf_map\n", signed immediate constant ) | 
| 8226 | If err Then | 
| 8231 | aux = array of per-insn state [i] | 
| 8232 | If source register == When BPF ldimm64's insn[0] Then | 
| 8234 | Else | 
| 8235 | off = signed immediate constant | 
| 8240 | Return -EINVAL | 
| 8243 | If Not map_direct_value_addr Then | 
| 8246 | Return -EINVAL | 
| 8249 | err = map_direct_value_addr(map, & addr, off) | 
| 8250 | If err Then | 
| 8251 | verbose(env, "invalid access to map value pointer, value_size=%u off=%u\n", value_size, off) | 
| 8254 | Return err | 
| 8261 | signed immediate constant = addr | 
| 8262 | signed immediate constant = addr >> 32 | 
| 8265 | When j < umber of used maps cycle | 
| 8266 | If array of map's used by eBPF program [j] == map Then | 
| 8273 | If umber of used maps >= max number of maps accessed by one eBPF program Then | 
| 8283 | bpf_map_inc(map) | 
| 8286 | array of map's used by eBPF program [umber of used maps ++] = map | 
| 8288 | If bpf_map_is_cgroup_storage(map) && bpf_cgroup_storage_assign( Auxiliary fields , map) Then | 
| 8292 | Return -EBUSY | 
| 8296 | next_insn : | 
| 8297 | insn++ | 
| 8298 | i++ | 
| 8299 | Continue | 
| 8303 | If Not bpf_opcode_in_insntable( opcode ) Then | 
| 8313 | Return 0 | 
| Name | Describe | 
|---|---|
| bpf_check | 
| 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 |