Introduce the callback to correlate tcp_sendmsg timestamp with other points, like SND/SW/ACK. let bpf prog trace the beginning of tcp_sendmsg_locked() and then store the sendmsg timestamp at the bpf_sk_storage, so that in tcp_tx_timestamp() we can correlate the timestamp with tskey which can be found in other sending points. More details can be found in the selftest: The selftest uses the bpf_sk_storage to store the sendmsg timestamp at fentry/tcp_sendmsg_locked and retrieves it back at tcp_tx_timestamp (i.e. BPF_SOCK_OPS_TS_SND_CB added in this patch). Signed-off-by: Jason Xing <kerneljasonxing@xxxxxxxxx> --- include/uapi/linux/bpf.h | 7 +++++++ net/ipv4/tcp.c | 1 + tools/include/uapi/linux/bpf.h | 7 +++++++ 3 files changed, 15 insertions(+) diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 800122a8abe5..accb3b314fff 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -7052,6 +7052,13 @@ enum { * when SK_BPF_CB_TX_TIMESTAMPING * feature is on. */ + BPF_SOCK_OPS_TS_SND_CB, /* Called when every sendmsg syscall + * is triggered. For TCP, it stays + * in the last send process to + * correlate with tcp_sendmsg timestamp + * with other timestamping callbacks, + * like SND/SW/ACK. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 3df802410ebf..a2ac57543b6d 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -501,6 +501,7 @@ static void tcp_tx_timestamp(struct sock *sk, struct sockcm_cookie *sockc) tcb->txstamp_ack_bpf = 1; shinfo->tx_flags |= SKBTX_BPF; shinfo->tskey = TCP_SKB_CB(skb)->seq + skb->len - 1; + bpf_skops_tx_timestamping(sk, skb, BPF_SOCK_OPS_TS_SND_CB); } } diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h index 06e68d772989..384502996cdd 100644 --- a/tools/include/uapi/linux/bpf.h +++ b/tools/include/uapi/linux/bpf.h @@ -7045,6 +7045,13 @@ enum { * when SK_BPF_CB_TX_TIMESTAMPING * feature is on. */ + BPF_SOCK_OPS_TS_SND_CB, /* Called when every sendmsg syscall + * is triggered. For TCP, it stays + * in the last send process to + * correlate with tcp_sendmsg timestamp + * with other timestamping callbacks, + * like SND/SW/ACK. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect -- 2.43.5