All of lore.kernel.org
 help / color / mirror / Atom feed
From: Phil Sutter <phil@nwl.cc>
To: Florian Westphal <fw@strlen.de>
Cc: Pablo Neira Ayuso <pablo@netfilter.org>,
	netfilter-devel@vger.kernel.org, Eric Garver <e@erig.me>
Subject: Re: [nf-next PATCH v3 11/16] netfilter: nf_tables: chain: Respect NETDEV_REGISTER events
Date: Thu, 12 Sep 2024 17:41:17 +0200	[thread overview]
Message-ID: <ZuMLnfwhTdyqp90C@orbyte.nwl.cc> (raw)
In-Reply-To: <20240912151203.GA32404@breakpoint.cc>

On Thu, Sep 12, 2024 at 05:12:03PM +0200, Florian Westphal wrote:
> Phil Sutter <phil@nwl.cc> wrote:
> > > Or is this guaranteed by UNREGISTER event already?
> > > If so, please add a comment.
> > 
> > Are packets relevant here? The question should be whether another CPU
> > traverses hook->ops_list at the same time, no?
> 
> Yes, but also if anyone else can look at the structure in parallel.

So it is possible that ops are still used somewhere after
nf_unregister_net_hook() returns? I don't quite get that code, with all
the RCU-bells and ONCE-whistles.

> > Looking at
> > nft_flowtable_find_dev() mentioned in your other mail, there seems to be
> > a case which doesn't synchronize on commit_mutex. So same rules apply to
> > ops_list as for hook_list and thus I need to add an rcu_head to
> > nf_hook_ops as well?
> 
> I will need to apply your series locally first to get the full picture,
> sorry.

No sorry, thanks for your review so far!

> > > > +			if (ops) {
> > > > +				memcpy(ops, &basechain->ops, sizeof(*ops));
> > > > +				ops->dev = dev;
> > > > +			}
> > > > +			if (ops &&
> > > > +			    (ctx->chain->table->flags & NFT_TABLE_F_DORMANT ||
> > > > +			     !nf_register_net_hook(dev_net(dev), ops))) {
> > > > +				list_add_tail(&ops->list, &hook->ops_list);
> > > > +				break;
> > > > +			}
> > > > +			printk(KERN_ERR "chain %s: Can't hook into device %s\n",
> > > > +			       ctx->chain->name, dev->name);
> > > 
> > > I think its better to -ENOMEM and veto the netdevice register request in this case.
> > 
> > Ah, I wasn't aware we may influence netdev registration from a notifier.
> > So I'll change the callbacks to return NOTIFY_BAD in error case.
> > 
> > > I also think this needs extra handling for NETDEV_CHANGENAME rather than
> > > the 'treat as UNREG+REG' trick.
> > > 
> > > Else we may unregister and then fail to re-register which leaves the
> > > device without the registered hook op.
> > 
> > So search for another flowtable/chain with a hook matching the new name
> > first, then unregister, try to register in the new spot and undo on
> > failure? Sounds doable. :)
> 
> If possible i'd register new, then unreg old.
> But, do you need to do anything on CHANGENAME at all?
> 
> Device is the same, so maybe its enough to update the name
> in nft_hooks structure?

You're putting the cart before the horse here: The user sets
hook->ifname and we bind to whatever device matches that.

Now with a device being renamed, there are two options:

A) Unbind if the name doesn't match hook->ifname anymore and search for
   another, matching hook. This is what I had (tried to) implement.

B) Just leave the interface in place as long as it exists. This is how
   the old code behaves.

For users, I find (A) more intuitive. Also, consider netdevs being
renamed by udev: Users may have a flowtable which matches the initial
name by accident. If it doesn't unbind them upon being renamed, they all
remain in there and may block the right flowtable from binding to them.

