Cleanup of ieee80211_node from madwifi:

* Don't use ifp pointers; use ieee80211com.
* Implement the locking macros that are used under FreeBSD and Linux.
This commit is contained in:
mycroft 2004-07-23 10:15:13 +00:00
parent e08729e055
commit f526e7326b
9 changed files with 96 additions and 106 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: ath.c,v 1.29 2004/07/23 08:34:11 mycroft Exp $ */ /* $NetBSD: ath.c,v 1.30 2004/07/23 10:15:13 mycroft Exp $ */
/*- /*-
* Copyright (c) 2002-2004 Sam Leffler, Errno Consulting * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
@ -41,7 +41,7 @@
__FBSDID("$FreeBSD: src/sys/dev/ath/if_ath.c,v 1.54 2004/04/05 04:42:42 sam Exp $"); __FBSDID("$FreeBSD: src/sys/dev/ath/if_ath.c,v 1.54 2004/04/05 04:42:42 sam Exp $");
#endif #endif
#ifdef __NetBSD__ #ifdef __NetBSD__
__KERNEL_RCSID(0, "$NetBSD: ath.c,v 1.29 2004/07/23 08:34:11 mycroft Exp $"); __KERNEL_RCSID(0, "$NetBSD: ath.c,v 1.30 2004/07/23 10:15:13 mycroft Exp $");
#endif #endif
/* /*
@ -3068,14 +3068,13 @@ ath_next_scan(void *arg)
{ {
struct ath_softc *sc = arg; struct ath_softc *sc = arg;
struct ieee80211com *ic = &sc->sc_ic; struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = &ic->ic_if;
int s; int s;
/* don't call ath_start w/o network interrupts blocked */ /* don't call ath_start w/o network interrupts blocked */
s = splnet(); s = splnet();
if (ic->ic_state == IEEE80211_S_SCAN) if (ic->ic_state == IEEE80211_S_SCAN)
ieee80211_next_scan(ifp); ieee80211_next_scan(ic);
splx(s); splx(s);
} }

View File

@ -1,4 +1,4 @@
/* $NetBSD: atw.c,v 1.72 2004/07/23 08:36:01 mycroft Exp $ */ /* $NetBSD: atw.c,v 1.73 2004/07/23 10:15:13 mycroft Exp $ */
/*- /*-
* Copyright (c) 1998, 1999, 2000, 2002, 2003, 2004 The NetBSD Foundation, Inc. * Copyright (c) 1998, 1999, 2000, 2002, 2003, 2004 The NetBSD Foundation, Inc.
@ -41,7 +41,7 @@
*/ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: atw.c,v 1.72 2004/07/23 08:36:01 mycroft Exp $"); __KERNEL_RCSID(0, "$NetBSD: atw.c,v 1.73 2004/07/23 10:15:13 mycroft Exp $");
#include "bpfilter.h" #include "bpfilter.h"
@ -2542,13 +2542,12 @@ atw_next_scan(void *arg)
{ {
struct atw_softc *sc = arg; struct atw_softc *sc = arg;
struct ieee80211com *ic = &sc->sc_ic; struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = &ic->ic_if;
int s; int s;
/* don't call atw_start w/o network interrupts blocked */ /* don't call atw_start w/o network interrupts blocked */
s = splnet(); s = splnet();
if (ic->ic_state == IEEE80211_S_SCAN) if (ic->ic_state == IEEE80211_S_SCAN)
ieee80211_next_scan(ifp); ieee80211_next_scan(ic);
splx(s); splx(s);
} }

View File

@ -1,4 +1,4 @@
/* $NetBSD: awi.c,v 1.63 2004/07/23 08:34:11 mycroft Exp $ */ /* $NetBSD: awi.c,v 1.64 2004/07/23 10:15:13 mycroft Exp $ */
/*- /*-
* Copyright (c) 1999,2000,2001 The NetBSD Foundation, Inc. * Copyright (c) 1999,2000,2001 The NetBSD Foundation, Inc.
@ -86,7 +86,7 @@
#include <sys/cdefs.h> #include <sys/cdefs.h>
#ifdef __NetBSD__ #ifdef __NetBSD__
__KERNEL_RCSID(0, "$NetBSD: awi.c,v 1.63 2004/07/23 08:34:11 mycroft Exp $"); __KERNEL_RCSID(0, "$NetBSD: awi.c,v 1.64 2004/07/23 10:15:13 mycroft Exp $");
#endif #endif
#ifdef __FreeBSD__ #ifdef __FreeBSD__
__FBSDID("$FreeBSD: src/sys/dev/awi/awi.c,v 1.30 2004/01/15 13:30:06 onoe Exp $"); __FBSDID("$FreeBSD: src/sys/dev/awi/awi.c,v 1.30 2004/01/15 13:30:06 onoe Exp $");
@ -524,7 +524,7 @@ awi_intr(void *arg)
if (status & AWI_INT_SCAN_CMPLT) { if (status & AWI_INT_SCAN_CMPLT) {
if (sc->sc_ic.ic_state == IEEE80211_S_SCAN && if (sc->sc_ic.ic_state == IEEE80211_S_SCAN &&
sc->sc_substate == AWI_ST_NONE) sc->sc_substate == AWI_ST_NONE)
ieee80211_next_scan(&sc->sc_ic.ic_if); ieee80211_next_scan(&sc->sc_ic);
} }
} }
sc->sc_cansleep = ocansleep; sc->sc_cansleep = ocansleep;
@ -1927,7 +1927,7 @@ awi_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
case IEEE80211_S_AUTH: case IEEE80211_S_AUTH:
case IEEE80211_S_ASSOC: case IEEE80211_S_ASSOC:
case IEEE80211_S_INIT: case IEEE80211_S_INIT:
ieee80211_begin_scan(ifp); ieee80211_begin_scan(ic);
/* FALLTHRU */ /* FALLTHRU */
case IEEE80211_S_SCAN: case IEEE80211_S_SCAN:
/* scan next */ /* scan next */

