From nobody Mon Sep 18 10:38:25 2023
X-Original-To: dev-commits-src-branches@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 4Rq1V927KLz4syH2;
	Mon, 18 Sep 2023 10:38:25 +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 4Rq1V91fSXz3XXD;
	Mon, 18 Sep 2023 10:38:25 +0000 (UTC)
	(envelope-from git@FreeBSD.org)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim;
	t=1695033505;
	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=GfbW1+XaRDvgxBvovvSozJe7saK94M34r4XJ0R/iimo=;
	b=hqT6HloeXxcKsRqR4sW7blTfx1hSFyHVxuplUegT2b4Tkr42ATZIEFXxtEGJTSakODgzld
	m02Ah3fOQx++KE41h5QEZFl0r6bhi5lFmliEYw+QlOp5dmzjs7qRMELEJe79RgaacTRLFs
	rMyEDYXpMLROqs+ozfr9m28C1BCZVJXnL7fsonOwG2QWkXkW7YX5YN+us6K/6QVwYIpxJv
	pEiT3BvF8UxkC2WzpriRKtAmgRxZZ5xfNGCT1kI9U7NhSu4lAhQvT/Ra8mVdAtvXJp4s4O
	tka3qLAMQy2Gxovbsg7F84z27gMdSCRelH9qLPQ7BMBn/zhTVyVx8CaDZVdhDg==
ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1695033505; a=rsa-sha256; cv=none;
	b=IjtLeIRVdJRV+KLVH8pJCz3nx8rsPbPmn2fQmYrT2LzGV/gaV439XF5MaWoDOh6AXcYHBV
	rOiNTJOysF0uf62EU2GMftQ1RTrcO5vZfkpYqxchEnhoSktPGkDjkGRExVbIfcMF2gP40P
	z83uoYOzNZ01kaZzF4AFcLxA8e2UsID4hh5u7OQgmFmoP+4BwIPedYhluekdz5RekLtHKc
	j0cEUF8IHZCGfUX/HMHwuAZf9RkrzqpKIi0nnyY/a0AWa9QDAz1aRpbfAFCx7FOCx6/OC8
	ABG3BKDMyBA0I1TK1aZR/Rcp8rLKKxgBDgl2jomxcGG8WIZ1MR+dmZ/4vJxefw==
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=1695033505;
	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=GfbW1+XaRDvgxBvovvSozJe7saK94M34r4XJ0R/iimo=;
	b=vOqRrOWW/VGrtR/rjKaN3CGfRgCtOewkBg8pEjKK/4bZYQ413dbGWp7khUhn0YcyWfgkpH
	twDwyA0BaEgK8QRzlLg0N0AkH0Qo9+2/b7EDpkQYtHyhdx1nN14g/84iIvzQyNSa+r0C3V
	GuWRzjQOrcsGnpEj1Gj+upxu/oJCn5WdlXzn9f+/bYN91Vp83pzhvdMFtxu+A5zBx03v3B
	7/owYNoMyr/oh7LyqnCTGTxvwD95kl1P8I9tEoywejACuTPuLrDBpEN9pUD28rc5yTuMs+
	lqVk/sPirqN8KtXScp5eGOdglNxCC0j5cCjVXw+BgJHC00DRVcwVs3WymmSmHg==
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 4Rq1V90jr0zClj;
	Mon, 18 Sep 2023 10:38:25 +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 38IAcPVv013849;
	Mon, 18 Sep 2023 10:38:25 GMT
	(envelope-from git@gitrepo.freebsd.org)
Received: (from git@localhost)
	by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 38IAcPGG013846;
	Mon, 18 Sep 2023 10:38:25 GMT
	(envelope-from git)
Date: Mon, 18 Sep 2023 10:38:25 GMT
Message-Id: <202309181038.38IAcPGG013846@gitrepo.freebsd.org>
To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org,
        dev-commits-src-branches@FreeBSD.org
From: Wei Hu <whu@FreeBSD.org>
Subject: git: 4edfbe719bf6 - stable/14 - mana: add ioctl to support
  toggling offloading features
List-Id: Commits to the stable branches of the FreeBSD src repository <dev-commits-src-branches.freebsd.org>
List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches
List-Help: <mailto:dev-commits-src-branches+help@freebsd.org>
List-Post: <mailto:dev-commits-src-branches@freebsd.org>
List-Subscribe: <mailto:dev-commits-src-branches+subscribe@freebsd.org>
List-Unsubscribe: <mailto:dev-commits-src-branches+unsubscribe@freebsd.org>
Sender: owner-dev-commits-src-branches@freebsd.org
X-BeenThere: dev-commits-src-branches@freebsd.org
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
X-Git-Committer: whu
X-Git-Repository: src
X-Git-Refname: refs/heads/stable/14
X-Git-Reftype: branch
X-Git-Commit: 4edfbe719bf6a15dee388e65b39a116e9307be7f
Auto-Submitted: auto-generated

The branch stable/14 has been updated by whu:

URL: https://cgit.FreeBSD.org/src/commit/?id=4edfbe719bf6a15dee388e65b39a116e9307be7f

