23#ifndef BACKENDS_EBPF_RUNTIME_EBPF_KERNEL_H_
24#define BACKENDS_EBPF_RUNTIME_EBPF_KERNEL_H_
26#include "ebpf_common.h"
28#include <bpf/bpf_endian.h>
32#define htons(d) bpf_htons(d)
33#define htonl(d) bpf_htonl(d)
34#define htonll(d) bpf_cpu_to_be64(d)
35#define ntohll(x) bpf_be64_to_cpu(x)
37#define bpf_htonll(x) htonll(x)
40#define load_byte(data, b) (*(((u8*)(data)) + (b)))
41#define load_half(data, b) bpf_ntohs(*(u16 *)((u8*)(data) + (b)))
42#define load_word(data, b) bpf_ntohl(*(u32 *)((u8*)(data) + (b)))
43#define load_dword(data, b) bpf_be64_to_cpu(*(u64 *)((u8*)(data) + (b)))
55#define BPF_USER_MAP_UPDATE_ELEM(index, key, value, flags)\
56 bpf_map_update_elem(index, key, value, flags)
57#define BPF_OBJ_PIN(table, name) bpf_obj_pin(table, name)
58#define BPF_OBJ_GET(name) bpf_obj_get(name)
62#include <linux/pkt_cls.h>
65#include <bpf/bpf_helpers.h>
84#define SK_BUFF struct __sk_buff
87#define BPF_ANNOTATE_KV_PAIR(name, type_key, type_val) \
88 struct ____btf_map_##name { \
92 struct ____btf_map_##name \
93 __attribute__ ((section(".maps." #name), used)) \
94 ____btf_map_##name = {};
96#define REGISTER_START()
99#define REGISTER_TABLE(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES) \
100struct bpf_elf_map SEC("maps") NAME = { \
102 .size_key = sizeof(KEY_TYPE), \
103 .size_value = sizeof(VALUE_TYPE), \
104 .max_elem = MAX_ENTRIES, \
108#define REGISTER_TABLE_INNER(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, ID, INNER_IDX) \
109struct bpf_elf_map SEC("maps") NAME = { \
111 .size_key = sizeof(KEY_TYPE), \
112 .size_value = sizeof(VALUE_TYPE), \
113 .max_elem = MAX_ENTRIES, \
117 .inner_idx = INNER_IDX, \
119#define REGISTER_TABLE_OUTER(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, INNER_ID, INNER_NAME) \
120struct bpf_elf_map SEC("maps") NAME = { \
122 .size_key = sizeof(KEY_TYPE), \
123 .size_value = sizeof(VALUE_TYPE), \
124 .max_elem = MAX_ENTRIES, \
127 .inner_id = INNER_ID, \
129#define REGISTER_TABLE_FLAGS(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, FLAGS) \
130struct bpf_elf_map SEC("maps") NAME = { \
132 .size_key = sizeof(KEY_TYPE), \
133 .size_value = sizeof(VALUE_TYPE), \
134 .max_elem = MAX_ENTRIES, \
139#define REGISTER_TABLE(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES) \
141 __uint(type, TYPE); \
144 __uint(max_entries, MAX_ENTRIES); \
145 __uint(pinning, LIBBPF_PIN_BY_NAME); \
147#define REGISTER_TABLE_FLAGS(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, FLAGS) \
149 __uint(type, TYPE); \
152 __uint(max_entries, MAX_ENTRIES); \
153 __uint(pinning, LIBBPF_PIN_BY_NAME); \
154 __uint(map_flags, FLAGS); \
156#define REGISTER_TABLE_INNER(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, ID, INNER_IDX) \
158 __uint(type, TYPE); \
161 __uint(max_entries, MAX_ENTRIES); \
163#define REGISTER_TABLE_OUTER(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, INNER_ID, INNER_NAME) \
165 __uint(type, TYPE); \
168 __uint(max_entries, MAX_ENTRIES); \
169 __uint(pinning, LIBBPF_PIN_BY_NAME); \
170 __array(values, struct INNER_NAME); \
172#define REGISTER_TABLE_NO_KEY_TYPE(NAME, TYPE, KEY_SIZE, VALUE_TYPE, MAX_ENTRIES) \
174 __uint(type, TYPE); \
175 __uint(key_size, KEY_SIZE); \
177 __uint(max_entries, MAX_ENTRIES); \
178 __uint(pinning, LIBBPF_PIN_BY_NAME); \
181#define REGISTER_END()
183#define BPF_MAP_LOOKUP_ELEM(table, key) \
184 bpf_map_lookup_elem(&table, key)
185#define BPF_MAP_UPDATE_ELEM(table, key, value, flags) \
186 bpf_map_update_elem(&table, key, value, flags)
187#define BPF_MAP_DELETE_ELEM(table, key) \
188 bpf_map_delete_elem(&table, key)
189#define BPF_USER_MAP_UPDATE_ELEM(index, key, value, flags)\
190 bpf_update_elem(index, key, value, flags)
191#define BPF_OBJ_PIN(table, name) bpf_obj_pin(table, name)
192#define BPF_OBJ_GET(name) bpf_obj_get(name)
Definition ebpf_kernel.h:71