1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2018 Intel Corporation 3 */ 4 5 #ifndef _RTE_BPF_ETHDEV_H_ 6 #define _RTE_BPF_ETHDEV_H_ 7 8 /** 9 * @file rte_bpf_ethdev.h 10 * @b EXPERIMENTAL: this API may change without prior notice 11 * 12 * API to install BPF filter as RX/TX callbacks for eth devices. 13 * Note that right now: 14 * - it is not MT safe, i.e. it is not allowed to do load/unload for the 15 * same port/queue from different threads in parallel. 16 * - though it allows to do load/unload at runtime 17 * (while RX/TX is ongoing on given port/queue). 18 * - allows only one BPF program per port/queue, 19 * i.e. new load will replace previously loaded for that port/queue BPF program. 20 * Filter behaviour - if BPF program returns zero value for a given packet, 21 * then it will be dropped inside callback and no further processing 22 * on RX - it will be dropped inside callback and no further processing 23 * for that packet will happen. 24 * on TX - packet will remain unsent, and it is responsibility of the user 25 * to handle such situation (drop, try to send again, etc.). 26 */ 27 28 #include <rte_bpf.h> 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 enum { 35 RTE_BPF_ETH_F_NONE = 0, 36 RTE_BPF_ETH_F_JIT = 0x1, /*< use compiled into native ISA code */ 37 }; 38 39 /** 40 * Unload previously loaded BPF program (if any) from given RX port/queue 41 * and remove appropriate RX port/queue callback. 42 * 43 * @param port 44 * The identifier of the ethernet port 45 * @param queue 46 * The identifier of the RX queue on the given port 47 */ 48 void __rte_experimental 49 rte_bpf_eth_rx_unload(uint16_t port, uint16_t queue); 50 51 /** 52 * Unload previously loaded BPF program (if any) from given TX port/queue 53 * and remove appropriate TX port/queue callback. 54 * 55 * @param port 56 * The identifier of the ethernet port 57 * @param queue 58 * The identifier of the TX queue on the given port 59 */ 60 void __rte_experimental 61 rte_bpf_eth_tx_unload(uint16_t port, uint16_t queue); 62 63 /** 64 * Load BPF program from the ELF file and install callback to execute it 65 * on given RX port/queue. 66 * 67 * @param port 68 * The identifier of the ethernet port 69 * @param queue 70 * The identifier of the RX queue on the given port 71 * @param fname 72 * Pathname for a ELF file. 73 * @param sname 74 * Name of the executable section within the file to load. 75 * @param prm 76 * Parameters used to create and initialise the BPF execution context. 77 * @param flags 78 * Flags that define expected behavior of the loaded filter 79 * (i.e. jited/non-jited version to use). 80 * @return 81 * Zero on successful completion or negative error code otherwise. 82 */ 83 int __rte_experimental 84 rte_bpf_eth_rx_elf_load(uint16_t port, uint16_t queue, 85 const struct rte_bpf_prm *prm, const char *fname, const char *sname, 86 uint32_t flags); 87 88 /** 89 * Load BPF program from the ELF file and install callback to execute it 90 * on given TX port/queue. 91 * 92 * @param port 93 * The identifier of the ethernet port 94 * @param queue 95 * The identifier of the TX queue on the given port 96 * @param fname 97 * Pathname for a ELF file. 98 * @param sname 99 * Name of the executable section within the file to load. 100 * @param prm 101 * Parameters used to create and initialise the BPF execution context. 102 * @param flags 103 * Flags that define expected expected behavior of the loaded filter 104 * (i.e. jited/non-jited version to use). 105 * @return 106 * Zero on successful completion or negative error code otherwise. 107 */ 108 int __rte_experimental 109 rte_bpf_eth_tx_elf_load(uint16_t port, uint16_t queue, 110 const struct rte_bpf_prm *prm, const char *fname, const char *sname, 111 uint32_t flags); 112 113 #ifdef __cplusplus 114 } 115 #endif 116 117 #endif /* _RTE_BPF_ETHDEV_H_ */ 118