diff options
author | Deepa Dinamani <deepa.kernel@gmail.com> | 2019-02-02 10:34:51 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-02-03 14:17:31 -0500 |
commit | 9718475e69084de15c3930ce35672a7dc6da866b (patch) | |
tree | 38aa5063b7d5063df9bb77535487fd109553eb4f /net/socket.c | |
parent | 887feae36aee6c08e0dafcdaa5ba921abbb2c56b (diff) |
socket: Add SO_TIMESTAMPING_NEW
Add SO_TIMESTAMPING_NEW variant of socket timestamp options.
This is the y2038 safe versions of the SO_TIMESTAMPING_OLD
for all architectures.
Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
Acked-by: Willem de Bruijn <willemb@google.com>
Cc: chris@zankel.net
Cc: fenghua.yu@intel.com
Cc: rth@twiddle.net
Cc: tglx@linutronix.de
Cc: ubraun@linux.ibm.com
Cc: linux-alpha@vger.kernel.org
Cc: linux-arch@vger.kernel.org
Cc: linux-ia64@vger.kernel.org
Cc: linux-mips@linux-mips.org
Cc: linux-s390@vger.kernel.org
Cc: linux-xtensa@linux-xtensa.org
Cc: sparclinux@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/socket.c')
-rw-r--r-- | net/socket.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/net/socket.c b/net/socket.c index 1de96abd78d3..d51930689b98 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -706,7 +706,8 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk, | |||
706 | { | 706 | { |
707 | int need_software_tstamp = sock_flag(sk, SOCK_RCVTSTAMP); | 707 | int need_software_tstamp = sock_flag(sk, SOCK_RCVTSTAMP); |
708 | int new_tstamp = sock_flag(sk, SOCK_TSTAMP_NEW); | 708 | int new_tstamp = sock_flag(sk, SOCK_TSTAMP_NEW); |
709 | struct scm_timestamping tss; | 709 | struct scm_timestamping_internal tss; |
710 | |||
710 | int empty = 1, false_tstamp = 0; | 711 | int empty = 1, false_tstamp = 0; |
711 | struct skb_shared_hwtstamps *shhwtstamps = | 712 | struct skb_shared_hwtstamps *shhwtstamps = |
712 | skb_hwtstamps(skb); | 713 | skb_hwtstamps(skb); |
@@ -752,20 +753,22 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk, | |||
752 | 753 | ||
753 | memset(&tss, 0, sizeof(tss)); | 754 | memset(&tss, 0, sizeof(tss)); |
754 | if ((sk->sk_tsflags & SOF_TIMESTAMPING_SOFTWARE) && | 755 | if ((sk->sk_tsflags & SOF_TIMESTAMPING_SOFTWARE) && |
755 | ktime_to_timespec_cond(skb->tstamp, tss.ts + 0)) | 756 | ktime_to_timespec64_cond(skb->tstamp, tss.ts + 0)) |
756 | empty = 0; | 757 | empty = 0; |
757 | if (shhwtstamps && | 758 | if (shhwtstamps && |
758 | (sk->sk_tsflags & SOF_TIMESTAMPING_RAW_HARDWARE) && | 759 | (sk->sk_tsflags & SOF_TIMESTAMPING_RAW_HARDWARE) && |
759 | !skb_is_swtx_tstamp(skb, false_tstamp) && | 760 | !skb_is_swtx_tstamp(skb, false_tstamp) && |
760 | ktime_to_timespec_cond(shhwtstamps->hwtstamp, tss.ts + 2)) { | 761 | ktime_to_timespec64_cond(shhwtstamps->hwtstamp, tss.ts + 2)) { |
761 | empty = 0; | 762 | empty = 0; |
762 | if ((sk->sk_tsflags & SOF_TIMESTAMPING_OPT_PKTINFO) && | 763 | if ((sk->sk_tsflags & SOF_TIMESTAMPING_OPT_PKTINFO) && |
763 | !skb_is_err_queue(skb)) | 764 | !skb_is_err_queue(skb)) |
764 | put_ts_pktinfo(msg, skb); | 765 | put_ts_pktinfo(msg, skb); |
765 | } | 766 | } |
766 | if (!empty) { | 767 | if (!empty) { |
767 | put_cmsg(msg, SOL_SOCKET, | 768 | if (sock_flag(sk, SOCK_TSTAMP_NEW)) |
768 | SO_TIMESTAMPING_OLD, sizeof(tss), &tss); | 769 | put_cmsg_scm_timestamping64(msg, &tss); |
770 | else | ||
771 | put_cmsg_scm_timestamping(msg, &tss); | ||
769 | 772 | ||
770 | if (skb_is_err_queue(skb) && skb->len && | 773 | if (skb_is_err_queue(skb) && skb->len && |
771 | SKB_EXT_ERR(skb)->opt_stats) | 774 | SKB_EXT_ERR(skb)->opt_stats) |