1#ifndef __BPF_API__ 2#define __BPF_API__ 3 4/* Note: 5 * 6 * This file can be included into eBPF kernel programs. It contains 7 * a couple of useful helper functions, map/section ABI (bpf_elf.h), 8 * misc macros and some eBPF specific LLVM built-ins. 9 */ 10 11#include <stdint.h> 12 13#include <linux/pkt_cls.h> 14#include <linux/bpf.h> 15#include <linux/filter.h> 16 17#include <asm/byteorder.h> 18 19#include "bpf_elf.h" 20 21/** Misc macros. */ 22 23#ifndef __stringify 24# define __stringify(X) #X 25#endif 26 27#ifndef __maybe_unused 28# define __maybe_unused __attribute__((__unused__)) 29#endif 30 31#ifndef offsetof 32# define offsetof(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER) 33#endif 34 35#ifndef likely 36# define likely(X) __builtin_expect(!!(X), 1) 37#endif 38 39#ifndef unlikely 40# define unlikely(X) __builtin_expect(!!(X), 0) 41#endif 42 43#ifndef htons 44# define htons(X) __constant_htons((X)) 45#endif 46 47#ifndef ntohs 48# define ntohs(X) __constant_ntohs((X)) 49#endif 50 51#ifndef htonl 52# define htonl(X) __constant_htonl((X)) 53#endif 54 55#ifndef ntohl 56# define ntohl(X) __constant_ntohl((X)) 57#endif 58 59/** Section helper macros. */ 60 61#ifndef __section 62# define __section(NAME) \ 63 __attribute__((section(NAME), used)) 64#endif 65 66#ifndef __section_tail 67# define __section_tail(ID, KEY) \ 68 __section(__stringify(ID) "/" __stringify(KEY)) 69#endif 70 71#ifndef __section_cls_entry 72# define __section_cls_entry \ 73 __section(ELF_SECTION_CLASSIFIER) 74#endif 75 76#ifndef __section_act_entry 77# define __section_act_entry \ 78 __section(ELF_SECTION_ACTION) 79#endif 80 81#ifndef __section_license 82# define __section_license \ 83 __section(ELF_SECTION_LICENSE) 84#endif 85 86#ifndef __section_maps 87# define __section_maps \ 88 __section(ELF_SECTION_MAPS) 89#endif 90 91/** Declaration helper macros. */ 92 93#ifndef BPF_LICENSE 94# define BPF_LICENSE(NAME) \ 95 char ____license[] __section_license = NAME 96#endif 97 98#ifndef __BPF_MAP 99# define __BPF_MAP(NAME, TYPE, ID, SIZE_KEY, SIZE_VALUE, PIN, MAX_ELEM) \ 100 struct bpf_elf_map __section_maps NAME = { \ 101 .type = (TYPE), \ 102 .id = (ID), \ 103 .size_key = (SIZE_KEY), \ 104 .size_value = (SIZE_VALUE), \ 105 .pinning = (PIN), \ 106 .max_elem = (MAX_ELEM), \ 107 } 108#endif 109 110#ifndef BPF_HASH 111# define BPF_HASH(NAME, ID, SIZE_KEY, SIZE_VALUE, PIN, MAX_ELEM) \ 112 __BPF_MAP(NAME, BPF_MAP_TYPE_HASH, ID, SIZE_KEY, SIZE_VALUE, \ 113 PIN, MAX_ELEM) 114#endif 115 116#ifndef BPF_ARRAY 117# define BPF_ARRAY(NAME, ID, SIZE_VALUE, PIN, MAX_ELEM) \ 118 __BPF_MAP(NAME, BPF_MAP_TYPE_ARRAY, ID, sizeof(uint32_t), \ 119 SIZE_VALUE, PIN, MAX_ELEM) 120#endif 121 122#ifndef BPF_ARRAY2 123# define BPF_ARRAY2(NAME, ID, PIN, MAX_ELEM) \ 124 BPF_ARRAY(NAME, ID, sizeof(uint16_t), PIN, MAX_ELEM) 125#endif 126 127#ifndef BPF_ARRAY4 128# define BPF_ARRAY4(NAME, ID, PIN, MAX_ELEM) \ 129 BPF_ARRAY(NAME, ID, sizeof(uint32_t), PIN, MAX_ELEM) 130#endif 131 132#ifndef BPF_ARRAY8 133# define BPF_ARRAY8(NAME, ID, PIN, MAX_ELEM) \ 134 BPF_ARRAY(NAME, ID, sizeof(uint64_t), PIN, MAX_ELEM) 135#endif 136 137#ifndef BPF_PROG_ARRAY 138# define BPF_PROG_ARRAY(NAME, ID, PIN, MAX_ELEM) \ 139 __BPF_MAP(NAME, BPF_MAP_TYPE_PROG_ARRAY, ID, sizeof(uint32_t), \ 140 sizeof(uint32_t), PIN, MAX_ELEM) 141#endif 142 143/** Classifier helper */ 144 145#ifndef BPF_H_DEFAULT 146# define BPF_H_DEFAULT -1 147#endif 148 149/** BPF helper functions for tc. */ 150 151#ifndef BPF_FUNC 152# define BPF_FUNC(NAME, ...) \ 153 (* NAME)(__VA_ARGS__) __maybe_unused = (void *) BPF_FUNC_##NAME 154#endif 155 156/* Map access/manipulation */ 157static void *BPF_FUNC(map_lookup_elem, void *map, const void *key); 158static int BPF_FUNC(map_update_elem, void *map, const void *key, 159 const void *value, uint32_t flags); 160static int BPF_FUNC(map_delete_elem, void *map, const void *key); 161 162/* Time access */ 163static uint64_t BPF_FUNC(ktime_get_ns); 164 165/* Debugging */ 166static void BPF_FUNC(trace_printk, const char *fmt, int fmt_size, ...); 167 168/* Random numbers */ 169static uint32_t BPF_FUNC(get_prandom_u32); 170 171/* Tail calls */ 172static void BPF_FUNC(tail_call, struct __sk_buff *skb, void *map, 173 uint32_t index); 174 175/* System helpers */ 176static uint32_t BPF_FUNC(get_smp_processor_id); 177 178/* Packet misc meta data */ 179static uint32_t BPF_FUNC(get_cgroup_classid, struct __sk_buff *skb); 180static uint32_t BPF_FUNC(get_route_realm, struct __sk_buff *skb); 181 182/* Packet redirection */ 183static int BPF_FUNC(redirect, int ifindex, uint32_t flags); 184static int BPF_FUNC(clone_redirect, struct __sk_buff *skb, int ifindex, 185 uint32_t flags); 186 187/* Packet manipulation */ 188#define BPF_PSEUDO_HDR 0x10 189#define BPF_HAS_PSEUDO_HDR(flags) ((flags) & BPF_PSEUDO_HDR) 190#define BPF_HDR_FIELD_SIZE(flags) ((flags) & 0x0f) 191 192static int BPF_FUNC(skb_store_bytes, struct __sk_buff *skb, uint32_t off, 193 void *from, uint32_t len, uint32_t flags); 194static int BPF_FUNC(l3_csum_replace, struct __sk_buff *skb, uint32_t off, 195 uint32_t from, uint32_t to, uint32_t flags); 196static int BPF_FUNC(l4_csum_replace, struct __sk_buff *skb, uint32_t off, 197 uint32_t from, uint32_t to, uint32_t flags); 198 199/* Packet vlan encap/decap */ 200static int BPF_FUNC(skb_vlan_push, struct __sk_buff *skb, uint16_t proto, 201 uint16_t vlan_tci); 202static int BPF_FUNC(skb_vlan_pop, struct __sk_buff *skb); 203 204/* Packet tunnel encap/decap */ 205static int BPF_FUNC(skb_get_tunnel_key, struct __sk_buff *skb, 206 struct bpf_tunnel_key *to, uint32_t size, uint32_t flags); 207static int BPF_FUNC(skb_set_tunnel_key, struct __sk_buff *skb, 208 struct bpf_tunnel_key *from, uint32_t size, uint32_t flags); 209 210/** LLVM built-ins */ 211 212#ifndef lock_xadd 213# define lock_xadd(ptr, val) ((void) __sync_fetch_and_add(ptr, val)) 214#endif 215 216unsigned long long load_byte(void *skb, unsigned long long off) 217 asm ("llvm.bpf.load.byte"); 218 219unsigned long long load_half(void *skb, unsigned long long off) 220 asm ("llvm.bpf.load.half"); 221 222unsigned long long load_word(void *skb, unsigned long long off) 223 asm ("llvm.bpf.load.word"); 224 225#endif /* __BPF_API__ */ 226