|
Gary Lin |
8ab8e2 |
From: Jakub Kicinski <jakub.kicinski@netronome.com>
|
|
Gary Lin |
8ab8e2 |
Date: Mon, 16 Oct 2017 16:40:53 -0700
|
|
Gary Lin |
8ab8e2 |
Subject: bpf: split verifier and program ops
|
|
Gary Lin |
8ab8e2 |
Patch-mainline: v4.15-rc1
|
|
Gary Lin |
8ab8e2 |
Git-commit: 7de16e3a35578f4f5accc6f5f23970310483d0a2
|
|
Gary Lin |
8ab8e2 |
References: bsc#1083647
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
struct bpf_verifier_ops contains both verifier ops and operations
|
|
Gary Lin |
8ab8e2 |
used later during program's lifetime (test_run). Split the runtime
|
|
Gary Lin |
8ab8e2 |
ops into a different structure.
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
BPF_PROG_TYPE() will now append ## _prog_ops or ## _verifier_ops
|
|
Gary Lin |
8ab8e2 |
to the names.
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
|
|
Gary Lin |
8ab8e2 |
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
|
|
Gary Lin |
8ab8e2 |
Acked-by: Alexei Starovoitov <ast@kernel.org>
|
|
Gary Lin |
8ab8e2 |
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
Gary Lin |
8ab8e2 |
Acked-by: Gary Lin <glin@suse.com>
|
|
Gary Lin |
8ab8e2 |
---
|
|
Gary Lin |
8ab8e2 |
include/linux/bpf.h | 15 ++++++++++-----
|
|
Gary Lin |
8ab8e2 |
include/linux/bpf_types.h | 24 ++++++++++++------------
|
|
Gary Lin |
8ab8e2 |
kernel/bpf/syscall.c | 16 +++++++++++++---
|
|
Gary Lin |
8ab8e2 |
kernel/bpf/verifier.c | 12 ++++++------
|
|
Gary Lin |
8ab8e2 |
kernel/trace/bpf_trace.c | 15 ++++++++++++---
|
|
Gary Lin |
8ab8e2 |
net/core/filter.c | 35 ++++++++++++++++++++++++++++-------
|
|
Gary Lin |
8ab8e2 |
6 files changed, 81 insertions(+), 36 deletions(-)
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
--- a/include/linux/bpf.h
|
|
Gary Lin |
8ab8e2 |
+++ b/include/linux/bpf.h
|
|
Gary Lin |
8ab8e2 |
@@ -154,6 +154,11 @@ bpf_ctx_record_field_size(struct bpf_ins
|
|
Gary Lin |
8ab8e2 |
aux->ctx_field_size = size;
|
|
Gary Lin |
8ab8e2 |
}
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
+struct bpf_prog_ops {
|
|
Gary Lin |
8ab8e2 |
+ int (*test_run)(struct bpf_prog *prog, const union bpf_attr *kattr,
|
|
Gary Lin |
8ab8e2 |
+ union bpf_attr __user *uattr);
|
|
Gary Lin |
8ab8e2 |
+};
|
|
Gary Lin |
8ab8e2 |
+
|
|
Gary Lin |
8ab8e2 |
struct bpf_verifier_ops {
|
|
Gary Lin |
8ab8e2 |
/* return eBPF function prototype for verification */
|
|
Gary Lin |
8ab8e2 |
const struct bpf_func_proto *(*get_func_proto)(enum bpf_func_id func_id);
|
|
Gary Lin |
8ab8e2 |
@@ -169,8 +174,6 @@ struct bpf_verifier_ops {
|
|
Gary Lin |
8ab8e2 |
const struct bpf_insn *src,
|
|
Gary Lin |
8ab8e2 |
struct bpf_insn *dst,
|
|
Gary Lin |
8ab8e2 |
struct bpf_prog *prog, u32 *target_size);
|
|
Gary Lin |
8ab8e2 |
- int (*test_run)(struct bpf_prog *prog, const union bpf_attr *kattr,
|
|
Gary Lin |
8ab8e2 |
- union bpf_attr __user *uattr);
|
|
Gary Lin |
8ab8e2 |
};
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
struct bpf_prog_aux {
|
|
Gary Lin |
8ab8e2 |
@@ -181,7 +184,8 @@ struct bpf_prog_aux {
|
|
Gary Lin |
8ab8e2 |
u32 id;
|
|
Gary Lin |
8ab8e2 |
struct latch_tree_node ksym_tnode;
|
|
Gary Lin |
8ab8e2 |
struct list_head ksym_lnode;
|
|
Gary Lin |
8ab8e2 |
- const struct bpf_verifier_ops *ops;
|
|
Gary Lin |
8ab8e2 |
+ const struct bpf_prog_ops *ops;
|
|
Gary Lin |
8ab8e2 |
+ const struct bpf_verifier_ops *vops;
|
|
Gary Lin |
8ab8e2 |
struct bpf_map **used_maps;
|
|
Gary Lin |
8ab8e2 |
struct bpf_prog *prog;
|
|
Gary Lin |
8ab8e2 |
struct user_struct *user;
|
|
Gary Lin |
8ab8e2 |
@@ -239,8 +243,9 @@ int bpf_prog_test_run_skb(struct bpf_pro
|
|
Gary Lin |
8ab8e2 |
#ifdef CONFIG_BPF_SYSCALL
|
|
Gary Lin |
8ab8e2 |
DECLARE_PER_CPU(int, bpf_prog_active);
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
-#define BPF_PROG_TYPE(_id, _ops) \
|
|
Gary Lin |
8ab8e2 |
- extern const struct bpf_verifier_ops _ops;
|
|
Gary Lin |
8ab8e2 |
+#define BPF_PROG_TYPE(_id, _name) \
|
|
Gary Lin |
8ab8e2 |
+ extern const struct bpf_prog_ops _name ## _prog_ops; \
|
|
Gary Lin |
8ab8e2 |
+ extern const struct bpf_verifier_ops _name ## _verifier_ops;
|
|
Gary Lin |
8ab8e2 |
#define BPF_MAP_TYPE(_id, _ops) \
|
|
Gary Lin |
8ab8e2 |
extern const struct bpf_map_ops _ops;
|
|
Gary Lin |
8ab8e2 |
#include <linux/bpf_types.h>
|
|
Gary Lin |
8ab8e2 |
--- a/include/linux/bpf_types.h
|
|
Gary Lin |
8ab8e2 |
+++ b/include/linux/bpf_types.h
|
|
Gary Lin |
8ab8e2 |
@@ -1,20 +1,20 @@
|
|
Gary Lin |
8ab8e2 |
/* internal file - do not include directly */
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
#ifdef CONFIG_NET
|
|
Gary Lin |
8ab8e2 |
-BPF_PROG_TYPE(BPF_PROG_TYPE_SOCKET_FILTER, sk_filter_prog_ops)
|
|
Gary Lin |
8ab8e2 |
-BPF_PROG_TYPE(BPF_PROG_TYPE_SCHED_CLS, tc_cls_act_prog_ops)
|
|
Gary Lin |
8ab8e2 |
-BPF_PROG_TYPE(BPF_PROG_TYPE_SCHED_ACT, tc_cls_act_prog_ops)
|
|
Gary Lin |
8ab8e2 |
-BPF_PROG_TYPE(BPF_PROG_TYPE_XDP, xdp_prog_ops)
|
|
Gary Lin |
8ab8e2 |
-BPF_PROG_TYPE(BPF_PROG_TYPE_CGROUP_SKB, cg_skb_prog_ops)
|
|
Gary Lin |
8ab8e2 |
-BPF_PROG_TYPE(BPF_PROG_TYPE_CGROUP_SOCK, cg_sock_prog_ops)
|
|
Gary Lin |
8ab8e2 |
-BPF_PROG_TYPE(BPF_PROG_TYPE_LWT_IN, lwt_inout_prog_ops)
|
|
Gary Lin |
8ab8e2 |
-BPF_PROG_TYPE(BPF_PROG_TYPE_LWT_OUT, lwt_inout_prog_ops)
|
|
Gary Lin |
8ab8e2 |
-BPF_PROG_TYPE(BPF_PROG_TYPE_LWT_XMIT, lwt_xmit_prog_ops)
|
|
Gary Lin |
8ab8e2 |
+BPF_PROG_TYPE(BPF_PROG_TYPE_SOCKET_FILTER, sk_filter)
|
|
Gary Lin |
8ab8e2 |
+BPF_PROG_TYPE(BPF_PROG_TYPE_SCHED_CLS, tc_cls_act)
|
|
Gary Lin |
8ab8e2 |
+BPF_PROG_TYPE(BPF_PROG_TYPE_SCHED_ACT, tc_cls_act)
|
|
Gary Lin |
8ab8e2 |
+BPF_PROG_TYPE(BPF_PROG_TYPE_XDP, xdp)
|
|
Gary Lin |
8ab8e2 |
+BPF_PROG_TYPE(BPF_PROG_TYPE_CGROUP_SKB, cg_skb)
|
|
Gary Lin |
8ab8e2 |
+BPF_PROG_TYPE(BPF_PROG_TYPE_CGROUP_SOCK, cg_sock)
|
|
Gary Lin |
8ab8e2 |
+BPF_PROG_TYPE(BPF_PROG_TYPE_LWT_IN, lwt_inout)
|
|
Gary Lin |
8ab8e2 |
+BPF_PROG_TYPE(BPF_PROG_TYPE_LWT_OUT, lwt_inout)
|
|
Gary Lin |
8ab8e2 |
+BPF_PROG_TYPE(BPF_PROG_TYPE_LWT_XMIT, lwt_xmit)
|
|
Gary Lin |
8ab8e2 |
#endif
|
|
Gary Lin |
8ab8e2 |
#ifdef CONFIG_BPF_EVENTS
|
|
Gary Lin |
8ab8e2 |
-BPF_PROG_TYPE(BPF_PROG_TYPE_KPROBE, kprobe_prog_ops)
|
|
Gary Lin |
8ab8e2 |
-BPF_PROG_TYPE(BPF_PROG_TYPE_TRACEPOINT, tracepoint_prog_ops)
|
|
Gary Lin |
8ab8e2 |
-BPF_PROG_TYPE(BPF_PROG_TYPE_PERF_EVENT, perf_event_prog_ops)
|
|
Gary Lin |
8ab8e2 |
+BPF_PROG_TYPE(BPF_PROG_TYPE_KPROBE, kprobe)
|
|
Gary Lin |
8ab8e2 |
+BPF_PROG_TYPE(BPF_PROG_TYPE_TRACEPOINT, tracepoint)
|
|
Gary Lin |
8ab8e2 |
+BPF_PROG_TYPE(BPF_PROG_TYPE_PERF_EVENT, perf_event)
|
|
Gary Lin |
8ab8e2 |
#endif
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
BPF_MAP_TYPE(BPF_MAP_TYPE_ARRAY, array_map_ops)
|
|
Gary Lin |
8ab8e2 |
--- a/kernel/bpf/syscall.c
|
|
Gary Lin |
8ab8e2 |
+++ b/kernel/bpf/syscall.c
|
|
Gary Lin |
8ab8e2 |
@@ -696,9 +696,18 @@ err_put:
|
|
Gary Lin |
8ab8e2 |
return err;
|
|
Gary Lin |
8ab8e2 |
}
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
-static const struct bpf_verifier_ops * const bpf_prog_types[] = {
|
|
Gary Lin |
8ab8e2 |
-#define BPF_PROG_TYPE(_id, _ops) \
|
|
Gary Lin |
8ab8e2 |
- [_id] = &_ops,
|
|
Gary Lin |
8ab8e2 |
+static const struct bpf_prog_ops * const bpf_prog_types[] = {
|
|
Gary Lin |
8ab8e2 |
+#define BPF_PROG_TYPE(_id, _name) \
|
|
Gary Lin |
8ab8e2 |
+ [_id] = & _name ## _prog_ops,
|
|
Gary Lin |
8ab8e2 |
+#define BPF_MAP_TYPE(_id, _ops)
|
|
Gary Lin |
8ab8e2 |
+#include <linux/bpf_types.h>
|
|
Gary Lin |
8ab8e2 |
+#undef BPF_PROG_TYPE
|
|
Gary Lin |
8ab8e2 |
+#undef BPF_MAP_TYPE
|
|
Gary Lin |
8ab8e2 |
+};
|
|
Gary Lin |
8ab8e2 |
+
|
|
Gary Lin |
8ab8e2 |
+static const struct bpf_verifier_ops * const bpf_verifier_ops[] = {
|
|
Gary Lin |
8ab8e2 |
+#define BPF_PROG_TYPE(_id, _name) \
|
|
Gary Lin |
8ab8e2 |
+ [_id] = & _name ## _verifier_ops,
|
|
Gary Lin |
8ab8e2 |
#define BPF_MAP_TYPE(_id, _ops)
|
|
Gary Lin |
8ab8e2 |
#include <linux/bpf_types.h>
|
|
Gary Lin |
8ab8e2 |
#undef BPF_PROG_TYPE
|
|
Gary Lin |
8ab8e2 |
@@ -711,6 +720,7 @@ static int find_prog_type(enum bpf_prog_
|
|
Gary Lin |
8ab8e2 |
return -EINVAL;
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
prog->aux->ops = bpf_prog_types[type];
|
|
Gary Lin |
8ab8e2 |
+ prog->aux->vops = bpf_verifier_ops[type];
|
|
Gary Lin |
8ab8e2 |
prog->type = type;
|
|
Gary Lin |
8ab8e2 |
return 0;
|
|
Gary Lin |
8ab8e2 |
}
|
|
Gary Lin |
8ab8e2 |
--- a/kernel/bpf/verifier.c
|
|
Gary Lin |
8ab8e2 |
+++ b/kernel/bpf/verifier.c
|
|
Gary Lin |
8ab8e2 |
@@ -822,8 +822,8 @@ static int check_ctx_access(struct bpf_v
|
|
Gary Lin |
8ab8e2 |
*reg_type = info.reg_type;
|
|
Gary Lin |
8ab8e2 |
return 0;
|
|
Gary Lin |
8ab8e2 |
}
|
|
Gary Lin |
8ab8e2 |
- } else if (env->prog->aux->ops->is_valid_access &&
|
|
Gary Lin |
8ab8e2 |
- env->prog->aux->ops->is_valid_access(off, size, t, &info)) {
|
|
Gary Lin |
8ab8e2 |
+ } else if (env->prog->aux->vops->is_valid_access &&
|
|
Gary Lin |
8ab8e2 |
+ env->prog->aux->vops->is_valid_access(off, size, t, &info)) {
|
|
Gary Lin |
8ab8e2 |
/* A non zero info.ctx_field_size indicates that this field is a
|
|
Gary Lin |
8ab8e2 |
* candidate for later verifier transformation to load the whole
|
|
Gary Lin |
8ab8e2 |
* field and then apply a mask when accessed with a narrower
|
|
Gary Lin |
8ab8e2 |
@@ -1498,8 +1498,8 @@ static int check_call(struct bpf_verifie
|
|
Gary Lin |
8ab8e2 |
return -EINVAL;
|
|
Gary Lin |
8ab8e2 |
}
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
- if (env->prog->aux->ops->get_func_proto)
|
|
Gary Lin |
8ab8e2 |
- fn = env->prog->aux->ops->get_func_proto(func_id);
|
|
Gary Lin |
8ab8e2 |
+ if (env->prog->aux->vops->get_func_proto)
|
|
Gary Lin |
8ab8e2 |
+ fn = env->prog->aux->vops->get_func_proto(func_id);
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
if (!fn) {
|
|
Gary Lin |
8ab8e2 |
verbose(env, "unknown func %s#%d\n", func_id_name(func_id),
|
|
Gary Lin |
8ab8e2 |
@@ -3939,7 +3939,7 @@ static struct bpf_prog *bpf_patch_insn_d
|
|
Gary Lin |
8ab8e2 |
*/
|
|
Gary Lin |
8ab8e2 |
static int convert_ctx_accesses(struct bpf_verifier_env *env)
|
|
Gary Lin |
8ab8e2 |
{
|
|
Gary Lin |
8ab8e2 |
- const struct bpf_verifier_ops *ops = env->prog->aux->ops;
|
|
Gary Lin |
8ab8e2 |
+ const struct bpf_verifier_ops *ops = env->prog->aux->vops;
|
|
Gary Lin |
8ab8e2 |
int i, cnt, size, ctx_field_size, delta = 0;
|
|
Gary Lin |
8ab8e2 |
const int insn_cnt = env->prog->len;
|
|
Gary Lin |
8ab8e2 |
struct bpf_insn insn_buf[16], *insn;
|
|
Gary Lin |
8ab8e2 |
@@ -4120,7 +4120,7 @@ static int fixup_bpf_calls(struct bpf_ve
|
|
Gary Lin |
8ab8e2 |
}
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
patch_call_imm:
|
|
Gary Lin |
8ab8e2 |
- fn = prog->aux->ops->get_func_proto(insn->imm);
|
|
Gary Lin |
8ab8e2 |
+ fn = prog->aux->vops->get_func_proto(insn->imm);
|
|
Gary Lin |
8ab8e2 |
/* all functions that have prototype and verifier allowed
|
|
Gary Lin |
8ab8e2 |
* programs to call them, must be real in-kernel functions
|
|
Gary Lin |
8ab8e2 |
*/
|
|
Gary Lin |
8ab8e2 |
--- a/kernel/trace/bpf_trace.c
|
|
Gary Lin |
8ab8e2 |
+++ b/kernel/trace/bpf_trace.c
|
|
Gary Lin |
8ab8e2 |
@@ -521,11 +521,14 @@ static bool kprobe_prog_is_valid_access(
|
|
Gary Lin |
8ab8e2 |
return true;
|
|
Gary Lin |
8ab8e2 |
}
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
-const struct bpf_verifier_ops kprobe_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_verifier_ops kprobe_verifier_ops = {
|
|
Gary Lin |
8ab8e2 |
.get_func_proto = kprobe_prog_func_proto,
|
|
Gary Lin |
8ab8e2 |
.is_valid_access = kprobe_prog_is_valid_access,
|
|
Gary Lin |
8ab8e2 |
};
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_prog_ops kprobe_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
+};
|
|
Gary Lin |
8ab8e2 |
+
|
|
Gary Lin |
8ab8e2 |
BPF_CALL_5(bpf_perf_event_output_tp, void *, tp_buff, struct bpf_map *, map,
|
|
Gary Lin |
8ab8e2 |
u64, flags, void *, data, u64, size)
|
|
Gary Lin |
8ab8e2 |
{
|
|
Gary Lin |
8ab8e2 |
@@ -599,11 +602,14 @@ static bool tp_prog_is_valid_access(int
|
|
Gary Lin |
8ab8e2 |
return true;
|
|
Gary Lin |
8ab8e2 |
}
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
-const struct bpf_verifier_ops tracepoint_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_verifier_ops tracepoint_verifier_ops = {
|
|
Gary Lin |
8ab8e2 |
.get_func_proto = tp_prog_func_proto,
|
|
Gary Lin |
8ab8e2 |
.is_valid_access = tp_prog_is_valid_access,
|
|
Gary Lin |
8ab8e2 |
};
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_prog_ops tracepoint_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
+};
|
|
Gary Lin |
8ab8e2 |
+
|
|
Gary Lin |
8ab8e2 |
static bool pe_prog_is_valid_access(int off, int size, enum bpf_access_type type,
|
|
Gary Lin |
8ab8e2 |
struct bpf_insn_access_aux *info)
|
|
Gary Lin |
8ab8e2 |
{
|
|
Gary Lin |
8ab8e2 |
@@ -659,8 +665,11 @@ static u32 pe_prog_convert_ctx_access(en
|
|
Gary Lin |
8ab8e2 |
return insn - insn_buf;
|
|
Gary Lin |
8ab8e2 |
}
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
-const struct bpf_verifier_ops perf_event_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_verifier_ops perf_event_verifier_ops = {
|
|
Gary Lin |
8ab8e2 |
.get_func_proto = tp_prog_func_proto,
|
|
Gary Lin |
8ab8e2 |
.is_valid_access = pe_prog_is_valid_access,
|
|
Gary Lin |
8ab8e2 |
.convert_ctx_access = pe_prog_convert_ctx_access,
|
|
Gary Lin |
8ab8e2 |
};
|
|
Gary Lin |
8ab8e2 |
+
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_prog_ops perf_event_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
+};
|
|
Gary Lin |
8ab8e2 |
--- a/net/core/filter.c
|
|
Gary Lin |
8ab8e2 |
+++ b/net/core/filter.c
|
|
Gary Lin |
8ab8e2 |
@@ -3390,55 +3390,76 @@ static u32 xdp_convert_ctx_access(enum b
|
|
Gary Lin |
8ab8e2 |
return insn - insn_buf;
|
|
Gary Lin |
8ab8e2 |
}
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
-const struct bpf_verifier_ops sk_filter_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_verifier_ops sk_filter_verifier_ops = {
|
|
Gary Lin |
8ab8e2 |
.get_func_proto = sk_filter_func_proto,
|
|
Gary Lin |
8ab8e2 |
.is_valid_access = sk_filter_is_valid_access,
|
|
Gary Lin |
8ab8e2 |
.convert_ctx_access = bpf_convert_ctx_access,
|
|
Gary Lin |
8ab8e2 |
};
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
-const struct bpf_verifier_ops tc_cls_act_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_prog_ops sk_filter_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
+};
|
|
Gary Lin |
8ab8e2 |
+
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_verifier_ops tc_cls_act_verifier_ops = {
|
|
Gary Lin |
8ab8e2 |
.get_func_proto = tc_cls_act_func_proto,
|
|
Gary Lin |
8ab8e2 |
.is_valid_access = tc_cls_act_is_valid_access,
|
|
Gary Lin |
8ab8e2 |
.convert_ctx_access = tc_cls_act_convert_ctx_access,
|
|
Gary Lin |
8ab8e2 |
.gen_prologue = tc_cls_act_prologue,
|
|
Gary Lin |
8ab8e2 |
+};
|
|
Gary Lin |
8ab8e2 |
+
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_prog_ops tc_cls_act_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
.test_run = bpf_prog_test_run_skb,
|
|
Gary Lin |
8ab8e2 |
};
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
-const struct bpf_verifier_ops xdp_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_verifier_ops xdp_verifier_ops = {
|
|
Gary Lin |
8ab8e2 |
.get_func_proto = xdp_func_proto,
|
|
Gary Lin |
8ab8e2 |
.is_valid_access = xdp_is_valid_access,
|
|
Gary Lin |
8ab8e2 |
.convert_ctx_access = xdp_convert_ctx_access,
|
|
Gary Lin |
8ab8e2 |
+};
|
|
Gary Lin |
8ab8e2 |
+
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_prog_ops xdp_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
.test_run = bpf_prog_test_run_xdp,
|
|
Gary Lin |
8ab8e2 |
};
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
-const struct bpf_verifier_ops cg_skb_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_verifier_ops cg_skb_verifier_ops = {
|
|
Gary Lin |
8ab8e2 |
.get_func_proto = sk_filter_func_proto,
|
|
Gary Lin |
8ab8e2 |
.is_valid_access = sk_filter_is_valid_access,
|
|
Gary Lin |
8ab8e2 |
.convert_ctx_access = bpf_convert_ctx_access,
|
|
Gary Lin |
8ab8e2 |
+};
|
|
Gary Lin |
8ab8e2 |
+
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_prog_ops cg_skb_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
.test_run = bpf_prog_test_run_skb,
|
|
Gary Lin |
8ab8e2 |
};
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
-const struct bpf_verifier_ops lwt_inout_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_verifier_ops lwt_inout_verifier_ops = {
|
|
Gary Lin |
8ab8e2 |
.get_func_proto = lwt_inout_func_proto,
|
|
Gary Lin |
8ab8e2 |
.is_valid_access = lwt_is_valid_access,
|
|
Gary Lin |
8ab8e2 |
.convert_ctx_access = bpf_convert_ctx_access,
|
|
Gary Lin |
8ab8e2 |
+};
|
|
Gary Lin |
8ab8e2 |
+
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_prog_ops lwt_inout_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
.test_run = bpf_prog_test_run_skb,
|
|
Gary Lin |
8ab8e2 |
};
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
-const struct bpf_verifier_ops lwt_xmit_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_verifier_ops lwt_xmit_verifier_ops = {
|
|
Gary Lin |
8ab8e2 |
.get_func_proto = lwt_xmit_func_proto,
|
|
Gary Lin |
8ab8e2 |
.is_valid_access = lwt_is_valid_access,
|
|
Gary Lin |
8ab8e2 |
.convert_ctx_access = bpf_convert_ctx_access,
|
|
Gary Lin |
8ab8e2 |
.gen_prologue = tc_cls_act_prologue,
|
|
Gary Lin |
8ab8e2 |
+};
|
|
Gary Lin |
8ab8e2 |
+
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_prog_ops lwt_xmit_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
.test_run = bpf_prog_test_run_skb,
|
|
Gary Lin |
8ab8e2 |
};
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
-const struct bpf_verifier_ops cg_sock_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_verifier_ops cg_sock_verifier_ops = {
|
|
Gary Lin |
8ab8e2 |
.get_func_proto = sock_filter_func_proto,
|
|
Gary Lin |
8ab8e2 |
.is_valid_access = sock_filter_is_valid_access,
|
|
Gary Lin |
8ab8e2 |
.convert_ctx_access = sock_filter_convert_ctx_access,
|
|
Gary Lin |
8ab8e2 |
};
|
|
Gary Lin |
8ab8e2 |
|
|
Gary Lin |
8ab8e2 |
+const struct bpf_prog_ops cg_sock_prog_ops = {
|
|
Gary Lin |
8ab8e2 |
+};
|
|
Gary Lin |
8ab8e2 |
+
|
|
Gary Lin |
8ab8e2 |
int sk_detach_filter(struct sock *sk)
|
|
Gary Lin |
8ab8e2 |
{
|
|
Gary Lin |
8ab8e2 |
int ret = -ENOENT;
|