Jesper Dangaard Brouer <jbrouer@xxxxxxxxxx> writes: > On 13/12/2022 21.42, Stanislav Fomichev wrote: >> On Tue, Dec 13, 2022 at 7:55 AM Jesper Dangaard Brouer >> <jbrouer@xxxxxxxxxx> wrote: >>> >>> >>> On 13/12/2022 03.35, Stanislav Fomichev wrote: >>>> The goal is to enable end-to-end testing of the metadata for AF_XDP. >>>> >>>> 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 | 24 ++++++++++++++++++++++++ >>>> 1 file changed, 24 insertions(+) >>>> >>>> diff --git a/drivers/net/veth.c b/drivers/net/veth.c >>>> index 04ffd8cb2945..d5491e7a2798 100644 >>>> --- a/drivers/net/veth.c >>>> +++ b/drivers/net/veth.c >>>> @@ -118,6 +118,7 @@ static struct { >>>> >>>> struct veth_xdp_buff { >>>> struct xdp_buff xdp; >>>> + struct sk_buff *skb; >>>> }; >>>> >>>> static int veth_get_link_ksettings(struct net_device *dev, >>>> @@ -602,6 +603,7 @@ static struct xdp_frame *veth_xdp_rcv_one(struct veth_rq *rq, >>>> >>>> xdp_convert_frame_to_buff(frame, xdp); >>>> xdp->rxq = &rq->xdp_rxq; >>>> + vxbuf.skb = NULL; >>>> >>>> act = bpf_prog_run_xdp(xdp_prog, xdp); >>>> >>>> @@ -823,6 +825,7 @@ static struct sk_buff *veth_xdp_rcv_skb(struct veth_rq *rq, >>>> __skb_push(skb, skb->data - skb_mac_header(skb)); >>>> if (veth_convert_skb_to_xdp_buff(rq, xdp, &skb)) >>>> goto drop; >>>> + vxbuf.skb = skb; >>>> >>>> orig_data = xdp->data; >>>> orig_data_end = xdp->data_end; >>>> @@ -1601,6 +1604,21 @@ static int veth_xdp(struct net_device *dev, struct netdev_bpf *xdp) >>>> } >>>> } >>>> >>>> +static int veth_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp) >>>> +{ >>>> + *timestamp = ktime_get_mono_fast_ns(); >>> >>> This should be reading the hardware timestamp in the SKB. >>> >>> Details: This hardware timestamp in the SKB is located in >>> skb_shared_info area, which is also available for xdp_frame (currently >>> used for multi-buffer purposes). Thus, when adding xdp-hints "store" >>> functionality, it would be natural to store the HW TS in the same place. >>> Making the veth skb/xdp_frame code paths able to share code. >> >> Does something like the following look acceptable as well? >> >> *timestamp = skb_hwtstamps(_ctx->skb)->hwtstamp; >> if (!*timestamp) >> *timestamp = ktime_get_mono_fast_ns(); /* sw fallback */ >> > > How can the BPF programmer tell the difference between getting hardware > or software timestamp? > > This will get really confusing when someone implements a tcpdump feature > (like/extend xdpdump) and some packets (e.g. PTP packets) have HW > timestamps and some don't. The time sequence in the pcap will be strange. > >> Because I'd like to be able to test this path in the selftests. As >> long as I get some number from veth_xdp_rx_timestamp, I can test it. >> No amount of SOF_TIMESTAMPING_{SOFTWARE,RX_SOFTWARE,RAW_HARDWARE} >> triggers non-zero hwtstamp for xsk receive path. Any suggestions? >> > > You could implement the "store" operation I mentioned before. > For testing you can store an arbitrary value in the timestamp and check > it later by reading it back. > > I can see you have changed the API to send down a pointer. Thus, a > simple flag could implement the writing the provided timestamp. > > Regarding flags for reading the timestamp. Should we be able to specify > what clock type we are asking for? > Have you notice that tcpdump can ask for different types of > timestamps[1]. e.g. for hardware timestamps it is either > 'adapter_unsynced' or 'adaptor'. (See semantic in [1]) > > # tcpdump -ni eth1 -j adapter_unsynced --time-stamp-precision=nano I don't think it makes sense for XDP to *ask* for a specific timestamp (any individual packet probably only has one, right?). But we could add a way to query which type of timestamp is available, either as a second argument to the same function, or as a separate one. Same thing for the hash, BTW (skb_set_hash() also takes a type argument). I guess the easiest would be to just add a second parameter to both getter functions for the type, but maybe there's a performance argument for having it be a separate kfunc (at least for timestamp)? -Toke