From: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
To: KhaiWenTan <khai.wen.tan@linux.intel.com>,
Willem de Bruijn <willemdebruijn.kernel@gmail.com>,
"David S . Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@kernel.org>,
Jakub Kicinski <kuba@kernel.org>,
Paolo Abeni <pabeni@redhat.com>,
Simon Horman <horms@kernel.org>,
Richard Cochran <richardcochran@gmail.com>,
Vinicius Costa Gomes <vinicius.gomes@intel.com>,
Tony Nguyen <anthony.l.nguyen@intel.com>
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
stable@vger.kernel.org,
Song Yoong Siang <yoong.siang.song@intel.com>,
Looi Hong Aun <hong.aun.looi@intel.com>,
KhaiWenTan <khai.wen.tan@intel.com>
Subject: Re: [PATCH net 1/1] af_packet: Fix wrong timestamps in tcpdump
Date: Thu, 12 Nov 2026 17:01:14 -0500 [thread overview]
Message-ID: <willemdebruijn.kernel.2721e06a6436@gmail.com> (raw)
In-Reply-To: <20261111053728.2611070-1-khai.wen.tan@linux.intel.com>
KhaiWenTan wrote:
> From: Vinicius Costa Gomes <vinicius.gomes@intel.com>
>
> Since commit 97dc7cd92ac6 ("ptp: Support late timestamp determination"),
> timestamps may need to be retrieved with input from the driver
> .ndo_get_tstamp(). Support was missing from mmap'ed AF_PACKET sockets.
>
> The problem was noticed using the igc driver, that since commit
> 069b142f5819 ("igc: Add support for PTP .getcyclesx64()") has migrated to
> use .ndo_get_tstamp() that timestamps were wrong on the receiving side,
> when using tcpdump.
>
> Fixes: 069b142f5819 ("igc: Add support for PTP .getcyclesx64()")a
Fixes: 97dc7cd92ac6 ("ptp: Support late timestamp determination")
> Cc: stable@vger.kernel.org
> Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
> Signed-off-by: KhaiWenTan <khai.wen.tan@linux.intel.com>
> ---
> net/packet/af_packet.c | 29 ++++++++++++++++++++---------
> 1 file changed, 20 insertions(+), 9 deletions(-)
>
> diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
> index cf6429f09477..7197236c8a3b 100644
> --- a/net/packet/af_packet.c
> +++ b/net/packet/af_packet.c
> @@ -456,15 +456,20 @@ static int __packet_get_status(const struct packet_sock *po, void *frame)
> }
> }
>
> -static __u32 tpacket_get_timestamp(struct sk_buff *skb, struct timespec64 *ts,
> - unsigned int flags)
> +static __u32 tpacket_get_timestamp(struct net_device *dev, struct sk_buff *skb,
> + struct timespec64 *ts, unsigned int flags,
> + unsigned int sk_tsflags)
> {
> struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
>
> - if (shhwtstamps &&
> - (flags & SOF_TIMESTAMPING_RAW_HARDWARE) &&
> - ktime_to_timespec64_cond(shhwtstamps->hwtstamp, ts))
> - return TP_STATUS_TS_RAW_HARDWARE;
> + bool cycles = sk_tsflags & SOF_TIMESTAMPING_BIND_PHC;
nit: whitespace line between variable declarations
> +
> + if (shhwtstamps && shhwtstamps->hwtstamp &&
> + (flags & SOF_TIMESTAMPING_RAW_HARDWARE)) {
> + ktime_t tstamp = netdev_get_tstamp(dev, shhwtstamps, cycles);
Does this call need to be conditional on SKBTX_HW_TSTAMP_NETDEV, to
interpret the union as netdev_data?
like get_timestamp, resolve the orig_dev.
> +
> + return ktime_to_timespec64_cond(tstamp, ts) ? TP_STATUS_TS_RAW_HARDWARE : 0;
> + }
>
> if ((flags & SOF_TIMESTAMPING_SOFTWARE) &&
> ktime_to_timespec64_cond(skb_tstamp(skb), ts))
> @@ -476,11 +481,16 @@ static __u32 tpacket_get_timestamp(struct sk_buff *skb, struct timespec64 *ts,
> static __u32 __packet_set_timestamp(struct packet_sock *po, void *frame,
> struct sk_buff *skb)
> {
> + struct net_device *dev = skb->dev;
validate skb->dev != NULL
> + unsigned int sk_tsflags;
> union tpacket_uhdr h;
> struct timespec64 ts;
> __u32 ts_status;
>
> - if (!(ts_status = tpacket_get_timestamp(skb, &ts, READ_ONCE(po->tp_tstamp))))
> + sk_tsflags = READ_ONCE(po->sk.sk_tsflags);
> + ts_status = tpacket_get_timestamp(dev, skb, &ts, READ_ONCE(po->tp_tstamp), sk_tsflags);
> +
> + if (!(ts_status))
> return 0;
>
> h.raw = frame;
> @@ -2424,9 +2434,10 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
> /* Always timestamp; prefer an existing software timestamp taken
> * closer to the time of capture.
> */
> - ts_status = tpacket_get_timestamp(skb, &ts,
> + ts_status = tpacket_get_timestamp(dev, skb, &ts,
> READ_ONCE(po->tp_tstamp) |
> - SOF_TIMESTAMPING_SOFTWARE);
> + SOF_TIMESTAMPING_SOFTWARE,
> + READ_ONCE(sk->sk_tsflags));
> if (!ts_status)
> ktime_get_real_ts64(&ts);
>
> --
> 2.34.1
>
prev parent reply other threads:[~2026-11-12 22:01 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-11 5:37 [PATCH net 1/1] af_packet: Fix wrong timestamps in tcpdump KhaiWenTan
2026-11-12 22:01 ` Willem de Bruijn [this message]
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=willemdebruijn.kernel.2721e06a6436@gmail.com \
--to=willemdebruijn.kernel@gmail.com \
--cc=anthony.l.nguyen@intel.com \
--cc=davem@davemloft.net \
--cc=edumazet@kernel.org \
--cc=hong.aun.looi@intel.com \
--cc=horms@kernel.org \
--cc=khai.wen.tan@intel.com \
--cc=khai.wen.tan@linux.intel.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=richardcochran@gmail.com \
--cc=stable@vger.kernel.org \
--cc=vinicius.gomes@intel.com \
--cc=yoong.siang.song@intel.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.