From nobody Wed Feb 26 19:31:46 2025 X-Original-To: dev-commits-src-main@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 4Z34NL5ybhz5nl5Q; Wed, 26 Feb 2025 19:31:46 +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 "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Z34NL2TFFz3dks; Wed, 26 Feb 2025 19:31:46 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1740598306; 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=B8yvYP2DkJb7Fs/2RHYTpPb3jRswbnMEMltU9MgovvE=; b=yhuNZWMMXsSZf79yJvIBwaeLDGfKjvp0/lz+tsTo2GUpLubthvjs5IALqm7l6dUDFAkVDC 13QagPf2F+oCT0JsVJ1rxpRiy1ocX0C5PcZi6CsTg3Ev+/UrPFhkqcheKvjtWqn/FVXH/A 1t9qO6Qko20/hUuUnSLdrecF+v1ib3n6/BKg5Pj5UcednpMT8hvUz7PHBfWgCzhPHcmGgL R9KMYJh69kpW89iptPBpLdalE9dTOvv0kutkKXibfEkzTLZSmSTuDJiTZS0F7JKQhKSW/h Xz8hW1Bpo5HJ1KvvoSsm8i5z8W2CQpVWnevFpRERVgHT6ZYTYTLy6B+idGxlag== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1740598306; a=rsa-sha256; cv=none; b=bRbabbJ3EGRWXKDQus1Oxl3i4ngNfFN5GXIwFzjx+1K0FKvtGvaplezY9UDIa4+4pmm1iA 6d7vvRtYmjYZY+bn499rO4/F9zHVhFEOLey08M+L73qpNv8sEfueItZoeBvu/12X4dD442 mzxWm0OkSPiR4Tap4xMDe5AAKucRdTGTUSKqhsY6mB5MrCI4qpFfOp6ZqFL0IHLyh9L8qS oPtoPBF8KSLc2RrBEPaDxyul3bFoa9ObORxQ7psaBHhiJjH8WAX+PdkSdeHFgkKjuB3OPC XJNai63wExBYIg7BCalv6ThP46MLJeesEWO+AQuFhXRYJ4KbxE5O8yhyLf5dqQ== 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=1740598306; 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=B8yvYP2DkJb7Fs/2RHYTpPb3jRswbnMEMltU9MgovvE=; b=ih2I3gmhnSHm+SInvDZQbNyoTypjmChBFXgmc3lsJ+WAvsU8ExU0YHyM+BoMF5aGQorCx7 NFUJq2BfQnPEjhxxM6Yt/4yQ/sZmHwDd3CqXCHQF9hbbfEBl6MNKSnj35PXYDWt6rOD451 SU+VSvS6T20bvzrYeGaBB5bV7erZkrVNyI88hCz6XOogz2wCtXHkePi32iL3MKht6RzXNW YVjmrs3R1Yk+nCBJUha1ZbvOgVX/JIY2/cXuDseMk26ypF16ubZ23Aj+H5g7OQy3fqW9FH ry4UAILP5Jgdsxax4YFuc3QKuC2JlUrco7yeyaVOIVhkA0hzdiPiKU10+OhlDA== 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 4Z34NL0szWz1PTx; Wed, 26 Feb 2025 19:31:46 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 51QJVkQM018485; Wed, 26 Feb 2025 19:31:46 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 51QJVkEC018472; Wed, 26 Feb 2025 19:31:46 GMT (envelope-from git) Date: Wed, 26 Feb 2025 19:31:46 GMT Message-Id: <202502261931.51QJVkEC018472@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Adrian Chadd Subject: git: e99cbea414ff - main - net80211: refactor amrr_update() into HT and legacy paths List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: adrian X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: e99cbea414ffa2c439a651e4726896ea8de99c83 Auto-Submitted: auto-generated The branch main has been updated by adrian: URL: https://cgit.FreeBSD.org/src/commit/?id=e99cbea414ffa2c439a651e4726896ea8de99c83 commit e99cbea414ffa2c439a651e4726896ea8de99c83 Author: Adrian Chadd AuthorDate: 2024-12-29 19:38:51 +0000 Commit: Adrian Chadd CommitDate: 2025-02-26 19:31:21 +0000 net80211: refactor amrr_update() into HT and legacy paths Split the amrr_update() routine into HT and legacy paths. Currently they're the same, minus HT / non-HT specific comments and some logging changes. HT rates don't monotonically go up (ie, going MCS 7 -> MCS 8 is wrong, as MCS8 is "just" two stream MCS0) and failing a rate by a little shouldn't necessarily preclude testing the next rate up. This should be a no-op, besides the logging changes. Locally tested: * RTL8192CU, STA mode Differential Revision: https://reviews.freebsd.org/D48248 Reviewed by: bz, thj --- sys/net80211/ieee80211_amrr.c | 101 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 83 insertions(+), 18 deletions(-) diff --git a/sys/net80211/ieee80211_amrr.c b/sys/net80211/ieee80211_amrr.c index d366bf71e367..20e90026bfe9 100644 --- a/sys/net80211/ieee80211_amrr.c +++ b/sys/net80211/ieee80211_amrr.c @@ -226,26 +226,17 @@ amrr_node_deinit(struct ieee80211_node *ni) } static int -amrr_update(struct ieee80211_amrr *amrr, struct ieee80211_amrr_node *amn, +amrr_update_ht(struct ieee80211_amrr *amrr, struct ieee80211_amrr_node *amn, struct ieee80211_node *ni) { int rix = amn->amn_rix; - const struct ieee80211_rateset *rs = NULL; + const struct ieee80211_rateset *rs; - KASSERT(is_enough(amn), ("txcnt %d", amn->amn_txcnt)); - - /* 11n or not? Pick the right rateset */ - if (ieee80211_ht_check_tx_ht(ni)) { - /* XXX ew */ - rs = (struct ieee80211_rateset *) &ni->ni_htrates; - } else { - rs = &ni->ni_rates; - } + rs = (struct ieee80211_rateset *)&ni->ni_htrates; /* XXX TODO: we really need a rate-to-string method */ - /* XXX TODO: non-11n rate should be divided by two.. */ IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, - "AMRR: current rate %d, txcnt=%d, retrycnt=%d", + "AMRR: current rate MCS %d, txcnt=%d, retrycnt=%d", rs->rs_rates[rix] & IEEE80211_RATE_VAL, amn->amn_txcnt, amn->amn_retrycnt); @@ -266,9 +257,9 @@ amrr_update(struct ieee80211_amrr *amrr, struct ieee80211_amrr_node *amn, amn->amn_success = 0; rix++; /* XXX TODO: we really need a rate-to-string method */ - /* XXX TODO: non-11n rate should be divided by two.. */ IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, - "AMRR increasing rate %d (txcnt=%d retrycnt=%d)", + "AMRR increasing rate MCS %d " + "(txcnt=%d retrycnt=%d)", rs->rs_rates[rix] & IEEE80211_RATE_VAL, amn->amn_txcnt, amn->amn_retrycnt); } else { @@ -289,20 +280,94 @@ amrr_update(struct ieee80211_amrr *amrr, struct ieee80211_amrr_node *amn, } rix--; /* XXX TODO: we really need a rate-to-string method */ - /* XXX TODO: non-11n rate should be divided by two.. */ IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, - "AMRR decreasing rate %d (txcnt=%d retrycnt=%d)", + "AMRR decreasing rate MCS %d " + "(txcnt=%d retrycnt=%d)", rs->rs_rates[rix] & IEEE80211_RATE_VAL, amn->amn_txcnt, amn->amn_retrycnt); } amn->amn_recovery = 0; } + return (rix); +} + +static int +amrr_update_legacy(struct ieee80211_amrr *amrr, struct ieee80211_amrr_node *amn, + struct ieee80211_node *ni) +{ + int rix = amn->amn_rix; + const struct ieee80211_rateset *rs; + + rs = &ni->ni_rates; + + /* XXX TODO: we really need a rate-to-string method */ + IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, + "AMRR: current rate %d Mb, txcnt=%d, retrycnt=%d", + (rs->rs_rates[rix] & IEEE80211_RATE_VAL) / 2, + amn->amn_txcnt, + amn->amn_retrycnt); + + if (is_success(amn)) { + amn->amn_success++; + if (amn->amn_success >= amn->amn_success_threshold && + rix + 1 < rs->rs_nrates) { + amn->amn_recovery = 1; + amn->amn_success = 0; + rix++; + /* XXX TODO: we really need a rate-to-string method */ + IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, + "AMRR increasing rate %d Mb (txcnt=%d retrycnt=%d)", + (rs->rs_rates[rix] & IEEE80211_RATE_VAL) / 2, + amn->amn_txcnt, amn->amn_retrycnt); + } else { + amn->amn_recovery = 0; + } + } else if (is_failure(amn)) { + amn->amn_success = 0; + if (rix > 0) { + if (amn->amn_recovery) { + amn->amn_success_threshold *= 2; + if (amn->amn_success_threshold > + amrr->amrr_max_success_threshold) + amn->amn_success_threshold = + amrr->amrr_max_success_threshold; + } else { + amn->amn_success_threshold = + amrr->amrr_min_success_threshold; + } + rix--; + /* XXX TODO: we really need a rate-to-string method */ + IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_RATECTL, ni, + "AMRR decreasing rate %d Mb (txcnt=%d retrycnt=%d)", + (rs->rs_rates[rix] & IEEE80211_RATE_VAL) / 2, + amn->amn_txcnt, amn->amn_retrycnt); + } + amn->amn_recovery = 0; + } + + return (rix); +} + +static int +amrr_update(struct ieee80211_amrr *amrr, struct ieee80211_amrr_node *amn, + struct ieee80211_node *ni) +{ + int rix; + + KASSERT(is_enough(amn), ("txcnt %d", amn->amn_txcnt)); + + /* 11n or not? Pick the right rateset */ + if (ieee80211_ht_check_tx_ht(ni)) + rix = amrr_update_ht(amrr, amn, ni); + else + rix = amrr_update_legacy(amrr, amn, ni); + /* reset counters */ amn->amn_txcnt = 0; amn->amn_retrycnt = 0; - return rix; + return (rix); } /*