Jason Xing wrote: > From: Jason Xing <kernelxing@xxxxxxxxxxx> > > Implement basic codes so that we later can easily add each tx points. > Introducing BPF_SOCK_OPS_ALL_CB_FLAGS used as a test statement can help use > control whether to output or not. > > Signed-off-by: Jason Xing <kernelxing@xxxxxxxxxxx> > --- > include/uapi/linux/bpf.h | 5 ++++- > net/core/skbuff.c | 18 ++++++++++++++++++ > tools/include/uapi/linux/bpf.h | 5 ++++- > 3 files changed, 26 insertions(+), 2 deletions(-) > > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h > index c6cd7c7aeeee..157e139ed6fc 100644 > --- a/include/uapi/linux/bpf.h > +++ b/include/uapi/linux/bpf.h > @@ -6900,8 +6900,11 @@ enum { > * options first before the BPF program does. > */ > BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG = (1<<6), > + /* Call bpf when the kernel is generating tx timestamps. > + */ > + BPF_SOCK_OPS_TX_TIMESTAMPING_OPT_CB_FLAG = (1<<7), > /* Mask of all currently supported cb flags */ > - BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7F, > + BPF_SOCK_OPS_ALL_CB_FLAGS = 0xFF, > }; > > /* List of known BPF sock_ops operators. > diff --git a/net/core/skbuff.c b/net/core/skbuff.c > index 74149dc4ee31..5ff1a91c1204 100644 > --- a/net/core/skbuff.c > +++ b/net/core/skbuff.c > @@ -5539,6 +5539,21 @@ void skb_complete_tx_timestamp(struct sk_buff *skb, > } > EXPORT_SYMBOL_GPL(skb_complete_tx_timestamp); > > +static bool bpf_skb_tstamp_tx(struct sock *sk, u32 scm_flag, > + struct skb_shared_hwtstamps *hwtstamps) > +{ > + struct tcp_sock *tp; > + > + if (!sk_is_tcp(sk)) > + return false; > + > + tp = tcp_sk(sk); > + if (BPF_SOCK_OPS_TEST_FLAG(tp, BPF_SOCK_OPS_TX_TIMESTAMPING_OPT_CB_FLAG)) > + return true; > + > + return false; > +} > + > void __skb_tstamp_tx(struct sk_buff *orig_skb, > const struct sk_buff *ack_skb, > struct skb_shared_hwtstamps *hwtstamps, > @@ -5551,6 +5566,9 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb, > if (!sk) > return; > > + if (bpf_skb_tstamp_tx(sk, tstype, hwtstamps)) > + return; > + Eventually, this whole feature could probably be behind a static_branch.