From nobody Fri Jan 12 17:04:59 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 4TBSZh1FcBz579lr; Fri, 12 Jan 2024 17:05:00 +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 4TBSZg5wWXz4ZKl; Fri, 12 Jan 2024 17:04:59 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1705079099; 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=LltCxDpAyRgki284OwsYWCGyzI2EYNLYtLdjkCEsYzA=; b=wXJYExTYMtYqVRW+qS0rKHVsfQmZHzTPq61e6npHzlevZBnpGWngVm817Em6A2N7ZrQwUE /Y4YTZsuJSPotS6nRwi8IvCKRLs8J44a2rKGfxBiSW6vdER77+LdopZg0z2X6xTgqHvmwl z79f0fMZ+NEz6w5XXQgMFXrmNEBFVK2b+46hL8qo+mcaHxcHy30QEaq3/sRrUyKTQhEVz/ JdyK4O7Z5yO18S/D9IUMlbZObbL+s7vEPUXVBWsZoSJqYWxNsB3Ffm8ej/cGa+uoYH7sXC vZuqz1QMH+FfpLlKiwOSW1fl59BEFCfa3bo6qozqLolCqXj/8mqfk0KpYDm7zg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1705079099; 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=LltCxDpAyRgki284OwsYWCGyzI2EYNLYtLdjkCEsYzA=; b=jcaUkQ1Rp4N11uU4bK8Zt349F9U72PxjQ70kOveXajw+AOqdi64VZ3+e8UgjTq9zS0IQ67 xnTTG9AtCsaBTcqdyWzq4OGwCvoj5TdxXgOEBTvxuCcYKPIxnzcFpDgAtKPD2p5hPdq+r9 8iUzO7hjpe1zcfoISPwOUaI5joQ4cr0syoJ4nDC/1tYeSXrvCUllaPudNaMiL9d5XiehJ+ kUPm+Zu+lF5GNX2BO00dfKTjXUw2XLcwp0Ju5z8uESHATSfm0PW8CnwoVGT+ra7BELbEe6 GKWhg6sjrz/BQ7O9wETx+csVEtALh4iX44k4HqJwsaYE5VVgG1fsG+trSFut+A== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1705079099; a=rsa-sha256; cv=none; b=QbmQOPTZEYtFiUR1ElKzYj2ULRancQ0+4OHi1+hJ68k8NKoanhPsjXM7hN5UbJ3cVq+5p7 7S1ErZ+4Er8Qkh8yxHhsAc5VXCeMcZlVgeEAiEPJ1bmeOzCOMCGnAyTbV7mrbnuYqiHtZw JxEU8Sz77kgeNYnF8+zZo7HkpWf25VznjZmN7twhFQNd1HL0YHJxdtX44f/Anmtc7xhOfk szc+mu3EBA82QGVHOyLBNxL+Havm0rTMqCw1c7MBBIKRfO5p4C11xL98pXFXy7SaQ+8Oxm lLHcBmTYG6/WK4yqP4xVCH7/MF7XBN+8yxLdjYMmdX79ig6eTlm40dJ3c25lJQ== 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 4TBSZg4sZZz19P6; Fri, 12 Jan 2024 17:04:59 +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 40CH4xoo014191; Fri, 12 Jan 2024 17:04:59 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 40CH4xW4014188; Fri, 12 Jan 2024 17:04:59 GMT (envelope-from git) Date: Fri, 12 Jan 2024 17:04:59 GMT Message-Id: <202401121704.40CH4xW4014188@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Michael Tuexen Subject: git: fded38cde763 - stable/14 - if_tuntap: add LRO support to tap devices 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/stable/14 X-Git-Reftype: branch X-Git-Commit: fded38cde763e77ec13c8df041788ac3a473ca00 Auto-Submitted: auto-generated The branch stable/14 has been updated by tuexen: URL: https://cgit.FreeBSD.org/src/commit/?id=fded38cde763e77ec13c8df041788ac3a473ca00 commit fded38cde763e77ec13c8df041788ac3a473ca00 Author: Michael Tuexen AuthorDate: 2023-11-19 14:57:53 +0000 Commit: Michael Tuexen CommitDate: 2024-01-12 17:02:35 +0000 if_tuntap: add LRO support to tap devices This allows testing the LRO code with packetdrill in local mode. Reviewed by: rscheff Sponsored by: Netflix, Inc. Differential Revision: https://reviews.freebsd.org/D42548 (cherry picked from commit 99c79cab422705f92f05a2924a29bdf823372ebf) --- sys/net/if_tuntap.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/sys/net/if_tuntap.c b/sys/net/if_tuntap.c index 0de5b0d2d521..98c5044d6867 100644 --- a/sys/net/if_tuntap.c +++ b/sys/net/if_tuntap.c @@ -97,6 +97,7 @@ #endif #include #include +#include #include #include #include @@ -144,6 +145,8 @@ struct tuntap_softc { struct ether_addr tun_ether; /* remote address */ int tun_busy; /* busy count */ int tun_vhdrlen; /* virtio-net header length */ + struct lro_ctrl tun_lro; /* for TCP LRO */ + bool tun_lro_ready; /* TCP LRO initialized */ }; #define TUN2IFP(sc) ((sc)->tun_ifp) @@ -978,7 +981,8 @@ tuncreate(struct cdev *dev) IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); ifp->if_capabilities |= IFCAP_LINKSTATE; if ((tp->tun_flags & TUN_L2) != 0) - ifp->if_capabilities |= IFCAP_RXCSUM | IFCAP_RXCSUM_IPV6; + ifp->if_capabilities |= + IFCAP_RXCSUM | IFCAP_RXCSUM_IPV6 | IFCAP_LRO; ifp->if_capenable |= IFCAP_LINKSTATE; if ((tp->tun_flags & TUN_L2) != 0) { @@ -1175,6 +1179,12 @@ tundtor(void *data) (l2tun && (ifp->if_flags & IFF_LINK0) != 0)) goto out; + if (l2tun && tp->tun_lro_ready) { + TUNDEBUG (ifp, "LRO disabled\n"); + tcp_lro_free(&tp->tun_lro); + tp->tun_lro_ready = false; + } + if (ifp->if_flags & IFF_UP) { TUN_UNLOCK(tp); if_down(ifp); @@ -1219,6 +1229,14 @@ tuninit(struct ifnet *ifp) getmicrotime(&ifp->if_lastchange); TUN_UNLOCK(tp); } else { + if (tcp_lro_init(&tp->tun_lro) == 0) { + TUNDEBUG(ifp, "LRO enabled\n"); + tp->tun_lro.ifp = ifp; + tp->tun_lro_ready = true; + } else { + TUNDEBUG(ifp, "Could not enable LRO\n"); + tp->tun_lro_ready = false; + } ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; TUN_UNLOCK(tp); /* attempt to start output */ @@ -1765,6 +1783,7 @@ tunwrite_l2(struct tuntap_softc *tp, struct mbuf *m, struct epoch_tracker et; struct ether_header *eh; struct ifnet *ifp; + int result; ifp = TUN2IFP(tp); @@ -1820,7 +1839,15 @@ tunwrite_l2(struct tuntap_softc *tp, struct mbuf *m, /* Pass packet up to parent. */ CURVNET_SET(ifp->if_vnet); NET_EPOCH_ENTER(et); - (*ifp->if_input)(ifp, m); + if (tp->tun_lro_ready && ifp->if_capenable & IFCAP_LRO) { + result = tcp_lro_rx(&tp->tun_lro, m, 0); + TUNDEBUG(ifp, "tcp_lro_rx() returned %d\n", result); + } else + result = TCP_LRO_CANNOT; + if (result == 0) + tcp_lro_flush_all(&tp->tun_lro); + else + (*ifp->if_input)(ifp, m); NET_EPOCH_EXIT(et); CURVNET_RESTORE(); /* ibytes are counted in parent */