summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorsam <sam@FreeBSD.org>2008-12-15 01:26:33 +0000
committersam <sam@FreeBSD.org>2008-12-15 01:26:33 +0000
commitdc256886cd00e7367a087d21fe06be26030d80e0 (patch)
treec93f57c8693451ef5985e24651f8da4d8456781a /sys
parent3ec60cf583778dfd58f3aef1e866bb688c51c04d (diff)
downloadFreeBSD-src-dc256886cd00e7367a087d21fe06be26030d80e0.zip
FreeBSD-src-dc256886cd00e7367a087d21fe06be26030d80e0.tar.gz
Fix definition of IEEE80211_CHAN_MAX; it was defined as 255 but
really was meant to be 256. Adjust usage accordingly and replace bogus usage of this value in checking IEEE channel #'s. NB: this causes an ABI change; ifconfig must be recompiled
Diffstat (limited to 'sys')
-rw-r--r--sys/net80211/_ieee80211.h2
-rw-r--r--sys/net80211/ieee80211.c4
-rw-r--r--sys/net80211/ieee80211_ddb.c2
-rw-r--r--sys/net80211/ieee80211_dfs.h2
-rw-r--r--sys/net80211/ieee80211_input.c8
-rw-r--r--sys/net80211/ieee80211_ioctl.c24
-rw-r--r--sys/net80211/ieee80211_regdomain.c2
-rw-r--r--sys/net80211/ieee80211_scan_sta.c7
-rw-r--r--sys/net80211/ieee80211_var.h2
9 files changed, 20 insertions, 33 deletions
diff --git a/sys/net80211/_ieee80211.h b/sys/net80211/_ieee80211.h
index b735b5c..f5858fe 100644
--- a/sys/net80211/_ieee80211.h
+++ b/sys/net80211/_ieee80211.h
@@ -137,7 +137,7 @@ struct ieee80211_channel {
uint8_t ic_extieee; /* HT40 extension channel number */
};
-#define IEEE80211_CHAN_MAX 255
+#define IEEE80211_CHAN_MAX 256
#define IEEE80211_CHAN_BYTES 32 /* howmany(IEEE80211_CHAN_MAX, NBBY) */
#define IEEE80211_CHAN_ANY 0xffff /* token for ``any channel'' */
#define IEEE80211_CHAN_ANYC \
diff --git a/sys/net80211/ieee80211.c b/sys/net80211/ieee80211.c
index cce1312..e0a9432 100644
--- a/sys/net80211/ieee80211.c
+++ b/sys/net80211/ieee80211.c
@@ -118,7 +118,7 @@ ieee80211_chan_init(struct ieee80211com *ic)
struct ieee80211_channel *c;
int i;
- KASSERT(0 < ic->ic_nchans && ic->ic_nchans < IEEE80211_CHAN_MAX,
+ KASSERT(0 < ic->ic_nchans && ic->ic_nchans <= IEEE80211_CHAN_MAX,
("invalid number of channels specified: %u", ic->ic_nchans));
memset(ic->ic_chan_avail, 0, sizeof(ic->ic_chan_avail));
memset(ic->ic_modecaps, 0, sizeof(ic->ic_modecaps));
@@ -126,8 +126,6 @@ ieee80211_chan_init(struct ieee80211com *ic)
for (i = 0; i < ic->ic_nchans; i++) {
c = &ic->ic_channels[i];
KASSERT(c->ic_flags != 0, ("channel with no flags"));
- KASSERT(c->ic_ieee < IEEE80211_CHAN_MAX,
- ("channel with bogus ieee number %u", c->ic_ieee));
setbit(ic->ic_chan_avail, c->ic_ieee);
/*
* Identify mode capabilities.
diff --git a/sys/net80211/ieee80211_ddb.c b/sys/net80211/ieee80211_ddb.c
index 8334d77..59c6a46 100644
--- a/sys/net80211/ieee80211_ddb.c
+++ b/sys/net80211/ieee80211_ddb.c
@@ -542,7 +542,7 @@ _db_show_com(const struct ieee80211com *ic, int showvaps, int showsta, int showp
*/
db_printf("\tnchans %d", ic->ic_nchans);
#if 0
- struct ieee80211_channel ic_channels[IEEE80211_CHAN_MAX+1];
+ struct ieee80211_channel ic_channels[IEEE80211_CHAN_MAX];
uint8_t ic_chan_avail[IEEE80211_CHAN_BYTES];
uint8_t ic_chan_active[IEEE80211_CHAN_BYTES];
uint8_t ic_chan_scan[IEEE80211_CHAN_BYTES];
diff --git a/sys/net80211/ieee80211_dfs.h b/sys/net80211/ieee80211_dfs.h
index 36d14aa..9076077 100644
--- a/sys/net80211/ieee80211_dfs.h
+++ b/sys/net80211/ieee80211_dfs.h
@@ -32,7 +32,7 @@
*/
struct ieee80211_dfs_state {
- int nol_event[IEEE80211_CHAN_MAX+1];
+ int nol_event[IEEE80211_CHAN_MAX];
struct callout nol_timer; /* NOL list processing */
struct callout cac_timer; /* CAC timer */
struct timeval lastevent; /* time of last radar event */
diff --git a/sys/net80211/ieee80211_input.c b/sys/net80211/ieee80211_input.c
index e72a2a2..528587b 100644
--- a/sys/net80211/ieee80211_input.c
+++ b/sys/net80211/ieee80211_input.c
@@ -673,14 +673,6 @@ ieee80211_parse_beacon(struct ieee80211_node *ni, struct mbuf *m,
}
IEEE80211_VERIFY_ELEMENT(scan->ssid, IEEE80211_NWID_LEN,
scan->status |= IEEE80211_BPARSE_SSID_INVALID);
-#if IEEE80211_CHAN_MAX < 255
- if (scan->chan > IEEE80211_CHAN_MAX) {
- IEEE80211_DISCARD(vap, IEEE80211_MSG_ELEMID,
- wh, NULL, "invalid channel %u", scan->chan);
- vap->iv_stats.is_rx_badchan++;
- scan->status |= IEEE80211_BPARSE_CHAN_INVALID;
- }
-#endif
if (scan->chan != scan->bchan && ic->ic_phytype != IEEE80211_T_FH) {
/*
* Frame was received on a channel different from the
diff --git a/sys/net80211/ieee80211_ioctl.c b/sys/net80211/ieee80211_ioctl.c
index ae39fd6..797ed8f 100644
--- a/sys/net80211/ieee80211_ioctl.c
+++ b/sys/net80211/ieee80211_ioctl.c
@@ -1556,7 +1556,7 @@ ieee80211_ioctl_setchanlist(struct ieee80211vap *vap, struct ieee80211req *ireq)
struct ieee80211com *ic = vap->iv_ic;
struct ieee80211req_chanlist list;
u_char chanlist[IEEE80211_CHAN_BYTES];
- int i, j, nchan, error;
+ int i, nchan, error;
if (ireq->i_len != sizeof(list))
return EINVAL;
@@ -1564,22 +1564,16 @@ ieee80211_ioctl_setchanlist(struct ieee80211vap *vap, struct ieee80211req *ireq)
if (error)
return error;
memset(chanlist, 0, sizeof(chanlist));
- /*
- * Since channel 0 is not available for DS, channel 1
- * is assigned to LSB on WaveLAN.
- */
- if (ic->ic_phytype == IEEE80211_T_DS)
- i = 1;
- else
- i = 0;
nchan = 0;
- for (j = 0; i <= IEEE80211_CHAN_MAX; i++, j++) {
+ for (i = 0; i < ic->ic_nchans; i++) {
+ const struct ieee80211_channel *c = &ic->ic_channels[i];
/*
- * NB: silently discard unavailable channels so users
- * can specify 1-255 to get all available channels.
+ * Calculate the intersection of the user list and the
+ * available channels so users can do things like specify
+ * 1-255 to get all available channels.
*/
- if (isset(list.ic_channels, j) && isset(ic->ic_chan_avail, i)) {
- setbit(chanlist, i);
+ if (isset(list.ic_channels, c->ic_ieee)) {
+ setbit(chanlist, c->ic_ieee);
nchan++;
}
}
@@ -1890,8 +1884,6 @@ ieee80211_ioctl_setchannel(struct ieee80211vap *vap,
if (ireq->i_val == 0 ||
ireq->i_val == (int16_t) IEEE80211_CHAN_ANY) {
c = IEEE80211_CHAN_ANYC;
- } else if ((u_int) ireq->i_val > IEEE80211_CHAN_MAX) {
- return EINVAL;
} else {
struct ieee80211_channel *c2;
diff --git a/sys/net80211/ieee80211_regdomain.c b/sys/net80211/ieee80211_regdomain.c
index 0e41355..724d00b 100644
--- a/sys/net80211/ieee80211_regdomain.c
+++ b/sys/net80211/ieee80211_regdomain.c
@@ -338,7 +338,7 @@ ieee80211_setregdomain(struct ieee80211vap *vap,
reg->rd.isocc[0], reg->rd.isocc[1]);
return EINVAL;
}
- if (reg->chaninfo.ic_nchans >= IEEE80211_CHAN_MAX) {
+ if (reg->chaninfo.ic_nchans > IEEE80211_CHAN_MAX) {
IEEE80211_DPRINTF(vap, IEEE80211_MSG_IOCTL,
"%s: too many channels %u, max %u\n", __func__,
reg->chaninfo.ic_nchans, IEEE80211_CHAN_MAX);
diff --git a/sys/net80211/ieee80211_scan_sta.c b/sys/net80211/ieee80211_scan_sta.c
index e3a4bda..f722d6b 100644
--- a/sys/net80211/ieee80211_scan_sta.c
+++ b/sys/net80211/ieee80211_scan_sta.c
@@ -87,6 +87,9 @@ struct sta_entry {
#define STA_HASH(addr) \
(((const uint8_t *)(addr))[IEEE80211_ADDR_LEN - 1] % STA_HASHSIZE)
+#define MAX_IEEE_CHAN 256 /* max acceptable IEEE chan # */
+CTASSERT(MAX_IEEE_CHAN >= 256);
+
struct sta_table {
struct mtx st_lock; /* on scan table */
TAILQ_HEAD(, sta_entry) st_entry; /* all entries */
@@ -96,7 +99,7 @@ struct sta_table {
u_int st_scangen; /* scan generation # */
int st_newscan;
/* ap-related state */
- int st_maxrssi[IEEE80211_CHAN_MAX];
+ int st_maxrssi[MAX_IEEE_CHAN];
};
static void sta_flush_table(struct sta_table *);
@@ -343,6 +346,7 @@ found:
se->se_seen = 1;
se->se_notseen = 0;
+ KASSERT(sizeof(sp->bchan) == 1, ("bchan size"));
if (rssi > st->st_maxrssi[sp->bchan])
st->st_maxrssi[sp->bchan] = rssi;
@@ -1604,6 +1608,7 @@ ap_pick_channel(struct ieee80211_scan_state *ss, int flags)
/* check channel attributes for band compatibility */
if (flags != 0 && (chan->ic_flags & flags) != flags)
continue;
+ KASSERT(sizeof(chan->ic_ieee) == 1, ("ic_chan size"));
/* XXX channel have interference */
if (st->st_maxrssi[chan->ic_ieee] == 0) {
/* XXX use other considerations */
diff --git a/sys/net80211/ieee80211_var.h b/sys/net80211/ieee80211_var.h
index 3e90201..ccd95d0 100644
--- a/sys/net80211/ieee80211_var.h
+++ b/sys/net80211/ieee80211_var.h
@@ -156,7 +156,7 @@ struct ieee80211com {
* (e.g. for dynamic turbo)
*/
int ic_nchans; /* # entries in ic_channels */
- struct ieee80211_channel ic_channels[IEEE80211_CHAN_MAX+1];
+ struct ieee80211_channel ic_channels[IEEE80211_CHAN_MAX];
uint8_t ic_chan_avail[IEEE80211_CHAN_BYTES];
uint8_t ic_chan_active[IEEE80211_CHAN_BYTES];
uint8_t ic_chan_scan[IEEE80211_CHAN_BYTES];
OpenPOWER on IntegriCloud