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