View File

@ -1,4 +1,4 @@
/* $NetBSD: ieee80211.c,v 1.27 2004/07/23 09:22:15 mycroft Exp $ */ /* $NetBSD: ieee80211.c,v 1.28 2004/07/23 10:15:13 mycroft Exp $ */
/*- /*-
* Copyright (c) 2001 Atsushi Onoe * Copyright (c) 2001 Atsushi Onoe
* Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting * Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting
@ -35,7 +35,7 @@
#ifdef __FreeBSD__ #ifdef __FreeBSD__
__FBSDID("$FreeBSD: src/sys/net80211/ieee80211.c,v 1.11 2004/04/02 20:19:20 sam Exp $"); __FBSDID("$FreeBSD: src/sys/net80211/ieee80211.c,v 1.11 2004/04/02 20:19:20 sam Exp $");
#else #else
__KERNEL_RCSID(0, "$NetBSD: ieee80211.c,v 1.27 2004/07/23 09:22:15 mycroft Exp $"); __KERNEL_RCSID(0, "$NetBSD: ieee80211.c,v 1.28 2004/07/23 10:15:13 mycroft Exp $");
#endif #endif
/* /*
@ -195,7 +195,7 @@ ieee80211_ifattach(struct ifnet *ifp)
ic->ic_bmisstimeout = 7*ic->ic_lintval; /* default 7 beacons */ ic->ic_bmisstimeout = 7*ic->ic_lintval; /* default 7 beacons */
LIST_INSERT_HEAD(&ieee80211com_head, ic, ic_list); LIST_INSERT_HEAD(&ieee80211com_head, ic, ic_list);
ieee80211_node_attach(ifp); ieee80211_node_attach(ic);
ieee80211_proto_attach(ifp); ieee80211_proto_attach(ifp);
} }
@ -206,7 +206,7 @@ ieee80211_ifdetach(struct ifnet *ifp)
ieee80211_proto_detach(ifp); ieee80211_proto_detach(ifp);
ieee80211_crypto_detach(ifp); ieee80211_crypto_detach(ifp);
ieee80211_node_detach(ifp); ieee80211_node_detach(ic);
LIST_REMOVE(ic, ic_list); LIST_REMOVE(ic, ic_list);
#ifdef __FreeBSD__ #ifdef __FreeBSD__
ifmedia_removeall(&ic->ic_media); ifmedia_removeall(&ic->ic_media);
@ -313,7 +313,7 @@ ieee80211_media_init(struct ifnet *ifp,
* Do late attach work that must wait for any subclass * Do late attach work that must wait for any subclass
* (i.e. driver) work such as overriding methods. * (i.e. driver) work such as overriding methods.
*/ */
ieee80211_node_lateattach(ifp); ieee80211_node_lateattach(ic);
/* /*
* Fill in media characteristics. * Fill in media characteristics.

View File

@ -1,4 +1,4 @@
/* $NetBSD: ieee80211_input.c,v 1.29 2004/07/23 09:22:15 mycroft Exp $ */ /* $NetBSD: ieee80211_input.c,v 1.30 2004/07/23 10:15:13 mycroft Exp $ */
/*- /*-
* Copyright (c) 2001 Atsushi Onoe * Copyright (c) 2001 Atsushi Onoe
* Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting * Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting
@ -35,7 +35,7 @@
#ifdef __FreeBSD__ #ifdef __FreeBSD__
__FBSDID("$FreeBSD: src/sys/net80211/ieee80211_input.c,v 1.20 2004/04/02 23:35:24 sam Exp $"); __FBSDID("$FreeBSD: src/sys/net80211/ieee80211_input.c,v 1.20 2004/04/02 23:35:24 sam Exp $");
#else #else
__KERNEL_RCSID(0, "$NetBSD: ieee80211_input.c,v 1.29 2004/07/23 09:22:15 mycroft Exp $"); __KERNEL_RCSID(0, "$NetBSD: ieee80211_input.c,v 1.30 2004/07/23 10:15:13 mycroft Exp $");
#endif #endif
#include "opt_inet.h" #include "opt_inet.h"
@ -1094,7 +1094,7 @@ ieee80211_recv_mgmt(struct ieee80211com *ic, struct mbuf *m0,
* This may result in a bloat of the scanned AP list but * This may result in a bloat of the scanned AP list but
* it shouldn't be too much. * it shouldn't be too much.
*/ */
ni = ieee80211_lookup_node(ic, wh->i_addr2, ni = ieee80211_find_node_with_channel(ic, wh->i_addr2,
&ic->ic_channels[chan]); &ic->ic_channels[chan]);
#ifdef IEEE80211_DEBUG #ifdef IEEE80211_DEBUG
if (ieee80211_debug && if (ieee80211_debug &&

View File

@ -1,4 +1,4 @@
/* $NetBSD: ieee80211_node.c,v 1.22 2004/07/23 09:22:15 mycroft Exp $ */ /* $NetBSD: ieee80211_node.c,v 1.23 2004/07/23 10:15:13 mycroft Exp $ */
/*- /*-
* Copyright (c) 2001 Atsushi Onoe * Copyright (c) 2001 Atsushi Onoe
* Copyright (c) 2002-2004 Sam Leffler, Errno Consulting * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
@ -35,7 +35,7 @@
#ifdef __FreeBSD__ #ifdef __FreeBSD__
__FBSDID("$FreeBSD: src/sys/net80211/ieee80211_node.c,v 1.22 2004/04/05 04:15:55 sam Exp $"); __FBSDID("$FreeBSD: src/sys/net80211/ieee80211_node.c,v 1.22 2004/04/05 04:15:55 sam Exp $");
#else #else
__KERNEL_RCSID(0, "$NetBSD: ieee80211_node.c,v 1.22 2004/07/23 09:22:15 mycroft Exp $"); __KERNEL_RCSID(0, "$NetBSD: ieee80211_node.c,v 1.23 2004/07/23 10:15:13 mycroft Exp $");
#endif #endif
#include "opt_inet.h" #include "opt_inet.h"
@ -99,14 +99,11 @@ static void _ieee80211_free_node(struct ieee80211com *,
MALLOC_DEFINE(M_80211_NODE, "80211node", "802.11 node state"); MALLOC_DEFINE(M_80211_NODE, "80211node", "802.11 node state");
void void
ieee80211_node_attach(struct ifnet *ifp) ieee80211_node_attach(struct ieee80211com *ic)
{ {
struct ieee80211com *ic = (void *)ifp;
#ifdef __FreeBSD__
/* XXX need unit */ /* XXX need unit */
IEEE80211_NODE_LOCK_INIT(ic, ifp->if_xname); IEEE80211_NODE_LOCK_INIT(ic, ic->ic_ifp->if_xname);
#endif
TAILQ_INIT(&ic->ic_node); TAILQ_INIT(&ic->ic_node);
ic->ic_node_alloc = ieee80211_node_alloc; ic->ic_node_alloc = ieee80211_node_alloc;
ic->ic_node_free = ieee80211_node_free; ic->ic_node_free = ieee80211_node_free;
@ -129,9 +126,8 @@ ieee80211_node_attach(struct ifnet *ifp)
} }
void void
ieee80211_node_lateattach(struct ifnet *ifp) ieee80211_node_lateattach(struct ieee80211com *ic)
{ {
struct ieee80211com *ic = (void *)ifp;
struct ieee80211_node *ni; struct ieee80211_node *ni;
ni = (*ic->ic_node_alloc)(ic); ni = (*ic->ic_node_alloc)(ic);
@ -142,16 +138,15 @@ ieee80211_node_lateattach(struct ifnet *ifp)
} }
void void
ieee80211_node_detach(struct ifnet *ifp) ieee80211_node_detach(struct ieee80211com *ic)
{ {
struct ieee80211com *ic = (void *)ifp;
if (ic->ic_bss != NULL) if (ic->ic_bss != NULL) {
(*ic->ic_node_free)(ic, ic->ic_bss); (*ic->ic_node_free)(ic, ic->ic_bss);
ic->ic_bss = NULL;
}
ieee80211_free_allnodes(ic); ieee80211_free_allnodes(ic);
#ifdef __FreeBSD__
IEEE80211_NODE_LOCK_DESTROY(ic); IEEE80211_NODE_LOCK_DESTROY(ic);
#endif
if (ic->ic_aid_bitmap != NULL) if (ic->ic_aid_bitmap != NULL)
FREE(ic->ic_aid_bitmap, M_DEVBUF); FREE(ic->ic_aid_bitmap, M_DEVBUF);
} }
@ -165,9 +160,8 @@ ieee80211_node_detach(struct ifnet *ifp)
* of available channels and the current PHY mode. * of available channels and the current PHY mode.
*/ */
static void static void
ieee80211_reset_scan(struct ifnet *ifp) ieee80211_reset_scan(struct ieee80211com *ic)
{ {
struct ieee80211com *ic = (void *)ifp;
memcpy(ic->ic_chan_scan, ic->ic_chan_active, memcpy(ic->ic_chan_scan, ic->ic_chan_active,
sizeof(ic->ic_chan_active)); sizeof(ic->ic_chan_active));
@ -180,9 +174,8 @@ ieee80211_reset_scan(struct ifnet *ifp)
* Begin an active scan. * Begin an active scan.
*/ */
void void
ieee80211_begin_scan(struct ifnet *ifp) ieee80211_begin_scan(struct ieee80211com *ic)
{ {
struct ieee80211com *ic = (void *)ifp;
/* /*
* In all but hostap mode scanning starts off in * In all but hostap mode scanning starts off in
@ -202,20 +195,19 @@ ieee80211_begin_scan(struct ifnet *ifp)
* potentially flush state of stations associated * potentially flush state of stations associated
* with us. * with us.
*/ */
ieee80211_reset_scan(ifp); ieee80211_reset_scan(ic);
ieee80211_free_allnodes(ic); ieee80211_free_allnodes(ic);
/* Scan the next channel. */ /* Scan the next channel. */
ieee80211_next_scan(ifp); ieee80211_next_scan(ic);
} }
/* /*
* Switch to the next channel marked for scanning. * Switch to the next channel marked for scanning.
*/ */
void void
ieee80211_next_scan(struct ifnet *ifp) ieee80211_next_scan(struct ieee80211com *ic)
{ {
struct ieee80211com *ic = (void *)ifp;
struct ieee80211_channel *chan; struct ieee80211_channel *chan;
chan = ic->ic_bss->ni_chan; chan = ic->ic_bss->ni_chan;
@ -232,7 +224,7 @@ ieee80211_next_scan(struct ifnet *ifp)
break; break;
} }
if (chan == ic->ic_bss->ni_chan) { if (chan == ic->ic_bss->ni_chan) {
ieee80211_end_scan(ifp); ieee80211_end_scan(ic);
return; return;
} }
} }
@ -347,12 +339,14 @@ ieee80211_match_bss(struct ieee80211com *ic, struct ieee80211_node *ni)
* Complete a scan of potential channels. * Complete a scan of potential channels.
*/ */
void void
ieee80211_end_scan(struct ifnet *ifp) ieee80211_end_scan(struct ieee80211com *ic)
{ {
struct ieee80211com *ic = (void *)ifp;
struct ieee80211_node *ni, *nextbs, *selbs; struct ieee80211_node *ni, *nextbs, *selbs;
int i, fail; int i, fail;
IEEE80211_DPRINTF(ic, IEEE80211_MSG_SCAN, ("end %s scan\n",
(ic->ic_flags & IEEE80211_F_ASCAN) ? "active" : "passive"));
ic->ic_flags &= ~IEEE80211_F_ASCAN; ic->ic_flags &= ~IEEE80211_F_ASCAN;
ni = TAILQ_FIRST(&ic->ic_node); ni = TAILQ_FIRST(&ic->ic_node);
@ -397,8 +391,8 @@ ieee80211_end_scan(struct ifnet *ifp)
/* /*
* Reset the list of channels to scan and start again. * Reset the list of channels to scan and start again.
*/ */
ieee80211_reset_scan(ifp); ieee80211_reset_scan(ic);
ieee80211_next_scan(ifp); ieee80211_next_scan(ic);
return; return;
} }
selbs = NULL; selbs = NULL;
@ -520,12 +514,14 @@ ieee80211_setup_node(struct ieee80211com *ic,
struct ieee80211_node *ni, u_int8_t *macaddr) struct ieee80211_node *ni, u_int8_t *macaddr)
{ {
int hash; int hash;
ieee80211_node_critsec_decl(s);
IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE,
("%s %s\n", __func__, ether_sprintf(macaddr)));
IEEE80211_ADDR_COPY(ni->ni_macaddr, macaddr); IEEE80211_ADDR_COPY(ni->ni_macaddr, macaddr);
hash = IEEE80211_NODE_HASH(macaddr); hash = IEEE80211_NODE_HASH(macaddr);
ni->ni_refcnt = 1; /* mark referenced */ ni->ni_refcnt = 1; /* mark referenced */
ieee80211_node_critsec_begin(ic, s);
IEEE80211_NODE_LOCK_BH(ic);
TAILQ_INSERT_TAIL(&ic->ic_node, ni, ni_list); TAILQ_INSERT_TAIL(&ic->ic_node, ni, ni_list);
LIST_INSERT_HEAD(&ic->ic_hash[hash], ni, ni_hash); LIST_INSERT_HEAD(&ic->ic_hash[hash], ni, ni_hash);
/* /*
@ -539,7 +535,7 @@ ieee80211_setup_node(struct ieee80211com *ic,
*/ */
if (ic->ic_opmode != IEEE80211_M_STA) if (ic->ic_opmode != IEEE80211_M_STA)
ic->ic_inact_timer = IEEE80211_INACT_WAIT; ic->ic_inact_timer = IEEE80211_INACT_WAIT;
ieee80211_node_critsec_end(ic, s); IEEE80211_NODE_UNLOCK_BH(ic);
} }
struct ieee80211_node * struct ieee80211_node *
@ -575,9 +571,7 @@ _ieee80211_find_node(struct ieee80211com *ic, u_int8_t *macaddr)
struct ieee80211_node *ni; struct ieee80211_node *ni;
int hash; int hash;
#ifdef __FreeBSD__
IEEE80211_NODE_LOCK_ASSERT(ic); IEEE80211_NODE_LOCK_ASSERT(ic);
#endif /* __FreeBSD__ */
hash = IEEE80211_NODE_HASH(macaddr); hash = IEEE80211_NODE_HASH(macaddr);
LIST_FOREACH(ni, &ic->ic_hash[hash], ni_hash) { LIST_FOREACH(ni, &ic->ic_hash[hash], ni_hash) {
@ -593,11 +587,10 @@ struct ieee80211_node *
ieee80211_find_node(struct ieee80211com *ic, u_int8_t *macaddr) ieee80211_find_node(struct ieee80211com *ic, u_int8_t *macaddr)
{ {
struct ieee80211_node *ni; struct ieee80211_node *ni;
ieee80211_node_critsec_decl(s);
ieee80211_node_critsec_begin(ic, s); IEEE80211_NODE_LOCK(ic);
ni = _ieee80211_find_node(ic, macaddr); ni = _ieee80211_find_node(ic, macaddr);
ieee80211_node_critsec_end(ic, s); IEEE80211_NODE_UNLOCK(ic);
return ni; return ni;
} }
@ -609,7 +602,6 @@ struct ieee80211_node *
ieee80211_find_txnode(struct ieee80211com *ic, u_int8_t *macaddr) ieee80211_find_txnode(struct ieee80211com *ic, u_int8_t *macaddr)
{ {
struct ieee80211_node *ni; struct ieee80211_node *ni;
ieee80211_node_critsec_decl(s);
/* /*
* The destination address should be in the node table * The destination address should be in the node table
@ -620,9 +612,9 @@ ieee80211_find_txnode(struct ieee80211com *ic, u_int8_t *macaddr)
return ic->ic_bss; return ic->ic_bss;
/* XXX can't hold lock across dup_bss 'cuz of recursive locking */ /* XXX can't hold lock across dup_bss 'cuz of recursive locking */
ieee80211_node_critsec_begin(ic, s); IEEE80211_NODE_LOCK(ic);
ni = _ieee80211_find_node(ic, macaddr); ni = _ieee80211_find_node(ic, macaddr);
ieee80211_node_critsec_end(ic, s); IEEE80211_NODE_UNLOCK(ic);
if (ni == NULL && if (ni == NULL &&
(ic->ic_opmode == IEEE80211_M_IBSS || (ic->ic_opmode == IEEE80211_M_IBSS ||
ic->ic_opmode == IEEE80211_M_AHDEMO)) { ic->ic_opmode == IEEE80211_M_AHDEMO)) {
@ -727,14 +719,13 @@ ieee80211_find_rxnode(struct ieee80211com *ic, struct ieee80211_frame *wh)
struct ieee80211_node *ni; struct ieee80211_node *ni;
const static u_int8_t zero[IEEE80211_ADDR_LEN]; const static u_int8_t zero[IEEE80211_ADDR_LEN];
u_int8_t *bssid; u_int8_t *bssid;
ieee80211_node_critsec_decl(s);
if (!ieee80211_needs_rxnode(ic, wh, &bssid)) if (!ieee80211_needs_rxnode(ic, wh, &bssid))
return ieee80211_ref_node(ic->ic_bss); return ieee80211_ref_node(ic->ic_bss);
ieee80211_node_critsec_begin(ic, s); IEEE80211_NODE_LOCK(ic);
ni = _ieee80211_find_node(ic, wh->i_addr2); ni = _ieee80211_find_node(ic, wh->i_addr2);
ieee80211_node_critsec_end(ic, s); IEEE80211_NODE_UNLOCK(ic);
if (ni != NULL) if (ni != NULL)
return ni; return ni;
@ -764,15 +755,14 @@ ieee80211_find_rxnode(struct ieee80211com *ic, struct ieee80211_frame *wh)
* Like find but search based on the channel too. * Like find but search based on the channel too.
*/ */
struct ieee80211_node * struct ieee80211_node *
ieee80211_lookup_node(struct ieee80211com *ic, ieee80211_find_node_with_channel(struct ieee80211com *ic, u_int8_t *macaddr,
u_int8_t *macaddr, struct ieee80211_channel *chan) struct ieee80211_channel *chan)
{ {
struct ieee80211_node *ni; struct ieee80211_node *ni;
int hash; int hash;
ieee80211_node_critsec_decl(s);
hash = IEEE80211_NODE_HASH(macaddr); hash = IEEE80211_NODE_HASH(macaddr);
ieee80211_node_critsec_begin(ic, s); IEEE80211_NODE_LOCK(ic);
LIST_FOREACH(ni, &ic->ic_hash[hash], ni_hash) { LIST_FOREACH(ni, &ic->ic_hash[hash], ni_hash) {
if (IEEE80211_ADDR_EQ(ni->ni_macaddr, macaddr) && if (IEEE80211_ADDR_EQ(ni->ni_macaddr, macaddr) &&
ni->ni_chan == chan) { ni->ni_chan == chan) {
@ -780,7 +770,7 @@ ieee80211_lookup_node(struct ieee80211com *ic,
break; break;
} }
} }
ieee80211_node_critsec_end(ic, s); IEEE80211_NODE_UNLOCK(ic);
return ni; return ni;
} }
@ -807,14 +797,15 @@ _ieee80211_free_node(struct ieee80211com *ic, struct ieee80211_node *ni)
void void
ieee80211_free_node(struct ieee80211com *ic, struct ieee80211_node *ni) ieee80211_free_node(struct ieee80211com *ic, struct ieee80211_node *ni)
{ {
ieee80211_node_critsec_decl(s);
IASSERT(ni != ic->ic_bss, ("freeing ic_bss")); IASSERT(ni != ic->ic_bss, ("freeing ic_bss"));
IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE,
("%s %s refcnt %d\n", __func__,
ether_sprintf(ni->ni_macaddr), ieee80211_node_refcnt(ni)));
if (ieee80211_node_decref(ni) == 0) { if (ieee80211_node_decref(ni) == 0) {
ieee80211_node_critsec_begin(ic, s); IEEE80211_NODE_LOCK_BH(ic);
_ieee80211_free_node(ic, ni); _ieee80211_free_node(ic, ni);
ieee80211_node_critsec_end(ic, s); IEEE80211_NODE_UNLOCK_BH(ic);
} }
} }
@ -822,13 +813,12 @@ void
ieee80211_free_allnodes(struct ieee80211com *ic) ieee80211_free_allnodes(struct ieee80211com *ic)
{ {
struct ieee80211_node *ni; struct ieee80211_node *ni;
ieee80211_node_critsec_decl(s);
IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE, ("free all nodes\n")); IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE, ("free all nodes\n"));
ieee80211_node_critsec_begin(ic, s); IEEE80211_NODE_LOCK_BH(ic);
while ((ni = TAILQ_FIRST(&ic->ic_node)) != NULL) while ((ni = TAILQ_FIRST(&ic->ic_node)) != NULL)
_ieee80211_free_node(ic, ni); _ieee80211_free_node(ic, ni);
ieee80211_node_critsec_end(ic, s); IEEE80211_NODE_UNLOCK_BH(ic);
if (ic->ic_bss != NULL) if (ic->ic_bss != NULL)
node_cleanup(ic, ic->ic_bss); /* for station mode */ node_cleanup(ic, ic->ic_bss); /* for station mode */
@ -847,11 +837,10 @@ void
ieee80211_timeout_nodes(struct ieee80211com *ic) ieee80211_timeout_nodes(struct ieee80211com *ic)
{ {
struct ieee80211_node *ni; struct ieee80211_node *ni;
ieee80211_node_critsec_decl(s);
u_int gen = ic->ic_scangen++; /* NB: ok 'cuz single-threaded*/ u_int gen = ic->ic_scangen++; /* NB: ok 'cuz single-threaded*/
restart: restart:
ieee80211_node_critsec_begin(ic, s); IEEE80211_NODE_LOCK(ic);
TAILQ_FOREACH(ni, &ic->ic_node, ni_list) { TAILQ_FOREACH(ni, &ic->ic_node, ni_list) {
if (ni->ni_scangen == gen) /* previously handled */ if (ni->ni_scangen == gen) /* previously handled */
continue; continue;
@ -869,7 +858,7 @@ restart:
* a lock, as this will result in a LOR between the * a lock, as this will result in a LOR between the
* node lock and the driver lock. * node lock and the driver lock.
*/ */
ieee80211_node_critsec_end(ic, s); IEEE80211_NODE_UNLOCK(ic);
IEEE80211_SEND_MGMT(ic, ni, IEEE80211_SEND_MGMT(ic, ni,
IEEE80211_FC0_SUBTYPE_DEAUTH, IEEE80211_FC0_SUBTYPE_DEAUTH,
IEEE80211_REASON_AUTH_EXPIRE); IEEE80211_REASON_AUTH_EXPIRE);
@ -880,19 +869,18 @@ restart:
} }
if (!TAILQ_EMPTY(&ic->ic_node)) if (!TAILQ_EMPTY(&ic->ic_node))
ic->ic_inact_timer = IEEE80211_INACT_WAIT; ic->ic_inact_timer = IEEE80211_INACT_WAIT;
ieee80211_node_critsec_end(ic, s); IEEE80211_NODE_UNLOCK(ic);
} }
void void
ieee80211_iterate_nodes(struct ieee80211com *ic, ieee80211_iter_func *f, void *arg) ieee80211_iterate_nodes(struct ieee80211com *ic, ieee80211_iter_func *f, void *arg)
{ {
struct ieee80211_node *ni; struct ieee80211_node *ni;
ieee80211_node_critsec_decl(s);
ieee80211_node_critsec_begin(ic, s); IEEE80211_NODE_LOCK(ic);
TAILQ_FOREACH(ni, &ic->ic_node, ni_list) TAILQ_FOREACH(ni, &ic->ic_node, ni_list)
(*f)(arg, ni); (*f)(arg, ni);
ieee80211_node_critsec_end(ic, s); IEEE80211_NODE_UNLOCK(ic);
} }
void void

View File

@ -1,4 +1,4 @@
/* $NetBSD: ieee80211_node.h,v 1.11 2004/07/23 09:22:15 mycroft Exp $ */ /* $NetBSD: ieee80211_node.h,v 1.12 2004/07/23 10:15:13 mycroft Exp $ */
/*- /*-
* Copyright (c) 2001 Atsushi Onoe * Copyright (c) 2001 Atsushi Onoe
* Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting * Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting
@ -159,29 +159,21 @@ ieee80211_unref_node(struct ieee80211_node **ni)
*ni = NULL; /* guard against use */ *ni = NULL; /* guard against use */
} }
#define IEEE80211_NODE_LOCK_INIT(_ic, _name) \
mtx_init(&(_ic)->ic_nodelock, _name, "802.11 node table", MTX_DEF)
#define IEEE80211_NODE_LOCK_DESTROY(_ic) mtx_destroy(&(_ic)->ic_nodelock)
#define IEEE80211_NODE_LOCK(_ic) mtx_lock(&(_ic)->ic_nodelock)
#define IEEE80211_NODE_UNLOCK(_ic) mtx_unlock(&(_ic)->ic_nodelock)
#define IEEE80211_NODE_LOCK_ASSERT(_ic) \
mtx_assert(&(_ic)->ic_nodelock, MA_OWNED)
struct ieee80211com; struct ieee80211com;
#ifdef MALLOC_DECLARE #ifdef MALLOC_DECLARE
MALLOC_DECLARE(M_80211_NODE); MALLOC_DECLARE(M_80211_NODE);
#endif #endif
extern void ieee80211_node_attach(struct ifnet *); extern void ieee80211_node_attach(struct ieee80211com *);
extern void ieee80211_node_lateattach(struct ifnet *); extern void ieee80211_node_lateattach(struct ieee80211com *);
extern void ieee80211_node_detach(struct ifnet *); extern void ieee80211_node_detach(struct ieee80211com *);
extern void ieee80211_begin_scan(struct ifnet *); extern void ieee80211_begin_scan(struct ieee80211com *);
extern void ieee80211_next_scan(struct ifnet *); extern void ieee80211_next_scan(struct ieee80211com *);
extern void ieee80211_create_ibss(struct ieee80211com* , extern void ieee80211_create_ibss(struct ieee80211com *,
struct ieee80211_channel *); struct ieee80211_channel *);
extern void ieee80211_end_scan(struct ifnet *); extern void ieee80211_end_scan(struct ieee80211com *);
extern struct ieee80211_node *ieee80211_alloc_node(struct ieee80211com *, extern struct ieee80211_node *ieee80211_alloc_node(struct ieee80211com *,
u_int8_t *); u_int8_t *);
extern struct ieee80211_node *ieee80211_dup_bss(struct ieee80211com *, extern struct ieee80211_node *ieee80211_dup_bss(struct ieee80211com *,
@ -192,8 +184,9 @@ extern struct ieee80211_node *ieee80211_find_rxnode(struct ieee80211com *,
struct ieee80211_frame *); struct ieee80211_frame *);
extern struct ieee80211_node *ieee80211_find_txnode(struct ieee80211com *, extern struct ieee80211_node *ieee80211_find_txnode(struct ieee80211com *,
u_int8_t *); u_int8_t *);
extern struct ieee80211_node * ieee80211_lookup_node(struct ieee80211com *, extern struct ieee80211_node *ieee80211_find_node_with_channel(
u_int8_t *macaddr, struct ieee80211_channel *); struct ieee80211com *, u_int8_t *macaddr,
struct ieee80211_channel *);
extern void ieee80211_free_node(struct ieee80211com *, extern void ieee80211_free_node(struct ieee80211com *,
struct ieee80211_node *); struct ieee80211_node *);
extern void ieee80211_free_allnodes(struct ieee80211com *); extern void ieee80211_free_allnodes(struct ieee80211com *);

View File

@ -1,4 +1,4 @@
/* $NetBSD: ieee80211_proto.c,v 1.14 2004/07/23 08:38:08 mycroft Exp $ */ /* $NetBSD: ieee80211_proto.c,v 1.15 2004/07/23 10:15:13 mycroft Exp $ */
/*- /*-
* Copyright (c) 2001 Atsushi Onoe * Copyright (c) 2001 Atsushi Onoe
* Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting * Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting
@ -35,7 +35,7 @@
#ifdef __FreeBSD__ #ifdef __FreeBSD__
__FBSDID("$FreeBSD: src/sys/net80211/ieee80211_proto.c,v 1.8 2004/04/02 20:22:25 sam Exp $"); __FBSDID("$FreeBSD: src/sys/net80211/ieee80211_proto.c,v 1.8 2004/04/02 20:22:25 sam Exp $");
#else #else
__KERNEL_RCSID(0, "$NetBSD: ieee80211_proto.c,v 1.14 2004/07/23 08:38:08 mycroft Exp $"); __KERNEL_RCSID(0, "$NetBSD: ieee80211_proto.c,v 1.15 2004/07/23 10:15:13 mycroft Exp $");
#endif #endif
/* /*
@ -432,7 +432,7 @@ ieee80211_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int mgt
*/ */
ieee80211_create_ibss(ic, ic->ic_des_chan); ieee80211_create_ibss(ic, ic->ic_des_chan);
} else { } else {
ieee80211_begin_scan(ifp); ieee80211_begin_scan(ic);
} }
break; break;
case IEEE80211_S_SCAN: case IEEE80211_S_SCAN:
@ -458,7 +458,7 @@ ieee80211_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int mgt
ni->ni_fails++; ni->ni_fails++;
ieee80211_unref_node(&ni); ieee80211_unref_node(&ni);
} }
ieee80211_begin_scan(ifp); ieee80211_begin_scan(ic);
break; break;
} }
break; break;

