 |
P4C
The P4 Compiler
|
Loading...
Searching...
No Matches
21#ifndef BACKENDS_EBPF_RUNTIME_EBPF_KERNEL_H_
22#define BACKENDS_EBPF_RUNTIME_EBPF_KERNEL_H_
28#include "ebpf_common.h"
30#include "install/libbpf/include/bpf/bpf_endian.h"
34#define htons(d) bpf_htons(d)
35#define htonl(d) bpf_htonl(d)
36#define htonll(d) bpf_cpu_to_be64(d)
37#define ntohll(x) bpf_be64_to_cpu(x)
39#define bpf_htonll(x) htonll(x)
42#define load_byte(data, b) (*(((u8*)(data)) + (b)))
43#define load_half(data, b) bpf_ntohs(*(u16 *)((u8*)(data) + (b)))
44#define load_word(data, b) bpf_ntohl(*(u32 *)((u8*)(data) + (b)))
45#define load_dword(data, b) bpf_be64_to_cpu(*(u64 *)((u8*)(data) + (b)))
54#include "install/libbpf/include/bpf/bpf.h"
56#define BPF_USER_MAP_UPDATE_ELEM(index, key, value, flags)\
57 bpf_map_update_elem(index, key, value, flags)
58#define BPF_OBJ_PIN(table, name) bpf_obj_pin(table, name)
59#define BPF_OBJ_GET(name) bpf_obj_get(name)
64#include "contrib/bpftool/include/uapi/linux/bpf.h"
65#include "contrib/bpftool/include/uapi/linux/pkt_cls.h"
67#include "install/libbpf/include/bpf/bpf_helpers.h"
71#define MAPS_ELF_SEC ".maps"
75#define SK_BUFF struct __sk_buff
79#define BPF_ANNOTATE_KV_PAIR(name, type_key, type_val) \
80 struct ____btf_map_##name { \
84 struct ____btf_map_##name \
85 __attribute__ ((section(".maps." #name), used)) \
86 ____btf_map_##name = {};
88#define REGISTER_START()
90#if !defined(BTF) && (defined(__clang__) && (__clang_major__ < 12))
106#define REGISTER_TABLE(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES) \
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#define REGISTER_TABLE_INNER(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, ID, INNER_IDX) \
116struct bpf_elf_map SEC("maps") NAME = { \
118 .size_key = sizeof(KEY_TYPE), \
119 .size_value = sizeof(VALUE_TYPE), \
120 .max_elem = MAX_ENTRIES, \
124 .inner_idx = INNER_IDX, \
126#define REGISTER_TABLE_OUTER(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, INNER_ID, INNER_NAME) \
127struct bpf_elf_map SEC("maps") NAME = { \
129 .size_key = sizeof(KEY_TYPE), \
130 .size_value = sizeof(VALUE_TYPE), \
131 .max_elem = MAX_ENTRIES, \
134 .inner_id = INNER_ID, \
136#define REGISTER_TABLE_FLAGS(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, FLAGS) \
137struct bpf_elf_map SEC("maps") NAME = { \
139 .size_key = sizeof(KEY_TYPE), \
140 .size_value = sizeof(VALUE_TYPE), \
141 .max_elem = MAX_ENTRIES, \
146#define REGISTER_TABLE(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES) \
148 __uint(type, TYPE); \
151 __uint(max_entries, MAX_ENTRIES); \
152 __uint(pinning, LIBBPF_PIN_BY_NAME); \
153} NAME SEC(MAPS_ELF_SEC);
154#define REGISTER_TABLE_FLAGS(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, FLAGS) \
156 __uint(type, TYPE); \
159 __uint(max_entries, MAX_ENTRIES); \
160 __uint(pinning, LIBBPF_PIN_BY_NAME); \
161 __uint(map_flags, FLAGS); \
162} NAME SEC(MAPS_ELF_SEC);
163#define REGISTER_TABLE_INNER(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, ID, INNER_IDX) \
165 __uint(type, TYPE); \
168 __uint(max_entries, MAX_ENTRIES); \
169} NAME SEC(MAPS_ELF_SEC);
170#define REGISTER_TABLE_OUTER(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, INNER_ID, INNER_NAME) \
172 __uint(type, TYPE); \
175 __uint(max_entries, MAX_ENTRIES); \
176 __uint(pinning, LIBBPF_PIN_BY_NAME); \
177 __array(values, struct INNER_NAME); \
178} NAME SEC(MAPS_ELF_SEC);
179#define REGISTER_TABLE_NO_KEY_TYPE(NAME, TYPE, KEY_SIZE, VALUE_TYPE, MAX_ENTRIES) \
181 __uint(type, TYPE); \
182 __uint(key_size, KEY_SIZE); \
184 __uint(max_entries, MAX_ENTRIES); \
185 __uint(pinning, LIBBPF_PIN_BY_NAME); \
186} NAME SEC(MAPS_ELF_SEC);
188#define REGISTER_END()
190#define BPF_MAP_LOOKUP_ELEM(table, key) \
191 bpf_map_lookup_elem(&table, key)
192#define BPF_MAP_UPDATE_ELEM(table, key, value, flags) \
193 bpf_map_update_elem(&table, key, value, flags)
194#define BPF_MAP_DELETE_ELEM(table, key) \
195 bpf_map_delete_elem(&table, key)
196#define BPF_USER_MAP_UPDATE_ELEM(index, key, value, flags)\
197 bpf_update_elem(index, key, value, flags)
198#define BPF_OBJ_PIN(table, name) bpf_obj_pin(table, name)
199#define BPF_OBJ_GET(name) bpf_obj_get(name)