From: Jason Xing <kernelxing@xxxxxxxxxxx> It's time to let bpf extension feature work. I extracted the part of logic from tcp_tx_timestamp() for bpf extension use, like TX timestamp flags. Signed-off-by: Jason Xing <kernelxing@xxxxxxxxxxx> --- net/ipv4/tcp.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 6c8968eb4427..d37e231b2737 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -477,11 +477,31 @@ void tcp_init_sock(struct sock *sk) } EXPORT_SYMBOL(tcp_init_sock); +static void bpf_tx_timestamp(struct sock *sk, struct sk_buff *skb) +{ + u32 tsflags = READ_ONCE(sk->sk_tsflags[BPFPROG_TS_REQUESTOR]); + + if (tsflags && skb) { + struct skb_shared_info *shinfo = skb_shinfo(skb); + struct tcp_skb_cb *tcb = TCP_SKB_CB(skb); + + __sock_tx_timestamp(tsflags, &shinfo->tx_flags); + + if (tsflags & SOF_TIMESTAMPING_TX_ACK) + tcb->txstamp_ack = 1; + if (tsflags & SOF_TIMESTAMPING_TX_RECORD_MASK) + shinfo->tskey = TCP_SKB_CB(skb)->seq + skb->len - 1; + } +} + static void tcp_tx_timestamp(struct sock *sk, struct sockcm_cookie *sockc) { struct sk_buff *skb = tcp_write_queue_tail(sk); u32 tsflags = sockc->tsflags; + if (static_branch_unlikely(&bpf_tstamp_control)) + bpf_tx_timestamp(sk, skb); + if (tsflags && skb) { struct skb_shared_info *shinfo = skb_shinfo(skb); struct tcp_skb_cb *tcb = TCP_SKB_CB(skb); -- 2.37.3