P4C
The P4 Compiler
Loading...
Searching...
No Matches
ebpf_kernel.h
1/*
2Copyright 2018 VMware, Inc.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17
21#ifndef BACKENDS_EBPF_RUNTIME_EBPF_KERNEL_H_
22#define BACKENDS_EBPF_RUNTIME_EBPF_KERNEL_H_
23
24#include <stddef.h> // size_t
25
26#include <sys/types.h> // ssize_t
27
28#include "ebpf_common.h"
29
30#include "install/libbpf/include/bpf/bpf_endian.h" // definitions for bpf_ntohs etc...
31
32#undef htonl
33#undef htons
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)
38#ifndef bpf_htonll
39#define bpf_htonll(x) htonll(x)
40#endif
41
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)))
46
51
52#ifdef CONTROL_PLANE // BEGIN EBPF USER SPACE DEFINITIONS
53
54#include "install/libbpf/include/bpf/bpf.h" // bpf_obj_get/pin, bpf_map_update_elem
55
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)
60
61#else // BEGIN EBPF KERNEL DEFINITIONS
62
63// These files are provided by the system, not libbpf.
64#include "contrib/bpftool/include/uapi/linux/bpf.h" // BPF_ANY,
65#include "contrib/bpftool/include/uapi/linux/pkt_cls.h" // TC_ACT_OK, TC_ACT_SHOT
66// This file contains the definitions of all the kernel bpf essentials
67#include "install/libbpf/include/bpf/bpf_helpers.h"
68
69// TODO: Use this include instead of the define directive once Ubuntu 18.04 is deprecated.
70// #include "install/libbpf/include/bpf/btf.h"
71#define MAPS_ELF_SEC ".maps"
72
73
75#define SK_BUFF struct __sk_buff
76
79#define BPF_ANNOTATE_KV_PAIR(name, type_key, type_val) \
80 struct ____btf_map_##name { \
81 type_key key; \
82 type_val value; \
83 }; \
84 struct ____btf_map_##name \
85 __attribute__ ((section(".maps." #name), used)) \
86 ____btf_map_##name = {};
87
88#define REGISTER_START()
90#if !defined(BTF) && (defined(__clang__) && (__clang_major__ < 12))
94struct bpf_elf_map {
95 __u32 type;
96 __u32 size_key;
97 __u32 size_value;
98 __u32 max_elem;
99 __u32 flags;
100 __u32 id;
101 __u32 pinning;
102 __u32 inner_id;
103 __u32 inner_idx;
104};
106#define REGISTER_TABLE(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES) \
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};
115#define REGISTER_TABLE_INNER(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, ID, INNER_IDX) \
116struct bpf_elf_map SEC("maps") NAME = { \
117 .type = TYPE, \
118 .size_key = sizeof(KEY_TYPE), \
119 .size_value = sizeof(VALUE_TYPE), \
120 .max_elem = MAX_ENTRIES, \
121 .pinning = 2, \
122 .flags = 0, \
123 .id = ID, \
124 .inner_idx = INNER_IDX, \
125};
126#define REGISTER_TABLE_OUTER(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, INNER_ID, INNER_NAME) \
127struct bpf_elf_map SEC("maps") NAME = { \
128 .type = TYPE, \
129 .size_key = sizeof(KEY_TYPE), \
130 .size_value = sizeof(VALUE_TYPE), \
131 .max_elem = MAX_ENTRIES, \
132 .pinning = 2, \
133 .flags = 0, \
134 .inner_id = INNER_ID, \
135};
136#define REGISTER_TABLE_FLAGS(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES, FLAGS) \
137struct bpf_elf_map SEC("maps") NAME = { \
138 .type = TYPE, \
139 .size_key = sizeof(KEY_TYPE), \
140 .size_value = sizeof(VALUE_TYPE), \
141 .max_elem = MAX_ENTRIES, \
142 .pinning = 2, \
143 .flags = FLAGS, \
144};
145#else
146#define REGISTER_TABLE(NAME, TYPE, KEY_TYPE, VALUE_TYPE, MAX_ENTRIES) \
147struct { \
148 __uint(type, TYPE); \
149 KEY_TYPE *key; \
150 VALUE_TYPE *value; \
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) \
155struct { \
156 __uint(type, TYPE); \
157 KEY_TYPE *key; \
158 VALUE_TYPE *value; \
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) \
164struct NAME { \
165 __uint(type, TYPE); \
166 KEY_TYPE *key; \
167 VALUE_TYPE *value; \
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) \
171struct { \
172 __uint(type, TYPE); \
173 KEY_TYPE *key; \
174 VALUE_TYPE *value; \
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) \
180struct { \
181 __uint(type, TYPE); \
182 __uint(key_size, KEY_SIZE); \
183 VALUE_TYPE *value; \
184 __uint(max_entries, MAX_ENTRIES); \
185 __uint(pinning, LIBBPF_PIN_BY_NAME); \
186} NAME SEC(MAPS_ELF_SEC);
187#endif
188#define REGISTER_END()
189
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)
200
201#endif // END EBPF KERNEL DEFINITIONS
202
203#endif // BACKENDS_EBPF_RUNTIME_EBPF_KERNEL_H_