From: Florian Westphal <fw@strlen.de>
To: Christoph Anton Mitterer <mail@christoph.anton.mitterer.name>
Cc: netfilter-devel@vger.kernel.org, pablo@netfilter.org
Subject: Re: [PATCH v2 2/7] doc: fix/improve documentation of verdicts
Date: Sat, 18 Oct 2025 15:25:10 +0200 [thread overview]
Message-ID: <aPOVNvw1t8lZT88o@strlen.de> (raw)
In-Reply-To: <11427578d25220212d40533ed4a77652acefcc26.camel@christoph.anton.mitterer.name>
Christoph Anton Mitterer <mail@christoph.anton.mitterer.name> wrote:
> On Wed, 2025-10-15 at 13:42 +0200, Florian Westphal wrote:
> > Christoph Anton Mitterer <mail@christoph.anton.mitterer.name> wrote:
> > > +*accept*:: Terminate the evaluation of the current base chain (and
> > > any regular
> > > +chains called from it) and accept the packet from their point of
> > > view.
> >
> > Suggest:
> > *accept*:: Terminate the evaluation of the chain. Evaluation
> > continues in the next base chain, if any.
>
> What I like about it, is that it avoids the slightly awkward "current
> base chain (and any regular chains called from it)" construct...
>
> What I'm neutral about: Strictly speaking, it does not mention whether
> evaluation of any "parent" chains is also terminated.
> You try to solve that by saying "Evaluation continues in the next base
> chain"... and it is indeed kinda reasonable that all from the current
> base chain are then stopped... but a weird system could in principle
> continue with the next base chain, and eventually go back to the
> previous.
But this should describe netfilter and not something else :-)
> (Just like originally I completely misunderstood how return works when
> goto was involved).
>
> What I like less about it, is that is misses this additional context of
> "acceptance is only with respect to those chains".
Hm, I think "Terminates the evaluation of the chain" is pretty clear.
And "Evaluation continues in ..." is also clear, packet is allowed to
move on in the processing pipeline.
> Yes it can be deduced from the following sentence ("The packet may
> however still be dropped by either")... and meanwhile, where I
> (hopefully ;-) ) understand how it works, that seems enough, but for a
> pure beginner it's IMO better to give such context and rather reinforce
> things twice in different words.
> What would you think about:
> 1st:
> Either:
> Terminate the evaluation of the current chain as well as any chains
> from which that was called and accept the packet with respect to the
> base chain of these.
> or:
> Terminate the evaluation of the current chain as well as any chains in
> the call stack and accept the packet with respect to the base chain of
> these.
It correct but it sounds overly complicated IMO.
> 2nd and also replacing:
> > The packet may however still be dropped by either another chain with a higher
> > priority of the same hook or any chain of a later hook.
I would be fine with that, even though I also consider it too verbose.
> Evaluation continues in the next base chain (of higher or possibly
> equal priority from the same hook or of any priority from a later
> hook), if any.
Hmm, I am not sure. Is it really needed to mention all of this?
Packet will just move on in the pipeline, it would be weird to assume
that forward-accepted packet would e.g. bypass postrouting.
> This means the packet can still be dropped in that next base chain as
> well as any regular chain (directly or indirectly) called from it.
... or that it moes to the next base chain but that base chain ignores
jumps to user-defined chains.
Your suggestions aren't wrong of course but it seems very repetitive to
me.
> > > +*drop*:: Terminate ruleset evaluation and drop the packet. This
> > > occurs
> > > +instantly, no further chains of any hooks are evaluated and it is
> > > thus not
> > > +possible to again accept the packet in a higher priority or later
> > > chain, as
> > > +those are not evaluated anymore for the packet.
> >
> > Can this be compacted a bit? I feel this is a tad too verbose.
> >
> > *drop*: Packet is dropped immediately. No futher evaluation of any
> > kind.
> >
> > I think thats enough, no?
>
> Uhm... I made it a perhaps bit extra verbose, mostly because we have
> terms like "terminal statement/verdict", where not all of them are
> really ultimately terminal.
>
> What about the following compromise: O;-)
>
> *drop*: Immediately drop the packet and terminate ruleset evaluation.
> This means no further evaluation of any chains and it's thus - unlike
> with *accept* - not possible to again change the ultimate fate of the
> packet in any later chain.
Thats fine.
> What I'd at least think would be nice to have is to re-iterate on that
> conceptual difference between accept (may be overruled) and drop (is
> ultimate).
Yes, I understand that some people see it that way.
I see netfilter as a pipeline, where packet moves along a certain path,
e.g. prerouting, forward, postrouting or prerouting -> input.
accept is just a "move along", whereas drop stops the packet dead in its
tracks.
nftables is just a "user visible" part that allows to customize
the move-along-or-not decisions.
Hence, this "overrule old decision" idea doesn't apply.
But I can see that others may have a different concept of how
this all works under the hood.
But I have no idea how to best describe this let alone make it
clear that you can't back out of a "drop" decision.
> > > +All the above applies analogously to statements that imply a
> > > verdict:
> > > +*redirect*, *dnat*, *snat* and *masquerade* internally issue
> > > eventually an
> > > +*accept* verdict.
> >
> > You can remove 'eventually'.
>
> > > +*reject* and *synproxy* internally issue eventually a *drop*
> > > verdict.
> >
> > Same.
>
> The idea of that was a slight indication that these statements do:
> <other things> + accept|drop.
>
> Admittedly eventually isn't really perfect …
OK, never mind. I have no strong opinion here.
>
> > > +For example, a *reject* also immediately terminates the evaluation
> > > of the
> > > +current rule, overrules any *accept* from any other chains
> >
> > No, not really. There is no *overrule*. We don't keep any 'verdict
> > state'. There is no difference between 'drop' in the first rule of
> > the
> > first ever base chain or a drop somewhere later in the pipeline,
> > aside
> > from side effects from other matching expressions.
>
> Well first, whether you keep an internal verdict state or not... isn't
> that again some implementation detail which here not really matters for
> the user's understanding of how evaluation works?
I hope my comments above wrt. netfilter pipeline make sense and answer
this question.
> > I would suggest:
> > For example, *reject* is like *drop*, but will attempt to send a
> > error
> > reply packet back to the sender before doing so.
>
> I mean I'm open to change, but what I think should in one form or
> another go in, is explicitly reinforcing that reject has the same
> "power" like drop, i.e. it can render any further accepts (of other
> base chains) moot.
Hmm, I feel there is a need to document the netfilter pipeline better.
Perhaps we should add a netfilter man page document and
ship that too to explain this "move on" thing that accept does behind
the scenes?
> That's what I mean with respect to "overruling" (i.e. and previous
> accept).
Yes, I understand that.
> You're proposal rather describes the side effects of *reject* which are
> however IMO not really relevant with respect to overall ruleset
> evaluation.
Yes, its not relevant, in eval terms reject and drop are the same.
> > > +overruled, while the various NAT statements may be overruled by
> > > other *drop*
> > > +verdicts respectively statements that imply this.
> >
> > There is no overrule. I would not mention NAT at all here.
> > *accept* documentation already says that later chains in the pipeline
> > can drop the packet (and so could the traffic scheduler, qdisc, NIC,
> > network ...)
>
> Like above... the idea here was again to reinforce that the statements
> which internally issue an accept, have the same "weakness" as accept
> itself, i.e. they're not ultimate and any later drop/reject/similar may
> "overrule" them.
I wonder where the idea that "accept" is a kind of magic teleporter that
just fast-forwards a packet to the socket or NIC came from...
This isn't the case even in old ipchains.
> Any other ideas how include these two points? At least I personally
> rather think that the actual side effect of "but will attempt to send a
> error reply packet back to the sender" is rather not that interesting
> with respect to the overall semantics of evaluation.
Correct, it should be in the REJECT STATEMENT section only.
> I think it makes no sense to spam the list with a v3 until I've got
> your opinions on all the above points.... so I'm waiting for that and
> the make a v3. :-)
I suggest to send a smaller v3 first, with the less "controversial"
stuff. Patch 3 seems ready to go for instance.
Then, once thats in, revisit this patch in a (rebased and smaller) v4.
There is nothing wrong with getting this merged in smaller batches
over a longer period.
next prev parent reply other threads:[~2025-10-18 13:25 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-25 0:07 nft manpage/wiki issues and improvement ideas Christoph Anton Mitterer
2025-09-25 7:35 ` Pablo Neira Ayuso
2025-09-25 20:37 ` Christoph Anton Mitterer
2025-09-26 1:52 ` [PATCH 0/7] doc: miscellaneois improvements Christoph Anton Mitterer
2025-09-26 1:52 ` [PATCH 1/7] doc: clarify evaluation of chains Christoph Anton Mitterer
2025-09-26 1:52 ` [PATCH 2/7] doc: fix/improve documentation of verdicts Christoph Anton Mitterer
2025-09-30 10:50 ` Florian Westphal
2025-10-02 14:50 ` Christoph Anton Mitterer
2025-10-02 15:21 ` Florian Westphal
2025-10-10 23:06 ` Christoph Anton Mitterer
2025-09-26 1:52 ` [PATCH 3/7] doc: minor improvements with respect to the term “ruleset” Christoph Anton Mitterer
2025-09-26 1:52 ` [PATCH 4/7] doc: add overall description of the ruleset evaluation Christoph Anton Mitterer
2025-09-30 11:50 ` Florian Westphal
2025-10-10 23:07 ` Christoph Anton Mitterer
2025-09-26 1:52 ` [PATCH 5/7] doc: add some more documentation on bitmasks Christoph Anton Mitterer
2025-09-30 11:51 ` Florian Westphal
2025-09-30 11:53 ` Florian Westphal
2025-09-26 1:52 ` [PATCH 6/7] doc: describe include’s collation order to be that of the C locale Christoph Anton Mitterer
2025-09-26 1:52 ` [PATCH 7/7] doc: describe how values match sets Christoph Anton Mitterer
2025-09-26 2:32 ` nft manpage/wiki issues and improvement ideas Christoph Anton Mitterer
2025-10-11 0:23 ` [PATCH v2 0/7] doc: miscellaneous improvements Christoph Anton Mitterer
2025-10-11 0:23 ` [PATCH v2 1/7] doc: clarify evaluation of chains Christoph Anton Mitterer
2025-10-15 11:46 ` Florian Westphal
2025-10-11 0:23 ` [PATCH v2 2/7] doc: fix/improve documentation of verdicts Christoph Anton Mitterer
2025-10-15 11:42 ` Florian Westphal
2025-10-17 2:30 ` Christoph Anton Mitterer
2025-10-18 13:25 ` Florian Westphal [this message]
2025-10-19 0:11 ` Christoph Anton Mitterer
2025-10-11 0:23 ` [PATCH v2 3/7] doc: minor improvements with respect to the term “ruleset” Christoph Anton Mitterer
2025-10-15 11:51 ` Florian Westphal
2025-10-11 0:24 ` [PATCH v2 4/7] doc: add overall description of the ruleset evaluation Christoph Anton Mitterer
2025-10-20 9:39 ` Florian Westphal
2025-10-20 23:48 ` Christoph Anton Mitterer
2025-10-11 0:24 ` [PATCH v2 5/7] doc: add some more documentation on bitmasks Christoph Anton Mitterer
2025-10-18 13:32 ` Florian Westphal
2025-10-19 1:31 ` Christoph Anton Mitterer
2025-10-11 0:24 ` [PATCH v2 6/7] doc: describe include’s collation order to be that of the C locale Christoph Anton Mitterer
2025-10-18 13:35 ` Florian Westphal
2025-10-18 22:13 ` Christoph Anton Mitterer
2025-10-11 0:24 ` [PATCH v2 7/7] doc: describe how values match sets Christoph Anton Mitterer
2025-10-18 13:51 ` Florian Westphal
2025-10-19 1:50 ` Christoph Anton Mitterer
2025-10-19 1:38 ` [PATCH v3 0/6] doc: miscellaneous improvements Christoph Anton Mitterer
2025-10-19 1:38 ` [PATCH v3 1/6] doc: fix/improve documentation of verdicts Christoph Anton Mitterer
2025-10-20 9:28 ` Florian Westphal
2025-10-20 22:13 ` Christoph Anton Mitterer
2025-10-19 1:38 ` [PATCH v3 2/6] doc: minor improvements with respect to the term “ruleset” Christoph Anton Mitterer
2025-10-20 9:04 ` Florian Westphal
2025-10-19 1:38 ` [PATCH v3 3/6] doc: add overall description of the ruleset evaluation Christoph Anton Mitterer
2025-10-19 1:38 ` [PATCH v3 4/6] doc: add more documentation on bitmasks and sets Christoph Anton Mitterer
2025-10-20 9:06 ` Florian Westphal
2025-10-20 21:57 ` Christoph Anton Mitterer
2025-10-20 22:18 ` Florian Westphal
2025-10-20 23:51 ` Christoph Anton Mitterer
2025-10-19 1:38 ` [PATCH v3 5/6] doc: describe include’s collation order to be that of the C locale Christoph Anton Mitterer
2025-10-19 1:38 ` [PATCH v3 6/6] doc: minor improvements the `reject` statement Christoph Anton Mitterer
2025-10-20 23:49 ` [PATCH v4 0/5] doc: miscellaneous improvements Christoph Anton Mitterer
2025-10-20 23:49 ` [PATCH v4 1/5] doc: fix/improve documentation of verdicts Christoph Anton Mitterer
2025-10-20 23:49 ` [PATCH v4 2/5] doc: add overall description of the ruleset evaluation Christoph Anton Mitterer
2025-10-20 23:49 ` [PATCH v4 3/5] doc: add more documentation on bitmasks and sets Christoph Anton Mitterer
2025-10-20 23:49 ` [PATCH v4 4/5] doc: describe include’s collation order to be that of the C locale Christoph Anton Mitterer
2025-10-20 23:49 ` [PATCH v4 5/5] doc: minor improvements the `reject` statement Christoph Anton Mitterer
2025-10-22 14:34 ` Florian Westphal
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=aPOVNvw1t8lZT88o@strlen.de \
--to=fw@strlen.de \
--cc=mail@christoph.anton.mitterer.name \
--cc=netfilter-devel@vger.kernel.org \
--cc=pablo@netfilter.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.