From patchwork Mon Aug 7 17:51:25 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rao Shoaib X-Patchwork-Id: 798804 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3xR4q75zdbz9rxl for ; Tue, 8 Aug 2017 03:52:03 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751857AbdHGRwB (ORCPT ); Mon, 7 Aug 2017 13:52:01 -0400 Received: from userp1040.oracle.com ([156.151.31.81]:45479 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751453AbdHGRwA (ORCPT ); Mon, 7 Aug 2017 13:52:00 -0400 Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id v77HpWvt014220 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 7 Aug 2017 17:51:33 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserv0021.oracle.com (8.14.4/8.14.4) with ESMTP id v77HpVfr011737 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 7 Aug 2017 17:51:31 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id v77HpR0I021211; Mon, 7 Aug 2017 17:51:31 GMT Received: from caduceus5 (/67.188.214.158) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 07 Aug 2017 10:51:27 -0700 Date: Mon, 7 Aug 2017 10:51:25 -0700 From: Rao Shoaib To: davem@davemloft.net, kuznet@ms2.inr.ac.ru Cc: netdev@vger.kernel.org Subject: [PATCH] TCP_USER_TIMEOUT and tcp_keepalive should conform to RFC5482 Message-ID: <20170807175125.GA16602@caduceus5> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.24 (2015-08-30) X-Source-IP: aserv0021.oracle.com [141.146.126.233] Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Signed-off-by: Rao Shoaib --- net/ipv4/tcp.c | 10 ++++++++-- net/ipv4/tcp_timer.c | 9 +-------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 71ce33d..f2af44d 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -2628,7 +2628,9 @@ static int do_tcp_setsockopt(struct sock *sk, int level, break; case TCP_KEEPIDLE: - if (val < 1 || val > MAX_TCP_KEEPIDLE) + /* Per RFC5482 keepalive_time must be > user_timeout */ + if (val < 1 || val > MAX_TCP_KEEPIDLE || + ((val * HZ) <= icsk->icsk_user_timeout)) err = -EINVAL; else { tp->keepalive_time = val * HZ; @@ -2724,8 +2726,12 @@ static int do_tcp_setsockopt(struct sock *sk, int level, case TCP_USER_TIMEOUT: /* Cap the max time in ms TCP will retry or probe the window * before giving up and aborting (ETIMEDOUT) a connection. + * Per RFC5482 TCP user timeout must be < keepalive_time. + * If the default value changes later -- all bets are off. */ - if (val < 0) + if (val < 0 || (tp->keepalive_time && + tp->keepalive_time <= msecs_to_jiffies(val)) || + net->ipv4.sysctl_tcp_keepalive_time <= msecs_to_jiffies(val)) err = -EINVAL; else icsk->icsk_user_timeout = msecs_to_jiffies(val); diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c index c0feeee..d39fe60 100644 --- a/net/ipv4/tcp_timer.c +++ b/net/ipv4/tcp_timer.c @@ -664,14 +664,7 @@ static void tcp_keepalive_timer (unsigned long data) elapsed = keepalive_time_elapsed(tp); if (elapsed >= keepalive_time_when(tp)) { - /* If the TCP_USER_TIMEOUT option is enabled, use that - * to determine when to timeout instead. - */ - if ((icsk->icsk_user_timeout != 0 && - elapsed >= icsk->icsk_user_timeout && - icsk->icsk_probes_out > 0) || - (icsk->icsk_user_timeout == 0 && - icsk->icsk_probes_out >= keepalive_probes(tp))) { + if (icsk->icsk_probes_out >= keepalive_probes(tp)) { tcp_send_active_reset(sk, GFP_ATOMIC); tcp_write_err(sk); goto out;