On 05/04/2018 04:54 AM, David Ahern wrote: > Provide a helper for doing a FIB and neighbor lookup in the kernel > tables from an XDP program. The helper provides a fastpath for forwarding > packets. If the packet is a local delivery or for any reason is not a > simple lookup and forward, the packet continues up the stack. > > If it is to be forwarded, the forwarding can be done directly if the > neighbor is already known. If the neighbor does not exist, the first > few packets go up the stack for neighbor resolution. Once resolved, the > xdp program provides the fast path. > > On successful lookup the nexthop dmac, current device smac and egress > device index are returned. > > The API supports IPv4, IPv6 and MPLS protocols, but only IPv4 and IPv6 > are implemented in this patch. The API includes layer 4 parameters if > the XDP program chooses to do deep packet inspection to allow compare > against ACLs implemented as FIB rules. > > Header rewrite is left to the XDP program. > > The lookup takes 2 flags: > - BPF_FIB_LOOKUP_DIRECT to do a lookup that bypasses FIB rules and goes > straight to the table associated with the device (expert setting for > those looking to maximize throughput) > > - BPF_FIB_LOOKUP_OUTPUT to do a lookup from the egress perspective. > Default is an ingress lookup. > > Initial performance numbers collected by Jesper, forwarded packets/sec: > > Full stack XDP FIB lookup XDP Direct lookup > IPv4 1,947,969 7,074,156 7,415,333 > IPv6 1,728,000 6,165,504 7,262,720 > > These number are single CPU core forwarding on a Broadwell > E5-1650 v4 @ 3.60GHz. > > Signed-off-by: David Ahern <dsah...@gmail.com>
Ohh well, this is causing allmodconfig build warnings (e.g. on x86) as reported today: In file included from include/linux/dma-mapping.h:5:0, from include/linux/skbuff.h:34, from include/linux/if_ether.h:23, from include/uapi/linux/bpf.h:13, from include/linux/bpf-cgroup.h:6, from include/linux/cgroup-defs.h:22, from include/linux/cgroup.h:28, from include/linux/perf_event.h:57, from include/linux/trace_events.h:10, from include/trace/trace_events.h:20, from include/trace/define_trace.h:96, from drivers/android/binder_trace.h:387, from drivers/android/binder.c:5702: include/linux/sizes.h:24:0: warning: "SZ_1K" redefined #define SZ_1K 0x00000400 drivers/android/binder.c:116:0: note: this is the location of the previous definition #define SZ_1K 0x400 In file included from include/linux/dma-mapping.h:5:0, from include/linux/skbuff.h:34, from include/linux/if_ether.h:23, from include/uapi/linux/bpf.h:13, from include/linux/bpf-cgroup.h:6, from include/linux/cgroup-defs.h:22, from include/linux/cgroup.h:28, from include/linux/perf_event.h:57, from include/linux/trace_events.h:10, from include/trace/trace_events.h:20, from include/trace/define_trace.h:96, from drivers/android/binder_trace.h:387, from drivers/android/binder.c:5702: include/linux/sizes.h:37:0: warning: "SZ_4M" redefined #define SZ_4M 0x00400000 drivers/android/binder.c:120:0: note: this is the location of the previous definition #define SZ_4M 0x400000 fs/ecryptfs/miscdev.c:206:0: warning: "PKT_TYPE_OFFSET" redefined #define PKT_TYPE_OFFSET 0 In file included from include/linux/if_ether.h:23:0, from include/uapi/linux/bpf.h:13, from include/linux/bpf-cgroup.h:6, from include/linux/cgroup-defs.h:22, from include/linux/cgroup.h:28, from include/linux/writeback.h:183, from include/linux/backing-dev.h:16, from fs/ecryptfs/ecryptfs_kernel.h:41, from fs/ecryptfs/miscdev.c:30: include/linux/skbuff.h:753:0: note: this is the location of the previous definition #define PKT_TYPE_OFFSET() offsetof(struct sk_buff, __pkt_type_offset) Lets get a clean, proper version of the whole series into bpf-next. I've dropped it from there right now and waiting for your v3 respin to apply with the above fixed. Thank you.