From patchwork Mon Oct 14 06:14:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xin Long X-Patchwork-Id: 1175994 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="nTeF4AUV"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46s7Zg1SFRz9sPZ for ; Mon, 14 Oct 2019 17:15:07 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729982AbfJNGPG (ORCPT ); Mon, 14 Oct 2019 02:15:06 -0400 Received: from mail-pg1-f195.google.com ([209.85.215.195]:39984 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726637AbfJNGPG (ORCPT ); Mon, 14 Oct 2019 02:15:06 -0400 Received: by mail-pg1-f195.google.com with SMTP id e13so1248032pga.7; Sun, 13 Oct 2019 23:15:06 -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 :in-reply-to:references; bh=whJBGbUMkV3xUHWgAj3VyT9WXAoGTLtFtkwQ6LiTK34=; b=nTeF4AUV4StUJ6hzls05v8dWc14FaWnGitUvFilCPUD161mL1VbSF2xooEPT1DCNpO DgaGTXo4KK73K8aD1lRubAH39ymTO6y8uou74Wds+X3sF+vgpc5O7JLBeSH4GISL1EWn rjOLJn+TD5EAOnpzFCzutGa3Y/lGwPuihtwnYJa9djT8EWnyVTav6+nUneD2JzWz45mu /+gGJLRkkpsocOCgRPutvQoPQjqaK141sY6Xbb/+mXOXIlisl60DFOiwV6yofkSxgVrV h8r9aERvmA7jJM5U436oEcianMwHHuorDtRI9bKjqKpE+a6PrDF6/6RENMyVZDgPwBHf jGsQ== 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:in-reply-to:references; bh=whJBGbUMkV3xUHWgAj3VyT9WXAoGTLtFtkwQ6LiTK34=; b=TtYSCbI1MUMmyk0AU1g2aiTKRSKnn+MAi2XeyNwpHsACSLZn0BdxoVt5wbyMOuAapA y8nDWM8nsf5Bh0nAhKnq4fWgABHRNjwldqrHKNxnHMCRtjvUvsntNFjfOvlJ2h92XbR3 ygLSWbdknc7pN9Jvuzgd8K8JKLS658fO+Uu+BTG1boEVLnZ6jdKyhXyMtWIgEAuUe71B SikfpXQY/IcVyQTOvZdc7wHLhcRGC8j6qGMnlcQsw/q+oKD28jwM930VNCnL460v10BQ 5Q80e1kJccWg4wnf2P6WxSZNUVnr+NC5LN5VGgbQYSa5e3tepv7d7ceHqDpSs50lw20T XfSw== X-Gm-Message-State: APjAAAW1jJJMsayesZxJKTrVGLMDrSk7zVaSR+BNib3USRpBOYEd8h15 XOZXmvBNMzikcwfLjOCuO05RCRYj X-Google-Smtp-Source: APXvYqxLWqf1KZyVsJEkGEXMj0eo3/fOV+dlXkJoSAzJppL+s9lFG4J/X6Ovk/L+yHLEqnjQGV/XjA== X-Received: by 2002:a63:81:: with SMTP id 123mr31985161pga.47.1571033705396; Sun, 13 Oct 2019 23:15:05 -0700 (PDT) Received: from localhost ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id h2sm22200469pfq.108.2019.10.13.23.15.04 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 13 Oct 2019 23:15:04 -0700 (PDT) From: Xin Long To: network dev , linux-sctp@vger.kernel.org Cc: Marcelo Ricardo Leitner , Neil Horman , davem@davemloft.net, David Laight Subject: [PATCHv3 net-next 1/5] sctp: add SCTP_ADDR_POTENTIALLY_FAILED notification Date: Mon, 14 Oct 2019 14:14:44 +0800 Message-Id: <7d08b42f4c1480caa855776d92331fe9beed001d.1571033544.git.lucien.xin@gmail.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: References: In-Reply-To: References: Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org SCTP Quick failover draft section 5.1, point 5 has been removed from rfc7829. Instead, "the sender SHOULD (i) notify the Upper Layer Protocol (ULP) about this state transition", as said in section 3.2, point 8. So this patch is to add SCTP_ADDR_POTENTIALLY_FAILED, defined in section 7.1, "which is reported if the affected address becomes PF". Also remove transport cwnd's update when moving from PF back to ACTIVE , which is no longer in rfc7829 either. v1->v2: - no change v2->v3: - define SCTP_ADDR_PF SCTP_ADDR_POTENTIALLY_FAILED Signed-off-by: Xin Long --- include/uapi/linux/sctp.h | 2 ++ net/sctp/associola.c | 17 ++++------------- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/include/uapi/linux/sctp.h b/include/uapi/linux/sctp.h index 6bce7f9..f4ab7bb 100644 --- a/include/uapi/linux/sctp.h +++ b/include/uapi/linux/sctp.h @@ -410,6 +410,8 @@ enum sctp_spc_state { SCTP_ADDR_ADDED, SCTP_ADDR_MADE_PRIM, SCTP_ADDR_CONFIRMED, + SCTP_ADDR_POTENTIALLY_FAILED, +#define SCTP_ADDR_PF SCTP_ADDR_POTENTIALLY_FAILED }; diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 1ba893b..4f9efba 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c @@ -801,14 +801,6 @@ void sctp_assoc_control_transport(struct sctp_association *asoc, spc_state = SCTP_ADDR_CONFIRMED; else spc_state = SCTP_ADDR_AVAILABLE; - /* Don't inform ULP about transition from PF to - * active state and set cwnd to 1 MTU, see SCTP - * Quick failover draft section 5.1, point 5 - */ - if (transport->state == SCTP_PF) { - ulp_notify = false; - transport->cwnd = asoc->pathmtu; - } transport->state = SCTP_ACTIVE; break; @@ -817,19 +809,18 @@ void sctp_assoc_control_transport(struct sctp_association *asoc, * to inactive state. Also, release the cached route since * there may be a better route next time. */ - if (transport->state != SCTP_UNCONFIRMED) + if (transport->state != SCTP_UNCONFIRMED) { transport->state = SCTP_INACTIVE; - else { + spc_state = SCTP_ADDR_UNREACHABLE; + } else { sctp_transport_dst_release(transport); ulp_notify = false; } - - spc_state = SCTP_ADDR_UNREACHABLE; break; case SCTP_TRANSPORT_PF: transport->state = SCTP_PF; - ulp_notify = false; + spc_state = SCTP_ADDR_POTENTIALLY_FAILED; break; default: From patchwork Mon Oct 14 06:14:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xin Long X-Patchwork-Id: 1175995 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="rX4Mu0oj"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46s7Zr2QYZz9sPZ for ; Mon, 14 Oct 2019 17:15:16 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729988AbfJNGPP (ORCPT ); Mon, 14 Oct 2019 02:15:15 -0400 Received: from mail-pf1-f180.google.com ([209.85.210.180]:40526 "EHLO mail-pf1-f180.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726637AbfJNGPP (ORCPT ); Mon, 14 Oct 2019 02:15:15 -0400 Received: by mail-pf1-f180.google.com with SMTP id x127so9767278pfb.7; Sun, 13 Oct 2019 23:15:14 -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 :in-reply-to:references; bh=hPmihtgKUBMWFLHb3GG5tiDUkbYL9TwWWzVf9MbRIa4=; b=rX4Mu0ojjX9OHlXvMKJS3J9WA024OEQDT7thjqXjVVlS6rfkqj5vaWhREBYVKBJ1Ms 772MEqDI7n4fAcRqdNOLafeBSSBFGSz2b/3Mlz5sSHWryAkrS71IY6Qx0miBdd5jMDY7 pRUe9n7jVShrR1kZJNf43uanQYa94nVfZ8Raaho8FrlfRhdxfJgWFO3pUiHfW9eQyJZ7 iTzH9cWuc+JLjTKOeKiucQ0jVPiEKMy3OMUnV7B6EXYXiwuT78l/+qweR8nHce1iG/fP J/kxFtDK8xzKvNKacD+kkfEmKZfU2DE3aSEdcJSN3gAGxfGAWMuETN1Lcr5Uhs8dWIFI aF7w== 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:in-reply-to:references; bh=hPmihtgKUBMWFLHb3GG5tiDUkbYL9TwWWzVf9MbRIa4=; b=Bk2UE9nGEy671BQMs+JIbQH7CU37ozi4075bi5sFzqmn7XXqcNrZYvUATxUCy1yAIb xeLZ+0V+BzFDa6lG8nGSJ5Ikz2IvHL8KjCbGV0dWpDuros63ruQ8FGnfc5w1gS9oQ70X /iIc2q8GBgq3KKOHqvDUsu8q3OMUpaQUGH1UqUVXjzQmXSEUQhByR4gW1JRhSgGLrCUS Sj3zeQNg+PAo9y3iU6pZjI6lo88GP5mlDxUf3wJBX2hNRqxxaneTkGUC2yx+nY+LWLzj 7PpmVAgVzo0HcJ9xBJ8UWsTzq+6ghLnJzpk/c8zQnre61UdQbsCaso44pq9r1YUaG9Nn XyCw== X-Gm-Message-State: APjAAAUW+stsa4+k5zqelOMr8ZjK0djxzvxrpZ5WFbgQ4UBi4QiVJhUZ kzgtSohoZW7qei2rmPzJ1GT3POGQ X-Google-Smtp-Source: APXvYqzeX4dWMClO5lx5IdaGVpzdS4b60cDh0wxoosgnVPAxqekmVIadO3G9HRsUWv/bP7YeRXYJyw== X-Received: by 2002:a63:7a54:: with SMTP id j20mr11400603pgn.355.1571033713823; Sun, 13 Oct 2019 23:15:13 -0700 (PDT) Received: from localhost ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id s202sm20530034pfs.24.2019.10.13.23.15.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 13 Oct 2019 23:15:13 -0700 (PDT) From: Xin Long To: network dev , linux-sctp@vger.kernel.org Cc: Marcelo Ricardo Leitner , Neil Horman , davem@davemloft.net, David Laight Subject: [PATCHv3 net-next 2/5] sctp: add pf_expose per netns and sock and asoc Date: Mon, 14 Oct 2019 14:14:45 +0800 Message-Id: X-Mailer: git-send-email 2.1.0 In-Reply-To: <7d08b42f4c1480caa855776d92331fe9beed001d.1571033544.git.lucien.xin@gmail.com> References: <7d08b42f4c1480caa855776d92331fe9beed001d.1571033544.git.lucien.xin@gmail.com> In-Reply-To: References: Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org As said in rfc7829, section 3, point 12: The SCTP stack SHOULD expose the PF state of its destination addresses to the ULP as well as provide the means to notify the ULP of state transitions of its destination addresses from active to PF, and vice versa. However, it is recommended that an SCTP stack implementing SCTP-PF also allows for the ULP to be kept ignorant of the PF state of its destinations and the associated state transitions, thus allowing for retention of the simpler state transition model of [RFC4960] in the ULP. Not only does it allow to expose the PF state to ULP, but also allow to ignore sctp-pf to ULP. So this patch is to add pf_expose per netns, sock and asoc. And in sctp_assoc_control_transport(), ulp_notify will be set to false if asoc->expose is not set. It also allows a user to change pf_expose per netns by sysctl, and pf_expose per sock and asoc will be initialized with it. Note that pf_expose also works for SCTP_GET_PEER_ADDR_INFO sockopt, to not allow a user to query the state of a sctp-pf peer address when pf_expose is not enabled, as said in section 7.3. v1->v2: - Fix a build warning noticed by Nathan Chancellor. v2->v3: - set pf_expose to UNUSED by default to keep compatible with old applications. Signed-off-by: Xin Long --- include/net/netns/sctp.h | 8 ++++++++ include/net/sctp/constants.h | 10 ++++++++++ include/net/sctp/structs.h | 2 ++ include/uapi/linux/sctp.h | 1 + net/sctp/associola.c | 13 ++++++++++--- net/sctp/protocol.c | 3 +++ net/sctp/socket.c | 13 +++++++++++-- net/sctp/sysctl.c | 10 ++++++++++ 8 files changed, 55 insertions(+), 5 deletions(-) diff --git a/include/net/netns/sctp.h b/include/net/netns/sctp.h index bdc0f27..f97d342 100644 --- a/include/net/netns/sctp.h +++ b/include/net/netns/sctp.h @@ -97,6 +97,14 @@ struct netns_sctp { int pf_enable; /* + * Disable Potentially-Failed state exposure, ignored by default + * pf_expose - 0 : disable pf state exposure + * - 1 : enable pf state exposure + * - 2 : compatible with old applications (by default) + */ + int pf_expose; + + /* * Policy for preforming sctp/socket accounting * 0 - do socket level accounting, all assocs share sk_sndbuf * 1 - do sctp accounting, each asoc may use sk_sndbuf bytes diff --git a/include/net/sctp/constants.h b/include/net/sctp/constants.h index 823afc4..2818988 100644 --- a/include/net/sctp/constants.h +++ b/include/net/sctp/constants.h @@ -286,6 +286,16 @@ enum { SCTP_MAX_GABS = 16 }; * functions simpler to write. */ +/* These are the values for pf exposure, UNUSED is to keep compatible with old + * applications by default. + */ +enum { + SCTP_PF_EXPOSE_DISABLE, + SCTP_PF_EXPOSE_ENABLE, + SCTP_PF_EXPOSE_UNUSED, +}; +#define SCTP_PF_EXPOSE_MAX SCTP_PF_EXPOSE_UNUSED + /* These return values describe the success or failure of a number of * routines which form the lower interface to SCTP_outqueue. */ diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index 503fbc3..9a43738 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h @@ -215,6 +215,7 @@ struct sctp_sock { __u32 adaptation_ind; __u32 pd_point; __u16 nodelay:1, + pf_expose:2, reuse:1, disable_fragments:1, v4mapped:1, @@ -2053,6 +2054,7 @@ struct sctp_association { __u8 need_ecne:1, /* Need to send an ECNE Chunk? */ temp:1, /* Is it a temporary association? */ + pf_expose:2, /* Expose pf state? */ force_delay:1; __u8 strreset_enable; diff --git a/include/uapi/linux/sctp.h b/include/uapi/linux/sctp.h index f4ab7bb..d99b428 100644 --- a/include/uapi/linux/sctp.h +++ b/include/uapi/linux/sctp.h @@ -935,6 +935,7 @@ struct sctp_paddrinfo { enum sctp_spinfo_state { SCTP_INACTIVE, SCTP_PF, +#define SCTP_POTENTIALLY_FAILED SCTP_PF SCTP_ACTIVE, SCTP_UNCONFIRMED, SCTP_UNKNOWN = 0xffff /* Value used for transport state unknown */ diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 4f9efba..46763c5 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c @@ -86,6 +86,7 @@ static struct sctp_association *sctp_association_init( */ asoc->max_retrans = sp->assocparams.sasoc_asocmaxrxt; asoc->pf_retrans = sp->pf_retrans; + asoc->pf_expose = sp->pf_expose; asoc->rto_initial = msecs_to_jiffies(sp->rtoinfo.srto_initial); asoc->rto_max = msecs_to_jiffies(sp->rtoinfo.srto_max); @@ -796,8 +797,11 @@ void sctp_assoc_control_transport(struct sctp_association *asoc, * to heartbeat success, report the SCTP_ADDR_CONFIRMED * state to the user, otherwise report SCTP_ADDR_AVAILABLE. */ - if (SCTP_UNCONFIRMED == transport->state && - SCTP_HEARTBEAT_SUCCESS == error) + if (transport->state == SCTP_PF && + asoc->pf_expose != SCTP_PF_EXPOSE_ENABLE) + ulp_notify = false; + else if (transport->state == SCTP_UNCONFIRMED && + error == SCTP_HEARTBEAT_SUCCESS) spc_state = SCTP_ADDR_CONFIRMED; else spc_state = SCTP_ADDR_AVAILABLE; @@ -820,7 +824,10 @@ void sctp_assoc_control_transport(struct sctp_association *asoc, case SCTP_TRANSPORT_PF: transport->state = SCTP_PF; - spc_state = SCTP_ADDR_POTENTIALLY_FAILED; + if (asoc->pf_expose != SCTP_PF_EXPOSE_ENABLE) + ulp_notify = false; + else + spc_state = SCTP_ADDR_POTENTIALLY_FAILED; break; default: diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 08d14d8..a18c7c4 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c @@ -1220,6 +1220,9 @@ static int __net_init sctp_defaults_init(struct net *net) /* Enable pf state by default */ net->sctp.pf_enable = 1; + /* Ignore pf exposure feature by default */ + net->sctp.pf_expose = SCTP_PF_EXPOSE_UNUSED; + /* Association.Max.Retrans - 10 attempts * Path.Max.Retrans - 5 attempts (per destination address) * Max.Init.Retransmits - 8 attempts diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 939b8d2..669e02e 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -5041,6 +5041,7 @@ static int sctp_init_sock(struct sock *sk) sp->hbinterval = net->sctp.hb_interval; sp->pathmaxrxt = net->sctp.max_retrans_path; sp->pf_retrans = net->sctp.pf_retrans; + sp->pf_expose = net->sctp.pf_expose; sp->pathmtu = 0; /* allow default discovery */ sp->sackdelay = net->sctp.sack_timeout; sp->sackfreq = 2; @@ -5521,8 +5522,16 @@ static int sctp_getsockopt_peer_addr_info(struct sock *sk, int len, transport = sctp_addr_id2transport(sk, &pinfo.spinfo_address, pinfo.spinfo_assoc_id); - if (!transport) - return -EINVAL; + if (!transport) { + retval = -EINVAL; + goto out; + } + + if (transport->state == SCTP_PF && + transport->asoc->pf_expose == SCTP_PF_EXPOSE_DISABLE) { + retval = -EACCES; + goto out; + } pinfo.spinfo_assoc_id = sctp_assoc2id(transport->asoc); pinfo.spinfo_state = transport->state; diff --git a/net/sctp/sysctl.c b/net/sctp/sysctl.c index 238cf17..5d1ad44 100644 --- a/net/sctp/sysctl.c +++ b/net/sctp/sysctl.c @@ -34,6 +34,7 @@ static int rto_alpha_min = 0; static int rto_beta_min = 0; static int rto_alpha_max = 1000; static int rto_beta_max = 1000; +static int pf_expose_max = SCTP_PF_EXPOSE_MAX; static unsigned long max_autoclose_min = 0; static unsigned long max_autoclose_max = @@ -318,6 +319,15 @@ static struct ctl_table sctp_net_table[] = { .mode = 0644, .proc_handler = proc_dointvec, }, + { + .procname = "pf_expose", + .data = &init_net.sctp.pf_expose, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = &pf_expose_max, + }, { /* sentinel */ } }; From patchwork Mon Oct 14 06:14:46 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xin Long X-Patchwork-Id: 1175996 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="MP1d1nIY"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46s7b101Ybz9sPZ for ; Mon, 14 Oct 2019 17:15:25 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729991AbfJNGPY (ORCPT ); Mon, 14 Oct 2019 02:15:24 -0400 Received: from mail-pf1-f193.google.com ([209.85.210.193]:34102 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726637AbfJNGPX (ORCPT ); Mon, 14 Oct 2019 02:15:23 -0400 Received: by mail-pf1-f193.google.com with SMTP id b128so9791994pfa.1; Sun, 13 Oct 2019 23:15:23 -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 :in-reply-to:references; bh=mwAHr1oFlcsS1hpG7CrZRy6Yk35ew3XwGC81T1iGfT8=; b=MP1d1nIYbNV6ecHjUtxl4E9A3Iq4LhlvoSptDlt7Zg0mZx46ecZUOe5VZ8wOWO/VY5 vQpktTjeSDCdCiFa7XqNqE2YkkulYOjmulxKAdgDtkqHvZ35PLAqsoON0eVWYe5xwHNn +KJb/taETtnZtzQyS6RajeYvgXN9nqOC9qnK2y5buKgKNoUSVR3J8OnMfIBLP0f08iFu DocTSx9r7VLnBCRyDIR1VszSMLTZO1H7F3ksNGPN8wMeajd+taSO+6OD1ZJKSmLczfdb pjvZMflTEq+GubFw69eHbQ64FVaCyWa04yuDRjXelgWlnscbmAPzmFihMvHT4BL964y6 HDBA== 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:in-reply-to:references; bh=mwAHr1oFlcsS1hpG7CrZRy6Yk35ew3XwGC81T1iGfT8=; b=EgP/baj4JZhD06nw+QSLK2ePBmnewfYS4wOSEuwJ7ESAT+Vv2SKBqouhDCY2ZzTmE3 iwaLKwyi/BHvsE5PsjaggzSNvNVKjniKwjM3RsKsnCqs/ZsTz753sgcNHPwhGUuhp653 iDCl8Ylpcocbe/S2QUh5Mwe0G4N8inMOOxrrfmj/k6k0NTtMKjQrJw6rgtkC2r5WSaTm ju6pAK/K9NHmoWIXMcCvZfM0oW9h5iWr4zEDGiMQvRzk3BqGnQQTsxVANqQBu9veVfel mqS87plO9b00qNk0D3QnHddqS4hqmoCrEv5dXcvMRq16s6+hsdeELrMKErKvo3T5wARh mMwg== X-Gm-Message-State: APjAAAW9EeyI8+DHSuys9Vy05Jo14gc11n/X9m1yoLbIM4/0AdQynnC5 DLV4ZlccXMF65YCi13yX0A/uYCqj X-Google-Smtp-Source: APXvYqzkYhBzrPLiHJryXOLdO/+IAkgpUEceT/sVPtlYe4xVkTGQxFXb9G8pZ2cCq+OrQddqnFddyw== X-Received: by 2002:a65:62d2:: with SMTP id m18mr30942106pgv.117.1571033722422; Sun, 13 Oct 2019 23:15:22 -0700 (PDT) Received: from localhost ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id i74sm16969514pfe.28.2019.10.13.23.15.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 13 Oct 2019 23:15:21 -0700 (PDT) From: Xin Long To: network dev , linux-sctp@vger.kernel.org Cc: Marcelo Ricardo Leitner , Neil Horman , davem@davemloft.net, David Laight Subject: [PATCHv3 net-next 3/5] sctp: add SCTP_EXPOSE_POTENTIALLY_FAILED_STATE sockopt Date: Mon, 14 Oct 2019 14:14:46 +0800 Message-Id: X-Mailer: git-send-email 2.1.0 In-Reply-To: References: <7d08b42f4c1480caa855776d92331fe9beed001d.1571033544.git.lucien.xin@gmail.com> In-Reply-To: References: Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This is a sockopt defined in section 7.3 of rfc7829: "Exposing the Potentially Failed Path State", by which users can change pf_expose per sock and asoc. v1->v2: - no change. v2->v3: - return -EINVAL if params.assoc_value > SCTP_PF_EXPOSE_MAX. - define SCTP_EXPOSE_PF_STATE SCTP_EXPOSE_POTENTIALLY_FAILED_STATE. Signed-off-by: Xin Long --- include/uapi/linux/sctp.h | 2 ++ net/sctp/socket.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/include/uapi/linux/sctp.h b/include/uapi/linux/sctp.h index d99b428..a190e4a 100644 --- a/include/uapi/linux/sctp.h +++ b/include/uapi/linux/sctp.h @@ -137,6 +137,8 @@ typedef __s32 sctp_assoc_t; #define SCTP_ASCONF_SUPPORTED 128 #define SCTP_AUTH_SUPPORTED 129 #define SCTP_ECN_SUPPORTED 130 +#define SCTP_EXPOSE_POTENTIALLY_FAILED_STATE 131 +#define SCTP_EXPOSE_PF_STATE SCTP_EXPOSE_POTENTIALLY_FAILED_STATE /* PR-SCTP policies */ #define SCTP_PR_SCTP_NONE 0x0000 diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 669e02e..eccd689 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -4589,6 +4589,40 @@ static int sctp_setsockopt_ecn_supported(struct sock *sk, return retval; } +static int sctp_setsockopt_pf_expose(struct sock *sk, + char __user *optval, + unsigned int optlen) +{ + struct sctp_assoc_value params; + struct sctp_association *asoc; + int retval = -EINVAL; + + if (optlen != sizeof(params)) + goto out; + + if (copy_from_user(¶ms, optval, optlen)) { + retval = -EFAULT; + goto out; + } + + if (params.assoc_value > SCTP_PF_EXPOSE_MAX) + goto out; + + asoc = sctp_id2assoc(sk, params.assoc_id); + if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + sctp_style(sk, UDP)) + goto out; + + if (asoc) + asoc->pf_expose = params.assoc_value; + else + sctp_sk(sk)->pf_expose = params.assoc_value; + retval = 0; + +out: + return retval; +} + /* API 6.2 setsockopt(), getsockopt() * * Applications use setsockopt() and getsockopt() to set or retrieve @@ -4798,6 +4832,9 @@ static int sctp_setsockopt(struct sock *sk, int level, int optname, case SCTP_ECN_SUPPORTED: retval = sctp_setsockopt_ecn_supported(sk, optval, optlen); break; + case SCTP_EXPOSE_POTENTIALLY_FAILED_STATE: + retval = sctp_setsockopt_pf_expose(sk, optval, optlen); + break; default: retval = -ENOPROTOOPT; break; @@ -7909,6 +7946,45 @@ static int sctp_getsockopt_ecn_supported(struct sock *sk, int len, return retval; } +static int sctp_getsockopt_pf_expose(struct sock *sk, int len, + char __user *optval, + int __user *optlen) +{ + struct sctp_assoc_value params; + struct sctp_association *asoc; + int retval = -EFAULT; + + if (len < sizeof(params)) { + retval = -EINVAL; + goto out; + } + + len = sizeof(params); + if (copy_from_user(¶ms, optval, len)) + goto out; + + asoc = sctp_id2assoc(sk, params.assoc_id); + if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC && + sctp_style(sk, UDP)) { + retval = -EINVAL; + goto out; + } + + params.assoc_value = asoc ? asoc->pf_expose + : sctp_sk(sk)->pf_expose; + + if (put_user(len, optlen)) + goto out; + + if (copy_to_user(optval, ¶ms, len)) + goto out; + + retval = 0; + +out: + return retval; +} + static int sctp_getsockopt(struct sock *sk, int level, int optname, char __user *optval, int __user *optlen) { @@ -8121,6 +8197,9 @@ static int sctp_getsockopt(struct sock *sk, int level, int optname, case SCTP_ECN_SUPPORTED: retval = sctp_getsockopt_ecn_supported(sk, len, optval, optlen); break; + case SCTP_EXPOSE_POTENTIALLY_FAILED_STATE: + retval = sctp_getsockopt_pf_expose(sk, len, optval, optlen); + break; default: retval = -ENOPROTOOPT; break; From patchwork Mon Oct 14 06:14:47 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xin Long X-Patchwork-Id: 1175997 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="EcLNgWcb"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46s7b91brPz9sPZ for ; Mon, 14 Oct 2019 17:15:33 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729999AbfJNGPc (ORCPT ); Mon, 14 Oct 2019 02:15:32 -0400 Received: from mail-pg1-f169.google.com ([209.85.215.169]:41351 "EHLO mail-pg1-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729992AbfJNGPc (ORCPT ); Mon, 14 Oct 2019 02:15:32 -0400 Received: by mail-pg1-f169.google.com with SMTP id t3so9447360pga.8; Sun, 13 Oct 2019 23:15:32 -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 :in-reply-to:references; bh=4kt8ltg5CXei01fbtUImKkvdU713LKFiqm1ftuV9G9c=; b=EcLNgWcbvwwIjW3H5ZAw2wi/CzqL3S2rxfGKb9+fqVM9u4bju5y9DmXbwr3lAd6M8W eUrfxfCq7f2UIOHxd0VRKa0QZ1x5Et+Vh79SUE5991FU0J5NS8Z+iRBWc2t9bb/AwXe9 rYxBqwYqpABHMpmU9KKlwxNDFO7QDJgVnW5EMYKLsYjs49IPsjjr1LwC3cOMx/UGgCq3 nlFkzvJ5UbTwseR8FaYYlMTJJo6SBRQtybEuumC7YsA1tgpcIjUTmTg6rJc/0xU8g28a sl1tjWxP0VjoWYet+FyVYqMczJZmR9mzPoCMEx4zCPirQnfzuk7F7VLB0HDeAIOt72yg fk7Q== 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:in-reply-to:references; bh=4kt8ltg5CXei01fbtUImKkvdU713LKFiqm1ftuV9G9c=; b=NeIx09s52mci/m29bccH/4L3mDJ/uehTzYxhn6CKmUN3kDIKdkACXypADfqHZpZUDT WWcxNwMn9hZ6Y2017N8I3akxWzHB0ANqhpoiGBZBUqK7PZY/S6AI9qlDWxAXNcpBnxN1 n2+QCzgQSeeX4jHWDiZ6TvSjgU/DUmjya3x3dBixWGlCdzO6t0D8rxvLTI6VB+a/m9tv Wjj4ujMeHFGfSMaPp8zTIZjNM1bxBFV9H4hg64akHEcU3MCvU4HPQ5EnJ0kQvRuym2IK qhZwBv9hX86dnR1anZM61Y1qrzw9VBcLhEhX2aDue67HFrgjmgy8MHisykHsJJk+Q2yI SvSw== X-Gm-Message-State: APjAAAX1T+cHldBfdYF0e/O2PXHScoCHrFDfsNwneSjVpS5mWCq0n6jj 0xUjWCxnA2IrgfJnL4FbJrUDqamV X-Google-Smtp-Source: APXvYqy9sBQi5qexE7R0I56GoaOA0tcuyZ12NjEF+dBOzOO7RZh3lPAa9sGaONOMROfFLWUx1E5pVw== X-Received: by 2002:a17:90a:1aa9:: with SMTP id p38mr35407928pjp.142.1571033731220; Sun, 13 Oct 2019 23:15:31 -0700 (PDT) Received: from localhost ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id t11sm14144439pjy.10.2019.10.13.23.15.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 13 Oct 2019 23:15:30 -0700 (PDT) From: Xin Long To: network dev , linux-sctp@vger.kernel.org Cc: Marcelo Ricardo Leitner , Neil Horman , davem@davemloft.net, David Laight Subject: [PATCHv3 net-next 4/5] sctp: add support for Primary Path Switchover Date: Mon, 14 Oct 2019 14:14:47 +0800 Message-Id: <06d05b274999621fef3e7a006444ac76dadb7725.1571033544.git.lucien.xin@gmail.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: References: <7d08b42f4c1480caa855776d92331fe9beed001d.1571033544.git.lucien.xin@gmail.com> In-Reply-To: References: Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This is a new feature defined in section 5 of rfc7829: "Primary Path Switchover". By introducing a new tunable parameter: Primary.Switchover.Max.Retrans (PSMR) The primary path will be changed to another active path when the path error counter on the old primary path exceeds PSMR, so that "the SCTP sender is allowed to continue data transmission on a new working path even when the old primary destination address becomes active again". This patch is to add this tunable parameter, 'ps_retrans' per netns, sock, asoc and transport. It also allows a user to change ps_retrans per netns by sysctl, and ps_retrans per sock/asoc/transport will be initialized with it. The check will be done in sctp_do_8_2_transport_strike() when this feature is enabled. Note this feature is disabled by initializing 'ps_retrans' per netns as 0xffff by default, and its value can't be less than 'pf_retrans' when changing by sysctl. Signed-off-by: Xin Long --- include/net/netns/sctp.h | 6 ++++++ include/net/sctp/structs.h | 11 ++++++++--- net/sctp/associola.c | 3 +++ net/sctp/protocol.c | 3 +++ net/sctp/sm_sideeffect.c | 5 +++++ net/sctp/socket.c | 1 + net/sctp/sysctl.c | 9 +++++++++ 7 files changed, 35 insertions(+), 3 deletions(-) diff --git a/include/net/netns/sctp.h b/include/net/netns/sctp.h index f97d342..c41ffdf 100644 --- a/include/net/netns/sctp.h +++ b/include/net/netns/sctp.h @@ -89,6 +89,12 @@ struct netns_sctp { */ int pf_retrans; + /* Primary.Switchover.Max.Retrans sysctl value + * taken from: + * https://tools.ietf.org/html/rfc7829 + */ + int ps_retrans; + /* * Disable Potentially-Failed feature, the feature is enabled by default * pf_enable - 0 : disable pf diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h index 9a43738..3cc913f 100644 --- a/include/net/sctp/structs.h +++ b/include/net/sctp/structs.h @@ -184,7 +184,8 @@ struct sctp_sock { __u32 flowlabel; __u8 dscp; - int pf_retrans; + __u16 pf_retrans; + __u16 ps_retrans; /* The initial Path MTU to use for new associations. */ __u32 pathmtu; @@ -897,7 +898,9 @@ struct sctp_transport { * and will be initialized from the assocs value. This can be changed * using the SCTP_PEER_ADDR_THLDS socket option */ - int pf_retrans; + __u16 pf_retrans; + /* Used for primary path switchover. */ + __u16 ps_retrans; /* PMTU : The current known path MTU. */ __u32 pathmtu; @@ -1773,7 +1776,9 @@ struct sctp_association { * and will be initialized from the assocs value. This can be * changed using the SCTP_PEER_ADDR_THLDS socket option */ - int pf_retrans; + __u16 pf_retrans; + /* Used for primary path switchover. */ + __u16 ps_retrans; /* Maximum number of times the endpoint will retransmit INIT */ __u16 max_init_attempts; diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 46763c5..a839244 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c @@ -86,6 +86,7 @@ static struct sctp_association *sctp_association_init( */ asoc->max_retrans = sp->assocparams.sasoc_asocmaxrxt; asoc->pf_retrans = sp->pf_retrans; + asoc->ps_retrans = sp->ps_retrans; asoc->pf_expose = sp->pf_expose; asoc->rto_initial = msecs_to_jiffies(sp->rtoinfo.srto_initial); @@ -628,6 +629,8 @@ struct sctp_transport *sctp_assoc_add_peer(struct sctp_association *asoc, /* And the partial failure retrans threshold */ peer->pf_retrans = asoc->pf_retrans; + /* And the primary path switchover retrans threshold */ + peer->ps_retrans = asoc->ps_retrans; /* Initialize the peer's SACK delay timeout based on the * association configured value. diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index a18c7c4..ea1de9b 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c @@ -1217,6 +1217,9 @@ static int __net_init sctp_defaults_init(struct net *net) /* Max.Burst - 4 */ net->sctp.max_burst = SCTP_DEFAULT_MAX_BURST; + /* Disable of Primary Path Switchover by default */ + net->sctp.ps_retrans = 0xffff; + /* Enable pf state by default */ net->sctp.pf_enable = 1; diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c index e52b212..acd737d 100644 --- a/net/sctp/sm_sideeffect.c +++ b/net/sctp/sm_sideeffect.c @@ -567,6 +567,11 @@ static void sctp_do_8_2_transport_strike(struct sctp_cmd_seq *commands, SCTP_FAILED_THRESHOLD); } + if (transport->error_count > transport->ps_retrans && + asoc->peer.primary_path == transport && + asoc->peer.active_path != transport) + sctp_assoc_set_primary(asoc, asoc->peer.active_path); + /* E2) For the destination address for which the timer * expires, set RTO <- RTO * 2 ("back off the timer"). The * maximum value discussed in rule C7 above (RTO.max) may be diff --git a/net/sctp/socket.c b/net/sctp/socket.c index eccd689..38d102b 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -5078,6 +5078,7 @@ static int sctp_init_sock(struct sock *sk) sp->hbinterval = net->sctp.hb_interval; sp->pathmaxrxt = net->sctp.max_retrans_path; sp->pf_retrans = net->sctp.pf_retrans; + sp->ps_retrans = net->sctp.ps_retrans; sp->pf_expose = net->sctp.pf_expose; sp->pathmtu = 0; /* allow default discovery */ sp->sackdelay = net->sctp.sack_timeout; diff --git a/net/sctp/sysctl.c b/net/sctp/sysctl.c index 5d1ad44..adf264a 100644 --- a/net/sctp/sysctl.c +++ b/net/sctp/sysctl.c @@ -213,6 +213,15 @@ static struct ctl_table sctp_net_table[] = { .mode = 0644, .proc_handler = proc_dointvec_minmax, .extra1 = SYSCTL_ZERO, + .extra2 = &init_net.sctp.ps_retrans, + }, + { + .procname = "ps_retrans", + .data = &init_net.sctp.ps_retrans, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = &init_net.sctp.pf_retrans, .extra2 = SYSCTL_INT_MAX, }, { From patchwork Mon Oct 14 06:14:48 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xin Long X-Patchwork-Id: 1175998 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@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=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="pFAO7Y88"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 46s7bK6hjRz9sPZ for ; Mon, 14 Oct 2019 17:15:41 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730005AbfJNGPl (ORCPT ); Mon, 14 Oct 2019 02:15:41 -0400 Received: from mail-pg1-f194.google.com ([209.85.215.194]:38919 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729992AbfJNGPl (ORCPT ); Mon, 14 Oct 2019 02:15:41 -0400 Received: by mail-pg1-f194.google.com with SMTP id p12so123044pgn.6; Sun, 13 Oct 2019 23:15:40 -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 :in-reply-to:references; bh=SCegqBu7obP4C1vjXUQ/JwtpNhLhgLmaqkRllXH+g2g=; b=pFAO7Y88cx+p1YGzFqlD3kntFfK83ZFBnqD9n7x28N5VyC6iWxHeJdSe15cfCMQavD bRiv6FrGC+WZd8ulwzPIzj/FFaNIKOZrvY6NfZ0HjVVUPhfHyTq4f4YFeS8TVk9acBIq 20Eb7e4SiGvGJCx0ZSGh2hRBk5Ow3JOsyD9Y68Zcrk/xYnd7zGvKGLaAnIZiloxQRFjJ 04r2P7C93Y95rhsB9vLMOBk8xKcPg2b4lrhCuAm1tSHgZ4jU4apw0QBgjC3b0YELPvjL mkI3kHizLVVsHtICp8dCEFVILIKpnX4VgO9YuX85VpZ+lMh7eIs4quMB81E6eOV/389W WnRA== 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:in-reply-to:references; bh=SCegqBu7obP4C1vjXUQ/JwtpNhLhgLmaqkRllXH+g2g=; b=YW8eHVoOrg7b27jEAysJjW3XnNHSq4tTzhoaU0v2suoES+FXkrxxlCM2JnZJjU+dtZ xF/icG7g67mFnU4i+3ChK3fslDarJuXE8jZdo1E2wichc6VapI0TQSOxMMNpduqdO2cG vchGTeV1Ushud00cewMTwDQQD0aXSfXtFjkJp+/NQ3ditrKLy0Q5aGw9CqpZ0mrELPwX aVtAsyieh9hXGlfzY79vJ1+J2dRl07fc50O9Dj+bjJHGJUU5eERReM29iMW5z8awQLBV FrMkGdFBq/S0lpKWsiz9EjD8oZaws07HQwnPBo7rUr0rmE72z7trS37cypdqD7QzVlFi 90ZQ== X-Gm-Message-State: APjAAAXRwFAlMZS3CMBo+1H2v7OsgxjpFbPZrbRVs6KWE00qKrm38T3W Qv6BqcMU/Uo3ubipID6y0YK1scBz X-Google-Smtp-Source: APXvYqwixdMLac6Y2mXmOJxReEZ9eHx/3CoqDD5e7ETvzfZTo4CLn5NZE3asm412WRHo8Isf8ET2LQ== X-Received: by 2002:a17:90a:246c:: with SMTP id h99mr32893290pje.127.1571033739574; Sun, 13 Oct 2019 23:15:39 -0700 (PDT) Received: from localhost ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id e17sm17035659pfl.40.2019.10.13.23.15.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 13 Oct 2019 23:15:38 -0700 (PDT) From: Xin Long To: network dev , linux-sctp@vger.kernel.org Cc: Marcelo Ricardo Leitner , Neil Horman , davem@davemloft.net, David Laight Subject: [PATCHv3 net-next 5/5] sctp: add SCTP_PEER_ADDR_THLDS_V2 sockopt Date: Mon, 14 Oct 2019 14:14:48 +0800 Message-Id: X-Mailer: git-send-email 2.1.0 In-Reply-To: <06d05b274999621fef3e7a006444ac76dadb7725.1571033544.git.lucien.xin@gmail.com> References: <7d08b42f4c1480caa855776d92331fe9beed001d.1571033544.git.lucien.xin@gmail.com> <06d05b274999621fef3e7a006444ac76dadb7725.1571033544.git.lucien.xin@gmail.com> In-Reply-To: References: Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Section 7.2 of rfc7829: "Peer Address Thresholds (SCTP_PEER_ADDR_THLDS) Socket Option" extends 'struct sctp_paddrthlds' with 'spt_pathcpthld' added to allow a user to change ps_retrans per sock/asoc/transport, as other 2 paddrthlds: pf_retrans, pathmaxrxt. Note: to not break the user's program, here to support pf_retrans dump and setting by adding a new sockopt SCTP_PEER_ADDR_THLDS_V2, and a new structure sctp_paddrthlds_v2 instead of extending sctp_paddrthlds. Also, when setting ps_retrans, the value is not allowed to be greater than pf_retrans. v1->v2: - use SCTP_PEER_ADDR_THLDS_V2 to set/get pf_retrans instead, as Marcelo and David Laight suggested. v2->v3: - no change. Signed-off-by: Xin Long --- include/uapi/linux/sctp.h | 10 +++++++++ net/sctp/socket.c | 54 +++++++++++++++++++++++++++++++++++------------ 2 files changed, 50 insertions(+), 14 deletions(-) diff --git a/include/uapi/linux/sctp.h b/include/uapi/linux/sctp.h index a190e4a..28ad40d 100644 --- a/include/uapi/linux/sctp.h +++ b/include/uapi/linux/sctp.h @@ -105,6 +105,7 @@ typedef __s32 sctp_assoc_t; #define SCTP_DEFAULT_SNDINFO 34 #define SCTP_AUTH_DEACTIVATE_KEY 35 #define SCTP_REUSE_PORT 36 +#define SCTP_PEER_ADDR_THLDS_V2 37 /* Internal Socket Options. Some of the sctp library functions are * implemented using these socket options. @@ -1087,6 +1088,15 @@ struct sctp_paddrthlds { __u16 spt_pathpfthld; }; +/* Use a new structure with spt_pathcpthld for back compatibility */ +struct sctp_paddrthlds_v2 { + sctp_assoc_t spt_assoc_id; + struct sockaddr_storage spt_address; + __u16 spt_pathmaxrxt; + __u16 spt_pathpfthld; + __u16 spt_pathcpthld; +}; + /* * Socket Option for Getting the Association/Stream-Specific PR-SCTP Status */ diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 38d102b..3d2bad2 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -3943,18 +3943,22 @@ static int sctp_setsockopt_auto_asconf(struct sock *sk, char __user *optval, */ static int sctp_setsockopt_paddr_thresholds(struct sock *sk, char __user *optval, - unsigned int optlen) + unsigned int optlen, bool v2) { - struct sctp_paddrthlds val; + struct sctp_paddrthlds_v2 val; struct sctp_transport *trans; struct sctp_association *asoc; + int len; - if (optlen < sizeof(struct sctp_paddrthlds)) + len = v2 ? sizeof(val) : sizeof(struct sctp_paddrthlds); + if (optlen < len) return -EINVAL; - if (copy_from_user(&val, (struct sctp_paddrthlds __user *)optval, - sizeof(struct sctp_paddrthlds))) + if (copy_from_user(&val, optval, len)) return -EFAULT; + if (v2 && val.spt_pathpfthld > val.spt_pathcpthld) + return -EINVAL; + if (!sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) { trans = sctp_addr_id2transport(sk, &val.spt_address, val.spt_assoc_id); @@ -3963,6 +3967,8 @@ static int sctp_setsockopt_paddr_thresholds(struct sock *sk, if (val.spt_pathmaxrxt) trans->pathmaxrxt = val.spt_pathmaxrxt; + if (v2) + trans->ps_retrans = val.spt_pathcpthld; trans->pf_retrans = val.spt_pathpfthld; return 0; @@ -3978,17 +3984,23 @@ static int sctp_setsockopt_paddr_thresholds(struct sock *sk, transports) { if (val.spt_pathmaxrxt) trans->pathmaxrxt = val.spt_pathmaxrxt; + if (v2) + trans->ps_retrans = val.spt_pathcpthld; trans->pf_retrans = val.spt_pathpfthld; } if (val.spt_pathmaxrxt) asoc->pathmaxrxt = val.spt_pathmaxrxt; + if (v2) + asoc->ps_retrans = val.spt_pathcpthld; asoc->pf_retrans = val.spt_pathpfthld; } else { struct sctp_sock *sp = sctp_sk(sk); if (val.spt_pathmaxrxt) sp->pathmaxrxt = val.spt_pathmaxrxt; + if (v2) + sp->ps_retrans = val.spt_pathcpthld; sp->pf_retrans = val.spt_pathpfthld; } @@ -4778,7 +4790,12 @@ static int sctp_setsockopt(struct sock *sk, int level, int optname, retval = sctp_setsockopt_auto_asconf(sk, optval, optlen); break; case SCTP_PEER_ADDR_THLDS: - retval = sctp_setsockopt_paddr_thresholds(sk, optval, optlen); + retval = sctp_setsockopt_paddr_thresholds(sk, optval, optlen, + false); + break; + case SCTP_PEER_ADDR_THLDS_V2: + retval = sctp_setsockopt_paddr_thresholds(sk, optval, optlen, + true); break; case SCTP_RECVRCVINFO: retval = sctp_setsockopt_recvrcvinfo(sk, optval, optlen); @@ -7217,18 +7234,19 @@ static int sctp_getsockopt_assoc_ids(struct sock *sk, int len, * http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt */ static int sctp_getsockopt_paddr_thresholds(struct sock *sk, - char __user *optval, - int len, - int __user *optlen) + char __user *optval, int len, + int __user *optlen, bool v2) { - struct sctp_paddrthlds val; + struct sctp_paddrthlds_v2 val; struct sctp_transport *trans; struct sctp_association *asoc; + int min; - if (len < sizeof(struct sctp_paddrthlds)) + min = v2 ? sizeof(val) : sizeof(struct sctp_paddrthlds); + if (len < min) return -EINVAL; - len = sizeof(struct sctp_paddrthlds); - if (copy_from_user(&val, (struct sctp_paddrthlds __user *)optval, len)) + len = min; + if (copy_from_user(&val, optval, len)) return -EFAULT; if (!sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) { @@ -7239,6 +7257,7 @@ static int sctp_getsockopt_paddr_thresholds(struct sock *sk, val.spt_pathmaxrxt = trans->pathmaxrxt; val.spt_pathpfthld = trans->pf_retrans; + val.spt_pathcpthld = trans->ps_retrans; goto out; } @@ -7251,11 +7270,13 @@ static int sctp_getsockopt_paddr_thresholds(struct sock *sk, if (asoc) { val.spt_pathpfthld = asoc->pf_retrans; val.spt_pathmaxrxt = asoc->pathmaxrxt; + val.spt_pathcpthld = asoc->ps_retrans; } else { struct sctp_sock *sp = sctp_sk(sk); val.spt_pathpfthld = sp->pf_retrans; val.spt_pathmaxrxt = sp->pathmaxrxt; + val.spt_pathcpthld = sp->ps_retrans; } out: @@ -8135,7 +8156,12 @@ static int sctp_getsockopt(struct sock *sk, int level, int optname, retval = sctp_getsockopt_auto_asconf(sk, len, optval, optlen); break; case SCTP_PEER_ADDR_THLDS: - retval = sctp_getsockopt_paddr_thresholds(sk, optval, len, optlen); + retval = sctp_getsockopt_paddr_thresholds(sk, optval, len, + optlen, false); + break; + case SCTP_PEER_ADDR_THLDS_V2: + retval = sctp_getsockopt_paddr_thresholds(sk, optval, len, + optlen, true); break; case SCTP_GET_ASSOC_STATS: retval = sctp_getsockopt_assoc_stats(sk, len, optval, optlen);