summaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/netronome/nfp/bpf/verifier.c
diff options
context:
space:
mode:
authorJakub Kicinski2017-12-15 06:29:18 +0100
committerDaniel Borkmann2017-12-15 14:18:18 +0100
commit0d49eaf4db2ad18489ff1cfceba17006c1d17b7e (patch)
treedfa5b9c1859a1657d4f61838b165ba8786000bc7 /drivers/net/ethernet/netronome/nfp/bpf/verifier.c
parentnfp: bpf: prepare for call support (diff)
downloadkernel-qcow2-linux-0d49eaf4db2ad18489ff1cfceba17006c1d17b7e.tar.gz
kernel-qcow2-linux-0d49eaf4db2ad18489ff1cfceba17006c1d17b7e.tar.xz
kernel-qcow2-linux-0d49eaf4db2ad18489ff1cfceba17006c1d17b7e.zip
nfp: bpf: add basic support for adjust head call
Support bpf_xdp_adjust_head(). We need to check whether the packet offset after adjustment is within datapath's limits. We also check if the frame is at least ETH_HLEN long (similar to the kernel implementation). Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'drivers/net/ethernet/netronome/nfp/bpf/verifier.c')
-rw-r--r--drivers/net/ethernet/netronome/nfp/bpf/verifier.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c
index 3b940b682ac3..0a457d98666c 100644
--- a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c
+++ b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c
@@ -38,6 +38,7 @@
#include <linux/kernel.h>
#include <linux/pkt_cls.h>
+#include "fw.h"
#include "main.h"
struct nfp_insn_meta *
@@ -71,9 +72,20 @@ nfp_bpf_goto_meta(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta,
static int
nfp_bpf_check_call(struct nfp_prog *nfp_prog, struct nfp_insn_meta *meta)
{
+ struct nfp_app_bpf *bpf = nfp_prog->bpf;
u32 func_id = meta->insn.imm;
switch (func_id) {
+ case BPF_FUNC_xdp_adjust_head:
+ if (!bpf->adjust_head.off_max) {
+ pr_warn("adjust_head not supported by FW\n");
+ return -EOPNOTSUPP;
+ }
+ if (!(bpf->adjust_head.flags & NFP_BPF_ADJUST_HEAD_NO_META)) {
+ pr_warn("adjust_head: FW requires shifting metadata, not supported by the driver\n");
+ return -EOPNOTSUPP;
+ }
+ break;
default:
pr_warn("unsupported function id: %d\n", func_id);
return -EOPNOTSUPP;