From: Jason Xing <kernelxing@xxxxxxxxxxx> Passing the hwtstamp to bpf prog which can print. Signed-off-by: Jason Xing <kernelxing@xxxxxxxxxxx> --- include/net/sock.h | 6 ++++-- net/core/skbuff.c | 17 +++++++++++++---- net/core/sock.c | 4 +++- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/include/net/sock.h b/include/net/sock.h index f88a00108a2f..9bc883573208 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -2921,9 +2921,11 @@ int sock_set_timestamping(struct sock *sk, int optname, void sock_enable_timestamps(struct sock *sk); #if defined(CONFIG_CGROUP_BPF) && defined(CONFIG_BPF_SYSCALL) -void bpf_skops_tx_timestamping(struct sock *sk, struct sk_buff *skb, int op); +void bpf_skops_tx_timestamping(struct sock *sk, struct sk_buff *skb, int op, + u32 nargs, u32 *args); #else -static inline void bpf_skops_tx_timestamping(struct sock *sk, struct sk_buff *skb, int op) +static inline void bpf_skops_tx_timestamping(struct sock *sk, struct sk_buff *skb, int op, + u32 nargs, u32 *args) { } #endif diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 48b0c71e9522..182a44815630 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -5539,8 +5539,12 @@ void skb_complete_tx_timestamp(struct sk_buff *skb, } EXPORT_SYMBOL_GPL(skb_complete_tx_timestamp); -static void __skb_tstamp_tx_bpf(struct sock *sk, struct sk_buff *skb, int tstype) +static void __skb_tstamp_tx_bpf(struct sock *sk, struct sk_buff *skb, + struct skb_shared_hwtstamps *hwtstamps, + int tstype) { + struct timespec64 tstamp; + u32 args[2] = {0, 0}; int op; if (!sk) @@ -5552,6 +5556,11 @@ static void __skb_tstamp_tx_bpf(struct sock *sk, struct sk_buff *skb, int tstype break; case SCM_TSTAMP_SND: op = BPF_SOCK_OPS_TS_SW_OPT_CB; + if (hwtstamps) { + tstamp = ktime_to_timespec64(hwtstamps->hwtstamp); + args[0] = tstamp.tv_sec; + args[1] = tstamp.tv_nsec; + } break; case SCM_TSTAMP_ACK: op = BPF_SOCK_OPS_TS_ACK_OPT_CB; @@ -5560,7 +5569,7 @@ static void __skb_tstamp_tx_bpf(struct sock *sk, struct sk_buff *skb, int tstype return; } - bpf_skops_tx_timestamping(sk, skb, op); + bpf_skops_tx_timestamping(sk, skb, op, 2, args); } static void skb_tstamp_tx_output(struct sk_buff *orig_skb, @@ -5651,7 +5660,7 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb, if (unlikely(skb_tstamp_is_set(orig_skb, tstype, false))) skb_tstamp_tx_output(orig_skb, ack_skb, hwtstamps, sk, tstype); if (unlikely(skb_tstamp_is_set(orig_skb, tstype, true))) - __skb_tstamp_tx_bpf(sk, orig_skb, tstype); + __skb_tstamp_tx_bpf(sk, orig_skb, hwtstamps, tstype); } EXPORT_SYMBOL_GPL(__skb_tstamp_tx); @@ -5662,7 +5671,7 @@ void skb_tstamp_tx(struct sk_buff *orig_skb, skb_tstamp_tx_output(orig_skb, NULL, hwtstamps, orig_skb->sk, tstype); if (unlikely(skb_tstamp_is_set(orig_skb, tstype, true))) - __skb_tstamp_tx_bpf(orig_skb->sk, orig_skb, tstype); + __skb_tstamp_tx_bpf(orig_skb->sk, orig_skb, hwtstamps, tstype); } EXPORT_SYMBOL_GPL(skb_tstamp_tx); diff --git a/net/core/sock.c b/net/core/sock.c index 79cb5c74c76c..504939bafe0c 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -942,7 +942,8 @@ int sock_set_timestamping(struct sock *sk, int optname, } #if defined(CONFIG_CGROUP_BPF) && defined(CONFIG_BPF_SYSCALL) -void bpf_skops_tx_timestamping(struct sock *sk, struct sk_buff *skb, int op) +void bpf_skops_tx_timestamping(struct sock *sk, struct sk_buff *skb, int op, + u32 nargs, u32 *args) { struct bpf_sock_ops_kern sock_ops; @@ -952,6 +953,7 @@ void bpf_skops_tx_timestamping(struct sock *sk, struct sk_buff *skb, int op) sock_ops.op = op; sock_ops.is_fullsock = 1; sock_ops.sk = sk; + memcpy(sock_ops.args, args, nargs * sizeof(*args)); __cgroup_bpf_run_filter_sock_ops(sk, &sock_ops, CGROUP_SOCK_OPS); } #endif -- 2.37.3