P4C
The P4 Compiler
Loading...
Searching...
No Matches
ebpf_kernel.h
1/*
2 * Copyright 2018 VMware, Inc.
3 * SPDX-FileCopyrightText: 2018 VMware, Inc.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8
12#ifndef BACKENDS_EBPF_RUNTIME_EBPF_KERNEL_H_
13#define BACKENDS_EBPF_RUNTIME_EBPF_KERNEL_H_
14
15#include <stddef.h> // size_t
16
17#include <sys/types.h> // ssize_t
18
19#include "ebpf_common.h"
20
21#include "install/libbpf/include/bpf/bpf_endian.h" // definitions for bpf_ntohs etc...
22
23#undef htonl
24#undef htons
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)
29#ifndef bpf_htonll
30#define bpf_htonll(x) htonll(x)
31#endif
32
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)))
37
42
43#ifdef CONTROL_PLANE // BEGIN EBPF USER SPACE DEFINITIONS
44
45#include "install/libbpf/include/bpf/bpf.h" // bpf_obj_get/pin, bpf_map_update_elem
46
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)
51
52#else // BEGIN EBPF KERNEL DEFINITIONS
53
54// These files are provided by the system, not libbpf.
55#include "contrib/bpftool/include/uapi/linux/bpf.h" // BPF_ANY,
56#include "contrib/bpftool/include/uapi/linux/pkt_cls.h" // TC_ACT_OK, TC_ACT_SHOT
57// This file contains the definitions of all the kernel bpf essentials
58#include "install/libbpf/include/bpf/bpf_helpers.h"
59
60// TODO: Use this include instead of the define directive once Ubuntu 18.04 is deprecated.
61// #include "install/libbpf/include/bpf/btf.h"
62#define MAPS_ELF_SEC ".maps"
63
64
66#define SK_BUFF struct __sk_buff
67
70#define BPF_ANNOTATE_KV_PAIR(name, type_key, type_val) \
71 struct ____btf_map_##name { \
72 type_key key; \
73 type_val value; \
74 }; \
75 struct ____btf_map_##name \
76 __attribute__ ((section(".maps." #name), used)) \
77 ____btf_map_##name = {};
78
79#define REGISTER_START()
81#if !defined(BTF) && (defined(__clang__) && (__clang_major__ < 12))
85struct bpf_elf_map {
86 __u32 type;
87 __u32 size_key;
88 __u32 size_value;
89 __u32 max_elem;
90 __u32 flags;
91 __u32 id;
92 __u32 pinning;
93 __u32 inner_id;
94 __u32 inner_idx;
95};
97#define REGISTER_TABLE(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES) \
98struct bpf_elf_map SEC("maps") NAME = { \
99 .type = TYPE, \
100 .size_key = sizeof(KEY_TYPE), \
101 .size_value = sizeof(VALUE_TYPE), \
102 .max_elem = MAX_ENTRIES, \
103 .pinning = 2, \
104 .flags = 0, \
105};
106#define REGISTER_TABLE_INNER(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, ID, INNER_IDX) \
107struct bpf_elf_map SEC("maps") NAME = { \
108 .type = TYPE, \
109 .size_key = sizeof(KEY_TYPE), \
110 .size_value = sizeof(VALUE_TYPE), \
111 .max_elem = MAX_ENTRIES, \
112 .pinning = 2, \
113 .flags = 0, \
114 .id = ID, \
115 .inner_idx = INNER_IDX, \
116};
117#define REGISTER_TABLE_OUTER(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, INNER_ID, INNER_NAME) \
118struct bpf_elf_map SEC("maps") NAME = { \
119 .type = TYPE, \
120 .size_key = sizeof(KEY_TYPE), \
121 .size_value = sizeof(VALUE_TYPE), \
122 .max_elem = MAX_ENTRIES, \
123 .pinning = 2, \
124 .flags = 0, \
125 .inner_id = INNER_ID, \
126};
127#define REGISTER_TABLE_FLAGS(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, FLAGS) \
128struct bpf_elf_map SEC("maps") NAME = { \
129 .type = TYPE, \
130 .size_key = sizeof(KEY_TYPE), \
131 .size_value = sizeof(VALUE_TYPE), \
132 .max_elem = MAX_ENTRIES, \
133 .pinning = 2, \
134 .flags = FLAGS, \
135};
136#else
137#define REGISTER_TABLE(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES) \
138struct { \
139 __uint(type, TYPE); \
140 KEY_TYPE *key; \
141 VALUE_TYPE *value; \
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) \
146struct { \
147 __uint(type, TYPE); \
148 KEY_TYPE *key; \
149 VALUE_TYPE *value; \
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) \
155struct NAME { \
156 __uint(type, TYPE); \
157 KEY_TYPE *key; \
158 VALUE_TYPE *value; \
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) \
162struct { \
163 __uint(type, TYPE); \
164 KEY_TYPE *key; \
165 VALUE_TYPE *value; \
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) \
171struct { \
172 __uint(type, TYPE); \
173 __uint(key_size, KEY_SIZE); \
174 VALUE_TYPE *value; \
175 __uint(max_entries, MAX_ENTRIES); \
176 __uint(pinning, LIBBPF_PIN_BY_NAME); \
177} NAME SEC(MAPS_ELF_SEC);
178#endif
179#define REGISTER_END()
180
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)
191
192#endif // END EBPF KERNEL DEFINITIONS
193
194#endif // BACKENDS_EBPF_RUNTIME_EBPF_KERNEL_H_