From patchwork Thu Apr 26 19:58:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcelo Ricardo Leitner X-Patchwork-Id: 905352 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="kBN4UgiC"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40X7Kg6T2bz9s02 for ; Fri, 27 Apr 2018 06:03:19 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755703AbeDZT7c (ORCPT ); Thu, 26 Apr 2018 15:59:32 -0400 Received: from mail-qt0-f195.google.com ([209.85.216.195]:35007 "EHLO mail-qt0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754582AbeDZT71 (ORCPT ); Thu, 26 Apr 2018 15:59:27 -0400 Received: by mail-qt0-f195.google.com with SMTP id s2-v6so33192495qti.2; Thu, 26 Apr 2018 12:59:26 -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=3szBGDMSZJigYCg64kAIeV+pjatMwi8gZMvW1UHHqcg=; b=kBN4UgiC/p2nxUlvs0NflluDpgUqKWgeiUnnabo/EcZHMXCGkkgoX014nlmgLGDRXo SYAV5uENmEn8U5sbUqXxwKfrf1t9Gd3nF92NiTwXV5BoDIUHGCVCTBjUmOFFusM3y7l7 O+GduJxdYv0QET3SdIjzirUYl9w/KhWi6eoSQaOpnH+7II69RvXZX8wVRr1tHD38+H2E hrMxK24h4Nzr4jUZ0y/Kwl4SvOvrqmGGFOnDUQuV74ZvJYfa3F9MKIOjR330Itww5w0K +UtzPQi18BTNfdUtMkZz3LxBuah2kqm/mDbxGZ5TLsKH8Cy1Wzr+GtiVQtMuulWPkjdP AXYw== 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=3szBGDMSZJigYCg64kAIeV+pjatMwi8gZMvW1UHHqcg=; b=HEFfxnLLLGG1lGWpq6tPonG11rww/+RjWn82yURzPcJ+70IQO2poH0LkPZLgPQZvf9 hfa6aS26LteKvt+jRNR1wwvYgIAzOxgeZdldl5xGgO0ycDG/clsIYyr08OAnREQ4dZ6d 93orJld1RpFcYqb0y3lDKhjw/jyucLy28ZNz4rF4L/uP76gBW02KG2anaK9mmm3P1MPW ocWSKSVXb4dPSW4nR13rAVjnRPCXR/SGRrdt3fgcoc+OQY6SO9e4xdCXeTrV7EG3zsr+ fINWV/kfNKDq3Wn6UXBhBR1NIlT+UR7Fyfm1PZsPSIuSyAUQfCzrudDcl65BOjggipxy lfBw== X-Gm-Message-State: ALQs6tBrgY2l4XnORpcWSZqj5wzpWnkPowg6AGdpYlSiVgt2VVIV9Gs2 K7jgTsxDYbcxUx1DvIQRDkSpmJoo X-Google-Smtp-Source: AIpwx4/L3TbNLTmUa9bfCME8OZ/kTv+BhDI/XK3bxJXJ1p+k3IS8XtQxgagrOlEMCDJUAIQdwBPptA== X-Received: by 2002:ac8:3109:: with SMTP id g9-v6mr37649622qtb.399.1524772766145; Thu, 26 Apr 2018 12:59:26 -0700 (PDT) Received: from localhost.localdomain ([177.10.56.95]) by smtp.gmail.com with ESMTPSA id a20sm16023119qkb.17.2018.04.26.12.59.25 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 26 Apr 2018 12:59:25 -0700 (PDT) Received: by localhost.localdomain (Postfix, from userid 1000) id D4DB0181115; Thu, 26 Apr 2018 16:59:18 -0300 (-03) From: Marcelo Ricardo Leitner To: netdev@vger.kernel.org Cc: linux-sctp@vger.kernel.org, Vlad Yasevich , Neil Horman , Xin Long Subject: [PATCH net-next 05/13] sctp: introduce sctp_mtu_payload Date: Thu, 26 Apr 2018 16:58:54 -0300 Message-Id: <54cf97d9fb948489ca0dedb5087cc2a0c9233c72.1524772453.git.marcelo.leitner@gmail.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: References: Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org When given a MTU, this function calculates how much payload we can carry on it. Without a MTU, it calculates the amount of header overhead we have. So that when we have extra overhead, like the one added for IP options on SELinux patches, it is easier to handle it. Signed-off-by: Marcelo Ricardo Leitner --- include/net/sctp/sctp.h | 19 +++++++++++++++++++ net/sctp/output.c | 25 ++++++++++--------------- net/sctp/socket.c | 7 ++----- 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h index 28b996d6349072fb031de91e10115b688d89b42d..0b98e4683f108670c65a0a7aceaf9a736d54bf29 100644 --- a/include/net/sctp/sctp.h +++ b/include/net/sctp/sctp.h @@ -607,6 +607,25 @@ static inline struct dst_entry *sctp_transport_dst_check(struct sctp_transport * return t->dst; } +/* Calculate max payload size given a MTU, or the total overhead if + * given MTU is zero + */ +static inline __u32 sctp_mtu_payload(const struct sctp_sock *sp, + __u32 mtu, __u32 extra) +{ + __u32 overhead = sizeof(struct sctphdr) + extra; + + if (sp) + overhead += sp->pf->af->net_header_len; + else + overhead += sizeof(struct ipv6hdr); + + if (WARN_ON_ONCE(mtu && mtu <= overhead)) + mtu = overhead; + + return mtu ? mtu - overhead : overhead; +} + static inline bool sctp_transport_pmtu_check(struct sctp_transport *t) { __u32 pmtu = max_t(size_t, SCTP_TRUNC4(dst_mtu(t->dst)), diff --git a/net/sctp/output.c b/net/sctp/output.c index 690d8557bb7bfe20a0a209b6c937c85c764a3bd0..bf4226c3cc1de79f2041d55a68ea53f4fd600b25 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c @@ -90,8 +90,8 @@ void sctp_packet_config(struct sctp_packet *packet, __u32 vtag, { struct sctp_transport *tp = packet->transport; struct sctp_association *asoc = tp->asoc; + struct sctp_sock *sp = NULL; struct sock *sk; - size_t overhead = sizeof(struct ipv6hdr) + sizeof(struct sctphdr); pr_debug("%s: packet:%p vtag:0x%x\n", __func__, packet, vtag); packet->vtag = vtag; @@ -102,25 +102,20 @@ void sctp_packet_config(struct sctp_packet *packet, __u32 vtag, /* set packet max_size with pathmtu, then calculate overhead */ packet->max_size = tp->pathmtu; + if (asoc) { - struct sctp_sock *sp = sctp_sk(asoc->base.sk); - struct sctp_af *af = sp->pf->af; - - overhead = af->net_header_len + - af->ip_options_len(asoc->base.sk); - overhead += sizeof(struct sctphdr); - packet->overhead = overhead; - packet->size = overhead; - } else { - packet->overhead = overhead; - packet->size = overhead; - return; + sk = asoc->base.sk; + sp = sctp_sk(sk); } + packet->overhead = sctp_mtu_payload(sp, 0, 0); + packet->size = packet->overhead; + + if (!asoc) + return; /* update dst or transport pathmtu if in need */ - sk = asoc->base.sk; if (!sctp_transport_dst_check(tp)) { - sctp_transport_route(tp, NULL, sctp_sk(sk)); + sctp_transport_route(tp, NULL, sp); if (asoc->param_flags & SPP_PMTUD_ENABLE) sctp_assoc_sync_pmtu(asoc); } else if (!sctp_transport_pmtu_check(tp)) { diff --git a/net/sctp/socket.c b/net/sctp/socket.c index eeec81d5c485b86076f4e3a4f5dc01fc28fbb91b..b9d14f57146b8e551c28379e379158231fb40ae7 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c @@ -3234,11 +3234,8 @@ static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned if (val) { int min_len, max_len; - min_len = SCTP_DEFAULT_MINSEGMENT - af->net_header_len; - min_len -= af->ip_options_len(sk); - min_len -= sizeof(struct sctphdr) + - sizeof(struct sctp_data_chunk); - + min_len = sctp_mtu_payload(sp, SCTP_DEFAULT_MINSEGMENT, + sizeof(struct sctp_data_chunk)); max_len = SCTP_MAX_CHUNK_LEN - sizeof(struct sctp_data_chunk); if (val < min_len || val > max_len)