Commit 59e611a5 authored by Christian Eggers's avatar Christian Eggers Committed by Jakub Kicinski

socket: fix option SO_TIMESTAMPING_NEW

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: 9718475e ("socket: Add SO_TIMESTAMPING_NEW")
Signed-off-by: default avatarChristian Eggers <ceggers@arri.de>
Reviewed-by: default avatarWillem de Bruijn <willemdebruijn.kernel@gmail.com>
Reviewed-by: default avatarDeepa Dinamani <deepa.kernel@gmail.com>
Acked-by: default avatarWillem de Bruijn <willemb@google.com>
Acked-by: default avatarDeepa Dinamani <deepa.kernel@gmail.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 254941f3
...@@ -1007,8 +1007,6 @@ int sock_setsockopt(struct socket *sock, int level, int optname, ...@@ -1007,8 +1007,6 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
__sock_set_timestamps(sk, valbool, true, true); __sock_set_timestamps(sk, valbool, true, true);
break; break;
case SO_TIMESTAMPING_NEW: case SO_TIMESTAMPING_NEW:
sock_set_flag(sk, SOCK_TSTAMP_NEW);
fallthrough;
case SO_TIMESTAMPING_OLD: case SO_TIMESTAMPING_OLD:
if (val & ~SOF_TIMESTAMPING_MASK) { if (val & ~SOF_TIMESTAMPING_MASK) {
ret = -EINVAL; ret = -EINVAL;
...@@ -1037,16 +1035,14 @@ int sock_setsockopt(struct socket *sock, int level, int optname, ...@@ -1037,16 +1035,14 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
} }
sk->sk_tsflags = val; sk->sk_tsflags = val;
sock_valbool_flag(sk, SOCK_TSTAMP_NEW, optname == SO_TIMESTAMPING_NEW);
if (val & SOF_TIMESTAMPING_RX_SOFTWARE) if (val & SOF_TIMESTAMPING_RX_SOFTWARE)
sock_enable_timestamp(sk, sock_enable_timestamp(sk,
SOCK_TIMESTAMPING_RX_SOFTWARE); SOCK_TIMESTAMPING_RX_SOFTWARE);
else { else
if (optname == SO_TIMESTAMPING_NEW)
sock_reset_flag(sk, SOCK_TSTAMP_NEW);
sock_disable_timestamp(sk, sock_disable_timestamp(sk,
(1UL << SOCK_TIMESTAMPING_RX_SOFTWARE)); (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE));
}
break; break;
case SO_RCVLOWAT: case SO_RCVLOWAT:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment