@@ -1844,22 +1844,22 @@ static int tcp_zerocopy_receive(struct sock *sk,
18441844#endif
18451845
18461846static void tcp_update_recv_tstamps (struct sk_buff * skb ,
1847- struct scm_timestamping * tss )
1847+ struct scm_timestamping_internal * tss )
18481848{
18491849 if (skb -> tstamp )
1850- tss -> ts [0 ] = ktime_to_timespec (skb -> tstamp );
1850+ tss -> ts [0 ] = ktime_to_timespec64 (skb -> tstamp );
18511851 else
1852- tss -> ts [0 ] = (struct timespec ) {0 };
1852+ tss -> ts [0 ] = (struct timespec64 ) {0 };
18531853
18541854 if (skb_hwtstamps (skb )-> hwtstamp )
1855- tss -> ts [2 ] = ktime_to_timespec (skb_hwtstamps (skb )-> hwtstamp );
1855+ tss -> ts [2 ] = ktime_to_timespec64 (skb_hwtstamps (skb )-> hwtstamp );
18561856 else
1857- tss -> ts [2 ] = (struct timespec ) {0 };
1857+ tss -> ts [2 ] = (struct timespec64 ) {0 };
18581858}
18591859
18601860/* Similar to __sock_recv_timestamp, but does not require an skb */
18611861static void tcp_recv_timestamp (struct msghdr * msg , const struct sock * sk ,
1862- struct scm_timestamping * tss )
1862+ struct scm_timestamping_internal * tss )
18631863{
18641864 int new_tstamp = sock_flag (sk , SOCK_TSTAMP_NEW );
18651865 bool has_timestamping = false;
@@ -1873,8 +1873,10 @@ static void tcp_recv_timestamp(struct msghdr *msg, const struct sock *sk,
18731873 put_cmsg (msg , SOL_SOCKET , SO_TIMESTAMPNS_NEW ,
18741874 sizeof (kts ), & kts );
18751875 } else {
1876+ struct timespec ts_old = timespec64_to_timespec (tss -> ts [0 ]);
1877+
18761878 put_cmsg (msg , SOL_SOCKET , SO_TIMESTAMPNS_OLD ,
1877- sizeof (tss -> ts [ 0 ] ), & tss -> ts [ 0 ] );
1879+ sizeof (ts_old ), & ts_old );
18781880 }
18791881 } else {
18801882 if (new_tstamp ) {
@@ -1898,20 +1900,22 @@ static void tcp_recv_timestamp(struct msghdr *msg, const struct sock *sk,
18981900 if (sk -> sk_tsflags & SOF_TIMESTAMPING_SOFTWARE )
18991901 has_timestamping = true;
19001902 else
1901- tss -> ts [0 ] = (struct timespec ) {0 };
1903+ tss -> ts [0 ] = (struct timespec64 ) {0 };
19021904 }
19031905
19041906 if (tss -> ts [2 ].tv_sec || tss -> ts [2 ].tv_nsec ) {
19051907 if (sk -> sk_tsflags & SOF_TIMESTAMPING_RAW_HARDWARE )
19061908 has_timestamping = true;
19071909 else
1908- tss -> ts [2 ] = (struct timespec ) {0 };
1910+ tss -> ts [2 ] = (struct timespec64 ) {0 };
19091911 }
19101912
19111913 if (has_timestamping ) {
1912- tss -> ts [1 ] = (struct timespec ) {0 };
1913- put_cmsg (msg , SOL_SOCKET , SO_TIMESTAMPING_OLD ,
1914- sizeof (* tss ), tss );
1914+ tss -> ts [1 ] = (struct timespec64 ) {0 };
1915+ if (sock_flag (sk , SOCK_TSTAMP_NEW ))
1916+ put_cmsg_scm_timestamping64 (msg , tss );
1917+ else
1918+ put_cmsg_scm_timestamping (msg , tss );
19151919 }
19161920}
19171921
@@ -1952,7 +1956,7 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
19521956 long timeo ;
19531957 struct sk_buff * skb , * last ;
19541958 u32 urg_hole = 0 ;
1955- struct scm_timestamping tss ;
1959+ struct scm_timestamping_internal tss ;
19561960 bool has_tss = false;
19571961 bool has_cmsg ;
19581962
0 commit comments