mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 04:33:26 +02:00
net: fix SOF_TIMESTAMPING_BIND_PHC to work with multiple sockets
When multiple sockets using the SOF_TIMESTAMPING_BIND_PHC flag received
a packet with a hardware timestamp (e.g. multiple PTP instances in
different PTP domains using the UDPv4/v6 multicast or L2 transport),
the timestamps received on some sockets were corrupted due to repeated
conversion of the same timestamp (by the same or different vclocks).
Fix ptp_convert_timestamp() to not modify the shared skb timestamp
and return the converted timestamp as a ktime_t instead. If the
conversion fails, return 0 to not confuse the application with
timestamps corresponding to an unexpected PHC.
Fixes: d7c0882655
("net: socket: support hardware timestamp conversion to PHC bound")
Signed-off-by: Miroslav Lichvar <mlichvar@redhat.com>
Cc: Yangbo Lu <yangbo.lu@nxp.com>
Cc: Richard Cochran <richardcochran@gmail.com>
Acked-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
1b26d364e4
commit
007747a984
@@ -830,6 +830,7 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
|
||||
int empty = 1, false_tstamp = 0;
|
||||
struct skb_shared_hwtstamps *shhwtstamps =
|
||||
skb_hwtstamps(skb);
|
||||
ktime_t hwtstamp;
|
||||
|
||||
/* Race occurred between timestamp enabling and packet
|
||||
receiving. Fill in the current time for now. */
|
||||
@@ -878,10 +879,12 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
|
||||
(sk->sk_tsflags & SOF_TIMESTAMPING_RAW_HARDWARE) &&
|
||||
!skb_is_swtx_tstamp(skb, false_tstamp)) {
|
||||
if (sk->sk_tsflags & SOF_TIMESTAMPING_BIND_PHC)
|
||||
ptp_convert_timestamp(shhwtstamps, sk->sk_bind_phc);
|
||||
hwtstamp = ptp_convert_timestamp(shhwtstamps,
|
||||
sk->sk_bind_phc);
|
||||
else
|
||||
hwtstamp = shhwtstamps->hwtstamp;
|
||||
|
||||
if (ktime_to_timespec64_cond(shhwtstamps->hwtstamp,
|
||||
tss.ts + 2)) {
|
||||
if (ktime_to_timespec64_cond(hwtstamp, tss.ts + 2)) {
|
||||
empty = 0;
|
||||
|
||||
if ((sk->sk_tsflags & SOF_TIMESTAMPING_OPT_PKTINFO) &&
|
||||
|
Reference in New Issue
Block a user