2018-05-10 10:23:03 +00:00
|
|
|
/* SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
* Copyright(c) 2018 Intel Corporation
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _RTE_BPF_H_
|
|
|
|
#define _RTE_BPF_H_
|
|
|
|
|
|
|
|
/**
|
2018-05-14 13:15:42 +00:00
|
|
|
* @file rte_bpf.h
|
2018-05-10 10:23:03 +00:00
|
|
|
*
|
|
|
|
* RTE BPF support.
|
2020-06-26 08:16:38 +00:00
|
|
|
*
|
2018-05-10 10:23:03 +00:00
|
|
|
* librte_bpf provides a framework to load and execute eBPF bytecode
|
|
|
|
* inside user-space dpdk based applications.
|
|
|
|
* It supports basic set of features from eBPF spec
|
|
|
|
* (https://www.kernel.org/doc/Documentation/networking/filter.txt).
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <rte_common.h>
|
|
|
|
#include <rte_mbuf.h>
|
|
|
|
#include <bpf_def.h>
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Possible types for function/BPF program arguments.
|
|
|
|
*/
|
|
|
|
enum rte_bpf_arg_type {
|
|
|
|
RTE_BPF_ARG_UNDEF, /**< undefined */
|
|
|
|
RTE_BPF_ARG_RAW, /**< scalar value */
|
|
|
|
RTE_BPF_ARG_PTR = 0x10, /**< pointer to data buffer */
|
|
|
|
RTE_BPF_ARG_PTR_MBUF, /**< pointer to rte_mbuf */
|
2020-09-14 14:11:42 +00:00
|
|
|
RTE_BPF_ARG_RESERVED /**< reserved for internal use */
|
2018-05-10 10:23:03 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* function argument information
|
|
|
|
*/
|
|
|
|
struct rte_bpf_arg {
|
|
|
|
enum rte_bpf_arg_type type;
|
2018-06-08 08:42:33 +00:00
|
|
|
/**
|
|
|
|
* for ptr type - max size of data buffer it points to
|
|
|
|
* for raw type - the size (in bytes) of the value
|
|
|
|
*/
|
|
|
|
size_t size;
|
2018-05-10 10:23:03 +00:00
|
|
|
size_t buf_size;
|
|
|
|
/**< for mbuf ptr type, max size of rte_mbuf data buffer */
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* determine is argument a pointer
|
|
|
|
*/
|
|
|
|
#define RTE_BPF_ARG_PTR_TYPE(x) ((x) & RTE_BPF_ARG_PTR)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Possible types for external symbols.
|
|
|
|
*/
|
|
|
|
enum rte_bpf_xtype {
|
|
|
|
RTE_BPF_XTYPE_FUNC, /**< function */
|
2020-09-14 14:11:42 +00:00
|
|
|
RTE_BPF_XTYPE_VAR /**< variable */
|
2018-05-10 10:23:03 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Definition for external symbols available in the BPF program.
|
|
|
|
*/
|
|
|
|
struct rte_bpf_xsym {
|
|
|
|
const char *name; /**< name */
|
|
|
|
enum rte_bpf_xtype type; /**< type */
|
|
|
|
union {
|
2018-06-08 08:42:33 +00:00
|
|
|
struct {
|
|
|
|
uint64_t (*val)(uint64_t, uint64_t, uint64_t,
|
2018-05-10 10:23:03 +00:00
|
|
|
uint64_t, uint64_t);
|
2018-06-08 08:42:33 +00:00
|
|
|
uint32_t nb_args;
|
|
|
|
struct rte_bpf_arg args[EBPF_FUNC_MAX_ARGS];
|
|
|
|
/**< Function arguments descriptions. */
|
|
|
|
struct rte_bpf_arg ret; /**< function return value. */
|
|
|
|
} func;
|
|
|
|
struct {
|
|
|
|
void *val; /**< actual memory location */
|
|
|
|
struct rte_bpf_arg desc; /**< type, size, etc. */
|
|
|
|
} var; /**< external variable */
|
|
|
|
};
|
2018-05-10 10:23:03 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Input parameters for loading eBPF code.
|
|
|
|
*/
|
|
|
|
struct rte_bpf_prm {
|
|
|
|
const struct ebpf_insn *ins; /**< array of eBPF instructions */
|
|
|
|
uint32_t nb_ins; /**< number of instructions in ins */
|
|
|
|
const struct rte_bpf_xsym *xsym;
|
|
|
|
/**< array of external symbols that eBPF code is allowed to reference */
|
|
|
|
uint32_t nb_xsym; /**< number of elements in xsym */
|
|
|
|
struct rte_bpf_arg prog_arg; /**< eBPF program input arg description */
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Information about compiled into native ISA eBPF code.
|
|
|
|
*/
|
|
|
|
struct rte_bpf_jit {
|
|
|
|
uint64_t (*func)(void *); /**< JIT-ed native code */
|
|
|
|
size_t sz; /**< size of JIT-ed code */
|
|
|
|
};
|
|
|
|
|
|
|
|
struct rte_bpf;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* De-allocate all memory used by this eBPF execution context.
|
|
|
|
*
|
|
|
|
* @param bpf
|
|
|
|
* BPF handle to destroy.
|
|
|
|
*/
|
2019-06-29 11:58:53 +00:00
|
|
|
void
|
2018-05-14 13:15:42 +00:00
|
|
|
rte_bpf_destroy(struct rte_bpf *bpf);
|
2018-05-10 10:23:03 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a new eBPF execution context and load given BPF code into it.
|
|
|
|
*
|
|
|
|
* @param prm
|
2019-04-26 15:14:22 +00:00
|
|
|
* Parameters used to create and initialise the BPF execution context.
|
2018-05-10 10:23:03 +00:00
|
|
|
* @return
|
|
|
|
* BPF handle that is used in future BPF operations,
|
|
|
|
* or NULL on error, with error code set in rte_errno.
|
|
|
|
* Possible rte_errno errors include:
|
|
|
|
* - EINVAL - invalid parameter passed to function
|
|
|
|
* - ENOMEM - can't reserve enough memory
|
|
|
|
*/
|
2019-06-29 11:58:53 +00:00
|
|
|
struct rte_bpf *
|
2018-05-14 13:15:42 +00:00
|
|
|
rte_bpf_load(const struct rte_bpf_prm *prm);
|
2018-05-10 10:23:03 +00:00
|
|
|
|
2018-05-10 10:23:04 +00:00
|
|
|
/**
|
|
|
|
* Create a new eBPF execution context and load BPF code from given ELF
|
|
|
|
* file into it.
|
2019-05-17 14:09:42 +00:00
|
|
|
* Note that if the function will encounter EBPF_PSEUDO_CALL instruction
|
|
|
|
* that references external symbol, it will treat is as standard BPF_CALL
|
|
|
|
* to the external helper function.
|
2018-05-10 10:23:04 +00:00
|
|
|
*
|
|
|
|
* @param prm
|
2019-04-26 15:14:22 +00:00
|
|
|
* Parameters used to create and initialise the BPF execution context.
|
2018-05-10 10:23:04 +00:00
|
|
|
* @param fname
|
|
|
|
* Pathname for a ELF file.
|
|
|
|
* @param sname
|
|
|
|
* Name of the executable section within the file to load.
|
|
|
|
* @return
|
|
|
|
* BPF handle that is used in future BPF operations,
|
|
|
|
* or NULL on error, with error code set in rte_errno.
|
|
|
|
* Possible rte_errno errors include:
|
|
|
|
* - EINVAL - invalid parameter passed to function
|
|
|
|
* - ENOMEM - can't reserve enough memory
|
|
|
|
*/
|
2019-06-29 11:58:53 +00:00
|
|
|
struct rte_bpf *
|
2018-05-14 13:15:42 +00:00
|
|
|
rte_bpf_elf_load(const struct rte_bpf_prm *prm, const char *fname,
|
|
|
|
const char *sname);
|
2018-05-10 10:23:03 +00:00
|
|
|
/**
|
|
|
|
* Execute given BPF bytecode.
|
|
|
|
*
|
|
|
|
* @param bpf
|
|
|
|
* handle for the BPF code to execute.
|
|
|
|
* @param ctx
|
|
|
|
* pointer to input context.
|
|
|
|
* @return
|
|
|
|
* BPF execution return value.
|
|
|
|
*/
|
2019-06-29 11:58:53 +00:00
|
|
|
uint64_t
|
2018-05-14 13:15:42 +00:00
|
|
|
rte_bpf_exec(const struct rte_bpf *bpf, void *ctx);
|
2018-05-10 10:23:03 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Execute given BPF bytecode over a set of input contexts.
|
|
|
|
*
|
|
|
|
* @param bpf
|
|
|
|
* handle for the BPF code to execute.
|
|
|
|
* @param ctx
|
|
|
|
* array of pointers to the input contexts.
|
|
|
|
* @param rc
|
|
|
|
* array of return values (one per input).
|
|
|
|
* @param num
|
|
|
|
* number of elements in ctx[] (and rc[]).
|
|
|
|
* @return
|
|
|
|
* number of successfully processed inputs.
|
|
|
|
*/
|
2019-06-29 11:58:53 +00:00
|
|
|
uint32_t
|
2018-05-14 13:15:42 +00:00
|
|
|
rte_bpf_exec_burst(const struct rte_bpf *bpf, void *ctx[], uint64_t rc[],
|
|
|
|
uint32_t num);
|
2018-05-10 10:23:03 +00:00
|
|
|
|
|
|
|
/**
|
2019-04-26 15:14:22 +00:00
|
|
|
* Provide information about natively compiled code for given BPF handle.
|
2018-05-10 10:23:03 +00:00
|
|
|
*
|
|
|
|
* @param bpf
|
|
|
|
* handle for the BPF code.
|
|
|
|
* @param jit
|
|
|
|
* pointer to the rte_bpf_jit structure to be filled with related data.
|
|
|
|
* @return
|
|
|
|
* - -EINVAL if the parameters are invalid.
|
|
|
|
* - Zero if operation completed successfully.
|
|
|
|
*/
|
2019-06-29 11:58:53 +00:00
|
|
|
int
|
2018-05-14 13:15:42 +00:00
|
|
|
rte_bpf_get_jit(const struct rte_bpf *bpf, struct rte_bpf_jit *jit);
|
2018-05-10 10:23:03 +00:00
|
|
|
|
2021-10-20 21:42:29 +00:00
|
|
|
/**
|
|
|
|
* Dump epf instructions to a file.
|
|
|
|
*
|
|
|
|
* @param f
|
|
|
|
* A pointer to a file for output
|
|
|
|
* @param buf
|
|
|
|
* A pointer to BPF instructions
|
|
|
|
* @param len
|
|
|
|
* Number of BPF instructions to dump.
|
|
|
|
*/
|
|
|
|
__rte_experimental
|
|
|
|
void
|
|
|
|
rte_bpf_dump(FILE *f, const struct ebpf_insn *buf, uint32_t len);
|
|
|
|
|
2021-10-20 21:42:28 +00:00
|
|
|
struct bpf_program;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Convert a Classic BPF program from libpcap into a DPDK BPF code.
|
|
|
|
*
|
|
|
|
* @param prog
|
|
|
|
* Classic BPF program from pcap_compile().
|
|
|
|
* @return
|
|
|
|
* Pointer to BPF program (allocated with *rte_malloc*)
|
|
|
|
* that is used in future BPF operations,
|
|
|
|
* or NULL on error, with error code set in rte_errno.
|
|
|
|
* Possible rte_errno errors include:
|
|
|
|
* - EINVAL - invalid parameter passed to function
|
|
|
|
* - ENOMEM - can't reserve enough memory
|
2021-11-03 11:17:47 +00:00
|
|
|
* - ENOTSUP - operation not supported
|
2021-10-20 21:42:28 +00:00
|
|
|
*/
|
|
|
|
__rte_experimental
|
|
|
|
struct rte_bpf_prm *
|
|
|
|
rte_bpf_convert(const struct bpf_program *prog);
|
|
|
|
|
2018-05-10 10:23:03 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* _RTE_BPF_H_ */
|