From patchwork Tue Oct 3 22:20:15 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: 821039 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="q//qzK5Q"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3y6D572BT7z9sRW for ; Wed, 4 Oct 2017 09:20:59 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751609AbdJCWU4 (ORCPT ); Tue, 3 Oct 2017 18:20:56 -0400 Received: from mail-qk0-f193.google.com ([209.85.220.193]:35701 "EHLO mail-qk0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751345AbdJCWUt (ORCPT ); Tue, 3 Oct 2017 18:20:49 -0400 Received: by mail-qk0-f193.google.com with SMTP id w63so5274333qkd.2; Tue, 03 Oct 2017 15:20:49 -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=/OfTNmJWmJFC+dgrI3aamAZzeanMRk5Sgrd2Z7YptBc=; b=q//qzK5QkD3f8cxm+6LaSnjcAgEIHBQ0Cs1EMp3dnS5f420mR+AAkS0buOvJdZ+gLn BM421Ozz4ZSGzrMprjFoxQF9YQeiTYYldDqIRVsHM0Bdw3EFS/U56hC+4uHm/vn0eiab nkTTmEvvxxqyvDFxjfyyz7qy+FcaN9IKrqc8uN0h3X1Z6c4wYDN5t55uwPJ1+5yZjD23 aSDw7AA+Y4iE49/p77drXKozpNMCdaZX6i9SVe+yI5mFB2Tqmnppj4CjagXLrF+whUcO i2oX/KPLjvY9VeX0t6P7njB0H/X6Du45ki1VhBA1gbGaDuZCkIUY5r7pn4eAXm0ZFYcv bSIg== 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=/OfTNmJWmJFC+dgrI3aamAZzeanMRk5Sgrd2Z7YptBc=; b=J4ajDzU5GV2CJUo+ucwhKcJtlF9axyfnRb7OoDz1j0UnHHVo5vwDQWXKb3LIKCN4hQ F5JsiMExP2vjvyxuG40+JrxdlFA8HkTdmF9IS8Hht/o1uwDV1mUjgpL4nkm5PnufmEZc 2zN3sDZLZRpGBFvlDmIgowq4k36oYROyS2tDpyI3g7K8eGQ+miQN4jy/sOOuDMwEHsPI ny46fxuJq6BIq+IuLkeRxMtRhi4UNp6GH4wk+3jWiltYf2wF0udifecNVjZfwhvU8/7o K1zDzg8JkvkuJbNpHKAAIEE/0Jalk/E+M5ghmtAV75zXK2Jjl/WYisheqbrn8OhJgMlA cjuA== X-Gm-Message-State: AMCzsaWpomJ599sDmQrCaNrAnb9cKIri1bZFEpQxiz63FvhfGiKGLe67 PBcHcLQdgtpCLosBCq9f1HmHPueZ X-Google-Smtp-Source: AOwi7QDNmeoKEwocQeex6z6s0ZdXTB4kaXLq+O/Qzm00COpM9f4jYV9umZr2abPZ3VilS1XVlrkifA== X-Received: by 10.55.96.67 with SMTP id u64mr14860050qkb.323.1507069248431; Tue, 03 Oct 2017 15:20:48 -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.46 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 03 Oct 2017 15:20:47 -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 08/10] sctp: add sockopt to get/set stream scheduler parameters Date: Tue, 3 Oct 2017 19:20:15 -0300 Message-Id: <4c3518e2562de45167797f98f78d29521cf7b7af.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.3, named as SCTP_STREAM_SCHEDULER_VALUE. 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 | 7 +++++ net/sctp/socket.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/include/uapi/linux/sctp.h b/include/uapi/linux/sctp.h index 0050f10087d224bad87c8c54ad318003381aee12..00ac417d2c4f8468ea2aad32e59806be5c5aa08d 100644 --- a/include/uapi/linux/sctp.h +++ b/include/uapi/linux/sctp.h @@ -123,6 +123,7 @@ typedef __s32 sctp_assoc_t; #define SCTP_ADD_STREAMS 121 #define SCTP_SOCKOPT_PEELOFF_FLAGS 122 #define SCTP_STREAM_SCHEDULER 123 +#define SCTP_STREAM_SCHEDULER_VALUE 124 /* PR-SCTP policies */ #define SCTP_PR_SCTP_NONE 0x0000 @@ -815,6 +816,12 @@ struct sctp_assoc_value { uint32_t assoc_value; }; +struct sctp_stream_value { + sctp_assoc_t assoc_id; + uint16_t stream_id; + uint16_t stream_value; +}; + /* * 7.2.2 Peer Address Information * diff --git a/net/sctp/socket.c b/net/sctp/socket.c index ae35dbf2810f78c71ce77115ffe4b0e27a672abc..88c28421ec151e83665efcbcbd8a6403b122205a 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -3945,6 +3945,34 @@ static int sctp_setsockopt_scheduler(struct sock *sk, return retval; } +static int sctp_setsockopt_scheduler_value(struct sock *sk, + char __user *optval, + unsigned int optlen) +{ + struct sctp_association *asoc; + struct sctp_stream_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; + } + + asoc = sctp_id2assoc(sk, params.assoc_id); + if (!asoc) + goto out; + + retval = sctp_sched_set_value(asoc, params.stream_id, + params.stream_value, GFP_KERNEL); + +out: + return retval; +} + /* API 6.2 setsockopt(), getsockopt() * * Applications use setsockopt() and getsockopt() to set or retrieve @@ -4129,6 +4157,9 @@ static int sctp_setsockopt(struct sock *sk, int level, int optname, case SCTP_STREAM_SCHEDULER: retval = sctp_setsockopt_scheduler(sk, optval, optlen); break; + case SCTP_STREAM_SCHEDULER_VALUE: + retval = sctp_setsockopt_scheduler_value(sk, optval, optlen); + break; default: retval = -ENOPROTOOPT; break; @@ -6864,6 +6895,48 @@ static int sctp_getsockopt_scheduler(struct sock *sk, int len, return retval; } +static int sctp_getsockopt_scheduler_value(struct sock *sk, int len, + char __user *optval, + int __user *optlen) +{ + struct sctp_stream_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; + } + + retval = sctp_sched_get_value(asoc, params.stream_id, + ¶ms.stream_value); + if (retval) + goto out; + + if (put_user(len, optlen)) { + retval = -EFAULT; + goto out; + } + + if (copy_to_user(optval, ¶ms, len)) { + retval = -EFAULT; + goto out; + } + +out: + return retval; +} + static int sctp_getsockopt(struct sock *sk, int level, int optname, char __user *optval, int __user *optlen) { @@ -7050,6 +7123,10 @@ static int sctp_getsockopt(struct sock *sk, int level, int optname, retval = sctp_getsockopt_scheduler(sk, len, optval, optlen); break; + case SCTP_STREAM_SCHEDULER_VALUE: + retval = sctp_getsockopt_scheduler_value(sk, len, optval, + optlen); + break; default: retval = -ENOPROTOOPT; break;