eBPF for Windows
ebpf_api.h
Go to the documentation of this file.
1 // Copyright (c) eBPF for Windows contributors
2 // SPDX-License-Identifier: MIT
3 
4 #pragma once
5 
6 #include "ebpf_core_structs.h"
7 #include "ebpf_execution_type.h"
9 #include "ebpf_result.h"
10 
11 #include <specstrings.h>
12 #include <stdbool.h>
13 #include <stdint.h>
14 
15 #ifdef __cplusplus
16 #include <stdexcept>
17 #define EBPF_NO_EXCEPT noexcept
18 extern "C"
19 {
20 #else
21 #define EBPF_NO_EXCEPT
22 #endif
23 
24  typedef int32_t fd_t;
25  extern __declspec(selectany) const fd_t ebpf_fd_invalid = -1;
26  typedef intptr_t ebpf_handle_t;
27 
28  struct bpf_object;
29  struct bpf_program;
30  struct bpf_map;
31  struct bpf_link;
32 
41  _Must_inspect_result_ ebpf_result_t
43  fd_t fd,
44  _Out_ ebpf_execution_type_t* execution_type,
45  _Outptr_result_z_ const char** file_name,
46  _Outptr_result_z_ const char** section_name) EBPF_NO_EXCEPT;
47 
48  typedef struct _ebpf_stat
49  {
50  struct _ebpf_stat* next;
51  _Field_z_ const char* key;
52  int value;
54 
55  typedef struct _ebpf_api_program_info
56  {
58  _Field_z_ const char* section_name;
59  _Field_z_ const char* program_name;
62  size_t raw_data_size;
63  _Field_size_(raw_data_size) char* raw_data;
65  size_t offset_in_section; // Byte offset of program in section.
67 
68 // The type ebpf_section_info_t was replaced by ebpf_api_program_info_t
69 // which also added the offset_in_section field at the end.
70 #define ebpf_section_info_t ebpf_api_program_info_t
71 
81  _Must_inspect_result_ ebpf_result_t
83  _In_z_ const char* file,
84  bool verbose,
85  _Outptr_result_maybenull_ ebpf_api_program_info_t** infos,
86  _Outptr_result_maybenull_z_ const char** error_message) EBPF_NO_EXCEPT;
87 
98  __declspec(deprecated("Use ebpf_enumerate_programs() instead.")) _Must_inspect_result_ ebpf_result_t
100  _In_z_ const char* file,
101  bool verbose,
102  _Outptr_result_maybenull_ ebpf_section_info_t** infos,
103  _Outptr_result_maybenull_z_ const char** error_message) EBPF_NO_EXCEPT;
104 
109  void
111 
117  __declspec(deprecated("Use ebpf_free_programs() instead.")) void ebpf_free_sections(
118  _In_opt_ _Post_invalid_ ebpf_section_info_t* infos) EBPF_NO_EXCEPT;
119 
131  uint32_t
133  _In_z_ const char* file,
134  _In_opt_z_ const char* section_name,
135  _In_opt_z_ const char* program_name,
136  _Outptr_result_maybenull_z_ const char** disassembly,
137  _Outptr_result_maybenull_z_ const char** error_message) EBPF_NO_EXCEPT;
138 
147  __declspec(deprecated("Use ebpf_api_elf_disassemble_program() instead.")) uint32_t ebpf_api_elf_disassemble_section(
148  _In_z_ const char* file,
149  _In_z_ const char* section,
150  _Outptr_result_maybenull_z_ const char** disassembly,
151  _Outptr_result_maybenull_z_ const char** error_message) EBPF_NO_EXCEPT;
152 
153  typedef struct
154  {
159 
161  {
166 
185  _Success_(return == 0) uint32_t ebpf_api_elf_verify_program_from_file(
186  _In_z_ const char* file,
187  _In_opt_z_ const char* section_name,
188  _In_opt_z_ const char* program_name,
189  _In_opt_ const ebpf_program_type_t* program_type,
191  _Outptr_result_maybenull_z_ const char** report,
192  _Outptr_result_maybenull_z_ const char** error_message,
194 
210  __declspec(deprecated("Use ebpf_api_elf_verify_program_from_file() instead.")) _Success_(return == 0) uint32_t
212  _In_z_ const char* file,
213  _In_z_ const char* section,
214  _In_opt_ const ebpf_program_type_t* program_type,
216  _Outptr_result_maybenull_z_ const char** report,
217  _Outptr_result_maybenull_z_ const char** error_message,
219 
239  _Success_(return == 0) uint32_t ebpf_api_elf_verify_program_from_memory(
240  _In_reads_(data_length) const char* data,
241  size_t data_length,
242  _In_opt_z_ const char* section_name,
243  _In_opt_z_ const char* program_name,
244  _In_opt_ const ebpf_program_type_t* program_type,
246  _Outptr_result_maybenull_z_ const char** report,
247  _Outptr_result_maybenull_z_ const char** error_message,
249 
266  __declspec(deprecated("Use ebpf_api_elf_verify_program_from_memory() instead.")) _Success_(return == 0) uint32_t
268  _In_reads_(data_length) const char* data,
269  size_t data_length,
270  _In_z_ const char* section_name,
271  _In_opt_ const ebpf_program_type_t* program_type,
273  _Outptr_result_maybenull_z_ const char** report,
274  _Outptr_result_maybenull_z_ const char** error_message,
276 
281  void
282  ebpf_free_string(_In_opt_ _Post_invalid_ const char* string) EBPF_NO_EXCEPT;
283 
289  uint32_t
290  ebpf_api_unpin_object(const uint8_t* name, uint32_t name_length) EBPF_NO_EXCEPT;
291 
298  _Must_inspect_result_ ebpf_result_t
299  ebpf_object_unpin(_In_z_ const char* path) EBPF_NO_EXCEPT;
300 
309  _Must_inspect_result_ ebpf_result_t
311 
319  _Must_inspect_result_ ebpf_result_t
321 
332  _Must_inspect_result_ ebpf_result_t
334  _Out_ uint16_t* map_count,
335  _Outptr_result_buffer_maybenull_(*map_count) ebpf_map_info_t** map_info) EBPF_NO_EXCEPT;
336 
344  void
346  uint16_t map_count,
347  _In_opt_count_(map_count) _Post_ptr_invalid_ const ebpf_map_info_t* map_info) EBPF_NO_EXCEPT;
348 
357  ebpf_object_get_execution_type(_In_ const struct bpf_object* object) EBPF_NO_EXCEPT;
358 
368  _Must_inspect_result_ ebpf_result_t
369  ebpf_object_set_execution_type(_Inout_ struct bpf_object* object, ebpf_execution_type_t execution_type)
371 
388  _Must_inspect_result_ ebpf_result_t
390  _In_ const struct bpf_program* program,
391  _In_opt_ const ebpf_attach_type_t* attach_type,
392  _In_reads_bytes_opt_(attach_params_size) void* attach_parameters,
393  size_t attach_params_size,
394  _Outptr_ struct bpf_link** link) EBPF_NO_EXCEPT;
395 
412  _Must_inspect_result_ ebpf_result_t
414  fd_t program_fd,
415  _In_opt_ const ebpf_attach_type_t* attach_type,
416  _In_reads_bytes_opt_(attach_parameters_size) void* attach_parameters,
417  size_t attach_parameters_size,
418  _Outptr_ struct bpf_link** link) EBPF_NO_EXCEPT;
419 
429  _Must_inspect_result_ ebpf_result_t
430  ebpf_link_detach(_Inout_ struct bpf_link* link) EBPF_NO_EXCEPT;
431 
445  _Must_inspect_result_ ebpf_result_t
447  fd_t program_fd,
448  _In_ const ebpf_attach_type_t* attach_type,
449  _In_reads_bytes_(attach_parameter_size) void* attach_parameter,
450  size_t attach_parameter_size) EBPF_NO_EXCEPT;
451 
462  void
463  ebpf_link_close(_Frees_ptr_ struct bpf_link* link) EBPF_NO_EXCEPT;
464 
472  _Must_inspect_result_ ebpf_result_t
474 
485  _Must_inspect_result_ ebpf_result_t
487  _In_z_ const char* name,
490 
498  _Ret_maybenull_z_ const char*
500 
508  _Ret_maybenull_z_ const char*
510 
520  _Must_inspect_result_ ebpf_result_t
522  _In_z_ const char* start_path, _Out_writes_z_(EBPF_MAX_PIN_PATH_LENGTH) char* next_path) EBPF_NO_EXCEPT;
523 
525 
535  _Must_inspect_result_ ebpf_result_t
537 
538  typedef struct _ebpf_test_run_options
539  {
540  _Readable_bytes_(data_size_in) const uint8_t* data_in;
541  _Writable_bytes_(data_size_out) uint8_t* data_out;
542  size_t data_size_in;
543  size_t data_size_out;
544  _Readable_bytes_(context_size_in) const uint8_t* context_in;
545  _Writable_bytes_(context_size_out) uint8_t* context_out;
548  uint64_t return_value;
549  size_t repeat_count;
550  uint64_t duration;
551  uint32_t flags;
552  uint32_t cpu;
553  size_t batch_size;
555 
564  _Must_inspect_result_ ebpf_result_t
566 
577  _Must_inspect_result_ ebpf_result_t
579  fd_t ring_buffer_map_fd, _In_reads_bytes_(data_length) const void* data, size_t data_length) EBPF_NO_EXCEPT;
580 
581 #ifdef __cplusplus
582 }
583 #endif
#define bpf_map
Definition: bpf_helpers_platform.h:16
struct _ebpf_stat ebpf_stat_t
_Ret_maybenull_z_ const char * ebpf_get_attach_type_name(const ebpf_attach_type_t *attach_type) EBPF_NO_EXCEPT
Get the name of a given attach type.
void ebpf_free_string(const char *string) EBPF_NO_EXCEPT
Free memory for a string returned from an eBPF API.
struct _ebpf_test_run_options ebpf_test_run_options_t
_Must_inspect_result_ ebpf_result_t ebpf_get_next_pinned_program_path(const char *start_path, _Out_writes_z_(EBPF_MAX_PIN_PATH_LENGTH) char *next_path) EBPF_NO_EXCEPT
Gets the next pinned program after a given path.
_Must_inspect_result_ ebpf_result_t ebpf_api_unlink_program(ebpf_handle_t link_handle) EBPF_NO_EXCEPT
Detach the eBPF program from the link.
uint32_t ebpf_api_elf_verify_section_from_memory(_In_reads_(data_length) const char *data, size_t data_length, const char *section_name, const ebpf_program_type_t *program_type, ebpf_verification_verbosity_t verbosity, const char **report, const char **error_message, _Out_opt_ ebpf_api_verifier_stats_t *stats) EBPF_NO_EXCEPT
Verify that the program is safe to execute.
uint32_t ebpf_api_unpin_object(const uint8_t *name, uint32_t name_length) EBPF_NO_EXCEPT
Dissociate a name with an object handle.
_ebpf_verification_verbosity
Definition: ebpf_api.h:161
@ EBPF_VERIFICATION_VERBOSITY_VERBOSE
Definition: ebpf_api.h:164
@ EBPF_VERIFICATION_VERBOSITY_NORMAL
Definition: ebpf_api.h:162
@ EBPF_VERIFICATION_VERBOSITY_INFORMATIONAL
Definition: ebpf_api.h:163
_Must_inspect_result_ ebpf_result_t ebpf_get_program_info_from_verifier(const ebpf_program_info_t **program_info) EBPF_NO_EXCEPT
Get the set of program information used by the verifier during the last verification.
_Ret_maybenull_z_ const char * ebpf_get_program_type_name(const ebpf_program_type_t *program_type) EBPF_NO_EXCEPT
Get the name of a given program type.
void ebpf_api_map_info_free(uint16_t map_count, const ebpf_map_info_t *map_info) EBPF_NO_EXCEPT
Helper Function to free array of ebpf_map_info_t allocated by ebpf_api_get_pinned_map_info function.
#define ebpf_section_info_t
Definition: ebpf_api.h:70
_Must_inspect_result_ ebpf_result_t ebpf_ring_buffer_map_write(fd_t ring_buffer_map_fd, _In_reads_bytes_(data_length) const void *data, size_t data_length) EBPF_NO_EXCEPT
Write data into the ring buffer map.
void ebpf_free_sections(ebpf_section_info_t *infos) EBPF_NO_EXCEPT
Free memory returned from ebpf_enumerate_sections.
_Must_inspect_result_ ebpf_result_t ebpf_object_set_execution_type(_Inout_ struct bpf_object *object, ebpf_execution_type_t execution_type) EBPF_NO_EXCEPT
Set the execution type for an eBPF object file.
_Must_inspect_result_ ebpf_result_t ebpf_program_attach_by_fd(fd_t program_fd, const ebpf_attach_type_t *attach_type, _In_reads_bytes_opt_(attach_parameters_size) void *attach_parameters, size_t attach_parameters_size, struct bpf_link **link) EBPF_NO_EXCEPT
Attach an eBPF program by program file descriptor.
_Must_inspect_result_ ebpf_result_t ebpf_object_unpin(const char *path) EBPF_NO_EXCEPT
Unpin the object from the specified path.
_Must_inspect_result_ ebpf_result_t ebpf_program_query_info(fd_t fd, ebpf_execution_type_t *execution_type, _Outptr_result_z_ const char **file_name, _Outptr_result_z_ const char **section_name) EBPF_NO_EXCEPT
Query info about an eBPF program.
#define EBPF_NO_EXCEPT
Definition: ebpf_api.h:21
ebpf_execution_type_t ebpf_object_get_execution_type(const struct bpf_object *object) EBPF_NO_EXCEPT
Get the execution type for an eBPF object file.
void ebpf_free_programs(ebpf_api_program_info_t *infos) EBPF_NO_EXCEPT
Free memory returned from ebpf_enumerate_programs.
uint32_t ebpf_api_elf_verify_section_from_file(const char *file, const char *section, const ebpf_program_type_t *program_type, ebpf_verification_verbosity_t verbosity, const char **report, const char **error_message, _Out_opt_ ebpf_api_verifier_stats_t *stats) EBPF_NO_EXCEPT
Verify that the program is safe to execute.
uint32_t ebpf_api_elf_verify_program_from_file(const char *file, _In_opt_z_ const char *section_name, _In_opt_z_ const char *program_name, const ebpf_program_type_t *program_type, ebpf_verification_verbosity_t verbosity, const char **report, const char **error_message, _Out_opt_ ebpf_api_verifier_stats_t *stats) EBPF_NO_EXCEPT
Verify that the program is safe to execute.
enum _ebpf_verification_verbosity ebpf_verification_verbosity_t
_Must_inspect_result_ ebpf_result_t ebpf_get_program_type_by_name(const char *name, ebpf_program_type_t *program_type, ebpf_attach_type_t *expected_attach_type) EBPF_NO_EXCEPT
Get eBPF program type and expected attach type by name.
_Must_inspect_result_ ebpf_result_t ebpf_api_get_pinned_map_info(uint16_t *map_count,(*map_count) ebpf_map_info_t **map_info) EBPF_NO_EXCEPT
Returns an array of ebpf_map_info_t for all pinned maps.
_Must_inspect_result_ ebpf_result_t ebpf_program_detach(fd_t program_fd, const ebpf_attach_type_t *attach_type, _In_reads_bytes_(attach_parameter_size) void *attach_parameter, size_t attach_parameter_size) EBPF_NO_EXCEPT
Detach an eBPF program.
int32_t fd_t
Definition: ebpf_api.h:24
_Must_inspect_result_ ebpf_result_t ebpf_close_fd(fd_t fd) EBPF_NO_EXCEPT
Close a file descriptor. Also close the underlying handle.
_Must_inspect_result_ ebpf_result_t ebpf_program_test_run(fd_t program_fd, _Inout_ ebpf_test_run_options_t *options) EBPF_NO_EXCEPT
Run the program in the eBPF VM, measure the execution time, and return the result.
struct _ebpf_api_program_info ebpf_api_program_info_t
_Must_inspect_result_ ebpf_result_t ebpf_program_attach(const struct bpf_program *program, const ebpf_attach_type_t *attach_type, _In_reads_bytes_opt_(attach_params_size) void *attach_parameters, size_t attach_params_size, struct bpf_link **link) EBPF_NO_EXCEPT
Attach an eBPF program.
_Must_inspect_result_ ebpf_result_t ebpf_link_detach(_Inout_ struct bpf_link *link) EBPF_NO_EXCEPT
Detach an eBPF program from an attach point represented by the bpf_link structure.
intptr_t ebpf_handle_t
Definition: ebpf_api.h:26
void ebpf_link_close(_Frees_ptr_ struct bpf_link *link) EBPF_NO_EXCEPT
uint32_t ebpf_api_elf_disassemble_program(const char *file, _In_opt_z_ const char *section_name, _In_opt_z_ const char *program_name, const char **disassembly, const char **error_message) EBPF_NO_EXCEPT
Convert an eBPF program to human readable byte code.
_Must_inspect_result_ ebpf_result_t ebpf_api_close_handle(ebpf_handle_t handle) EBPF_NO_EXCEPT
Close an eBPF handle.
const fd_t ebpf_fd_invalid
uint32_t ebpf_api_elf_disassemble_section(const char *file, const char *section, const char **disassembly, const char **error_message) EBPF_NO_EXCEPT
Convert an eBPF program to human readable byte code.
_Must_inspect_result_ ebpf_result_t ebpf_enumerate_sections(const char *file, bool verbose, _Outptr_result_maybenull_ ebpf_section_info_t **infos, const char **error_message) EBPF_NO_EXCEPT
Get list of sections and stats in an eBPF file.
_Must_inspect_result_ ebpf_result_t ebpf_enumerate_programs(const char *file, bool verbose, _Outptr_result_maybenull_ ebpf_api_program_info_t **infos, const char **error_message) EBPF_NO_EXCEPT
Get list of programs and stats in an eBPF file.
uint32_t ebpf_api_elf_verify_program_from_memory(_In_reads_(data_length) const char *data, size_t data_length, _In_opt_z_ const char *section_name, _In_opt_z_ const char *program_name, const ebpf_program_type_t *program_type, ebpf_verification_verbosity_t verbosity, const char **report, const char **error_message, _Out_opt_ ebpf_api_verifier_stats_t *stats) EBPF_NO_EXCEPT
Verify that the program is safe to execute.
This file contains eBPF definitions common to eBPF core libraries as well as the eBPF API library.
#define EBPF_MAX_PIN_PATH_LENGTH
Definition: ebpf_core_structs.h:15
enum _ebpf_execution_type ebpf_execution_type_t
enum ebpf_result ebpf_result_t
GUID ebpf_attach_type_t
Definition: ebpf_windows.h:62
GUID ebpf_program_type_t
Definition: ebpf_windows.h:61
Definition: ebpf_api.h:56
_Field_size_(raw_data_size) char *raw_data
_Field_z_ const char * program_name
Definition: ebpf_api.h:59
ebpf_stat_t * stats
Definition: ebpf_api.h:64
ebpf_program_type_t program_type
Definition: ebpf_api.h:60
ebpf_attach_type_t expected_attach_type
Definition: ebpf_api.h:61
size_t raw_data_size
Definition: ebpf_api.h:62
size_t offset_in_section
Definition: ebpf_api.h:65
_Field_z_ const char * section_name
Definition: ebpf_api.h:58
struct _ebpf_api_program_info * next
Definition: ebpf_api.h:57
eBPF Map Information
Definition: ebpf_core_structs.h:21
Definition: ebpf_program_types.h:45
Definition: ebpf_api.h:49
struct _ebpf_stat * next
Definition: ebpf_api.h:50
_Field_z_ const char * key
Definition: ebpf_api.h:51
int value
Definition: ebpf_api.h:52
Definition: ebpf_api.h:539
uint64_t duration
Duration in nanoseconds of the program execution.
Definition: ebpf_api.h:550
size_t batch_size
Number of times to repeat the program in a batch.
Definition: ebpf_api.h:553
_Readable_bytes_(context_size_in) const uint8_t *context_in
Input context to the program.
_Writable_bytes_(context_size_out) uint8_t *context_out
Output context from the program.
uint64_t return_value
Return value from the program.
Definition: ebpf_api.h:548
size_t repeat_count
Number of times to repeat the program.
Definition: ebpf_api.h:549
size_t context_size_in
Size of input context.
Definition: ebpf_api.h:546
uint32_t cpu
CPU to run the program on.
Definition: ebpf_api.h:552
size_t data_size_in
Size of input data.
Definition: ebpf_api.h:542
size_t context_size_out
Maximum length of context_out on input and actual length of context_out on output.
Definition: ebpf_api.h:547
uint32_t flags
Flags to control the test run.
Definition: ebpf_api.h:551
_Readable_bytes_(data_size_in) const uint8_t *data_in
Input data to the program.
_Writable_bytes_(data_size_out) uint8_t *data_out
Output data from the program.
size_t data_size_out
Maximum length of data_out on input and actual length of data_out on output.
Definition: ebpf_api.h:543
Definition: ebpf_api.h:154
int total_warnings
Definition: ebpf_api.h:156
int total_unreachable
Definition: ebpf_api.h:155
int max_loop_count
Definition: ebpf_api.h:157