Re: [PATCH net-next v2 3/6] bpf: support bpf_setsockopt for bpf timestamping rx feature
From: Kuniyuki Iwashima <kuniyu@google.com>
Date: 2026-05-23 04:02:49
Also in:
bpf
On Thu, May 21, 2026 at 6:53 AM Jason Xing [off-list ref] wrote:
quoted hunk ↗ jump to hunk
From: Jason Xing <kernelxing@tencent.com> Add SK_BPF_CB_RX_TIMESTAMPING callback flag to enable RX timestamping via bpf_setsockopt(SK_BPF_CB_FLAGS). Add SOCK_BPF_TIMESTAMPING_RX into enum sock_flags that is used as centralized management of net_enable/disable_timestamp. Note that only one of them (timestamp, so_timestamping and bpf timestamping rx) can enable and disable the global time record of skbs. In addition, include SOCK_BPF_TIMESTAMPING_RX in SK_FLAGS_TIMESTAMP so that __sk_destruct() calling sock_disable_timestamp() to thoroughly turn off the global time record. Signed-off-by: Jason Xing <kernelxing@tencent.com> --- include/net/sock.h | 5 ++++- include/uapi/linux/bpf.h | 5 +++-- net/core/filter.c | 8 ++++++++ 3 files changed, 15 insertions(+), 3 deletions(-)diff --git a/include/net/sock.h b/include/net/sock.h index a579d5b09207..cf0e82e46482 100644 --- a/include/net/sock.h +++ b/include/net/sock.h@@ -1022,9 +1022,12 @@ enum sock_flags { SOCK_RCVMARK, /* Receive SO_MARK ancillary data with packet */ SOCK_RCVPRIORITY, /* Receive SO_PRIORITY ancillary data with packet */ SOCK_TIMESTAMPING_ANY, /* Copy of sk_tsflags & TSFLAGS_ANY */ + SOCK_BPF_TIMESTAMPING_RX, /* BPF RX timestamping enabled */
Just a note, this will be the last bit on 32bit kernel.
quoted hunk ↗ jump to hunk
}; -#define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE)) +#define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | \ + (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE) | \ + (1UL << SOCK_BPF_TIMESTAMPING_RX)) /* * The highest bit of sk_tsflags is reserved for kernel-internal * SOCKCM_FLAG_TS_OPT_ID. There is a check in core/sock.c to control thatdiff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index 552bc5d9afbd..1e09b5cd7a39 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h@@ -7029,8 +7029,9 @@ enum { enum { SK_BPF_CB_TX_TIMESTAMPING = 1<<0, - SK_BPF_CB_MASK = (SK_BPF_CB_TX_TIMESTAMPING - 1) | - SK_BPF_CB_TX_TIMESTAMPING + SK_BPF_CB_RX_TIMESTAMPING = 1<<1, + SK_BPF_CB_MASK = (SK_BPF_CB_RX_TIMESTAMPING - 1) | + SK_BPF_CB_RX_TIMESTAMPING }; /* List of known BPF sock_ops operators.diff --git a/net/core/filter.c b/net/core/filter.c index 9590877b0714..08ad102f204e 100644 --- a/net/core/filter.c +++ b/net/core/filter.c@@ -5304,6 +5304,14 @@ static int sk_bpf_set_get_cb_flags(struct sock *sk, char *optval, bool getopt) if (sk_bpf_cb_flags & ~SK_BPF_CB_MASK) return -EINVAL; + if ((sk_bpf_cb_flags ^ sk->sk_bpf_cb_flags) & SK_BPF_CB_RX_TIMESTAMPING) { + if (sk_bpf_cb_flags & SK_BPF_CB_RX_TIMESTAMPING) + sock_enable_timestamp(sk, SOCK_BPF_TIMESTAMPING_RX); + else + sock_disable_timestamp(sk, + (1UL << SOCK_BPF_TIMESTAMPING_RX)); + } + sk->sk_bpf_cb_flags = sk_bpf_cb_flags; return 0; --2.43.7