On Thu, Feb 13, 2025 at 7:19 AM Martin KaFai Lau <martin.lau@xxxxxxxxx> wrote: > > On 2/11/25 10:18 PM, Jason Xing wrote: > > Support sw SCM_TSTAMP_SND case for bpf timestamping. > > > > Add a new sock_ops callback, BPF_SOCK_OPS_TS_SW_OPT_CB. This > > callback will occur at the same timestamping point as the user > > space's software SCM_TSTAMP_SND. The BPF program can use it to > > get the same SCM_TSTAMP_SND timestamp without modifying the > > user-space application. > > > > Based on this patch, BPF program will get the software > > timestamp when the driver is ready to send the skb. In the > > sebsequent patch, the hardware timestamp will be supported. > > > > Signed-off-by: Jason Xing <kerneljasonxing@xxxxxxxxx> > > --- > > include/linux/skbuff.h | 2 +- > > include/uapi/linux/bpf.h | 4 ++++ > > net/core/skbuff.c | 9 ++++++++- > > tools/include/uapi/linux/bpf.h | 4 ++++ > > 4 files changed, 17 insertions(+), 2 deletions(-) > > > > diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h > > index 52f6e033e704..76582500c5ea 100644 > > --- a/include/linux/skbuff.h > > +++ b/include/linux/skbuff.h > > @@ -4568,7 +4568,7 @@ void skb_tstamp_tx(struct sk_buff *orig_skb, > > static inline void skb_tx_timestamp(struct sk_buff *skb) > > { > > skb_clone_tx_timestamp(skb); > > - if (skb_shinfo(skb)->tx_flags & SKBTX_SW_TSTAMP) > > + if (skb_shinfo(skb)->tx_flags & (SKBTX_SW_TSTAMP | SKBTX_BPF)) > > skb_tstamp_tx(skb, NULL); > > } > > > > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h > > index 68664ececdc0..b3bd92281084 100644 > > --- a/include/uapi/linux/bpf.h > > +++ b/include/uapi/linux/bpf.h > > @@ -7039,6 +7039,10 @@ enum { > > * dev layer when SK_BPF_CB_TX_TIMESTAMPING > > * feature is on. > > */ > > + BPF_SOCK_OPS_TS_SW_OPT_CB, /* Called when skb is about to send > > + * to the nic when SK_BPF_CB_TX_TIMESTAMPING > > + * feature is on. > > + */ > > }; > > > > /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect > > diff --git a/net/core/skbuff.c b/net/core/skbuff.c > > index 7bac5e950e3d..d80d2137692f 100644 > > --- a/net/core/skbuff.c > > +++ b/net/core/skbuff.c > > @@ -5557,6 +5557,7 @@ static bool skb_tstamp_tx_report_so_timestamping(struct sk_buff *skb, > > } > > > > static void skb_tstamp_tx_report_bpf_timestamping(struct sk_buff *skb, > > + struct skb_shared_hwtstamps *hwts, > > s/hwts/hwtstamps/ > Use the same argument name as all other functions in this file. Its caller is > using hwtstamps as the argument name also. Easier to follow. > > Probably the same for the skb_tstamp_tx_report_so_timestamping(). Got it. Next version will include this modification. Thanks, Jason > > > struct sock *sk, > > int tstype) > > { > > @@ -5566,6 +5567,11 @@ static void skb_tstamp_tx_report_bpf_timestamping(struct sk_buff *skb, > > case SCM_TSTAMP_SCHED: > > op = BPF_SOCK_OPS_TS_SCHED_OPT_CB; > > break; > > + case SCM_TSTAMP_SND: > > + if (hwts) > > + return; > > + op = BPF_SOCK_OPS_TS_SW_OPT_CB; > > + break; > > default: > > return; > > } > > @@ -5586,7 +5592,8 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb, > > return; > > > > if (skb_shinfo(orig_skb)->tx_flags & SKBTX_BPF) > > - skb_tstamp_tx_report_bpf_timestamping(orig_skb, sk, tstype); > > + skb_tstamp_tx_report_bpf_timestamping(orig_skb, hwtstamps, > > + sk, tstype); > > > > if (!skb_tstamp_tx_report_so_timestamping(orig_skb, hwtstamps, tstype)) > > return; > > diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h > > index eed91b7296b7..9bd1c7c77b17 100644 > > --- a/tools/include/uapi/linux/bpf.h > > +++ b/tools/include/uapi/linux/bpf.h > > @@ -7029,6 +7029,10 @@ enum { > > * dev layer when SK_BPF_CB_TX_TIMESTAMPING > > * feature is on. > > */ > > + BPF_SOCK_OPS_TS_SW_OPT_CB, /* Called when skb is about to send > > + * to the nic when SK_BPF_CB_TX_TIMESTAMPING > > + * feature is on. > > + */ > > }; > > > > /* List of TCP states. There is a build check in net/ipv4/tcp.c to detect >