diff mbox series

socket: don't clear SOCK_TSTAMP_NEW when SO_TIMESTAMPNS is disabled

Message ID 20201027195112.23921-1-ceggers@arri.de
State Not Applicable
Delegated to: David Miller
Headers show
Series socket: don't clear SOCK_TSTAMP_NEW when SO_TIMESTAMPNS is disabled | expand

Checks

Context Check Description
jkicinski/tree_selection success Guessing tree name failed - patch did not apply

Commit Message

Christian Eggers Oct. 27, 2020, 7:51 p.m. UTC
[ Upstream commit 4e3bbb33e6f36e4b05be1b1b9b02e3dd5aaa3e69 ]

SOCK_TSTAMP_NEW (timespec64 instead of timespec) is also used for
hardware time stamps (configured via SO_TIMESTAMPING_NEW).

User space (ptp4l) first configures hardware time stamping via
SO_TIMESTAMPING_NEW which sets SOCK_TSTAMP_NEW. In the next step, ptp4l
disables SO_TIMESTAMPNS(_NEW) (software time stamps), but this must not
switch hardware time stamps back to "32 bit mode".

This problem happens on 32 bit platforms were the libc has already
switched to struct timespec64 (from SO_TIMExxx_OLD to SO_TIMExxx_NEW
socket options). ptp4l complains with "missing timestamp on transmitted
peer delay request" because the wrong format is received (and
discarded).

Fixes: 887feae36aee ("socket: Add SO_TIMESTAMP[NS]_NEW")
Signed-off-by: Christian Eggers <ceggers@arri.de>
Acked-by: Willem de Bruijn <willemb@google.com>
Acked-by: Deepa Dinamani <deepa.kernel@gmail.com>
---
This is a back port for 5.4. The original version has been applied to 5.8/5.9
a few hours ago. It does the same as the upstream patch, only the affected code
is at another position here. 

Please decide whether the Acked-by: tags (from the upstream patch) should
be kept or removed.

This back port is only required for 5.4, older kernels like 4.19 are not
affected.

regards
Christian


 net/core/sock.c | 1 -
 1 file changed, 1 deletion(-)
diff mbox series

Patch

diff --git a/net/core/sock.c b/net/core/sock.c
index 9a186d2ad36d..1eda7337b881 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -923,7 +923,6 @@  int sock_setsockopt(struct socket *sock, int level, int optname,
 		} else {
 			sock_reset_flag(sk, SOCK_RCVTSTAMP);
 			sock_reset_flag(sk, SOCK_RCVTSTAMPNS);
-			sock_reset_flag(sk, SOCK_TSTAMP_NEW);
 		}
 		break;