Skip to content

Commit

Permalink
net-timestamp: COMPLETION timestamp on packet tx completion
Browse files Browse the repository at this point in the history
Add SOF_TIMESTAMPING_TX_COMPLETION, for requesting a software timestamp
when hardware reports a packet completed.

Completion tstamp is useful for Bluetooth, as hardware timestamps do not
exist in the HCI specification except for ISO packets, and the hardware
has a queue where packets may wait.  In this case the software SND
timestamp only reflects the kernel-side part of the total latency
(usually small) and queue length (usually 0 unless HW buffers
congested), whereas the completion report time is more informative of
the true latency.

It may also be useful in other cases where HW TX timestamps cannot be
obtained and user wants to estimate an upper bound to when the TX
probably happened.

Signed-off-by: Pauli Virtanen <pav@iki.fi>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
  • Loading branch information
Pauli Virtanen authored and Luiz Augusto von Dentz committed Mar 25, 2025
1 parent b257e02 commit 983e0e4
Show file tree
Hide file tree
Showing 7 changed files with 23 additions and 5 deletions.
8 changes: 8 additions & 0 deletions Documentation/networking/timestamping.rst
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,14 @@ SOF_TIMESTAMPING_TX_ACK:
cumulative acknowledgment. The mechanism ignores SACK and FACK.
This flag can be enabled via both socket options and control messages.

SOF_TIMESTAMPING_TX_COMPLETION:
Request tx timestamps on packet tx completion. The completion
timestamp is generated by the kernel when it receives packet a
completion report from the hardware. Hardware may report multiple
packets at once, and completion timestamps reflect the timing of the
report and not actual tx time. This flag can be enabled via both
socket options and control messages.


1.3.2 Timestamp Reporting
^^^^^^^^^^^^^^^^^^^^^^^^^
Expand Down
7 changes: 4 additions & 3 deletions include/linux/skbuff.h
Original file line number Diff line number Diff line change
Expand Up @@ -478,8 +478,8 @@ enum {
/* device driver is going to provide hardware time stamp */
SKBTX_IN_PROGRESS = 1 << 2,

/* reserved */
SKBTX_RESERVED = 1 << 3,
/* generate software time stamp on packet tx completion */
SKBTX_COMPLETION_TSTAMP = 1 << 3,

/* generate wifi status information (where possible) */
SKBTX_WIFI_STATUS = 1 << 4,
Expand All @@ -498,7 +498,8 @@ enum {

#define SKBTX_ANY_SW_TSTAMP (SKBTX_SW_TSTAMP | \
SKBTX_SCHED_TSTAMP | \
SKBTX_BPF)
SKBTX_BPF | \
SKBTX_COMPLETION_TSTAMP)
#define SKBTX_ANY_TSTAMP (SKBTX_HW_TSTAMP | \
SKBTX_ANY_SW_TSTAMP)

Expand Down
1 change: 1 addition & 0 deletions include/uapi/linux/errqueue.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ enum {
SCM_TSTAMP_SND, /* driver passed skb to NIC, or HW */
SCM_TSTAMP_SCHED, /* data entered the packet scheduler */
SCM_TSTAMP_ACK, /* data acknowledged by peer */
SCM_TSTAMP_COMPLETION, /* packet tx completion */
};

#endif /* _UAPI_LINUX_ERRQUEUE_H */
6 changes: 4 additions & 2 deletions include/uapi/linux/net_tstamp.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,9 @@ enum {
SOF_TIMESTAMPING_BIND_PHC = (1 << 15),
SOF_TIMESTAMPING_OPT_ID_TCP = (1 << 16),
SOF_TIMESTAMPING_OPT_RX_FILTER = (1 << 17),
SOF_TIMESTAMPING_TX_COMPLETION = (1 << 18),

SOF_TIMESTAMPING_LAST = SOF_TIMESTAMPING_OPT_RX_FILTER,
SOF_TIMESTAMPING_LAST = SOF_TIMESTAMPING_TX_COMPLETION,
SOF_TIMESTAMPING_MASK = (SOF_TIMESTAMPING_LAST - 1) |
SOF_TIMESTAMPING_LAST
};
Expand All @@ -58,7 +59,8 @@ enum {
#define SOF_TIMESTAMPING_TX_RECORD_MASK (SOF_TIMESTAMPING_TX_HARDWARE | \
SOF_TIMESTAMPING_TX_SOFTWARE | \
SOF_TIMESTAMPING_TX_SCHED | \
SOF_TIMESTAMPING_TX_ACK)
SOF_TIMESTAMPING_TX_ACK | \
SOF_TIMESTAMPING_TX_COMPLETION)

/**
* struct so_timestamping - SO_TIMESTAMPING parameter
Expand Down
2 changes: 2 additions & 0 deletions net/core/skbuff.c
Original file line number Diff line number Diff line change
Expand Up @@ -5523,6 +5523,8 @@ static bool skb_tstamp_tx_report_so_timestamping(struct sk_buff *skb,
SKBTX_SW_TSTAMP);
case SCM_TSTAMP_ACK:
return TCP_SKB_CB(skb)->txstamp_ack & TSTAMP_ACK_SK;
case SCM_TSTAMP_COMPLETION:
return skb_shinfo(skb)->tx_flags & SKBTX_COMPLETION_TSTAMP;
}

return false;
Expand Down
1 change: 1 addition & 0 deletions net/ethtool/common.c
Original file line number Diff line number Diff line change
Expand Up @@ -476,6 +476,7 @@ const char sof_timestamping_names[][ETH_GSTRING_LEN] = {
[const_ilog2(SOF_TIMESTAMPING_BIND_PHC)] = "bind-phc",
[const_ilog2(SOF_TIMESTAMPING_OPT_ID_TCP)] = "option-id-tcp",
[const_ilog2(SOF_TIMESTAMPING_OPT_RX_FILTER)] = "option-rx-filter",
[const_ilog2(SOF_TIMESTAMPING_TX_COMPLETION)] = "tx-completion",
};
static_assert(ARRAY_SIZE(sof_timestamping_names) == __SOF_TIMESTAMPING_CNT);

Expand Down
3 changes: 3 additions & 0 deletions net/socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -689,6 +689,9 @@ void __sock_tx_timestamp(__u32 tsflags, __u8 *tx_flags)
if (tsflags & SOF_TIMESTAMPING_TX_SCHED)
flags |= SKBTX_SCHED_TSTAMP;

if (tsflags & SOF_TIMESTAMPING_TX_COMPLETION)
flags |= SKBTX_COMPLETION_TSTAMP;

*tx_flags = flags;
}
EXPORT_SYMBOL(__sock_tx_timestamp);
Expand Down

0 comments on commit 983e0e4

Please sign in to comment.