[dpdk-dev] [PATCH v3 00/10] add framework to load and execute BPF code

Ananyev, Konstantin konstantin.ananyev at intel.com
Mon Apr 9 13:10:20 CEST 2018


Hi Jerin,

> >
> > 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
> 
> May be for next release, we are planning to add arm64 JIT support.

Sounds great :)

> Just wondering, How do you test all EBPF opcodes in JIT/Interpreter mode?
> Are you planning to add any UT like linux kernel in dpdk ?  or it was
> similar to https://github.com/iovisor/ubpf/tree/master/tests ?

I added UT for it in v3:
http://dpdk.org/dev/patchwork/patch/37456/
But it doesn't cover whole ISA yet.
In fact - that's what I am working right now - adding more test-cases to it,
so hopefully by next release will have  much better test coverage.
Another thing I plan to add - harden validate() to catch more cases with
Invalid code. 

Konstantin

> 
> Just asking because, when we introduce arm64 JIT support similar
> test cases should be required to verify the implementation.


More information about the dev mailing list