commit 4edfbe719bf6a15dee388e65b39a116e9307be7f
Author:     Wei Hu <whu@FreeBSD.org>
AuthorDate: 2023-09-13 10:48:02 +0000
Commit:     Wei Hu <whu@FreeBSD.org>
CommitDate: 2023-09-18 10:26:09 +0000

    mana: add ioctl to support toggling offloading features
    
    With this support, users can enable or disable offloading features
    such as txcsum, rxcsum, tso and software lro through ifconfig.
    
    To enable or disable tx features, do it on mana interface first,
    then hn/netvsc to sync it up with mana. For example:
    
    ifconfig mana0 -txcsum
    ifconfig hn0 -tscsum
    
    To enable or disable rx features, just applying on mana interface
    would be sufficient.
    
    Disabling txcsum imples disabling tso. Enabling tso when txcsum
    is disabled will result in an error message in dmesg requesting
    to enable txcsum first.
    
    Above applies to ipv6 offloading features as well.
    
    Tested by:      whu
    MFC after:      3 days
    Sponsored by:   Microsoft
    
    (cherry picked from commit ab7dc1ceb6d36fd804bedb818086ae3ff6692bf7)
---
 sys/dev/mana/mana_en.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 76 insertions(+), 1 deletion(-)

diff --git a/sys/dev/mana/mana_en.c b/sys/dev/mana/mana_en.c
index 56fa4e51ba26..064b28fa94a4 100644
--- a/sys/dev/mana/mana_en.c
+++ b/sys/dev/mana/mana_en.c
@@ -169,7 +169,7 @@ mana_ioctl(if_t ifp, u_long command, caddr_t data)
 	struct ifrsshash *ifrh;
 	struct ifreq *ifr;
 	uint16_t new_mtu;
-	int rc = 0;
+	int rc = 0, mask;
 
 	switch (command) {
 	case SIOCSIFMTU:
@@ -214,6 +214,81 @@ mana_ioctl(if_t ifp, u_long command, caddr_t data)
 		}
 		break;
 
+	case SIOCSIFCAP:
+		MANA_APC_LOCK_LOCK(apc);
+		ifr = (struct ifreq *)data;
+		/*
+		 * Fix up requested capabilities w/ supported capabilities,
+		 * since the supported capabilities could have been changed.
+		 */
+		mask = (ifr->ifr_reqcap & if_getcapabilities(ifp)) ^
+		    if_getcapenable(ifp);
+
+		if (mask & IFCAP_TXCSUM) {
+			if_togglecapenable(ifp, IFCAP_TXCSUM);
+			if_togglehwassist(ifp, (CSUM_TCP | CSUM_UDP | CSUM_IP));
+
+			if ((IFCAP_TSO4 & if_getcapenable(ifp)) &&
+			    !(IFCAP_TXCSUM & if_getcapenable(ifp))) {
+				mask &= ~IFCAP_TSO4;
+				if_setcapenablebit(ifp, 0, IFCAP_TSO4);
+				if_sethwassistbits(ifp, 0, CSUM_IP_TSO);
+				mana_warn(NULL,
+				    "Also disabled tso4 due to -txcsum.\n");
+			}
+		}
+
+		if (mask & IFCAP_TXCSUM_IPV6) {
+			if_togglecapenable(ifp, IFCAP_TXCSUM_IPV6);
+			if_togglehwassist(ifp, (CSUM_UDP_IPV6 | CSUM_TCP_IPV6));
+
+			if ((IFCAP_TSO6 & if_getcapenable(ifp)) &&
+			    !(IFCAP_TXCSUM_IPV6 & if_getcapenable(ifp))) {
+				mask &= ~IFCAP_TSO6;
+				if_setcapenablebit(ifp, 0, IFCAP_TSO6);
+				if_sethwassistbits(ifp, 0, CSUM_IP6_TSO);
+				mana_warn(ifp,
+				    "Also disabled tso6 due to -txcsum6.\n");
+			}
+		}
+
+		if (mask & IFCAP_RXCSUM)
+			if_togglecapenable(ifp, IFCAP_RXCSUM);
+		/* We can't diff IPv6 packets from IPv4 packets on RX path. */
+		if (mask & IFCAP_RXCSUM_IPV6)
+			if_togglecapenable(ifp, IFCAP_RXCSUM_IPV6);
+
+		if (mask & IFCAP_LRO)
+			if_togglecapenable(ifp, IFCAP_LRO);
+
+		if (mask & IFCAP_TSO4) {
+			if (!(IFCAP_TSO4 & if_getcapenable(ifp)) &&
+			    !(IFCAP_TXCSUM & if_getcapenable(ifp))) {
+				MANA_APC_LOCK_UNLOCK(apc);
+				if_printf(ifp, "Enable txcsum first.\n");
+				rc = EAGAIN;
+				goto out;
+			}
+			if_togglecapenable(ifp, IFCAP_TSO4);
+			if_togglehwassist(ifp, CSUM_IP_TSO);
+		}
+
+		if (mask & IFCAP_TSO6) {
+			if (!(IFCAP_TSO6 & if_getcapenable(ifp)) &&
+			    !(IFCAP_TXCSUM_IPV6 & if_getcapenable(ifp))) {
+				MANA_APC_LOCK_UNLOCK(apc);
+				if_printf(ifp, "Enable txcsum6 first.\n");
+				rc = EAGAIN;
+				goto out;
+			}
+			if_togglecapenable(ifp, IFCAP_TSO6);
+			if_togglehwassist(ifp, CSUM_IP6_TSO);
+		}
+
+		MANA_APC_LOCK_UNLOCK(apc);
+out:
+		break;
+
 	case SIOCSIFMEDIA:
 	case SIOCGIFMEDIA:
 	case SIOCGIFXMEDIA: