[dpdk-dev] [PATCH v6 0/9] add framework to load and execute BPF code

Konstantin Ananyev konstantin.ananyev at intel.com
Thu May 10 12:23:02 CEST 2018


BPF is used quite intensively inside Linux (and BSD) kernels
for various different purposes and proved to be extremely useful.

BPF inside DPDK might also be used in a lot of places
for a lot of similar things.
 As an example to:
- packet filtering/tracing (aka tcpdump)
- packet classification
- statistics collection
- HW/PMD live-system debugging/prototyping - trace HW descriptors,
  internal PMD SW state, etc.
- Comeup with your own idea

All of that in a dynamic, user-defined and extensible manner.

So these series introduce new library - librte_bpf.
librte_bpf provides API to load and execute BPF bytecode within
user-space dpdk app.
It supports basic set of features from eBPF spec.
Also it introduces basic framework to load/unload BPF-based filters
on eth devices (right now via SW RX/TX callbacks).

How to try it:
===============

1) run testpmd as usual and start your favorite forwarding case.
2) build bpf program you'd like to load
(you'll need clang v3.7 or above):
$ cd test/bpf
$ clang -O2 -target bpf -c t1.c

3) load bpf program(s):
testpmd> bpf-load rx|tx <portid> <queueid> <load-flags> <bpf-prog-filename>

<load-flags>:  [-][J][M]
J - use JIT generated native code, otherwise BPF interpreter will be used.
M - assume input parameter is a pointer to rte_mbuf,
    otherwise assume it is a pointer to first segment's data.

Few examples:

# to load (not JITed) dummy.o at TX queue 0, port 0:
testpmd> bpf-load tx 0 0 - ./dpdk.org/test/bpf/dummy.o
#to load (and JIT compile) t1.o at RX queue 0, port 1:
testpmd> bpf-load rx 1 0 J ./dpdk.org/test/bpf/t1.o

#to load and JIT t3.o (note that it expects mbuf as an input):
testpmd> bpf-load rx 2 0 JM ./dpdk.org/test/bpf/t3.o


4) observe changed traffic behavior
Let say with the examples above:
 - dummy.o  does literally nothing, so no changes should be here,
   except some possible slowdown.
 - t1.o - should force to drop all packets that doesn't match:
   'dst 1.2.3.4 && udp && dst port 5000' filter.
 - t3.o - should dump to stdout ARP packets.

5) unload some or all bpf programs:
testpmd> bpf-unload tx 0 0

6) continue with step 3) or exit

Not currently supported features:
=================================
- cBPF
- tail-pointer call
- eBPF MAP
- JIT for non X86_64 targets
- skb
- function calls for 32-bit apps
- mbuf pointer as input parameter for 32-bit apps

v2:
 - add meson build
 - add freebsd build
 - use new logging API
 - using rte_malloc() for cbi allocation
 - add extra logic into bpf_validate()

v3:
 - add new test-case for it
 - update docs
 - update MAINTAINERS

v4:
 - add more tests to cover BPF ISA
 - fix few issues

v5:
 - revert changes in tap_bpf.h
 - rename eBPF related defines
 - apply Thomas and Marco comments

v6:
 Address Thomas, Kevin and Ferruh comments:
 - handle case when libelf is not installed gracefully
 - allow testpmd to be built without librte_bpf
 - doc nits

Konstantin Ananyev (9):
  bpf: add BPF loading and execution framework
  bpf: add ability to load eBPF program from ELF object file
  bpf: add more logic into bpf_validate()
  bpf: add JIT compilation for x86_64 ISA
  bpf: introduce basic RX/TX BPF filters
  testpmd: new commands to load/unload BPF filters
  test: add few eBPF samples
  test: introduce functional test for librte_bpf
  doc: add bpf library related info

 MAINTAINERS                                 |    4 +
 app/test-pmd/Makefile                       |    1 +
 app/test-pmd/bpf_cmd.c                      |  175 +++
 app/test-pmd/bpf_cmd.h                      |   16 +
 app/test-pmd/cmdline.c                      |    5 +
 app/test-pmd/meson.build                    |    4 +
 config/common_base                          |    8 +
 doc/api/doxy-api-index.md                   |    3 +-
 doc/api/doxy-api.conf                       |    1 +
 doc/guides/prog_guide/bpf_lib.rst           |   38 +
 doc/guides/prog_guide/index.rst             |    1 +
 doc/guides/rel_notes/release_18_05.rst      |    8 +
 doc/guides/testpmd_app_ug/testpmd_funcs.rst |   56 +
 lib/Makefile                                |    2 +
 lib/librte_bpf/Makefile                     |   41 +
 lib/librte_bpf/bpf.c                        |   64 +
 lib/librte_bpf/bpf_def.h                    |  138 +++
 lib/librte_bpf/bpf_exec.c                   |  453 +++++++
 lib/librte_bpf/bpf_impl.h                   |   41 +
 lib/librte_bpf/bpf_jit_x86.c                | 1369 +++++++++++++++++++++
 lib/librte_bpf/bpf_load.c                   |  101 ++
 lib/librte_bpf/bpf_load_elf.c               |  322 +++++
 lib/librte_bpf/bpf_pkt.c                    |  607 +++++++++
 lib/librte_bpf/bpf_validate.c               | 1184 ++++++++++++++++++
 lib/librte_bpf/meson.build                  |   25 +
 lib/librte_bpf/rte_bpf.h                    |  184 +++
 lib/librte_bpf/rte_bpf_ethdev.h             |  112 ++
 lib/librte_bpf/rte_bpf_version.map          |   16 +
 lib/meson.build                             |    2 +-
 mk/rte.app.mk                               |    5 +
 test/bpf/dummy.c                            |   20 +
 test/bpf/mbuf.h                             |  578 +++++++++
 test/bpf/t1.c                               |   52 +
 test/bpf/t2.c                               |   31 +
 test/bpf/t3.c                               |   36 +
 test/test/Makefile                          |    2 +
 test/test/meson.build                       |    2 +
 test/test/test_bpf.c                        | 1759 +++++++++++++++++++++++++++
 38 files changed, 7464 insertions(+), 2 deletions(-)
 create mode 100644 app/test-pmd/bpf_cmd.c
 create mode 100644 app/test-pmd/bpf_cmd.h
 create mode 100644 doc/guides/prog_guide/bpf_lib.rst
 create mode 100644 lib/librte_bpf/Makefile
 create mode 100644 lib/librte_bpf/bpf.c
 create mode 100644 lib/librte_bpf/bpf_def.h
 create mode 100644 lib/librte_bpf/bpf_exec.c
 create mode 100644 lib/librte_bpf/bpf_impl.h
 create mode 100644 lib/librte_bpf/bpf_jit_x86.c
 create mode 100644 lib/librte_bpf/bpf_load.c
 create mode 100644 lib/librte_bpf/bpf_load_elf.c
 create mode 100644 lib/librte_bpf/bpf_pkt.c
 create mode 100644 lib/librte_bpf/bpf_validate.c
 create mode 100644 lib/librte_bpf/meson.build
 create mode 100644 lib/librte_bpf/rte_bpf.h
 create mode 100644 lib/librte_bpf/rte_bpf_ethdev.h
 create mode 100644 lib/librte_bpf/rte_bpf_version.map
 create mode 100644 test/bpf/dummy.c
 create mode 100644 test/bpf/mbuf.h
 create mode 100644 test/bpf/t1.c
 create mode 100644 test/bpf/t2.c
 create mode 100644 test/bpf/t3.c
 create mode 100644 test/test/test_bpf.c

-- 
2.13.6



More information about the dev mailing list