xref: /dpdk/doc/guides/prog_guide/bpf_lib.rst (revision 41dd9a6bc2d9c6e20e139ad713cc9d172572dd43)
114b8f0bbSKonstantin Ananyev..  SPDX-License-Identifier: BSD-3-Clause
214b8f0bbSKonstantin Ananyev    Copyright(c) 2018 Intel Corporation.
314b8f0bbSKonstantin Ananyev
4*41dd9a6bSDavid YoungBerkeley Packet Filter (BPF) Library
5*41dd9a6bSDavid Young====================================
614b8f0bbSKonstantin Ananyev
714b8f0bbSKonstantin AnanyevThe DPDK provides an BPF library that gives the ability
814b8f0bbSKonstantin Ananyevto load and execute Enhanced Berkeley Packet Filter (eBPF) bytecode within
914b8f0bbSKonstantin Ananyevuser-space dpdk application.
1014b8f0bbSKonstantin Ananyev
1114b8f0bbSKonstantin AnanyevIt supports basic set of features from eBPF spec.
1214b8f0bbSKonstantin AnanyevPlease refer to the
1385bd316dSHarry van Haaren`eBPF spec <https://www.kernel.org/doc/Documentation/networking/filter.txt>`_
1414b8f0bbSKonstantin Ananyevfor more information.
1514b8f0bbSKonstantin AnanyevAlso it introduces basic framework to load/unload BPF-based filters
1614b8f0bbSKonstantin Ananyevon eth devices (right now only via SW RX/TX callbacks).
1714b8f0bbSKonstantin Ananyev
1814b8f0bbSKonstantin AnanyevThe library API provides the following basic operations:
1914b8f0bbSKonstantin Ananyev
2014b8f0bbSKonstantin Ananyev*  Create a new BPF execution context and load user provided eBPF code into it.
2114b8f0bbSKonstantin Ananyev
2214b8f0bbSKonstantin Ananyev*   Destroy an BPF execution context and its runtime structures and free the associated memory.
2314b8f0bbSKonstantin Ananyev
2414b8f0bbSKonstantin Ananyev*   Execute eBPF bytecode associated with provided input parameter.
2514b8f0bbSKonstantin Ananyev
2614b8f0bbSKonstantin Ananyev*   Provide information about natively compiled code for given BPF context.
2714b8f0bbSKonstantin Ananyev
2814b8f0bbSKonstantin Ananyev*   Load BPF program from the ELF file and install callback to execute it on given ethdev port/queue.
2914b8f0bbSKonstantin Ananyev
30b901d928SKonstantin AnanyevPacket data load instructions
31b901d928SKonstantin Ananyev-----------------------------
32b901d928SKonstantin Ananyev
33b901d928SKonstantin AnanyevDPDK supports two non-generic instructions: ``(BPF_ABS | size | BPF_LD)``
34b901d928SKonstantin Ananyevand ``(BPF_IND | size | BPF_LD)`` which are used to access packet data.
35b901d928SKonstantin AnanyevThese instructions can only be used when execution context is a pointer to
36b901d928SKonstantin Ananyev``struct rte_mbuf`` and have seven implicit operands.
37b901d928SKonstantin AnanyevRegister ``R6`` is an implicit input that must contain pointer to ``rte_mbuf``.
38b901d928SKonstantin AnanyevRegister ``R0`` is an implicit output which contains the data fetched from the
39b901d928SKonstantin Ananyevpacket. Registers ``R1-R5`` are scratch registers
40b901d928SKonstantin Ananyevand must not be used to store the data across these instructions.
41b901d928SKonstantin AnanyevThese instructions have implicit program exit condition as well. When
42b901d928SKonstantin AnanyeveBPF program is trying to access the data beyond the packet boundary,
43b901d928SKonstantin Ananyevthe interpreter will abort the execution of the program. JIT compilers
44b901d928SKonstantin Ananyevtherefore must preserve this property. ``src_reg`` and ``imm32`` fields are
45b901d928SKonstantin Ananyevexplicit inputs to these instructions.
46b901d928SKonstantin AnanyevFor example, ``(BPF_IND | BPF_W | BPF_LD)`` means:
47b901d928SKonstantin Ananyev
48b901d928SKonstantin Ananyev.. code-block:: c
49b901d928SKonstantin Ananyev
50b901d928SKonstantin Ananyev    uint32_t tmp;
5185bd316dSHarry van Haaren    R0 = rte_pktmbuf_read((const struct rte_mbuf *)R6,  src_reg + imm32, sizeof(tmp), &tmp);
5285bd316dSHarry van Haaren    if (R0 == NULL)
5385bd316dSHarry van Haaren        return FAILED;
54b901d928SKonstantin Ananyev    R0 = ntohl(*(uint32_t *)R0);
55b901d928SKonstantin Ananyev
56b901d928SKonstantin Ananyevand ``R1-R5`` were scratched.
57b901d928SKonstantin Ananyev
58b901d928SKonstantin Ananyev
5914b8f0bbSKonstantin AnanyevNot currently supported eBPF features
6014b8f0bbSKonstantin Ananyev-------------------------------------
6114b8f0bbSKonstantin Ananyev
626861c010SJerin Jacob - JIT support only available for X86_64 and arm64 platforms
6314b8f0bbSKonstantin Ananyev - cBPF
6414b8f0bbSKonstantin Ananyev - tail-pointer call
6514b8f0bbSKonstantin Ananyev - eBPF MAP
6614b8f0bbSKonstantin Ananyev - external function calls for 32-bit platforms
67