svn commit: r191865 - head/sys/dev/ath
Sam Leffler
sam at FreeBSD.org
Wed May 6 23:49:56 UTC 2009
Author: sam
Date: Wed May 6 23:49:55 2009
New Revision: 191865
URL: http://svn.freebsd.org/changeset/base/191865
Log:
o cleanup checks for which vap combinations are permitted and what to
use for ic_opmode
o fixes the case where creating ahdemo+wds vaps caused ic_opmode to be
set to hostap
Modified:
head/sys/dev/ath/if_ath.c
Modified: head/sys/dev/ath/if_ath.c
==============================================================================
--- head/sys/dev/ath/if_ath.c Wed May 6 23:09:26 2009 (r191864)
+++ head/sys/dev/ath/if_ath.c Wed May 6 23:49:55 2009 (r191865)
@@ -863,23 +863,26 @@ ath_vap_create(struct ieee80211com *ic,
IEEE80211_ADDR_COPY(mac, mac0);
ATH_LOCK(sc);
+ ic_opmode = opmode; /* default to opmode of new vap */
switch (opmode) {
case IEEE80211_M_STA:
- if (sc->sc_nstavaps != 0) { /* XXX only 1 sta for now */
+ if (sc->sc_nstavaps != 0) { /* XXX only 1 for now */
device_printf(sc->sc_dev, "only 1 sta vap supported\n");
goto bad;
}
if (sc->sc_nvaps) {
/*
- * When there are multiple vaps we must fall
- * back to s/w beacon miss handling.
+ * With multiple vaps we must fall back
+ * to s/w beacon miss handling.
*/
flags |= IEEE80211_CLONE_NOBEACONS;
}
- if (flags & IEEE80211_CLONE_NOBEACONS)
+ if (flags & IEEE80211_CLONE_NOBEACONS) {
+ /*
+ * Station mode w/o beacons are implemented w/ AP mode.
+ */
ic_opmode = IEEE80211_M_HOSTAP;
- else
- ic_opmode = opmode;
+ }
break;
case IEEE80211_M_IBSS:
if (sc->sc_nvaps != 0) { /* XXX only 1 for now */
@@ -887,12 +890,16 @@ ath_vap_create(struct ieee80211com *ic,
"only 1 ibss vap supported\n");
goto bad;
}
- ic_opmode = opmode;
needbeacon = 1;
break;
case IEEE80211_M_AHDEMO:
#ifdef IEEE80211_SUPPORT_TDMA
if (flags & IEEE80211_CLONE_TDMA) {
+ if (sc->sc_nvaps != 0) {
+ device_printf(sc->sc_dev,
+ "only 1 tdma vap supported\n");
+ goto bad;
+ }
needbeacon = 1;
flags |= IEEE80211_CLONE_NOBEACONS;
}
@@ -900,29 +907,34 @@ ath_vap_create(struct ieee80211com *ic,
#endif
case IEEE80211_M_MONITOR:
if (sc->sc_nvaps != 0 && ic->ic_opmode != opmode) {
+ /*
+ * Adopt existing mode. Adding a monitor or ahdemo
+ * vap to an existing configuration is of dubious
+ * value but should be ok.
+ */
/* XXX not right for monitor mode */
ic_opmode = ic->ic_opmode;
- } else
- ic_opmode = opmode;
+ }
break;
case IEEE80211_M_HOSTAP:
needbeacon = 1;
- /* fall thru... */
+ break;
case IEEE80211_M_WDS:
- if (sc->sc_nvaps && ic->ic_opmode == IEEE80211_M_STA) {
+ if (sc->sc_nvaps != 0 && ic->ic_opmode == IEEE80211_M_STA) {
device_printf(sc->sc_dev,
"wds not supported in sta mode\n");
goto bad;
}
- if (opmode == IEEE80211_M_WDS) {
- /*
- * Silently remove any request for a unique
- * bssid; WDS vap's always share the local
- * mac address.
- */
- flags &= ~IEEE80211_CLONE_BSSID;
- }
- ic_opmode = IEEE80211_M_HOSTAP;
+ /*
+ * Silently remove any request for a unique
+ * bssid; WDS vap's always share the local
+ * mac address.
+ */
+ flags &= ~IEEE80211_CLONE_BSSID;
+ if (sc->sc_nvaps == 0)
+ ic_opmode = IEEE80211_M_HOSTAP;
+ else
+ ic_opmode = ic->ic_opmode;
break;
default:
device_printf(sc->sc_dev, "unknown opmode %d\n", opmode);
More information about the svn-src-head
mailing list