Thread (18 messages) 18 messages, 3 authors, 10d ago

Re: [PATCH bpf-next v5 1/3] bpf: Add BPF_FIB_LOOKUP_VLAN flag to bpf_fib_lookup() helper

From: David Ahern <dsahern@kernel.org>
Date: 2026-07-03 21:34:37
Also in: bpf, linux-kselftest, lkml

On 7/2/26 8:47 AM, Toke Høiland-Jørgensen wrote:
David Ahern [off-list ref] writes:
quoted
On 7/1/26 5:02 AM, Toke Høiland-Jørgensen wrote:
quoted
David Ahern [off-list ref] writes:
quoted
Seems to me the fib_lookup for xdp needs to return the bottom device,
not the vlan device, for forwarding to work. That's why I added the
fields to the struct. That allows the program to push the vlan header if
required. My preference (dream?) was that Tx path had support to tell
the redirect the vlan and h/w added it on send.
Sure, returning the bottom device index with the VLAN tag makes sense,
and that's basically what this series does (but bails out on stacked
VLANs). However, that's not what the helper does today, which is why the
flag is there, to opt-in to the new behaviour. I don't think we can just
change the ifindex without breaking existing applications (as noted
up-thread).
I do not see it as breaking existing programs which is why I chimed in
on the thread.
quoted
quoted
But really, once stacked devices come into play, I just wanted to make
sure thought is given to different use cases. As you know the lookup
struct if hard bound to 64B and it is trying to cover a lot of use cases.
Agreed, I don't think we can handle stacked devices in this helper. But
we could split it out into a new one. Something like:

struct lower_device_info {
	enum device_type type;
	struct {
		__be16	h_vlan_proto;
		__be16	h_vlan_TCI;
	} vlan;
        /* add other types here */
};

int xdp_get_lower_device(int ifindex, struct lower_device_info *info);

called like:

int xdp_program(struct xdp_md *ctx)
{
        struct lower_device_info dev_info = {};
	int ifindex, ret;

        ifindex = find_destination(ctx); /* does fib lookup, or something else */

        while ((ret = xdp_get_lower_device_info(ifindex, &dev_info)) > 0) {
        	if (dev_info.type == VLAN) {
                      	push_vlan_tag(ctx, &dev_info.vlan);
                        ifindex = ret;
                } else {
                	return XDP_PASS; /* we only handle VLAN devices */
                }
        }

        return bpf_redirect(ifindex, 0);
}


With a helper like this, we obviously don't strictly speaking need to
change the fib lookup helper at all. However, for the single-tagged VLAN
case, I think supporting it directly in the fib lookup could still have
value, as an optimisation: it saves an extra call for resolving the
ifindex, and the fields are already there. So I think my preference
would be to merge this series as-is, and then follow up with a new kfunc
to handle the stacked case. But we could also just drop this series and
go straight to the new kfunc.

WDYT?
no preference. I only chimed in because of the added flag to the uapi
which I do not see as needed. If the consensus is that it is in fact
needed, all good then.
Alright, cool - care to provide an ACK, then? :)

Acked-by: David Ahern <dsahern@kernel.org>

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help