aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
authorDeepa Dinamani <deepa.kernel@gmail.com>2019-02-02 10:34:51 -0500
committerDavid S. Miller <davem@davemloft.net>2019-02-03 14:17:31 -0500
commit9718475e69084de15c3930ce35672a7dc6da866b (patch)
tree38aa5063b7d5063df9bb77535487fd109553eb4f /net/socket.c
parent887feae36aee6c08e0dafcdaa5ba921abbb2c56b (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.c13
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)