[PATCH net v2 1/2] socket: fix option SO_TIMESTAMPING_NEW

Subsystems: networking [general], networking [sockets], the rest · Maintainers: "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Kuniyuki Iwashima, Willem de Bruijn, Linus Torvalds

STALE2204d REVIEWED: 2 (1M)

Status: Reviewed.

2 review trailers.

5 messages, 4 authors, 2020-10-14 · open the first message on its own page

[PATCH net v2 1/2] socket: fix option SO_TIMESTAMPING_NEW

From: Christian Eggers <ceggers@arri.de>
Date: 2020-10-12 09:36:33

The comparison of optname with SO_TIMESTAMPING_NEW is wrong way around,
so SOCK_TSTAMP_NEW will first be set and than reset again. Additionally
move it out of the test for SOF_TIMESTAMPING_RX_SOFTWARE as this seems
unrelated.

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: 9718475e6908 ("socket: Add SO_TIMESTAMPING_NEW")
Signed-off-by: Christian Eggers <ceggers@arri.de>
Reviewed-by: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
Reviewed-by: Deepa Dinamani <redacted>
---
v2:
-----
- integrated proposal from Willem de Bruijn
- added Reviewed-by: from Willem and Deepa


On Saturday, 10 October 2020, 02:23:10 CEST, Willem de Bruijn wrote:
This suggested fix still sets and clears the flag if calling
SO_TIMESTAMPING_NEW to disable timestamping. 
where is it cleared?
Instead, how about

        case SO_TIMESTAMPING_NEW:
-               sock_set_flag(sk, SOCK_TSTAMP_NEW);
                fallthrough;
        case SO_TIMESTAMPING_OLD:
[..]
+               sock_valbool_flag(sk, SOCK_TSTAMP_NEW,
+                                 optname == SO_TIMESTAMPING_NEW);
+
using you version looks clearer
                if (val & SOF_TIMESTAMPING_OPT_ID &&
I would like to keep this below the "ret = -FOO; break" statements. IMHO the
setsockopt() call should either completely fail or succeed.

 net/core/sock.c | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/net/core/sock.c b/net/core/sock.c
index 34a8d12e38d7..669cf9b8bb44 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -994,8 +994,6 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
 		__sock_set_timestamps(sk, valbool, true, true);
 		break;
 	case SO_TIMESTAMPING_NEW:
-		sock_set_flag(sk, SOCK_TSTAMP_NEW);
-		fallthrough;
 	case SO_TIMESTAMPING_OLD:
 		if (val & ~SOF_TIMESTAMPING_MASK) {
 			ret = -EINVAL;
@@ -1024,16 +1022,14 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
 		}
 
 		sk->sk_tsflags = val;
+		sock_valbool_flag(sk, SOCK_TSTAMP_NEW, optname == SO_TIMESTAMPING_NEW);
+
 		if (val & SOF_TIMESTAMPING_RX_SOFTWARE)
 			sock_enable_timestamp(sk,
 					      SOCK_TIMESTAMPING_RX_SOFTWARE);
-		else {
-			if (optname == SO_TIMESTAMPING_NEW)
-				sock_reset_flag(sk, SOCK_TSTAMP_NEW);
-
+		else
 			sock_disable_timestamp(sk,
 					       (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE));
-		}
 		break;
 
 	case SO_RCVLOWAT:
-- 
Christian Eggers
Embedded software developer

Arnold & Richter Cine Technik GmbH & Co. Betriebs KG
Sitz: Muenchen - Registergericht: Amtsgericht Muenchen - Handelsregisternummer: HRA 57918
Persoenlich haftender Gesellschafter: Arnold & Richter Cine Technik GmbH
Sitz: Muenchen - Registergericht: Amtsgericht Muenchen - Handelsregisternummer: HRB 54477
Geschaeftsfuehrer: Dr. Michael Neuhaeuser; Stephan Schenk; Walter Trauninger; Markus Zeiler

[PATCH net v2 2/2] socket: don't clear SOCK_TSTAMP_NEW when SO_TIMESTAMPNS is disabled

From: Christian Eggers <ceggers@arri.de>
Date: 2020-10-12 09:37:07

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")
Fixes: 783da70e8396 ("net: add sock_enable_timestamps")
Signed-off-by: Christian Eggers <ceggers@arri.de>
Acked-by: Willem de Bruijn <willemb@google.com>
Acked-by: Deepa Dinamani <redacted>
---
v2:
-----
- Added ACKs from Willem and Deepa


On Saturday, 10 October 2020, 05:38:56 CEST, Deepa Dinamani wrote:
On Fri, Oct 9, 2020 at 5:35 PM Willem de Bruijn [off-list ref] wrote:
quoted
As this commit message shows, with SO_TIMESTAMP(NS) and
SO_TIMESTAMPING that can be independently turned on and off, disabling
one can incorrectly switch modes while the other is still active.
This will not help the case when a child process that inherits the fd
and then sets SO_TIMESTAMP*_OLD/NEW on it, while the parent uses the
other version.
One of the two processes might still be surprised. But, child and
parent actively using the same socket fd might be expecting trouble
already.
Usually the decision between SO_TIMESTAMP*_OLD/NEW  will be done at compile
time (trough the system C library headers). For a typical "distribution" it
should be quite unlikely that two programs will be compiled using different
settings.

 net/core/sock.c | 1 -
 1 file changed, 1 deletion(-)
diff --git a/net/core/sock.c b/net/core/sock.c
index 669cf9b8bb44..f4236c7512b5 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -757,7 +757,6 @@ static void __sock_set_timestamps(struct sock *sk, bool val, bool new, bool ns)
 	} else {
 		sock_reset_flag(sk, SOCK_RCVTSTAMP);
 		sock_reset_flag(sk, SOCK_RCVTSTAMPNS);
-		sock_reset_flag(sk, SOCK_TSTAMP_NEW);
 	}
 }
 
