aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp.c')
-rw-r--r--net/ipv4/tcp.c30
1 files changed, 17 insertions, 13 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 4e9388bf104a..cab6b2f2f61d 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -1844,22 +1844,22 @@ out:
1844#endif 1844#endif
1845 1845
1846static void tcp_update_recv_tstamps(struct sk_buff *skb, 1846static void tcp_update_recv_tstamps(struct sk_buff *skb,
1847 struct scm_timestamping *tss) 1847 struct scm_timestamping_internal *tss)
1848{ 1848{
1849 if (skb->tstamp) 1849 if (skb->tstamp)
1850 tss->ts[0] = ktime_to_timespec(skb->tstamp); 1850 tss->ts[0] = ktime_to_timespec64(skb->tstamp);
1851 else 1851 else
1852 tss->ts[0] = (struct timespec) {0}; 1852 tss->ts[0] = (struct timespec64) {0};
1853 1853
1854 if (skb_hwtstamps(skb)->hwtstamp) 1854 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);
1856 else 1856 else
1857 tss->ts[2] = (struct timespec) {0}; 1857 tss->ts[2] = (struct timespec64) {0};
1858} 1858}
1859 1859
1860/* Similar to __sock_recv_timestamp, but does not require an skb */ 1860/* Similar to __sock_recv_timestamp, but does not require an skb */
1861static void tcp_recv_timestamp(struct msghdr *msg, const struct sock *sk, 1861static void tcp_recv_timestamp(struct msghdr *msg, const struct sock *sk,
1862 struct scm_timestamping *tss) 1862 struct scm_timestamping_internal *tss)
1863{ 1863{
1864 int new_tstamp = sock_flag(sk, SOCK_TSTAMP_NEW); 1864 int new_tstamp = sock_flag(sk, SOCK_TSTAMP_NEW);
1865 bool has_timestamping = false; 1865 bool has_timestamping = false;
@@ -1873,8 +1873,10 @@ static void tcp_recv_timestamp(struct msghdr *msg, const struct sock *sk,
1873 put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMPNS_NEW, 1873 put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMPNS_NEW,
1874 sizeof(kts), &kts); 1874 sizeof(kts), &kts);
1875 } else { 1875 } else {
1876 struct timespec ts_old = timespec64_to_timespec(tss->ts[0]);
1877
1876 put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMPNS_OLD, 1878 put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMPNS_OLD,
1877 sizeof(tss->ts[0]), &tss->ts[0]); 1879 sizeof(ts_old), &ts_old);
1878 } 1880 }
1879 } else { 1881 } else {
1880 if (new_tstamp) { 1882 if (new_tstamp) {
@@ -1898,20 +1900,22 @@ static void tcp_recv_timestamp(struct msghdr *msg, const struct sock *sk,
1898 if (sk->sk_tsflags & SOF_TIMESTAMPING_SOFTWARE) 1900 if (sk->sk_tsflags & SOF_TIMESTAMPING_SOFTWARE)
1899 has_timestamping = true; 1901 has_timestamping = true;
1900 else 1902 else
1901 tss->ts[0] = (struct timespec) {0}; 1903 tss->ts[0] = (struct timespec64) {0};
1902 } 1904 }
1903 1905
1904 if (tss->ts[2].tv_sec || tss->ts[2].tv_nsec) { 1906 if (tss->ts[2].tv_sec || tss->ts[2].tv_nsec) {
1905 if (sk->sk_tsflags & SOF_TIMESTAMPING_RAW_HARDWARE) 1907 if (sk->sk_tsflags & SOF_TIMESTAMPING_RAW_HARDWARE)
1906 has_timestamping = true; 1908 has_timestamping = true;
1907 else 1909 else
1908 tss->ts[2] = (struct timespec) {0}; 1910 tss->ts[2] = (struct timespec64) {0};
1909 } 1911 }
1910 1912
1911 if (has_timestamping) { 1913 if (has_timestamping) {
1912 tss->ts[1] = (struct timespec) {0}; 1914 tss->ts[1] = (struct timespec64) {0};
1913 put_cmsg(msg, SOL_SOCKET, SO_TIMESTAMPING_OLD, 1915 if (sock_flag(sk, SOCK_TSTAMP_NEW))
1914 sizeof(*tss), tss); 1916 put_cmsg_scm_timestamping64(msg, tss);
1917 else
1918 put_cmsg_scm_timestamping(msg, tss);
1915 } 1919 }
1916} 1920}
1917 1921
@@ -1952,7 +1956,7 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
1952 long timeo; 1956 long timeo;
1953 struct sk_buff *skb, *last; 1957 struct sk_buff *skb, *last;
1954 u32 urg_hole = 0; 1958 u32 urg_hole = 0;
1955 struct scm_timestamping tss; 1959 struct scm_timestamping_internal tss;
1956 bool has_tss = false; 1960 bool has_tss = false;
1957 bool has_cmsg; 1961 bool has_cmsg;
1958 1962