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-all mailing list