Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 37846ef0 authored by Alexander Duyck's avatar Alexander Duyck Committed by David S. Miller
Browse files

net-timestamp: Merge shared code between phy and regular timestamping



This change merges the shared bits that exist between skb_tx_tstamp and
skb_complete_tx_timestamp.  By doing this we can avoid the two diverging as
there were already changes pushed into skb_tx_tstamp that hadn't made it
into the other function.

In addition this resolves issues with the fact that
skb_complete_tx_timestamp was included in linux/skbuff.h even though it was
only compiled in if phy timestamping was enabled.

Signed-off-by: default avatarAlexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d546c621
Loading
Loading
Loading
Loading
+42 −23
Original line number Original line Diff line number Diff line
@@ -3511,33 +3511,13 @@ struct sk_buff *sock_dequeue_err_skb(struct sock *sk)
}
}
EXPORT_SYMBOL(sock_dequeue_err_skb);
EXPORT_SYMBOL(sock_dequeue_err_skb);


void __skb_tstamp_tx(struct sk_buff *orig_skb,
static void __skb_complete_tx_timestamp(struct sk_buff *skb,
		     struct skb_shared_hwtstamps *hwtstamps,
					struct sock *sk,
		     struct sock *sk, int tstype)
					int tstype)
{
{
	struct sock_exterr_skb *serr;
	struct sock_exterr_skb *serr;
	struct sk_buff *skb;
	int err;
	int err;


	if (!sk)
		return;

	if (hwtstamps) {
		*skb_hwtstamps(orig_skb) =
			*hwtstamps;
	} else {
		/*
		 * no hardware time stamps available,
		 * so keep the shared tx_flags and only
		 * store software time stamp
		 */
		orig_skb->tstamp = ktime_get_real();
	}

	skb = skb_clone(orig_skb, GFP_ATOMIC);
	if (!skb)
		return;

	serr = SKB_EXT_ERR(skb);
	serr = SKB_EXT_ERR(skb);
	memset(serr, 0, sizeof(*serr));
	memset(serr, 0, sizeof(*serr));
	serr->ee.ee_errno = ENOMSG;
	serr->ee.ee_errno = ENOMSG;
@@ -3554,6 +3534,45 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb,
	if (err)
	if (err)
		kfree_skb(skb);
		kfree_skb(skb);
}
}

void skb_complete_tx_timestamp(struct sk_buff *skb,
			       struct skb_shared_hwtstamps *hwtstamps)
{
	struct sock *sk = skb->sk;

	skb->sk = NULL;

	if (hwtstamps) {
		*skb_hwtstamps(skb) = *hwtstamps;
		__skb_complete_tx_timestamp(skb, sk, SCM_TSTAMP_SND);
	} else {
		kfree_skb(skb);
	}

	sock_put(sk);
}
EXPORT_SYMBOL_GPL(skb_complete_tx_timestamp);

void __skb_tstamp_tx(struct sk_buff *orig_skb,
		     struct skb_shared_hwtstamps *hwtstamps,
		     struct sock *sk, int tstype)
{
	struct sk_buff *skb;

	if (!sk)
		return;

	if (hwtstamps)
		*skb_hwtstamps(orig_skb) = *hwtstamps;
	else
		orig_skb->tstamp = ktime_get_real();

	skb = skb_clone(orig_skb, GFP_ATOMIC);
	if (!skb)
		return;

	__skb_complete_tx_timestamp(skb, sk, tstype);
}
EXPORT_SYMBOL_GPL(__skb_tstamp_tx);
EXPORT_SYMBOL_GPL(__skb_tstamp_tx);


void skb_tstamp_tx(struct sk_buff *orig_skb,
void skb_tstamp_tx(struct sk_buff *orig_skb,
+0 −29
Original line number Original line Diff line number Diff line
@@ -63,35 +63,6 @@ void skb_clone_tx_timestamp(struct sk_buff *skb)
}
}
EXPORT_SYMBOL_GPL(skb_clone_tx_timestamp);
EXPORT_SYMBOL_GPL(skb_clone_tx_timestamp);


void skb_complete_tx_timestamp(struct sk_buff *skb,
			       struct skb_shared_hwtstamps *hwtstamps)
{
	struct sock *sk = skb->sk;
	struct sock_exterr_skb *serr;
	int err;

	if (!hwtstamps) {
		sock_put(sk);
		kfree_skb(skb);
		return;
	}

	*skb_hwtstamps(skb) = *hwtstamps;

	serr = SKB_EXT_ERR(skb);
	memset(serr, 0, sizeof(*serr));
	serr->ee.ee_errno = ENOMSG;
	serr->ee.ee_origin = SO_EE_ORIGIN_TIMESTAMPING;
	skb->sk = NULL;

	err = sock_queue_err_skb(sk, skb);

	sock_put(sk);
	if (err)
		kfree_skb(skb);
}
EXPORT_SYMBOL_GPL(skb_complete_tx_timestamp);

bool skb_defer_rx_timestamp(struct sk_buff *skb)
bool skb_defer_rx_timestamp(struct sk_buff *skb)
{
{
	struct phy_device *phydev;
	struct phy_device *phydev;