bpf: add bpf_redirect() helper
authorAlexei Starovoitov <ast@plumgrid.com>
Wed, 16 Sep 2015 06:05:43 +0000 (23:05 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 18 Sep 2015 04:09:07 +0000 (21:09 -0700)
commit27b29f63058d26c6c1742f1993338280d5a41dc6
tree4a74088c6a959041fd267fcf03466ca7eea355e1
parent045efa82ff563cd4e656ca1c2e354fa5bf6bbda4
bpf: add bpf_redirect() helper

Existing bpf_clone_redirect() helper clones skb before redirecting
it to RX or TX of destination netdev.
Introduce bpf_redirect() helper that does that without cloning.

Benchmarked with two hosts using 10G ixgbe NICs.
One host is doing line rate pktgen.
Another host is configured as:
$ tc qdisc add dev $dev ingress
$ tc filter add dev $dev root pref 10 u32 match u32 0 0 flowid 1:2 \
   action bpf run object-file tcbpf1_kern.o section clone_redirect_xmit drop
so it receives the packet on $dev and immediately xmits it on $dev + 1
The section 'clone_redirect_xmit' in tcbpf1_kern.o file has the program
that does bpf_clone_redirect() and performance is 2.0 Mpps

$ tc filter add dev $dev root pref 10 u32 match u32 0 0 flowid 1:2 \
   action bpf run object-file tcbpf1_kern.o section redirect_xmit drop
which is using bpf_redirect() - 2.4 Mpps

and using cls_bpf with integrated actions as:
$ tc filter add dev $dev root pref 10 \
  bpf run object-file tcbpf1_kern.o section redirect_xmit integ_act classid 1
performance is 2.5 Mpps

To summarize:
u32+act_bpf using clone_redirect - 2.0 Mpps
u32+act_bpf using redirect - 2.4 Mpps
cls_bpf using redirect - 2.5 Mpps

For comparison linux bridge in this setup is doing 2.1 Mpps
and ixgbe rx + drop in ip_rcv - 7.8 Mpps

Signed-off-by: Alexei Starovoitov <ast@plumgrid.com>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: John Fastabend <john.r.fastabend@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sch_generic.h
include/uapi/linux/bpf.h
include/uapi/linux/pkt_cls.h
net/core/dev.c
net/core/filter.c
net/sched/act_bpf.c
net/sched/cls_bpf.c
samples/bpf/bpf_helpers.h
samples/bpf/tcbpf1_kern.c