View File

@ -1,4 +1,4 @@
/* $NetBSD: ieee80211_var.h,v 1.14 2004/07/23 09:22:15 mycroft Exp $ */ /* $NetBSD: ieee80211_var.h,v 1.15 2004/07/23 10:15:13 mycroft Exp $ */
/*- /*-
* Copyright (c) 2001 Atsushi Onoe * Copyright (c) 2001 Atsushi Onoe
* Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting * Copyright (c) 2002, 2003 Sam Leffler, Errno Consulting
@ -39,6 +39,19 @@
* Definitions for IEEE 802.11 drivers. * Definitions for IEEE 802.11 drivers.
*/ */
/* NB: portability glue must go first */
#ifdef __NetBSD__
#include <net80211/ieee80211_netbsd.h>
#elif __FreeBSD__
#include <net80211/ieee80211_freebsd.h>
#elif __linux__
#include <net80211/ieee80211_linux.h>
#else
#error "No support for your operating system!"
#endif
#include <sys/queue.h>
#include <net80211/ieee80211.h> #include <net80211/ieee80211.h>
#include <net80211/ieee80211_crypto.h> #include <net80211/ieee80211_crypto.h>
#include <net80211/ieee80211_ioctl.h> /* for ieee80211_stats */ #include <net80211/ieee80211_ioctl.h> /* for ieee80211_stats */
@ -146,9 +159,7 @@ struct ieee80211com {
int ic_fixed_rate; /* index to ic_sup_rates[] */ int ic_fixed_rate; /* index to ic_sup_rates[] */
u_int16_t ic_rtsthreshold; u_int16_t ic_rtsthreshold;
u_int16_t ic_fragthreshold; u_int16_t ic_fragthreshold;
#ifdef __FreeBSD__ ieee80211_node_lock_t ic_nodelock; /* on node table */
struct mtx ic_nodelock; /* on node table */
#endif
u_int ic_scangen; /* gen# for timeout scan */ u_int ic_scangen; /* gen# for timeout scan */
struct ieee80211_node *(*ic_node_alloc)(struct ieee80211com *); struct ieee80211_node *(*ic_node_alloc)(struct ieee80211com *);
void (*ic_node_free)(struct ieee80211com *, void (*ic_node_free)(struct ieee80211com *,