Date: Wed, 6 May 2009 23:49:55 +0000 (UTC) From: Sam Leffler <sam@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r191865 - head/sys/dev/ath Message-ID: <200905062349.n46NntRr033664@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905062349.n46NntRr033664>