On Wed, Oct 9, 2024 at 2:56 AM Willem de Bruijn <willemdebruijn.kernel@xxxxxxxxx> wrote: > > Jason Xing wrote: > > From: Jason Xing <kernelxing@xxxxxxxxxxx> > > > > We can set OPT_ID|OPT_ID_TCP before we initialize the last skb > > from each sendmsg. We only set the socket once like how we use > > setsockopt() with OPT_ID|OPT_ID_TCP flags. > > > > Signed-off-by: Jason Xing <kernelxing@xxxxxxxxxxx> > > --- > > net/core/skbuff.c | 16 +++++++++++++--- > > net/ipv4/tcp.c | 19 +++++++++++++++---- > > 2 files changed, 28 insertions(+), 7 deletions(-) > > > > > @@ -491,10 +491,21 @@ static u32 bpf_tcp_tx_timestamp(struct sock *sk) > > if (!(flags & SOF_TIMESTAMPING_TX_RECORD_MASK)) > > return 0; > > > > + /* We require users to set both OPT_ID and OPT_ID_TCP flags > > + * together here, or else the key might be inaccurate. > > + */ > > + if (flags & SOF_TIMESTAMPING_OPT_ID && > > + flags & SOF_TIMESTAMPING_OPT_ID_TCP && > > + !(sk->sk_tsflags & (SOF_TIMESTAMPING_OPT_ID | SOF_TIMESTAMPING_OPT_ID_TCP))) { > > + atomic_set(&sk->sk_tskey, (tcp_sk(sk)->write_seq - copied)); > > + sk->sk_tsflags |= (SOF_TIMESTAMPING_OPT_ID | SOF_TIMESTAMPING_OPT_ID_TCP); > > So user and BPF admin conflict on both sk_tsflags and sktskey? > > I think BPF resetting this key, or incrementing it, may break user > expectations. Yes, when it comes to OPT_ID and OPT_ID_TCP, conflict could happen. The reason why I don't use it like BPF_SOCK_OPS_TS_SCHED_OPT_CB flags (which is set along with each last skb) is that OPT_ID logic is a little bit complex. If we want to avoid touching sk_tsflags field in struct sock, we have to re-implement a similiar logic as you've already done in these years. Now, this patch is easier but as you said it may "break" users... But I wonder if we can give the bpf program the first priority like what TCP_BPF_RTO_MIN does. TCP_BPF_RTO_MIN can override icsk_rto_min field in struct inet_connection_sock. Thanks, Jason