From: Pablo Neira Ayuso <pablo@netfilter.org>
To: Eric Woudstra <ericwouds@gmail.com>
Cc: netfilter-devel@vger.kernel.org, razor@blackwall.org, fw@strlen.de
Subject: Re: [PATCH nf-next,v2 1/3] net: pass net_device_path_ctx struct to dev_fill_forward_path()
Date: Sun, 12 Jul 2026 21:22:04 +0200 [thread overview]
Message-ID: <alPpXDQq0rOqbDUG@chamomile> (raw)
In-Reply-To: <5f4d5f1e-edab-4b9c-9c86-b9554492e0dd@gmail.com>
On Sun, Jul 12, 2026 at 11:28:11AM +0200, Eric Woudstra wrote:
> On 7/10/26 12:07 PM, Pablo Neira Ayuso wrote:
> > Generalize dev_fill_forward_path() so it can be used by the bridge
> > family to retrieve the bridge vlan filtering information from the
> > bridge port when discovering the bridge flowtable path.
> >
> > Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
> > ---
> > v2: - move nft_dev_fill_forward_path_init() call after out: goto tag
> > to fix a crash otherwise in the existing flowtable ip family.
> >
> > include/linux/netdevice.h | 2 +-
> > net/core/dev.c | 18 +++++++-----------
> > net/netfilter/nf_flow_table_path.c | 14 ++++++++++++--
> > 3 files changed, 20 insertions(+), 14 deletions(-)
> >
> > diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> > index 9981d637f8b5..db04b6d2e8d2 100644
> > --- a/include/linux/netdevice.h
> > +++ b/include/linux/netdevice.h
> > @@ -3420,7 +3420,7 @@ void dev_remove_offload(struct packet_offload *po);
> >
> > int dev_get_iflink(const struct net_device *dev);
> > int dev_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb);
> > -int dev_fill_forward_path(const struct net_device *dev, const u8 *daddr,
> > +int dev_fill_forward_path(struct net_device_path_ctx *ctx,
> > struct net_device_path_stack *stack);
> > struct net_device *dev_get_by_name(struct net *net, const char *name);
> > struct net_device *dev_get_by_name_rcu(struct net *net, const char *name);
> > diff --git a/net/core/dev.c b/net/core/dev.c
> > index 714d05283500..24c384ef9e78 100644
> > --- a/net/core/dev.c
> > +++ b/net/core/dev.c
> > @@ -750,41 +750,37 @@ static struct net_device_path *dev_fwd_path(struct net_device_path_stack *stack)
> > return &stack->path[k];
> > }
> >
> > -int dev_fill_forward_path(const struct net_device *dev, const u8 *daddr,
> > +int dev_fill_forward_path(struct net_device_path_ctx *ctx,
> > struct net_device_path_stack *stack)
> > {
> > const struct net_device *last_dev;
> > - struct net_device_path_ctx ctx = {
> > - .dev = dev,
> > - };
> > struct net_device_path *path;
> > int ret = 0;
> >
> > - memcpy(ctx.daddr, daddr, sizeof(ctx.daddr));
> > stack->num_paths = 0;
> > - while (ctx.dev && ctx.dev->netdev_ops->ndo_fill_forward_path) {
> > - last_dev = ctx.dev;
> > + while (ctx->dev && ctx->dev->netdev_ops->ndo_fill_forward_path) {
> > + last_dev = ctx->dev;
> > path = dev_fwd_path(stack);
> > if (!path)
> > return -1;
> >
> > memset(path, 0, sizeof(struct net_device_path));
> > - ret = ctx.dev->netdev_ops->ndo_fill_forward_path(&ctx, path);
> > + ret = ctx->dev->netdev_ops->ndo_fill_forward_path(ctx, path);
> > if (ret < 0)
> > return -1;
> >
> > - if (WARN_ON_ONCE(last_dev == ctx.dev))
> > + if (WARN_ON_ONCE(last_dev == ctx->dev))
> > return -1;
> > }
> >
> > - if (!ctx.dev)
> > + if (!ctx->dev)
> > return ret;
> >
> > path = dev_fwd_path(stack);
> > if (!path)
> > return -1;
> > path->type = DEV_PATH_ETHERNET;
> > - path->dev = ctx.dev;
> > + path->dev = ctx->dev;
> >
> > return ret;
> > }
>
> Calling dev_fill_forward_path() from nft_dev_fill_bridge_path()
> it does not traverse the bridge. It exits at the source "indev"
> already. After calling nft_dev_path_info(), the info structure
> is filled in with the opposite device and the encaps of the
> opposite device.
Traversing the bridge is only needed for bridge vlan filtering and
that is not included in this initial support.
> Would need to add something like this:
>
> int dev_fill_bridge_path(struct net_device_path_ctx *ctx,
> struct net_device_path_stack *stack)
> {
> const struct net_device *last_dev, *br_dev;
> struct net_device_path *path;
>
> if (!ctx->dev || !netif_is_bridge_port(ctx->dev))
> return -1;
>
> br_dev = netdev_master_upper_dev_get_rcu((struct net_device *)ctx->dev);
> if (!br_dev || !br_dev->netdev_ops->ndo_fill_forward_path)
> return -1;
>
> last_dev = ctx->dev;
> path = dev_fwd_path(stack);
> if (!path)
> return -1;
>
> memset(path, 0, sizeof(struct net_device_path));
> if (br_dev->netdev_ops->ndo_fill_forward_path(ctx, path) < 0)
> return -1;
>
> if (!ctx->dev || WARN_ON_ONCE(last_dev == ctx->dev))
> return -1;
>
> return dev_fill_forward_path(ctx, stack);
> }
> EXPORT_SYMBOL_GPL(dev_fill_bridge_path);
>
> First need to find the bridge device to call ndo_fill_forward_path()
> from it.
>
> This also needs the patch "bridge: Add filling forward path from port to
> port"
> That patch still needs a change according to Nikolay.
Once bridge vlan filtering is added, but that need nf_conntrack_bridge
support for VLAN/PPPoE as I said.
next prev parent reply other threads:[~2026-07-12 19:22 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-10 10:07 [PATCH nf-next,v2 0/3] initial flowtable bridge support Pablo Neira Ayuso
2026-07-10 10:07 ` [PATCH nf-next,v2 1/3] net: pass net_device_path_ctx struct to dev_fill_forward_path() Pablo Neira Ayuso
2026-07-11 9:30 ` Eric Woudstra
2026-07-12 9:28 ` Eric Woudstra
2026-07-12 19:22 ` Pablo Neira Ayuso [this message]
2026-07-10 10:07 ` [PATCH nf-next,v2 2/3] net: expose dev_fwd_path() helper via static inline Pablo Neira Ayuso
2026-07-10 10:07 ` [PATCH nf-next,v2 3/3] netfilter: flowtable: initial bridge support Pablo Neira Ayuso
2026-07-12 9:27 ` Eric Woudstra
2026-07-12 13:46 ` Eric Woudstra
2026-07-12 19:13 ` Pablo Neira Ayuso
2026-07-12 19:19 ` Pablo Neira Ayuso
2026-07-13 8:24 ` Pablo Neira Ayuso
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=alPpXDQq0rOqbDUG@chamomile \
--to=pablo@netfilter.org \
--cc=ericwouds@gmail.com \
--cc=fw@strlen.de \
--cc=netfilter-devel@vger.kernel.org \
--cc=razor@blackwall.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