xref: /dpdk/drivers/net/tap/bpf/README (revision d8d065045c4ae99476485981abbd462f18496d86)
1*d8d06504SStephen HemmingerThis is the BPF program used to implement Receive Side Scaling (RSS)
2*d8d06504SStephen Hemmingeracross multiple queues if required by a flow action. The program is
3*d8d06504SStephen Hemmingerloaded into the kernel when first RSS flow rule is created and is never unloaded.
4*d8d06504SStephen Hemminger
5*d8d06504SStephen HemmingerWhen flow rules with the TAP device, packets are first handled by the
6*d8d06504SStephen Hemmingeringress queue discipline that then runs a series of classifier filter rules.
7*d8d06504SStephen HemmingerThe first stage is the flow based classifier (flower); for RSS queue
8*d8d06504SStephen Hemmingeraction the second stage is an the kernel skbedit action which sets
9*d8d06504SStephen Hemmingerthe skb mark to a key based on the flow id; the final stage
10*d8d06504SStephen Hemmingeris this BPF program which then maps flow id and packet header
11*d8d06504SStephen Hemmingerinto a queue id.
12*d8d06504SStephen Hemminger
13*d8d06504SStephen HemmingerThis version is built the BPF Compile Once — Run Everywhere (CO-RE)
14*d8d06504SStephen Hemmingerframework and uses libbpf and bpftool.
15*d8d06504SStephen Hemminger
16*d8d06504SStephen HemmingerLimitations
17*d8d06504SStephen Hemminger-----------
18*d8d06504SStephen Hemminger- requires libbpf to run
19*d8d06504SStephen Hemminger
20*d8d06504SStephen Hemminger- rebuilding the BPF requires the clang compiler with bpf available
21*d8d06504SStephen Hemminger  as a target architecture and bpftool to convert object to headers.
22*d8d06504SStephen Hemminger
23*d8d06504SStephen Hemminger  Some older versions of Ubuntu do not have a working bpftool package.
24*d8d06504SStephen Hemminger
25*d8d06504SStephen Hemminger- only standard Toeplitz hash with standard 40 byte key is supported.
26*d8d06504SStephen Hemminger
27*d8d06504SStephen Hemminger- the number of flow rules using RSS is limited to 32.
28*d8d06504SStephen Hemminger
29*d8d06504SStephen HemmingerBuilding
30*d8d06504SStephen Hemminger--------
31*d8d06504SStephen HemmingerDuring the DPDK build process the meson build file checks that
32*d8d06504SStephen Hemmingerlibbpf, bpftool, and clang are available. If everything works then
33*d8d06504SStephen HemmingerBPF RSS is enabled.
34*d8d06504SStephen Hemminger
35*d8d06504SStephen HemmingerThe steps are:
36*d8d06504SStephen Hemminger
37*d8d06504SStephen Hemminger1. Uses clang to compile tap_rss.c to produce tap_rss.bpf.o
38*d8d06504SStephen Hemminger
39*d8d06504SStephen Hemminger2. Uses bpftool generate a skeleton header file tap_rss.skel.h
40*d8d06504SStephen Hemminger   from tap_rss.bpf.o. This header contains wrapper functions for
41*d8d06504SStephen Hemminger   managing the BPF and the actual BPF code as a large byte array.
42*d8d06504SStephen Hemminger
43*d8d06504SStephen Hemminger3. The header file is include in tap_flow.c so that it can load
44*d8d06504SStephen Hemminger   the BPF code (via libbpf).
45*d8d06504SStephen Hemminger
46*d8d06504SStephen HemmingerReferences
47*d8d06504SStephen Hemminger----------
48*d8d06504SStephen HemmingerBPF and XDP reference guide
49*d8d06504SStephen Hemmingerhttps://docs.cilium.io/en/latest/bpf/progtypes/
50