From patchwork Sat Mar 18 21:03:00 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Soheil Hassas Yeganeh X-Patchwork-Id: 740639 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3vlyN40Fhvz9ryZ for ; Sun, 19 Mar 2017 10:00:04 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="WKQe7iro"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751308AbdCRXAB (ORCPT ); Sat, 18 Mar 2017 19:00:01 -0400 Received: from mail-qk0-f195.google.com ([209.85.220.195]:35504 "EHLO mail-qk0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751181AbdCRXAA (ORCPT ); Sat, 18 Mar 2017 19:00:00 -0400 Received: by mail-qk0-f195.google.com with SMTP id o135so13980833qke.2 for ; Sat, 18 Mar 2017 15:59:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=3vNmXjTFc2dxOJW09a0BSJaCBwoDXE3KvgM1NpLUF00=; b=WKQe7iroFguer2S2D7VwSTtpS34N/dyFj57V/2/TgECxeRqmojr9tS+S+E2htjsono /sMFwCqgPNOuSIwE0QPkdQL9J9tow4fbblqyCk+McHOUM7MoikCIf5+ifd71Z2Nd8lt4 A53/zC988NpOZoNFKxA1sCdqHp7R9E6FiuG7PZXg8GldAOTbs6dj0Ve1rsjcDMl2VW9J poU+Vz76XtoJ0UKVn/tCFO/ODUsqN2KwzPqdKEp0pn/T+O7T4I3zdLF81cEqyeJoJUG7 HJOjjYzDeAtpqducJVA9ya0fE6uju3qqzMX85WuWyIZ1y3rMfyrzd1JYPt0q6gbPF//D BoCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=3vNmXjTFc2dxOJW09a0BSJaCBwoDXE3KvgM1NpLUF00=; b=RQnELUkp9sOBxAm1qHnzn5Z7pOMQByp2BJVyMQfZXnFdTJsIjhiQ5dNK3cwRgt2f+E /qr2Mf6VKi/Vm5/r3urDoIie6xsWWavOe9oPsiGYLOZJCX2HK/auPkgcUNWMAfSF5SCL SBlnn87mLpQI8VPlyjdWGl1xacY53ACVaNf19hEkXPUU0UGf/3BzI8aYZ1JZ3DQ7s29x jfBzg2576jZfTu1BlsFyg9oRaN1w4Acyp70XTkFUpMnqxuFz92bl/aOloZ8WYqKQ+Flg zKtFHi2px2Wai2zNhDORe/wISBdutRt/KJCYsLm4fWB3fyK8TibTsuiS27cC90+XHJVa T1Iw== X-Gm-Message-State: AFeK/H0S2faMgvTwei4a24aViUF6Lsjl1s9lvwmlG63skcUFHmT28zQlWFu7J0SB32UJoQ== X-Received: by 10.55.27.205 with SMTP id m74mr7245791qkh.173.1489870993589; Sat, 18 Mar 2017 14:03:13 -0700 (PDT) Received: from z.nyc.corp.google.com ([172.26.104.94]) by smtp.gmail.com with ESMTPSA id f66sm8850808qkj.13.2017.03.18.14.03.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 18 Mar 2017 14:03:13 -0700 (PDT) From: Soheil Hassas Yeganeh To: davem@davemloft.net, netdev@vger.kernel.org Cc: zzoru007@gmail.com, Soheil Hassas Yeganeh , Eric Dumazet , Willem de Bruijn Subject: [PATCH net 2/2] tcp: mark skbs with SCM_TIMESTAMPING_OPT_STATS Date: Sat, 18 Mar 2017 17:03:00 -0400 Message-Id: <20170318210300.163288-2-soheil.kdev@gmail.com> X-Mailer: git-send-email 2.12.0.367.g23dc2f6d3c-goog In-Reply-To: <20170318210300.163288-1-soheil.kdev@gmail.com> References: <20170318210300.163288-1-soheil.kdev@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Soheil Hassas Yeganeh 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. Fixes: 1c885808e456 ("tcp: SOF_TIMESTAMPING_OPT_STATS option for SO_TIMESTAMPING") Reported-by: JongHwan Kim Signed-off-by: Soheil Hassas Yeganeh Signed-off-by: Eric Dumazet Signed-off-by: Willem de Bruijn --- include/linux/errqueue.h | 2 ++ net/core/skbuff.c | 17 +++++++++++------ net/socket.c | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/include/linux/errqueue.h b/include/linux/errqueue.h index 9ca23fcfb5d7..6fdfc884fdeb 100644 --- a/include/linux/errqueue.h +++ b/include/linux/errqueue.h @@ -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 diff --git a/net/core/skbuff.c b/net/core/skbuff.c index b1fbd1958eb6..9f781092fda9 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -3793,16 +3793,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; if (sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID) { serr->ee.ee_data = skb_shinfo(skb)->tskey; if (sk->sk_protocol == IPPROTO_TCP && @@ -3843,7 +3847,7 @@ void skb_complete_tx_timestamp(struct sk_buff *skb, */ 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); } } @@ -3854,7 +3858,7 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb, struct sock *sk, int tstype) { struct sk_buff *skb; - bool tsonly; + bool tsonly, opt_stats = false; if (!sk) return; @@ -3867,9 +3871,10 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb, #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 { @@ -3888,7 +3893,7 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb, else 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); diff --git a/net/socket.c b/net/socket.c index 692d6989d2c2..985ef06792d6 100644 --- a/net/socket.c +++ b/net/socket.c @@ -706,7 +706,7 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk, 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); }