Patch "tcp: mark skbs with SCM_TIMESTAMPING_OPT_STATS" has been added to the 4.10-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
tcp: mark skbs with SCM_TIMESTAMPING_OPT_STATS
to the 4.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
tcp-mark-skbs-with-scm_timestamping_opt_stats.patch
and it can be found in the queue-4.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Sat Apr 29 08:22:40 CEST 2017
From: Soheil Hassas Yeganeh <[email protected]>
Date: Sat, 18 Mar 2017 17:03:00 -0400
Subject: tcp: mark skbs with SCM_TIMESTAMPING_OPT_STATS
From: Soheil Hassas Yeganeh <[email protected]>
[ Upstream commit 4ef1b2869447411ad3ef91ad7d4891a83c1a509a ]
SOF_TIMESTAMPING_OPT_STATS can be enabled and disabled while packets are collected on the error queue. So, checking SOF_TIMESTAMPING_OPT_STATS in sk->sk_tsflags is not enough to safely assume that the skb contains OPT_STATS data.
Add a bit in sock_exterr_skb to indicate whether the skb contains opt_stats data.
--- include/linux/errqueue.h | 2 ++ net/core/skbuff.c | 17 +++++++++++------ net/socket.c | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-)
include/linux/errqueue.h +2 -0
@@ -20,6 +20,8 @@ struct sock_exterr_skb {struct sock_extended_err ee;u16 addr_offset;__be16 port; + u8 opt_stats:1, + unused:7; };#endif
net/core/skbuff.c +11 -6
@@ -3799,16 +3799,20 @@ EXPORT_SYMBOL(skb_clone_sk);static void __skb_complete_tx_timestamp (struct sk_buff *skb,struct sock *sk, -int tstype) +int tstype, +bool opt_stats) {struct sock_exterr_skb *serr;int err; +BUILD_BUG_ON (sizeof (struct sock_exterr_skb ) >sizeof (skb->cb)); + serr =SKB_EXT_ERR (skb);memset (serr,0 ,sizeof (*serr)); serr->ee.ee_errno =ENOMSG ; serr->ee.ee_origin =SO_EE_ORIGIN_TIMESTAMPING ; serr->ee.ee_info = tstype; + serr->opt_stats = opt_stats; serr->header.h4.iif = skb->dev ? skb->dev->ifindex :0 ;if (sk->sk_tsflags &SOF_TIMESTAMPING_OPT_ID ) { serr->ee.ee_data =skb_shinfo (skb)->tskey;
@@ -3850,7 +3854,7 @@ void skb_complete_tx_timestamp(struct sk*/ if (likely (atomic_inc_not_zero (&sk->sk_refcnt))) { *skb_hwtstamps (skb) = *hwtstamps; -__skb_complete_tx_timestamp (skb, sk,SCM_TSTAMP_SND ); +__skb_complete_tx_timestamp (skb, sk,SCM_TSTAMP_SND , false);sock_put (sk); } }
@@ -3861,7 +3865,7 @@ void __skb_tstamp_tx(struct sk_buff *ori struct sock *sk, int tstype) {struct sk_buff *skb; -bool tsonly; +bool tsonly, opt_stats = false;if (!sk)return ;
@@ -3874,9 +3878,10 @@ void __skb_tstamp_tx(struct sk_buff *ori#ifdef CONFIG_INET if ((sk->sk_tsflags &SOF_TIMESTAMPING_OPT_STATS ) && sk->sk_protocol ==IPPROTO_TCP && - sk->sk_type ==SOCK_STREAM ) + sk->sk_type ==SOCK_STREAM ) { skb =tcp_get_timestamping_opt_stats (sk); - else + opt_stats = true; + } else#endif skb =alloc_skb (0 ,GFP_ATOMIC ); }else {
@@ -3895,7 +3900,7 @@ void __skb_tstamp_tx(struct sk_buff *orielse skb->tstamp =ktime_get_real (); -__skb_complete_tx_timestamp (skb, sk, tstype); +__skb_complete_tx_timestamp (skb, sk, tstype, opt_stats); }EXPORT_SYMBOL_GPL (__skb_tstamp_tx);
net/socket.c +1 -1
@@ -708,7 +708,7 @@ void __sock_recv_timestamp(struct msghdr SCM_TIMESTAMPING, sizeof(tss), &tss);if (skb_is_err_queue (skb) && skb->len && - (sk->sk_tsflags &SOF_TIMESTAMPING_OPT_STATS )) +SKB_EXT_ERR (skb)->opt_stats)put_cmsg (msg,SOL_SOCKET ,SCM_TIMESTAMPING_OPT_STATS , skb->len, skb->data); }
Patches currently in stable-queue which might be from [email protected] are
queue-4.10/tcp-mark-skbs-with-scm_timestamping_opt_stats.patch queue-4.10/secure_seq-downgrade-to-per-host-timestamp-offsets.patch queue-4.10/tcp-fix-scm_timestamping_opt_stats-for-normal-skbs.patch