@@ -14,16 +14,14 @@ See the License for the specific language governing permissions and
14
14
limitations under the License.
15
15
*/
16
16
17
-
18
17
/// This file contains all functions and definitions necessary for the kernel target C
19
18
/// code to compile. It must be included with any file generated by the p4c-ebpf kernel
20
19
/// compiler.
21
20
#ifndef BACKENDS_EBPF_RUNTIME_EBPF_KERNEL_H_
22
21
#define BACKENDS_EBPF_RUNTIME_EBPF_KERNEL_H_
23
22
24
23
#include "ebpf_common.h"
25
-
26
- #include <bpf/bpf_endian.h> // definitions for bpf_ntohs etc...
24
+ #include "install/libbpf/include/bpf/bpf_endian.h" // definitions for bpf_ntohs etc...
27
25
28
26
#undef htonl
29
27
#undef htons
@@ -35,158 +33,83 @@ limitations under the License.
35
33
#define bpf_htonll (x ) htonll(x)
36
34
#endif
37
35
38
- #define load_byte (data , b ) (*(((u8*)(data)) + (b)))
39
- #define load_half (data , b ) bpf_ntohs(*(u16 *)((u8*)(data) + (b)))
40
- #define load_word (data , b ) bpf_ntohl(*(u32 *)((u8*)(data) + (b)))
41
- #define load_dword (data , b ) bpf_be64_to_cpu(*(u64 *)((u8*)(data) + (b)))
36
+ #define load_byte (data , b ) (*(((u8 *)(data)) + (b)))
37
+ #define load_half (data , b ) bpf_ntohs(*(u16 *)((u8 *)(data) + (b)))
38
+ #define load_word (data , b ) bpf_ntohl(*(u32 *)((u8 *)(data) + (b)))
39
+ #define load_dword (data , b ) bpf_be64_to_cpu(*(u64 *)((u8 *)(data) + (b)))
42
40
43
41
/// If we operate in user space we only need to include bpf.h and
44
42
/// define the userspace API macros.
45
43
/// For kernel programs we need to specify a list of kernel helpers. These are
46
- /// taken from here: https://github.com/torvalds/linux /blob/master/tools/lib/bpf /bpf_helpers.h
44
+ /// taken from here: https://github.com/libbpf/libbpf /blob/master/src /bpf_helpers.h
47
45
48
- #ifdef CONTROL_PLANE // BEGIN EBPF USER SPACE DEFINITIONS
46
+ #ifdef CONTROL_PLANE // BEGIN EBPF USER SPACE DEFINITIONS
49
47
50
- #include < bpf/bpf.h> // bpf_obj_get/pin, bpf_map_update_elem
48
+ #include "install/libbpf/include/ bpf/bpf.h" // bpf_obj_get/pin, bpf_map_update_elem
51
49
52
- #define BPF_USER_MAP_UPDATE_ELEM (index , key , value , flags )\
50
+ #define BPF_USER_MAP_UPDATE_ELEM (index , key , value , flags ) \
53
51
bpf_map_update_elem(index, key, value, flags)
54
52
#define BPF_OBJ_PIN (table , name ) bpf_obj_pin(table, name)
55
53
#define BPF_OBJ_GET (name ) bpf_obj_get(name)
56
54
57
- #else // BEGIN EBPF KERNEL DEFINITIONS
55
+ #else // BEGIN EBPF KERNEL DEFINITIONS
58
56
57
+ // These files are provided by the system, not libbpf.
58
+ #include <linux/bpf.h> // BPF_ANY,
59
59
#include <linux/pkt_cls.h> // TC_ACT_OK, TC_ACT_SHOT
60
- #include "linux/bpf.h" // types, and general bpf definitions
61
60
// This file contains the definitions of all the kernel bpf essentials
62
- #include <bpf/bpf_helpers.h>
63
-
64
- /// A helper structure used by an eBPF C program
65
- /// to describe map attributes for the elf_bpf loader
66
- /// FIXME: We only need this because we are loading with iproute2
67
- struct bpf_elf_map {
68
- __u32 type ;
69
- __u32 size_key ;
70
- __u32 size_value ;
71
- __u32 max_elem ;
72
- __u32 flags ;
73
- __u32 id ;
74
- __u32 pinning ;
75
- __u32 inner_id ;
76
- __u32 inner_idx ;
77
- };
61
+ #include "install/libbpf/include/bpf/bpf_helpers.h"
78
62
79
63
/// Simple descriptor which replaces the kernel sk_buff structure.
80
64
#define SK_BUFF struct __sk_buff
81
65
82
- /// From iproute2, annotate table with BTF which allows to read types at runtime.
83
- #define BPF_ANNOTATE_KV_PAIR (name , type_key , type_val ) \
84
- struct ____btf_map_##name { \
85
- type_key key; \
86
- type_val value; \
87
- }; \
88
- struct ____btf_map_##name \
89
- __attribute__ ((section(".maps." #name), used)) \
90
- ____btf_map_##name = {};
91
-
92
66
#define REGISTER_START ()
93
- #ifndef BTF
94
- /// Note: pinning exports the table name globally, do not remove.
95
- #define REGISTER_TABLE (NAME , TYPE , KEY_TYPE , VALUE_TYPE , MAX_ENTRIES ) \
96
- struct bpf_elf_map SEC("maps") NAME = { \
97
- .type = TYPE, \
98
- .size_key = sizeof(KEY_TYPE), \
99
- .size_value = sizeof(VALUE_TYPE), \
100
- .max_elem = MAX_ENTRIES, \
101
- .pinning = 2, \
102
- .flags = 0, \
103
- };
104
- #define REGISTER_TABLE_INNER (NAME , TYPE , KEY_TYPE , VALUE_TYPE , MAX_ENTRIES , ID , INNER_IDX ) \
105
- struct bpf_elf_map SEC("maps") NAME = { \
106
- .type = TYPE, \
107
- .size_key = sizeof(KEY_TYPE), \
108
- .size_value = sizeof(VALUE_TYPE), \
109
- .max_elem = MAX_ENTRIES, \
110
- .pinning = 2, \
111
- .flags = 0, \
112
- .id = ID, \
113
- .inner_idx = INNER_IDX, \
114
- };
115
- #define REGISTER_TABLE_OUTER (NAME , TYPE , KEY_TYPE , VALUE_TYPE , MAX_ENTRIES , INNER_ID , INNER_NAME ) \
116
- struct 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
- .inner_id = INNER_ID, \
124
- };
125
- #define REGISTER_TABLE_FLAGS (NAME , TYPE , KEY_TYPE , VALUE_TYPE , MAX_ENTRIES , FLAGS ) \
126
- struct bpf_elf_map SEC("maps") NAME = { \
127
- .type = TYPE, \
128
- .size_key = sizeof(KEY_TYPE), \
129
- .size_value = sizeof(VALUE_TYPE), \
130
- .max_elem = MAX_ENTRIES, \
131
- .pinning = 2, \
132
- .flags = FLAGS, \
133
- };
134
- #else
135
67
#define REGISTER_TABLE (NAME , TYPE , KEY_TYPE , VALUE_TYPE , MAX_ENTRIES ) \
136
- struct { \
137
- __uint(type, TYPE); \
138
- KEY_TYPE *key; \
139
- VALUE_TYPE *value; \
140
- __uint(max_entries, MAX_ENTRIES); \
141
- __uint(pinning, LIBBPF_PIN_BY_NAME); \
142
- } NAME SEC(".maps");
68
+ struct { \
69
+ __uint(type, TYPE); \
70
+ KEY_TYPE *key; \
71
+ VALUE_TYPE *value; \
72
+ __uint(max_entries, MAX_ENTRIES); \
73
+ } NAME SEC(".maps");
143
74
#define REGISTER_TABLE_FLAGS (NAME , TYPE , KEY_TYPE , VALUE_TYPE , MAX_ENTRIES , FLAGS ) \
144
- struct { \
145
- __uint(type, TYPE); \
146
- KEY_TYPE *key; \
147
- VALUE_TYPE *value; \
148
- __uint(max_entries, MAX_ENTRIES); \
149
- __uint(pinning, LIBBPF_PIN_BY_NAME); \
150
- __uint(map_flags, FLAGS); \
151
- } NAME SEC(".maps");
75
+ struct { \
76
+ __uint(type, TYPE); \
77
+ KEY_TYPE *key; \
78
+ VALUE_TYPE *value; \
79
+ __uint(max_entries, MAX_ENTRIES); \
80
+ __uint(map_flags, FLAGS); \
81
+ } NAME SEC(".maps");
152
82
#define REGISTER_TABLE_INNER (NAME , TYPE , KEY_TYPE , VALUE_TYPE , MAX_ENTRIES , ID , INNER_IDX ) \
153
- struct NAME { \
154
- __uint(type, TYPE); \
155
- KEY_TYPE *key; \
156
- VALUE_TYPE *value; \
157
- __uint(max_entries, MAX_ENTRIES); \
158
- } NAME SEC(".maps");
83
+ struct NAME { \
84
+ __uint(type, TYPE); \
85
+ KEY_TYPE *key; \
86
+ VALUE_TYPE *value; \
87
+ __uint(max_entries, MAX_ENTRIES); \
88
+ } NAME SEC(".maps");
159
89
#define REGISTER_TABLE_OUTER (NAME , TYPE , KEY_TYPE , VALUE_TYPE , MAX_ENTRIES , INNER_ID , INNER_NAME ) \
160
- struct { \
161
- __uint(type, TYPE); \
162
- KEY_TYPE *key; \
163
- VALUE_TYPE *value; \
164
- __uint(max_entries, MAX_ENTRIES); \
165
- __uint(pinning, LIBBPF_PIN_BY_NAME); \
166
- __array(values, struct INNER_NAME); \
167
- } NAME SEC(".maps");
90
+ struct { \
91
+ __uint(type, TYPE); \
92
+ KEY_TYPE *key; \
93
+ VALUE_TYPE *value; \
94
+ __uint(max_entries, MAX_ENTRIES); \
95
+ __array(values, struct INNER_NAME); \
96
+ } NAME SEC(".maps") = {.values = {&INNER_NAME}};
168
97
#define REGISTER_TABLE_NO_KEY_TYPE (NAME , TYPE , KEY_SIZE , VALUE_TYPE , MAX_ENTRIES ) \
169
- struct { \
170
- __uint(type, TYPE); \
171
- __uint(key_size, KEY_SIZE); \
172
- VALUE_TYPE *value; \
173
- __uint(max_entries, MAX_ENTRIES); \
174
- __uint(pinning, LIBBPF_PIN_BY_NAME); \
175
- } NAME SEC(".maps");
176
- #endif
98
+ struct { \
99
+ __uint(type, TYPE); \
100
+ __uint(key_size, KEY_SIZE); \
101
+ VALUE_TYPE *value; \
102
+ __uint(max_entries, MAX_ENTRIES); \
103
+ } NAME SEC(".maps");
177
104
#define REGISTER_END ()
178
105
179
- #define BPF_MAP_LOOKUP_ELEM (table , key ) \
180
- bpf_map_lookup_elem(&table, key)
181
- #define BPF_MAP_UPDATE_ELEM (table , key , value , flags ) \
182
- bpf_map_update_elem(&table, key, value, flags)
183
- #define BPF_MAP_DELETE_ELEM (table , key ) \
184
- bpf_map_delete_elem(&table, key)
185
- #define BPF_USER_MAP_UPDATE_ELEM (index , key , value , flags )\
186
- bpf_update_elem(index, key, value, flags)
106
+ #define BPF_MAP_LOOKUP_ELEM (table , key ) bpf_map_lookup_elem(&table, key)
107
+ #define BPF_MAP_UPDATE_ELEM (table , key , value , flags ) bpf_map_update_elem(&table, key, value, flags)
108
+ #define BPF_MAP_DELETE_ELEM (table , key ) bpf_map_delete_elem(&table, key)
109
+ #define BPF_USER_MAP_UPDATE_ELEM (index , key , value , flags ) bpf_update_elem(index, key, value, flags)
187
110
#define BPF_OBJ_PIN (table , name ) bpf_obj_pin(table, name)
188
111
#define BPF_OBJ_GET (name ) bpf_obj_get(name)
189
112
190
- #endif // END EBPF KERNEL DEFINITIONS
113
+ #endif // END EBPF KERNEL DEFINITIONS
191
114
192
115
#endif // BACKENDS_EBPF_RUNTIME_EBPF_KERNEL_H_
0 commit comments