diff options
author | Soheil Hassas Yeganeh <soheil@google.com> | 2016-04-02 23:08:12 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-04-04 15:50:30 -0400 |
commit | c14ac9451c34832554db33386a4393be8bba3a7b (patch) | |
tree | 99f4d7c46d01732fcbfdf8de89e1d9846d56c3b3 /net/socket.c | |
parent | ad1e46a837163a3e7160a1250825bcfafd2e714b (diff) |
sock: enable timestamping using control messages
Currently, SOL_TIMESTAMPING can only be enabled using setsockopt.
This is very costly when users want to sample writes to gather
tx timestamps.
Add support for enabling SO_TIMESTAMPING via control messages by
using tsflags added in `struct sockcm_cookie` (added in the previous
patches in this series) to set the tx_flags of the last skb created in
a sendmsg. With this patch, the timestamp recording bits in tx_flags
of the skbuff is overridden if SO_TIMESTAMPING is passed in a cmsg.
Please note that this is only effective for overriding the recording
timestamps flags. Users should enable timestamp reporting (e.g.,
SOF_TIMESTAMPING_SOFTWARE | SOF_TIMESTAMPING_OPT_ID) using
socket options and then should ask for SOF_TIMESTAMPING_TX_*
using control messages per sendmsg to sample timestamps for each
write.
Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com>
Acked-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/socket.c')
-rw-r--r-- | net/socket.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/net/socket.c b/net/socket.c index 5f77a8e93830..979d3146b081 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -587,20 +587,20 @@ void sock_release(struct socket *sock) | |||
587 | } | 587 | } |
588 | EXPORT_SYMBOL(sock_release); | 588 | EXPORT_SYMBOL(sock_release); |
589 | 589 | ||
590 | void __sock_tx_timestamp(const struct sock *sk, __u8 *tx_flags) | 590 | void __sock_tx_timestamp(__u16 tsflags, __u8 *tx_flags) |
591 | { | 591 | { |
592 | u8 flags = *tx_flags; | 592 | u8 flags = *tx_flags; |
593 | 593 | ||
594 | if (sk->sk_tsflags & SOF_TIMESTAMPING_TX_HARDWARE) | 594 | if (tsflags & SOF_TIMESTAMPING_TX_HARDWARE) |
595 | flags |= SKBTX_HW_TSTAMP; | 595 | flags |= SKBTX_HW_TSTAMP; |
596 | 596 | ||
597 | if (sk->sk_tsflags & SOF_TIMESTAMPING_TX_SOFTWARE) | 597 | if (tsflags & SOF_TIMESTAMPING_TX_SOFTWARE) |
598 | flags |= SKBTX_SW_TSTAMP; | 598 | flags |= SKBTX_SW_TSTAMP; |
599 | 599 | ||
600 | if (sk->sk_tsflags & SOF_TIMESTAMPING_TX_SCHED) | 600 | if (tsflags & SOF_TIMESTAMPING_TX_SCHED) |
601 | flags |= SKBTX_SCHED_TSTAMP; | 601 | flags |= SKBTX_SCHED_TSTAMP; |
602 | 602 | ||
603 | if (sk->sk_tsflags & SOF_TIMESTAMPING_TX_ACK) | 603 | if (tsflags & SOF_TIMESTAMPING_TX_ACK) |
604 | flags |= SKBTX_ACK_TSTAMP; | 604 | flags |= SKBTX_ACK_TSTAMP; |
605 | 605 | ||
606 | *tx_flags = flags; | 606 | *tx_flags = flags; |