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