All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net v2 1/2] socket: fix option SO_TIMESTAMPING_NEW
@ 2020-10-12  9:35 Christian Eggers
  2020-10-12  9:35 ` [PATCH net v2 2/2] socket: don't clear SOCK_TSTAMP_NEW when SO_TIMESTAMPNS is disabled Christian Eggers
  2020-10-12 13:37 ` [PATCH net v2 1/2] socket: fix option SO_TIMESTAMPING_NEW Willem de Bruijn
  0 siblings, 2 replies; 5+ messages in thread
From: Christian Eggers @ 2020-10-12  9:35 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Deepa Dinamani, Willem de Bruijn
  Cc: Christoph Hellwig, netdev, linux-kernel, Christian Eggers,
	Willem de Bruijn

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 <deepa.kernel@gmail.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:
> 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


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH net v2 2/2] socket: don't clear SOCK_TSTAMP_NEW when SO_TIMESTAMPNS is disabled
  2020-10-12  9:35 [PATCH net v2 1/2] socket: fix option SO_TIMESTAMPING_NEW Christian Eggers
@ 2020-10-12  9:35 ` Christian Eggers
  2020-10-12 13:37 ` [PATCH net v2 1/2] socket: fix option SO_TIMESTAMPING_NEW Willem de Bruijn
  1 sibling, 0 replies; 5+ messages in thread
From: Christian Eggers @ 2020-10-12  9:35 UTC (permalink / raw)
  To: David S . Miller, Jakub Kicinski, Deepa Dinamani, Willem de Bruijn
  Cc: Christoph Hellwig, netdev, linux-kernel, Christian Eggers

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 <deepa.kernel@gmail.com>
---
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 <willemdebruijn.kernel@gmail.com> wrote:
> > 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


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH net v2 1/2] socket: fix option SO_TIMESTAMPING_NEW
  2020-10-12  9:35 [PATCH net v2 1/2] socket: fix option SO_TIMESTAMPING_NEW Christian Eggers
  2020-10-12  9:35 ` [PATCH net v2 2/2] socket: don't clear SOCK_TSTAMP_NEW when SO_TIMESTAMPNS is disabled Christian Eggers
@ 2020-10-12 13:37 ` Willem de Bruijn
  2020-10-13  5:10   ` Deepa Dinamani
  1 sibling, 1 reply; 5+ messages in thread
From: Willem de Bruijn @ 2020-10-12 13:37 UTC (permalink / raw)
  To: Christian Eggers
  Cc: David S . Miller, Jakub Kicinski, Deepa Dinamani,
	Christoph Hellwig, Network Development, linux-kernel

On Mon, Oct 12, 2020 at 5:36 AM Christian Eggers <ceggers@arri.de> 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 <deepa.kernel@gmail.com>

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:
> > 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.

Agreed.


>  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
>

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH net v2 1/2] socket: fix option SO_TIMESTAMPING_NEW
  2020-10-12 13:37 ` [PATCH net v2 1/2] socket: fix option SO_TIMESTAMPING_NEW Willem de Bruijn
@ 2020-10-13  5:10   ` Deepa Dinamani
  2020-10-14  0:22     ` Jakub Kicinski
  0 siblings, 1 reply; 5+ messages in thread
From: Deepa Dinamani @ 2020-10-13  5:10 UTC (permalink / raw)
  To: Willem de Bruijn
  Cc: Christian Eggers, David S . Miller, Jakub Kicinski,
	Christoph Hellwig, Network Development, linux-kernel

> On Mon, Oct 12, 2020 at 5:36 AM Christian Eggers <ceggers@arri.de> wrote:
> > v2:
> > -----
> > - integrated proposal from Willem de Bruijn
> > - added Reviewed-by: from Willem and Deepa

You may add my
Acked-by: Deepa Dinamani <deepa.kernel@gmail.com>


-Deepa

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH net v2 1/2] socket: fix option SO_TIMESTAMPING_NEW
  2020-10-13  5:10   ` Deepa Dinamani
@ 2020-10-14  0:22     ` Jakub Kicinski
  0 siblings, 0 replies; 5+ messages in thread
From: Jakub Kicinski @ 2020-10-14  0:22 UTC (permalink / raw)
  To: Deepa Dinamani
  Cc: Willem de Bruijn, Christian Eggers, David S . Miller,
	Christoph Hellwig, Network Development, linux-kernel

On Mon, 12 Oct 2020 22:10:31 -0700 Deepa Dinamani wrote:
> > On Mon, Oct 12, 2020 at 5:36 AM Christian Eggers <ceggers@arri.de> wrote:  
> > > v2:
> > > -----
> > > - integrated proposal from Willem de Bruijn
> > > - added Reviewed-by: from Willem and Deepa  
> 
> You may add my
> Acked-by: Deepa Dinamani <deepa.kernel@gmail.com>

Applied both, thanks everyone!

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-10-14  0:22 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-12  9:35 [PATCH net v2 1/2] socket: fix option SO_TIMESTAMPING_NEW Christian Eggers
2020-10-12  9:35 ` [PATCH net v2 2/2] socket: don't clear SOCK_TSTAMP_NEW when SO_TIMESTAMPNS is disabled Christian Eggers
2020-10-12 13:37 ` [PATCH net v2 1/2] socket: fix option SO_TIMESTAMPING_NEW Willem de Bruijn
2020-10-13  5:10   ` Deepa Dinamani
2020-10-14  0:22     ` Jakub Kicinski

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.