From: Florian Westphal <fw@strlen.de>
To: "Toke Høiland-Jørgensen" <toke@kernel.org>
Cc: Florian Westphal <fw@strlen.de>,
bpf@vger.kernel.org, netfilter-devel@vger.kernel.org
Subject: Re: [RFC] bpf: add bpf_link support for BPF_NETFILTER programs
Date: Mon, 30 Jan 2023 19:01:15 +0100 [thread overview]
Message-ID: <20230130180115.GB12902@breakpoint.cc> (raw)
In-Reply-To: <87zg9zx6ro.fsf@toke.dk>
Toke Høiland-Jørgensen <toke@kernel.org> wrote:
> > Is BPF_LINK the right place? Hook gets removed automatically if the calling program
> > exits, afaict this is intended.
>
> Yes, this is indeed intended for bpf_link. This plays well with
> applications that use the API and stick around (because things get
> cleaned up after them automatically even if they crash, say), but it
> doesn't work so well for programs that don't (which, notably, includes
> command line utilities like 'nft').
Right, but I did not want to create a dependency on nfnetlink or
nftables netlink right from the start.
> For XDP and TC users can choose between bpf_link and netlink for
> attachment and get one of the two semantics (goes away on close or stays
> put). Not sure if it would make sense to do the same for nftables?
For nftables I suspect that, if nft can emit bpf, it would make sense to
pass the bpf descriptor together with nftables netlink, i.e. along with
the normal netlink data.
nftables kernel side would then know to use the bpf prog for the
datapath instead of the interpreter and could even fallback to
interpreter.
But for the raw hook use case that Alexei and Daniel preferred (cf.
initial proposal to call bpf progs from nf_tables interpreter) I think
that there should be no nftables dependency.
I could add a new nfnetlink subtype for nf-bpf if bpf_link is not
appropriate as an alternative.
> > Should a program running in init_netns be allowed to attach hooks in other netns too?
> >
> > I could do what BPF_LINK_TYPE_NETNS is doing and fetch net via
> > get_net_ns_by_fd(attr->link_create.target_fd);
>
> We don't allow that for any other type of BPF program; the expectation
> is that the entity doing the attachment will move to the right ns first.
> Is there any particular use case for doing something different for
> nftables?
Nope, not at all. I was just curious. So no special handling for
init_netns needed, good.
> > For the actual BPF_NETFILTER program type I plan to follow what the bpf
> > flow dissector is doing, i.e. pretend prototype is
> >
> > func(struct __sk_buff *skb)
> >
> > but pass a custom program specific context struct on kernel side.
> > Verifier will rewrite accesses as needed.
>
> This sounds reasonable, and also promotes code reuse between program
> types (say, you can write some BPF code to parse a packet and reuse it
> between the flow dissector, TC and netfilter).
Ok, thanks.
> > Things like nf_hook_state->in (net_device) could then be exposed via
> > kfuncs.
>
> Right, so like:
>
> state = bpf_nf_get_hook_state(ctx); ?
>
> Sounds OK to me.
Yes, something like that. Downside is that the nf_hook_state struct
is no longer bound by any abi contract, but as I understood it thats
fine.
> > nf_hook_run_bpf() (c-function that creates the program context and
> > calls the real bpf prog) would be "updated" to use the bpf dispatcher to
> > avoid the indirect call overhead.
>
> What 'bpf dispatcher' are you referring to here? We have way too many
> things with that name :P
I meant 'DEFINE_BPF_DISPATCHER(nf_user_progs);'
Thanks.
next prev parent reply other threads:[~2023-01-30 18:01 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-30 15:04 [RFC] bpf: add bpf_link support for BPF_NETFILTER programs Florian Westphal
2023-01-30 17:38 ` Toke Høiland-Jørgensen
2023-01-30 18:01 ` Florian Westphal [this message]
2023-01-30 21:10 ` Toke Høiland-Jørgensen
2023-01-30 21:44 ` Alexei Starovoitov
2023-01-31 14:18 ` Florian Westphal
2023-01-31 16:19 ` Toke Høiland-Jørgensen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230130180115.GB12902@breakpoint.cc \
--to=fw@strlen.de \
--cc=bpf@vger.kernel.org \
--cc=netfilter-devel@vger.kernel.org \
--cc=toke@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox