Stanislav Fomichev <sdf@xxxxxxxxxx> writes: > The goal is to enable end-to-end testing of the metadata > for AF_XDP. Current rx_timestamp kfunc returns current > time which should be enough to exercise this new functionality. > > Cc: John Fastabend <john.fastabend@xxxxxxxxx> > Cc: David Ahern <dsahern@xxxxxxxxx> > Cc: Martin KaFai Lau <martin.lau@xxxxxxxxx> > Cc: Jakub Kicinski <kuba@xxxxxxxxxx> > Cc: Willem de Bruijn <willemb@xxxxxxxxxx> > Cc: Jesper Dangaard Brouer <brouer@xxxxxxxxxx> > Cc: Anatoly Burakov <anatoly.burakov@xxxxxxxxx> > Cc: Alexander Lobakin <alexandr.lobakin@xxxxxxxxx> > Cc: Magnus Karlsson <magnus.karlsson@xxxxxxxxx> > Cc: Maryam Tahhan <mtahhan@xxxxxxxxxx> > Cc: xdp-hints@xxxxxxxxxxxxxxx > Cc: netdev@xxxxxxxxxxxxxxx > Signed-off-by: Stanislav Fomichev <sdf@xxxxxxxxxx> > --- > drivers/net/veth.c | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/drivers/net/veth.c b/drivers/net/veth.c > index 2a4592780141..c626580a2294 100644 > --- a/drivers/net/veth.c > +++ b/drivers/net/veth.c > @@ -25,6 +25,7 @@ > #include <linux/filter.h> > #include <linux/ptr_ring.h> > #include <linux/bpf_trace.h> > +#include <linux/bpf_patch.h> > #include <linux/net_tstamp.h> > > #define DRV_NAME "veth" > @@ -1659,6 +1660,18 @@ static int veth_xdp(struct net_device *dev, struct netdev_bpf *xdp) > } > } > > +static void veth_unroll_kfunc(const struct bpf_prog *prog, u32 func_id, > + struct bpf_patch *patch) > +{ > + if (func_id == xdp_metadata_kfunc_id(XDP_METADATA_KFUNC_RX_TIMESTAMP_SUPPORTED)) { > + /* return true; */ > + bpf_patch_append(patch, BPF_MOV64_IMM(BPF_REG_0, 1)); > + } else if (func_id == xdp_metadata_kfunc_id(XDP_METADATA_KFUNC_RX_TIMESTAMP)) { > + /* return ktime_get_mono_fast_ns(); */ > + bpf_patch_append(patch, BPF_EMIT_CALL(ktime_get_mono_fast_ns)); > + } > +} So these look reasonable enough, but would be good to see some examples of kfunc implementations that don't just BPF_CALL to a kernel function (with those helper wrappers we were discussing before). -Toke