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>
This commit is contained in:

committed by
David S. Miller

szülő
ad1e46a837
commit
c14ac9451c
@@ -1248,7 +1248,7 @@ do_udp_sendmsg:
|
||||
fl6.flowi6_oif = np->sticky_pktinfo.ipi6_ifindex;
|
||||
|
||||
fl6.flowi6_mark = sk->sk_mark;
|
||||
sockc.tsflags = 0;
|
||||
sockc.tsflags = sk->sk_tsflags;
|
||||
|
||||
if (msg->msg_controllen) {
|
||||
opt = &opt_space;
|
||||
@@ -1324,7 +1324,7 @@ back_from_confirm:
|
||||
skb = ip6_make_skb(sk, getfrag, msg, ulen,
|
||||
sizeof(struct udphdr), hlimit, tclass, opt,
|
||||
&fl6, (struct rt6_info *)dst,
|
||||
msg->msg_flags, dontfrag);
|
||||
msg->msg_flags, dontfrag, &sockc);
|
||||
err = PTR_ERR(skb);
|
||||
if (!IS_ERR_OR_NULL(skb))
|
||||
err = udp_v6_send_skb(skb, &fl6);
|
||||
@@ -1351,7 +1351,8 @@ do_append_data:
|
||||
err = ip6_append_data(sk, getfrag, msg, ulen,
|
||||
sizeof(struct udphdr), hlimit, tclass, opt, &fl6,
|
||||
(struct rt6_info *)dst,
|
||||
corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags, dontfrag);
|
||||
corkreq ? msg->msg_flags|MSG_MORE : msg->msg_flags, dontfrag,
|
||||
&sockc);
|
||||
if (err)
|
||||
udp_v6_flush_pending_frames(sk);
|
||||
else if (!corkreq)
|
||||
|
Reference in New Issue
Block a user