diff options
Diffstat (limited to 'net/ipv4/tcp.c')
-rw-r--r-- | net/ipv4/tcp.c | 30 |
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 | ||
1846 | static void tcp_update_recv_tstamps(struct sk_buff *skb, | 1846 | static 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 */ |
1861 | static void tcp_recv_timestamp(struct msghdr *msg, const struct sock *sk, | 1861 | static 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 | ||