[PATCH net-next v2 4/6] bpf: add BPF_SOCK_OPS_TSTAMP_RCV_CB callback
From: Jason Xing <hidden>
Date: 2026-05-21 13:53:42
Also in:
bpf
Subsystem:
bpf [general] (safe dynamic programs and tools), networking [general], networking [sockets], the rest · Maintainers:
Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko, Eduard Zingerman, Kumar Kartikeya Dwivedi, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Kuniyuki Iwashima, Willem de Bruijn, Linus Torvalds
From: Jason Xing <kernelxing@tencent.com> This is the prep patch adding BPF_SOCK_OPS_TSTAMP_RCV_CB cb and the rx tunnel to allow kernel to report timestamps. It's possible to have both software and hardware timestamps in the last skb from this recv syscall, so the tunnel bpf_skops_rx_timestamping() supports four slots to record and report. Signed-off-by: Jason Xing <kernelxing@tencent.com> --- include/net/sock.h | 6 ++++++ include/uapi/linux/bpf.h | 5 +++++ net/core/sock.c | 18 ++++++++++++++++++ tools/include/uapi/linux/bpf.h | 5 +++++ 4 files changed, 34 insertions(+)
diff --git a/include/net/sock.h b/include/net/sock.h
index cf0e82e46482..14945cd69c84 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h@@ -3138,10 +3138,16 @@ int sock_set_timestamping(struct sock *sk, int optname, #if defined(CONFIG_CGROUP_BPF) void bpf_skops_tx_timestamping(struct sock *sk, struct sk_buff *skb, int op); +void bpf_skops_rx_timestamping(struct sock *sk, + struct scm_timestamping_internal *tss, int op); #else static inline void bpf_skops_tx_timestamping(struct sock *sk, struct sk_buff *skb, int op) { } +static inline void bpf_skops_rx_timestamping(struct sock *sk, + struct scm_timestamping_internal *tss, int op) +{ +} #endif void sock_no_linger(struct sock *sk); void sock_set_keepalive(struct sock *sk);
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index 1e09b5cd7a39..113a2a72cbf4 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h@@ -7169,6 +7169,11 @@ enum { * sendmsg timestamp with corresponding * tskey. */ + BPF_SOCK_OPS_TSTAMP_RCV_CB, /* Called in tcp_recvmsg() to record + * sw/hw timestamp of the last skb + * after receiving all the data when + * SK_BPF_CB_RX_TIMESTAMPING is on. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect
diff --git a/net/core/sock.c b/net/core/sock.c
index f3d78da3aeba..81a234e10fd3 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c@@ -952,6 +952,24 @@ void bpf_skops_tx_timestamping(struct sock *sk, struct sk_buff *skb, int op) bpf_skops_init_skb(&sock_ops, skb, 0); __cgroup_bpf_run_filter_sock_ops(sk, &sock_ops, CGROUP_SOCK_OPS); } + +void bpf_skops_rx_timestamping(struct sock *sk, + struct scm_timestamping_internal *tss, int op) +{ + struct bpf_sock_ops_kern sock_ops; + u64 sw_tstamp = ktime_to_ns(tss->ts[0]); + u64 hw_tstamp = ktime_to_ns(tss->ts[2]); + + memset(&sock_ops, 0, offsetof(struct bpf_sock_ops_kern, temp)); + sock_ops.op = op; + sock_ops.is_fullsock = 1; + sock_ops.sk = sk; + sock_ops.args[0] = (u32)sw_tstamp; + sock_ops.args[1] = (u32)(sw_tstamp >> 32); + sock_ops.args[2] = (u32)hw_tstamp; + sock_ops.args[3] = (u32)(hw_tstamp >> 32); + __cgroup_bpf_run_filter_sock_ops(sk, &sock_ops, CGROUP_SOCK_OPS); +} #endif void sock_set_keepalive(struct sock *sk)
diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
index 677be9a47347..483ff4497d51 100644
--- a/tools/include/uapi/linux/bpf.h
+++ b/tools/include/uapi/linux/bpf.h@@ -7168,6 +7168,11 @@ enum { * sendmsg timestamp with corresponding * tskey. */ + BPF_SOCK_OPS_TSTAMP_RCV_CB, /* Called in tcp_recvmsg() to record + * sw/hw timestamp of the last skb + * after receiving all the data when + * SK_BPF_CB_RX_TIMESTAMPING is on. + */ }; /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect
--
2.43.7