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

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
Loading
Loading
Loading
Loading
+3 −7
Original line number Diff line number Diff line
@@ -1007,8 +1007,6 @@ set_sndbuf:
		__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;
@@ -1037,16 +1035,14 @@ set_sndbuf:
		}

		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: