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>
This commit is contained in:

committed by
David S. Miller

parent
045efa82ff
commit
27b29f6305
@@ -5,7 +5,7 @@
|
||||
#include <uapi/linux/in.h>
|
||||
#include <uapi/linux/tcp.h>
|
||||
#include <uapi/linux/filter.h>
|
||||
|
||||
#include <uapi/linux/pkt_cls.h>
|
||||
#include "bpf_helpers.h"
|
||||
|
||||
/* compiler workaround */
|
||||
@@ -64,4 +64,26 @@ int bpf_prog1(struct __sk_buff *skb)
|
||||
|
||||
return 0;
|
||||
}
|
||||
SEC("redirect_xmit")
|
||||
int _redirect_xmit(struct __sk_buff *skb)
|
||||
{
|
||||
return bpf_redirect(skb->ifindex + 1, 0);
|
||||
}
|
||||
SEC("redirect_recv")
|
||||
int _redirect_recv(struct __sk_buff *skb)
|
||||
{
|
||||
return bpf_redirect(skb->ifindex + 1, 1);
|
||||
}
|
||||
SEC("clone_redirect_xmit")
|
||||
int _clone_redirect_xmit(struct __sk_buff *skb)
|
||||
{
|
||||
bpf_clone_redirect(skb, skb->ifindex + 1, 0);
|
||||
return TC_ACT_SHOT;
|
||||
}
|
||||
SEC("clone_redirect_recv")
|
||||
int _clone_redirect_recv(struct __sk_buff *skb)
|
||||
{
|
||||
bpf_clone_redirect(skb, skb->ifindex + 1, 1);
|
||||
return TC_ACT_SHOT;
|
||||
}
|
||||
char _license[] SEC("license") = "GPL";
|
||||
|
Reference in New Issue
Block a user