From patchwork Thu Mar 1 15:05:12 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xin Long X-Patchwork-Id: 879901 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; 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="AmyyYJ2H"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zsbNN5fbRz9s1S for ; Fri, 2 Mar 2018 02:05:56 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031693AbeCAPFy (ORCPT ); Thu, 1 Mar 2018 10:05:54 -0500 Received: from mail-pl0-f65.google.com ([209.85.160.65]:35475 "EHLO mail-pl0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031599AbeCAPFw (ORCPT ); Thu, 1 Mar 2018 10:05:52 -0500 Received: by mail-pl0-f65.google.com with SMTP id bb3-v6so3792096plb.2; Thu, 01 Mar 2018 07:05:52 -0800 (PST) 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=kgwkBpH7cJ/OwZkuuwx54R1mELt3F1P+xzj/evF4gUA=; b=AmyyYJ2HXfvhF5XEz3urG4SlQ/0107HWjnT93D/ABX/d2UWLXpZCRlu7L3KAKrBdip Le+6ONQ+GOq3OruznECje4DkRqH2ahLDYMwzrf135xZzuUysCE8GJzCWMIvKPmYagPRN 9SLkkWCXkApDMm702ZJTHVtCTp3s9umC6Vo2TDhFB3f2hrEcpsGkDxC691zUD+0L/vpQ k3vBylY8n6eokrd0I+IVK7fEtrao4L+b+ZJSY1kFlSWHjHqAp08iOlVHPDDX4y7pMRM2 Z1o6tUlnq3Fy9/OPtQzaX/glq5EZ3ZA8plx3cjSfzR7EOzgADfTEHqNNQ1FFv578YUYV OVhg== 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=kgwkBpH7cJ/OwZkuuwx54R1mELt3F1P+xzj/evF4gUA=; b=o+9zeqqKo6XJAZTefRkmBgNNmCwOnUsIr9qKJ00voynLWw+RbGP/W0nT+Lgz5Q+ctV r1XBsuvoW04BcneS1tCmAr7w0b07YUW6OepGw1uFTaljXFnIjESjHXd5VICgTWO2DRaF URpAtUYiFX1MoZ8xDdqrCX/ur2oTVj7rg4TNbD4uG6ol8C+mzdl8zE7aQ1t1keiNGfXd zJgMEJO1NX6WMWjfC7/GdLe0WvlEw9WW4TVTGY5h96loApnJMMr9gQ48xMZOXUFR727L 2gzgWrn1E5Aia6shtB+U8CJnoWCdchmKagT8WvQ4qsgKjCRhXnxwRTwlUI7zNYoQUYEp +PzQ== X-Gm-Message-State: APf1xPAvmmJ4B8IkIqoiol7bDKq0/6xfsfgUf4EGVy/wsRTtcx4CpaDj /dGvo4JUZr2PcmQQTVN29Gd1SSsz X-Google-Smtp-Source: AG47ELsOADEK+d9MHUM+aM/Ww0oE57SD6/3XJUaG6ZHpYRfqckkZ9rl2F1UyEv1l6xwQKRYJiEx0iw== X-Received: by 2002:a17:902:4643:: with SMTP id o61-v6mr2258061pld.103.1519916751867; Thu, 01 Mar 2018 07:05:51 -0800 (PST) Received: from localhost ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id n67sm9257779pfh.150.2018.03.01.07.05.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 01 Mar 2018 07:05:51 -0800 (PST) From: Xin Long To: network dev , linux-sctp@vger.kernel.org Cc: Marcelo Ricardo Leitner , Neil Horman , davem@davemloft.net Subject: [PATCH net-next 3/9] sctp: factor out sctp_sendmsg_check_sflags from sctp_sendmsg Date: Thu, 1 Mar 2018 23:05:12 +0800 Message-Id: <588fe081ed87c02258db4caf0377979d19a8132a.1519916440.git.lucien.xin@gmail.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: References: <1dbdb93e27d978da9fe883dbe72db78fbb58ec95.1519916440.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 patch is to move the codes for checking sinfo_flags on one asoc after this asoc has been found into sctp_sendmsg_check_sflags. Signed-off-by: Xin Long --- net/sctp/socket.c | 72 +++++++++++++++++++++++++++---------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 58bb55d..93cff99 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -1687,6 +1687,39 @@ static int sctp_sendmsg_new_asoc(struct sock *sk, __u16 sflags, return err; } +static int sctp_sendmsg_check_sflags(struct sctp_association *asoc, + __u16 sflags, struct msghdr *msg, + size_t msg_len) +{ + struct sock *sk = asoc->base.sk; + struct net *net = sock_net(sk); + + if (sctp_state(asoc, CLOSED) && sctp_style(sk, TCP)) + return -EPIPE; + + if (sflags & SCTP_EOF) { + pr_debug("%s: shutting down association:%p\n", __func__, asoc); + sctp_primitive_SHUTDOWN(net, asoc, NULL); + + return 0; + } + + if (sflags & SCTP_ABORT) { + struct sctp_chunk *chunk; + + chunk = sctp_make_abort_user(asoc, msg, msg_len); + if (!chunk) + return -ENOMEM; + + pr_debug("%s: aborting association:%p\n", __func__, asoc); + sctp_primitive_ABORT(net, asoc, chunk); + + return 0; + } + + return 1; +} + static int sctp_sendmsg_to_asoc(struct sctp_association *asoc, struct msghdr *msg, size_t msg_len, struct sctp_transport *transport, @@ -1783,12 +1816,10 @@ static int sctp_sendmsg_to_asoc(struct sctp_association *asoc, static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) { - struct net *net = sock_net(sk); struct sctp_sock *sp; struct sctp_endpoint *ep; struct sctp_association *new_asoc = NULL, *asoc = NULL; struct sctp_transport *transport, *chunk_tp; - struct sctp_chunk *chunk; union sctp_addr to; struct sockaddr *msg_name = NULL; struct sctp_sndrcvinfo default_sinfo; @@ -1906,41 +1937,10 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) } if (asoc) { - pr_debug("%s: just looked up association:%p\n", __func__, asoc); - - /* We cannot send a message on a TCP-style SCTP_SS_ESTABLISHED - * socket that has an association in CLOSED state. This can - * happen when an accepted socket has an association that is - * already CLOSED. - */ - if (sctp_state(asoc, CLOSED) && sctp_style(sk, TCP)) { - err = -EPIPE; - goto out_unlock; - } - - if (sinfo_flags & SCTP_EOF) { - pr_debug("%s: shutting down association:%p\n", - __func__, asoc); - - sctp_primitive_SHUTDOWN(net, asoc, NULL); - err = 0; + err = sctp_sendmsg_check_sflags(asoc, sinfo_flags, msg, + msg_len); + if (err <= 0) goto out_unlock; - } - if (sinfo_flags & SCTP_ABORT) { - - chunk = sctp_make_abort_user(asoc, msg, msg_len); - if (!chunk) { - err = -ENOMEM; - goto out_unlock; - } - - pr_debug("%s: aborting association:%p\n", - __func__, asoc); - - sctp_primitive_ABORT(net, asoc, chunk); - err = 0; - goto out_unlock; - } } /* Do we need to create the association? */