Sorry for some basic question. I understand eBPF in kernel context and use of bpf() system call or helper libraries. How are hooks created in dpdk ? How do we load eBPF code into an already running dpdk application ? I want to have dpdk process expose hooks at multiple places and want to load bpf to dump packets or print stats. I couldn't find all answers or examples of such real world scenarios.
I have gone through the dpdk examples and code implementation but couldn't get the details to actually write an app
The DPDK API for its eBPF module offers the following generic functions:
struct rte_bpf *rte_bpf_load(const struct rte_bpf_prm *prm);
struct rte_bpf *rte_bpf_elf_load(const struct rte_bpf_prm *prm, const char *fname, const char *sname);
void rte_bpf_destroy(struct rte_bpf *bpf);
uint64_t rte_bpf_exec(const struct rte_bpf *bpf, void *ctx);
uint32_t rte_bpf_exec_burst(const struct rte_bpf *bpf, void *ctx[], uint64_t rc[], uint32_t num);
They allow you to load and execute BPF programs in your DPDK code.
In addition to those, the DPDK library offers 4 functions to attach BPF programs to specific ports & queues. They will then execute when packets are received and sent on those queues.
void rte_bpf_eth_rx_unload(uint16_t port, uint16_t queue);
void rte_bpf_eth_tx_unload(uint16_t port, uint16_t queue);
int rte_bpf_eth_rx_elf_load(uint16_t port, uint16_t queue, const struct rte_bpf_prm *prm, const char *fname, const char *sname, uint32_t flags);
int rte_bpf_eth_tx_elf_load(uint16_t port, uint16_t queue, const struct rte_bpf_prm *prm, const char *fname, const char *sname, uint32_t flags);
You can find more information in this presentation.