From nobody Thu Jan 25 23:17:57 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 4TLcF15r8tz58FvD; Thu, 25 Jan 2024 23:17:57 +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 4TLcF13Kgsz4mpP; Thu, 25 Jan 2024 23:17:57 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1706224677; 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=3tuyvHAmHt0R+j7w4eAVelTnoXPsGiuHIBmCPqJCP8k=; b=Amb6maBudWUSvUawk55DDus7EsGKeMIGnDSultRP3s9ce5KrLOZMUSHyNgxfXjgzd4KrDC p3cpbcchOr6WYm1nX/aiBLrSklQaGvHCPaktVQpd2UYlLiXPp3qbh7xHq57041qS909BmO EkIpDTiYHSlx6nOY+i57riaZ3kZ9gBjv4IpMzwz2oudTD+bfQx/mVU7RlnL2NKqMFR5G4e hY0TBr1VOP3J85h7TfQUMRJtF1tO7Ay+uYeZnHR0nG+v9ncKRnrl7BdlXUrD91BsTgPGfK iYXSy6sJa0m1NYz+0preq4JUsA86G3gvAaA7aHuBiGyPqxOjrbCgXPviMZmQzw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1706224677; 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=3tuyvHAmHt0R+j7w4eAVelTnoXPsGiuHIBmCPqJCP8k=; b=IMwq4w0OosSA926x4B0xnRGPgmeIwJ+gNTTkpUT8Sj1YGgrWFQFK7DasA6Dp7NfvgXfP2C J6s0fsBhtzlwqLHnx728EFLZ4JaTlVYooOoavwyHGyEGWdu+5aO3EFwfeHcNE9ti8kdRfS HrnMCw856KX3TMSGORXNYgFNbJhLZ/93Fz/tvY37QFcR/r/Sc/Cum/N7ain3RmzVpR91aW L8HrBKv1K+0vi1uRXAx0sygJJpayn7nhitCUrDF/mcj8Wy/rrujlE4LmeytYiy7i/H+KDh T7BP4cUVVqXAjRK6rix7RWuqE1GI7cFD+2VCacz+6sDfOF+pK2x+K+jDIJycxg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1706224677; a=rsa-sha256; cv=none; b=j66uYj377l3+UszrXiH5jT/XUWmGltpNLfMkSB+4zjBtf1RspTWYLSzFm3HmHdodHcQdc6 ZD+8JX/QZeVWNdKFZn+ynwhO4HxWcCdvVxi8NMI07M7PWATF4bnPdopBiH0E7LXM9qMasw ze/ZTX+x/pMSWXwChjs7WpxhwCzfRmaHQR95/iPbDHhgIur7n9q5ew0XZDD1xoVXZrbIgD 4xgGup4ZMd7F59dZy2TZHJvWBXepftyiNyW7klXa1cchv/RkLmNKH2hQ2GK7lvKCal2Iyt MSbtxUnWJd/M11lrMLfxXR4pSvVJR5FVm2A78mnB1eEHxvajzaCeHlSmvdIJFw== 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 4TLcF12Nq3zHqb; Thu, 25 Jan 2024 23:17:57 +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 40PNHvrX084367; Thu, 25 Jan 2024 23:17:57 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 40PNHvp3084364; Thu, 25 Jan 2024 23:17:57 GMT (envelope-from git) Date: Thu, 25 Jan 2024 23:17:57 GMT Message-Id: <202401252317.40PNHvp3084364@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Richard Scheffenegger Subject: git: fc262fd3dc0a - main - tcp: AccECN access ACE field by shifting bits 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: rscheff X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: fc262fd3dc0a111f42d34cff4012912db906549a Auto-Submitted: auto-generated The branch main has been updated by rscheff: URL: https://cgit.FreeBSD.org/src/commit/?id=fc262fd3dc0a111f42d34cff4012912db906549a commit fc262fd3dc0a111f42d34cff4012912db906549a Author: Richard Scheffenegger AuthorDate: 2024-01-25 22:21:07 +0000 Commit: Richard Scheffenegger CommitDate: 2024-01-25 23:16:22 +0000 tcp: AccECN access ACE field by shifting bits Shifting bits is quicker than checking header flag bits one by one. Also improve readability by the use of switch statements. No change in behaviour. Reviewed By: glebius, tuexen, #transport Sponsored by: NetApp, Inc. Differential Revision: https://reviews.freebsd.org/D43560 --- sys/netinet/tcp_ecn.c | 71 ++++++++++++++++++++++++--------------------------- sys/netinet/tcp_ecn.h | 3 ++- 2 files changed, 36 insertions(+), 38 deletions(-) diff --git a/sys/netinet/tcp_ecn.c b/sys/netinet/tcp_ecn.c index 43c23f8118f4..34ecfe1c83c0 100644 --- a/sys/netinet/tcp_ecn.c +++ b/sys/netinet/tcp_ecn.c @@ -96,6 +96,9 @@ #include #include +static inline int tcp_ecn_get_ace(uint16_t); +static inline void tcp_ecn_set_ace(uint16_t *, uint32_t); + static SYSCTL_NODE(_net_inet_tcp, OID_AUTO, ecn, CTLFLAG_RW | CTLFLAG_MPSAFE, 0, "TCP ECN"); @@ -116,22 +119,24 @@ SYSCTL_INT(_net_inet_tcp_ecn, OID_AUTO, maxretries, void tcp_ecn_input_syn_sent(struct tcpcb *tp, uint16_t thflags, int iptos) { - - if (V_tcp_do_ecn == 0) + switch (V_tcp_do_ecn) { + case 0: return; - if ((V_tcp_do_ecn == 1) || - (V_tcp_do_ecn == 2)) { + case 1: + /* FALLTHROUGH */ + case 2: /* RFC3168 ECN handling */ if ((thflags & (TH_CWR | TH_ECE)) == (0 | TH_ECE)) { tp->t_flags2 |= TF2_ECN_PERMIT; tp->t_flags2 &= ~TF2_ACE_PERMIT; TCPSTAT_INC(tcps_ecn_shs); } - } else - /* decoding Accurate ECN according to table in section 3.1.1 */ - if ((V_tcp_do_ecn == 3) || - (V_tcp_do_ecn == 4)) { - /* + break; + case 3: + /* FALLTHROUGH */ + case 4: + /* decoding Accurate ECN according to + * table in section 3.1.1 * on the SYN,ACK, process the AccECN * flags indicating the state the SYN * was delivered. @@ -208,6 +213,7 @@ tcp_ecn_input_syn_sent(struct tcpcb *tp, uint16_t thflags, int iptos) tp->t_rcep = 0b110; break; } + break; } } @@ -219,10 +225,12 @@ tcp_ecn_input_parallel_syn(struct tcpcb *tp, uint16_t thflags, int iptos) { if (thflags & TH_ACK) return; - if (V_tcp_do_ecn == 0) + switch (V_tcp_do_ecn) { + case 0: return; - if ((V_tcp_do_ecn == 1) || - (V_tcp_do_ecn == 2)) { + case 1: + /* FALLTHROUGH */ + case 2: /* RFC3168 ECN handling */ if ((thflags & (TH_CWR | TH_ECE)) == (TH_CWR | TH_ECE)) { tp->t_flags2 |= TF2_ECN_PERMIT; @@ -230,9 +238,10 @@ tcp_ecn_input_parallel_syn(struct tcpcb *tp, uint16_t thflags, int iptos) tp->t_flags2 |= TF2_ECN_SND_ECE; TCPSTAT_INC(tcps_ecn_shs); } - } else - if ((V_tcp_do_ecn == 3) || - (V_tcp_do_ecn == 4)) { + break; + case 3: + /* FALLTHROUGH */ + case 4: /* AccECN handling */ switch (thflags & (TH_AE | TH_CWR | TH_ECE)) { default: @@ -272,6 +281,7 @@ tcp_ecn_input_parallel_syn(struct tcpcb *tp, uint16_t thflags, int iptos) } break; } + break; } } @@ -418,13 +428,7 @@ tcp_ecn_output_established(struct tcpcb *tp, uint16_t *thflags, int len, bool rx * Reply with proper ECN notifications. */ if (tp->t_flags2 & TF2_ACE_PERMIT) { - *thflags &= ~(TH_AE|TH_CWR|TH_ECE); - if (tp->t_rcep & 0x01) - *thflags |= TH_ECE; - if (tp->t_rcep & 0x02) - *thflags |= TH_CWR; - if (tp->t_rcep & 0x04) - *thflags |= TH_AE; + tcp_ecn_set_ace(thflags, tp->t_rcep); if (!(tp->t_flags2 & TF2_ECN_PERMIT)) { /* * here we process the final @@ -476,9 +480,6 @@ tcp_ecn_syncache_socket(struct tcpcb *tp, struct syncache *sc) tp->t_scep = 6; tp->t_rcep = 6; break; - /* undefined SCF codepoint */ - default: - break; } } } @@ -591,24 +592,20 @@ tcp_ecn_syncache_respond(uint16_t thflags, struct syncache *sc) TCPSTAT_INC(tcps_ecn_shs); TCPSTAT_INC(tcps_ace_ce); break; - /* undefined SCF codepoint */ - default: - break; } } return thflags; } -int +static inline int tcp_ecn_get_ace(uint16_t thflags) { - int ace = 0; + return ((thflags & (TH_AE|TH_CWR|TH_ECE)) >> TH_ACE_SHIFT); +} - if (thflags & TH_ECE) - ace += 1; - if (thflags & TH_CWR) - ace += 2; - if (thflags & TH_AE) - ace += 4; - return ace; +static inline void +tcp_ecn_set_ace(uint16_t *thflags, uint32_t t_rcep) +{ + *thflags &= ~(TH_AE|TH_CWR|TH_ECE); + *thflags |= ((t_rcep << TH_ACE_SHIFT) & (TH_AE|TH_CWR|TH_ECE)); } diff --git a/sys/netinet/tcp_ecn.h b/sys/netinet/tcp_ecn.h index db5c71d64cab..89ee157361ab 100644 --- a/sys/netinet/tcp_ecn.h +++ b/sys/netinet/tcp_ecn.h @@ -38,6 +38,8 @@ #include #include +#define TH_ACE_SHIFT 6 + void tcp_ecn_input_syn_sent(struct tcpcb *, uint16_t, int); void tcp_ecn_input_parallel_syn(struct tcpcb *, uint16_t, int); int tcp_ecn_input_segment(struct tcpcb *, uint16_t, int, int, int); @@ -46,7 +48,6 @@ int tcp_ecn_output_established(struct tcpcb *, uint16_t *, int, bool); void tcp_ecn_syncache_socket(struct tcpcb *, struct syncache *); int tcp_ecn_syncache_add(uint16_t, int); uint16_t tcp_ecn_syncache_respond(uint16_t, struct syncache *); -int tcp_ecn_get_ace(uint16_t); #endif /* _KERNEL */