From nobody Sat Feb 24 18:20:03 2024 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4ThwCR2tC1z5BJsH; Sat, 24 Feb 2024 18:20:03 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ThwCR2MF6z4qh1; Sat, 24 Feb 2024 18:20:03 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1708798803; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=QsOKlI0/85/Vc6WPeY3FixGoLlXwMs3Iw+xHIQsxwhQ=; b=jbfZqQY9qOF24jEZe8aBn1mAoAu71oVk7LfVuwAAt7DieNBZxIyFxq1MgSohjbjeCQ+lep 1xfQQuhEFtqeQSAuA4dV1RejEgzzG5jNWPTBSXttXlwMuPBu8dnn24/JG869TIik4p8BBw 5BClyji7GIi7RVmnuTLb6rmiFMqHsiSSZdNLtKmGtLl6rrLCTZ3IHUqTIrWdIv0zYaTSjq 9R4Yp65tliJ5QxalvRP7yT4qH2sgoiKUZb1anrdrLwPcIqbjjZpSW/JIPFu3mVHzhgNfbS nC54icb5LgCx4byO2IhzHYEYjnVphxBgZws13PLLmkK84nXCRP6jzJ/RbgzlcQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1708798803; a=rsa-sha256; cv=none; b=o8N51RoXYTljD+1ZWIdM5BYEv5216I0wfSxFMDkaH8U2d4FeB8iNiGshL2XIyLXa5GENpJ f/7CXRDn6Hgnv0Rk55pBkt00P7gkRz64poYCexTehfW2DhcvPnscMOy8gGQPGRU78WF55e 4FR9B579UVt0/ji3vHcgToi29PTPeWGPO6whXyRatO8066TB4ypDLuoaH0JKYCYR8Cgtvv WnVsbSr2Ina8C+Z6AXUCrGBIzCYwljJHXlfjvYFVNfjVgtyQw85yL6iUruSEIPWGW9Ks5Z ILE2FTy7dNCykd1WotMNc0oR2lctYDE2TMa30SF3/Ufq9sMFJL6KUTnMR7+0aA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1708798803; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=QsOKlI0/85/Vc6WPeY3FixGoLlXwMs3Iw+xHIQsxwhQ=; b=MXYC70vqDdFvG/IAnc9glmq9H3GZovr7OXccUDNLESfkWf15MlbAU19fe25SDe8k8IQ9Tt nqyYQTlF44vKYRnUDaOOS3QE5gaLY4mM1XjHaIGYuuCemWfrWZBAHO1tFMGayWXA4XVQqB mbZuHmQ5nO1aCF8bSQ2AHCwYMj26iG1nagyHFp4GpNqkljS0LZWlLcKEFcdZkvy2av4y9k FSX3bdjLGQqmPX/zsyAOthGlK39DERKHoBCy8xID7vi9FcmHkr8ALyXGJNuL/rYuRwHTAp wgcdyvWR/khqYcRpN15t6/XLXmGyQg3oq91ktQXp7Vrev2L+WhJtNQD/Ld+hrQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4ThwCR1RGqz19QM; Sat, 24 Feb 2024 18:20:03 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 41OIK3Ri099773; Sat, 24 Feb 2024 18:20:03 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 41OIK3hY099766; Sat, 24 Feb 2024 18:20:03 GMT (envelope-from git) Date: Sat, 24 Feb 2024 18:20:03 GMT Message-Id: <202402241820.41OIK3hY099766@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Michael Tuexen Subject: git: 644cffe67f61 - main - sctp: improve sending of packets containing an INIT ACK chunk List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: tuexen X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 644cffe67f61ad5b36b60d621d1c630ff2a50412 Auto-Submitted: auto-generated The branch main has been updated by tuexen: URL: https://cgit.FreeBSD.org/src/commit/?id=644cffe67f61ad5b36b60d621d1c630ff2a50412 commit 644cffe67f61ad5b36b60d621d1c630ff2a50412 Author: Michael Tuexen AuthorDate: 2024-02-24 18:16:36 +0000 Commit: Michael Tuexen CommitDate: 2024-02-24 18:16:36 +0000 sctp: improve sending of packets containing an INIT ACK chunk If the peer announced support of zero checksums, do so when sending packets containing an INIT ACK chunk. MFC after: 1 week --- sys/netinet/sctp_input.c | 2 +- sys/netinet/sctp_output.c | 36 ++++++++++++++++++++++++++++++++---- sys/netinet/sctp_output.h | 4 +++- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/sys/netinet/sctp_input.c b/sys/netinet/sctp_input.c index 6937f8a2a43f..a55ef5ac1eab 100644 --- a/sys/netinet/sctp_input.c +++ b/sys/netinet/sctp_input.c @@ -406,7 +406,7 @@ sctp_process_init_ack(struct mbuf *m, int iphlen, int offset, op_err = sctp_arethere_unrecognized_parameters(m, (offset + sizeof(struct sctp_init_chunk)), &abort_flag, (struct sctp_chunkhdr *)cp, - &nat_friendly, &cookie_found); + &nat_friendly, &cookie_found, NULL); if (abort_flag) { /* Send an abort and notify peer */ sctp_abort_association(stcb->sctp_ep, stcb, m, iphlen, diff --git a/sys/netinet/sctp_output.c b/sys/netinet/sctp_output.c index c988a8426fe8..a8facff6b917 100644 --- a/sys/netinet/sctp_output.c +++ b/sys/netinet/sctp_output.c @@ -4918,7 +4918,8 @@ sctp_arethere_unrecognized_parameters(struct mbuf *in_initpkt, int param_offset, int *abort_processing, struct sctp_chunkhdr *cp, int *nat_friendly, - int *cookie_found) + int *cookie_found, + uint32_t *edmid) { /* * Given a mbuf containing an INIT or INIT-ACK with the param_offset @@ -4934,8 +4935,8 @@ sctp_arethere_unrecognized_parameters(struct mbuf *in_initpkt, * hoped that this routine may be reused in the future by new * features. */ + struct sctp_zero_checksum_acceptable zero_chksum, *zero_chksum_p; struct sctp_paramhdr *phdr, params; - struct mbuf *mat, *m_tmp, *op_err, *op_err_last; int at, limit, pad_needed; uint16_t ptype, plen, padded_size; @@ -4944,6 +4945,9 @@ sctp_arethere_unrecognized_parameters(struct mbuf *in_initpkt, if (cookie_found != NULL) { *cookie_found = 0; } + if (edmid != NULL) { + *edmid = SCTP_EDMID_NONE; + } mat = in_initpkt; limit = ntohs(cp->chunk_length) - sizeof(struct sctp_init_chunk); at = param_offset; @@ -4999,6 +5003,22 @@ sctp_arethere_unrecognized_parameters(struct mbuf *in_initpkt, } at += padded_size; break; + case SCTP_ZERO_CHECKSUM_ACCEPTABLE: + if (padded_size != sizeof(struct sctp_zero_checksum_acceptable)) { + SCTPDBG(SCTP_DEBUG_OUTPUT1, "Invalid size - error checksum acceptable %d\n", plen); + goto invalid_size; + } + if (edmid != NULL) { + phdr = sctp_get_next_param(mat, at, + (struct sctp_paramhdr *)&zero_chksum, + sizeof(struct sctp_zero_checksum_acceptable)); + if (phdr != NULL) { + zero_chksum_p = (struct sctp_zero_checksum_acceptable *)phdr; + *edmid = ntohl(zero_chksum_p->edmid); + } + } + at += padded_size; + break; case SCTP_RANDOM: if (padded_size > (sizeof(struct sctp_auth_random) + SCTP_RANDOM_MAX_SIZE)) { SCTPDBG(SCTP_DEBUG_OUTPUT1, "Invalid size - error random %d\n", plen); @@ -5513,7 +5533,9 @@ sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb, int nat_friendly = 0; int error; struct socket *so; + uint32_t edmid; uint16_t num_ext, chunk_len, padding_len, parameter_len; + bool use_zero_crc; if (stcb) { asoc = &stcb->asoc; @@ -5554,7 +5576,7 @@ sctp_send_initiate_ack(struct sctp_inpcb *inp, struct sctp_tcb *stcb, (offset + sizeof(struct sctp_init_chunk)), &abort_flag, (struct sctp_chunkhdr *)init_chk, - &nat_friendly, NULL); + &nat_friendly, NULL, &edmid); if (abort_flag) { do_a_abort: if (op_err == NULL) { @@ -6155,12 +6177,18 @@ do_a_abort: over_addr = NULL; } + if (asoc != NULL) { + use_zero_crc = (asoc->rcv_edmid != SCTP_EDMID_NONE) && (asoc->rcv_edmid == edmid); + } else { + use_zero_crc = (inp->rcv_edmid != SCTP_EDMID_NONE) && (inp->rcv_edmid == edmid); + } + if ((error = sctp_lowlevel_chunk_output(inp, NULL, NULL, to, m, 0, NULL, 0, 0, 0, 0, inp->sctp_lport, sh->src_port, init_chk->init.initiate_tag, port, over_addr, mflowtype, mflowid, - false, /* XXXMT: Improve this! */ + use_zero_crc, SCTP_SO_NOT_LOCKED))) { SCTPDBG(SCTP_DEBUG_OUTPUT4, "Gak send error %d\n", error); if (error == ENOBUFS) { diff --git a/sys/netinet/sctp_output.h b/sys/netinet/sctp_output.h index 1a1d17221b02..88c12367346a 100644 --- a/sys/netinet/sctp_output.h +++ b/sys/netinet/sctp_output.h @@ -80,7 +80,9 @@ sctp_send_initiate_ack(struct sctp_inpcb *, struct sctp_tcb *, struct mbuf * sctp_arethere_unrecognized_parameters(struct mbuf *, int, int *, - struct sctp_chunkhdr *, int *, int *); + struct sctp_chunkhdr *, int *, int *, + uint32_t *); + void sctp_queue_op_err(struct sctp_tcb *, struct mbuf *); int