Message ID | 20230526121124.3915-1-fw@strlen.de (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | BPF |
Headers | show |
Series | [bpf] bpf: netfilter: add BPF_NETFILTER bpf_attach_type | expand |
On Fri, May 26, 2023 at 5:11 AM Florian Westphal <fw@strlen.de> wrote: > > Andrii Nakryiko writes: > > And we currently don't have an attach type for NETLINK BPF link. > Thankfully it's not too late to add it. I see that link_create() in > kernel/bpf/syscall.c just bypasses attach_type check. We shouldn't > have done that. Instead we need to add BPF_NETLINK attach type to enum > bpf_attach_type. And wire all that properly throughout the kernel and > libbpf itself. > > This adds BPF_NETFILTER and uses it. This breaks uabi but this > wasn't in any non-rc release yet, so it should be fine. > > Fixes: 84601d6ee68a ("bpf: add bpf_link support for BPF_NETFILTER programs") > Suggested-by: Andrii Nakryiko <andrii.nakryiko@gmail.com> > Link: https://lore.kernel.org/bpf/CAEf4BzZ69YgrQW7DHCJUT_X+GqMq_ZQQPBwopaJJVGFD5=d5Vg@mail.gmail.com/ > Signed-off-by: Florian Westphal <fw@strlen.de> > --- > include/uapi/linux/bpf.h | 1 + > kernel/bpf/syscall.c | 4 ++++ > tools/include/uapi/linux/bpf.h | 1 + > tools/lib/bpf/libbpf.c | 2 +- > 4 files changed, 7 insertions(+), 1 deletion(-) > > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h > index 1bb11a6ee667..c994ff5b157c 100644 > --- a/include/uapi/linux/bpf.h > +++ b/include/uapi/linux/bpf.h > @@ -1035,6 +1035,7 @@ enum bpf_attach_type { > BPF_TRACE_KPROBE_MULTI, > BPF_LSM_CGROUP, > BPF_STRUCT_OPS, > + BPF_NETFILTER, > __MAX_BPF_ATTACH_TYPE > }; > > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c > index 14f39c1e573e..cc1fc2404406 100644 > --- a/kernel/bpf/syscall.c > +++ b/kernel/bpf/syscall.c > @@ -2433,6 +2433,10 @@ bpf_prog_load_check_attach(enum bpf_prog_type prog_type, > default: > return -EINVAL; > } > + case BPF_PROG_TYPE_NETFILTER: > + if (expected_attach_type == BPF_NETFILTER) > + return 0; > + return -EINVAL; > case BPF_PROG_TYPE_SYSCALL: > case BPF_PROG_TYPE_EXT: > if (expected_attach_type) You've missed updating link_create() as well, there is a case BPF_PROG_TYPE_NETFILTER: break; switch case, which should validate that attr->link_create.attach_type is BPF_NETFILTER Other than that, it looks good to me, thanks! > diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h > index 1bb11a6ee667..c994ff5b157c 100644 > --- a/tools/include/uapi/linux/bpf.h > +++ b/tools/include/uapi/linux/bpf.h > @@ -1035,6 +1035,7 @@ enum bpf_attach_type { > BPF_TRACE_KPROBE_MULTI, > BPF_LSM_CGROUP, > BPF_STRUCT_OPS, > + BPF_NETFILTER, > __MAX_BPF_ATTACH_TYPE > }; > > diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index ad1ec893b41b..532a97cf1cc1 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c > @@ -8712,7 +8712,7 @@ static const struct bpf_sec_def section_defs[] = { > SEC_DEF("struct_ops+", STRUCT_OPS, 0, SEC_NONE), > SEC_DEF("struct_ops.s+", STRUCT_OPS, 0, SEC_SLEEPABLE), > SEC_DEF("sk_lookup", SK_LOOKUP, BPF_SK_LOOKUP, SEC_ATTACHABLE), > - SEC_DEF("netfilter", NETFILTER, 0, SEC_NONE), > + SEC_DEF("netfilter", NETFILTER, BPF_NETFILTER, SEC_NONE), > }; > > static size_t custom_sec_def_cnt; > -- > 2.39.3 >
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 1bb11a6ee667..c994ff5b157c 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -1035,6 +1035,7 @@ enum bpf_attach_type { BPF_TRACE_KPROBE_MULTI, BPF_LSM_CGROUP, BPF_STRUCT_OPS, + BPF_NETFILTER, __MAX_BPF_ATTACH_TYPE }; diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 14f39c1e573e..cc1fc2404406 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -2433,6 +2433,10 @@ bpf_prog_load_check_attach(enum bpf_prog_type prog_type, default: return -EINVAL; } + case BPF_PROG_TYPE_NETFILTER: + if (expected_attach_type == BPF_NETFILTER) + return 0; + return -EINVAL; case BPF_PROG_TYPE_SYSCALL: case BPF_PROG_TYPE_EXT: if (expected_attach_type) diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 1bb11a6ee667..c994ff5b157c 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -1035,6 +1035,7 @@ enum bpf_attach_type { BPF_TRACE_KPROBE_MULTI, BPF_LSM_CGROUP, BPF_STRUCT_OPS, + BPF_NETFILTER, __MAX_BPF_ATTACH_TYPE }; diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index ad1ec893b41b..532a97cf1cc1 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -8712,7 +8712,7 @@ static const struct bpf_sec_def section_defs[] = { SEC_DEF("struct_ops+", STRUCT_OPS, 0, SEC_NONE), SEC_DEF("struct_ops.s+", STRUCT_OPS, 0, SEC_SLEEPABLE), SEC_DEF("sk_lookup", SK_LOOKUP, BPF_SK_LOOKUP, SEC_ATTACHABLE), - SEC_DEF("netfilter", NETFILTER, 0, SEC_NONE), + SEC_DEF("netfilter", NETFILTER, BPF_NETFILTER, SEC_NONE), }; static size_t custom_sec_def_cnt;
Andrii Nakryiko writes: And we currently don't have an attach type for NETLINK BPF link. Thankfully it's not too late to add it. I see that link_create() in kernel/bpf/syscall.c just bypasses attach_type check. We shouldn't have done that. Instead we need to add BPF_NETLINK attach type to enum bpf_attach_type. And wire all that properly throughout the kernel and libbpf itself. This adds BPF_NETFILTER and uses it. This breaks uabi but this wasn't in any non-rc release yet, so it should be fine. Fixes: 84601d6ee68a ("bpf: add bpf_link support for BPF_NETFILTER programs") Suggested-by: Andrii Nakryiko <andrii.nakryiko@gmail.com> Link: https://lore.kernel.org/bpf/CAEf4BzZ69YgrQW7DHCJUT_X+GqMq_ZQQPBwopaJJVGFD5=d5Vg@mail.gmail.com/ Signed-off-by: Florian Westphal <fw@strlen.de> --- include/uapi/linux/bpf.h | 1 + kernel/bpf/syscall.c | 4 ++++ tools/include/uapi/linux/bpf.h | 1 + tools/lib/bpf/libbpf.c | 2 +- 4 files changed, 7 insertions(+), 1 deletion(-)