Skip to content

Commit 97b1ebb

Browse files
committed
Merge branch 'net-timestamp-introduce-a-flag-to-filter-out-rx-software-and-hardware-report'
Jason Xing says: ==================== net-timestamp: introduce a flag to filter out rx software and hardware report When one socket is set SOF_TIMESTAMPING_RX_SOFTWARE which means the whole system turns on the netstamp_needed_key button, other sockets that only have SOF_TIMESTAMPING_SOFTWARE will be affected and then print the rx timestamp information even without setting SOF_TIMESTAMPING_RX_SOFTWARE generation flag. How to solve it without breaking users? We introduce a new flag named SOF_TIMESTAMPING_OPT_RX_FILTER. Using it together with SOF_TIMESTAMPING_SOFTWARE can stop reporting the rx software timestamp. Similarly, we also filter out the hardware case where one process enables the rx hardware generation flag, then another process only passing SOF_TIMESTAMPING_RAW_HARDWARE gets the timestamp. So we can set both SOF_TIMESTAMPING_RAW_HARDWARE and SOF_TIMESTAMPING_OPT_RX_FILTER to stop reporting rx hardware timestamp after this patch applied. v6: https://lore.kernel.org/[email protected] v5: https://lore.kernel.org/[email protected] v4: https://lore.kernel.org/[email protected] v3: https://lore.kernel.org/[email protected] v2: https://lore.kernel.org/[email protected] ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents e503f82 + fffe8ef commit 97b1ebb

File tree

6 files changed

+53
-5
lines changed

6 files changed

+53
-5
lines changed

Documentation/networking/timestamping.rst

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,23 @@ SOF_TIMESTAMPING_OPT_TX_SWHW:
267267
two separate messages will be looped to the socket's error queue,
268268
each containing just one timestamp.
269269

270+
SOF_TIMESTAMPING_OPT_RX_FILTER:
271+
Filter out spurious receive timestamps: report a receive timestamp
272+
only if the matching timestamp generation flag is enabled.
273+
274+
Receive timestamps are generated early in the ingress path, before a
275+
packet's destination socket is known. If any socket enables receive
276+
timestamps, packets for all socket will receive timestamped packets.
277+
Including those that request timestamp reporting with
278+
SOF_TIMESTAMPING_SOFTWARE and/or SOF_TIMESTAMPING_RAW_HARDWARE, but
279+
do not request receive timestamp generation. This can happen when
280+
requesting transmit timestamps only.
281+
282+
Receiving spurious timestamps is generally benign. A process can
283+
ignore the unexpected non-zero value. But it makes behavior subtly
284+
dependent on other sockets. This flag isolates the socket for more
285+
deterministic behavior.
286+
270287
New applications are encouraged to pass SOF_TIMESTAMPING_OPT_ID to
271288
disambiguate timestamps and SOF_TIMESTAMPING_OPT_TSONLY to operate
272289
regardless of the setting of sysctl net.core.tstamp_allow_data.

include/uapi/linux/net_tstamp.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,9 @@ enum {
3232
SOF_TIMESTAMPING_OPT_TX_SWHW = (1<<14),
3333
SOF_TIMESTAMPING_BIND_PHC = (1 << 15),
3434
SOF_TIMESTAMPING_OPT_ID_TCP = (1 << 16),
35+
SOF_TIMESTAMPING_OPT_RX_FILTER = (1 << 17),
3536

36-
SOF_TIMESTAMPING_LAST = SOF_TIMESTAMPING_OPT_ID_TCP,
37+
SOF_TIMESTAMPING_LAST = SOF_TIMESTAMPING_OPT_RX_FILTER,
3738
SOF_TIMESTAMPING_MASK = (SOF_TIMESTAMPING_LAST - 1) |
3839
SOF_TIMESTAMPING_LAST
3940
};

net/ethtool/common.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,7 @@ const char sof_timestamping_names[][ETH_GSTRING_LEN] = {
427427
[const_ilog2(SOF_TIMESTAMPING_OPT_TX_SWHW)] = "option-tx-swhw",
428428
[const_ilog2(SOF_TIMESTAMPING_BIND_PHC)] = "bind-phc",
429429
[const_ilog2(SOF_TIMESTAMPING_OPT_ID_TCP)] = "option-id-tcp",
430+
[const_ilog2(SOF_TIMESTAMPING_OPT_RX_FILTER)] = "option-rx-filter",
430431
};
431432
static_assert(ARRAY_SIZE(sof_timestamping_names) == __SOF_TIMESTAMPING_CNT);
432433

