blob: 1dd05c8ef6902db949289c88da3c11bb38a26b51 [file] [log] [blame]
/* Copyright (C) 2019-2020 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))
/* 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)
/* Functions to call kernel helpers. We provide the "standard" bpf_*
names as synonyms of the corresponding GCC builtins. In some
cases, where non-void pointers are passed to the helper, inline
functions are used to achieve proper type checking. */
#ifndef KERNEL_VERSION
# define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
#endif
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,0,0)
#define bpf_map_lookup_elem __builtin_bpf_helper_map_lookup_elem
#define bpf_map_update_elem __builtin_bpf_helper_map_update_elem
#define bpf_map_delete_elem __builtin_bpf_helper_map_delete_elem
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,1,0)
#define bpf_probe_read __builtin_bpf_helper_probe_read
#define bpf_ktime_get_ns __builtin_bpf_helper_ktime_get_ns
#define bpf_trace_printk __builtin_bpf_helper_trace_printk
#define bpf_get_prandom_u32 __builtin_bpf_helper_get_prandom_u32
#define bpf_get_smp_processor_id __builtin_bpf_helper_get_smp_processor_id
#define bpf_skb_store_bytes __builtin_bpf_helper_skb_store_bytes
#define bpf_l3_csum_replace __builtin_bpf_helper_l3_csum_replace
#define bpf_l4_csum_replace __builtin_bpf_helper_l4_csum_replace
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,2,0)
#define bpf_tail_call __builtin_bpf_helper_tail_call
#define bpf_clone_redirect __builtin_bpf_helper_clone_redirect
#define bpf_get_current_pid_tgid __builtin_bpf_helper_get_current_pid_tgid
#define bpf_get_current_uid_gid __builtin_bpf_helper_get_current_uid_gid
#define bpf_get_current_comm __builtin_bpf_helper_get_current_comm
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,3,0)
#define bpf_get_cgroup_classid __builtin_bpf_helper_get_cgroup_classid
#define bpf_skb_vlan_push __builtin_bpf_helper_skb_vlan_push
#define bpf_skb_vlan_pop __builtin_bpf_helper_skb_vlan_pop
#define bpf_skb_get_tunnel_key __builtin_bpf_helper_skb_get_tunnel_key
#define bpf_skb_set_tunnel_key __builtin_bpf_helper_skb_set_tunnel_key
#define bpf_perf_event_read __builtin_bpf_helper_perf_event_read
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,4,0)
#define bpf_redirect __builtin_bpf_helper_redirect
#define bpf_get_route_realm __builtin_bpf_helper_get_route_realm
#define bpf_perf_event_output __builtin_bpf_helper_perf_event_output
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,5,0)
#define bpf_skb_load_bytes __builtin_bpf_helper_skb_load_bytes
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,6,0)
#define bpf_get_stackid __builtin_bpf_helper_get_stackid
#define bpf_csum_diff __builtin_bpf_helper_csum_diff
#define bpf_skb_get_tunnel_opt __builtin_bpf_helper_skb_get_tunnel_opt
#define bpf_skb_set_tunnel_opt __builtin_bpf_helper_skb_set_tunnel_opt
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,8,0)
#define bpf_skb_change_proto __builtin_bpf_helper_skb_change_proto
#define bpf_skb_change_type __builtin_bpf_helper_skb_change_type
#define bpf_skb_under_cgroup __builtin_bpf_helper_skb_under_cgroup
#define bpf_get_hash_recalc __builtin_bpf_helper_get_hash_recalc
#define bpf_get_current_task __builtin_bpf_helper_get_current_task
#define bpf_probe_write_user __builtin_bpf_helper_probe_write_user
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,9,0)
#define bpf_current_task_under_cgroup __builtin_bpf_helper_current_task_under_cgroup
#define bpf_skb_change_tail __builtin_bpf_helper_skb_change_tail
#define bpf_skb_pull_data __builtin_bpf_helper_skb_pull_data
#define bpf_csum_update __builtin_bpf_helper_csum_update
#define bpf_set_hash_invalid __builtin_bpf_helper_set_hash_invalid
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,10,0)
#define bpf_get_numa_node_id __builtin_bpf_helper_get_numa_node_id
#define bpf_skb_change_head __builtin_bpf_helper_skb_change_head
#define bpf_xdp_adjust_head __builtin_bpf_helper_xdp_adjust_head
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,11,0)
#define bpf_probe_read_str __builtin_bpf_helper_probe_read_str
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,12,0)
#define bpf_get_socket_cookie __builtin_bpf_helper_get_socket_cookie
#define bpf_get_socket_uid __builtin_bpf_helper_get_socket_uid
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,13,0)
#define bpf_set_hash __builtin_bpf_helper_set_hash
#define bpf_setsockopt __builtin_bpf_helper_setsockopt
#define bpf_skb_adjust_room __builtin_bpf_helper_skb_adjust_room
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,14,0)
#define bpf_redirect_map __builtin_bpf_helper_redirect_map
#define bpf_sk_redirect_map __builtin_bpf_helper_sk_redirect_map
#define bpf_sock_map_update __builtin_bpf_helper_sock_map_update
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,15,0)
#define bpf_perf_event_read_value __builtin_bpf_helper_perf_event_read_value
#define bpf_perf_prog_read_value __builtin_bpf_helper_perf_prog_read_value
#define bpf_getsockopt __builtin_bpf_helper_getsockopt
#define bpf_xdp_adjust_meta __builtin_bpf_helper_xdp_adjust_meta
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,16,0)
#define bpf_override_return __builtin_bpf_helper_override_return
#define bpf_sock_ops_cb_flags_set __builtin_bpf_helper_sock_ops_cb_flags_set
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,17,0)
#define bpf_msg_redirect_map __builtin_bpf_helper_msg_redirect_map
#define bpf_msg_apply_bytes __builtin_bpf_helper_msg_apply_bytes
#define bpf_msg_cork_bytes __builtin_bpf_helper_msg_cork_bytes
#define bpf_pull_data __builtin_bpf_helper_pull_data
#define bpf_bind __builtin_bpf_helper_bpf_bind
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,18,0)
#define bpf_xdp_adjust_tail __builtin_bpf_helper_xdp_adjust_tail
#define bpf_skb_get_xfrm_state __builtin_bpf_helper_skb_get_xfrm_state
#define bpf_get_stack __builtin_bpf_helper_get_stack
#define bpf_skb_load_bytes_relative __builtin_bpf_helper_skb_load_bytes_relative
#define bpf_sock_hash_update __builtin_bpf_helper_sock_hash_update
#define bpf_msg_redirect_hash __builtin_bpf_helper_msg_redirect_hash
#define bpf_sk_redirect_hash __builtin_bpf_helper_sk_redirect_hash
#define bpf_lwt_push_encap __builtin_bpf_helper_lwt_push_encap
#define bpf_lwt_seg6_store_bytes __builtin_bpf_helper_lwt_seg6_store_bytes
#define bpf_lwt_seg6_adjust_srh __builtin_bpf_helper_lwt_seg6_adjust_srh
#define bpf_lwt_seg6_action __builtin_bpf_helper_lwt_seg6_action
#define bpf_rc_repeat __builtin_bpf_helper_rc_repeat
#define bpf_rc_keydown __builtin_bpf_helper_rc_keydown
#define bpf_skb_cgroup_id __builtin_bpf_helper_skb_cgroup_id
#define bpf_get_current_cgroup_id __builtin_bpf_helper_get_current_cgroup_id
static inline int
bpf_fib_lookup (void *ctx, struct bpf_fib_lookup *param, int plen,
unsigned int flags)
{
return __builtin_bpf_helper_fib_lookup (ctx, (void *) param, plen, flags);
}
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,19,0)
#define bpf_get_local_storage __builtin_bpf_helper_get_local_storage
#define bpf_sk_select_reuseport __builtin_bpf_helper_sk_select_reuseport
#define bpf_skb_ancestor_cgroup_id __builtin_bpf_helper_skb_ancestor_cgroup_id
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (4,20,0)
#define bpf_sk_release __builtin_bpf_helper_sk_release
#define bpf_map_push_elem __builtin_bpf_helper_map_push_elem
#define bpf_map_pop_elem __builtin_bpf_helper_map_pop_elem
#define bpf_map_peek_elem __builtin_bpf_helper_map_peek_elem
#define bpf_msg_push_data __builtin_bpf_helper_msg_push_data
static inline 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)
{
return
(struct bpf_sock *) __builtin_bpf_helper_sk_lookup_tcp (ctx,
(void *) tuple,
size,
netns_id, flags);
}
static inline 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)
{
return
(struct bpf_sock *) __builtin_bpf_helper_sk_lookup_udp (ctx,
(void *) tuple,
size,
netns_id, flags);
}
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (5,0,0)
#define bpf_msg_pop_data __builtin_bpf_helper_pop_data
#define bpf_rc_pointer_rel __builtin_bpf_helper_rc_pointer_rel
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (5,1,0)
#define bpf_spin_lock __builtin_bpf_helper_spin_lock
#define bpf_spin_unlock __builtin_bpf_helper_spin_unlock
#define bpf_skb_ecn_set_ce __builtin_bpf_helper_skb_ecn_set_ce
static inline struct bpf_sock *
bpf_sk_fullsock (struct bpf_sock *sk)
{
return
(struct bpf_sock *) __builtin_bpf_helper_sk_fullsock ((void *) sk);
}
static inline struct bpf_sock *
bpf_tcp_sock (struct bpf_sock *sk)
{
return
(struct bpf_sock *) __builtin_bpf_helper_tcp_sock ((void *) sk);
}
static inline struct bpf_sock *
bpf_get_listener_sock (struct bpf_sock *sk)
{
return
(struct bpf_sock *) __builtin_bpf_helper_get_listener_sock ((void *) sk);
}
#if __BPF_KERNEL_VERSION_CODE__ >= KERNEL_VERSION (5,2,0)
#endif /* 5.2 */
#endif /* 5.1 */
#endif /* 5.0 */
#endif /* 4.20 */
#endif /* 4.19 */
#endif /* 4.18 */
#endif /* 4.17 */
#endif /* 4.16 */
#endif /* 4.15 */
#endif /* 4.14 */
#endif /* 4.13 */
#endif /* 4.12 */
#endif /* 4.11 */
#endif /* 4.10 */
#endif /* 4.9 */
#endif /* 4.8 */
#endif /* 4.6 */
#endif /* 4.5 */
#endif /* 4.4 */
#endif /* 4.3 */
#endif /* 4.2 */
#endif /* 4.1 */
#endif /* 4.0 */
/* 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. */
static inline long long
load_byte (void *skb __attribute__ ((unused)),
unsigned long long off)
{
return __builtin_bpf_load_byte (off);
}
static inline long long
load_half (void *skb __attribute__ ((unused)),
unsigned long long off)
{
return __builtin_bpf_load_half (off);
}
static inline long long
load_word (void *skb __attribute__ ((unused)),
unsigned long long off)
{
return __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 */