Cheers, Phil

  reply	other threads:[~2024-09-12 15:41 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-12 12:21 [nf-next PATCH v3 00/16] Dynamic hook interface binding Phil Sutter
2024-09-12 12:21 ` [nf-next PATCH v3 01/16] netfilter: nf_tables: Keep deleted flowtable hooks until after RCU Phil Sutter
2024-09-12 13:32   ` Florian Westphal
2024-09-12 13:48     ` Phil Sutter
2024-09-12 14:27       ` Florian Westphal
2024-09-16  0:00     ` Pablo Neira Ayuso
2024-09-16 21:42       ` Pablo Neira Ayuso
2024-09-17 21:14   ` Pablo Neira Ayuso
2024-09-12 12:21 ` [nf-next PATCH v3 02/16] netfilter: nf_tables: Flowtable hook's pf value never varies Phil Sutter
2024-09-12 12:21 ` [nf-next PATCH v3 03/16] netfilter: nf_tables: Store user-defined hook ifname Phil Sutter
2024-09-12 12:56   ` Florian Westphal
2024-09-12 13:26     ` Phil Sutter
2024-09-12 13:38       ` Florian Westphal
2024-09-12 12:21 ` [nf-next PATCH v3 04/16] netfilter: nf_tables: Use stored ifname in netdev hook dumps Phil Sutter
2024-09-12 12:21 ` [nf-next PATCH v3 05/16] netfilter: nf_tables: Compare netdev hooks based on stored name Phil Sutter
2024-09-12 12:21 ` [nf-next PATCH v3 06/16] netfilter: nf_tables: Tolerate chains with no remaining hooks Phil Sutter
2024-10-31 14:01   ` Florian Westphal
2024-10-31 14:19     ` Phil Sutter
2024-10-31 14:37       ` Florian Westphal
2024-10-31 15:16         ` Phil Sutter
2024-09-12 12:21 ` [nf-next PATCH v3 07/16] netfilter: nf_tables: Introduce functions freeing nft_hook objects Phil Sutter
2024-09-12 12:21 ` [nf-next PATCH v3 08/16] netfilter: nf_tables: Introduce nft_hook_find_ops() Phil Sutter
2024-09-12 12:21 ` [nf-next PATCH v3 09/16] netfilter: nf_tables: Introduce nft_register_flowtable_ops() Phil Sutter
2024-09-12 12:21 ` [nf-next PATCH v3 10/16] netfilter: nf_tables: Have a list of nf_hook_ops in nft_hook Phil Sutter
2024-09-12 12:21 ` [nf-next PATCH v3 11/16] netfilter: nf_tables: chain: Respect NETDEV_REGISTER events Phil Sutter
2024-09-12 14:40   ` Florian Westphal
2024-09-12 15:05     ` Phil Sutter
2024-09-12 15:12       ` Florian Westphal
2024-09-12 15:41         ` Phil Sutter [this message]
2024-09-12 16:06           ` Florian Westphal
2024-09-12 16:25             ` Phil Sutter
2024-09-12 20:43               ` Florian Westphal
2024-09-13 11:42                 ` Phil Sutter
2024-09-12 12:21 ` [nf-next PATCH v3 12/16] netfilter: nf_tables: flowtable: " Phil Sutter
2024-09-12 12:21 ` [nf-next PATCH v3 13/16] netfilter: nf_tables: Handle NETDEV_CHANGENAME events Phil Sutter
2024-09-12 12:21 ` [nf-next PATCH v3 14/16] netfilter: nf_tables: Support wildcard netdev hook specs Phil Sutter
2024-09-12 12:21 ` [nf-next PATCH v3 15/16] netfilter: nf_tables: Add notications for hook changes Phil Sutter
2024-09-12 12:21 ` [nf-next PATCH v3 16/16] selftests: netfilter: Torture nftables netdev hooks Phil Sutter

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=ZuMLnfwhTdyqp90C@orbyte.nwl.cc \
    --to=phil@nwl.cc \
    --cc=e@erig.me \
    --cc=fw@strlen.de \
    --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.