aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/networking/timestamping.txt12
-rw-r--r--Documentation/networking/timestamping/timestamping.c7
-rw-r--r--include/linux/skbuff.h14
-rw-r--r--include/net/sock.h11
-rw-r--r--net/core/sock.c4
-rw-r--r--net/socket.c12
6 files changed, 11 insertions, 49 deletions
diff --git a/Documentation/networking/timestamping.txt b/Documentation/networking/timestamping.txt
index 8b4ad809df27..897f942b976b 100644
--- a/Documentation/networking/timestamping.txt
+++ b/Documentation/networking/timestamping.txt
@@ -88,15 +88,8 @@ hwtimeraw is the original hardware time stamp. Filled in if
88SOF_TIMESTAMPING_RAW_HARDWARE is set. No assumptions about its 88SOF_TIMESTAMPING_RAW_HARDWARE is set. No assumptions about its
89relation to system time should be made. 89relation to system time should be made.
90 90
91hwtimetrans is the hardware time stamp transformed so that it 91hwtimetrans is always zero. This field is deprecated. It used to hold
92corresponds as good as possible to system time. This correlation is 92hw timestamps converted to system time. Instead, expose the hardware
93not perfect; as a consequence, sorting packets received via different
94NICs by their hwtimetrans may differ from the order in which they were
95received. hwtimetrans may be non-monotonic even for the same NIC.
96Filled in if SOF_TIMESTAMPING_SYS_HARDWARE is set. Requires support
97by the network device and will be empty without that support. This
98field is DEPRECATED. Only one driver computes this value. New device
99drivers must leave this zero. Instead, they can expose the hardware
100clock device on the NIC directly as a HW PTP clock source, to allow 93clock device on the NIC directly as a HW PTP clock source, to allow
101time conversion in userspace and optionally synchronize system time 94time conversion in userspace and optionally synchronize system time
102with a userspace PTP stack such as linuxptp. For the PTP clock API, 95with a userspace PTP stack such as linuxptp. For the PTP clock API,
@@ -191,7 +184,6 @@ struct skb_shared_hwtstamps {
191 * since arbitrary point in time 184 * since arbitrary point in time
192 */ 185 */
193 ktime_t hwtstamp; 186 ktime_t hwtstamp;
194 ktime_t syststamp; /* hwtstamp transformed to system time base */
195}; 187};
196 188
197Time stamps for outgoing packets are to be generated as follows: 189Time stamps for outgoing packets are to be generated as follows:
diff --git a/Documentation/networking/timestamping/timestamping.c b/Documentation/networking/timestamping/timestamping.c
index 8ba82bfe6a33..5cdfd743447b 100644
--- a/Documentation/networking/timestamping/timestamping.c
+++ b/Documentation/networking/timestamping/timestamping.c
@@ -76,7 +76,6 @@ static void usage(const char *error)
76 " SOF_TIMESTAMPING_RX_HARDWARE - hardware time stamping of incoming packets\n" 76 " SOF_TIMESTAMPING_RX_HARDWARE - hardware time stamping of incoming packets\n"
77 " SOF_TIMESTAMPING_RX_SOFTWARE - software fallback for incoming packets\n" 77 " SOF_TIMESTAMPING_RX_SOFTWARE - software fallback for incoming packets\n"
78 " SOF_TIMESTAMPING_SOFTWARE - request reporting of software time stamps\n" 78 " SOF_TIMESTAMPING_SOFTWARE - request reporting of software time stamps\n"
79 " SOF_TIMESTAMPING_SYS_HARDWARE - request reporting of transformed HW time stamps\n"
80 " SOF_TIMESTAMPING_RAW_HARDWARE - request reporting of raw HW time stamps\n" 79 " SOF_TIMESTAMPING_RAW_HARDWARE - request reporting of raw HW time stamps\n"
81 " SIOCGSTAMP - check last socket time stamp\n" 80 " SIOCGSTAMP - check last socket time stamp\n"
82 " SIOCGSTAMPNS - more accurate socket time stamp\n"); 81 " SIOCGSTAMPNS - more accurate socket time stamp\n");
@@ -202,9 +201,7 @@ static void printpacket(struct msghdr *msg, int res,
202 (long)stamp->tv_sec, 201 (long)stamp->tv_sec,
203 (long)stamp->tv_nsec); 202 (long)stamp->tv_nsec);
204 stamp++; 203 stamp++;
205 printf("HW transformed %ld.%09ld ", 204 /* skip deprecated HW transformed */
206 (long)stamp->tv_sec,
207 (long)stamp->tv_nsec);
208 stamp++; 205 stamp++;
209 printf("HW raw %ld.%09ld", 206 printf("HW raw %ld.%09ld",
210 (long)stamp->tv_sec, 207 (long)stamp->tv_sec,
@@ -361,8 +358,6 @@ int main(int argc, char **argv)
361 so_timestamping_flags |= SOF_TIMESTAMPING_RX_SOFTWARE; 358 so_timestamping_flags |= SOF_TIMESTAMPING_RX_SOFTWARE;
362 else if (!strcasecmp(argv[i], "SOF_TIMESTAMPING_SOFTWARE")) 359 else if (!strcasecmp(argv[i], "SOF_TIMESTAMPING_SOFTWARE"))
363 so_timestamping_flags |= SOF_TIMESTAMPING_SOFTWARE; 360 so_timestamping_flags |= SOF_TIMESTAMPING_SOFTWARE;
364 else if (!strcasecmp(argv[i], "SOF_TIMESTAMPING_SYS_HARDWARE"))
365 so_timestamping_flags |= SOF_TIMESTAMPING_SYS_HARDWARE;
366 else if (!strcasecmp(argv[i], "SOF_TIMESTAMPING_RAW_HARDWARE")) 361 else if (!strcasecmp(argv[i], "SOF_TIMESTAMPING_RAW_HARDWARE"))
367 so_timestamping_flags |= SOF_TIMESTAMPING_RAW_HARDWARE; 362 so_timestamping_flags |= SOF_TIMESTAMPING_RAW_HARDWARE;
368 else 363 else
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index b613557132b9..281deced7469 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -210,20 +210,9 @@ static inline void skb_frag_size_sub(skb_frag_t *frag, int delta)
210 * struct skb_shared_hwtstamps - hardware time stamps 210 * struct skb_shared_hwtstamps - hardware time stamps
211 * @hwtstamp: hardware time stamp transformed into duration 211 * @hwtstamp: hardware time stamp transformed into duration
212 * since arbitrary point in time 212 * since arbitrary point in time
213 * @syststamp: hwtstamp transformed to system time base (deprecated)
214 * 213 *
215 * Software time stamps generated by ktime_get_real() are stored in 214 * Software time stamps generated by ktime_get_real() are stored in
216 * skb->tstamp. The relation between the different kinds of time 215 * skb->tstamp.
217 * stamps is as follows:
218 *
219 * syststamp and tstamp can be compared against each other in
220 * arbitrary combinations. The accuracy of a
221 * syststamp/tstamp/"syststamp from other device" comparison is
222 * limited by the accuracy of the transformation into system time
223 * base. This depends on the device driver and its underlying
224 * hardware. The syststamp implementation is deprecated in favor
225 * of hwtstamps and hw PTP clock sources exposed directly to
226 * userspace.
227 * 216 *
228 * hwtstamps can only be compared against other hwtstamps from 217 * hwtstamps can only be compared against other hwtstamps from
229 * the same device. 218 * the same device.
@@ -233,7 +222,6 @@ static inline void skb_frag_size_sub(skb_frag_t *frag, int delta)
233 */ 222 */
234struct skb_shared_hwtstamps { 223struct skb_shared_hwtstamps {
235 ktime_t hwtstamp; 224 ktime_t hwtstamp;
236 ktime_t syststamp;
237}; 225};
238 226
239/* Definitions for tx_flags in struct skb_shared_info */ 227/* Definitions for tx_flags in struct skb_shared_info */
diff --git a/include/net/sock.h b/include/net/sock.h
index 720773304a85..b91c8868ab8d 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -707,7 +707,6 @@ enum sock_flags {
707 SOCK_TIMESTAMPING_RX_SOFTWARE, /* %SOF_TIMESTAMPING_RX_SOFTWARE */ 707 SOCK_TIMESTAMPING_RX_SOFTWARE, /* %SOF_TIMESTAMPING_RX_SOFTWARE */
708 SOCK_TIMESTAMPING_SOFTWARE, /* %SOF_TIMESTAMPING_SOFTWARE */ 708 SOCK_TIMESTAMPING_SOFTWARE, /* %SOF_TIMESTAMPING_SOFTWARE */
709 SOCK_TIMESTAMPING_RAW_HARDWARE, /* %SOF_TIMESTAMPING_RAW_HARDWARE */ 709 SOCK_TIMESTAMPING_RAW_HARDWARE, /* %SOF_TIMESTAMPING_RAW_HARDWARE */
710 SOCK_TIMESTAMPING_SYS_HARDWARE, /* %SOF_TIMESTAMPING_SYS_HARDWARE */
711 SOCK_FASYNC, /* fasync() active */ 710 SOCK_FASYNC, /* fasync() active */
712 SOCK_RXQ_OVFL, 711 SOCK_RXQ_OVFL,
713 SOCK_ZEROCOPY, /* buffers from userspace */ 712 SOCK_ZEROCOPY, /* buffers from userspace */
@@ -2166,16 +2165,13 @@ sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb)
2166 * - software time stamp available and wanted 2165 * - software time stamp available and wanted
2167 * (SOCK_TIMESTAMPING_SOFTWARE) 2166 * (SOCK_TIMESTAMPING_SOFTWARE)
2168 * - hardware time stamps available and wanted 2167 * - hardware time stamps available and wanted
2169 * (SOCK_TIMESTAMPING_SYS_HARDWARE or 2168 * SOCK_TIMESTAMPING_RAW_HARDWARE
2170 * SOCK_TIMESTAMPING_RAW_HARDWARE)
2171 */ 2169 */
2172 if (sock_flag(sk, SOCK_RCVTSTAMP) || 2170 if (sock_flag(sk, SOCK_RCVTSTAMP) ||
2173 sock_flag(sk, SOCK_TIMESTAMPING_RX_SOFTWARE) || 2171 sock_flag(sk, SOCK_TIMESTAMPING_RX_SOFTWARE) ||
2174 (kt.tv64 && sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE)) || 2172 (kt.tv64 && sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE)) ||
2175 (hwtstamps->hwtstamp.tv64 && 2173 (hwtstamps->hwtstamp.tv64 &&
2176 sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE)) || 2174 sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE)))
2177 (hwtstamps->syststamp.tv64 &&
2178 sock_flag(sk, SOCK_TIMESTAMPING_SYS_HARDWARE)))
2179 __sock_recv_timestamp(msg, sk, skb); 2175 __sock_recv_timestamp(msg, sk, skb);
2180 else 2176 else
2181 sk->sk_stamp = kt; 2177 sk->sk_stamp = kt;
@@ -2193,8 +2189,7 @@ static inline void sock_recv_ts_and_drops(struct msghdr *msg, struct sock *sk,
2193#define FLAGS_TS_OR_DROPS ((1UL << SOCK_RXQ_OVFL) | \ 2189#define FLAGS_TS_OR_DROPS ((1UL << SOCK_RXQ_OVFL) | \
2194 (1UL << SOCK_RCVTSTAMP) | \ 2190 (1UL << SOCK_RCVTSTAMP) | \
2195 (1UL << SOCK_TIMESTAMPING_SOFTWARE) | \ 2191 (1UL << SOCK_TIMESTAMPING_SOFTWARE) | \
2196 (1UL << SOCK_TIMESTAMPING_RAW_HARDWARE) | \ 2192 (1UL << SOCK_TIMESTAMPING_RAW_HARDWARE))
2197 (1UL << SOCK_TIMESTAMPING_SYS_HARDWARE))
2198 2193
2199 if (sk->sk_flags & FLAGS_TS_OR_DROPS) 2194 if (sk->sk_flags & FLAGS_TS_OR_DROPS)
2200 __sock_recv_ts_and_drops(msg, sk, skb); 2195 __sock_recv_ts_and_drops(msg, sk, skb);
diff --git a/net/core/sock.c b/net/core/sock.c
index ca9b65199d28..134291d73fcd 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -862,8 +862,6 @@ set_rcvbuf:
862 (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE)); 862 (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE));
863 sock_valbool_flag(sk, SOCK_TIMESTAMPING_SOFTWARE, 863 sock_valbool_flag(sk, SOCK_TIMESTAMPING_SOFTWARE,
864 val & SOF_TIMESTAMPING_SOFTWARE); 864 val & SOF_TIMESTAMPING_SOFTWARE);
865 sock_valbool_flag(sk, SOCK_TIMESTAMPING_SYS_HARDWARE,
866 val & SOF_TIMESTAMPING_SYS_HARDWARE);
867 sock_valbool_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE, 865 sock_valbool_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE,
868 val & SOF_TIMESTAMPING_RAW_HARDWARE); 866 val & SOF_TIMESTAMPING_RAW_HARDWARE);
869 break; 867 break;
@@ -1102,8 +1100,6 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
1102 v.val |= SOF_TIMESTAMPING_RX_SOFTWARE; 1100 v.val |= SOF_TIMESTAMPING_RX_SOFTWARE;
1103 if (sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE)) 1101 if (sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE))
1104 v.val |= SOF_TIMESTAMPING_SOFTWARE; 1102 v.val |= SOF_TIMESTAMPING_SOFTWARE;
1105 if (sock_flag(sk, SOCK_TIMESTAMPING_SYS_HARDWARE))
1106 v.val |= SOF_TIMESTAMPING_SYS_HARDWARE;
1107 if (sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE)) 1103 if (sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE))
1108 v.val |= SOF_TIMESTAMPING_RAW_HARDWARE; 1104 v.val |= SOF_TIMESTAMPING_RAW_HARDWARE;
1109 break; 1105 break;
diff --git a/net/socket.c b/net/socket.c
index abf56b2a14f9..d8222c025061 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -725,14 +725,10 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
725 if (sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE) && 725 if (sock_flag(sk, SOCK_TIMESTAMPING_SOFTWARE) &&
726 ktime_to_timespec_cond(skb->tstamp, ts + 0)) 726 ktime_to_timespec_cond(skb->tstamp, ts + 0))
727 empty = 0; 727 empty = 0;
728 if (shhwtstamps) { 728 if (shhwtstamps &&
729 if (sock_flag(sk, SOCK_TIMESTAMPING_SYS_HARDWARE) && 729 sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE) &&
730 ktime_to_timespec_cond(shhwtstamps->syststamp, ts + 1)) 730 ktime_to_timespec_cond(shhwtstamps->hwtstamp, ts + 2))
731 empty = 0; 731 empty = 0;
732 if (sock_flag(sk, SOCK_TIMESTAMPING_RAW_HARDWARE) &&
733 ktime_to_timespec_cond(shhwtstamps->hwtstamp, ts + 2))
734 empty = 0;
735 }
736 if (!empty) 732 if (!empty)
737 put_cmsg(msg, SOL_SOCKET, 733 put_cmsg(msg, SOL_SOCKET,
738 SCM_TIMESTAMPING, sizeof(ts), &ts); 734 SCM_TIMESTAMPING, sizeof(ts), &ts);