From nobody Thu Jan 13 16:18:39 2022 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 4FE5A19428F1; Thu, 13 Jan 2022 16:18:40 +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 4JZV3h1qS5z3w57; Thu, 13 Jan 2022 16:18:40 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1642090720; 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=mC/mMXxI76cG6S6x1IhLIeO1xltCg4FS0aFM4biTTzM=; b=j7KfwUzGhqQWq6fiDELKtNIFzqoYsRkWj8J+QkQT9UFQExTJBXrXHWsEn/FP9WSqNDYSwV e5gOiVsFIn24ZmLeiFhTEVmYlvQkKsX/Kv6s1DVwGPVBSTHSEwQSg3C8j3shBsxEe3XNb3 DQTZO/CQo8hTVFYiLEBD2xL8nsPTH/YiprM5SE2n5jppoTES3iSejx8V5Tbk7Vayk9BI9L ZUWkgIr4UX/M4gnytunUJ7cI39DnWdQDuKOO09PEL4sIAFusy2sxO9u50RzuNNkR+hxJuI 8HbdufZrIAXQv3/OyVNR51WAvSfCpM2izIAmnLAFLEMhKo+BN7IroRmPV4uS2Q== 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 1A5CD2371E; Thu, 13 Jan 2022 16:18:40 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 20DGIds8016873; Thu, 13 Jan 2022 16:18:39 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 20DGIddm016872; Thu, 13 Jan 2022 16:18:39 GMT (envelope-from git) Date: Thu, 13 Jan 2022 16:18:39 GMT Message-Id: <202201131618.20DGIddm016872@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Ryan Stone Subject: git: 24fe6643dac0 - main - LRO: Fix lost packets when merging 1 payload with an ACK 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: rstone X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 24fe6643dac0780dc02676626f70052e525b9b22 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1642090720; 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=mC/mMXxI76cG6S6x1IhLIeO1xltCg4FS0aFM4biTTzM=; b=NzOB86Ss+V/kBmRh7aCH7Zf60CryH7qt02Qw+qJ0bstCygiNGZmznkkwBgxWK84OL7a93V FC931ShBydz8eil1pRVBgnCu1bjVxq3hXwYqk7ueim2MDTQTL9IFG8rbrdFHrhDKL0bYeF gj8khBTCVNWDNc5rRJQ1IfbPivXQ+62VPTEzHlTPincxoMggY5+uOBHCNi9UyMBaIywtXI tdtURAdpfXmHJzHABRJblOb+UqwiW5MPqDFC36dTnA+vK6fYhkNQkIF5badDAum09Zq0rp vZ9A/z3TxTtzveUgVS9NUzGpJr/U0Nyw6jmim4+gUz04gcpF5gheC9NuX+cXaQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1642090720; a=rsa-sha256; cv=none; b=TdENCc0juySRWzYI/ossPyH7kp3BCrL3ENufoZQWLTc4YKkh9qQlCACKxKUpMnVwhTgpOV 6cCTTg6xlFh9dRyXw9evW49KrxisoGf8yN6AXzlsK8v9NT5FfXnRYbMtvgHtFAUS3UEx6S P5EeM8xTHuEUbLzBdEZ8cVhPB3hzYAEDlFoJi3crpDCKdr6y7a2cBSX0AU7muSMFKvmi6W Odj5VWolpj/FincQDnYE4PjGn1Pe4DEMoO/G5586TJNp8/XtsiYZBKfZkceINoFtI6te0m 5wbKyuOs7tgVXMCFOs+dwD9KKavGfp7hzB6hOXP3lDtAZyRWx+4+I8n3xEsIKA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by rstone: URL: https://cgit.FreeBSD.org/src/commit/?id=24fe6643dac0780dc02676626f70052e525b9b22 commit 24fe6643dac0780dc02676626f70052e525b9b22 Author: Ryan Stone AuthorDate: 2021-12-31 17:56:20 +0000 Commit: Ryan Stone CommitDate: 2022-01-13 16:17:48 +0000 LRO: Fix lost packets when merging 1 payload with an ACK To check if it needed to regenerate a packet's header before sending it up the stack, LRO was checking if more than one payload had been merged into the packet. This failed in the case where a single payload was merged with one or more pure ACKs. This results in lost ACKs. Fix this by precisely tracking whether header regeneration is required instead of using an incorrect heuristic. Found with: Sysunit test Differential Revision: https://reviews.freebsd.org/D33774 Reviewed by: rrs --- sys/netinet/tcp_lro.c | 16 ++++++++++++---- sys/netinet/tcp_lro.h | 3 ++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/sys/netinet/tcp_lro.c b/sys/netinet/tcp_lro.c index 5b4fe5f20c90..f006cae57302 100644 --- a/sys/netinet/tcp_lro.c +++ b/sys/netinet/tcp_lro.c @@ -820,7 +820,7 @@ static void tcp_flush_out_entry(struct lro_ctrl *lc, struct lro_entry *le) { /* Check if we need to recompute any checksums. */ - if (le->m_head->m_pkthdr.lro_nsegs > 1) { + if (le->needs_merge) { uint16_t csum; switch (le->inner.data.lro_type) { @@ -921,6 +921,7 @@ tcp_set_entry_to_mbuf(struct lro_ctrl *lc, struct lro_entry *le, le->next_seq = ntohl(th->th_seq) + tcp_data_len; le->ack_seq = th->th_ack; le->window = th->th_win; + le->needs_merge = 0; /* Setup new data pointers. */ le->m_head = m; @@ -962,10 +963,12 @@ tcp_push_and_replace(struct lro_ctrl *lc, struct lro_entry *le, struct mbuf *m) } static void -tcp_lro_mbuf_append_pkthdr(struct mbuf *m, const struct mbuf *p) +tcp_lro_mbuf_append_pkthdr(struct lro_entry *le, const struct mbuf *p) { + struct mbuf *m; uint32_t csum; + m = le->m_head; if (m->m_pkthdr.lro_nsegs == 1) { /* Compute relative checksum. */ csum = p->m_pkthdr.lro_tcp_d_csum; @@ -982,6 +985,7 @@ tcp_lro_mbuf_append_pkthdr(struct mbuf *m, const struct mbuf *p) m->m_pkthdr.lro_tcp_d_csum = csum; m->m_pkthdr.lro_tcp_d_len += p->m_pkthdr.lro_tcp_d_len; m->m_pkthdr.lro_nsegs += p->m_pkthdr.lro_nsegs; + le->needs_merge = 1; } static void @@ -1100,8 +1104,12 @@ again: le->next_seq += tcp_data_len; le->ack_seq = th->th_ack; le->window = th->th_win; + le->needs_merge = 1; } else if (th->th_ack == le->ack_seq) { - le->window = WIN_MAX(le->window, th->th_win); + if (WIN_GT(th->th_win, le->window)) { + le->window = th->th_win; + le->needs_merge = 1; + } } if (tcp_data_len == 0) { @@ -1110,7 +1118,7 @@ again: } /* Merge TCP data checksum and length to head mbuf. */ - tcp_lro_mbuf_append_pkthdr(le->m_head, m); + tcp_lro_mbuf_append_pkthdr(le, m); /* * Adjust the mbuf so that m_data points to the first byte of diff --git a/sys/netinet/tcp_lro.h b/sys/netinet/tcp_lro.h index 3eefd4f0537c..97819596231e 100644 --- a/sys/netinet/tcp_lro.h +++ b/sys/netinet/tcp_lro.h @@ -146,7 +146,8 @@ struct lro_entry { uint16_t compressed; uint16_t uncompressed; uint16_t window; - uint16_t timestamp; /* flag, not a TCP hdr field. */ + uint16_t timestamp : 1; + uint16_t needs_merge : 1; struct bintime alloc_time; /* time when entry was allocated */ };