13d0407baSopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 23d0407baSopenharmony_ci/* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com 33d0407baSopenharmony_ci */ 43d0407baSopenharmony_ci#ifndef _LINUX_BPF_H 53d0407baSopenharmony_ci#define _LINUX_BPF_H 1 63d0407baSopenharmony_ci 73d0407baSopenharmony_ci#include <uapi/linux/bpf.h> 83d0407baSopenharmony_ci 93d0407baSopenharmony_ci#include <linux/workqueue.h> 103d0407baSopenharmony_ci#include <linux/file.h> 113d0407baSopenharmony_ci#include <linux/percpu.h> 123d0407baSopenharmony_ci#include <linux/err.h> 133d0407baSopenharmony_ci#include <linux/rbtree_latch.h> 143d0407baSopenharmony_ci#include <linux/numa.h> 153d0407baSopenharmony_ci#include <linux/mm_types.h> 163d0407baSopenharmony_ci#include <linux/wait.h> 173d0407baSopenharmony_ci#include <linux/u64_stats_sync.h> 183d0407baSopenharmony_ci#include <linux/refcount.h> 193d0407baSopenharmony_ci#include <linux/mutex.h> 203d0407baSopenharmony_ci#include <linux/module.h> 213d0407baSopenharmony_ci#include <linux/kallsyms.h> 223d0407baSopenharmony_ci#include <linux/capability.h> 233d0407baSopenharmony_ci#include <linux/percpu-refcount.h> 243d0407baSopenharmony_ci 253d0407baSopenharmony_ci#define BPF_TWO 2 263d0407baSopenharmony_ci 273d0407baSopenharmony_cistruct bpf_verifier_env; 283d0407baSopenharmony_cistruct bpf_verifier_log; 293d0407baSopenharmony_cistruct perf_event; 303d0407baSopenharmony_cistruct bpf_prog; 313d0407baSopenharmony_cistruct bpf_prog_aux; 323d0407baSopenharmony_cistruct bpf_map; 333d0407baSopenharmony_cistruct sock; 343d0407baSopenharmony_cistruct seq_file; 353d0407baSopenharmony_cistruct btf; 363d0407baSopenharmony_cistruct btf_type; 373d0407baSopenharmony_cistruct exception_table_entry; 383d0407baSopenharmony_cistruct seq_operations; 393d0407baSopenharmony_cistruct bpf_iter_aux_info; 403d0407baSopenharmony_cistruct bpf_local_storage; 413d0407baSopenharmony_cistruct bpf_local_storage_map; 423d0407baSopenharmony_ci 433d0407baSopenharmony_ciextern struct idr btf_idr; 443d0407baSopenharmony_ciextern spinlock_t btf_idr_lock; 453d0407baSopenharmony_ci 463d0407baSopenharmony_citypedef int (*bpf_iter_init_seq_priv_t)(void *private_data, struct bpf_iter_aux_info *aux); 473d0407baSopenharmony_citypedef void (*bpf_iter_fini_seq_priv_t)(void *private_data); 483d0407baSopenharmony_cistruct bpf_iter_seq_info { 493d0407baSopenharmony_ci const struct seq_operations *seq_ops; 503d0407baSopenharmony_ci bpf_iter_init_seq_priv_t init_seq_private; 513d0407baSopenharmony_ci bpf_iter_fini_seq_priv_t fini_seq_private; 523d0407baSopenharmony_ci u32 seq_priv_size; 533d0407baSopenharmony_ci}; 543d0407baSopenharmony_ci 553d0407baSopenharmony_ci/* map is generic key/value storage optionally accesible by eBPF programs */ 563d0407baSopenharmony_cistruct bpf_map_ops { 573d0407baSopenharmony_ci /* funcs callable from userspace (via syscall) */ 583d0407baSopenharmony_ci int (*map_alloc_check)(union bpf_attr *attr); 593d0407baSopenharmony_ci struct bpf_map *(*map_alloc)(union bpf_attr *attr); 603d0407baSopenharmony_ci void (*map_release)(struct bpf_map *map, struct file *map_file); 613d0407baSopenharmony_ci void (*map_free)(struct bpf_map *map); 623d0407baSopenharmony_ci int (*map_get_next_key)(struct bpf_map *map, void *key, void *next_key); 633d0407baSopenharmony_ci void (*map_release_uref)(struct bpf_map *map); 643d0407baSopenharmony_ci void *(*map_lookup_elem_sys_only)(struct bpf_map *map, void *key); 653d0407baSopenharmony_ci int (*map_lookup_batch)(struct bpf_map *map, const union bpf_attr *attr, union bpf_attr __user *uattr); 663d0407baSopenharmony_ci int (*map_lookup_and_delete_batch)(struct bpf_map *map, const union bpf_attr *attr, union bpf_attr __user *uattr); 673d0407baSopenharmony_ci int (*map_update_batch)(struct bpf_map *map, const union bpf_attr *attr, union bpf_attr __user *uattr); 683d0407baSopenharmony_ci int (*map_delete_batch)(struct bpf_map *map, const union bpf_attr *attr, union bpf_attr __user *uattr); 693d0407baSopenharmony_ci 703d0407baSopenharmony_ci /* funcs callable from userspace and from eBPF programs */ 713d0407baSopenharmony_ci void *(*map_lookup_elem)(struct bpf_map *map, void *key); 723d0407baSopenharmony_ci int (*map_update_elem)(struct bpf_map *map, void *key, void *value, u64 flags); 733d0407baSopenharmony_ci int (*map_delete_elem)(struct bpf_map *map, void *key); 743d0407baSopenharmony_ci int (*map_push_elem)(struct bpf_map *map, void *value, u64 flags); 753d0407baSopenharmony_ci int (*map_pop_elem)(struct bpf_map *map, void *value); 763d0407baSopenharmony_ci int (*map_peek_elem)(struct bpf_map *map, void *value); 773d0407baSopenharmony_ci 783d0407baSopenharmony_ci /* funcs called by prog_array and perf_event_array map */ 793d0407baSopenharmony_ci void *(*map_fd_get_ptr)(struct bpf_map *map, struct file *map_file, int fd); 803d0407baSopenharmony_ci void (*map_fd_put_ptr)(void *ptr); 813d0407baSopenharmony_ci int (*map_gen_lookup)(struct bpf_map *map, struct bpf_insn *insn_buf); 823d0407baSopenharmony_ci u32 (*map_fd_sys_lookup_elem)(void *ptr); 833d0407baSopenharmony_ci void (*map_seq_show_elem)(struct bpf_map *map, void *key, struct seq_file *m); 843d0407baSopenharmony_ci int (*map_check_btf)(const struct bpf_map *map, const struct btf *btf, const struct btf_type *key_type, 853d0407baSopenharmony_ci const struct btf_type *value_type); 863d0407baSopenharmony_ci 873d0407baSopenharmony_ci /* Prog poke tracking helpers. */ 883d0407baSopenharmony_ci int (*map_poke_track)(struct bpf_map *map, struct bpf_prog_aux *aux); 893d0407baSopenharmony_ci void (*map_poke_untrack)(struct bpf_map *map, struct bpf_prog_aux *aux); 903d0407baSopenharmony_ci void (*map_poke_run)(struct bpf_map *map, u32 key, struct bpf_prog *old, struct bpf_prog *new); 913d0407baSopenharmony_ci 923d0407baSopenharmony_ci /* Direct value access helpers. */ 933d0407baSopenharmony_ci int (*map_direct_value_addr)(const struct bpf_map *map, u64 *imm, u32 off); 943d0407baSopenharmony_ci int (*map_direct_value_meta)(const struct bpf_map *map, u64 imm, u32 *off); 953d0407baSopenharmony_ci int (*map_mmap)(struct bpf_map *map, struct vm_area_struct *vma); 963d0407baSopenharmony_ci __poll_t (*map_poll)(struct bpf_map *map, struct file *filp, struct poll_table_struct *pts); 973d0407baSopenharmony_ci 983d0407baSopenharmony_ci /* Functions called by bpf_local_storage maps */ 993d0407baSopenharmony_ci int (*map_local_storage_charge)(struct bpf_local_storage_map *smap, void *owner, u32 size); 1003d0407baSopenharmony_ci void (*map_local_storage_uncharge)(struct bpf_local_storage_map *smap, void *owner, u32 size); 1013d0407baSopenharmony_ci struct bpf_local_storage __rcu **(*map_owner_storage_ptr)(void *owner); 1023d0407baSopenharmony_ci 1033d0407baSopenharmony_ci /* map_meta_equal must be implemented for maps that can be 1043d0407baSopenharmony_ci * used as an inner map. It is a runtime check to ensure 1053d0407baSopenharmony_ci * an inner map can be inserted to an outer map. 1063d0407baSopenharmony_ci * 1073d0407baSopenharmony_ci * Some properties of the inner map has been used during the 1083d0407baSopenharmony_ci * verification time. When inserting an inner map at the runtime, 1093d0407baSopenharmony_ci * map_meta_equal has to ensure the inserting map has the same 1103d0407baSopenharmony_ci * properties that the verifier has used earlier. 1113d0407baSopenharmony_ci */ 1123d0407baSopenharmony_ci bool (*map_meta_equal)(const struct bpf_map *meta0, const struct bpf_map *meta1); 1133d0407baSopenharmony_ci 1143d0407baSopenharmony_ci /* BTF name and id of struct allocated by map_alloc */ 1153d0407baSopenharmony_ci const char *const map_btf_name; 1163d0407baSopenharmony_ci int *map_btf_id; 1173d0407baSopenharmony_ci 1183d0407baSopenharmony_ci /* bpf_iter info used to open a seq_file */ 1193d0407baSopenharmony_ci const struct bpf_iter_seq_info *iter_seq_info; 1203d0407baSopenharmony_ci}; 1213d0407baSopenharmony_ci 1223d0407baSopenharmony_cistruct bpf_map_memory { 1233d0407baSopenharmony_ci u32 pages; 1243d0407baSopenharmony_ci struct user_struct *user; 1253d0407baSopenharmony_ci}; 1263d0407baSopenharmony_ci 1273d0407baSopenharmony_cistruct bpf_map { 1283d0407baSopenharmony_ci /* The first two cachelines with read-mostly members of which some 1293d0407baSopenharmony_ci * are also accessed in fast-path (e.g. ops, max_entries). 1303d0407baSopenharmony_ci */ 1313d0407baSopenharmony_ci const struct bpf_map_ops *ops ____cacheline_aligned; 1323d0407baSopenharmony_ci struct bpf_map *inner_map_meta; 1333d0407baSopenharmony_ci#ifdef CONFIG_SECURITY 1343d0407baSopenharmony_ci void *security; 1353d0407baSopenharmony_ci#endif 1363d0407baSopenharmony_ci enum bpf_map_type map_type; 1373d0407baSopenharmony_ci u32 key_size; 1383d0407baSopenharmony_ci u32 value_size; 1393d0407baSopenharmony_ci u32 max_entries; 1403d0407baSopenharmony_ci u32 map_flags; 1413d0407baSopenharmony_ci int spin_lock_off; /* >=0 valid offset, <0 error */ 1423d0407baSopenharmony_ci u32 id; 1433d0407baSopenharmony_ci int numa_node; 1443d0407baSopenharmony_ci u32 btf_key_type_id; 1453d0407baSopenharmony_ci u32 btf_value_type_id; 1463d0407baSopenharmony_ci struct btf *btf; 1473d0407baSopenharmony_ci struct bpf_map_memory memory; 1483d0407baSopenharmony_ci char name[BPF_OBJ_NAME_LEN]; 1493d0407baSopenharmony_ci u32 btf_vmlinux_value_type_id; 1503d0407baSopenharmony_ci bool bypass_spec_v1; 1513d0407baSopenharmony_ci bool frozen; /* write-once; write-protected by freeze_mutex */ 1523d0407baSopenharmony_ci /* 22 bytes hole */ 1533d0407baSopenharmony_ci 1543d0407baSopenharmony_ci /* The 3rd and 4th cacheline with misc members to avoid false sharing 1553d0407baSopenharmony_ci * particularly with refcounting. 1563d0407baSopenharmony_ci */ 1573d0407baSopenharmony_ci atomic64_t refcnt ____cacheline_aligned; 1583d0407baSopenharmony_ci atomic64_t usercnt; 1593d0407baSopenharmony_ci struct work_struct work; 1603d0407baSopenharmony_ci struct mutex freeze_mutex; 1613d0407baSopenharmony_ci u64 writecnt; /* writable mmap cnt; protected by freeze_mutex */ 1623d0407baSopenharmony_ci}; 1633d0407baSopenharmony_ci 1643d0407baSopenharmony_cistatic inline bool map_value_has_spin_lock(const struct bpf_map *map) 1653d0407baSopenharmony_ci{ 1663d0407baSopenharmony_ci return map->spin_lock_off >= 0; 1673d0407baSopenharmony_ci} 1683d0407baSopenharmony_ci 1693d0407baSopenharmony_cistatic inline void check_and_init_map_lock(struct bpf_map *map, void *dst) 1703d0407baSopenharmony_ci{ 1713d0407baSopenharmony_ci if (likely(!map_value_has_spin_lock(map))) { 1723d0407baSopenharmony_ci return; 1733d0407baSopenharmony_ci } 1743d0407baSopenharmony_ci *(struct bpf_spin_lock *)(dst + map->spin_lock_off) = (struct bpf_spin_lock) {}; 1753d0407baSopenharmony_ci} 1763d0407baSopenharmony_ci 1773d0407baSopenharmony_ci/* copy everything but bpf_spin_lock */ 1783d0407baSopenharmony_cistatic inline void copy_map_value(struct bpf_map *map, void *dst, void *src) 1793d0407baSopenharmony_ci{ 1803d0407baSopenharmony_ci if (unlikely(map_value_has_spin_lock(map))) { 1813d0407baSopenharmony_ci u32 off = map->spin_lock_off; 1823d0407baSopenharmony_ci 1833d0407baSopenharmony_ci memcpy(dst, src, off); 1843d0407baSopenharmony_ci memcpy(dst + off + sizeof(struct bpf_spin_lock), src + off + sizeof(struct bpf_spin_lock), 1853d0407baSopenharmony_ci map->value_size - off - sizeof(struct bpf_spin_lock)); 1863d0407baSopenharmony_ci } else { 1873d0407baSopenharmony_ci memcpy(dst, src, map->value_size); 1883d0407baSopenharmony_ci } 1893d0407baSopenharmony_ci} 1903d0407baSopenharmony_civoid copy_map_value_locked(struct bpf_map *map, void *dst, void *src, bool lock_src); 1913d0407baSopenharmony_ciint bpf_obj_name_cpy(char *dst, const char *src, unsigned int size); 1923d0407baSopenharmony_ci 1933d0407baSopenharmony_cistruct bpf_offload_dev; 1943d0407baSopenharmony_cistruct bpf_offloaded_map; 1953d0407baSopenharmony_ci 1963d0407baSopenharmony_cistruct bpf_map_dev_ops { 1973d0407baSopenharmony_ci int (*map_get_next_key)(struct bpf_offloaded_map *map, void *key, void *next_key); 1983d0407baSopenharmony_ci int (*map_lookup_elem)(struct bpf_offloaded_map *map, void *key, void *value); 1993d0407baSopenharmony_ci int (*map_update_elem)(struct bpf_offloaded_map *map, void *key, void *value, u64 flags); 2003d0407baSopenharmony_ci int (*map_delete_elem)(struct bpf_offloaded_map *map, void *key); 2013d0407baSopenharmony_ci}; 2023d0407baSopenharmony_ci 2033d0407baSopenharmony_cistruct bpf_offloaded_map { 2043d0407baSopenharmony_ci struct bpf_map map; 2053d0407baSopenharmony_ci struct net_device *netdev; 2063d0407baSopenharmony_ci const struct bpf_map_dev_ops *dev_ops; 2073d0407baSopenharmony_ci void *dev_priv; 2083d0407baSopenharmony_ci struct list_head offloads; 2093d0407baSopenharmony_ci}; 2103d0407baSopenharmony_ci 2113d0407baSopenharmony_cistatic inline struct bpf_offloaded_map *map_to_offmap(struct bpf_map *map) 2123d0407baSopenharmony_ci{ 2133d0407baSopenharmony_ci return container_of(map, struct bpf_offloaded_map, map); 2143d0407baSopenharmony_ci} 2153d0407baSopenharmony_ci 2163d0407baSopenharmony_cistatic inline bool bpf_map_offload_neutral(const struct bpf_map *map) 2173d0407baSopenharmony_ci{ 2183d0407baSopenharmony_ci return map->map_type == BPF_MAP_TYPE_PERF_EVENT_ARRAY; 2193d0407baSopenharmony_ci} 2203d0407baSopenharmony_ci 2213d0407baSopenharmony_cistatic inline bool bpf_map_support_seq_show(const struct bpf_map *map) 2223d0407baSopenharmony_ci{ 2233d0407baSopenharmony_ci return (map->btf_value_type_id || map->btf_vmlinux_value_type_id) && map->ops->map_seq_show_elem; 2243d0407baSopenharmony_ci} 2253d0407baSopenharmony_ci 2263d0407baSopenharmony_ciint map_check_no_btf(const struct bpf_map *map, const struct btf *btf, const struct btf_type *key_type, 2273d0407baSopenharmony_ci const struct btf_type *value_type); 2283d0407baSopenharmony_ci 2293d0407baSopenharmony_cibool bpf_map_meta_equal(const struct bpf_map *meta0, const struct bpf_map *meta1); 2303d0407baSopenharmony_ci 2313d0407baSopenharmony_ciextern const struct bpf_map_ops bpf_map_offload_ops; 2323d0407baSopenharmony_ci 2333d0407baSopenharmony_ci/* bpf_type_flag contains a set of flags that are applicable to the values of 2343d0407baSopenharmony_ci * arg_type, ret_type and reg_type. For example, a pointer value may be null, 2353d0407baSopenharmony_ci * or a memory is read-only. We classify types into two categories: base types 2363d0407baSopenharmony_ci * and extended types. Extended types are base types combined with a type flag. 2373d0407baSopenharmony_ci * 2383d0407baSopenharmony_ci * Currently there are no more than 32 base types in arg_type, ret_type and 2393d0407baSopenharmony_ci * reg_types. 2403d0407baSopenharmony_ci */ 2413d0407baSopenharmony_ci#define BPF_BASE_TYPE_BITS 8 2423d0407baSopenharmony_ci 2433d0407baSopenharmony_cienum bpf_type_flag { 2443d0407baSopenharmony_ci /* PTR may be NULL. */ 2453d0407baSopenharmony_ci PTR_MAYBE_NULL = BIT(0 + BPF_BASE_TYPE_BITS), 2463d0407baSopenharmony_ci 2473d0407baSopenharmony_ci /* MEM is read-only. When applied on bpf_arg, it indicates the arg is 2483d0407baSopenharmony_ci * compatible with both mutable and immutable memory. 2493d0407baSopenharmony_ci */ 2503d0407baSopenharmony_ci MEM_RDONLY = BIT(1 + BPF_BASE_TYPE_BITS), 2513d0407baSopenharmony_ci 2523d0407baSopenharmony_ci /* MEM was "allocated" from a different helper, and cannot be mixed 2533d0407baSopenharmony_ci * with regular non-MEM_ALLOC'ed MEM types. 2543d0407baSopenharmony_ci */ 2553d0407baSopenharmony_ci MEM_ALLOC = BIT(2 + BPF_BASE_TYPE_BITS), 2563d0407baSopenharmony_ci 2573d0407baSopenharmony_ci __BPF_TYPE_LAST_FLAG = MEM_ALLOC, 2583d0407baSopenharmony_ci}; 2593d0407baSopenharmony_ci 2603d0407baSopenharmony_ci/* Max number of base types. */ 2613d0407baSopenharmony_ci#define BPF_BASE_TYPE_LIMIT (1UL << BPF_BASE_TYPE_BITS) 2623d0407baSopenharmony_ci 2633d0407baSopenharmony_ci/* Max number of all types. */ 2643d0407baSopenharmony_ci#define BPF_TYPE_LIMIT (__BPF_TYPE_LAST_FLAG | (__BPF_TYPE_LAST_FLAG - 1)) 2653d0407baSopenharmony_ci 2663d0407baSopenharmony_ci/* function argument constraints */ 2673d0407baSopenharmony_cienum bpf_arg_type { 2683d0407baSopenharmony_ci ARG_DONTCARE = 0, /* unused argument in helper function */ 2693d0407baSopenharmony_ci 2703d0407baSopenharmony_ci /* the following constraints used to prototype 2713d0407baSopenharmony_ci * bpf_map_lookup/update/delete_elem() functions 2723d0407baSopenharmony_ci */ 2733d0407baSopenharmony_ci ARG_CONST_MAP_PTR, /* const argument used as pointer to bpf_map */ 2743d0407baSopenharmony_ci ARG_PTR_TO_MAP_KEY, /* pointer to stack used as map key */ 2753d0407baSopenharmony_ci ARG_PTR_TO_MAP_VALUE, /* pointer to stack used as map value */ 2763d0407baSopenharmony_ci ARG_PTR_TO_UNINIT_MAP_VALUE, /* pointer to valid memory used to store a map value */ 2773d0407baSopenharmony_ci 2783d0407baSopenharmony_ci /* the following constraints used to prototype bpf_memcmp() and other 2793d0407baSopenharmony_ci * functions that access data on eBPF program stack 2803d0407baSopenharmony_ci */ 2813d0407baSopenharmony_ci ARG_PTR_TO_MEM, /* pointer to valid memory (stack, packet, map value) */ 2823d0407baSopenharmony_ci ARG_PTR_TO_UNINIT_MEM, /* pointer to memory does not need to be initialized, 2833d0407baSopenharmony_ci * helper function must fill all bytes or clear 2843d0407baSopenharmony_ci * them in error case. 2853d0407baSopenharmony_ci */ 2863d0407baSopenharmony_ci 2873d0407baSopenharmony_ci ARG_CONST_SIZE, /* number of bytes accessed from memory */ 2883d0407baSopenharmony_ci ARG_CONST_SIZE_OR_ZERO, /* number of bytes accessed from memory or 0 */ 2893d0407baSopenharmony_ci 2903d0407baSopenharmony_ci ARG_PTR_TO_CTX, /* pointer to context */ 2913d0407baSopenharmony_ci ARG_ANYTHING, /* any (initialized) argument is ok */ 2923d0407baSopenharmony_ci ARG_PTR_TO_SPIN_LOCK, /* pointer to bpf_spin_lock */ 2933d0407baSopenharmony_ci ARG_PTR_TO_SOCK_COMMON, /* pointer to sock_common */ 2943d0407baSopenharmony_ci ARG_PTR_TO_INT, /* pointer to int */ 2953d0407baSopenharmony_ci ARG_PTR_TO_LONG, /* pointer to long */ 2963d0407baSopenharmony_ci ARG_PTR_TO_SOCKET, /* pointer to bpf_sock (fullsock) */ 2973d0407baSopenharmony_ci ARG_PTR_TO_BTF_ID, /* pointer to in-kernel struct */ 2983d0407baSopenharmony_ci ARG_PTR_TO_ALLOC_MEM, /* pointer to dynamically allocated memory */ 2993d0407baSopenharmony_ci ARG_CONST_ALLOC_SIZE_OR_ZERO, /* number of allocated bytes requested */ 3003d0407baSopenharmony_ci ARG_PTR_TO_BTF_ID_SOCK_COMMON, /* pointer to in-kernel sock_common or bpf-mirrored bpf_sock */ 3013d0407baSopenharmony_ci ARG_PTR_TO_PERCPU_BTF_ID, /* pointer to in-kernel percpu type */ 3023d0407baSopenharmony_ci __BPF_ARG_TYPE_MAX, 3033d0407baSopenharmony_ci 3043d0407baSopenharmony_ci /* Extended arg_types. */ 3053d0407baSopenharmony_ci ARG_PTR_TO_MAP_VALUE_OR_NULL = PTR_MAYBE_NULL | ARG_PTR_TO_MAP_VALUE, 3063d0407baSopenharmony_ci ARG_PTR_TO_MEM_OR_NULL = PTR_MAYBE_NULL | ARG_PTR_TO_MEM, 3073d0407baSopenharmony_ci ARG_PTR_TO_CTX_OR_NULL = PTR_MAYBE_NULL | ARG_PTR_TO_CTX, 3083d0407baSopenharmony_ci ARG_PTR_TO_SOCKET_OR_NULL = PTR_MAYBE_NULL | ARG_PTR_TO_SOCKET, 3093d0407baSopenharmony_ci ARG_PTR_TO_ALLOC_MEM_OR_NULL = PTR_MAYBE_NULL | ARG_PTR_TO_ALLOC_MEM, 3103d0407baSopenharmony_ci 3113d0407baSopenharmony_ci /* This must be the last entry. Its purpose is to ensure the enum is 3123d0407baSopenharmony_ci * wide enough to hold the higher bits reserved for bpf_type_flag. 3133d0407baSopenharmony_ci */ 3143d0407baSopenharmony_ci __BPF_ARG_TYPE_LIMIT = BPF_TYPE_LIMIT, 3153d0407baSopenharmony_ci}; 3163d0407baSopenharmony_cistatic_assert(__BPF_ARG_TYPE_MAX <= BPF_BASE_TYPE_LIMIT); 3173d0407baSopenharmony_ci 3183d0407baSopenharmony_ci/* type of values returned from helper functions */ 3193d0407baSopenharmony_cienum bpf_return_type { 3203d0407baSopenharmony_ci RET_INTEGER, /* function returns integer */ 3213d0407baSopenharmony_ci RET_VOID, /* function doesn't return anything */ 3223d0407baSopenharmony_ci RET_PTR_TO_MAP_VALUE, /* returns a pointer to map elem value */ 3233d0407baSopenharmony_ci RET_PTR_TO_SOCKET, /* returns a pointer to a socket */ 3243d0407baSopenharmony_ci RET_PTR_TO_TCP_SOCK, /* returns a pointer to a tcp_sock */ 3253d0407baSopenharmony_ci RET_PTR_TO_SOCK_COMMON, /* returns a pointer to a sock_common */ 3263d0407baSopenharmony_ci RET_PTR_TO_ALLOC_MEM, /* returns a pointer to dynamically allocated memory */ 3273d0407baSopenharmony_ci RET_PTR_TO_MEM_OR_BTF_ID, /* returns a pointer to a valid memory or a btf_id */ 3283d0407baSopenharmony_ci RET_PTR_TO_BTF_ID, /* returns a pointer to a btf_id */ 3293d0407baSopenharmony_ci __BPF_RET_TYPE_MAX, 3303d0407baSopenharmony_ci 3313d0407baSopenharmony_ci /* Extended ret_types. */ 3323d0407baSopenharmony_ci RET_PTR_TO_MAP_VALUE_OR_NULL = PTR_MAYBE_NULL | RET_PTR_TO_MAP_VALUE, 3333d0407baSopenharmony_ci RET_PTR_TO_SOCKET_OR_NULL = PTR_MAYBE_NULL | RET_PTR_TO_SOCKET, 3343d0407baSopenharmony_ci RET_PTR_TO_TCP_SOCK_OR_NULL = PTR_MAYBE_NULL | RET_PTR_TO_TCP_SOCK, 3353d0407baSopenharmony_ci RET_PTR_TO_SOCK_COMMON_OR_NULL = PTR_MAYBE_NULL | RET_PTR_TO_SOCK_COMMON, 3363d0407baSopenharmony_ci RET_PTR_TO_ALLOC_MEM_OR_NULL = PTR_MAYBE_NULL | MEM_ALLOC | RET_PTR_TO_ALLOC_MEM, 3373d0407baSopenharmony_ci RET_PTR_TO_BTF_ID_OR_NULL = PTR_MAYBE_NULL | RET_PTR_TO_BTF_ID, 3383d0407baSopenharmony_ci 3393d0407baSopenharmony_ci /* This must be the last entry. Its purpose is to ensure the enum is 3403d0407baSopenharmony_ci * wide enough to hold the higher bits reserved for bpf_type_flag. 3413d0407baSopenharmony_ci */ 3423d0407baSopenharmony_ci __BPF_RET_TYPE_LIMIT = BPF_TYPE_LIMIT, 3433d0407baSopenharmony_ci}; 3443d0407baSopenharmony_cistatic_assert(__BPF_RET_TYPE_MAX <= BPF_BASE_TYPE_LIMIT); 3453d0407baSopenharmony_ci 3463d0407baSopenharmony_ci/* eBPF function prototype used by verifier to allow BPF_CALLs from eBPF programs 3473d0407baSopenharmony_ci * to in-kernel helper functions and for adjusting imm32 field in BPF_CALL 3483d0407baSopenharmony_ci * instructions after verifying 3493d0407baSopenharmony_ci */ 3503d0407baSopenharmony_cistruct bpf_func_proto { 3513d0407baSopenharmony_ci u64 (*func)(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5); 3523d0407baSopenharmony_ci bool gpl_only; 3533d0407baSopenharmony_ci bool pkt_access; 3543d0407baSopenharmony_ci enum bpf_return_type ret_type; 3553d0407baSopenharmony_ci union { 3563d0407baSopenharmony_ci struct { 3573d0407baSopenharmony_ci enum bpf_arg_type arg1_type; 3583d0407baSopenharmony_ci enum bpf_arg_type arg2_type; 3593d0407baSopenharmony_ci enum bpf_arg_type arg3_type; 3603d0407baSopenharmony_ci enum bpf_arg_type arg4_type; 3613d0407baSopenharmony_ci enum bpf_arg_type arg5_type; 3623d0407baSopenharmony_ci }; 3633d0407baSopenharmony_ci enum bpf_arg_type arg_type[5]; 3643d0407baSopenharmony_ci }; 3653d0407baSopenharmony_ci union { 3663d0407baSopenharmony_ci struct { 3673d0407baSopenharmony_ci u32 *arg1_btf_id; 3683d0407baSopenharmony_ci u32 *arg2_btf_id; 3693d0407baSopenharmony_ci u32 *arg3_btf_id; 3703d0407baSopenharmony_ci u32 *arg4_btf_id; 3713d0407baSopenharmony_ci u32 *arg5_btf_id; 3723d0407baSopenharmony_ci }; 3733d0407baSopenharmony_ci u32 *arg_btf_id[5]; 3743d0407baSopenharmony_ci }; 3753d0407baSopenharmony_ci int *ret_btf_id; /* return value btf_id */ 3763d0407baSopenharmony_ci bool (*allowed)(const struct bpf_prog *prog); 3773d0407baSopenharmony_ci}; 3783d0407baSopenharmony_ci 3793d0407baSopenharmony_ci/* bpf_context is intentionally undefined structure. Pointer to bpf_context is 3803d0407baSopenharmony_ci * the first argument to eBPF programs. 3813d0407baSopenharmony_ci * For socket filters: 'struct bpf_context *' == 'struct sk_buff *' 3823d0407baSopenharmony_ci */ 3833d0407baSopenharmony_cistruct bpf_context; 3843d0407baSopenharmony_ci 3853d0407baSopenharmony_cienum bpf_access_type { BPF_READ = 1, BPF_WRITE = 2 }; 3863d0407baSopenharmony_ci 3873d0407baSopenharmony_ci/* types of values stored in eBPF registers */ 3883d0407baSopenharmony_ci/* Pointer types represent: 3893d0407baSopenharmony_ci * pointer 3903d0407baSopenharmony_ci * pointer + imm 3913d0407baSopenharmony_ci * pointer + (u16) var 3923d0407baSopenharmony_ci * pointer + (u16) var + imm 3933d0407baSopenharmony_ci * if (range > 0) then [ptr, ptr + range - off) is safe to access 3943d0407baSopenharmony_ci * if (id > 0) means that some 'var' was added 3953d0407baSopenharmony_ci * if (off > 0) means that 'imm' was added 3963d0407baSopenharmony_ci */ 3973d0407baSopenharmony_cienum bpf_reg_type { 3983d0407baSopenharmony_ci NOT_INIT = 0, /* nothing was written into register */ 3993d0407baSopenharmony_ci SCALAR_VALUE, /* reg doesn't contain a valid pointer */ 4003d0407baSopenharmony_ci PTR_TO_CTX, /* reg points to bpf_context */ 4013d0407baSopenharmony_ci CONST_PTR_TO_MAP, /* reg points to struct bpf_map */ 4023d0407baSopenharmony_ci PTR_TO_MAP_VALUE, /* reg points to map element value */ 4033d0407baSopenharmony_ci PTR_TO_STACK, /* reg == frame_pointer + offset */ 4043d0407baSopenharmony_ci PTR_TO_PACKET_META, /* skb->data - meta_len */ 4053d0407baSopenharmony_ci PTR_TO_PACKET, /* reg points to skb->data */ 4063d0407baSopenharmony_ci PTR_TO_PACKET_END, /* skb->data + headlen */ 4073d0407baSopenharmony_ci PTR_TO_FLOW_KEYS, /* reg points to bpf_flow_keys */ 4083d0407baSopenharmony_ci PTR_TO_SOCKET, /* reg points to struct bpf_sock */ 4093d0407baSopenharmony_ci PTR_TO_SOCK_COMMON, /* reg points to sock_common */ 4103d0407baSopenharmony_ci PTR_TO_TCP_SOCK, /* reg points to struct tcp_sock */ 4113d0407baSopenharmony_ci PTR_TO_TP_BUFFER, /* reg points to a writable raw tp's buffer */ 4123d0407baSopenharmony_ci PTR_TO_XDP_SOCK, /* reg points to struct xdp_sock */ 4133d0407baSopenharmony_ci /* PTR_TO_BTF_ID points to a kernel struct that does not need 4143d0407baSopenharmony_ci * to be null checked by the BPF program. This does not imply the 4153d0407baSopenharmony_ci * pointer is _not_ null and in practice this can easily be a null 4163d0407baSopenharmony_ci * pointer when reading pointer chains. The assumption is program 4173d0407baSopenharmony_ci * context will handle null pointer dereference typically via fault 4183d0407baSopenharmony_ci * handling. The verifier must keep this in mind and can make no 4193d0407baSopenharmony_ci * assumptions about null or non-null when doing branch analysis. 4203d0407baSopenharmony_ci * Further, when passed into helpers the helpers can not, without 4213d0407baSopenharmony_ci * additional context, assume the value is non-null. 4223d0407baSopenharmony_ci */ 4233d0407baSopenharmony_ci PTR_TO_BTF_ID, 4243d0407baSopenharmony_ci /* PTR_TO_BTF_ID_OR_NULL points to a kernel struct that has not 4253d0407baSopenharmony_ci * been checked for null. Used primarily to inform the verifier 4263d0407baSopenharmony_ci * an explicit null check is required for this struct. 4273d0407baSopenharmony_ci */ 4283d0407baSopenharmony_ci PTR_TO_MEM, /* reg points to valid memory region */ 4293d0407baSopenharmony_ci PTR_TO_BUF, /* reg points to a read/write buffer */ 4303d0407baSopenharmony_ci PTR_TO_PERCPU_BTF_ID, /* reg points to a percpu kernel variable */ 4313d0407baSopenharmony_ci __BPF_REG_TYPE_MAX, 4323d0407baSopenharmony_ci 4333d0407baSopenharmony_ci /* Extended reg_types. */ 4343d0407baSopenharmony_ci PTR_TO_MAP_VALUE_OR_NULL = PTR_MAYBE_NULL | PTR_TO_MAP_VALUE, 4353d0407baSopenharmony_ci PTR_TO_SOCKET_OR_NULL = PTR_MAYBE_NULL | PTR_TO_SOCKET, 4363d0407baSopenharmony_ci PTR_TO_SOCK_COMMON_OR_NULL = PTR_MAYBE_NULL | PTR_TO_SOCK_COMMON, 4373d0407baSopenharmony_ci PTR_TO_TCP_SOCK_OR_NULL = PTR_MAYBE_NULL | PTR_TO_TCP_SOCK, 4383d0407baSopenharmony_ci PTR_TO_BTF_ID_OR_NULL = PTR_MAYBE_NULL | PTR_TO_BTF_ID, 4393d0407baSopenharmony_ci 4403d0407baSopenharmony_ci /* This must be the last entry. Its purpose is to ensure the enum is 4413d0407baSopenharmony_ci * wide enough to hold the higher bits reserved for bpf_type_flag. 4423d0407baSopenharmony_ci */ 4433d0407baSopenharmony_ci __BPF_REG_TYPE_LIMIT = BPF_TYPE_LIMIT, 4443d0407baSopenharmony_ci}; 4453d0407baSopenharmony_cistatic_assert(__BPF_REG_TYPE_MAX <= BPF_BASE_TYPE_LIMIT); 4463d0407baSopenharmony_ci 4473d0407baSopenharmony_ci/* The information passed from prog-specific *_is_valid_access 4483d0407baSopenharmony_ci * back to the verifier. 4493d0407baSopenharmony_ci */ 4503d0407baSopenharmony_cistruct bpf_insn_access_aux { 4513d0407baSopenharmony_ci enum bpf_reg_type reg_type; 4523d0407baSopenharmony_ci union { 4533d0407baSopenharmony_ci int ctx_field_size; 4543d0407baSopenharmony_ci u32 btf_id; 4553d0407baSopenharmony_ci }; 4563d0407baSopenharmony_ci struct bpf_verifier_log *log; /* for verbose logs */ 4573d0407baSopenharmony_ci}; 4583d0407baSopenharmony_ci 4593d0407baSopenharmony_cistatic inline void bpf_ctx_record_field_size(struct bpf_insn_access_aux *aux, u32 size) 4603d0407baSopenharmony_ci{ 4613d0407baSopenharmony_ci aux->ctx_field_size = size; 4623d0407baSopenharmony_ci} 4633d0407baSopenharmony_ci 4643d0407baSopenharmony_cistruct bpf_prog_ops { 4653d0407baSopenharmony_ci int (*test_run)(struct bpf_prog *prog, const union bpf_attr *kattr, union bpf_attr __user *uattr); 4663d0407baSopenharmony_ci}; 4673d0407baSopenharmony_ci 4683d0407baSopenharmony_cistruct bpf_verifier_ops { 4693d0407baSopenharmony_ci /* return eBPF function prototype for verification */ 4703d0407baSopenharmony_ci const struct bpf_func_proto *(*get_func_proto)(enum bpf_func_id func_id, const struct bpf_prog *prog); 4713d0407baSopenharmony_ci 4723d0407baSopenharmony_ci /* return true if 'size' wide access at offset 'off' within bpf_context 4733d0407baSopenharmony_ci * with 'type' (read or write) is allowed 4743d0407baSopenharmony_ci */ 4753d0407baSopenharmony_ci bool (*is_valid_access)(int off, int size, enum bpf_access_type type, const struct bpf_prog *prog, 4763d0407baSopenharmony_ci struct bpf_insn_access_aux *info); 4773d0407baSopenharmony_ci int (*gen_prologue)(struct bpf_insn *insn, bool direct_write, const struct bpf_prog *prog); 4783d0407baSopenharmony_ci int (*gen_ld_abs)(const struct bpf_insn *orig, struct bpf_insn *insn_buf); 4793d0407baSopenharmony_ci u32 (*convert_ctx_access)(enum bpf_access_type type, const struct bpf_insn *src, struct bpf_insn *dst, 4803d0407baSopenharmony_ci struct bpf_prog *prog, u32 *target_size); 4813d0407baSopenharmony_ci int (*btf_struct_access)(struct bpf_verifier_log *log, const struct btf_type *t, int off, int size, 4823d0407baSopenharmony_ci enum bpf_access_type atype, u32 *next_btf_id); 4833d0407baSopenharmony_ci}; 4843d0407baSopenharmony_ci 4853d0407baSopenharmony_cistruct bpf_prog_offload_ops { 4863d0407baSopenharmony_ci /* verifier basic callbacks */ 4873d0407baSopenharmony_ci int (*insn_hook)(struct bpf_verifier_env *env, int insn_idx, int prev_insn_idx); 4883d0407baSopenharmony_ci int (*finalize)(struct bpf_verifier_env *env); 4893d0407baSopenharmony_ci /* verifier optimization callbacks (called after .finalize) */ 4903d0407baSopenharmony_ci int (*replace_insn)(struct bpf_verifier_env *env, u32 off, struct bpf_insn *insn); 4913d0407baSopenharmony_ci int (*remove_insns)(struct bpf_verifier_env *env, u32 off, u32 cnt); 4923d0407baSopenharmony_ci /* program management callbacks */ 4933d0407baSopenharmony_ci int (*prepare)(struct bpf_prog *prog); 4943d0407baSopenharmony_ci int (*translate)(struct bpf_prog *prog); 4953d0407baSopenharmony_ci void (*destroy)(struct bpf_prog *prog); 4963d0407baSopenharmony_ci}; 4973d0407baSopenharmony_ci 4983d0407baSopenharmony_cistruct bpf_prog_offload { 4993d0407baSopenharmony_ci struct bpf_prog *prog; 5003d0407baSopenharmony_ci struct net_device *netdev; 5013d0407baSopenharmony_ci struct bpf_offload_dev *offdev; 5023d0407baSopenharmony_ci void *dev_priv; 5033d0407baSopenharmony_ci struct list_head offloads; 5043d0407baSopenharmony_ci bool dev_state; 5053d0407baSopenharmony_ci bool opt_failed; 5063d0407baSopenharmony_ci void *jited_image; 5073d0407baSopenharmony_ci u32 jited_len; 5083d0407baSopenharmony_ci}; 5093d0407baSopenharmony_ci 5103d0407baSopenharmony_cienum bpf_cgroup_storage_type { BPF_CGROUP_STORAGE_SHARED, BPF_CGROUP_STORAGE_PERCPU, __BPF_CGROUP_STORAGE_MAX }; 5113d0407baSopenharmony_ci 5123d0407baSopenharmony_ci#define MAX_BPF_CGROUP_STORAGE_TYPE __BPF_CGROUP_STORAGE_MAX 5133d0407baSopenharmony_ci 5143d0407baSopenharmony_ci/* The longest tracepoint has 12 args. 5153d0407baSopenharmony_ci * See include/trace/bpf_probe.h 5163d0407baSopenharmony_ci */ 5173d0407baSopenharmony_ci#define MAX_BPF_FUNC_ARGS 12 5183d0407baSopenharmony_ci 5193d0407baSopenharmony_cistruct bpf_prog_stats { 5203d0407baSopenharmony_ci u64 cnt; 5213d0407baSopenharmony_ci u64 nsecs; 5223d0407baSopenharmony_ci struct u64_stats_sync syncp; 5233d0407baSopenharmony_ci} __aligned(BPF_TWO * sizeof(u64)); 5243d0407baSopenharmony_ci 5253d0407baSopenharmony_cistruct btf_func_model { 5263d0407baSopenharmony_ci u8 ret_size; 5273d0407baSopenharmony_ci u8 nr_args; 5283d0407baSopenharmony_ci u8 arg_size[MAX_BPF_FUNC_ARGS]; 5293d0407baSopenharmony_ci}; 5303d0407baSopenharmony_ci 5313d0407baSopenharmony_ci/* Restore arguments before returning from trampoline to let original function 5323d0407baSopenharmony_ci * continue executing. This flag is used for fentry progs when there are no 5333d0407baSopenharmony_ci * fexit progs. 5343d0407baSopenharmony_ci */ 5353d0407baSopenharmony_ci#define BPF_TRAMP_F_RESTORE_REGS BIT(0) 5363d0407baSopenharmony_ci/* Call original function after fentry progs, but before fexit progs. 5373d0407baSopenharmony_ci * Makes sense for fentry/fexit, normal calls and indirect calls. 5383d0407baSopenharmony_ci */ 5393d0407baSopenharmony_ci#define BPF_TRAMP_F_CALL_ORIG BIT(1) 5403d0407baSopenharmony_ci/* Skip current frame and return to parent. Makes sense for fentry/fexit 5413d0407baSopenharmony_ci * programs only. Should not be used with normal calls and indirect calls. 5423d0407baSopenharmony_ci */ 5433d0407baSopenharmony_ci#define BPF_TRAMP_F_SKIP_FRAME BIT(2) 5443d0407baSopenharmony_ci/* Return the return value of fentry prog. Only used by bpf_struct_ops. */ 5453d0407baSopenharmony_ci#define BPF_TRAMP_F_RET_FENTRY_RET BIT(4) 5463d0407baSopenharmony_ci 5473d0407baSopenharmony_ci/* Each call __bpf_prog_enter + call bpf_func + call __bpf_prog_exit is ~50 5483d0407baSopenharmony_ci * bytes on x86. Pick a number to fit into BPF_IMAGE_SIZE / 2 5493d0407baSopenharmony_ci */ 5503d0407baSopenharmony_ci#define BPF_MAX_TRAMP_PROGS 40 5513d0407baSopenharmony_ci 5523d0407baSopenharmony_cistruct bpf_tramp_progs { 5533d0407baSopenharmony_ci struct bpf_prog *progs[BPF_MAX_TRAMP_PROGS]; 5543d0407baSopenharmony_ci int nr_progs; 5553d0407baSopenharmony_ci}; 5563d0407baSopenharmony_ci 5573d0407baSopenharmony_ci/* Different use cases for BPF trampoline: 5583d0407baSopenharmony_ci * 1. replace nop at the function entry (kprobe equivalent) 5593d0407baSopenharmony_ci * flags = BPF_TRAMP_F_RESTORE_REGS 5603d0407baSopenharmony_ci * fentry = a set of programs to run before returning from trampoline 5613d0407baSopenharmony_ci * 5623d0407baSopenharmony_ci * 2. replace nop at the function entry (kprobe + kretprobe equivalent) 5633d0407baSopenharmony_ci * flags = BPF_TRAMP_F_CALL_ORIG | BPF_TRAMP_F_SKIP_FRAME 5643d0407baSopenharmony_ci * orig_call = fentry_ip + MCOUNT_INSN_SIZE 5653d0407baSopenharmony_ci * fentry = a set of program to run before calling original function 5663d0407baSopenharmony_ci * fexit = a set of program to run after original function 5673d0407baSopenharmony_ci * 5683d0407baSopenharmony_ci * 3. replace direct call instruction anywhere in the function body 5693d0407baSopenharmony_ci * or assign a function pointer for indirect call (like tcp_congestion_ops->cong_avoid) 5703d0407baSopenharmony_ci * With flags = 0 5713d0407baSopenharmony_ci * fentry = a set of programs to run before returning from trampoline 5723d0407baSopenharmony_ci * With flags = BPF_TRAMP_F_CALL_ORIG 5733d0407baSopenharmony_ci * orig_call = original callback addr or direct function addr 5743d0407baSopenharmony_ci * fentry = a set of program to run before calling original function 5753d0407baSopenharmony_ci * fexit = a set of program to run after original function 5763d0407baSopenharmony_ci */ 5773d0407baSopenharmony_cistruct bpf_tramp_image; 5783d0407baSopenharmony_ciint arch_prepare_bpf_trampoline(struct bpf_tramp_image *tr, void *image, void *image_end, 5793d0407baSopenharmony_ci const struct btf_func_model *m, u32 flags, struct bpf_tramp_progs *tprogs, 5803d0407baSopenharmony_ci void *orig_call); 5813d0407baSopenharmony_ci/* these two functions are called from generated trampoline */ 5823d0407baSopenharmony_ciu64 notrace __bpf_prog_enter(void); 5833d0407baSopenharmony_civoid notrace __bpf_prog_exit(struct bpf_prog *prog, u64 start); 5843d0407baSopenharmony_civoid notrace __bpf_prog_enter_sleepable(void); 5853d0407baSopenharmony_civoid notrace __bpf_prog_exit_sleepable(void); 5863d0407baSopenharmony_civoid notrace __bpf_tramp_enter(struct bpf_tramp_image *tr); 5873d0407baSopenharmony_civoid notrace __bpf_tramp_exit(struct bpf_tramp_image *tr); 5883d0407baSopenharmony_ci 5893d0407baSopenharmony_cistruct bpf_ksym { 5903d0407baSopenharmony_ci unsigned long start; 5913d0407baSopenharmony_ci unsigned long end; 5923d0407baSopenharmony_ci char name[KSYM_NAME_LEN]; 5933d0407baSopenharmony_ci struct list_head lnode; 5943d0407baSopenharmony_ci struct latch_tree_node tnode; 5953d0407baSopenharmony_ci bool prog; 5963d0407baSopenharmony_ci}; 5973d0407baSopenharmony_ci 5983d0407baSopenharmony_cienum bpf_tramp_prog_type { 5993d0407baSopenharmony_ci BPF_TRAMP_FENTRY, 6003d0407baSopenharmony_ci BPF_TRAMP_FEXIT, 6013d0407baSopenharmony_ci BPF_TRAMP_MODIFY_RETURN, 6023d0407baSopenharmony_ci BPF_TRAMP_MAX, 6033d0407baSopenharmony_ci BPF_TRAMP_REPLACE, /* more than MAX */ 6043d0407baSopenharmony_ci}; 6053d0407baSopenharmony_ci 6063d0407baSopenharmony_cistruct bpf_tramp_image { 6073d0407baSopenharmony_ci void *image; 6083d0407baSopenharmony_ci struct bpf_ksym ksym; 6093d0407baSopenharmony_ci struct percpu_ref pcref; 6103d0407baSopenharmony_ci void *ip_after_call; 6113d0407baSopenharmony_ci void *ip_epilogue; 6123d0407baSopenharmony_ci union { 6133d0407baSopenharmony_ci struct rcu_head rcu; 6143d0407baSopenharmony_ci struct work_struct work; 6153d0407baSopenharmony_ci }; 6163d0407baSopenharmony_ci}; 6173d0407baSopenharmony_ci 6183d0407baSopenharmony_cistruct bpf_trampoline { 6193d0407baSopenharmony_ci /* hlist for trampoline_table */ 6203d0407baSopenharmony_ci struct hlist_node hlist; 6213d0407baSopenharmony_ci /* serializes access to fields of this trampoline */ 6223d0407baSopenharmony_ci struct mutex mutex; 6233d0407baSopenharmony_ci refcount_t refcnt; 6243d0407baSopenharmony_ci u64 key; 6253d0407baSopenharmony_ci struct { 6263d0407baSopenharmony_ci struct btf_func_model model; 6273d0407baSopenharmony_ci void *addr; 6283d0407baSopenharmony_ci bool ftrace_managed; 6293d0407baSopenharmony_ci } func; 6303d0407baSopenharmony_ci /* if !NULL this is BPF_PROG_TYPE_EXT program that extends another BPF 6313d0407baSopenharmony_ci * program by replacing one of its functions. func.addr is the address 6323d0407baSopenharmony_ci * of the function it replaced. 6333d0407baSopenharmony_ci */ 6343d0407baSopenharmony_ci struct bpf_prog *extension_prog; 6353d0407baSopenharmony_ci /* list of BPF programs using this trampoline */ 6363d0407baSopenharmony_ci struct hlist_head progs_hlist[BPF_TRAMP_MAX]; 6373d0407baSopenharmony_ci /* Number of attached programs. A counter per kind. */ 6383d0407baSopenharmony_ci int progs_cnt[BPF_TRAMP_MAX]; 6393d0407baSopenharmony_ci /* Executable image of trampoline */ 6403d0407baSopenharmony_ci struct bpf_tramp_image *cur_image; 6413d0407baSopenharmony_ci u64 selector; 6423d0407baSopenharmony_ci}; 6433d0407baSopenharmony_ci 6443d0407baSopenharmony_cistruct bpf_attach_target_info { 6453d0407baSopenharmony_ci struct btf_func_model fmodel; 6463d0407baSopenharmony_ci long tgt_addr; 6473d0407baSopenharmony_ci const char *tgt_name; 6483d0407baSopenharmony_ci const struct btf_type *tgt_type; 6493d0407baSopenharmony_ci}; 6503d0407baSopenharmony_ci 6513d0407baSopenharmony_ci#define BPF_DISPATCHER_MAX 48 /* Fits in 2048B */ 6523d0407baSopenharmony_ci 6533d0407baSopenharmony_cistruct bpf_dispatcher_prog { 6543d0407baSopenharmony_ci struct bpf_prog *prog; 6553d0407baSopenharmony_ci refcount_t users; 6563d0407baSopenharmony_ci}; 6573d0407baSopenharmony_ci 6583d0407baSopenharmony_cistruct bpf_dispatcher { 6593d0407baSopenharmony_ci /* dispatcher mutex */ 6603d0407baSopenharmony_ci struct mutex mutex; 6613d0407baSopenharmony_ci void *func; 6623d0407baSopenharmony_ci struct bpf_dispatcher_prog progs[BPF_DISPATCHER_MAX]; 6633d0407baSopenharmony_ci int num_progs; 6643d0407baSopenharmony_ci void *image; 6653d0407baSopenharmony_ci u32 image_off; 6663d0407baSopenharmony_ci struct bpf_ksym ksym; 6673d0407baSopenharmony_ci}; 6683d0407baSopenharmony_ci 6693d0407baSopenharmony_cistatic __always_inline unsigned int bpf_dispatcher_nop_func(const void *ctx, const struct bpf_insn *insnsi, 6703d0407baSopenharmony_ci unsigned int (*bpf_func)(const void *, 6713d0407baSopenharmony_ci const struct bpf_insn *)) 6723d0407baSopenharmony_ci{ 6733d0407baSopenharmony_ci return bpf_func(ctx, insnsi); 6743d0407baSopenharmony_ci} 6753d0407baSopenharmony_ci#ifdef CONFIG_BPF_JIT 6763d0407baSopenharmony_ciint bpf_trampoline_link_prog(struct bpf_prog *prog, struct bpf_trampoline *tr); 6773d0407baSopenharmony_ciint bpf_trampoline_unlink_prog(struct bpf_prog *prog, struct bpf_trampoline *tr); 6783d0407baSopenharmony_cistruct bpf_trampoline *bpf_trampoline_get(u64 key, struct bpf_attach_target_info *tgt_info); 6793d0407baSopenharmony_civoid bpf_trampoline_put(struct bpf_trampoline *tr); 6803d0407baSopenharmony_ci#define BPF_DISPATCHER_INIT(_name) \ 6813d0407baSopenharmony_ci { \ 6823d0407baSopenharmony_ci .mutex = __MUTEX_INITIALIZER(_name.mutex), .func = &_name##_func, .progs = {}, .num_progs = 0, .image = NULL, \ 6833d0407baSopenharmony_ci .image_off = 0, \ 6843d0407baSopenharmony_ci .ksym = { \ 6853d0407baSopenharmony_ci .name = #_name, \ 6863d0407baSopenharmony_ci .lnode = LIST_HEAD_INIT(_name.ksym.lnode), \ 6873d0407baSopenharmony_ci }, \ 6883d0407baSopenharmony_ci } 6893d0407baSopenharmony_ci 6903d0407baSopenharmony_ci#define DEFINE_BPF_DISPATCHER(name) \ 6913d0407baSopenharmony_ci noinline unsigned int bpf_dispatcher_##name##_func( \ 6923d0407baSopenharmony_ci const void *ctx, const struct bpf_insn *insnsi, \ 6933d0407baSopenharmony_ci unsigned int (*bpf_func)(const void *, const struct bpf_insn *)) \ 6943d0407baSopenharmony_ci { \ 6953d0407baSopenharmony_ci return bpf_func(ctx, insnsi); \ 6963d0407baSopenharmony_ci } \ 6973d0407baSopenharmony_ci EXPORT_SYMBOL(bpf_dispatcher_##name##_func); \ 6983d0407baSopenharmony_ci struct bpf_dispatcher bpf_dispatcher_##name = BPF_DISPATCHER_INIT(bpf_dispatcher_##name); 6993d0407baSopenharmony_ci#define DECLARE_BPF_DISPATCHER(name) \ 7003d0407baSopenharmony_ci unsigned int bpf_dispatcher_##name##_func(const void *ctx, const struct bpf_insn *insnsi, \ 7013d0407baSopenharmony_ci unsigned int (*bpf_func)(const void *, const struct bpf_insn *)); \ 7023d0407baSopenharmony_ci extern struct bpf_dispatcher bpf_dispatcher_##name; 7033d0407baSopenharmony_ci#define BPF_DISPATCHER_FUNC(name) bpf_dispatcher_##name##_func 7043d0407baSopenharmony_ci#define BPF_DISPATCHER_PTR(name) (&bpf_dispatcher_##name) 7053d0407baSopenharmony_civoid bpf_dispatcher_change_prog(struct bpf_dispatcher *d, struct bpf_prog *from, struct bpf_prog *to); 7063d0407baSopenharmony_ci/* Called only from JIT-enabled code, so there's no need for stubs. */ 7073d0407baSopenharmony_civoid *bpf_jit_alloc_exec_page(void); 7083d0407baSopenharmony_civoid bpf_image_ksym_add(void *data, struct bpf_ksym *ksym); 7093d0407baSopenharmony_civoid bpf_image_ksym_del(struct bpf_ksym *ksym); 7103d0407baSopenharmony_civoid bpf_ksym_add(struct bpf_ksym *ksym); 7113d0407baSopenharmony_civoid bpf_ksym_del(struct bpf_ksym *ksym); 7123d0407baSopenharmony_ciint bpf_jit_charge_modmem(u32 pages); 7133d0407baSopenharmony_civoid bpf_jit_uncharge_modmem(u32 pages); 7143d0407baSopenharmony_ci#else 7153d0407baSopenharmony_cistatic inline int bpf_trampoline_link_prog(struct bpf_prog *prog, struct bpf_trampoline *tr) 7163d0407baSopenharmony_ci{ 7173d0407baSopenharmony_ci return -ENOTSUPP; 7183d0407baSopenharmony_ci} 7193d0407baSopenharmony_cistatic inline int bpf_trampoline_unlink_prog(struct bpf_prog *prog, struct bpf_trampoline *tr) 7203d0407baSopenharmony_ci{ 7213d0407baSopenharmony_ci return -ENOTSUPP; 7223d0407baSopenharmony_ci} 7233d0407baSopenharmony_cistatic inline struct bpf_trampoline *bpf_trampoline_get(u64 key, struct bpf_attach_target_info *tgt_info) 7243d0407baSopenharmony_ci{ 7253d0407baSopenharmony_ci return ERR_PTR(-EOPNOTSUPP); 7263d0407baSopenharmony_ci} 7273d0407baSopenharmony_cistatic inline void bpf_trampoline_put(struct bpf_trampoline *tr) 7283d0407baSopenharmony_ci{ 7293d0407baSopenharmony_ci} 7303d0407baSopenharmony_ci#define DEFINE_BPF_DISPATCHER(name) 7313d0407baSopenharmony_ci#define DECLARE_BPF_DISPATCHER(name) 7323d0407baSopenharmony_ci#define BPF_DISPATCHER_FUNC(name) bpf_dispatcher_nop_func 7333d0407baSopenharmony_ci#define BPF_DISPATCHER_PTR(name) NULL 7343d0407baSopenharmony_cistatic inline void bpf_dispatcher_change_prog(struct bpf_dispatcher *d, struct bpf_prog *from, struct bpf_prog *to) 7353d0407baSopenharmony_ci{ 7363d0407baSopenharmony_ci} 7373d0407baSopenharmony_cistatic inline bool is_bpf_image_address(unsigned long address) 7383d0407baSopenharmony_ci{ 7393d0407baSopenharmony_ci return false; 7403d0407baSopenharmony_ci} 7413d0407baSopenharmony_ci#endif 7423d0407baSopenharmony_ci 7433d0407baSopenharmony_cistruct bpf_func_info_aux { 7443d0407baSopenharmony_ci u16 linkage; 7453d0407baSopenharmony_ci bool unreliable; 7463d0407baSopenharmony_ci}; 7473d0407baSopenharmony_ci 7483d0407baSopenharmony_cienum bpf_jit_poke_reason { 7493d0407baSopenharmony_ci BPF_POKE_REASON_TAIL_CALL, 7503d0407baSopenharmony_ci}; 7513d0407baSopenharmony_ci 7523d0407baSopenharmony_ci/* Descriptor of pokes pointing /into/ the JITed image. */ 7533d0407baSopenharmony_cistruct bpf_jit_poke_descriptor { 7543d0407baSopenharmony_ci void *tailcall_target; 7553d0407baSopenharmony_ci void *tailcall_bypass; 7563d0407baSopenharmony_ci void *bypass_addr; 7573d0407baSopenharmony_ci void *aux; 7583d0407baSopenharmony_ci union { 7593d0407baSopenharmony_ci struct { 7603d0407baSopenharmony_ci struct bpf_map *map; 7613d0407baSopenharmony_ci u32 key; 7623d0407baSopenharmony_ci } tail_call; 7633d0407baSopenharmony_ci }; 7643d0407baSopenharmony_ci bool tailcall_target_stable; 7653d0407baSopenharmony_ci u8 adj_off; 7663d0407baSopenharmony_ci u16 reason; 7673d0407baSopenharmony_ci u32 insn_idx; 7683d0407baSopenharmony_ci}; 7693d0407baSopenharmony_ci 7703d0407baSopenharmony_ci/* reg_type info for ctx arguments */ 7713d0407baSopenharmony_cistruct bpf_ctx_arg_aux { 7723d0407baSopenharmony_ci u32 offset; 7733d0407baSopenharmony_ci enum bpf_reg_type reg_type; 7743d0407baSopenharmony_ci u32 btf_id; 7753d0407baSopenharmony_ci}; 7763d0407baSopenharmony_ci 7773d0407baSopenharmony_cistruct bpf_prog_aux { 7783d0407baSopenharmony_ci atomic64_t refcnt; 7793d0407baSopenharmony_ci u32 used_map_cnt; 7803d0407baSopenharmony_ci u32 max_ctx_offset; 7813d0407baSopenharmony_ci u32 max_pkt_offset; 7823d0407baSopenharmony_ci u32 max_tp_access; 7833d0407baSopenharmony_ci u32 stack_depth; 7843d0407baSopenharmony_ci u32 id; 7853d0407baSopenharmony_ci u32 func_cnt; /* used by non-func prog as the number of func progs */ 7863d0407baSopenharmony_ci u32 func_idx; /* 0 for non-func prog, the index in func array for func prog */ 7873d0407baSopenharmony_ci u32 attach_btf_id; /* in-kernel BTF type id to attach to */ 7883d0407baSopenharmony_ci u32 ctx_arg_info_size; 7893d0407baSopenharmony_ci u32 max_rdonly_access; 7903d0407baSopenharmony_ci u32 max_rdwr_access; 7913d0407baSopenharmony_ci const struct bpf_ctx_arg_aux *ctx_arg_info; 7923d0407baSopenharmony_ci struct mutex dst_mutex; /* protects dst_* pointers below, *after* prog becomes visible */ 7933d0407baSopenharmony_ci struct bpf_prog *dst_prog; 7943d0407baSopenharmony_ci struct bpf_trampoline *dst_trampoline; 7953d0407baSopenharmony_ci enum bpf_prog_type saved_dst_prog_type; 7963d0407baSopenharmony_ci enum bpf_attach_type saved_dst_attach_type; 7973d0407baSopenharmony_ci bool verifier_zext; /* Zero extensions has been inserted by verifier. */ 7983d0407baSopenharmony_ci bool offload_requested; 7993d0407baSopenharmony_ci bool attach_btf_trace; /* true if attaching to BTF-enabled raw tp */ 8003d0407baSopenharmony_ci bool func_proto_unreliable; 8013d0407baSopenharmony_ci bool sleepable; 8023d0407baSopenharmony_ci bool tail_call_reachable; 8033d0407baSopenharmony_ci struct hlist_node tramp_hlist; 8043d0407baSopenharmony_ci /* BTF_KIND_FUNC_PROTO for valid attach_btf_id */ 8053d0407baSopenharmony_ci const struct btf_type *attach_func_proto; 8063d0407baSopenharmony_ci /* function name for valid attach_btf_id */ 8073d0407baSopenharmony_ci const char *attach_func_name; 8083d0407baSopenharmony_ci struct bpf_prog **func; 8093d0407baSopenharmony_ci void *jit_data; /* JIT specific data. arch dependent */ 8103d0407baSopenharmony_ci struct bpf_jit_poke_descriptor *poke_tab; 8113d0407baSopenharmony_ci u32 size_poke_tab; 8123d0407baSopenharmony_ci struct bpf_ksym ksym; 8133d0407baSopenharmony_ci const struct bpf_prog_ops *ops; 8143d0407baSopenharmony_ci struct bpf_map **used_maps; 8153d0407baSopenharmony_ci struct mutex used_maps_mutex; /* mutex for used_maps and used_map_cnt */ 8163d0407baSopenharmony_ci struct bpf_prog *prog; 8173d0407baSopenharmony_ci struct user_struct *user; 8183d0407baSopenharmony_ci u64 load_time; /* ns since boottime */ 8193d0407baSopenharmony_ci struct bpf_map *cgroup_storage[MAX_BPF_CGROUP_STORAGE_TYPE]; 8203d0407baSopenharmony_ci char name[BPF_OBJ_NAME_LEN]; 8213d0407baSopenharmony_ci#ifdef CONFIG_SECURITY 8223d0407baSopenharmony_ci void *security; 8233d0407baSopenharmony_ci#endif 8243d0407baSopenharmony_ci struct bpf_prog_offload *offload; 8253d0407baSopenharmony_ci struct btf *btf; 8263d0407baSopenharmony_ci struct bpf_func_info *func_info; 8273d0407baSopenharmony_ci struct bpf_func_info_aux *func_info_aux; 8283d0407baSopenharmony_ci /* bpf_line_info loaded from userspace. linfo->insn_off 8293d0407baSopenharmony_ci * has the xlated insn offset. 8303d0407baSopenharmony_ci * Both the main and sub prog share the same linfo. 8313d0407baSopenharmony_ci * The subprog can access its first linfo by 8323d0407baSopenharmony_ci * using the linfo_idx. 8333d0407baSopenharmony_ci */ 8343d0407baSopenharmony_ci struct bpf_line_info *linfo; 8353d0407baSopenharmony_ci /* jited_linfo is the jited addr of the linfo. It has a 8363d0407baSopenharmony_ci * one to one mapping to linfo: 8373d0407baSopenharmony_ci * jited_linfo[i] is the jited addr for the linfo[i]->insn_off. 8383d0407baSopenharmony_ci * Both the main and sub prog share the same jited_linfo. 8393d0407baSopenharmony_ci * The subprog can access its first jited_linfo by 8403d0407baSopenharmony_ci * using the linfo_idx. 8413d0407baSopenharmony_ci */ 8423d0407baSopenharmony_ci void **jited_linfo; 8433d0407baSopenharmony_ci u32 func_info_cnt; 8443d0407baSopenharmony_ci u32 nr_linfo; 8453d0407baSopenharmony_ci /* subprog can use linfo_idx to access its first linfo and 8463d0407baSopenharmony_ci * jited_linfo. 8473d0407baSopenharmony_ci * main prog always has linfo_idx == 0 8483d0407baSopenharmony_ci */ 8493d0407baSopenharmony_ci u32 linfo_idx; 8503d0407baSopenharmony_ci u32 num_exentries; 8513d0407baSopenharmony_ci struct exception_table_entry *extable; 8523d0407baSopenharmony_ci struct bpf_prog_stats __percpu *stats; 8533d0407baSopenharmony_ci union { 8543d0407baSopenharmony_ci struct work_struct work; 8553d0407baSopenharmony_ci struct rcu_head rcu; 8563d0407baSopenharmony_ci }; 8573d0407baSopenharmony_ci}; 8583d0407baSopenharmony_ci 8593d0407baSopenharmony_cistruct bpf_array_aux { 8603d0407baSopenharmony_ci /* 'Ownership' of prog array is claimed by the first program that 8613d0407baSopenharmony_ci * is going to use this map or by the first program which FD is 8623d0407baSopenharmony_ci * stored in the map to make sure that all callers and callees have 8633d0407baSopenharmony_ci * the same prog type and JITed flag. 8643d0407baSopenharmony_ci */ 8653d0407baSopenharmony_ci struct { 8663d0407baSopenharmony_ci spinlock_t lock; 8673d0407baSopenharmony_ci enum bpf_prog_type type; 8683d0407baSopenharmony_ci bool jited; 8693d0407baSopenharmony_ci } owner; 8703d0407baSopenharmony_ci /* Programs with direct jumps into programs part of this array. */ 8713d0407baSopenharmony_ci struct list_head poke_progs; 8723d0407baSopenharmony_ci struct bpf_map *map; 8733d0407baSopenharmony_ci struct mutex poke_mutex; 8743d0407baSopenharmony_ci struct work_struct work; 8753d0407baSopenharmony_ci}; 8763d0407baSopenharmony_ci 8773d0407baSopenharmony_cistruct bpf_link { 8783d0407baSopenharmony_ci atomic64_t refcnt; 8793d0407baSopenharmony_ci u32 id; 8803d0407baSopenharmony_ci enum bpf_link_type type; 8813d0407baSopenharmony_ci const struct bpf_link_ops *ops; 8823d0407baSopenharmony_ci struct bpf_prog *prog; 8833d0407baSopenharmony_ci struct work_struct work; 8843d0407baSopenharmony_ci}; 8853d0407baSopenharmony_ci 8863d0407baSopenharmony_cistruct bpf_link_ops { 8873d0407baSopenharmony_ci void (*release)(struct bpf_link *link); 8883d0407baSopenharmony_ci void (*dealloc)(struct bpf_link *link); 8893d0407baSopenharmony_ci int (*detach)(struct bpf_link *link); 8903d0407baSopenharmony_ci int (*update_prog)(struct bpf_link *link, struct bpf_prog *new_prog, struct bpf_prog *old_prog); 8913d0407baSopenharmony_ci void (*show_fdinfo)(const struct bpf_link *link, struct seq_file *seq); 8923d0407baSopenharmony_ci int (*fill_link_info)(const struct bpf_link *link, struct bpf_link_info *info); 8933d0407baSopenharmony_ci}; 8943d0407baSopenharmony_ci 8953d0407baSopenharmony_cistruct bpf_link_primer { 8963d0407baSopenharmony_ci struct bpf_link *link; 8973d0407baSopenharmony_ci struct file *file; 8983d0407baSopenharmony_ci int fd; 8993d0407baSopenharmony_ci u32 id; 9003d0407baSopenharmony_ci}; 9013d0407baSopenharmony_ci 9023d0407baSopenharmony_cistruct bpf_struct_ops_value; 9033d0407baSopenharmony_cistruct btf_type; 9043d0407baSopenharmony_cistruct btf_member; 9053d0407baSopenharmony_ci 9063d0407baSopenharmony_ci#define BPF_STRUCT_OPS_MAX_NR_MEMBERS 64 9073d0407baSopenharmony_cistruct bpf_struct_ops { 9083d0407baSopenharmony_ci const struct bpf_verifier_ops *verifier_ops; 9093d0407baSopenharmony_ci int (*init)(struct btf *btf); 9103d0407baSopenharmony_ci int (*check_member)(const struct btf_type *t, const struct btf_member *member); 9113d0407baSopenharmony_ci int (*init_member)(const struct btf_type *t, const struct btf_member *member, void *kdata, const void *udata); 9123d0407baSopenharmony_ci int (*reg)(void *kdata); 9133d0407baSopenharmony_ci void (*unreg)(void *kdata); 9143d0407baSopenharmony_ci const struct btf_type *type; 9153d0407baSopenharmony_ci const struct btf_type *value_type; 9163d0407baSopenharmony_ci const char *name; 9173d0407baSopenharmony_ci struct btf_func_model func_models[BPF_STRUCT_OPS_MAX_NR_MEMBERS]; 9183d0407baSopenharmony_ci u32 type_id; 9193d0407baSopenharmony_ci u32 value_id; 9203d0407baSopenharmony_ci}; 9213d0407baSopenharmony_ci 9223d0407baSopenharmony_ci#if defined(CONFIG_BPF_JIT) && defined(CONFIG_BPF_SYSCALL) 9233d0407baSopenharmony_ci#define BPF_MODULE_OWNER ((void *)((0xeB9FUL << 2) + POISON_POINTER_DELTA)) 9243d0407baSopenharmony_ciconst struct bpf_struct_ops *bpf_struct_ops_find(u32 type_id); 9253d0407baSopenharmony_civoid bpf_struct_ops_init(struct btf *btf, struct bpf_verifier_log *log); 9263d0407baSopenharmony_cibool bpf_struct_ops_get(const void *kdata); 9273d0407baSopenharmony_civoid bpf_struct_ops_put(const void *kdata); 9283d0407baSopenharmony_ciint bpf_struct_ops_map_sys_lookup_elem(struct bpf_map *map, void *key, void *value); 9293d0407baSopenharmony_cistatic inline bool bpf_try_module_get(const void *data, struct module *owner) 9303d0407baSopenharmony_ci{ 9313d0407baSopenharmony_ci if (owner == BPF_MODULE_OWNER) { 9323d0407baSopenharmony_ci return bpf_struct_ops_get(data); 9333d0407baSopenharmony_ci } else { 9343d0407baSopenharmony_ci return try_module_get(owner); 9353d0407baSopenharmony_ci } 9363d0407baSopenharmony_ci} 9373d0407baSopenharmony_cistatic inline void bpf_module_put(const void *data, struct module *owner) 9383d0407baSopenharmony_ci{ 9393d0407baSopenharmony_ci if (owner == BPF_MODULE_OWNER) { 9403d0407baSopenharmony_ci bpf_struct_ops_put(data); 9413d0407baSopenharmony_ci } else { 9423d0407baSopenharmony_ci module_put(owner); 9433d0407baSopenharmony_ci } 9443d0407baSopenharmony_ci} 9453d0407baSopenharmony_ci#else 9463d0407baSopenharmony_cistatic inline const struct bpf_struct_ops *bpf_struct_ops_find(u32 type_id) 9473d0407baSopenharmony_ci{ 9483d0407baSopenharmony_ci return NULL; 9493d0407baSopenharmony_ci} 9503d0407baSopenharmony_cistatic inline void bpf_struct_ops_init(struct btf *btf, struct bpf_verifier_log *log) 9513d0407baSopenharmony_ci{ 9523d0407baSopenharmony_ci} 9533d0407baSopenharmony_cistatic inline bool bpf_try_module_get(const void *data, struct module *owner) 9543d0407baSopenharmony_ci{ 9553d0407baSopenharmony_ci return try_module_get(owner); 9563d0407baSopenharmony_ci} 9573d0407baSopenharmony_cistatic inline void bpf_module_put(const void *data, struct module *owner) 9583d0407baSopenharmony_ci{ 9593d0407baSopenharmony_ci module_put(owner); 9603d0407baSopenharmony_ci} 9613d0407baSopenharmony_cistatic inline int bpf_struct_ops_map_sys_lookup_elem(struct bpf_map *map, void *key, void *value) 9623d0407baSopenharmony_ci{ 9633d0407baSopenharmony_ci return -EINVAL; 9643d0407baSopenharmony_ci} 9653d0407baSopenharmony_ci#endif 9663d0407baSopenharmony_ci 9673d0407baSopenharmony_cistruct bpf_array { 9683d0407baSopenharmony_ci struct bpf_map map; 9693d0407baSopenharmony_ci u32 elem_size; 9703d0407baSopenharmony_ci u32 index_mask; 9713d0407baSopenharmony_ci struct bpf_array_aux *aux; 9723d0407baSopenharmony_ci union { 9733d0407baSopenharmony_ci char value[0] __aligned(8); 9743d0407baSopenharmony_ci void *ptrs[0] __aligned(8); 9753d0407baSopenharmony_ci void __percpu *pptrs[0] __aligned(8); 9763d0407baSopenharmony_ci }; 9773d0407baSopenharmony_ci}; 9783d0407baSopenharmony_ci 9793d0407baSopenharmony_ci#define BPF_COMPLEXITY_LIMIT_INSNS 1000000 /* yes. 1M insns */ 9803d0407baSopenharmony_ci#define MAX_TAIL_CALL_CNT 32 9813d0407baSopenharmony_ci 9823d0407baSopenharmony_ci#define BPF_F_ACCESS_MASK (BPF_F_RDONLY | BPF_F_RDONLY_PROG | BPF_F_WRONLY | BPF_F_WRONLY_PROG) 9833d0407baSopenharmony_ci 9843d0407baSopenharmony_ci#define BPF_MAP_CAN_READ BIT(0) 9853d0407baSopenharmony_ci#define BPF_MAP_CAN_WRITE BIT(1) 9863d0407baSopenharmony_ci 9873d0407baSopenharmony_cistatic inline u32 bpf_map_flags_to_cap(struct bpf_map *map) 9883d0407baSopenharmony_ci{ 9893d0407baSopenharmony_ci u32 access_flags = map->map_flags & (BPF_F_RDONLY_PROG | BPF_F_WRONLY_PROG); 9903d0407baSopenharmony_ci 9913d0407baSopenharmony_ci /* Combination of BPF_F_RDONLY_PROG | BPF_F_WRONLY_PROG is 9923d0407baSopenharmony_ci * not possible. 9933d0407baSopenharmony_ci */ 9943d0407baSopenharmony_ci if (access_flags & BPF_F_RDONLY_PROG) { 9953d0407baSopenharmony_ci return BPF_MAP_CAN_READ; 9963d0407baSopenharmony_ci } else if (access_flags & BPF_F_WRONLY_PROG) { 9973d0407baSopenharmony_ci return BPF_MAP_CAN_WRITE; 9983d0407baSopenharmony_ci } else { 9993d0407baSopenharmony_ci return BPF_MAP_CAN_READ | BPF_MAP_CAN_WRITE; 10003d0407baSopenharmony_ci } 10013d0407baSopenharmony_ci} 10023d0407baSopenharmony_ci 10033d0407baSopenharmony_cistatic inline bool bpf_map_flags_access_ok(u32 access_flags) 10043d0407baSopenharmony_ci{ 10053d0407baSopenharmony_ci return (access_flags & (BPF_F_RDONLY_PROG | BPF_F_WRONLY_PROG)) != (BPF_F_RDONLY_PROG | BPF_F_WRONLY_PROG); 10063d0407baSopenharmony_ci} 10073d0407baSopenharmony_ci 10083d0407baSopenharmony_cistruct bpf_event_entry { 10093d0407baSopenharmony_ci struct perf_event *event; 10103d0407baSopenharmony_ci struct file *perf_file; 10113d0407baSopenharmony_ci struct file *map_file; 10123d0407baSopenharmony_ci struct rcu_head rcu; 10133d0407baSopenharmony_ci}; 10143d0407baSopenharmony_ci 10153d0407baSopenharmony_cibool bpf_prog_array_compatible(struct bpf_array *array, const struct bpf_prog *fp); 10163d0407baSopenharmony_ciint bpf_prog_calc_tag(struct bpf_prog *fp); 10173d0407baSopenharmony_ciconst char *kernel_type_name(u32 btf_type_id); 10183d0407baSopenharmony_ci 10193d0407baSopenharmony_ciconst struct bpf_func_proto *bpf_get_trace_printk_proto(void); 10203d0407baSopenharmony_ci 10213d0407baSopenharmony_citypedef unsigned long (*bpf_ctx_copy_t)(void *dst, const void *src, unsigned long off, unsigned long len); 10223d0407baSopenharmony_citypedef u32 (*bpf_convert_ctx_access_t)(enum bpf_access_type type, const struct bpf_insn *src, struct bpf_insn *dst, 10233d0407baSopenharmony_ci struct bpf_prog *prog, u32 *target_size); 10243d0407baSopenharmony_ci 10253d0407baSopenharmony_ciu64 bpf_event_output(struct bpf_map *map, u64 flags, void *meta, u64 meta_size, void *ctx, u64 ctx_size, 10263d0407baSopenharmony_ci bpf_ctx_copy_t ctx_copy); 10273d0407baSopenharmony_ci 10283d0407baSopenharmony_ci/* an array of programs to be executed under rcu_lock. 10293d0407baSopenharmony_ci * 10303d0407baSopenharmony_ci * Typical usage: 10313d0407baSopenharmony_ci * ret = BPF_PROG_RUN_ARRAY(&bpf_prog_array, ctx, BPF_PROG_RUN); 10323d0407baSopenharmony_ci * 10333d0407baSopenharmony_ci * the structure returned by bpf_prog_array_alloc() should be populated 10343d0407baSopenharmony_ci * with program pointers and the last pointer must be NULL. 10353d0407baSopenharmony_ci * The user has to keep refcnt on the program and make sure the program 10363d0407baSopenharmony_ci * is removed from the array before bpf_prog_put(). 10373d0407baSopenharmony_ci * The 'struct bpf_prog_array *' should only be replaced with xchg() 10383d0407baSopenharmony_ci * since other cpus are walking the array of pointers in parallel. 10393d0407baSopenharmony_ci */ 10403d0407baSopenharmony_cistruct bpf_prog_array_item { 10413d0407baSopenharmony_ci struct bpf_prog *prog; 10423d0407baSopenharmony_ci struct bpf_cgroup_storage *cgroup_storage[MAX_BPF_CGROUP_STORAGE_TYPE]; 10433d0407baSopenharmony_ci}; 10443d0407baSopenharmony_ci 10453d0407baSopenharmony_cistruct bpf_prog_array { 10463d0407baSopenharmony_ci struct rcu_head rcu; 10473d0407baSopenharmony_ci struct bpf_prog_array_item items[]; 10483d0407baSopenharmony_ci}; 10493d0407baSopenharmony_ci 10503d0407baSopenharmony_cistruct bpf_prog_array *bpf_prog_array_alloc(u32 prog_cnt, gfp_t flags); 10513d0407baSopenharmony_civoid bpf_prog_array_free(struct bpf_prog_array *progs); 10523d0407baSopenharmony_ciint bpf_prog_array_length(struct bpf_prog_array *progs); 10533d0407baSopenharmony_cibool bpf_prog_array_is_empty(struct bpf_prog_array *array); 10543d0407baSopenharmony_ciint bpf_prog_array_copy_to_user(struct bpf_prog_array *progs, __u32 __user *prog_ids, u32 cnt); 10553d0407baSopenharmony_ci 10563d0407baSopenharmony_civoid bpf_prog_array_delete_safe(struct bpf_prog_array *progs, struct bpf_prog *old_prog); 10573d0407baSopenharmony_ciint bpf_prog_array_delete_safe_at(struct bpf_prog_array *array, int index); 10583d0407baSopenharmony_ciint bpf_prog_array_update_at(struct bpf_prog_array *array, int index, struct bpf_prog *prog); 10593d0407baSopenharmony_ciint bpf_prog_array_copy_info(struct bpf_prog_array *array, u32 *prog_ids, u32 request_cnt, u32 *prog_cnt); 10603d0407baSopenharmony_ciint bpf_prog_array_copy(struct bpf_prog_array *old_array, struct bpf_prog *exclude_prog, struct bpf_prog *include_prog, 10613d0407baSopenharmony_ci struct bpf_prog_array **new_array); 10623d0407baSopenharmony_ci 10633d0407baSopenharmony_cistruct bpf_run_ctx { 10643d0407baSopenharmony_ci}; 10653d0407baSopenharmony_ci 10663d0407baSopenharmony_cistruct bpf_cg_run_ctx { 10673d0407baSopenharmony_ci struct bpf_run_ctx run_ctx; 10683d0407baSopenharmony_ci struct bpf_prog_array_item *prog_item; 10693d0407baSopenharmony_ci}; 10703d0407baSopenharmony_ci 10713d0407baSopenharmony_ci#define I_BPF_PROG_RUN_ARRAY(array, ctx, func, check_non_null, set_cg_storage) \ 10723d0407baSopenharmony_ci ( { \ 10733d0407baSopenharmony_ci struct bpf_prog_array_item *_item; \ 10743d0407baSopenharmony_ci struct bpf_prog *_prog; \ 10753d0407baSopenharmony_ci struct bpf_prog_array *_array; \ 10763d0407baSopenharmony_ci struct bpf_run_ctx *old_run_ctx; \ 10773d0407baSopenharmony_ci struct bpf_cg_run_ctx run_ctx; \ 10783d0407baSopenharmony_ci u32 _ret = 1; \ 10793d0407baSopenharmony_ci migrate_disable(); \ 10803d0407baSopenharmony_ci rcu_read_lock(); \ 10813d0407baSopenharmony_ci _array = rcu_dereference(array); \ 10823d0407baSopenharmony_ci if (unlikely((check_non_null) && !_array)) \ 10833d0407baSopenharmony_ci goto _out; \ 10843d0407baSopenharmony_ci _item = &_array->items[0]; \ 10853d0407baSopenharmony_ci old_run_ctx = bpf_set_run_ctx(&run_ctx.run_ctx); \ 10863d0407baSopenharmony_ci while ((_prog = READ_ONCE(_item->prog))) { \ 10873d0407baSopenharmony_ci run_ctx.prog_item = _item; \ 10883d0407baSopenharmony_ci _ret &= func(_prog, ctx); \ 10893d0407baSopenharmony_ci _item++; \ 10903d0407baSopenharmony_ci } \ 10913d0407baSopenharmony_ci bpf_reset_run_ctx(old_run_ctx); \ 10923d0407baSopenharmony_ci _out: \ 10933d0407baSopenharmony_ci rcu_read_unlock(); \ 10943d0407baSopenharmony_ci migrate_enable(); \ 10953d0407baSopenharmony_ci _ret; \ 10963d0407baSopenharmony_ci }) 10973d0407baSopenharmony_ci 10983d0407baSopenharmony_ci/* To be used by __cgroup_bpf_run_filter_skb for EGRESS BPF progs 10993d0407baSopenharmony_ci * so BPF programs can request cwr for TCP packets. 11003d0407baSopenharmony_ci * 11013d0407baSopenharmony_ci * Current cgroup skb programs can only return 0 or 1 (0 to drop the 11023d0407baSopenharmony_ci * packet. This macro changes the behavior so the low order bit 11033d0407baSopenharmony_ci * indicates whether the packet should be dropped (0) or not (1) 11043d0407baSopenharmony_ci * and the next bit is a congestion notification bit. This could be 11053d0407baSopenharmony_ci * used by TCP to call tcp_enter_cwr() 11063d0407baSopenharmony_ci * 11073d0407baSopenharmony_ci * Hence, new allowed return values of CGROUP EGRESS BPF programs are: 11083d0407baSopenharmony_ci * 0: drop packet 11093d0407baSopenharmony_ci * 1: keep packet 11103d0407baSopenharmony_ci * 2: drop packet and cn 11113d0407baSopenharmony_ci * 3: keep packet and cn 11123d0407baSopenharmony_ci * 11133d0407baSopenharmony_ci * This macro then converts it to one of the NET_XMIT or an error 11143d0407baSopenharmony_ci * code that is then interpreted as drop packet (and no cn): 11153d0407baSopenharmony_ci * 0: NET_XMIT_SUCCESS skb should be transmitted 11163d0407baSopenharmony_ci * 1: NET_XMIT_DROP skb should be dropped and cn 11173d0407baSopenharmony_ci * 2: NET_XMIT_CN skb should be transmitted and cn 11183d0407baSopenharmony_ci * 3: -EPERM skb should be dropped 11193d0407baSopenharmony_ci */ 11203d0407baSopenharmony_ci#define BPF_PROG_CGROUP_INET_EGRESS_RUN_ARRAY(array, ctx, func) \ 11213d0407baSopenharmony_ci ( { \ 11223d0407baSopenharmony_ci struct bpf_prog_array_item *_item; \ 11233d0407baSopenharmony_ci struct bpf_prog *_prog; \ 11243d0407baSopenharmony_ci struct bpf_prog_array *_array; \ 11253d0407baSopenharmony_ci struct bpf_run_ctx *old_run_ctx; \ 11263d0407baSopenharmony_ci struct bpf_cg_run_ctx run_ctx; \ 11273d0407baSopenharmony_ci u32 ret; \ 11283d0407baSopenharmony_ci u32 _ret = 1; \ 11293d0407baSopenharmony_ci u32 _cn = 0; \ 11303d0407baSopenharmony_ci migrate_disable(); \ 11313d0407baSopenharmony_ci rcu_read_lock(); \ 11323d0407baSopenharmony_ci _array = rcu_dereference(array); \ 11333d0407baSopenharmony_ci _item = &_array->items[0]; \ 11343d0407baSopenharmony_ci old_run_ctx = bpf_set_run_ctx(&run_ctx.run_ctx); \ 11353d0407baSopenharmony_ci while ((_prog = READ_ONCE(_item->prog))) { \ 11363d0407baSopenharmony_ci run_ctx.prog_item = _item; \ 11373d0407baSopenharmony_ci ret = func(_prog, ctx); \ 11383d0407baSopenharmony_ci _ret &= (ret & 1); \ 11393d0407baSopenharmony_ci _cn |= (ret & 2); \ 11403d0407baSopenharmony_ci _item++; \ 11413d0407baSopenharmony_ci } \ 11423d0407baSopenharmony_ci bpf_reset_run_ctx(old_run_ctx); \ 11433d0407baSopenharmony_ci rcu_read_unlock(); \ 11443d0407baSopenharmony_ci migrate_enable(); \ 11453d0407baSopenharmony_ci if (_ret) \ 11463d0407baSopenharmony_ci _ret = (_cn ? NET_XMIT_CN : NET_XMIT_SUCCESS); \ 11473d0407baSopenharmony_ci else \ 11483d0407baSopenharmony_ci _ret = (_cn ? NET_XMIT_DROP : -EPERM); \ 11493d0407baSopenharmony_ci _ret; \ 11503d0407baSopenharmony_ci }) 11513d0407baSopenharmony_ci 11523d0407baSopenharmony_ci#define BPF_PROG_RUN_ARRAY(array, ctx, func) I_BPF_PROG_RUN_ARRAY(array, ctx, func, false, true) 11533d0407baSopenharmony_ci 11543d0407baSopenharmony_ci#define BPF_PROG_RUN_ARRAY_CHECK(array, ctx, func) I_BPF_PROG_RUN_ARRAY(array, ctx, func, true, false) 11553d0407baSopenharmony_ci 11563d0407baSopenharmony_ci#ifdef CONFIG_BPF_SYSCALL 11573d0407baSopenharmony_ciDECLARE_PER_CPU(int, bpf_prog_active); 11583d0407baSopenharmony_ciextern struct mutex bpf_stats_enabled_mutex; 11593d0407baSopenharmony_ci 11603d0407baSopenharmony_ci/* 11613d0407baSopenharmony_ci * Block execution of BPF programs attached to instrumentation (perf, 11623d0407baSopenharmony_ci * kprobes, tracepoints) to prevent deadlocks on map operations as any of 11633d0407baSopenharmony_ci * these events can happen inside a region which holds a map bucket lock 11643d0407baSopenharmony_ci * and can deadlock on it. 11653d0407baSopenharmony_ci * 11663d0407baSopenharmony_ci * Use the preemption safe inc/dec variants on RT because migrate disable 11673d0407baSopenharmony_ci * is preemptible on RT and preemption in the middle of the RMW operation 11683d0407baSopenharmony_ci * might lead to inconsistent state. Use the raw variants for non RT 11693d0407baSopenharmony_ci * kernels as migrate_disable() maps to preempt_disable() so the slightly 11703d0407baSopenharmony_ci * more expensive save operation can be avoided. 11713d0407baSopenharmony_ci */ 11723d0407baSopenharmony_cistatic inline void bpf_disable_instrumentation(void) 11733d0407baSopenharmony_ci{ 11743d0407baSopenharmony_ci migrate_disable(); 11753d0407baSopenharmony_ci if (IS_ENABLED(CONFIG_PREEMPT_RT)) { 11763d0407baSopenharmony_ci this_cpu_inc(bpf_prog_active); 11773d0407baSopenharmony_ci } else { 11783d0407baSopenharmony_ci __this_cpu_inc(bpf_prog_active); 11793d0407baSopenharmony_ci } 11803d0407baSopenharmony_ci} 11813d0407baSopenharmony_ci 11823d0407baSopenharmony_cistatic inline void bpf_enable_instrumentation(void) 11833d0407baSopenharmony_ci{ 11843d0407baSopenharmony_ci if (IS_ENABLED(CONFIG_PREEMPT_RT)) { 11853d0407baSopenharmony_ci this_cpu_dec(bpf_prog_active); 11863d0407baSopenharmony_ci } else { 11873d0407baSopenharmony_ci __this_cpu_dec(bpf_prog_active); 11883d0407baSopenharmony_ci } 11893d0407baSopenharmony_ci migrate_enable(); 11903d0407baSopenharmony_ci} 11913d0407baSopenharmony_ci 11923d0407baSopenharmony_cistatic inline struct bpf_run_ctx *bpf_set_run_ctx(struct bpf_run_ctx *new_ctx) 11933d0407baSopenharmony_ci{ 11943d0407baSopenharmony_ci struct bpf_run_ctx *old_ctx; 11953d0407baSopenharmony_ci 11963d0407baSopenharmony_ci old_ctx = current->bpf_ctx; 11973d0407baSopenharmony_ci current->bpf_ctx = new_ctx; 11983d0407baSopenharmony_ci return old_ctx; 11993d0407baSopenharmony_ci} 12003d0407baSopenharmony_ci 12013d0407baSopenharmony_cistatic inline void bpf_reset_run_ctx(struct bpf_run_ctx *old_ctx) 12023d0407baSopenharmony_ci{ 12033d0407baSopenharmony_ci current->bpf_ctx = old_ctx; 12043d0407baSopenharmony_ci} 12053d0407baSopenharmony_ci 12063d0407baSopenharmony_ciextern const struct file_operations bpf_map_fops; 12073d0407baSopenharmony_ciextern const struct file_operations bpf_prog_fops; 12083d0407baSopenharmony_ciextern const struct file_operations bpf_iter_fops; 12093d0407baSopenharmony_ci 12103d0407baSopenharmony_ci#define BPF_PROG_TYPE(_id, _name, prog_ctx_type, kern_ctx_type) \ 12113d0407baSopenharmony_ci extern const struct bpf_prog_ops _name##_prog_ops; \ 12123d0407baSopenharmony_ci extern const struct bpf_verifier_ops _name##_verifier_ops; 12133d0407baSopenharmony_ci#define BPF_MAP_TYPE(_id, _ops) extern const struct bpf_map_ops _ops; 12143d0407baSopenharmony_ci#define BPF_LINK_TYPE(_id, _name) 12153d0407baSopenharmony_ci#include <linux/bpf_types.h> 12163d0407baSopenharmony_ci#undef BPF_PROG_TYPE 12173d0407baSopenharmony_ci#undef BPF_MAP_TYPE 12183d0407baSopenharmony_ci#undef BPF_LINK_TYPE 12193d0407baSopenharmony_ci 12203d0407baSopenharmony_ciextern const struct bpf_prog_ops bpf_offload_prog_ops; 12213d0407baSopenharmony_ciextern const struct bpf_verifier_ops tc_cls_act_analyzer_ops; 12223d0407baSopenharmony_ciextern const struct bpf_verifier_ops xdp_analyzer_ops; 12233d0407baSopenharmony_ci 12243d0407baSopenharmony_cistruct bpf_prog *bpf_prog_get(u32 ufd); 12253d0407baSopenharmony_cistruct bpf_prog *bpf_prog_get_type_dev(u32 ufd, enum bpf_prog_type type, bool attach_drv); 12263d0407baSopenharmony_civoid bpf_prog_add(struct bpf_prog *prog, int i); 12273d0407baSopenharmony_civoid bpf_prog_sub(struct bpf_prog *prog, int i); 12283d0407baSopenharmony_civoid bpf_prog_inc(struct bpf_prog *prog); 12293d0407baSopenharmony_cistruct bpf_prog *__must_check bpf_prog_inc_not_zero(struct bpf_prog *prog); 12303d0407baSopenharmony_civoid bpf_prog_put(struct bpf_prog *prog); 12313d0407baSopenharmony_ciint __bpf_prog_charge(struct user_struct *user, u32 pages); 12323d0407baSopenharmony_civoid __bpf_prog_uncharge(struct user_struct *user, u32 pages); 12333d0407baSopenharmony_ci 12343d0407baSopenharmony_civoid bpf_prog_free_id(struct bpf_prog *prog, bool do_idr_lock); 12353d0407baSopenharmony_civoid bpf_map_free_id(struct bpf_map *map, bool do_idr_lock); 12363d0407baSopenharmony_ci 12373d0407baSopenharmony_cistruct bpf_map *bpf_map_get(u32 ufd); 12383d0407baSopenharmony_cistruct bpf_map *bpf_map_get_with_uref(u32 ufd); 12393d0407baSopenharmony_cistruct bpf_map *__bpf_map_get(struct fd f); 12403d0407baSopenharmony_civoid bpf_map_inc(struct bpf_map *map); 12413d0407baSopenharmony_civoid bpf_map_inc_with_uref(struct bpf_map *map); 12423d0407baSopenharmony_cistruct bpf_map *__must_check bpf_map_inc_not_zero(struct bpf_map *map); 12433d0407baSopenharmony_civoid bpf_map_put_with_uref(struct bpf_map *map); 12443d0407baSopenharmony_civoid bpf_map_put(struct bpf_map *map); 12453d0407baSopenharmony_ciint bpf_map_charge_memlock(struct bpf_map *map, u32 pages); 12463d0407baSopenharmony_civoid bpf_map_uncharge_memlock(struct bpf_map *map, u32 pages); 12473d0407baSopenharmony_ciint bpf_map_charge_init(struct bpf_map_memory *mem, u64 size); 12483d0407baSopenharmony_civoid bpf_map_charge_finish(struct bpf_map_memory *mem); 12493d0407baSopenharmony_civoid bpf_map_charge_move(struct bpf_map_memory *dst, struct bpf_map_memory *src); 12503d0407baSopenharmony_civoid *bpf_map_area_alloc(u64 size, int numa_node); 12513d0407baSopenharmony_civoid *bpf_map_area_mmapable_alloc(u64 size, int numa_node); 12523d0407baSopenharmony_civoid bpf_map_area_free(void *base); 12533d0407baSopenharmony_civoid bpf_map_init_from_attr(struct bpf_map *map, union bpf_attr *attr); 12543d0407baSopenharmony_ciint generic_map_lookup_batch(struct bpf_map *map, const union bpf_attr *attr, union bpf_attr __user *uattr); 12553d0407baSopenharmony_ciint generic_map_update_batch(struct bpf_map *map, const union bpf_attr *attr, union bpf_attr __user *uattr); 12563d0407baSopenharmony_ciint generic_map_delete_batch(struct bpf_map *map, const union bpf_attr *attr, union bpf_attr __user *uattr); 12573d0407baSopenharmony_cistruct bpf_map *bpf_map_get_curr_or_next(u32 *id); 12583d0407baSopenharmony_cistruct bpf_prog *bpf_prog_get_curr_or_next(u32 *id); 12593d0407baSopenharmony_ci 12603d0407baSopenharmony_ciextern int sysctl_unprivileged_bpf_disabled; 12613d0407baSopenharmony_ci 12623d0407baSopenharmony_cistatic inline bool bpf_allow_ptr_leaks(void) 12633d0407baSopenharmony_ci{ 12643d0407baSopenharmony_ci return perfmon_capable(); 12653d0407baSopenharmony_ci} 12663d0407baSopenharmony_ci 12673d0407baSopenharmony_cistatic inline bool bpf_allow_uninit_stack(void) 12683d0407baSopenharmony_ci{ 12693d0407baSopenharmony_ci return perfmon_capable(); 12703d0407baSopenharmony_ci} 12713d0407baSopenharmony_ci 12723d0407baSopenharmony_cistatic inline bool bpf_allow_ptr_to_map_access(void) 12733d0407baSopenharmony_ci{ 12743d0407baSopenharmony_ci return perfmon_capable(); 12753d0407baSopenharmony_ci} 12763d0407baSopenharmony_ci 12773d0407baSopenharmony_cistatic inline bool bpf_bypass_spec_v1(void) 12783d0407baSopenharmony_ci{ 12793d0407baSopenharmony_ci return perfmon_capable(); 12803d0407baSopenharmony_ci} 12813d0407baSopenharmony_ci 12823d0407baSopenharmony_cistatic inline bool bpf_bypass_spec_v4(void) 12833d0407baSopenharmony_ci{ 12843d0407baSopenharmony_ci return perfmon_capable(); 12853d0407baSopenharmony_ci} 12863d0407baSopenharmony_ci 12873d0407baSopenharmony_ciint bpf_map_new_fd(struct bpf_map *map, int flags); 12883d0407baSopenharmony_ciint bpf_prog_new_fd(struct bpf_prog *prog); 12893d0407baSopenharmony_ci 12903d0407baSopenharmony_civoid bpf_link_init(struct bpf_link *link, enum bpf_link_type type, const struct bpf_link_ops *ops, 12913d0407baSopenharmony_ci struct bpf_prog *prog); 12923d0407baSopenharmony_ciint bpf_link_prime(struct bpf_link *link, struct bpf_link_primer *primer); 12933d0407baSopenharmony_ciint bpf_link_settle(struct bpf_link_primer *primer); 12943d0407baSopenharmony_civoid bpf_link_cleanup(struct bpf_link_primer *primer); 12953d0407baSopenharmony_civoid bpf_link_inc(struct bpf_link *link); 12963d0407baSopenharmony_civoid bpf_link_put(struct bpf_link *link); 12973d0407baSopenharmony_ciint bpf_link_new_fd(struct bpf_link *link); 12983d0407baSopenharmony_cistruct file *bpf_link_new_file(struct bpf_link *link, int *reserved_fd); 12993d0407baSopenharmony_cistruct bpf_link *bpf_link_get_from_fd(u32 ufd); 13003d0407baSopenharmony_ci 13013d0407baSopenharmony_ciint bpf_obj_pin_user(u32 ufd, const char __user *pathname); 13023d0407baSopenharmony_ciint bpf_obj_get_user(const char __user *pathname, int flags); 13033d0407baSopenharmony_ci 13043d0407baSopenharmony_ci#define BPF_ITER_FUNC_PREFIX "bpf_iter_" 13053d0407baSopenharmony_ci#define DEFINE_BPF_ITER_FUNC(target, args...) \ 13063d0407baSopenharmony_ci extern int bpf_iter_##target(args); \ 13073d0407baSopenharmony_ci int __init bpf_iter_##target(args) \ 13083d0407baSopenharmony_ci { \ 13093d0407baSopenharmony_ci return 0; \ 13103d0407baSopenharmony_ci } 13113d0407baSopenharmony_ci 13123d0407baSopenharmony_cistruct bpf_iter_aux_info { 13133d0407baSopenharmony_ci struct bpf_map *map; 13143d0407baSopenharmony_ci}; 13153d0407baSopenharmony_ci 13163d0407baSopenharmony_citypedef int (*bpf_iter_attach_target_t)(struct bpf_prog *prog, union bpf_iter_link_info *linfo, 13173d0407baSopenharmony_ci struct bpf_iter_aux_info *aux); 13183d0407baSopenharmony_citypedef void (*bpf_iter_detach_target_t)(struct bpf_iter_aux_info *aux); 13193d0407baSopenharmony_citypedef void (*bpf_iter_show_fdinfo_t)(const struct bpf_iter_aux_info *aux, struct seq_file *seq); 13203d0407baSopenharmony_citypedef int (*bpf_iter_fill_link_info_t)(const struct bpf_iter_aux_info *aux, struct bpf_link_info *info); 13213d0407baSopenharmony_ci 13223d0407baSopenharmony_ci#define BPF_ITER_CTX_ARG_MAX 2 13233d0407baSopenharmony_cistruct bpf_iter_reg { 13243d0407baSopenharmony_ci const char *target; 13253d0407baSopenharmony_ci bpf_iter_attach_target_t attach_target; 13263d0407baSopenharmony_ci bpf_iter_detach_target_t detach_target; 13273d0407baSopenharmony_ci bpf_iter_show_fdinfo_t show_fdinfo; 13283d0407baSopenharmony_ci bpf_iter_fill_link_info_t fill_link_info; 13293d0407baSopenharmony_ci u32 ctx_arg_info_size; 13303d0407baSopenharmony_ci struct bpf_ctx_arg_aux ctx_arg_info[BPF_ITER_CTX_ARG_MAX]; 13313d0407baSopenharmony_ci const struct bpf_iter_seq_info *seq_info; 13323d0407baSopenharmony_ci}; 13333d0407baSopenharmony_ci 13343d0407baSopenharmony_cistruct bpf_iter_meta { 13353d0407baSopenharmony_ci __bpf_md_ptr(struct seq_file *, seq); 13363d0407baSopenharmony_ci u64 session_id; 13373d0407baSopenharmony_ci u64 seq_num; 13383d0407baSopenharmony_ci}; 13393d0407baSopenharmony_ci 13403d0407baSopenharmony_cistruct bpf_iter__bpf_map_elem { 13413d0407baSopenharmony_ci __bpf_md_ptr(struct bpf_iter_meta *, meta); 13423d0407baSopenharmony_ci __bpf_md_ptr(struct bpf_map *, map); 13433d0407baSopenharmony_ci __bpf_md_ptr(void *, key); 13443d0407baSopenharmony_ci __bpf_md_ptr(void *, value); 13453d0407baSopenharmony_ci}; 13463d0407baSopenharmony_ci 13473d0407baSopenharmony_ciint bpf_iter_reg_target(const struct bpf_iter_reg *reg_info); 13483d0407baSopenharmony_civoid bpf_iter_unreg_target(const struct bpf_iter_reg *reg_info); 13493d0407baSopenharmony_cibool bpf_iter_prog_supported(struct bpf_prog *prog); 13503d0407baSopenharmony_ciint bpf_iter_link_attach(const union bpf_attr *attr, struct bpf_prog *prog); 13513d0407baSopenharmony_ciint bpf_iter_new_fd(struct bpf_link *link); 13523d0407baSopenharmony_cibool bpf_link_is_iter(struct bpf_link *link); 13533d0407baSopenharmony_cistruct bpf_prog *bpf_iter_get_info(struct bpf_iter_meta *meta, bool in_stop); 13543d0407baSopenharmony_ciint bpf_iter_run_prog(struct bpf_prog *prog, void *ctx); 13553d0407baSopenharmony_civoid bpf_iter_map_show_fdinfo(const struct bpf_iter_aux_info *aux, struct seq_file *seq); 13563d0407baSopenharmony_ciint bpf_iter_map_fill_link_info(const struct bpf_iter_aux_info *aux, struct bpf_link_info *info); 13573d0407baSopenharmony_ci 13583d0407baSopenharmony_ciint bpf_percpu_hash_copy(struct bpf_map *map, void *key, void *value); 13593d0407baSopenharmony_ciint bpf_percpu_array_copy(struct bpf_map *map, void *key, void *value); 13603d0407baSopenharmony_ciint bpf_percpu_hash_update(struct bpf_map *map, void *key, void *value, u64 flags); 13613d0407baSopenharmony_ciint bpf_percpu_array_update(struct bpf_map *map, void *key, void *value, u64 flags); 13623d0407baSopenharmony_ci 13633d0407baSopenharmony_ciint bpf_stackmap_copy(struct bpf_map *map, void *key, void *value); 13643d0407baSopenharmony_ci 13653d0407baSopenharmony_ciint bpf_fd_array_map_update_elem(struct bpf_map *map, struct file *map_file, void *key, void *value, u64 map_flags); 13663d0407baSopenharmony_ciint bpf_fd_array_map_lookup_elem(struct bpf_map *map, void *key, u32 *value); 13673d0407baSopenharmony_ciint bpf_fd_htab_map_update_elem(struct bpf_map *map, struct file *map_file, void *key, void *value, u64 map_flags); 13683d0407baSopenharmony_ciint bpf_fd_htab_map_lookup_elem(struct bpf_map *map, void *key, u32 *value); 13693d0407baSopenharmony_ci 13703d0407baSopenharmony_ciint bpf_get_file_flag(int flags); 13713d0407baSopenharmony_ciint bpf_check_uarg_tail_zero(void __user *uaddr, size_t expected_size, size_t actual_size); 13723d0407baSopenharmony_ci 13733d0407baSopenharmony_ci/* memcpy that is used with 8-byte aligned pointers, power-of-8 size and 13743d0407baSopenharmony_ci * forced to use 'long' read/writes to try to atomically copy long counters. 13753d0407baSopenharmony_ci * Best-effort only. No barriers here, since it _will_ race with concurrent 13763d0407baSopenharmony_ci * updates from BPF programs. Called from bpf syscall and mostly used with 13773d0407baSopenharmony_ci * size 8 or 16 bytes, so ask compiler to inline it. 13783d0407baSopenharmony_ci */ 13793d0407baSopenharmony_cistatic inline void bpf_long_memcpy(void *dst, const void *src, u32 size) 13803d0407baSopenharmony_ci{ 13813d0407baSopenharmony_ci const long *lsrc = src; 13823d0407baSopenharmony_ci long *ldst = dst; 13833d0407baSopenharmony_ci 13843d0407baSopenharmony_ci size /= sizeof(long); 13853d0407baSopenharmony_ci while (size--) { 13863d0407baSopenharmony_ci *ldst++ = *lsrc++; 13873d0407baSopenharmony_ci } 13883d0407baSopenharmony_ci} 13893d0407baSopenharmony_ci 13903d0407baSopenharmony_ci/* verify correctness of eBPF program */ 13913d0407baSopenharmony_ciint bpf_check(struct bpf_prog **fp, union bpf_attr *attr, union bpf_attr __user *uattr); 13923d0407baSopenharmony_ci 13933d0407baSopenharmony_ci#ifndef CONFIG_BPF_JIT_ALWAYS_ON 13943d0407baSopenharmony_civoid bpf_patch_call_args(struct bpf_insn *insn, u32 stack_depth); 13953d0407baSopenharmony_ci#endif 13963d0407baSopenharmony_ci 13973d0407baSopenharmony_cistruct btf *bpf_get_btf_vmlinux(void); 13983d0407baSopenharmony_ci 13993d0407baSopenharmony_ci/* Map specifics */ 14003d0407baSopenharmony_cistruct xdp_buff; 14013d0407baSopenharmony_cistruct sk_buff; 14023d0407baSopenharmony_ci 14033d0407baSopenharmony_cistruct bpf_dtab_netdev *__dev_map_lookup_elem(struct bpf_map *map, u32 key); 14043d0407baSopenharmony_cistruct bpf_dtab_netdev *__dev_map_hash_lookup_elem(struct bpf_map *map, u32 key); 14053d0407baSopenharmony_civoid __dev_flush(void); 14063d0407baSopenharmony_ciint dev_xdp_enqueue(struct net_device *dev, struct xdp_buff *xdp, struct net_device *dev_rx); 14073d0407baSopenharmony_ciint dev_map_enqueue(struct bpf_dtab_netdev *dst, struct xdp_buff *xdp, struct net_device *dev_rx); 14083d0407baSopenharmony_ciint dev_map_generic_redirect(struct bpf_dtab_netdev *dst, struct sk_buff *skb, struct bpf_prog *xdp_prog); 14093d0407baSopenharmony_cibool dev_map_can_have_prog(struct bpf_map *map); 14103d0407baSopenharmony_ci 14113d0407baSopenharmony_cistruct bpf_cpu_map_entry *__cpu_map_lookup_elem(struct bpf_map *map, u32 key); 14123d0407baSopenharmony_civoid __cpu_map_flush(void); 14133d0407baSopenharmony_ciint cpu_map_enqueue(struct bpf_cpu_map_entry *rcpu, struct xdp_buff *xdp, struct net_device *dev_rx); 14143d0407baSopenharmony_cibool cpu_map_prog_allowed(struct bpf_map *map); 14153d0407baSopenharmony_ci 14163d0407baSopenharmony_ci/* Return map's numa specified by userspace */ 14173d0407baSopenharmony_cistatic inline int bpf_map_attr_numa_node(const union bpf_attr *attr) 14183d0407baSopenharmony_ci{ 14193d0407baSopenharmony_ci return (attr->map_flags & BPF_F_NUMA_NODE) ? attr->numa_node : NUMA_NO_NODE; 14203d0407baSopenharmony_ci} 14213d0407baSopenharmony_ci 14223d0407baSopenharmony_cistruct bpf_prog *bpf_prog_get_type_path(const char *name, enum bpf_prog_type type); 14233d0407baSopenharmony_ciint array_map_alloc_check(union bpf_attr *attr); 14243d0407baSopenharmony_ci 14253d0407baSopenharmony_ciint bpf_prog_test_run_xdp(struct bpf_prog *prog, const union bpf_attr *kattr, union bpf_attr __user *uattr); 14263d0407baSopenharmony_ciint bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr, union bpf_attr __user *uattr); 14273d0407baSopenharmony_ciint bpf_prog_test_run_tracing(struct bpf_prog *prog, const union bpf_attr *kattr, union bpf_attr __user *uattr); 14283d0407baSopenharmony_ciint bpf_prog_test_run_flow_dissector(struct bpf_prog *prog, const union bpf_attr *kattr, union bpf_attr __user *uattr); 14293d0407baSopenharmony_ciint bpf_prog_test_run_raw_tp(struct bpf_prog *prog, const union bpf_attr *kattr, union bpf_attr __user *uattr); 14303d0407baSopenharmony_cibool btf_ctx_access(int off, int size, enum bpf_access_type type, const struct bpf_prog *prog, 14313d0407baSopenharmony_ci struct bpf_insn_access_aux *info); 14323d0407baSopenharmony_ciint btf_struct_access(struct bpf_verifier_log *log, const struct btf_type *t, int off, int size, 14333d0407baSopenharmony_ci enum bpf_access_type atype, u32 *next_btf_id); 14343d0407baSopenharmony_cibool btf_struct_ids_match(struct bpf_verifier_log *log, int off, u32 id, u32 need_type_id); 14353d0407baSopenharmony_ci 14363d0407baSopenharmony_ciint btf_distill_func_proto(struct bpf_verifier_log *log, struct btf *btf, const struct btf_type *func_proto, 14373d0407baSopenharmony_ci const char *func_name, struct btf_func_model *m); 14383d0407baSopenharmony_ci 14393d0407baSopenharmony_cistruct bpf_reg_state; 14403d0407baSopenharmony_ciint btf_check_func_arg_match(struct bpf_verifier_env *env, int subprog, struct bpf_reg_state *regs); 14413d0407baSopenharmony_ciint btf_prepare_func_args(struct bpf_verifier_env *env, int subprog, struct bpf_reg_state *reg); 14423d0407baSopenharmony_ciint btf_check_type_match(struct bpf_verifier_log *log, const struct bpf_prog *prog, struct btf *btf, 14433d0407baSopenharmony_ci const struct btf_type *t); 14443d0407baSopenharmony_ci 14453d0407baSopenharmony_cistruct bpf_prog *bpf_prog_by_id(u32 id); 14463d0407baSopenharmony_cistruct bpf_link *bpf_link_by_id(u32 id); 14473d0407baSopenharmony_ci 14483d0407baSopenharmony_ciconst struct bpf_func_proto *bpf_base_func_proto(enum bpf_func_id func_id); 14493d0407baSopenharmony_ci 14503d0407baSopenharmony_cistatic inline bool unprivileged_ebpf_enabled(void) 14513d0407baSopenharmony_ci{ 14523d0407baSopenharmony_ci return !sysctl_unprivileged_bpf_disabled; 14533d0407baSopenharmony_ci} 14543d0407baSopenharmony_ci 14553d0407baSopenharmony_ci#else /* !CONFIG_BPF_SYSCALL */ 14563d0407baSopenharmony_cistatic inline struct bpf_prog *bpf_prog_get(u32 ufd) 14573d0407baSopenharmony_ci{ 14583d0407baSopenharmony_ci return ERR_PTR(-EOPNOTSUPP); 14593d0407baSopenharmony_ci} 14603d0407baSopenharmony_ci 14613d0407baSopenharmony_cistatic inline struct bpf_prog *bpf_prog_get_type_dev(u32 ufd, enum bpf_prog_type type, bool attach_drv) 14623d0407baSopenharmony_ci{ 14633d0407baSopenharmony_ci return ERR_PTR(-EOPNOTSUPP); 14643d0407baSopenharmony_ci} 14653d0407baSopenharmony_ci 14663d0407baSopenharmony_cistatic inline void bpf_prog_add(struct bpf_prog *prog, int i) 14673d0407baSopenharmony_ci{ 14683d0407baSopenharmony_ci} 14693d0407baSopenharmony_ci 14703d0407baSopenharmony_cistatic inline void bpf_prog_sub(struct bpf_prog *prog, int i) 14713d0407baSopenharmony_ci{ 14723d0407baSopenharmony_ci} 14733d0407baSopenharmony_ci 14743d0407baSopenharmony_cistatic inline void bpf_prog_put(struct bpf_prog *prog) 14753d0407baSopenharmony_ci{ 14763d0407baSopenharmony_ci} 14773d0407baSopenharmony_ci 14783d0407baSopenharmony_cistatic inline void bpf_prog_inc(struct bpf_prog *prog) 14793d0407baSopenharmony_ci{ 14803d0407baSopenharmony_ci} 14813d0407baSopenharmony_ci 14823d0407baSopenharmony_cistatic inline struct bpf_prog *__must_check bpf_prog_inc_not_zero(struct bpf_prog *prog) 14833d0407baSopenharmony_ci{ 14843d0407baSopenharmony_ci return ERR_PTR(-EOPNOTSUPP); 14853d0407baSopenharmony_ci} 14863d0407baSopenharmony_ci 14873d0407baSopenharmony_cistatic inline int __bpf_prog_charge(struct user_struct *user, u32 pages) 14883d0407baSopenharmony_ci{ 14893d0407baSopenharmony_ci return 0; 14903d0407baSopenharmony_ci} 14913d0407baSopenharmony_ci 14923d0407baSopenharmony_cistatic inline void __bpf_prog_uncharge(struct user_struct *user, u32 pages) 14933d0407baSopenharmony_ci{ 14943d0407baSopenharmony_ci} 14953d0407baSopenharmony_ci 14963d0407baSopenharmony_cistatic inline void bpf_link_init(struct bpf_link *link, enum bpf_link_type type, const struct bpf_link_ops *ops, 14973d0407baSopenharmony_ci struct bpf_prog *prog) 14983d0407baSopenharmony_ci{ 14993d0407baSopenharmony_ci} 15003d0407baSopenharmony_ci 15013d0407baSopenharmony_cistatic inline int bpf_link_prime(struct bpf_link *link, struct bpf_link_primer *primer) 15023d0407baSopenharmony_ci{ 15033d0407baSopenharmony_ci return -EOPNOTSUPP; 15043d0407baSopenharmony_ci} 15053d0407baSopenharmony_ci 15063d0407baSopenharmony_cistatic inline int bpf_link_settle(struct bpf_link_primer *primer) 15073d0407baSopenharmony_ci{ 15083d0407baSopenharmony_ci return -EOPNOTSUPP; 15093d0407baSopenharmony_ci} 15103d0407baSopenharmony_ci 15113d0407baSopenharmony_cistatic inline void bpf_link_cleanup(struct bpf_link_primer *primer) 15123d0407baSopenharmony_ci{ 15133d0407baSopenharmony_ci} 15143d0407baSopenharmony_ci 15153d0407baSopenharmony_cistatic inline void bpf_link_inc(struct bpf_link *link) 15163d0407baSopenharmony_ci{ 15173d0407baSopenharmony_ci} 15183d0407baSopenharmony_ci 15193d0407baSopenharmony_cistatic inline void bpf_link_put(struct bpf_link *link) 15203d0407baSopenharmony_ci{ 15213d0407baSopenharmony_ci} 15223d0407baSopenharmony_ci 15233d0407baSopenharmony_cistatic inline int bpf_obj_get_user(const char __user *pathname, int flags) 15243d0407baSopenharmony_ci{ 15253d0407baSopenharmony_ci return -EOPNOTSUPP; 15263d0407baSopenharmony_ci} 15273d0407baSopenharmony_ci 15283d0407baSopenharmony_cistatic inline struct net_device *__dev_map_lookup_elem(struct bpf_map *map, u32 key) 15293d0407baSopenharmony_ci{ 15303d0407baSopenharmony_ci return NULL; 15313d0407baSopenharmony_ci} 15323d0407baSopenharmony_ci 15333d0407baSopenharmony_cistatic inline struct net_device *__dev_map_hash_lookup_elem(struct bpf_map *map, u32 key) 15343d0407baSopenharmony_ci{ 15353d0407baSopenharmony_ci return NULL; 15363d0407baSopenharmony_ci} 15373d0407baSopenharmony_cistatic inline bool dev_map_can_have_prog(struct bpf_map *map) 15383d0407baSopenharmony_ci{ 15393d0407baSopenharmony_ci return false; 15403d0407baSopenharmony_ci} 15413d0407baSopenharmony_ci 15423d0407baSopenharmony_cistatic inline void __dev_flush(void) 15433d0407baSopenharmony_ci{ 15443d0407baSopenharmony_ci} 15453d0407baSopenharmony_ci 15463d0407baSopenharmony_cistruct xdp_buff; 15473d0407baSopenharmony_cistruct bpf_dtab_netdev; 15483d0407baSopenharmony_ci 15493d0407baSopenharmony_cistatic inline int dev_xdp_enqueue(struct net_device *dev, struct xdp_buff *xdp, struct net_device *dev_rx) 15503d0407baSopenharmony_ci{ 15513d0407baSopenharmony_ci return 0; 15523d0407baSopenharmony_ci} 15533d0407baSopenharmony_ci 15543d0407baSopenharmony_cistatic inline int dev_map_enqueue(struct bpf_dtab_netdev *dst, struct xdp_buff *xdp, struct net_device *dev_rx) 15553d0407baSopenharmony_ci{ 15563d0407baSopenharmony_ci return 0; 15573d0407baSopenharmony_ci} 15583d0407baSopenharmony_ci 15593d0407baSopenharmony_cistruct sk_buff; 15603d0407baSopenharmony_ci 15613d0407baSopenharmony_cistatic inline int dev_map_generic_redirect(struct bpf_dtab_netdev *dst, struct sk_buff *skb, struct bpf_prog *xdp_prog) 15623d0407baSopenharmony_ci{ 15633d0407baSopenharmony_ci return 0; 15643d0407baSopenharmony_ci} 15653d0407baSopenharmony_ci 15663d0407baSopenharmony_cistatic inline struct bpf_cpu_map_entry *__cpu_map_lookup_elem(struct bpf_map *map, u32 key) 15673d0407baSopenharmony_ci{ 15683d0407baSopenharmony_ci return NULL; 15693d0407baSopenharmony_ci} 15703d0407baSopenharmony_ci 15713d0407baSopenharmony_cistatic inline void __cpu_map_flush(void) 15723d0407baSopenharmony_ci{ 15733d0407baSopenharmony_ci} 15743d0407baSopenharmony_ci 15753d0407baSopenharmony_cistatic inline int cpu_map_enqueue(struct bpf_cpu_map_entry *rcpu, struct xdp_buff *xdp, struct net_device *dev_rx) 15763d0407baSopenharmony_ci{ 15773d0407baSopenharmony_ci return 0; 15783d0407baSopenharmony_ci} 15793d0407baSopenharmony_ci 15803d0407baSopenharmony_cistatic inline bool cpu_map_prog_allowed(struct bpf_map *map) 15813d0407baSopenharmony_ci{ 15823d0407baSopenharmony_ci return false; 15833d0407baSopenharmony_ci} 15843d0407baSopenharmony_ci 15853d0407baSopenharmony_cistatic inline struct bpf_prog *bpf_prog_get_type_path(const char *name, enum bpf_prog_type type) 15863d0407baSopenharmony_ci{ 15873d0407baSopenharmony_ci return ERR_PTR(-EOPNOTSUPP); 15883d0407baSopenharmony_ci} 15893d0407baSopenharmony_ci 15903d0407baSopenharmony_cistatic inline int bpf_prog_test_run_xdp(struct bpf_prog *prog, const union bpf_attr *kattr, 15913d0407baSopenharmony_ci union bpf_attr __user *uattr) 15923d0407baSopenharmony_ci{ 15933d0407baSopenharmony_ci return -ENOTSUPP; 15943d0407baSopenharmony_ci} 15953d0407baSopenharmony_ci 15963d0407baSopenharmony_cistatic inline int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr, 15973d0407baSopenharmony_ci union bpf_attr __user *uattr) 15983d0407baSopenharmony_ci{ 15993d0407baSopenharmony_ci return -ENOTSUPP; 16003d0407baSopenharmony_ci} 16013d0407baSopenharmony_ci 16023d0407baSopenharmony_cistatic inline int bpf_prog_test_run_tracing(struct bpf_prog *prog, const union bpf_attr *kattr, 16033d0407baSopenharmony_ci union bpf_attr __user *uattr) 16043d0407baSopenharmony_ci{ 16053d0407baSopenharmony_ci return -ENOTSUPP; 16063d0407baSopenharmony_ci} 16073d0407baSopenharmony_ci 16083d0407baSopenharmony_cistatic inline int bpf_prog_test_run_flow_dissector(struct bpf_prog *prog, const union bpf_attr *kattr, 16093d0407baSopenharmony_ci union bpf_attr __user *uattr) 16103d0407baSopenharmony_ci{ 16113d0407baSopenharmony_ci return -ENOTSUPP; 16123d0407baSopenharmony_ci} 16133d0407baSopenharmony_ci 16143d0407baSopenharmony_cistatic inline void bpf_map_put(struct bpf_map *map) 16153d0407baSopenharmony_ci{ 16163d0407baSopenharmony_ci} 16173d0407baSopenharmony_ci 16183d0407baSopenharmony_cistatic inline struct bpf_prog *bpf_prog_by_id(u32 id) 16193d0407baSopenharmony_ci{ 16203d0407baSopenharmony_ci return ERR_PTR(-ENOTSUPP); 16213d0407baSopenharmony_ci} 16223d0407baSopenharmony_ci 16233d0407baSopenharmony_cistatic inline const struct bpf_func_proto *bpf_base_func_proto(enum bpf_func_id func_id) 16243d0407baSopenharmony_ci{ 16253d0407baSopenharmony_ci return NULL; 16263d0407baSopenharmony_ci} 16273d0407baSopenharmony_ci 16283d0407baSopenharmony_cistatic inline bool unprivileged_ebpf_enabled(void) 16293d0407baSopenharmony_ci{ 16303d0407baSopenharmony_ci return false; 16313d0407baSopenharmony_ci} 16323d0407baSopenharmony_ci 16333d0407baSopenharmony_ci#endif /* CONFIG_BPF_SYSCALL */ 16343d0407baSopenharmony_ci 16353d0407baSopenharmony_cistatic inline struct bpf_prog *bpf_prog_get_type(u32 ufd, enum bpf_prog_type type) 16363d0407baSopenharmony_ci{ 16373d0407baSopenharmony_ci return bpf_prog_get_type_dev(ufd, type, false); 16383d0407baSopenharmony_ci} 16393d0407baSopenharmony_ci 16403d0407baSopenharmony_civoid __bpf_free_used_maps(struct bpf_prog_aux *aux, struct bpf_map **used_maps, u32 len); 16413d0407baSopenharmony_ci 16423d0407baSopenharmony_cibool bpf_prog_get_ok(struct bpf_prog *, enum bpf_prog_type *, bool); 16433d0407baSopenharmony_ci 16443d0407baSopenharmony_ciint bpf_prog_offload_compile(struct bpf_prog *prog); 16453d0407baSopenharmony_civoid bpf_prog_offload_destroy(struct bpf_prog *prog); 16463d0407baSopenharmony_ciint bpf_prog_offload_info_fill(struct bpf_prog_info *info, struct bpf_prog *prog); 16473d0407baSopenharmony_ci 16483d0407baSopenharmony_ciint bpf_map_offload_info_fill(struct bpf_map_info *info, struct bpf_map *map); 16493d0407baSopenharmony_ci 16503d0407baSopenharmony_ciint bpf_map_offload_lookup_elem(struct bpf_map *map, void *key, void *value); 16513d0407baSopenharmony_ciint bpf_map_offload_update_elem(struct bpf_map *map, void *key, void *value, u64 flags); 16523d0407baSopenharmony_ciint bpf_map_offload_delete_elem(struct bpf_map *map, void *key); 16533d0407baSopenharmony_ciint bpf_map_offload_get_next_key(struct bpf_map *map, void *key, void *next_key); 16543d0407baSopenharmony_ci 16553d0407baSopenharmony_cibool bpf_offload_prog_map_match(struct bpf_prog *prog, struct bpf_map *map); 16563d0407baSopenharmony_ci 16573d0407baSopenharmony_cistruct bpf_offload_dev *bpf_offload_dev_create(const struct bpf_prog_offload_ops *ops, void *priv); 16583d0407baSopenharmony_civoid bpf_offload_dev_destroy(struct bpf_offload_dev *offdev); 16593d0407baSopenharmony_civoid *bpf_offload_dev_priv(struct bpf_offload_dev *offdev); 16603d0407baSopenharmony_ciint bpf_offload_dev_netdev_register(struct bpf_offload_dev *offdev, struct net_device *netdev); 16613d0407baSopenharmony_civoid bpf_offload_dev_netdev_unregister(struct bpf_offload_dev *offdev, struct net_device *netdev); 16623d0407baSopenharmony_cibool bpf_offload_dev_match(struct bpf_prog *prog, struct net_device *netdev); 16633d0407baSopenharmony_ci 16643d0407baSopenharmony_civoid unpriv_ebpf_notify(int new_state); 16653d0407baSopenharmony_ci 16663d0407baSopenharmony_ci#if defined(CONFIG_NET) && defined(CONFIG_BPF_SYSCALL) 16673d0407baSopenharmony_ciint bpf_prog_offload_init(struct bpf_prog *prog, union bpf_attr *attr); 16683d0407baSopenharmony_ci 16693d0407baSopenharmony_cistatic inline bool bpf_prog_is_dev_bound(const struct bpf_prog_aux *aux) 16703d0407baSopenharmony_ci{ 16713d0407baSopenharmony_ci return aux->offload_requested; 16723d0407baSopenharmony_ci} 16733d0407baSopenharmony_ci 16743d0407baSopenharmony_cistatic inline bool bpf_map_is_dev_bound(struct bpf_map *map) 16753d0407baSopenharmony_ci{ 16763d0407baSopenharmony_ci return unlikely(map->ops == &bpf_map_offload_ops); 16773d0407baSopenharmony_ci} 16783d0407baSopenharmony_ci 16793d0407baSopenharmony_cistruct bpf_map *bpf_map_offload_map_alloc(union bpf_attr *attr); 16803d0407baSopenharmony_civoid bpf_map_offload_map_free(struct bpf_map *map); 16813d0407baSopenharmony_ci#else 16823d0407baSopenharmony_cistatic inline int bpf_prog_offload_init(struct bpf_prog *prog, union bpf_attr *attr) 16833d0407baSopenharmony_ci{ 16843d0407baSopenharmony_ci return -EOPNOTSUPP; 16853d0407baSopenharmony_ci} 16863d0407baSopenharmony_ci 16873d0407baSopenharmony_cistatic inline bool bpf_prog_is_dev_bound(struct bpf_prog_aux *aux) 16883d0407baSopenharmony_ci{ 16893d0407baSopenharmony_ci return false; 16903d0407baSopenharmony_ci} 16913d0407baSopenharmony_ci 16923d0407baSopenharmony_cistatic inline bool bpf_map_is_dev_bound(struct bpf_map *map) 16933d0407baSopenharmony_ci{ 16943d0407baSopenharmony_ci return false; 16953d0407baSopenharmony_ci} 16963d0407baSopenharmony_ci 16973d0407baSopenharmony_cistatic inline struct bpf_map *bpf_map_offload_map_alloc(union bpf_attr *attr) 16983d0407baSopenharmony_ci{ 16993d0407baSopenharmony_ci return ERR_PTR(-EOPNOTSUPP); 17003d0407baSopenharmony_ci} 17013d0407baSopenharmony_ci 17023d0407baSopenharmony_cistatic inline void bpf_map_offload_map_free(struct bpf_map *map) 17033d0407baSopenharmony_ci{ 17043d0407baSopenharmony_ci} 17053d0407baSopenharmony_ci#endif /* CONFIG_NET && CONFIG_BPF_SYSCALL */ 17063d0407baSopenharmony_ci 17073d0407baSopenharmony_ci#if defined(CONFIG_BPF_STREAM_PARSER) 17083d0407baSopenharmony_ciint sock_map_prog_update(struct bpf_map *map, struct bpf_prog *prog, struct bpf_prog *old, u32 which); 17093d0407baSopenharmony_ciint sock_map_get_from_fd(const union bpf_attr *attr, struct bpf_prog *prog); 17103d0407baSopenharmony_ciint sock_map_prog_detach(const union bpf_attr *attr, enum bpf_prog_type ptype); 17113d0407baSopenharmony_ciint sock_map_update_elem_sys(struct bpf_map *map, void *key, void *value, u64 flags); 17123d0407baSopenharmony_civoid sock_map_unhash(struct sock *sk); 17133d0407baSopenharmony_civoid sock_map_close(struct sock *sk, long timeout); 17143d0407baSopenharmony_ci#else 17153d0407baSopenharmony_cistatic inline int sock_map_prog_update(struct bpf_map *map, struct bpf_prog *prog, struct bpf_prog *old, u32 which) 17163d0407baSopenharmony_ci{ 17173d0407baSopenharmony_ci return -EOPNOTSUPP; 17183d0407baSopenharmony_ci} 17193d0407baSopenharmony_ci 17203d0407baSopenharmony_cistatic inline int sock_map_get_from_fd(const union bpf_attr *attr, struct bpf_prog *prog) 17213d0407baSopenharmony_ci{ 17223d0407baSopenharmony_ci return -EINVAL; 17233d0407baSopenharmony_ci} 17243d0407baSopenharmony_ci 17253d0407baSopenharmony_cistatic inline int sock_map_prog_detach(const union bpf_attr *attr, enum bpf_prog_type ptype) 17263d0407baSopenharmony_ci{ 17273d0407baSopenharmony_ci return -EOPNOTSUPP; 17283d0407baSopenharmony_ci} 17293d0407baSopenharmony_ci 17303d0407baSopenharmony_cistatic inline int sock_map_update_elem_sys(struct bpf_map *map, void *key, void *value, u64 flags) 17313d0407baSopenharmony_ci{ 17323d0407baSopenharmony_ci return -EOPNOTSUPP; 17333d0407baSopenharmony_ci} 17343d0407baSopenharmony_ci#endif /* CONFIG_BPF_STREAM_PARSER */ 17353d0407baSopenharmony_ci 17363d0407baSopenharmony_ci#if defined(CONFIG_INET) && defined(CONFIG_BPF_SYSCALL) 17373d0407baSopenharmony_civoid bpf_sk_reuseport_detach(struct sock *sk); 17383d0407baSopenharmony_ciint bpf_fd_reuseport_array_lookup_elem(struct bpf_map *map, void *key, void *value); 17393d0407baSopenharmony_ciint bpf_fd_reuseport_array_update_elem(struct bpf_map *map, void *key, void *value, u64 map_flags); 17403d0407baSopenharmony_ci#else 17413d0407baSopenharmony_cistatic inline void bpf_sk_reuseport_detach(struct sock *sk) 17423d0407baSopenharmony_ci{ 17433d0407baSopenharmony_ci} 17443d0407baSopenharmony_ci 17453d0407baSopenharmony_ci#ifdef CONFIG_BPF_SYSCALL 17463d0407baSopenharmony_cistatic inline int bpf_fd_reuseport_array_lookup_elem(struct bpf_map *map, void *key, void *value) 17473d0407baSopenharmony_ci{ 17483d0407baSopenharmony_ci return -EOPNOTSUPP; 17493d0407baSopenharmony_ci} 17503d0407baSopenharmony_ci 17513d0407baSopenharmony_cistatic inline int bpf_fd_reuseport_array_update_elem(struct bpf_map *map, void *key, void *value, u64 map_flags) 17523d0407baSopenharmony_ci{ 17533d0407baSopenharmony_ci return -EOPNOTSUPP; 17543d0407baSopenharmony_ci} 17553d0407baSopenharmony_ci#endif /* CONFIG_BPF_SYSCALL */ 17563d0407baSopenharmony_ci#endif /* defined(CONFIG_INET) && defined(CONFIG_BPF_SYSCALL) */ 17573d0407baSopenharmony_ci 17583d0407baSopenharmony_ci/* verifier prototypes for helper functions called from eBPF programs */ 17593d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_map_lookup_elem_proto; 17603d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_map_update_elem_proto; 17613d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_map_delete_elem_proto; 17623d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_map_push_elem_proto; 17633d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_map_pop_elem_proto; 17643d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_map_peek_elem_proto; 17653d0407baSopenharmony_ci 17663d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_get_prandom_u32_proto; 17673d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_get_smp_processor_id_proto; 17683d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_get_numa_node_id_proto; 17693d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_tail_call_proto; 17703d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_ktime_get_ns_proto; 17713d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_ktime_get_boot_ns_proto; 17723d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_get_current_pid_tgid_proto; 17733d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_get_current_uid_gid_proto; 17743d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_get_current_comm_proto; 17753d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_get_stackid_proto; 17763d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_get_stack_proto; 17773d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_get_task_stack_proto; 17783d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_get_stackid_proto_pe; 17793d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_get_stack_proto_pe; 17803d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_sock_map_update_proto; 17813d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_sock_hash_update_proto; 17823d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_get_current_cgroup_id_proto; 17833d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_get_current_ancestor_cgroup_id_proto; 17843d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_msg_redirect_hash_proto; 17853d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_msg_redirect_map_proto; 17863d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_sk_redirect_hash_proto; 17873d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_sk_redirect_map_proto; 17883d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_spin_lock_proto; 17893d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_spin_unlock_proto; 17903d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_get_local_storage_proto; 17913d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_strtol_proto; 17923d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_strtoul_proto; 17933d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_tcp_sock_proto; 17943d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_jiffies64_proto; 17953d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_get_ns_current_pid_tgid_proto; 17963d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_event_output_data_proto; 17973d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_ringbuf_output_proto; 17983d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_ringbuf_reserve_proto; 17993d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_ringbuf_submit_proto; 18003d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_ringbuf_discard_proto; 18013d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_ringbuf_query_proto; 18023d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_skc_to_tcp6_sock_proto; 18033d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_skc_to_tcp_sock_proto; 18043d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_skc_to_tcp_timewait_sock_proto; 18053d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_skc_to_tcp_request_sock_proto; 18063d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_skc_to_udp6_sock_proto; 18073d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_copy_from_user_proto; 18083d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_snprintf_btf_proto; 18093d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_per_cpu_ptr_proto; 18103d0407baSopenharmony_ciextern const struct bpf_func_proto bpf_this_cpu_ptr_proto; 18113d0407baSopenharmony_ci 18123d0407baSopenharmony_ciconst struct bpf_func_proto *bpf_tracing_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog); 18133d0407baSopenharmony_ci 18143d0407baSopenharmony_ciconst struct bpf_func_proto *tracing_prog_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog); 18153d0407baSopenharmony_ci 18163d0407baSopenharmony_ci/* Shared helpers among cBPF and eBPF. */ 18173d0407baSopenharmony_civoid bpf_user_rnd_init_once(void); 18183d0407baSopenharmony_ciu64 bpf_user_rnd_u32(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5); 18193d0407baSopenharmony_ciu64 bpf_get_raw_cpu_id(u64 r1, u64 r2, u64 r3, u64 r4, u64 r5); 18203d0407baSopenharmony_ci 18213d0407baSopenharmony_ci#if defined(CONFIG_NET) 18223d0407baSopenharmony_cibool bpf_sock_common_is_valid_access(int off, int size, enum bpf_access_type type, struct bpf_insn_access_aux *info); 18233d0407baSopenharmony_cibool bpf_sock_is_valid_access(int off, int size, enum bpf_access_type type, struct bpf_insn_access_aux *info); 18243d0407baSopenharmony_ciu32 bpf_sock_convert_ctx_access(enum bpf_access_type type, const struct bpf_insn *si, struct bpf_insn *insn_buf, 18253d0407baSopenharmony_ci struct bpf_prog *prog, u32 *target_size); 18263d0407baSopenharmony_ci#else 18273d0407baSopenharmony_cistatic inline bool bpf_sock_common_is_valid_access(int off, int size, enum bpf_access_type type, 18283d0407baSopenharmony_ci struct bpf_insn_access_aux *info) 18293d0407baSopenharmony_ci{ 18303d0407baSopenharmony_ci return false; 18313d0407baSopenharmony_ci} 18323d0407baSopenharmony_cistatic inline bool bpf_sock_is_valid_access(int off, int size, enum bpf_access_type type, 18333d0407baSopenharmony_ci struct bpf_insn_access_aux *info) 18343d0407baSopenharmony_ci{ 18353d0407baSopenharmony_ci return false; 18363d0407baSopenharmony_ci} 18373d0407baSopenharmony_cistatic inline u32 bpf_sock_convert_ctx_access(enum bpf_access_type type, const struct bpf_insn *si, 18383d0407baSopenharmony_ci struct bpf_insn *insn_buf, struct bpf_prog *prog, u32 *target_size) 18393d0407baSopenharmony_ci{ 18403d0407baSopenharmony_ci return 0; 18413d0407baSopenharmony_ci} 18423d0407baSopenharmony_ci#endif 18433d0407baSopenharmony_ci 18443d0407baSopenharmony_ci#ifdef CONFIG_INET 18453d0407baSopenharmony_cistruct sk_reuseport_kern { 18463d0407baSopenharmony_ci struct sk_buff *skb; 18473d0407baSopenharmony_ci struct sock *sk; 18483d0407baSopenharmony_ci struct sock *selected_sk; 18493d0407baSopenharmony_ci void *data_end; 18503d0407baSopenharmony_ci u32 hash; 18513d0407baSopenharmony_ci u32 reuseport_id; 18523d0407baSopenharmony_ci bool bind_inany; 18533d0407baSopenharmony_ci}; 18543d0407baSopenharmony_cibool bpf_tcp_sock_is_valid_access(int off, int size, enum bpf_access_type type, struct bpf_insn_access_aux *info); 18553d0407baSopenharmony_ci 18563d0407baSopenharmony_ciu32 bpf_tcp_sock_convert_ctx_access(enum bpf_access_type type, const struct bpf_insn *si, struct bpf_insn *insn_buf, 18573d0407baSopenharmony_ci struct bpf_prog *prog, u32 *target_size); 18583d0407baSopenharmony_ci 18593d0407baSopenharmony_cibool bpf_xdp_sock_is_valid_access(int off, int size, enum bpf_access_type type, struct bpf_insn_access_aux *info); 18603d0407baSopenharmony_ci 18613d0407baSopenharmony_ciu32 bpf_xdp_sock_convert_ctx_access(enum bpf_access_type type, const struct bpf_insn *si, struct bpf_insn *insn_buf, 18623d0407baSopenharmony_ci struct bpf_prog *prog, u32 *target_size); 18633d0407baSopenharmony_ci#else 18643d0407baSopenharmony_cistatic inline bool bpf_tcp_sock_is_valid_access(int off, int size, enum bpf_access_type type, 18653d0407baSopenharmony_ci struct bpf_insn_access_aux *info) 18663d0407baSopenharmony_ci{ 18673d0407baSopenharmony_ci return false; 18683d0407baSopenharmony_ci} 18693d0407baSopenharmony_ci 18703d0407baSopenharmony_cistatic inline u32 bpf_tcp_sock_convert_ctx_access(enum bpf_access_type type, const struct bpf_insn *si, 18713d0407baSopenharmony_ci struct bpf_insn *insn_buf, struct bpf_prog *prog, u32 *target_size) 18723d0407baSopenharmony_ci{ 18733d0407baSopenharmony_ci return 0; 18743d0407baSopenharmony_ci} 18753d0407baSopenharmony_cistatic inline bool bpf_xdp_sock_is_valid_access(int off, int size, enum bpf_access_type type, 18763d0407baSopenharmony_ci struct bpf_insn_access_aux *info) 18773d0407baSopenharmony_ci{ 18783d0407baSopenharmony_ci return false; 18793d0407baSopenharmony_ci} 18803d0407baSopenharmony_ci 18813d0407baSopenharmony_cistatic inline u32 bpf_xdp_sock_convert_ctx_access(enum bpf_access_type type, const struct bpf_insn *si, 18823d0407baSopenharmony_ci struct bpf_insn *insn_buf, struct bpf_prog *prog, u32 *target_size) 18833d0407baSopenharmony_ci{ 18843d0407baSopenharmony_ci return 0; 18853d0407baSopenharmony_ci} 18863d0407baSopenharmony_ci#endif /* CONFIG_INET */ 18873d0407baSopenharmony_ci 18883d0407baSopenharmony_cienum bpf_text_poke_type { 18893d0407baSopenharmony_ci BPF_MOD_CALL, 18903d0407baSopenharmony_ci BPF_MOD_JUMP, 18913d0407baSopenharmony_ci}; 18923d0407baSopenharmony_ci 18933d0407baSopenharmony_ciint bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t, void *addr1, void *addr2); 18943d0407baSopenharmony_ci 18953d0407baSopenharmony_cistruct btf_id_set; 18963d0407baSopenharmony_cibool btf_id_set_contains(const struct btf_id_set *set, u32 id); 18973d0407baSopenharmony_ci 18983d0407baSopenharmony_ci#endif /* _LINUX_BPF_H */ 1899