diff options
author | Alexei Starovoitov <ast@plumgrid.com> | 2015-09-16 02:05:43 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-09-18 00:09:07 -0400 |
commit | 27b29f63058d26c6c1742f1993338280d5a41dc6 (patch) | |
tree | 4a74088c6a959041fd267fcf03466ca7eea355e1 /samples/bpf/bpf_helpers.h | |
parent | 045efa82ff563cd4e656ca1c2e354fa5bf6bbda4 (diff) |
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>
Diffstat (limited to 'samples/bpf/bpf_helpers.h')
-rw-r--r-- | samples/bpf/bpf_helpers.h | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/samples/bpf/bpf_helpers.h b/samples/bpf/bpf_helpers.h index 3a44d3a272af..21aa1b44c30c 100644 --- a/samples/bpf/bpf_helpers.h +++ b/samples/bpf/bpf_helpers.h | |||
@@ -33,6 +33,10 @@ static int (*bpf_get_current_comm)(void *buf, int buf_size) = | |||
33 | (void *) BPF_FUNC_get_current_comm; | 33 | (void *) BPF_FUNC_get_current_comm; |
34 | static int (*bpf_perf_event_read)(void *map, int index) = | 34 | static int (*bpf_perf_event_read)(void *map, int index) = |
35 | (void *) BPF_FUNC_perf_event_read; | 35 | (void *) BPF_FUNC_perf_event_read; |
36 | static int (*bpf_clone_redirect)(void *ctx, int ifindex, int flags) = | ||
37 | (void *) BPF_FUNC_clone_redirect; | ||
38 | static int (*bpf_redirect)(int ifindex, int flags) = | ||
39 | (void *) BPF_FUNC_redirect; | ||
36 | 40 | ||
37 | /* llvm builtin functions that eBPF C program may use to | 41 | /* llvm builtin functions that eBPF C program may use to |
38 | * emit BPF_LD_ABS and BPF_LD_IND instructions | 42 | * emit BPF_LD_ABS and BPF_LD_IND instructions |