 |
P4C
The P4 Compiler
|
Loading...
Searching...
No Matches
12#ifndef BACKENDS_EBPF_RUNTIME_EBPF_KERNEL_H_
13#define BACKENDS_EBPF_RUNTIME_EBPF_KERNEL_H_
19#include "ebpf_common.h"
21#include "install/libbpf/include/bpf/bpf_endian.h"
25#define htons(d) bpf_htons(d)
26#define htonl(d) bpf_htonl(d)
27#define htonll(d) bpf_cpu_to_be64(d)
28#define ntohll(x) bpf_be64_to_cpu(x)
30#define bpf_htonll(x) htonll(x)
33#define load_byte(data, b) (*(((u8*)(data)) + (b)))
34#define load_half(data, b) bpf_ntohs(*(u16 *)((u8*)(data) + (b)))
35#define load_word(data, b) bpf_ntohl(*(u32 *)((u8*)(data) + (b)))
36#define load_dword(data, b) bpf_be64_to_cpu(*(u64 *)((u8*)(data) + (b)))
45#include "install/libbpf/include/bpf/bpf.h"
47#define BPF_USER_MAP_UPDATE_ELEM(index, key, value, flags)\
48 bpf_map_update_elem(index, key, value, flags)
49#define BPF_OBJ_PIN(table, name) bpf_obj_pin(table, name)
50#define BPF_OBJ_GET(name) bpf_obj_get(name)
55#include "contrib/bpftool/include/uapi/linux/bpf.h"
56#include "contrib/bpftool/include/uapi/linux/pkt_cls.h"
58#include "install/libbpf/include/bpf/bpf_helpers.h"
62#define MAPS_ELF_SEC ".maps"
66#define SK_BUFF struct __sk_buff
70#define BPF_ANNOTATE_KV_PAIR(name, type_key, type_val) \
71 struct ____btf_map_##name { \
75 struct ____btf_map_##name \
76 __attribute__ ((section(".maps." #name), used)) \
77 ____btf_map_##name = {};
79#define REGISTER_START()
81#if !defined(BTF) && (defined(__clang__) && (__clang_major__ < 12))
97#define REGISTER_TABLE(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES) \
98struct bpf_elf_map SEC("maps") NAME = { \
100 .size_key = sizeof(KEY_TYPE), \
101 .size_value = sizeof(VALUE_TYPE), \
102 .max_elem = MAX_ENTRIES, \
106#define REGISTER_TABLE_INNER(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, ID, INNER_IDX) \
107struct bpf_elf_map SEC("maps") NAME = { \
109 .size_key = sizeof(KEY_TYPE), \
110 .size_value = sizeof(VALUE_TYPE), \
111 .max_elem = MAX_ENTRIES, \
115 .inner_idx = INNER_IDX, \
117#define REGISTER_TABLE_OUTER(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, INNER_ID, INNER_NAME) \
118struct bpf_elf_map SEC("maps") NAME = { \
120 .size_key = sizeof(KEY_TYPE), \
121 .size_value = sizeof(VALUE_TYPE), \
122 .max_elem = MAX_ENTRIES, \
125 .inner_id = INNER_ID, \
127#define REGISTER_TABLE_FLAGS(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, FLAGS) \
128struct bpf_elf_map SEC("maps") NAME = { \
130 .size_key = sizeof(KEY_TYPE), \
131 .size_value = sizeof(VALUE_TYPE), \
132 .max_elem = MAX_ENTRIES, \
137#define REGISTER_TABLE(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES) \
139 __uint(type, TYPE); \
142 __uint(max_entries, MAX_ENTRIES); \
143 __uint(pinning, LIBBPF_PIN_BY_NAME); \
144} NAME SEC(MAPS_ELF_SEC);
145#define REGISTER_TABLE_FLAGS(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, FLAGS) \
147 __uint(type, TYPE); \
150 __uint(max_entries, MAX_ENTRIES); \
151 __uint(pinning, LIBBPF_PIN_BY_NAME); \
152 __uint(map_flags, FLAGS); \
153} NAME SEC(MAPS_ELF_SEC);
154#define REGISTER_TABLE_INNER(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, ID, INNER_IDX) \
156 __uint(type, TYPE); \
159 __uint(max_entries, MAX_ENTRIES); \
160} NAME SEC(MAPS_ELF_SEC);
161#define REGISTER_TABLE_OUTER(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, INNER_ID, INNER_NAME) \
163 __uint(type, TYPE); \
166 __uint(max_entries, MAX_ENTRIES); \
167 __uint(pinning, LIBBPF_PIN_BY_NAME); \
168 __array(values, struct INNER_NAME); \
169} NAME SEC(MAPS_ELF_SEC);
170#define REGISTER_TABLE_NO_KEY_TYPE(NAME, TYPE, KEY_SIZE, VALUE_TYPE, MAX_ENTRIES) \
172 __uint(type, TYPE); \
173 __uint(key_size, KEY_SIZE); \
175 __uint(max_entries, MAX_ENTRIES); \
176 __uint(pinning, LIBBPF_PIN_BY_NAME); \
177} NAME SEC(MAPS_ELF_SEC);
179#define REGISTER_END()
181#define BPF_MAP_LOOKUP_ELEM(table, key) \
182 bpf_map_lookup_elem(&table, key)
183#define BPF_MAP_UPDATE_ELEM(table, key, value, flags) \
184 bpf_map_update_elem(&table, key, value, flags)
185#define BPF_MAP_DELETE_ELEM(table, key) \
186 bpf_map_delete_elem(&table, key)
187#define BPF_USER_MAP_UPDATE_ELEM(index, key, value, flags)\
188 bpf_update_elem(index, key, value, flags)
189#define BPF_OBJ_PIN(table, name) bpf_obj_pin(table, name)
190#define BPF_OBJ_GET(name) bpf_obj_get(name)