[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