Commit b3b81e6b authored by Jason Xing's avatar Jason Xing Committed by Martin KaFai Lau
Browse files

bpf: Add BPF_SOCK_OPS_TSTAMP_ACK_CB callback



Support the ACK case for bpf timestamping.

Add a new sock_ops callback, BPF_SOCK_OPS_TSTAMP_ACK_CB. This
callback will occur at the same timestamping point as the user
space's SCM_TSTAMP_ACK. The BPF program can use it to get the
same SCM_TSTAMP_ACK timestamp without modifying the user-space
application.

This patch extends txstamp_ack to two bits: 1 stands for
SO_TIMESTAMPING mode, 2 bpf extension.

Signed-off-by: default avatarJason Xing <kerneljasonxing@gmail.com>
Signed-off-by: default avatarMartin KaFai Lau <martin.lau@kernel.org>
Reviewed-by: default avatarWillem de Bruijn <willemb@google.com>
Link: https://patch.msgid.link/20250220072940.99994-10-kerneljasonxing@gmail.com
parent 2deaf7f4
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -964,10 +964,12 @@ struct tcp_skb_cb {

	__u8		sacked;		/* State flags for SACK.	*/
	__u8		ip_dsfield;	/* IPv4 tos or IPv6 dsfield	*/
	__u8		txstamp_ack:1,	/* Record TX timestamp for ack? */
#define TSTAMP_ACK_SK	0x1
#define TSTAMP_ACK_BPF	0x2
	__u8		txstamp_ack:2,	/* Record TX timestamp for ack? */
			eor:1,		/* Is skb MSG_EOR marked? */
			has_rxtstamp:1,	/* SKB has a RX timestamp	*/
			unused:5;
			unused:4;
	__u32		ack_seq;	/* Sequence number ACK'd	*/
	union {
		struct {
+5 −0
Original line number Diff line number Diff line
@@ -7044,6 +7044,11 @@ enum {
					 * SK_BPF_CB_TX_TIMESTAMPING feature
					 * is on.
					 */
	BPF_SOCK_OPS_TSTAMP_ACK_CB,	/* Called when all the skbs in the
					 * same sendmsg call are acked
					 * 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
+4 −1
Original line number Diff line number Diff line
@@ -5550,7 +5550,7 @@ static bool skb_tstamp_tx_report_so_timestamping(struct sk_buff *skb,
		return skb_shinfo(skb)->tx_flags & (hwtstamps ? SKBTX_HW_TSTAMP_NOBPF :
						    SKBTX_SW_TSTAMP);
	case SCM_TSTAMP_ACK:
		return TCP_SKB_CB(skb)->txstamp_ack;
		return TCP_SKB_CB(skb)->txstamp_ack & TSTAMP_ACK_SK;
	}

	return false;
@@ -5575,6 +5575,9 @@ static void skb_tstamp_tx_report_bpf_timestamping(struct sk_buff *skb,
			op = BPF_SOCK_OPS_TSTAMP_SND_SW_CB;
		}
		break;
	case SCM_TSTAMP_ACK:
		op = BPF_SOCK_OPS_TSTAMP_ACK_CB;
		break;
	default:
		return;
	}
+1 −1
Original line number Diff line number Diff line
@@ -492,7 +492,7 @@ static void tcp_tx_timestamp(struct sock *sk, struct sockcm_cookie *sockc)

		sock_tx_timestamp(sk, sockc, &shinfo->tx_flags);
		if (tsflags & SOF_TIMESTAMPING_TX_ACK)
			tcb->txstamp_ack = 1;
			tcb->txstamp_ack |= TSTAMP_ACK_SK;
		if (tsflags & SOF_TIMESTAMPING_TX_RECORD_MASK)
			shinfo->tskey = TCP_SKB_CB(skb)->seq + skb->len - 1;
	}
+5 −0
Original line number Diff line number Diff line
@@ -7044,6 +7044,11 @@ enum {
					 * SK_BPF_CB_TX_TIMESTAMPING feature
					 * is on.
					 */
	BPF_SOCK_OPS_TSTAMP_ACK_CB,	/* Called when all the skbs in the
					 * same sendmsg call are acked
					 * 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