net/ipv4/tcp.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2235,6 +2235,7 @@ void tcp_recv_timestamp(struct msghdr *msg, const struct sock *sk,
22352235
struct scm_timestamping_internal *tss)
22362236
{
22372237
int new_tstamp = sock_flag(sk, SOCK_TSTAMP_NEW);
2238+
u32 tsflags = READ_ONCE(sk->sk_tsflags);
22382239
bool has_timestamping = false;
22392240

22402241
if (tss->ts[0].tv_sec || tss->ts[0].tv_nsec) {
@@ -2274,14 +2275,18 @@ void tcp_recv_timestamp(struct msghdr *msg, const struct sock *sk,
22742275
}
22752276
}
22762277

2277-
if (READ_ONCE(sk->sk_tsflags) & SOF_TIMESTAMPING_SOFTWARE)
2278+
if (tsflags & SOF_TIMESTAMPING_SOFTWARE &&
2279+
(tsflags & SOF_TIMESTAMPING_RX_SOFTWARE ||
2280+
!(tsflags & SOF_TIMESTAMPING_OPT_RX_FILTER)))
22782281
has_timestamping = true;
22792282
else
22802283
tss->ts[0] = (struct timespec64) {0};
22812284
}
22822285

22832286
if (tss->ts[2].tv_sec || tss->ts[2].tv_nsec) {
2284-
if (READ_ONCE(sk->sk_tsflags) & SOF_TIMESTAMPING_RAW_HARDWARE)
2287+
if (tsflags & SOF_TIMESTAMPING_RAW_HARDWARE &&
2288+
(tsflags & SOF_TIMESTAMPING_RX_HARDWARE ||
2289+
!(tsflags & SOF_TIMESTAMPING_OPT_RX_FILTER)))
22852290
has_timestamping = true;
22862291
else
22872292
tss->ts[2] = (struct timespec64) {0};

net/socket.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -946,11 +946,17 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,
946946

947947
memset(&tss, 0, sizeof(tss));
948948
tsflags = READ_ONCE(sk->sk_tsflags);
949-
if ((tsflags & SOF_TIMESTAMPING_SOFTWARE) &&
949+
if ((tsflags & SOF_TIMESTAMPING_SOFTWARE &&
950+
(tsflags & SOF_TIMESTAMPING_RX_SOFTWARE ||
951+
skb_is_err_queue(skb) ||
952+
!(tsflags & SOF_TIMESTAMPING_OPT_RX_FILTER))) &&
950953
ktime_to_timespec64_cond(skb->tstamp, tss.ts + 0))
951954
empty = 0;
952955
if (shhwtstamps &&
953-
(tsflags & SOF_TIMESTAMPING_RAW_HARDWARE) &&
956+
(tsflags & SOF_TIMESTAMPING_RAW_HARDWARE &&
957+
(tsflags & SOF_TIMESTAMPING_RX_HARDWARE ||
958+
skb_is_err_queue(skb) ||
959+
!(tsflags & SOF_TIMESTAMPING_OPT_RX_FILTER))) &&
954960
!skb_is_swtx_tstamp(skb, false_tstamp)) {
955961
if_index = 0;
956962
if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP_NETDEV)

tools/testing/selftests/net/rxtimestamp.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ static struct sof_flag sof_flags[] = {
5757
SOF_FLAG(SOF_TIMESTAMPING_SOFTWARE),
5858
SOF_FLAG(SOF_TIMESTAMPING_RX_SOFTWARE),
5959
SOF_FLAG(SOF_TIMESTAMPING_RX_HARDWARE),
60+
SOF_FLAG(SOF_TIMESTAMPING_OPT_RX_FILTER),
61+
SOF_FLAG(SOF_TIMESTAMPING_RAW_HARDWARE),
6062
};
6163

6264
static struct socket_type socket_types[] = {
@@ -97,6 +99,22 @@ static struct test_case test_cases[] = {
9799
| SOF_TIMESTAMPING_RX_HARDWARE },
98100
{}
99101
},
102+
{
103+
{ .so_timestamping = SOF_TIMESTAMPING_RAW_HARDWARE
104+
| SOF_TIMESTAMPING_OPT_RX_FILTER },
105+
{}
106+
},
107+
{
108+
{ .so_timestamping = SOF_TIMESTAMPING_SOFTWARE
109+
| SOF_TIMESTAMPING_OPT_RX_FILTER },
110+
{}
111+
},
112+
{
113+
{ .so_timestamping = SOF_TIMESTAMPING_SOFTWARE
114+
| SOF_TIMESTAMPING_RX_SOFTWARE
115+
| SOF_TIMESTAMPING_OPT_RX_FILTER },
116+
{ .swtstamp = true }
117+
},
100118
{
101119
{ .so_timestamping = SOF_TIMESTAMPING_SOFTWARE
102120
| SOF_TIMESTAMPING_RX_SOFTWARE },

0 commit comments

Comments
 (0)