-- 
Christian Eggers
Embedded software developer

Arnold & Richter Cine Technik GmbH & Co. Betriebs KG
Sitz: Muenchen - Registergericht: Amtsgericht Muenchen - Handelsregisternummer: HRA 57918
Persoenlich haftender Gesellschafter: Arnold & Richter Cine Technik GmbH
Sitz: Muenchen - Registergericht: Amtsgericht Muenchen - Handelsregisternummer: HRB 54477
Geschaeftsfuehrer: Dr. Michael Neuhaeuser; Stephan Schenk; Walter Trauninger; Markus Zeiler

Re: [PATCH net v2 1/2] socket: fix option SO_TIMESTAMPING_NEW

From: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
Date: 2020-10-12 14:01:28

On Mon, Oct 12, 2020 at 5:36 AM Christian Eggers [off-list ref] wrote:
The comparison of optname with SO_TIMESTAMPING_NEW is wrong way around,
so SOCK_TSTAMP_NEW will first be set and than reset again. Additionally
move it out of the test for SOF_TIMESTAMPING_RX_SOFTWARE as this seems
unrelated.

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: 9718475e6908 ("socket: Add SO_TIMESTAMPING_NEW")
Signed-off-by: Christian Eggers <ceggers@arri.de>
Reviewed-by: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
Reviewed-by: Deepa Dinamani <redacted>
We have not yet reviewed this second patch. Please do not add such
tags on behalf of other people.

That said, I now have and do agree with the change, so

Acked-by: Willem de Bruijn <willemb@google.com>
---
v2:
-----
- integrated proposal from Willem de Bruijn
- added Reviewed-by: from Willem and Deepa


On Saturday, 10 October 2020, 02:23:10 CEST, Willem de Bruijn wrote:
quoted
This suggested fix still sets and clears the flag if calling
SO_TIMESTAMPING_NEW to disable timestamping.
where is it cleared?
quoted
Instead, how about

        case SO_TIMESTAMPING_NEW:
-               sock_set_flag(sk, SOCK_TSTAMP_NEW);
                fallthrough;
        case SO_TIMESTAMPING_OLD:
[..]
+               sock_valbool_flag(sk, SOCK_TSTAMP_NEW,
+                                 optname == SO_TIMESTAMPING_NEW);
+
using you version looks clearer
quoted
                if (val & SOF_TIMESTAMPING_OPT_ID &&
I would like to keep this below the "ret = -FOO; break" statements. IMHO the
setsockopt() call should either completely fail or succeed.
Agreed.

quoted hunk
 net/core/sock.c | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)
diff --git a/net/core/sock.c b/net/core/sock.c
index 34a8d12e38d7..669cf9b8bb44 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -994,8 +994,6 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
                __sock_set_timestamps(sk, valbool, true, true);
                break;
        case SO_TIMESTAMPING_NEW:
-               sock_set_flag(sk, SOCK_TSTAMP_NEW);
-               fallthrough;
        case SO_TIMESTAMPING_OLD:
                if (val & ~SOF_TIMESTAMPING_MASK) {
                        ret = -EINVAL;
@@ -1024,16 +1022,14 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
                }

                sk->sk_tsflags = val;
+               sock_valbool_flag(sk, SOCK_TSTAMP_NEW, optname == SO_TIMESTAMPING_NEW);
+
                if (val & SOF_TIMESTAMPING_RX_SOFTWARE)
                        sock_enable_timestamp(sk,
                                              SOCK_TIMESTAMPING_RX_SOFTWARE);
-               else {
-                       if (optname == SO_TIMESTAMPING_NEW)
-                               sock_reset_flag(sk, SOCK_TSTAMP_NEW);
-
+               else
                        sock_disable_timestamp(sk,
                                               (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE));
-               }
                break;

        case SO_RCVLOWAT:
--
Christian Eggers
Embedded software developer

6 more quoted lines

Re: [PATCH net v2 1/2] socket: fix option SO_TIMESTAMPING_NEW

From: Deepa Dinamani <hidden>
Date: 2020-10-13 05:10:45

On Mon, Oct 12, 2020 at 5:36 AM Christian Eggers [off-list ref] wrote:
quoted
v2:
-----
- integrated proposal from Willem de Bruijn
- added Reviewed-by: from Willem and Deepa
You may add my
Acked-by: Deepa Dinamani <redacted>


-Deepa

Re: [PATCH net v2 1/2] socket: fix option SO_TIMESTAMPING_NEW

From: Jakub Kicinski <kuba@kernel.org>
Date: 2020-10-14 00:22:09

On Mon, 12 Oct 2020 22:10:31 -0700 Deepa Dinamani wrote:
quoted
On Mon, Oct 12, 2020 at 5:36 AM Christian Eggers [off-list ref] wrote:  
quoted
v2:
-----
- integrated proposal from Willem de Bruijn
- added Reviewed-by: from Willem and Deepa  
You may add my
Acked-by: Deepa Dinamani <redacted>
Applied both, thanks everyone!
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help