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

net-timestamp: Prepare for isolating two modes of SO_TIMESTAMPING



No functional changes here. Only add test to see if the orig_skb
matches the usage of application SO_TIMESTAMPING.

In this series, bpf timestamping and previous socket timestamping
are implemented in the same function __skb_tstamp_tx(). To test
the socket enables socket timestamping feature, this function
skb_tstamp_tx_report_so_timestamping() is added.

In the next patch, another check for bpf timestamping feature
will be introduced just like the above report function, namely,
skb_tstamp_tx_report_bpf_timestamping(). Then users will be able
to know the socket enables either or both of features.

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-6-kerneljasonxing@gmail.com
parent 2958624b
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -5539,6 +5539,23 @@ void skb_complete_tx_timestamp(struct sk_buff *skb,
}
EXPORT_SYMBOL_GPL(skb_complete_tx_timestamp);

static bool skb_tstamp_tx_report_so_timestamping(struct sk_buff *skb,
						 struct skb_shared_hwtstamps *hwtstamps,
						 int tstype)
{
	switch (tstype) {
	case SCM_TSTAMP_SCHED:
		return skb_shinfo(skb)->tx_flags & SKBTX_SCHED_TSTAMP;
	case SCM_TSTAMP_SND:
		return skb_shinfo(skb)->tx_flags & (hwtstamps ? SKBTX_HW_TSTAMP :
						    SKBTX_SW_TSTAMP);
	case SCM_TSTAMP_ACK:
		return TCP_SKB_CB(skb)->txstamp_ack;
	}

	return false;
}

void __skb_tstamp_tx(struct sk_buff *orig_skb,
		     const struct sk_buff *ack_skb,
		     struct skb_shared_hwtstamps *hwtstamps,
@@ -5551,6 +5568,9 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb,
	if (!sk)
		return;

	if (!skb_tstamp_tx_report_so_timestamping(orig_skb, hwtstamps, tstype))
		return;

	tsflags = READ_ONCE(sk->sk_tsflags);
	if (!hwtstamps && !(tsflags & SOF_TIMESTAMPING_OPT_TX_SWHW) &&
	    skb_shinfo(orig_skb)->tx_flags & SKBTX_IN_PROGRESS)