From patchwork Tue Oct 3 22:20:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcelo Ricardo Leitner X-Patchwork-Id: 821040 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=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="exscAVXa"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3y6D5B3lXMz9sRW for ; Wed, 4 Oct 2017 09:21:02 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751540AbdJCWUy (ORCPT ); Tue, 3 Oct 2017 18:20:54 -0400 Received: from mail-qk0-f196.google.com ([209.85.220.196]:35691 "EHLO mail-qk0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751148AbdJCWUr (ORCPT ); Tue, 3 Oct 2017 18:20:47 -0400 Received: by mail-qk0-f196.google.com with SMTP id w63so5274279qkd.2; Tue, 03 Oct 2017 15:20:46 -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=d/76U0rW+ClfVJuMXKoyyFpXj5XGdIz/Mn5ZxzQEbK0=; b=exscAVXaYxOTTSuAu/ieDm2RY39fE70p8xSL45/wv/zld55ydcPmzsNiAFyB36PIyI 85fSp0/Ko5QmbNIktjsGQEayuhoL16BvtS+kGAtE6P6rBfDofivND/PoUatXsTZxLIGq tIw8Cdwaz4T/LzCpkKXh3RXZ0EiLX7xzhur9vKSEsNI6q1Jawiii25lrqidvi+BLYIIe I+/0/hy5TC/dorB3MAMklh0boVTSRBm6MBxQdBslzKuPTs64ciVnx6dZSd80/MRTFY+h +oKRj4VNwXHLet1Oqk9vQyux+GEQ3JHEXGdb5NgE3+FQarPMcrpO1+w7ebdJsgqiZCoa 0gsw== 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=d/76U0rW+ClfVJuMXKoyyFpXj5XGdIz/Mn5ZxzQEbK0=; b=O6KC7Rr2wdrS9h4+DATY9f1V49zwsxyY2X3JRCAIg8m3fugkxnU9ZiOvve2B9e02P0 UjUdx1JHQyZjroXirbV3K5S+8TCfGImSiLt++14CgoaB0sF6wU9pBlYdBY8owcRAYidJ TZjRyArJMryeEj8deSDjqNOgdKSVADyA7NYWe0XUK5p0ddKN8ubXyA6jmoxuNcJHQbut uCmpohSQ8V2SI3oV/Gyap6oFl7uR9eivxkMuPWYxat0gh/bSZbUvoO4oTTBPRWLQvhbP dDC8MegF5Hd9UDQM47o2do5lpU9f3Fj6f5Z4iRX4oAeubPSGgaqNTZtiLhFmAQLfBG1t LqrA== X-Gm-Message-State: AMCzsaWdh20vAxrZqjDhULjT4g+iyvvuiSjhyxVbMgulYZsyh+5049o0 eJTkc2qzfJs9qEV01MN++l2xIGwK X-Google-Smtp-Source: AOwi7QAK0IXWVYyYILZVHC6EJvpoU5G6aCu5VNjNUPQJoVtYuMZv+WuZCEDGDSThSeABksUoH7rzBw== X-Received: by 10.55.92.195 with SMTP id q186mr8398263qkb.154.1507069246113; Tue, 03 Oct 2017 15:20:46 -0700 (PDT) Received: from localhost.localdomain.com ([2001:1284:f013:2f91:ff99:4075:72f0:1535]) by smtp.gmail.com with ESMTPSA id 39sm4328568qkw.63.2017.10.03.15.20.44 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 03 Oct 2017 15:20:45 -0700 (PDT) From: Marcelo Ricardo Leitner To: netdev@vger.kernel.org Cc: linux-sctp@vger.kernel.org, Neil Horman , Vlad Yasevich , Xin Long , David Laight Subject: [PATCH net-next v2 07/10] sctp: add sockopt to get/set stream scheduler Date: Tue, 3 Oct 2017 19:20:14 -0300 Message-Id: <090a1bae18ebb608b325f494b41ceb682874ea61.1507069005.git.marcelo.leitner@gmail.com> X-Mailer: git-send-email 2.13.5 In-Reply-To: References: Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org As defined per RFC Draft ndata Section 4.3.2, named as SCTP_STREAM_SCHEDULER. See-also: https://tools.ietf.org/html/draft-ietf-tsvwg-sctp-ndata-13 Tested-by: Xin Long Signed-off-by: Marcelo Ricardo Leitner --- include/uapi/linux/sctp.h | 1 + net/sctp/socket.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/include/uapi/linux/sctp.h b/include/uapi/linux/sctp.h index 4487e7625ddbd48be1868a8292a807ecd0a314bc..0050f10087d224bad87c8c54ad318003381aee12 100644 --- a/include/uapi/linux/sctp.h +++ b/include/uapi/linux/sctp.h @@ -122,6 +122,7 @@ typedef __s32 sctp_assoc_t; #define SCTP_RESET_ASSOC 120 #define SCTP_ADD_STREAMS 121 #define SCTP_SOCKOPT_PEELOFF_FLAGS 122 +#define SCTP_STREAM_SCHEDULER 123 /* PR-SCTP policies */ #define SCTP_PR_SCTP_NONE 0x0000 diff --git a/net/sctp/socket.c b/net/sctp/socket.c index d207734326b085e60625e4333f74221481114892..ae35dbf2810f78c71ce77115ffe4b0e27a672abc 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -79,6 +79,7 @@ #include #include #include +#include /* Forward declarations for internal helper functions. */ static int sctp_writeable(struct sock *sk); @@ -3914,6 +3915,36 @@ static int sctp_setsockopt_add_streams(struct sock *sk, return retval; } +static int sctp_setsockopt_scheduler(struct sock *sk, + char __user *optval, + unsigned int optlen) +{ + struct sctp_association *asoc; + struct sctp_assoc_value params; + int retval = -EINVAL; + + if (optlen < sizeof(params)) + goto out; + + optlen = sizeof(params); + if (copy_from_user(¶ms, optval, optlen)) { + retval = -EFAULT; + goto out; + } + + if (params.assoc_value > SCTP_SS_MAX) + goto out; + + asoc = sctp_id2assoc(sk, params.assoc_id); + if (!asoc) + goto out; + + retval = sctp_sched_set_sched(asoc, params.assoc_value); + +out: + return retval; +} + /* API 6.2 setsockopt(), getsockopt() * * Applications use setsockopt() and getsockopt() to set or retrieve @@ -4095,6 +4126,9 @@ static int sctp_setsockopt(struct sock *sk, int level, int optname, case SCTP_ADD_STREAMS: retval = sctp_setsockopt_add_streams(sk, optval, optlen); break; + case SCTP_STREAM_SCHEDULER: + retval = sctp_setsockopt_scheduler(sk, optval, optlen); + break; default: retval = -ENOPROTOOPT; break; @@ -6793,6 +6827,43 @@ static int sctp_getsockopt_enable_strreset(struct sock *sk, int len, return retval; } +static int sctp_getsockopt_scheduler(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) { + retval = -EINVAL; + goto out; + } + + params.assoc_value = sctp_sched_get_sched(asoc); + + 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) { @@ -6975,6 +7046,10 @@ static int sctp_getsockopt(struct sock *sk, int level, int optname, retval = sctp_getsockopt_enable_strreset(sk, len, optval, optlen); break; + case SCTP_STREAM_SCHEDULER: + retval = sctp_getsockopt_scheduler(sk, len, optval, + optlen); + break; default: retval = -ENOPROTOOPT; break;