428 lines
12 KiB
C
428 lines
12 KiB
C
|
/* Copyright (C) 2019-2021 Free Software Foundation, Inc.
|
||
|
|
||
|
This file is part of GCC.
|
||
|
|
||
|
GCC is free software; you can redistribute it and/or modify
|
||
|
it under the terms of the GNU General Public License as published by
|
||
|
the Free Software Foundation; either version 3, or (at your option)
|
||
|
any later version.
|
||
|
|
||
|
GCC is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
Under Section 7 of GPL version 3, you are granted additional
|
||
|
permissions described in the GCC Runtime Library Exception, version
|
||
|
3.1, as published by the Free Software Foundation.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License and
|
||
|
a copy of the GCC Runtime Library Exception along with this program;
|
||
|
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||
|
<http://www.gnu.org/licenses/>. */
|
||
|
|
||
|
/* The purpose of this file is to provide a compatiblity layer with
|
||
|
the Linux kernel bpf_helpers.h header that is located in
|
||
|
linux/tools/testing/selftests/bpf/bpf_helpers.h. That file is
|
||
|
currently llvm-specific. */
|
||
|
|
||
|
#ifndef __BPF_HELPERS_H
|
||
|
#define __BPF_HELPERS_H
|
||
|
|
||
|
#define SEC(NAME) __attribute__((section(NAME), used))
|
||
|
#define KERNEL_HELPER(NUM) __attribute__((kernel_helper(NUM)))
|
||
|
|
||
|
/* Flags used in some kernel helpers. */
|
||
|
|
||
|
#define BPF_ANY 0
|
||
|
#define BPF_NOEXIST 1
|
||
|
#define BPF_EXIST 2
|
||
|
|
||
|
#define BPF_F_LOCK 4
|
||
|
#define BPF_F_NO_COMMON_LRU (1U << 1)
|
||
|
#define BPF_F_NUMA_NODE (1U << 2)
|
||
|
|
||
|
/* Prototypes of functions to call kernel helpers.
|
||
|
Please keep these protoypes sorted by helper number. */
|
||
|
|
||
|
void *bpf_map_lookup_elem (void *map, const void *key)
|
||
|
KERNEL_HELPER (1);
|
||
|
|
||
|
int bpf_map_update_elem (void *map, const void *key, const void *value,
|
||
|
unsigned long long flags)
|
||
|
KERNEL_HELPER (2);
|
||
|
|
||
|
int bpf_map_delete_elem (void *map, const void *key)
|
||
|
KERNEL_HELPER (3);
|
||
|
|
||
|
int bpf_probe_read (void *dst, int size, const void *unsafe_ptr)
|
||
|
KERNEL_HELPER (4);
|
||
|
|
||
|
unsigned long long bpf_ktime_get_ns (void)
|
||
|
KERNEL_HELPER (5);
|
||
|
|
||
|
int bpf_trace_printk (const char *fmt, int fmt_size, ...)
|
||
|
KERNEL_HELPER (6);
|
||
|
|
||
|
unsigned long long bpf_get_prandom_u32 (void)
|
||
|
KERNEL_HELPER (7);
|
||
|
|
||
|
unsigned long long bpf_get_smp_processor_id (void)
|
||
|
KERNEL_HELPER (8);
|
||
|
|
||
|
int bpf_skb_store_bytes (void *ctx, int off, void *from, int len,
|
||
|
unsigned int start_header)
|
||
|
KERNEL_HELPER (9);
|
||
|
|
||
|
int bpf_l3_csum_replace (void *ctx, int off, int from, int to, int flags)
|
||
|
KERNEL_HELPER (10);
|
||
|
|
||
|
int bpf_l4_csum_replace (void *ctx, int off, int from, int to, int flags)
|
||
|
KERNEL_HELPER (11);
|
||
|
|
||
|
int bpf_tail_call (void *ctx, void *map, unsigned int index)
|
||
|
KERNEL_HELPER (12);
|
||
|
|
||
|
int bpf_clone_redirect (void *ctx, int ifindex, int flags)
|
||
|
KERNEL_HELPER (13);
|
||
|
|
||
|
unsigned long long bpf_get_current_pid_tgid (void)
|
||
|
KERNEL_HELPER (14);
|
||
|
|
||
|
unsigned long long bpf_get_current_uid_gid (void)
|
||
|
KERNEL_HELPER (15);
|
||
|
|
||
|
int bpf_get_current_comm (void *buf, int buf_size)
|
||
|
KERNEL_HELPER (16);
|
||
|
|
||
|
unsigned int bpf_get_cgroup_classid (void *ctx)
|
||
|
KERNEL_HELPER (17);
|
||
|
|
||
|
int bpf_skb_vlan_push (void *ctx, short vlan_proto,
|
||
|
unsigned short vlan_tci)
|
||
|
KERNEL_HELPER (18);
|
||
|
|
||
|
int bpf_skb_vlan_pop (void *ctx)
|
||
|
KERNEL_HELPER (19);
|
||
|
|
||
|
int bpf_skb_get_tunnel_key (void *ctx, void *key, int size, int flags)
|
||
|
KERNEL_HELPER (20);
|
||
|
|
||
|
int bpf_skb_set_tunnel_key (void *ctx, void *key, int size, int flags)
|
||
|
KERNEL_HELPER (21);
|
||
|
|
||
|
unsigned long long bpf_perf_event_read (void *map, unsigned long long flags)
|
||
|
KERNEL_HELPER (22);
|
||
|
|
||
|
int bpf_redirect (int ifindex, int flags)
|
||
|
KERNEL_HELPER (23);
|
||
|
|
||
|
unsigned int bpf_get_route_realm (void *ctx)
|
||
|
KERNEL_HELPER (24);
|
||
|
|
||
|
int bpf_perf_event_output (void *ctx, void *map, unsigned long long flags,
|
||
|
void *data, int size)
|
||
|
KERNEL_HELPER (25);
|
||
|
|
||
|
int bpf_skb_load_bytes (void *ctx, int off, void *to, int len)
|
||
|
KERNEL_HELPER (26);
|
||
|
|
||
|
int bpf_get_stackid (void *ctx, void *map, int flags)
|
||
|
KERNEL_HELPER (27);
|
||
|
|
||
|
int bpf_csum_diff (void *from, int from_size, void *to, int to_size, int seed)
|
||
|
KERNEL_HELPER (28);
|
||
|
|
||
|
int bpf_skb_get_tunnel_opt (void *ctx, void *md, int size)
|
||
|
KERNEL_HELPER (29);
|
||
|
|
||
|
int bpf_skb_set_tunnel_opt (void *ctx, void *md, int size)
|
||
|
KERNEL_HELPER (30);
|
||
|
|
||
|
int bpf_skb_change_proto (void *ctx, short proto, unsigned long flags)
|
||
|
KERNEL_HELPER (31);
|
||
|
|
||
|
int bpf_skb_change_type (void *ctx, unsigned int type)
|
||
|
KERNEL_HELPER (32);
|
||
|
|
||
|
int bpf_skb_under_cgroup (void *ctx, void *map, int index)
|
||
|
KERNEL_HELPER (33);
|
||
|
|
||
|
unsigned int bpf_get_hash_recalc (void *ctx)
|
||
|
KERNEL_HELPER (34);
|
||
|
|
||
|
unsigned long long bpf_get_current_task (void)
|
||
|
KERNEL_HELPER (35);
|
||
|
|
||
|
int bpf_probe_write_user (void *dst, const void *src, int size)
|
||
|
KERNEL_HELPER (36);
|
||
|
|
||
|
int bpf_current_task_under_cgroup (void *map, int index)
|
||
|
KERNEL_HELPER (37);
|
||
|
|
||
|
int bpf_skb_change_tail (void *ctx, unsigned int len, unsigned long flags)
|
||
|
KERNEL_HELPER (38);
|
||
|
|
||
|
int bpf_skb_pull_data (void *, int len)
|
||
|
KERNEL_HELPER (39);
|
||
|
|
||
|
long long bpf_csum_update (void *ctx, unsigned int csum)
|
||
|
KERNEL_HELPER (40);
|
||
|
|
||
|
void bpf_set_hash_invalid (void *ctx)
|
||
|
KERNEL_HELPER (41);
|
||
|
|
||
|
int bpf_get_numa_node_id (void)
|
||
|
KERNEL_HELPER (42);
|
||
|
|
||
|
int bpf_skb_change_head (void *, int len, int flags)
|
||
|
KERNEL_HELPER (43);
|
||
|
|
||
|
int bpf_xdp_adjust_head (void *ctx, int offset)
|
||
|
KERNEL_HELPER (44);
|
||
|
|
||
|
int bpf_probe_read_str (void *ctx, unsigned int size, const void *unsafe_ptr)
|
||
|
KERNEL_HELPER (45);
|
||
|
|
||
|
int bpf_get_socket_cookie (void *ctx)
|
||
|
KERNEL_HELPER (46);
|
||
|
|
||
|
unsigned int bpf_get_socket_uid (void *ctx)
|
||
|
KERNEL_HELPER (47);
|
||
|
|
||
|
unsigned int bpf_set_hash (void *ctx, unsigned int hash)
|
||
|
KERNEL_HELPER (48);
|
||
|
|
||
|
int bpf_setsockopt (void *ctx, int level, int optname, void *optval, int optlen)
|
||
|
KERNEL_HELPER (49);
|
||
|
|
||
|
int bpf_skb_adjust_room (void *ctx, int len_diff, unsigned int mode,
|
||
|
unsigned long long flags)
|
||
|
KERNEL_HELPER (50);
|
||
|
|
||
|
int bpf_redirect_map (void *map, int key, int flags)
|
||
|
KERNEL_HELPER (51);
|
||
|
|
||
|
int bpf_sk_redirect_map (void *ctx, void *map, int key, int flags)
|
||
|
KERNEL_HELPER (52);
|
||
|
|
||
|
int bpf_sock_map_update (void *map, void *key, void *value,
|
||
|
unsigned long long flags)
|
||
|
KERNEL_HELPER (53);
|
||
|
|
||
|
int bpf_xdp_adjust_meta (void *ctx, int offset)
|
||
|
KERNEL_HELPER (54);
|
||
|
|
||
|
int bpf_perf_event_read_value (void *map, unsigned long long flags,
|
||
|
void *buf, unsigned int buf_size)
|
||
|
KERNEL_HELPER (55);
|
||
|
|
||
|
int bpf_perf_prog_read_value (void *ctx, void *buf, unsigned int buf_size)
|
||
|
KERNEL_HELPER (56);
|
||
|
|
||
|
int bpf_getsockopt (void *ctx, int level, int optname, void *optval,
|
||
|
int optlen)
|
||
|
KERNEL_HELPER (57);
|
||
|
|
||
|
int bpf_override_return (void *ctx, unsigned long rc)
|
||
|
KERNEL_HELPER (58);
|
||
|
|
||
|
int bpf_sock_ops_cb_flags_set (void *ctx, int flags)
|
||
|
KERNEL_HELPER (59);
|
||
|
|
||
|
int bpf_msg_redirect_map (void *ctx, void *map, int key, int flags)
|
||
|
KERNEL_HELPER (60);
|
||
|
|
||
|
int bpf_msg_apply_bytes (void *ctx, int len)
|
||
|
KERNEL_HELPER (61);
|
||
|
|
||
|
int bpf_msg_cork_bytes (void *ctx, int len)
|
||
|
KERNEL_HELPER (62);
|
||
|
|
||
|
int bpf_msg_pull_data (void *, int len)
|
||
|
KERNEL_HELPER (63);
|
||
|
|
||
|
int bpf_bind (void *ctx, void *addr, int addr_len)
|
||
|
KERNEL_HELPER (64);
|
||
|
|
||
|
int bpf_xdp_adjust_tail (struct xdp_md *xdp_md, int delta)
|
||
|
KERNEL_HELPER (65);
|
||
|
|
||
|
int bpf_skb_get_xfrm_state (void *ctx, int index, void *state,
|
||
|
int size, int flags)
|
||
|
KERNEL_HELPER (66);
|
||
|
|
||
|
int bpf_get_stack (void *ctx, void *buf, int size, int flags)
|
||
|
KERNEL_HELPER (67);
|
||
|
|
||
|
int bpf_skb_load_bytes_relative (void *ctx, int off, void *to, int len,
|
||
|
unsigned int start_header)
|
||
|
KERNEL_HELPER (68);
|
||
|
|
||
|
int bpf_fib_lookup (void *ctx, struct bpf_fib_lookup *params,
|
||
|
int plen, unsigned int flags)
|
||
|
KERNEL_HELPER (69);
|
||
|
|
||
|
int bpf_sock_hash_update (void *map, void *key, void *value,
|
||
|
unsigned long long flags)
|
||
|
KERNEL_HELPER (70);
|
||
|
|
||
|
int bpf_msg_redirect_hash (void *ctx, void *map, void *key, int flags)
|
||
|
KERNEL_HELPER (71);
|
||
|
|
||
|
int bpf_sk_redirect_hash (void *ctx, void *map, void *key, int flags)
|
||
|
KERNEL_HELPER (72);
|
||
|
|
||
|
int bpf_lwt_push_encap (void *ctx, unsigned int type, void *hdr,
|
||
|
unsigned int len)
|
||
|
KERNEL_HELPER (73);
|
||
|
|
||
|
int bpf_lwt_seg6_store_bytes (void *ctx, unsigned int offset,
|
||
|
void *from, unsigned int len)
|
||
|
KERNEL_HELPER (74);
|
||
|
|
||
|
int bpf_lwt_seg6_adjust_srh (void *ctx, unsigned int offset,
|
||
|
unsigned int len)
|
||
|
KERNEL_HELPER (75);
|
||
|
|
||
|
int bpf_lwt_seg6_action (void *ctx, unsigned int action, void *param,
|
||
|
unsigned int param_len)
|
||
|
KERNEL_HELPER (76);
|
||
|
|
||
|
int bpf_rc_repeat (void *ctx)
|
||
|
KERNEL_HELPER (77);
|
||
|
|
||
|
int bpf_rc_keydown (void *ctx, unsigned int protocol,
|
||
|
unsigned long long scancode, unsigned int toggle)
|
||
|
KERNEL_HELPER (78);
|
||
|
|
||
|
unsigned bpf_skb_cgroup_id (void *ctx)
|
||
|
KERNEL_HELPER (79);
|
||
|
|
||
|
unsigned long long bpf_get_current_cgroup_id (void)
|
||
|
KERNEL_HELPER (80);
|
||
|
|
||
|
void *bpf_get_local_storage (void *map, unsigned long long flags)
|
||
|
KERNEL_HELPER (81);
|
||
|
|
||
|
int bpf_sk_select_reuseport (void *ctx, void *map, void *key, unsigned int flags)
|
||
|
KERNEL_HELPER (82);
|
||
|
|
||
|
unsigned long long bpf_skb_ancestor_cgroup_id (void *ctx, int level)
|
||
|
KERNEL_HELPER (83);
|
||
|
|
||
|
struct bpf_sock *bpf_sk_lookup_tcp (void *ctx, struct bpf_sock_tuple *tuple,
|
||
|
int size, unsigned long long netns_id,
|
||
|
unsigned long long flags)
|
||
|
KERNEL_HELPER (84);
|
||
|
|
||
|
struct bpf_sock *bpf_sk_lookup_udp (void *ctx, struct bpf_sock_tuple *tuple,
|
||
|
int size, unsigned long long netns_id,
|
||
|
unsigned long long flags)
|
||
|
KERNEL_HELPER (85);
|
||
|
|
||
|
int bpf_sk_release (struct bpf_sock *sk)
|
||
|
KERNEL_HELPER (86);
|
||
|
|
||
|
int bpf_map_push_elem (void *map, const void *value, unsigned long long flags)
|
||
|
KERNEL_HELPER (87);
|
||
|
|
||
|
int bpf_map_pop_elem (void *map, void *value)
|
||
|
KERNEL_HELPER (88);
|
||
|
|
||
|
int bpf_map_peek_elem (void *map, void *value)
|
||
|
KERNEL_HELPER (89);
|
||
|
|
||
|
int bpf_msg_push_data (void *ctx, int start, int cut, int flags)
|
||
|
KERNEL_HELPER (90);
|
||
|
|
||
|
int bpf_msg_pop_data (void *ctx, int start, int cut, int flags)
|
||
|
KERNEL_HELPER (91);
|
||
|
|
||
|
int bpf_rc_pointer_rel (void *ctx, int rel_x, int rel_y)
|
||
|
KERNEL_HELPER (92);
|
||
|
|
||
|
void bpf_spin_lock (struct bpf_spin_lock *lock)
|
||
|
KERNEL_HELPER (93);
|
||
|
|
||
|
void bpf_spin_unlock (struct bpf_spin_lock *lock)
|
||
|
KERNEL_HELPER (94);
|
||
|
|
||
|
struct bpf_sock *bpf_sk_fullsock (struct bpf_sock *sk)
|
||
|
KERNEL_HELPER (95);
|
||
|
|
||
|
struct bpf_sock *bpf_tcp_sock (struct bpf_sock *sk)
|
||
|
KERNEL_HELPER (96);
|
||
|
|
||
|
int bpf_skb_ecn_set_ce (void *ctx)
|
||
|
KERNEL_HELPER (97);
|
||
|
|
||
|
struct bpf_sock *bpf_get_listener_sock (struct bpf_sock *sk)
|
||
|
KERNEL_HELPER (98);
|
||
|
|
||
|
struct bpf_sock *bpf_skc_lookup_tcp (void *ctx,
|
||
|
struct bpf_sock_tuple *tuple,
|
||
|
unsigned int tuple_size,
|
||
|
unsigned long netns,
|
||
|
unsigned long flags)
|
||
|
KERNEL_HELPER (99);
|
||
|
|
||
|
int bpf_tcp_check_syncookie (struct bpf_sock *sk, void *iph,
|
||
|
unsigned int iph_len,
|
||
|
struct tcp_hdr *th,
|
||
|
unsigned int th_len)
|
||
|
KERNEL_HELPER (100);
|
||
|
|
||
|
int bpf_sysctl_get_name (struct bpf_sysctl *ctx,
|
||
|
char *buf, unsigned long buf_len,
|
||
|
unsigned long flags)
|
||
|
KERNEL_HELPER (101);
|
||
|
|
||
|
int bpf_sysctl_get_current_value (struct bpf_sysctl *ctx,
|
||
|
char *buf, unsigned long buf_len)
|
||
|
KERNEL_HELPER (102);
|
||
|
|
||
|
int bpf_sysctl_get_new_value (struct bpf_sysctl *ctx, char *buf,
|
||
|
unsigned long buf_len)
|
||
|
KERNEL_HELPER (103);
|
||
|
|
||
|
int bpf_sysctl_set_new_value (struct bpf_sysctl *ctx, const char *buf,
|
||
|
unsigned long buf_len)
|
||
|
KERNEL_HELPER (104);
|
||
|
|
||
|
int bpf_strtol (const char *buf, unsigned long buf_len,
|
||
|
unsigned long flags, long *res)
|
||
|
KERNEL_HELPER (105);
|
||
|
|
||
|
int bpf_strtoul (const char *buf, unsigned long buf_len,
|
||
|
unsigned long flags, unsigned long *res)
|
||
|
KERNEL_HELPER (106);
|
||
|
|
||
|
void *bpf_sk_storage_get (void *map, struct bpf_sock *sk,
|
||
|
void *value, long flags)
|
||
|
KERNEL_HELPER (107);
|
||
|
|
||
|
int bpf_sk_storage_delete (void *map, struct bpf_sock *sk)
|
||
|
KERNEL_HELPER (108);
|
||
|
|
||
|
/* Functions to emit BPF_LD_ABS and BPF_LD_IND instructions. We
|
||
|
provide the "standard" names as synonyms of the corresponding GCC
|
||
|
builtins. Note how the SKB argument is ignored. */
|
||
|
|
||
|
#define load_byte(SKB,OFF) __builtin_bpf_load_byte ((OFF))
|
||
|
#define load_half(SKB,OFF) __builtin_bpf_load_half ((OFF))
|
||
|
#define load_word(SKB,OFF) __builtin_bpf_load_word ((OFF))
|
||
|
|
||
|
struct bpf_map_def
|
||
|
{
|
||
|
unsigned int type;
|
||
|
unsigned int key_size;
|
||
|
unsigned int value_size;
|
||
|
unsigned int max_entries;
|
||
|
unsigned int map_flags;
|
||
|
unsigned int inner_map_idx;
|
||
|
unsigned int numa_node;
|
||
|
};
|
||
|
|
||
|
#endif /* ! __BPF_HELPERS_H */
|