Date: Tue, 23 Nov 2004 03:48:45 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 65684 for review Message-ID: <200411230348.iAN3mjZh002193@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=65684 Change 65684 by sam@sam_ebb on 2004/11/23 03:48:38 pack allocated vap identifiers Affected files ... .. //depot/projects/wifi/sys/net80211/ieee80211.c#10 edit Differences ... ==== //depot/projects/wifi/sys/net80211/ieee80211.c#10 (text+ko) ==== @@ -65,10 +65,44 @@ SLIST_HEAD(ieee80211_list, ieee80211com); static struct ieee80211_list ieee80211_list = SLIST_HEAD_INITIALIZER(ieee80211_list); -static int ieee80211_vap = 0; /* next avail vap number */ +static u_int8_t ieee80211_vapmap[32]; /* enough for 256 */ static struct mtx ieee80211_vap_mtx; MTX_SYSINIT(ieee80211, &ieee80211_vap_mtx, "net80211 instances", MTX_DEF); +static void +ieee80211_add_vap(struct ieee80211com *ic) +{ +#define N(a) (sizeof(a)/sizeof(a[0])) + int i; + u_int8_t b; + + mtx_lock(&ieee80211_vap_mtx); + ic->ic_vap = 0; + for (i = 0; i < N(ieee80211_vapmap) && ieee80211_vapmap[i] == 0xff; i++) + ic->ic_vap += NBBY; + if (i == N(ieee80211_vapmap)) + panic("vap table full"); + for (b = ieee80211_vapmap[i]; b & 1; b >>= 1) + ic->ic_vap++; + setbit(ieee80211_vapmap, ic->ic_vap); + SLIST_INSERT_HEAD(&ieee80211_list, ic, ic_next); + mtx_unlock(&ieee80211_vap_mtx); +#undef N +} + +static void +ieee80211_remove_vap(struct ieee80211com *ic) +{ + mtx_lock(&ieee80211_vap_mtx); + SLIST_REMOVE(&ieee80211_list, ic, ieee80211com, ic_next); + KASSERT(ic->ic_vap < sizeof(ieee80211_vapmap)*NBBY, + ("invalid vap id %d", ic->ic_vap)); + KASSERT(isset(ieee80211_vapmap, ic->ic_vap), + ("vap id %d not allocated", ic->ic_vap)); + clrbit(ieee80211_vapmap, ic->ic_vap); + mtx_unlock(&ieee80211_vap_mtx); +} + void ieee80211_ifattach(struct ieee80211com *ic) { @@ -135,10 +169,7 @@ ieee80211_node_attach(ic); ieee80211_proto_attach(ic); - mtx_lock(&ieee80211_vap_mtx); - ic->ic_vap = ieee80211_vap++; /* XXX use bitmap */ - SLIST_INSERT_HEAD(&ieee80211_list, ic, ic_next); - mtx_unlock(&ieee80211_vap_mtx); + ieee80211_add_vap(ic); ieee80211_sysctl_attach(ic); /* NB: requires ic_vap */ } @@ -148,9 +179,7 @@ { struct ifnet *ifp = ic->ic_ifp; - mtx_lock(&ieee80211_vap_mtx); - SLIST_REMOVE(&ieee80211_list, ic, ieee80211com, ic_next); - mtx_unlock(&ieee80211_vap_mtx); + ieee80211_remove_vap(ic); ieee80211_sysctl_detach(ic); ieee80211_proto_detach(ic);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200411230348.iAN3mjZh002193>