Stanislav Fomichev <sdf@xxxxxxxxxx> writes: > On Tue, Oct 4, 2022 at 5:59 PM Jakub Kicinski <kuba@xxxxxxxxxx> wrote: >> >> On Tue, 4 Oct 2022 17:25:51 -0700 Martin KaFai Lau wrote: >> > A intentionally wild question, what does it take for the driver to return the >> > hints. Is the rx_desc and rx_queue enough? When the xdp prog is calling a >> > kfunc/bpf-helper, like 'hwtstamp = bpf_xdp_get_hwtstamp()', can the driver >> > replace it with some inline bpf code (like how the inline code is generated for >> > the map_lookup helper). The xdp prog can then store the hwstamp in the meta >> > area in any layout it wants. >> >> Since you mentioned it... FWIW that was always my preference rather than >> the BTF magic :) The jited image would have to be per-driver like we >> do for BPF offload but that's easy to do from the technical >> perspective (I doubt many deployments bind the same prog to multiple >> HW devices).. > > +1, sounds like a good alternative (got your reply while typing) > I'm not too versed in the rx_desc/rx_queue area, but seems like worst > case that bpf_xdp_get_hwtstamp can probably receive a xdp_md ctx and > parse it out from the pre-populated metadata? > > Btw, do we also need to think about the redirect case? What happens > when I redirect one frame from a device A with one metadata format to > a device B with another? Yes, we absolutely do! In fact, to me this (redirects) is the main reason why we need the ID in the packet in the first place: when running on (say) a veth, an XDP program needs to be able to deal with packets from multiple physical NICs. As far as API is concerned, my hope was that we could solve this with a CO-RE like approach where the program author just writes something like: hw_tstamp = bpf_get_xdp_hint("hw_tstamp", u64); and bpf_get_xdp_hint() is really a macro (or a special kind of relocation?) and libbpf would do the following on load: - query the kernel BTF for all possible xdp_hint structs - figure out which of them have an 'u64 hw_tstamp' member - generate the necessary conditionals / jump table to disambiguate on the BTF_ID in the packet Now, if this is better done by a kfunc I'm not terribly opposed to that either, but I'm not sure it's actually better/easier to do in the kernel than in libbpf at load time? -Toke