Bug 183428 - [net80211] [iwn] Some APs seem to announce HT but no HT rates
Summary: [net80211] [iwn] Some APs seem to announce HT but no HT rates
Status: Closed FIXED
Alias: None
Product: Base System
Classification: Unclassified
Component: wireless (show other bugs)
Version: Unspecified
Hardware: Any Any
: Normal Affects Only Me
Assignee: freebsd-wireless (Nobody)
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2013-10-29 04:00 UTC by Adrian Chadd
Modified: 2019-01-21 09:24 UTC (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Adrian Chadd freebsd_committer freebsd_triage 2013-10-29 04:00:00 UTC
I just came across an 802.11n AP that doesn't announce 802.11n rates.

The net80211 code dutifully sets the channel up as an 11n channel and populates the HT rate set as empty.

So, amrr gets very confused when this occurs. And so does iwn.

There's two things to fix:

* amrr should not treat the node as 11n if there are no 11n rates;
* iwn should not assume that if the channel is 11n, that the rate is an MCS rate.
Comment 1 Mark Linimon freebsd_committer freebsd_triage 2013-10-29 04:54:27 UTC
Responsible Changed
From-To: freebsd-bugs->freebsd-wireless

Over to maintainer(s).
Comment 2 dfilter service freebsd_committer freebsd_triage 2013-10-31 02:05:01 UTC
Author: adrian
Date: Thu Oct 31 02:04:53 2013
New Revision: 257412
URL: http://svnweb.freebsd.org/changeset/base/257412

Log:
  Don't treat the node as an 11n node if 11n rates are disabled.
  
  For now, the AMRR code only knows about _either_ MCS or non-MCS rates.
  It doesn't know how to downgrade (ie, doing 11b CCK rates if MCS0 isn't
  reliable.)
  
  PR:		kern/183428

Modified:
  head/sys/net80211/ieee80211_amrr.c

Modified: head/sys/net80211/ieee80211_amrr.c
==============================================================================
--- head/sys/net80211/ieee80211_amrr.c	Thu Oct 31 02:03:30 2013	(r257411)
+++ head/sys/net80211/ieee80211_amrr.c	Thu Oct 31 02:04:53 2013	(r257412)
@@ -131,6 +131,12 @@ amrr_deinit(struct ieee80211vap *vap)
 	free(vap->iv_rs, M_80211_RATECTL);
 }
 
+/*
+ * Return whether 11n rates are possible.
+ *
+ * Some 11n devices may return HT information but no HT rates.
+ * Thus, we shouldn't treat them as an 11n node.
+ */
 static int
 amrr_node_is_11n(struct ieee80211_node *ni)
 {
@@ -139,6 +145,8 @@ amrr_node_is_11n(struct ieee80211_node *
 		return (0);
 	if (ni->ni_chan == IEEE80211_CHAN_ANYC)
 		return (0);
+	if (IEEE80211_IS_CHAN_HT(ni->ni_chan) && ni->ni_htrates.rs_nrates == 0)
+		return (0);
 	return (IEEE80211_IS_CHAN_HT(ni->ni_chan));
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 3 dfilter service freebsd_committer freebsd_triage 2013-10-31 02:21:56 UTC
Author: adrian
Date: Thu Oct 31 02:21:48 2013
New Revision: 257415
URL: http://svnweb.freebsd.org/changeset/base/257415

Log:
  Don't base the rate table selection based on the channel mode;
  it needs to check whether there are rate entries in there or not.
  
  PR:		kern/183428

Modified:
  head/sys/dev/iwn/if_iwn.c

Modified: head/sys/dev/iwn/if_iwn.c
==============================================================================
--- head/sys/dev/iwn/if_iwn.c	Thu Oct 31 02:14:28 2013	(r257414)
+++ head/sys/dev/iwn/if_iwn.c	Thu Oct 31 02:21:48 2013	(r257415)
@@ -4312,6 +4312,7 @@ iwn_set_link_quality(struct iwn_softc *s
 	struct iwn_cmd_link_quality linkq;
 	uint8_t txant;
 	int i, rate, txrate;
+	int is_11n;
 
 	DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
 
@@ -4326,15 +4327,25 @@ iwn_set_link_quality(struct iwn_softc *s
 	linkq.ampdu_threshold = 3;
 	linkq.ampdu_limit = htole16(4000);	/* 4ms */
 
+	/*
+	 * Are we using 11n rates? Ensure the channel is
+	 * 11n _and_ we have some 11n rates, or don't
+	 * try.
+	 */
+	if (IEEE80211_IS_CHAN_HT(ni->ni_chan) && ni->ni_htrates.rs_nrates > 0)
+		is_11n = 1;
+	else
+		is_11n = 0;
+
 	/* Start at highest available bit-rate. */
-	if (IEEE80211_IS_CHAN_HT(ni->ni_chan))
+	if (is_11n)
 		txrate = ni->ni_htrates.rs_nrates - 1;
 	else
 		txrate = rs->rs_nrates - 1;
 	for (i = 0; i < IWN_MAX_TX_RETRIES; i++) {
 		uint32_t plcp;
 
-		if (IEEE80211_IS_CHAN_HT(ni->ni_chan))
+		if (is_11n)
 			rate = IEEE80211_RATE_MCS | txrate;
 		else
 			rate = RV(rs->rs_rates[txrate]);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 4 Eitan Adler freebsd_committer freebsd_triage 2018-05-28 19:46:02 UTC
batch change:

For bugs that match the following
-  Status Is In progress 
AND
- Untouched since 2018-01-01.
AND
- Affects Base System OR Documentation

DO:

Reset to open status.


Note:
I did a quick pass but if you are getting this email it might be worthwhile to double check to see if this bug ought to be closed.
Comment 5 Oleksandr Tymoshenko freebsd_committer freebsd_triage 2019-01-21 09:24:25 UTC
There is a commit referencing this PR, but it's still not closed and has been inactive for some time. Closing the PR as fixed but feel free to re-open it if the issue hasn't been completely resolved.

Thanks