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 */
};
-#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