From patchwork Thu Mar 1 15:05:10 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xin Long X-Patchwork-Id: 879899 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="ZtTy3/Ht"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zsbN401j9z9s1t for ; Fri, 2 Mar 2018 02:05:40 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031686AbeCAPFi (ORCPT ); Thu, 1 Mar 2018 10:05:38 -0500 Received: from mail-pg0-f65.google.com ([74.125.83.65]:46271 "EHLO mail-pg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031604AbeCAPFg (ORCPT ); Thu, 1 Mar 2018 10:05:36 -0500 Received: by mail-pg0-f65.google.com with SMTP id r26so2402620pgv.13; Thu, 01 Mar 2018 07:05:36 -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=mnZ1fA3tr9o0LOKLQnQYJg/S1THYWWD6BnC7dxbAbt0=; b=ZtTy3/HtmsYp6tYH4RmMe1buLdVOy2nMqBJM6zoBQiZjMfD6mDP7Z1lrAtRHc9QKwb r2sGV44f3x26kESj6bUQmwXhP+zmrSCwbsNFmpg1JDzdg6ZkPBtXEulxp51CTOA2oZV/ 77ikML08lw0aaEkSGmwOk5aHpz+HWrrtDT8ACcNHbtWfcGep4gXYXnpLE8rZBSmsLWyz M1uHxIy1KRsaype+JsGSBp8VAUnXTlA6zs2hWJwy5Vk4Lv5bPMJxlB7q63l9PfpyGotF zKPf1FiM3P+W59Y85gFAlkQswdAG6421K1n+1SqUS93uX34ymmZCjNLx1KD7z2p34NgK w6/g== 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=mnZ1fA3tr9o0LOKLQnQYJg/S1THYWWD6BnC7dxbAbt0=; b=MX+2QjDaAa9DERPSvdiiiJ5h0Sz5sWx2VHdy8ZIqpVV6uZ5cJZ/SuCYbSYTwyQGNOK vPy4XM90Fo4w/vUppycNodyKmODpkDo366hLFGd931G7p9B5J7nuzj4MPsuiuS+F8qkv 3tTKgSlRPkJBWstLYyGJkArerR899iqZj2BCBPABE1dn+keBVSQdv4SbYCQ1PaqV1Xlh H+vGcMOoL945+kGwDermz/4q7gxCYXFjluPfCC0MtA8H+237X6eDoIJp9Lux+oerF3pd v0dwRc1dXoi2o+oG3zpMS9XQhndBIZULlPs/CvPZdlzVQVx+CrMoXrFFacb4nXvG+vbD X5vQ== X-Gm-Message-State: APf1xPBsF7++WdJWxTA721IGaCUJH9uZSUTem8idWOL6nBO8xE1umCJq Apd0kEQTsBkKavou5vmnTubXhrkL X-Google-Smtp-Source: AG47ELtH9wmSTARcGke3XVlFRw5oVXmUAoPQzvvPh1Y0fBdISGq540IbDt+EbnisZK9v3Rghv0+WGA== X-Received: by 10.98.201.194 with SMTP id l63mr2255957pfk.126.1519916735443; Thu, 01 Mar 2018 07:05:35 -0800 (PST) Received: from localhost ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id t8sm7063307pgr.21.2018.03.01.07.05.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 01 Mar 2018 07:05:34 -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 1/9] sctp: factor out sctp_sendmsg_to_asoc from sctp_sendmsg Date: Thu, 1 Mar 2018 23:05:10 +0800 Message-Id: <1dbdb93e27d978da9fe883dbe72db78fbb58ec95.1519916440.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 This patch is to move the codes for checking and sending on one asoc after this asoc has been found or created into sctp_sendmsg_to_asoc. Note that 'err != -ESRCH' check is for the case that asoc is freed when waiting for tx buffer in sctp_sendmsg_to_asoc. Signed-off-by: Xin Long --- net/sctp/socket.c | 230 +++++++++++++++++++++++------------------------------- 1 file changed, 99 insertions(+), 131 deletions(-) diff --git a/net/sctp/socket.c b/net/sctp/socket.c index bf271f8..183129e 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -1606,6 +1606,100 @@ static int sctp_error(struct sock *sk, int flags, int err) static int sctp_msghdr_parse(const struct msghdr *msg, struct sctp_cmsgs *cmsgs); +static int sctp_sendmsg_to_asoc(struct sctp_association *asoc, + struct msghdr *msg, size_t msg_len, + struct sctp_transport *transport, + struct sctp_sndrcvinfo *sinfo) +{ + struct sock *sk = asoc->base.sk; + struct net *net = sock_net(sk); + struct sctp_datamsg *datamsg; + bool wait_connect = false; + struct sctp_chunk *chunk; + long timeo; + int err; + + if (sinfo->sinfo_stream >= asoc->stream.outcnt) { + err = -EINVAL; + goto err; + } + + if (unlikely(!asoc->stream.out[sinfo->sinfo_stream].ext)) { + err = sctp_stream_init_ext(&asoc->stream, sinfo->sinfo_stream); + if (err) + goto err; + } + + if (sctp_sk(sk)->disable_fragments && msg_len > asoc->frag_point) { + err = -EMSGSIZE; + goto err; + } + + if (sctp_state(asoc, CLOSED)) { + err = sctp_primitive_ASSOCIATE(net, asoc, NULL); + if (err) + goto err; + + if (sctp_sk(sk)->strm_interleave) { + timeo = sock_sndtimeo(sk, 0); + err = sctp_wait_for_connect(asoc, &timeo); + if (err) + goto err; + } else { + wait_connect = true; + } + + pr_debug("%s: we associated primitively\n", __func__); + } + + if (asoc->pmtu_pending) + sctp_assoc_pending_pmtu(asoc); + + if (sctp_wspace(asoc) < msg_len) + sctp_prsctp_prune(asoc, sinfo, msg_len - sctp_wspace(asoc)); + + if (!sctp_wspace(asoc)) { + timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); + err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len); + if (err) + goto err; + } + + datamsg = sctp_datamsg_from_user(asoc, sinfo, &msg->msg_iter); + if (IS_ERR(datamsg)) { + err = PTR_ERR(datamsg); + goto err; + } + + asoc->force_delay = !!(msg->msg_flags & MSG_MORE); + + list_for_each_entry(chunk, &datamsg->chunks, frag_list) { + sctp_chunk_hold(chunk); + sctp_set_owner_w(chunk); + chunk->transport = transport; + } + + err = sctp_primitive_SEND(net, asoc, datamsg); + if (err) { + sctp_datamsg_free(datamsg); + goto err; + } + + pr_debug("%s: we sent primitively\n", __func__); + + sctp_datamsg_put(datamsg); + + if (unlikely(wait_connect)) { + timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); + sctp_wait_for_connect(asoc, &timeo); + } + + err = msg_len; + +err: + return err; +} + static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) { struct net *net = sock_net(sk); @@ -1622,11 +1716,8 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) sctp_assoc_t associd = 0; struct sctp_cmsgs cmsgs = { NULL }; enum sctp_scope scope; - bool fill_sinfo_ttl = false, wait_connect = false; - struct sctp_datamsg *datamsg; - int msg_flags = msg->msg_flags; + bool fill_sinfo_ttl = false; __u16 sinfo_flags = 0; - long timeo; int err; err = 0; @@ -1923,49 +2014,6 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) goto out_free; } - if (asoc->pmtu_pending) - sctp_assoc_pending_pmtu(asoc); - - /* If fragmentation is disabled and the message length exceeds the - * association fragmentation point, return EMSGSIZE. The I-D - * does not specify what this error is, but this looks like - * a great fit. - */ - if (sctp_sk(sk)->disable_fragments && (msg_len > asoc->frag_point)) { - err = -EMSGSIZE; - goto out_free; - } - - /* Check for invalid stream. */ - if (sinfo->sinfo_stream >= asoc->stream.outcnt) { - err = -EINVAL; - goto out_free; - } - - /* Allocate sctp_stream_out_ext if not already done */ - if (unlikely(!asoc->stream.out[sinfo->sinfo_stream].ext)) { - err = sctp_stream_init_ext(&asoc->stream, sinfo->sinfo_stream); - if (err) - goto out_free; - } - - if (sctp_wspace(asoc) < msg_len) - sctp_prsctp_prune(asoc, sinfo, msg_len - sctp_wspace(asoc)); - - timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); - if (!sctp_wspace(asoc)) { - /* sk can be changed by peel off when waiting for buf. */ - err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len); - if (err) { - if (err == -ESRCH) { - /* asoc is already dead. */ - new_asoc = NULL; - err = -EPIPE; - } - goto out_free; - } - } - /* If an address is passed with the sendto/sendmsg call, it is used * to override the primary destination address in the TCP model, or * when SCTP_ADDR_OVER flag is set in the UDP model. @@ -1980,96 +2028,16 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) } else chunk_tp = NULL; - /* Auto-connect, if we aren't connected already. */ - if (sctp_state(asoc, CLOSED)) { - err = sctp_primitive_ASSOCIATE(net, asoc, NULL); - if (err < 0) - goto out_free; - - /* If stream interleave is enabled, wait_connect has to be - * done earlier than data enqueue, as it needs to make data - * or idata according to asoc->intl_enable which is set - * after connection is done. - */ - if (sctp_sk(asoc->base.sk)->strm_interleave) { - timeo = sock_sndtimeo(sk, 0); - err = sctp_wait_for_connect(asoc, &timeo); - if (err) - goto out_unlock; - } else { - wait_connect = true; - } - - pr_debug("%s: we associated primitively\n", __func__); - } - - /* Break the message into multiple chunks of maximum size. */ - datamsg = sctp_datamsg_from_user(asoc, sinfo, &msg->msg_iter); - if (IS_ERR(datamsg)) { - err = PTR_ERR(datamsg); - goto out_free; - } - asoc->force_delay = !!(msg->msg_flags & MSG_MORE); - - /* Now send the (possibly) fragmented message. */ - list_for_each_entry(chunk, &datamsg->chunks, frag_list) { - sctp_chunk_hold(chunk); - - /* Do accounting for the write space. */ - sctp_set_owner_w(chunk); - - chunk->transport = chunk_tp; - } - - /* Send it to the lower layers. Note: all chunks - * must either fail or succeed. The lower layer - * works that way today. Keep it that way or this - * breaks. - */ - err = sctp_primitive_SEND(net, asoc, datamsg); - /* Did the lower layer accept the chunk? */ - if (err) { - sctp_datamsg_free(datamsg); - goto out_free; - } - - pr_debug("%s: we sent primitively\n", __func__); - - sctp_datamsg_put(datamsg); - err = msg_len; - - if (unlikely(wait_connect)) { - timeo = sock_sndtimeo(sk, msg_flags & MSG_DONTWAIT); - sctp_wait_for_connect(asoc, &timeo); - } - - /* If we are already past ASSOCIATE, the lower - * layers are responsible for association cleanup. - */ - goto out_unlock; + /* Send msg to the asoc */ + err = sctp_sendmsg_to_asoc(asoc, msg, msg_len, chunk_tp, sinfo); out_free: - if (new_asoc) + if (err < 0 && err != -ESRCH && new_asoc) sctp_association_free(asoc); out_unlock: release_sock(sk); - out_nounlock: - return sctp_error(sk, msg_flags, err); - -#if 0 -do_sock_err: - if (msg_len) - err = msg_len; - else - err = sock_error(sk); - goto out; - -do_interrupted: - if (msg_len) - err = msg_len; - goto out; -#endif /* 0 */ + return sctp_error(sk, msg->msg_flags, err); } /* This is an extended version of skb_pull() that removes the data from the From patchwork Thu Mar 1 15:05:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xin Long X-Patchwork-Id: 879900 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="Bld8cxI/"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zsbND3H3yz9s1S for ; Fri, 2 Mar 2018 02:05:48 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031691AbeCAPFq (ORCPT ); Thu, 1 Mar 2018 10:05:46 -0500 Received: from mail-pf0-f195.google.com ([209.85.192.195]:41555 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031556AbeCAPFo (ORCPT ); Thu, 1 Mar 2018 10:05:44 -0500 Received: by mail-pf0-f195.google.com with SMTP id f80so2545831pfa.8; Thu, 01 Mar 2018 07:05:44 -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=8EnZbDKs1autJ0Y3lJXQ0AQoJ23ykdmEvbyMnACfQXg=; b=Bld8cxI/Eodyzdqa6KUM1MKHlKFmcjF57o8X7ggdH3zo0rmIPDv6xuwsah+7PYKaN9 ZmOtQOQn9eFm1YH1bzkcQUQ5bsYyVM+Gvg5KRGWOyH3X1IYAMggmUJGXixePyo62HyK5 8Gd7/X9uVBHwAX0oXES0wsg4xeaOCCA/4bbmmh0owk2WDQO1qrD1npjF7niDkJSxBDs8 qZRlwP5rb9oYfU2AYpBiV0IqJTcs/mjSaVxrM5KZbnqjwaMD2nDCbaIllwIFNnl2fmoy iACCSJa8NCKj1/HU7uElzIL/0Rl5uW/aW0F5/yot03kKJ/QP36PAVgmMBUt9MM55UgB/ M/sA== 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=8EnZbDKs1autJ0Y3lJXQ0AQoJ23ykdmEvbyMnACfQXg=; b=b/BduYnGrtvmlrb6nOSy1qphr7E5S+ZxZjLuYnIG0y+ZNVKKvbFP14gzSO828oztQ9 dL39VlzYSy6MhcuWsjRcvG1qYWU4JDpvpPh/DlzYpGnRlW4j/AcP1K5aNA5rJn+anFfE QjkEspqKk2RWqn2vWOkJILOs4hmOLlpfDizNHkeV1ceOGecG+EAozAaBrfVNrZZJ+9pf n705XsxZ9S2FzQ9CJyL8UMUSNelWVozl0b+4JqMHESVH/+9LRCWf5NsPtXbsksNqtx5G g93JFUjGkTXfYpQyfjEra2mKcI3weilCUykgRM6+mFlTugk2rw54UKIpN0L38IWQFl7h 3LNQ== X-Gm-Message-State: APf1xPCob06Kk+nQc8NTj2AhFksXa2r7rJg+e3Yhve1h0iIaBGCqBX+J USklVWZ99SmgqcKKIWvVYRAk8BHy X-Google-Smtp-Source: AG47ELsdeflCechNAeeNmCRfNjah+1Z9DtG6OOdCQXPEA9Kc8hMKpAuk11oJzb4wwVtFqoboP5f4fA== X-Received: by 10.99.52.203 with SMTP id b194mr1834251pga.349.1519916743637; Thu, 01 Mar 2018 07:05:43 -0800 (PST) Received: from localhost ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id i186sm9453004pfg.25.2018.03.01.07.05.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 01 Mar 2018 07:05:43 -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 2/9] sctp: factor out sctp_sendmsg_new_asoc from sctp_sendmsg Date: Thu, 1 Mar 2018 23:05:11 +0800 Message-Id: X-Mailer: git-send-email 2.1.0 In-Reply-To: <1dbdb93e27d978da9fe883dbe72db78fbb58ec95.1519916440.git.lucien.xin@gmail.com> 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 creating a new asoc if no asoc was found into sctp_sendmsg_new_asoc. Signed-off-by: Xin Long --- net/sctp/socket.c | 201 +++++++++++++++++++++++------------------------------- 1 file changed, 86 insertions(+), 115 deletions(-) diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 183129e..58bb55d 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -1606,6 +1606,87 @@ static int sctp_error(struct sock *sk, int flags, int err) static int sctp_msghdr_parse(const struct msghdr *msg, struct sctp_cmsgs *cmsgs); +static int sctp_sendmsg_new_asoc(struct sock *sk, __u16 sflags, + struct sctp_cmsgs *cmsgs, + union sctp_addr *daddr, + struct sctp_transport **tp) +{ + struct sctp_endpoint *ep = sctp_sk(sk)->ep; + struct net *net = sock_net(sk); + struct sctp_association *asoc; + enum sctp_scope scope; + int err = -EINVAL; + + *tp = NULL; + + if (sflags & (SCTP_EOF | SCTP_ABORT)) + return -EINVAL; + + if (sctp_style(sk, TCP) && (sctp_sstate(sk, ESTABLISHED) || + sctp_sstate(sk, CLOSING))) + return -EADDRNOTAVAIL; + + if (sctp_endpoint_is_peeled_off(ep, daddr)) + return -EADDRNOTAVAIL; + + if (!ep->base.bind_addr.port) { + if (sctp_autobind(sk)) + return -EAGAIN; + } else { + if (ep->base.bind_addr.port < inet_prot_sock(net) && + !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE)) + return -EACCES; + } + + scope = sctp_scope(daddr); + + asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL); + if (!asoc) + return -ENOMEM; + + if (sctp_assoc_set_bind_addr_from_ep(asoc, scope, GFP_KERNEL) < 0) { + err = -ENOMEM; + goto free; + } + + if (cmsgs->init) { + struct sctp_initmsg *init = cmsgs->init; + + if (init->sinit_num_ostreams) { + __u16 outcnt = init->sinit_num_ostreams; + + asoc->c.sinit_num_ostreams = outcnt; + /* outcnt has been changed, need to re-init stream */ + err = sctp_stream_init(&asoc->stream, outcnt, 0, + GFP_KERNEL); + if (err) + goto free; + } + + if (init->sinit_max_instreams) + asoc->c.sinit_max_instreams = init->sinit_max_instreams; + + if (init->sinit_max_attempts) + asoc->max_init_attempts = init->sinit_max_attempts; + + if (init->sinit_max_init_timeo) + asoc->max_init_timeo = + msecs_to_jiffies(init->sinit_max_init_timeo); + } + + *tp = sctp_assoc_add_peer(asoc, daddr, GFP_KERNEL, SCTP_UNKNOWN); + if (!*tp) { + err = -ENOMEM; + goto free; + } + + return 0; + +free: + sctp_association_free(asoc); + return err; +} + static int sctp_sendmsg_to_asoc(struct sctp_association *asoc, struct msghdr *msg, size_t msg_len, struct sctp_transport *transport, @@ -1715,7 +1796,6 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) struct sctp_initmsg *sinit; sctp_assoc_t associd = 0; struct sctp_cmsgs cmsgs = { NULL }; - enum sctp_scope scope; bool fill_sinfo_ttl = false; __u16 sinfo_flags = 0; int err; @@ -1817,20 +1897,6 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) if (msg_name) { /* Look for a matching association on the endpoint. */ asoc = sctp_endpoint_lookup_assoc(ep, &to, &transport); - - /* If we could not find a matching association on the - * endpoint, make sure that it is not a TCP-style - * socket that already has an association or there is - * no peeled-off association on another socket. - */ - if (!asoc && - ((sctp_style(sk, TCP) && - (sctp_sstate(sk, ESTABLISHED) || - sctp_sstate(sk, CLOSING))) || - sctp_endpoint_is_peeled_off(ep, &to))) { - err = -EADDRNOTAVAIL; - goto out_unlock; - } } else { asoc = sctp_id2assoc(sk, associd); if (!asoc) { @@ -1879,108 +1945,13 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) /* Do we need to create the association? */ if (!asoc) { - pr_debug("%s: there is no association yet\n", __func__); - - if (sinfo_flags & (SCTP_EOF | SCTP_ABORT)) { - err = -EINVAL; - goto out_unlock; - } - - /* Check for invalid stream against the stream counts, - * either the default or the user specified stream counts. - */ - if (sinfo) { - if (!sinit || !sinit->sinit_num_ostreams) { - /* Check against the defaults. */ - if (sinfo->sinfo_stream >= - sp->initmsg.sinit_num_ostreams) { - err = -EINVAL; - goto out_unlock; - } - } else { - /* Check against the requested. */ - if (sinfo->sinfo_stream >= - sinit->sinit_num_ostreams) { - err = -EINVAL; - goto out_unlock; - } - } - } - - /* - * API 3.1.2 bind() - UDP Style Syntax - * If a bind() or sctp_bindx() is not called prior to a - * sendmsg() call that initiates a new association, the - * system picks an ephemeral port and will choose an address - * set equivalent to binding with a wildcard address. - */ - if (!ep->base.bind_addr.port) { - if (sctp_autobind(sk)) { - err = -EAGAIN; - goto out_unlock; - } - } else { - /* - * If an unprivileged user inherits a one-to-many - * style socket with open associations on a privileged - * port, it MAY be permitted to accept new associations, - * but it SHOULD NOT be permitted to open new - * associations. - */ - if (ep->base.bind_addr.port < inet_prot_sock(net) && - !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE)) { - err = -EACCES; - goto out_unlock; - } - } - - scope = sctp_scope(&to); - new_asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL); - if (!new_asoc) { - err = -ENOMEM; + err = sctp_sendmsg_new_asoc(sk, sinfo_flags, &cmsgs, &to, + &transport); + if (err) goto out_unlock; - } - asoc = new_asoc; - err = sctp_assoc_set_bind_addr_from_ep(asoc, scope, GFP_KERNEL); - if (err < 0) { - err = -ENOMEM; - goto out_free; - } - - /* If the SCTP_INIT ancillary data is specified, set all - * the association init values accordingly. - */ - if (sinit) { - if (sinit->sinit_num_ostreams) { - __u16 outcnt = sinit->sinit_num_ostreams; - - asoc->c.sinit_num_ostreams = outcnt; - /* outcnt has been changed, so re-init stream */ - err = sctp_stream_init(&asoc->stream, outcnt, 0, - GFP_KERNEL); - if (err) - goto out_free; - } - if (sinit->sinit_max_instreams) { - asoc->c.sinit_max_instreams = - sinit->sinit_max_instreams; - } - if (sinit->sinit_max_attempts) { - asoc->max_init_attempts - = sinit->sinit_max_attempts; - } - if (sinit->sinit_max_init_timeo) { - asoc->max_init_timeo = - msecs_to_jiffies(sinit->sinit_max_init_timeo); - } - } - /* Prime the peer's transport structures. */ - transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL, SCTP_UNKNOWN); - if (!transport) { - err = -ENOMEM; - goto out_free; - } + asoc = transport->asoc; + new_asoc = asoc; } /* ASSERT: we have a valid association at this point. */ 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? */ From patchwork Thu Mar 1 15:05:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xin Long X-Patchwork-Id: 879902 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="MbfE9Ale"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zsbNY39T2z9s2b for ; Fri, 2 Mar 2018 02:06:05 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031697AbeCAPGC (ORCPT ); Thu, 1 Mar 2018 10:06:02 -0500 Received: from mail-pl0-f68.google.com ([209.85.160.68]:36179 "EHLO mail-pl0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031599AbeCAPGA (ORCPT ); Thu, 1 Mar 2018 10:06:00 -0500 Received: by mail-pl0-f68.google.com with SMTP id 61-v6so3789820plf.3; Thu, 01 Mar 2018 07:06:00 -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=Y8zI3kqgTRu3vfsr5H0PR6sREtfzUVKDYFgZ9VB4aI0=; b=MbfE9Ale+AS4yBTtt3krCbe4kyTbj3oZrGTivY4jQp9Ijygv9Mg6IYpPK9/MX1AG9V fjcPuemK/XqAHHNItlt7efIBWCF57D3mYuGh9j+goLhkGo4K1rN45kYIX04OkVDF4fB9 5MeFlYsk3etjMPhqsX41e4Ua10ILE9iTyQCR3xCgdfsaVoMN2p2HsgNzsLgpUdF9TAzG e1izrqgfY2OyA6u4xuX95SVD2mYx41X/LBwLCMz2WiiefUkwnGLY/nNHCMOj8OCBSGp7 XKpDdR2BJrtPOzDNcgkzENftqcWWB2J8i3fkJ3EmigN9hPCwX5Xp9LDnoAwupg/+bP8X /FVg== 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=Y8zI3kqgTRu3vfsr5H0PR6sREtfzUVKDYFgZ9VB4aI0=; b=dDtnVhY2Mpl4/yJEvC6TjNo//+n7JAzsJYeVI3NZsg8ynv0J2S0tNjD7L/N2+0AoRa qzCjMKOy26PFvfd2CQ1+YdJnPicKasCKZgH+6LXK5F3RT0K/l1HjMy34ILb0KontIAFy 1+lzl2/Bof9arYKl1hV8WLKtYYhAIMQrVljJoPPiDUXg28Ls5Jd0ebFiFf1Pj0qnwgYu zN/c+TWnJi48pO3+NvsSDi3v5twNDLX9dXBMbDXe0yRiNyDiDjlxlcb4gQnHIglzDKob GCOfStPLFBfcL6zqOzsJt1tMwMSYza1TsxomfCetP6WxghDsEu59NQ39f8WMjX5xHCPa +kyw== X-Gm-Message-State: APf1xPDKkTsa4W3RhodP7maSNK0kEoabsIXi2f4nGZADQw5lfgPhwP4N RoEw8A4rUT6zYhO6YqRBTt280Q1b X-Google-Smtp-Source: AG47ELtVTn3NJsw5ef3XQD50sjiQ/WNuB1hbWDfYDYMtgvz2c0v+EqR6fWiFHraiisgRrUOoKC/fLQ== X-Received: by 2002:a17:902:22f:: with SMTP id 44-v6mr2185174plc.418.1519916760081; Thu, 01 Mar 2018 07:06:00 -0800 (PST) Received: from localhost ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id d15sm10314229pfj.121.2018.03.01.07.05.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 01 Mar 2018 07:05:59 -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 4/9] sctp: factor out sctp_sendmsg_get_daddr from sctp_sendmsg Date: Thu, 1 Mar 2018 23:05:13 +0800 Message-Id: X-Mailer: git-send-email 2.1.0 In-Reply-To: <588fe081ed87c02258db4caf0377979d19a8132a.1519916440.git.lucien.xin@gmail.com> References: <1dbdb93e27d978da9fe883dbe72db78fbb58ec95.1519916440.git.lucien.xin@gmail.com> <588fe081ed87c02258db4caf0377979d19a8132a.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 trying to get daddr from msg->msg_name into sctp_sendmsg_get_daddr. Note that after adding 'daddr', 'to' and 'msg_name' can be deleted. Signed-off-by: Xin Long --- net/sctp/socket.c | 58 ++++++++++++++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 93cff99..68691d2 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -1814,14 +1814,35 @@ static int sctp_sendmsg_to_asoc(struct sctp_association *asoc, return err; } +static union sctp_addr *sctp_sendmsg_get_daddr(struct sock *sk, + const struct msghdr *msg, + struct sctp_cmsgs *cmsgs) +{ + union sctp_addr *daddr = NULL; + int err; + + if (!sctp_style(sk, UDP_HIGH_BANDWIDTH) && msg->msg_name) { + int len = msg->msg_namelen; + + if (len > sizeof(*daddr)) + len = sizeof(*daddr); + + daddr = (union sctp_addr *)msg->msg_name; + + err = sctp_verify_addr(sk, daddr, len); + if (err) + return ERR_PTR(err); + } + + return daddr; +} + static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) { struct sctp_sock *sp; struct sctp_endpoint *ep; struct sctp_association *new_asoc = NULL, *asoc = NULL; struct sctp_transport *transport, *chunk_tp; - union sctp_addr to; - struct sockaddr *msg_name = NULL; struct sctp_sndrcvinfo default_sinfo; struct sctp_sndrcvinfo *sinfo; struct sctp_initmsg *sinit; @@ -1829,6 +1850,7 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) struct sctp_cmsgs cmsgs = { NULL }; bool fill_sinfo_ttl = false; __u16 sinfo_flags = 0; + union sctp_addr *daddr; int err; err = 0; @@ -1851,23 +1873,11 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) goto out_nounlock; } - /* Fetch the destination address for this packet. This - * address only selects the association--it is not necessarily - * the address we will send to. - * For a peeled-off socket, msg_name is ignored. - */ - if (!sctp_style(sk, UDP_HIGH_BANDWIDTH) && msg->msg_name) { - int msg_namelen = msg->msg_namelen; - - err = sctp_verify_addr(sk, (union sctp_addr *)msg->msg_name, - msg_namelen); - if (err) - return err; - - if (msg_namelen > sizeof(to)) - msg_namelen = sizeof(to); - memcpy(&to, msg->msg_name, msg_namelen); - msg_name = msg->msg_name; + /* Get daddr from msg */ + daddr = sctp_sendmsg_get_daddr(sk, msg, &cmsgs); + if (IS_ERR(daddr)) { + err = PTR_ERR(daddr); + goto out_nounlock; } sinit = cmsgs.init; @@ -1925,9 +1935,9 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) lock_sock(sk); /* If a msg_name has been specified, assume this is to be used. */ - if (msg_name) { + if (daddr) { /* Look for a matching association on the endpoint. */ - asoc = sctp_endpoint_lookup_assoc(ep, &to, &transport); + asoc = sctp_endpoint_lookup_assoc(ep, daddr, &transport); } else { asoc = sctp_id2assoc(sk, associd); if (!asoc) { @@ -1945,7 +1955,7 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) /* Do we need to create the association? */ if (!asoc) { - err = sctp_sendmsg_new_asoc(sk, sinfo_flags, &cmsgs, &to, + err = sctp_sendmsg_new_asoc(sk, sinfo_flags, &cmsgs, daddr, &transport); if (err) goto out_unlock; @@ -1989,9 +1999,9 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) * to override the primary destination address in the TCP model, or * when SCTP_ADDR_OVER flag is set in the UDP model. */ - if ((sctp_style(sk, TCP) && msg_name) || + if ((sctp_style(sk, TCP) && daddr) || (sinfo_flags & SCTP_ADDR_OVER)) { - chunk_tp = sctp_assoc_lookup_paddr(asoc, &to); + chunk_tp = sctp_assoc_lookup_paddr(asoc, daddr); if (!chunk_tp) { err = -EINVAL; goto out_free; From patchwork Thu Mar 1 15:05:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xin Long X-Patchwork-Id: 879903 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="YE50WX4q"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zsbNl1YQ5z9s2g for ; Fri, 2 Mar 2018 02:06:15 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031719AbeCAPGM (ORCPT ); Thu, 1 Mar 2018 10:06:12 -0500 Received: from mail-pf0-f194.google.com ([209.85.192.194]:33436 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031659AbeCAPGJ (ORCPT ); Thu, 1 Mar 2018 10:06:09 -0500 Received: by mail-pf0-f194.google.com with SMTP id q13so2559291pff.0; Thu, 01 Mar 2018 07:06:08 -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=Jva7wW5AY5sBqDkMePAgL60R56KR7IB/wVHYV0lyO2c=; b=YE50WX4qnN5ptEt1uLjd+HHpfuLvkHRXcfXI3cypf2+AQ8f/lHpGfC8zgvNOHROcAO eqIVKXgOBXIRGSvScNY7qgRyRZ5fh9r7q4rRqXH1eveghfPTaF+fOp/FAOG4OIF3oc3Z win10Q4sCxNPvOQS07Zq55mOnNOed3gg4fszmJMNHCCQSCyV50uQ1v0NTcscK2a9C+aK Prg5evkOC0IY3zSXKcWIy3yU2LUGLXdnqRt+cZUfGOVOz46TiKh1SSA1cweYPGo4+fsU eI4/SQZhOzyrKbk9kQ7hvIn076eCYTjvgm4CmzyM//ET/XBk5kGQ7zBBY80szFBYQeuQ /AdQ== 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=Jva7wW5AY5sBqDkMePAgL60R56KR7IB/wVHYV0lyO2c=; b=MRDqn/WbqjGd2hwiX70S5EIpYhv1OR3EoUuL1jzIzP1zG0rBpA7pPdEn9bfREpnnSQ w9TACK5USXBEkd5k9exWqc8KJDynxP2oljEyPgiG7mF8o/xiwYdXyUfo5iR7MnGf3zh3 +SSOby6fZSyMkdrqmuLDvMZ5KJrX8FaZp7RgKq9xVpKM5ousM7ouNgIhpMV8xCDZJwHn l+g184enw3z4YAfvFt2l1fRy0HdCyRO0ti8Qgo1JNcc5rnXzAhnqzPas+qhh/4y6DAFv FqvCdf0dl4v07+7hMQogTuCnHIHYt1hE5yGIp9WFJKqOd4bYrlFZYPT67XsIjYCFp111 t4Cg== X-Gm-Message-State: APf1xPCfXG8L1RwTfT+NLyqZR/YursSduR4Xyp8YtbXHIXngwR2kzOb4 ZPB4kF6ANBJ9Jj6PVRonhrJeMQiy X-Google-Smtp-Source: AG47ELvplQIbunjR4UyGzf/R/G9TDESoEcz6xJhzEYuZQpSZk+n4YjeKR3g679lWbZa+JwK+sWp7aA== X-Received: by 10.98.76.26 with SMTP id z26mr2287160pfa.220.1519916768251; Thu, 01 Mar 2018 07:06:08 -0800 (PST) Received: from localhost ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id a13sm8377668pgd.1.2018.03.01.07.06.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 01 Mar 2018 07:06:07 -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 5/9] sctp: factor out sctp_sendmsg_parse from sctp_sendmsg Date: Thu, 1 Mar 2018 23:05:14 +0800 Message-Id: X-Mailer: git-send-email 2.1.0 In-Reply-To: References: <1dbdb93e27d978da9fe883dbe72db78fbb58ec95.1519916440.git.lucien.xin@gmail.com> <588fe081ed87c02258db4caf0377979d19a8132a.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 parsing msghdr and checking sk into sctp_sendmsg_parse. Note that different from before, 'sinfo' in sctp_sendmsg won't be NULL any more. It gets the value either from cmsgs->srinfo, cmsgs->sinfo or asoc. With it, the 'sinfo' and 'fill_sinfo_ttl' check can be removed from sctp_sendmsg. Signed-off-by: Xin Long --- net/sctp/socket.c | 172 ++++++++++++++++++++++-------------------------------- 1 file changed, 69 insertions(+), 103 deletions(-) diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 68691d2..bf089e5 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -1606,6 +1606,61 @@ static int sctp_error(struct sock *sk, int flags, int err) static int sctp_msghdr_parse(const struct msghdr *msg, struct sctp_cmsgs *cmsgs); +static int sctp_sendmsg_parse(struct sock *sk, struct sctp_cmsgs *cmsgs, + struct sctp_sndrcvinfo *srinfo, + const struct msghdr *msg, size_t msg_len) +{ + __u16 sflags; + int err; + + if (sctp_sstate(sk, LISTENING) && sctp_style(sk, TCP)) + return -EPIPE; + + if (msg_len > sk->sk_sndbuf) + return -EMSGSIZE; + + memset(cmsgs, 0, sizeof(*cmsgs)); + err = sctp_msghdr_parse(msg, cmsgs); + if (err) { + pr_debug("%s: msghdr parse err:%x\n", __func__, err); + return err; + } + + memset(srinfo, 0, sizeof(*srinfo)); + if (cmsgs->srinfo) { + srinfo->sinfo_stream = cmsgs->srinfo->sinfo_stream; + srinfo->sinfo_flags = cmsgs->srinfo->sinfo_flags; + srinfo->sinfo_ppid = cmsgs->srinfo->sinfo_ppid; + srinfo->sinfo_context = cmsgs->srinfo->sinfo_context; + srinfo->sinfo_assoc_id = cmsgs->srinfo->sinfo_assoc_id; + srinfo->sinfo_timetolive = cmsgs->srinfo->sinfo_timetolive; + } + + if (cmsgs->sinfo) { + srinfo->sinfo_stream = cmsgs->sinfo->snd_sid; + srinfo->sinfo_flags = cmsgs->sinfo->snd_flags; + srinfo->sinfo_ppid = cmsgs->sinfo->snd_ppid; + srinfo->sinfo_context = cmsgs->sinfo->snd_context; + srinfo->sinfo_assoc_id = cmsgs->sinfo->snd_assoc_id; + } + + sflags = srinfo->sinfo_flags; + if (!sflags && msg_len) + return 0; + + if (sctp_style(sk, TCP) && (sflags & (SCTP_EOF | SCTP_ABORT))) + return -EINVAL; + + if (((sflags & SCTP_EOF) && msg_len > 0) || + (!(sflags & (SCTP_EOF | SCTP_ABORT)) && msg_len == 0)) + return -EINVAL; + + if ((sflags & SCTP_ADDR_OVER) && !msg->msg_name) + return -EINVAL; + + return 0; +} + static int sctp_sendmsg_new_asoc(struct sock *sk, __u16 sflags, struct sctp_cmsgs *cmsgs, union sctp_addr *daddr, @@ -1839,39 +1894,23 @@ static union sctp_addr *sctp_sendmsg_get_daddr(struct sock *sk, static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) { - struct sctp_sock *sp; - struct sctp_endpoint *ep; + struct sctp_endpoint *ep = sctp_sk(sk)->ep; struct sctp_association *new_asoc = NULL, *asoc = NULL; struct sctp_transport *transport, *chunk_tp; - struct sctp_sndrcvinfo default_sinfo; - struct sctp_sndrcvinfo *sinfo; - struct sctp_initmsg *sinit; + struct sctp_sndrcvinfo _sinfo, *sinfo; sctp_assoc_t associd = 0; struct sctp_cmsgs cmsgs = { NULL }; - bool fill_sinfo_ttl = false; __u16 sinfo_flags = 0; union sctp_addr *daddr; int err; - err = 0; - sp = sctp_sk(sk); - ep = sp->ep; - - pr_debug("%s: sk:%p, msg:%p, msg_len:%zu ep:%p\n", __func__, sk, - msg, msg_len, ep); - - /* We cannot send a message over a TCP-style listening socket. */ - if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) { - err = -EPIPE; + /* Parse and get snd_info */ + err = sctp_sendmsg_parse(sk, &cmsgs, &_sinfo, msg, msg_len); + if (err) goto out_nounlock; - } - /* Parse out the SCTP CMSGs. */ - err = sctp_msghdr_parse(msg, &cmsgs); - if (err) { - pr_debug("%s: msghdr parse err:%x\n", __func__, err); - goto out_nounlock; - } + sinfo = &_sinfo; + sinfo_flags = sinfo->sinfo_flags; /* Get daddr from msg */ daddr = sctp_sendmsg_get_daddr(sk, msg, &cmsgs); @@ -1880,58 +1919,6 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) goto out_nounlock; } - sinit = cmsgs.init; - if (cmsgs.sinfo != NULL) { - memset(&default_sinfo, 0, sizeof(default_sinfo)); - default_sinfo.sinfo_stream = cmsgs.sinfo->snd_sid; - default_sinfo.sinfo_flags = cmsgs.sinfo->snd_flags; - default_sinfo.sinfo_ppid = cmsgs.sinfo->snd_ppid; - default_sinfo.sinfo_context = cmsgs.sinfo->snd_context; - default_sinfo.sinfo_assoc_id = cmsgs.sinfo->snd_assoc_id; - - sinfo = &default_sinfo; - fill_sinfo_ttl = true; - } else { - sinfo = cmsgs.srinfo; - } - /* Did the user specify SNDINFO/SNDRCVINFO? */ - if (sinfo) { - sinfo_flags = sinfo->sinfo_flags; - associd = sinfo->sinfo_assoc_id; - } - - pr_debug("%s: msg_len:%zu, sinfo_flags:0x%x\n", __func__, - msg_len, sinfo_flags); - - /* SCTP_EOF or SCTP_ABORT cannot be set on a TCP-style socket. */ - if (sctp_style(sk, TCP) && (sinfo_flags & (SCTP_EOF | SCTP_ABORT))) { - err = -EINVAL; - goto out_nounlock; - } - - /* If SCTP_EOF is set, no data can be sent. Disallow sending zero - * length messages when SCTP_EOF|SCTP_ABORT is not set. - * If SCTP_ABORT is set, the message length could be non zero with - * the msg_iov set to the user abort reason. - */ - if (((sinfo_flags & SCTP_EOF) && (msg_len > 0)) || - (!(sinfo_flags & (SCTP_EOF|SCTP_ABORT)) && (msg_len == 0))) { - err = -EINVAL; - goto out_nounlock; - } - - /* If SCTP_ADDR_OVER is set, there must be an address - * specified in msg_name. - */ - if ((sinfo_flags & SCTP_ADDR_OVER) && (!msg->msg_name)) { - err = -EINVAL; - goto out_nounlock; - } - - transport = NULL; - - pr_debug("%s: about to look up association\n", __func__); - lock_sock(sk); /* If a msg_name has been specified, assume this is to be used. */ @@ -1964,36 +1951,15 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) new_asoc = asoc; } - /* ASSERT: we have a valid association at this point. */ - pr_debug("%s: we have a valid association\n", __func__); - - if (!sinfo) { - /* If the user didn't specify SNDINFO/SNDRCVINFO, make up - * one with some defaults. - */ - memset(&default_sinfo, 0, sizeof(default_sinfo)); - default_sinfo.sinfo_stream = asoc->default_stream; - default_sinfo.sinfo_flags = asoc->default_flags; - default_sinfo.sinfo_ppid = asoc->default_ppid; - default_sinfo.sinfo_context = asoc->default_context; - default_sinfo.sinfo_timetolive = asoc->default_timetolive; - default_sinfo.sinfo_assoc_id = sctp_assoc2id(asoc); - - sinfo = &default_sinfo; - } else if (fill_sinfo_ttl) { - /* In case SNDINFO was specified, we still need to fill - * it with a default ttl from the assoc here. - */ - sinfo->sinfo_timetolive = asoc->default_timetolive; + if (!cmsgs.srinfo && !cmsgs.sinfo) { + sinfo->sinfo_stream = asoc->default_stream; + sinfo->sinfo_ppid = asoc->default_ppid; + sinfo->sinfo_context = asoc->default_context; + sinfo->sinfo_assoc_id = sctp_assoc2id(asoc); } - /* API 7.1.7, the sndbuf size per association bounds the - * maximum size of data that can be sent in a single send call. - */ - if (msg_len > sk->sk_sndbuf) { - err = -EMSGSIZE; - goto out_free; - } + if (!cmsgs.srinfo) + sinfo->sinfo_timetolive = asoc->default_timetolive; /* If an address is passed with the sendto/sendmsg call, it is used * to override the primary destination address in the TCP model, or From patchwork Thu Mar 1 15:05:15 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xin Long X-Patchwork-Id: 879904 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="otaOHuE+"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zsbNs0f9Pz9s2b for ; Fri, 2 Mar 2018 02:06:21 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031724AbeCAPGS (ORCPT ); Thu, 1 Mar 2018 10:06:18 -0500 Received: from mail-pg0-f68.google.com ([74.125.83.68]:42192 "EHLO mail-pg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031659AbeCAPGR (ORCPT ); Thu, 1 Mar 2018 10:06:17 -0500 Received: by mail-pg0-f68.google.com with SMTP id y8so2407596pgr.9; Thu, 01 Mar 2018 07:06:16 -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=1MIOc9ItgXdBVIfPXPehi3jmBFGE1SPLeTY8L358I0E=; b=otaOHuE+fPZvmtqazc4xZTQULtmq4GgVhri03HwQQJMP5m7nDG/6z8OHTtsjZo7wix KB5cXjUJM76G4Tfw9jg/95OUwfuX8ZzRC19Ha+z7IUW1VG+TW9RwrjixLI6mqvrO2BqK Mm3xfoJhbLVVFzwfZM8WdEM5+/70xSymTSBw79gUzzbAAcanVknbB43eaafkG9zTP8XJ fZdfzPKpzOUHu4UFrWvK/U9DPDNtyW+y/DkXXhp/FDi/cFZHaxYpDfZfTDbq3dAKAWPv rDYRSNup1BzWWVtbMKY24uSsYlmDdu7bYyy7Z5zNgVOJGvYyYYw8xRb/gCnZchrftIR7 KsIQ== 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=1MIOc9ItgXdBVIfPXPehi3jmBFGE1SPLeTY8L358I0E=; b=iiHzGUoAhhRRnMnhTM3XY64bm91/wNxfPkRF0UzkTRxlMm4Cwuh1DjFpEVw9PaWi6d qJYhQ9PcTjbO11UhINnfw/dH7eeN2PWBPL8X95Rrd24eH3OZ+MnLLLWYb9Pd/rhJ+5Au WkolKqtCyFD5JvbCrt2vo5qYi/TDzhJJ3iiXcmns1TkWGALUxwNd6gQWq2SgeLiYCQQZ n2Gwz8AQjfnHcby42DD162dqPUxpDp5/VTLBr5BlsfNaDQKlOdgo5unm5M01hqzv7sFo Dtj5t4kW595x2iKRa4hMsCwhiGQKbMHjwg2VHt2TP8Uew8isfrIeKKOpXuIH5tOr5gxf YlGg== X-Gm-Message-State: APf1xPBq0s7xhAh8EsJ2ZM3QiF07mtxAgpt88oMXUi1sHSuuW7AIOcPy RLpM+WxbeGQYo4kPiWGbm90Xgcyq X-Google-Smtp-Source: AG47ELu1LWnPlO9c8d0kngwVK0kDL69v98UPxGq1ZmQ4vQOV0yu8qim8Dy3rBpuibab8PmvWsH39Qg== X-Received: by 10.98.74.140 with SMTP id c12mr2303984pfj.44.1519916776426; Thu, 01 Mar 2018 07:06:16 -0800 (PST) Received: from localhost ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id y6sm10278168pfg.71.2018.03.01.07.06.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 01 Mar 2018 07:06:15 -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 6/9] sctp: factor out sctp_sendmsg_update_sinfo from sctp_sendmsg Date: Thu, 1 Mar 2018 23:05:15 +0800 Message-Id: X-Mailer: git-send-email 2.1.0 In-Reply-To: References: <1dbdb93e27d978da9fe883dbe72db78fbb58ec95.1519916440.git.lucien.xin@gmail.com> <588fe081ed87c02258db4caf0377979d19a8132a.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 trying to get sinfo from asoc into sctp_sendmsg_update_sinfo. Signed-off-by: Xin Long --- net/sctp/socket.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/net/sctp/socket.c b/net/sctp/socket.c index bf089e5..bd1a657 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -1892,6 +1892,21 @@ static union sctp_addr *sctp_sendmsg_get_daddr(struct sock *sk, return daddr; } +static void sctp_sendmsg_update_sinfo(struct sctp_association *asoc, + struct sctp_sndrcvinfo *sinfo, + struct sctp_cmsgs *cmsgs) +{ + if (!cmsgs->srinfo && !cmsgs->sinfo) { + sinfo->sinfo_stream = asoc->default_stream; + sinfo->sinfo_ppid = asoc->default_ppid; + sinfo->sinfo_context = asoc->default_context; + sinfo->sinfo_assoc_id = sctp_assoc2id(asoc); + } + + if (!cmsgs->srinfo) + sinfo->sinfo_timetolive = asoc->default_timetolive; +} + static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) { struct sctp_endpoint *ep = sctp_sk(sk)->ep; @@ -1951,15 +1966,8 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) new_asoc = asoc; } - if (!cmsgs.srinfo && !cmsgs.sinfo) { - sinfo->sinfo_stream = asoc->default_stream; - sinfo->sinfo_ppid = asoc->default_ppid; - sinfo->sinfo_context = asoc->default_context; - sinfo->sinfo_assoc_id = sctp_assoc2id(asoc); - } - - if (!cmsgs.srinfo) - sinfo->sinfo_timetolive = asoc->default_timetolive; + /* Update snd_info with the asoc */ + sctp_sendmsg_update_sinfo(asoc, sinfo, &cmsgs); /* If an address is passed with the sendto/sendmsg call, it is used * to override the primary destination address in the TCP model, or From patchwork Thu Mar 1 15:05:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xin Long X-Patchwork-Id: 879905 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="C48+ZX2h"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zsbP225zsz9s1S for ; Fri, 2 Mar 2018 02:06:29 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031729AbeCAPG2 (ORCPT ); Thu, 1 Mar 2018 10:06:28 -0500 Received: from mail-pf0-f195.google.com ([209.85.192.195]:46166 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031659AbeCAPGZ (ORCPT ); Thu, 1 Mar 2018 10:06:25 -0500 Received: by mail-pf0-f195.google.com with SMTP id z10so2540233pfh.13; Thu, 01 Mar 2018 07:06:25 -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=LiHk31elMQXL5M4YO2cWu+Q7mn+Ycnsm78hiTXE0jdw=; b=C48+ZX2hWOkniPRTKPGSIwMCb3rI97gJ5Kjq8iBi0ZdBtFFOTBkDfzVJ8Sg5ZSlgZY THsQCqFlSwduSTVh47AyXQZ7g6j0N1tN0Yk0IME6UDkD4TOo+rxOzelJG0IGODvAZBX7 r1gpWtrPEwXyahRyYBxLGN5c1EkbEU744N6gmEm+FY0cmqxyi3s/FZEcC1AdeYFWRkPb qhDeWQEmF7zv3hbbDlhTDlTPG66jhBtL1IEbktAcLZeGV2dshrgjFGxairPxBEmust8i PQXt/ISpEAp0PMBhzCIEgQPs3ay+mjZsp18NBBzKGOuq/W0kGYLrrOGFTt1Q0kYpiCsE LjXg== 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=LiHk31elMQXL5M4YO2cWu+Q7mn+Ycnsm78hiTXE0jdw=; b=DxUl4KJv/tyr3qtRt+IOEd6nhGBUQSKR9rcRl2kIGV5u/rjPg+ND3YO2ZImmYLqQym Zzb+s6LMH7/LRalFrPQPn5vIJvM59XnNQg/PdFKGqavPcyGDl08lO9AWmo+baYHfxxPi /PK5F1nRC2U+RuNq5E2ERSy4DbV4Q/2QpuG/pdHAgMKSBmJ5P2fCB2szkIyg6YOXdOsk QVuz+Ds4I5jG4y3xdk0DAUDptcdKpHBnbZpLQCrbRfIKe6BneOPt6y25vfgifpChrLVt 6rj+vP0SgIgxpfDqMZvoijZxF2Mh3XnjE0P7YNLSciKJ01Idj1faj1mkZu0nGNAf0DHj 3Xbg== X-Gm-Message-State: APf1xPCEMoHVfb5ell+WYdPPX1CDYE6YaojEIbl9cmPZNuTnpo4gMVRr F84a+aF7oM1/wqYsN4krTSxjMXX5 X-Google-Smtp-Source: AG47ELtqXNvET9L+X5qSnmR6oghPXFaejMlp4oF9IKoGPvlOghnxAjWdwFhm61qaRUAaUemUY6ZILA== X-Received: by 10.98.149.90 with SMTP id p87mr2262051pfd.28.1519916784686; Thu, 01 Mar 2018 07:06:24 -0800 (PST) Received: from localhost ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id m12sm7313941pgr.35.2018.03.01.07.06.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 01 Mar 2018 07:06:23 -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 7/9] sctp: remove the unnecessary transport looking up from sctp_sendmsg Date: Thu, 1 Mar 2018 23:05:16 +0800 Message-Id: <45d67b278e2b79a28295148582e2fd22c1f45b57.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> <588fe081ed87c02258db4caf0377979d19a8132a.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 Now sctp_assoc_lookup_paddr can only be called only if daddr has been set. But if daddr has been set, sctp_endpoint_lookup_assoc would be done, where it could already have the transport. So this unnecessary transport looking up should be removed, but only reset transport as NULL when SCTP_ADDR_OVER is not set for UDP type socket. Signed-off-by: Xin Long --- net/sctp/socket.c | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/net/sctp/socket.c b/net/sctp/socket.c index bd1a657..4260310 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -1911,7 +1911,7 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) { struct sctp_endpoint *ep = sctp_sk(sk)->ep; struct sctp_association *new_asoc = NULL, *asoc = NULL; - struct sctp_transport *transport, *chunk_tp; + struct sctp_transport *transport = NULL; struct sctp_sndrcvinfo _sinfo, *sinfo; sctp_assoc_t associd = 0; struct sctp_cmsgs cmsgs = { NULL }; @@ -1966,29 +1966,17 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) new_asoc = asoc; } + if (!sctp_style(sk, TCP) && !(sinfo_flags & SCTP_ADDR_OVER)) + transport = NULL; + /* Update snd_info with the asoc */ sctp_sendmsg_update_sinfo(asoc, sinfo, &cmsgs); - /* If an address is passed with the sendto/sendmsg call, it is used - * to override the primary destination address in the TCP model, or - * when SCTP_ADDR_OVER flag is set in the UDP model. - */ - if ((sctp_style(sk, TCP) && daddr) || - (sinfo_flags & SCTP_ADDR_OVER)) { - chunk_tp = sctp_assoc_lookup_paddr(asoc, daddr); - if (!chunk_tp) { - err = -EINVAL; - goto out_free; - } - } else - chunk_tp = NULL; - /* Send msg to the asoc */ - err = sctp_sendmsg_to_asoc(asoc, msg, msg_len, chunk_tp, sinfo); - -out_free: + err = sctp_sendmsg_to_asoc(asoc, msg, msg_len, transport, sinfo); if (err < 0 && err != -ESRCH && new_asoc) sctp_association_free(asoc); + out_unlock: release_sock(sk); out_nounlock: From patchwork Thu Mar 1 15:05:17 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xin Long X-Patchwork-Id: 879906 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="RjMKEVMj"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zsbP84qvPz9s1S for ; Fri, 2 Mar 2018 02:06:36 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031734AbeCAPGe (ORCPT ); Thu, 1 Mar 2018 10:06:34 -0500 Received: from mail-pf0-f195.google.com ([209.85.192.195]:40567 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031659AbeCAPGb (ORCPT ); Thu, 1 Mar 2018 10:06:31 -0500 Received: by mail-pf0-f195.google.com with SMTP id x1so670716pfh.7; Thu, 01 Mar 2018 07:06:31 -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=jsxsPVSU2rvDT3N9tMbH6p8DxLivtLloGsMl3KHXuPI=; b=RjMKEVMjI45lOebk61wQdtdmpRcKBFucsqhthjJPRjBCOCYZwpCTqI68hyNHT0ZyF+ JmUFxeNIZduQpJw+3iwWfINbVwvAYmk1PQdh+c0kY4nOkGuIGGtJgSpoJWPXi3g9Ixdq jGn+eFohO9WgNfVcVUpNtw9W/wxanwQSqDHTXcHrB2zFLPf2rdKvJey2CsxcNrKDSuNG HYwoVbYE+b//cG5bj2dZHFbs+FunkEqorec0B2NhvFltVeGCdI30kre01fXMajonT03i U6x1liA38b3QmUS5opgqTD3Rg5letQT9UwOkw5fI7HckWjkVpXwKrLdM5jMRr3P8bfVB d/hw== 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=jsxsPVSU2rvDT3N9tMbH6p8DxLivtLloGsMl3KHXuPI=; b=i0y6lNl9cmVq6B08StYn9PPsoqJUXXB5Kc28hgvTcf94ORrZVK1+/iDoYm7ObRd3IF PN94+UfR4rsU4n6EO19ciYaui63awsiPW8Os2fzcQfSNf6tmMVh02N5oBd9XsBATZ3VI KWodeLGxvprfiDZUsOiUx/dOYVfr5W+Ay04i3qieZT788PCQAWpEAoQCyeb4gHLsgo1T DTR4NTJRWZliT4qGPBwyaPNKjf+40pk52zBtMGxH6QezgonjLNS6EJoQjJ+1QCnQuH9f 3YfaHnOqG6X4RgLWH8jUy6wzrrwjwH6uBXHd6yb2JsJaXtcnHKO2DHdEhatgqq1EWpU8 Oi3w== X-Gm-Message-State: APf1xPBw8k1yE+rTD8Tzqk/mliyAfsCghxxCudeXJEgGmjvZHSbRuwHN VpCIk9ijlUsbTPu1mUqn0Xqx0L6y X-Google-Smtp-Source: AG47ELteqqo08E9cKv5XNdfDcg0evpCZH2D/XfL6q3Pw0JcfQPibxX3JTcO58dDBS5dnHonqX236VQ== X-Received: by 10.98.245.131 with SMTP id b3mr2288611pfm.20.1519916790511; Thu, 01 Mar 2018 07:06:30 -0800 (PST) Received: from localhost ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id e19sm6961515pga.8.2018.03.01.07.06.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 01 Mar 2018 07:06:29 -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 8/9] sctp: improve some variables in sctp_sendmsg Date: Thu, 1 Mar 2018 23:05:17 +0800 Message-Id: <7dae2617b0b09ee14bb8509a455d32b3d73c9cb0.1519916440.git.lucien.xin@gmail.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <45d67b278e2b79a28295148582e2fd22c1f45b57.1519916440.git.lucien.xin@gmail.com> References: <1dbdb93e27d978da9fe883dbe72db78fbb58ec95.1519916440.git.lucien.xin@gmail.com> <588fe081ed87c02258db4caf0377979d19a8132a.1519916440.git.lucien.xin@gmail.com> <45d67b278e2b79a28295148582e2fd22c1f45b57.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 mostly is to: - rename sinfo_flags as sflags, to make the indents look better, and also keep consistent with other sctp_sendmsg_xx functions. - replace new_asoc with bool new, no need to define a pointer here, as if new_asoc is set, it must be asoc. - rename the 'out_nounlock:' as 'out', shorter and nicer. - remove associd, only one place is using it now, just use sinfo->sinfo_assoc_id directly. - remove 'cmsgs' initialization in sctp_sendmsg, as it will be done in sctp_sendmsg_parse. Signed-off-by: Xin Long --- net/sctp/socket.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/net/sctp/socket.c b/net/sctp/socket.c index 4260310..a1c78fc1 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -1910,28 +1910,28 @@ static void sctp_sendmsg_update_sinfo(struct sctp_association *asoc, static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) { struct sctp_endpoint *ep = sctp_sk(sk)->ep; - struct sctp_association *new_asoc = NULL, *asoc = NULL; struct sctp_transport *transport = NULL; struct sctp_sndrcvinfo _sinfo, *sinfo; - sctp_assoc_t associd = 0; - struct sctp_cmsgs cmsgs = { NULL }; - __u16 sinfo_flags = 0; + struct sctp_association *asoc; + struct sctp_cmsgs cmsgs; union sctp_addr *daddr; + bool new = false; + __u16 sflags; int err; /* Parse and get snd_info */ err = sctp_sendmsg_parse(sk, &cmsgs, &_sinfo, msg, msg_len); if (err) - goto out_nounlock; + goto out; sinfo = &_sinfo; - sinfo_flags = sinfo->sinfo_flags; + sflags = sinfo->sinfo_flags; /* Get daddr from msg */ daddr = sctp_sendmsg_get_daddr(sk, msg, &cmsgs); if (IS_ERR(daddr)) { err = PTR_ERR(daddr); - goto out_nounlock; + goto out; } lock_sock(sk); @@ -1941,7 +1941,7 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) /* Look for a matching association on the endpoint. */ asoc = sctp_endpoint_lookup_assoc(ep, daddr, &transport); } else { - asoc = sctp_id2assoc(sk, associd); + asoc = sctp_id2assoc(sk, sinfo->sinfo_assoc_id); if (!asoc) { err = -EPIPE; goto out_unlock; @@ -1949,24 +1949,23 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) } if (asoc) { - err = sctp_sendmsg_check_sflags(asoc, sinfo_flags, msg, - msg_len); + err = sctp_sendmsg_check_sflags(asoc, sflags, msg, msg_len); if (err <= 0) goto out_unlock; } /* Do we need to create the association? */ if (!asoc) { - err = sctp_sendmsg_new_asoc(sk, sinfo_flags, &cmsgs, daddr, + err = sctp_sendmsg_new_asoc(sk, sflags, &cmsgs, daddr, &transport); if (err) goto out_unlock; asoc = transport->asoc; - new_asoc = asoc; + new = true; } - if (!sctp_style(sk, TCP) && !(sinfo_flags & SCTP_ADDR_OVER)) + if (!sctp_style(sk, TCP) && !(sflags & SCTP_ADDR_OVER)) transport = NULL; /* Update snd_info with the asoc */ @@ -1974,12 +1973,12 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) /* Send msg to the asoc */ err = sctp_sendmsg_to_asoc(asoc, msg, msg_len, transport, sinfo); - if (err < 0 && err != -ESRCH && new_asoc) + if (err < 0 && err != -ESRCH && new) sctp_association_free(asoc); out_unlock: release_sock(sk); -out_nounlock: +out: return sctp_error(sk, msg->msg_flags, err); } From patchwork Thu Mar 1 15:05:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xin Long X-Patchwork-Id: 879907 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="dXtqxrOF"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zsbPJ038hz9s1S for ; Fri, 2 Mar 2018 02:06:44 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1031740AbeCAPGl (ORCPT ); Thu, 1 Mar 2018 10:06:41 -0500 Received: from mail-pf0-f194.google.com ([209.85.192.194]:36761 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1031659AbeCAPGj (ORCPT ); Thu, 1 Mar 2018 10:06:39 -0500 Received: by mail-pf0-f194.google.com with SMTP id 68so2553496pfx.3; Thu, 01 Mar 2018 07:06:39 -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=Ag5GQrdeSs+YAEFMKh1ePiY18bAEYoUw2YHXMxeRfTA=; b=dXtqxrOFdJREkFEtweJqtDRHkyApq/TRG1IEIG/gNTP8c1cyhYsZOJovBdtlut3JSk skHXiF23suFMdFKqGG7iO60XJuZJJjdrJc/j2db0bnEKZno2Df6uPLA7Y+sdLPhB1Q3e uYFAnpv/4pwg1f25ZH9I3Zc97QAn1hbYWeyMV1u7lfPVberLBSy8wsK2FaPD35LosYtP TwE+AHdPyaLNgejqRWa7fHaBwBy1Xwopq6QmX/ymlewPOyrHrlsg8S4YMMX/JouWwDoI gpJeCWn+inXLPxZeAIgDeKkc9aIXpBUcEc3Y+VSZlsR9dEKBiv9tfZkLMTsjvBNchXKy qigw== 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=Ag5GQrdeSs+YAEFMKh1ePiY18bAEYoUw2YHXMxeRfTA=; b=iyeE0eLpWVhcNJubHdCFGT+Gg6PSju9b/xpi2IhrsOHzSu3y/GN46x/5wNKsF9OI0N eRMSntMDUkCy7jbG1CNs7r0RsJ9iXjTaB/MruzieBpib2sP01dg7YZfAUCmx+4GPYP+c KGYtm1Z/VuEIS9aBtTQnrG/JrbzNH4M9MYldbCpfX1xB2yxzRY3XjDpadbZDGhDsLvro w5r+lOi2bf+hJh3xc+bQ2H3NrB6qFhWlOmvQQCYDNSsiUNvf5ZhtlbMnIewmOaFVOKoq sw8oonUr6Y0Bpcw/pXx8I6IjGLp7D/yi50N2qsIqqfMHYHLmHuDehhf9mnU27kbtU1u2 Y2fQ== X-Gm-Message-State: APf1xPBzk6AGDdHm6ESdvxF+9SQBu8kyNM8nkmbxdSPu2Ux29Fzofca1 /pMpFJFY94yg/WB4mJvRMUGlSuXB X-Google-Smtp-Source: AG47ELuEUpwNwTZFSop9v0nqhBVDDjKpe+6l7quQIZJeDrIbDOYOcncetiHzAhNJpLLohB1jMvS7+g== X-Received: by 10.99.111.137 with SMTP id k131mr1807017pgc.11.1519916798740; Thu, 01 Mar 2018 07:06:38 -0800 (PST) Received: from localhost ([209.132.188.80]) by smtp.gmail.com with ESMTPSA id q15sm6646885pgv.38.2018.03.01.07.06.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 01 Mar 2018 07:06:38 -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 9/9] sctp: adjust some codes in a better order in sctp_sendmsg Date: Thu, 1 Mar 2018 23:05:18 +0800 Message-Id: <777c34d435febfa0d708a4f748b4894d1cc89c77.1519916440.git.lucien.xin@gmail.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <7dae2617b0b09ee14bb8509a455d32b3d73c9cb0.1519916440.git.lucien.xin@gmail.com> References: <1dbdb93e27d978da9fe883dbe72db78fbb58ec95.1519916440.git.lucien.xin@gmail.com> <588fe081ed87c02258db4caf0377979d19a8132a.1519916440.git.lucien.xin@gmail.com> <45d67b278e2b79a28295148582e2fd22c1f45b57.1519916440.git.lucien.xin@gmail.com> <7dae2617b0b09ee14bb8509a455d32b3d73c9cb0.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 sctp_sendmsg_new_asoc and SCTP_ADDR_OVER check is only necessary when daddr is set, so move them up to if (daddr) statement. Signed-off-by: Xin Long --- net/sctp/socket.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/net/sctp/socket.c b/net/sctp/socket.c index a1c78fc1..7fa7603 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -1936,38 +1936,38 @@ static int sctp_sendmsg(struct sock *sk, struct msghdr *msg, size_t msg_len) lock_sock(sk); - /* If a msg_name has been specified, assume this is to be used. */ + /* Get and check or create asoc */ if (daddr) { - /* Look for a matching association on the endpoint. */ asoc = sctp_endpoint_lookup_assoc(ep, daddr, &transport); + if (asoc) { + err = sctp_sendmsg_check_sflags(asoc, sflags, msg, + msg_len); + if (err <= 0) + goto out_unlock; + } else { + err = sctp_sendmsg_new_asoc(sk, sflags, &cmsgs, daddr, + &transport); + if (err) + goto out_unlock; + + asoc = transport->asoc; + new = true; + } + + if (!sctp_style(sk, TCP) && !(sflags & SCTP_ADDR_OVER)) + transport = NULL; } else { asoc = sctp_id2assoc(sk, sinfo->sinfo_assoc_id); if (!asoc) { err = -EPIPE; goto out_unlock; } - } - if (asoc) { err = sctp_sendmsg_check_sflags(asoc, sflags, msg, msg_len); if (err <= 0) goto out_unlock; } - /* Do we need to create the association? */ - if (!asoc) { - err = sctp_sendmsg_new_asoc(sk, sflags, &cmsgs, daddr, - &transport); - if (err) - goto out_unlock; - - asoc = transport->asoc; - new = true; - } - - if (!sctp_style(sk, TCP) && !(sflags & SCTP_ADDR_OVER)) - transport = NULL; - /* Update snd_info with the asoc */ sctp_sendmsg_update_sinfo(asoc, sinfo, &cmsgs);