summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/net80211/ieee80211_scan_sta.c
diff options
context:
space:
mode:
Diffstat (limited to 'freebsd/sys/net80211/ieee80211_scan_sta.c')
-rw-r--r--freebsd/sys/net80211/ieee80211_scan_sta.c69
1 files changed, 46 insertions, 23 deletions
diff --git a/freebsd/sys/net80211/ieee80211_scan_sta.c b/freebsd/sys/net80211/ieee80211_scan_sta.c
index a7a1fc29..8dda8499 100644
--- a/freebsd/sys/net80211/ieee80211_scan_sta.c
+++ b/freebsd/sys/net80211/ieee80211_scan_sta.c
@@ -474,6 +474,8 @@ static const u_int chanflags[IEEE80211_MODE_MAX] = {
/* check legacy */
[IEEE80211_MODE_11NA] = IEEE80211_CHAN_A,
[IEEE80211_MODE_11NG] = IEEE80211_CHAN_G,
+ [IEEE80211_MODE_VHT_5GHZ] = IEEE80211_CHAN_A,
+ [IEEE80211_MODE_VHT_2GHZ] = IEEE80211_CHAN_G,
};
static void
@@ -496,12 +498,15 @@ add_channels(struct ieee80211vap *vap,
if (c == NULL || isexcluded(vap, c))
continue;
if (mode == IEEE80211_MODE_AUTO) {
+ KASSERT(IEEE80211_IS_CHAN_B(c),
+ ("%s: wrong channel for 'auto' mode %u / %u\n",
+ __func__, c->ic_freq, c->ic_flags));
+
/*
* XXX special-case 11b/g channels so we select
* the g channel if both are present.
*/
- if (IEEE80211_IS_CHAN_B(c) &&
- (cg = find11gchannel(ic, i, c->ic_freq)) != NULL)
+ if ((cg = find11gchannel(ic, i, c->ic_freq)) != NULL)
c = cg;
}
ss->ss_chans[ss->ss_last++] = c;
@@ -620,32 +625,48 @@ makescanlist(struct ieee80211_scan_state *ss, struct ieee80211vap *vap,
*/
for (scan = table; scan->list != NULL; scan++) {
mode = scan->mode;
- if (vap->iv_des_mode != IEEE80211_MODE_AUTO) {
+
+ switch (mode) {
+ case IEEE80211_MODE_11B:
+ if (vap->iv_des_mode == IEEE80211_MODE_11B)
+ break;
+
/*
- * If a desired mode was specified, scan only
- * channels that satisfy that constraint.
+ * The scan table marks 2.4Ghz channels as b
+ * so if the desired mode is 11g / 11ng / 11acg,
+ * then use the 11b channel list but upgrade the mode.
+ *
+ * NB: 11b -> AUTO lets add_channels upgrade an
+ * 11b channel to 11g if available.
*/
- if (vap->iv_des_mode != mode) {
- /*
- * The scan table marks 2.4Ghz channels as b
- * so if the desired mode is 11g, then use
- * the 11b channel list but upgrade the mode.
- */
- if (vap->iv_des_mode == IEEE80211_MODE_11G) {
- if (mode == IEEE80211_MODE_11G) /* Skip the G check */
- continue;
- else if (mode == IEEE80211_MODE_11B)
- mode = IEEE80211_MODE_11G; /* upgrade */
- }
+ if (vap->iv_des_mode == IEEE80211_MODE_AUTO ||
+ vap->iv_des_mode == IEEE80211_MODE_11G ||
+ vap->iv_des_mode == IEEE80211_MODE_11NG ||
+ vap->iv_des_mode == IEEE80211_MODE_VHT_2GHZ) {
+ mode = vap->iv_des_mode;
+ break;
}
- } else {
+
+ continue;
+ case IEEE80211_MODE_11A:
+ /* Use 11a channel list for 11na / 11ac modes */
+ if (vap->iv_des_mode == IEEE80211_MODE_11NA ||
+ vap->iv_des_mode == IEEE80211_MODE_VHT_5GHZ) {
+ mode = vap->iv_des_mode;
+ break;
+ }
+
+ /* FALLTHROUGH */
+ default:
/*
- * This lets add_channels upgrade an 11b channel
- * to 11g if available.
+ * If a desired mode was specified, scan only
+ * channels that satisfy that constraint.
*/
- if (mode == IEEE80211_MODE_11B)
- mode = IEEE80211_MODE_AUTO;
+ if (vap->iv_des_mode != IEEE80211_MODE_AUTO &&
+ vap->iv_des_mode != mode)
+ continue;
}
+
#ifdef IEEE80211_F_XR
/* XR does not operate on turbo channels */
if ((vap->iv_flags & IEEE80211_F_XR) &&
@@ -1335,12 +1356,14 @@ sta_roam_check(struct ieee80211_scan_state *ss, struct ieee80211vap *vap)
mode = ieee80211_chan2mode(ic->ic_bsschan);
roamRate = vap->iv_roamparms[mode].rate;
roamRssi = vap->iv_roamparms[mode].rssi;
+ KASSERT(roamRate != 0 && roamRssi != 0, ("iv_roamparms are not"
+ "initialized for %s mode!", ieee80211_phymode_name[mode]));
+
ucastRate = vap->iv_txparms[mode].ucastrate;
/* NB: the most up to date rssi is in the node, not the scan cache */
curRssi = ic->ic_node_getrssi(ni);
if (ucastRate == IEEE80211_FIXED_RATE_NONE) {
curRate = ni->ni_txrate;
- roamRate &= IEEE80211_RATE_VAL;
IEEE80211_DPRINTF(vap, IEEE80211_MSG_ROAM,
"%s: currssi %d currate %u roamrssi %d roamrate %u\n",
__func__, curRssi, curRate, roamRssi, roamRate);