diff options
author | sam <sam@FreeBSD.org> | 2005-01-24 19:32:10 +0000 |
---|---|---|
committer | sam <sam@FreeBSD.org> | 2005-01-24 19:32:10 +0000 |
commit | 459bcc3dba08670eaf93dc7b8024a4b60531c5fc (patch) | |
tree | f5f89d2432bd0c441a8317125fb32932cc73df3d /sys/net80211 | |
parent | 945d03f4178b75dc99b58838b671f60dc40fe1dc (diff) | |
download | FreeBSD-src-459bcc3dba08670eaf93dc7b8024a4b60531c5fc.zip FreeBSD-src-459bcc3dba08670eaf93dc7b8024a4b60531c5fc.tar.gz |
statically allocate the station/neighbor node table; the deferred
allocation scheme introduced a race condition during device state
transitions
Diffstat (limited to 'sys/net80211')
-rw-r--r-- | sys/net80211/ieee80211.c | 4 | ||||
-rw-r--r-- | sys/net80211/ieee80211_input.c | 18 | ||||
-rw-r--r-- | sys/net80211/ieee80211_ioctl.c | 42 | ||||
-rw-r--r-- | sys/net80211/ieee80211_node.c | 155 | ||||
-rw-r--r-- | sys/net80211/ieee80211_node.h | 1 | ||||
-rw-r--r-- | sys/net80211/ieee80211_proto.c | 15 | ||||
-rw-r--r-- | sys/net80211/ieee80211_var.h | 2 |
7 files changed, 70 insertions, 167 deletions
diff --git a/sys/net80211/ieee80211.c b/sys/net80211/ieee80211.c index 246f7c8..98dba5f 100644 --- a/sys/net80211/ieee80211.c +++ b/sys/net80211/ieee80211.c @@ -714,8 +714,8 @@ ieee80211_watchdog(struct ieee80211com *ic) nt->nt_timeout(nt); need_inact_timer += nt->nt_inact_timer; } - nt = ic->ic_sta; - if (nt != NULL && nt->nt_inact_timer) { + nt = &ic->ic_sta; + if (nt->nt_inact_timer) { if (--nt->nt_inact_timer == 0) nt->nt_timeout(nt); need_inact_timer += nt->nt_inact_timer; diff --git a/sys/net80211/ieee80211_input.c b/sys/net80211/ieee80211_input.c index 6902dc9..354c496 100644 --- a/sys/net80211/ieee80211_input.c +++ b/sys/net80211/ieee80211_input.c @@ -235,7 +235,7 @@ ieee80211_input(struct ieee80211com *ic, struct mbuf *m, * Fake up a node for this newly * discovered member of the IBSS. */ - ni = ieee80211_fakeup_adhoc_node(ic->ic_sta, + ni = ieee80211_fakeup_adhoc_node(&ic->ic_sta, type == IEEE80211_FC0_TYPE_CTL ? wh->i_addr1 : wh->i_addr2); if (ni == NULL) { @@ -349,7 +349,7 @@ ieee80211_input(struct ieee80211com *ic, struct mbuf *m, IEEE80211_DISCARD(ic, IEEE80211_MSG_INPUT, wh, "data", "%s", "unknown src"); /* NB: caller deals with reference */ - ni = ieee80211_dup_bss(ic->ic_sta, wh->i_addr2); + ni = ieee80211_dup_bss(&ic->ic_sta, wh->i_addr2); if (ni != NULL) { IEEE80211_SEND_MGMT(ic, ni, IEEE80211_FC0_SUBTYPE_DEAUTH, @@ -507,7 +507,7 @@ ieee80211_input(struct ieee80211com *ic, struct mbuf *m, /* XXX this dups work done in ieee80211_encap */ /* check if destination is associated */ struct ieee80211_node *ni1 = - ieee80211_find_node(ic->ic_sta, + ieee80211_find_node(&ic->ic_sta, eh->ether_dhost); if (ni1 != NULL) { /* XXX check if authorized */ @@ -873,7 +873,7 @@ ieee80211_auth_open(struct ieee80211com *ic, struct ieee80211_frame *wh, } /* always accept open authentication requests */ if (ni == ic->ic_bss) { - ni = ieee80211_dup_bss(ic->ic_sta, wh->i_addr2); + ni = ieee80211_dup_bss(&ic->ic_sta, wh->i_addr2); if (ni == NULL) return; } else @@ -1020,7 +1020,7 @@ ieee80211_auth_shared(struct ieee80211com *ic, struct ieee80211_frame *wh, switch (seq) { case IEEE80211_AUTH_SHARED_REQUEST: if (ni == ic->ic_bss) { - ni = ieee80211_dup_bss(ic->ic_sta, wh->i_addr2); + ni = ieee80211_dup_bss(&ic->ic_sta, wh->i_addr2); if (ni == NULL) { /* NB: no way to return an error */ return; @@ -1890,7 +1890,7 @@ ieee80211_recv_mgmt(struct ieee80211com *ic, struct mbuf *m0, if ((ic->ic_flags & IEEE80211_F_SCAN) == 0) { if ((capinfo & IEEE80211_CAPINFO_IBSS) == 0) return; - ni = ieee80211_fakeup_adhoc_node(ic->ic_sta, + ni = ieee80211_fakeup_adhoc_node(&ic->ic_sta, wh->i_addr2); } else ni = ieee80211_dup_bss(&ic->ic_scan, wh->i_addr2); @@ -2003,10 +2003,10 @@ ieee80211_recv_mgmt(struct ieee80211com *ic, struct mbuf *m0, * send the response so blindly add them to the * neighbor table. */ - ni = ieee80211_fakeup_adhoc_node(ic->ic_sta, + ni = ieee80211_fakeup_adhoc_node(&ic->ic_sta, wh->i_addr2); } else - ni = ieee80211_dup_bss(ic->ic_sta, wh->i_addr2); + ni = ieee80211_dup_bss(&ic->ic_sta, wh->i_addr2); if (ni == NULL) return; allocbs = 1; @@ -2172,7 +2172,7 @@ ieee80211_recv_mgmt(struct ieee80211com *ic, struct mbuf *m0, "[%s] deny %s request, sta not authenticated\n", ether_sprintf(wh->i_addr2), reassoc ? "reassoc" : "assoc"); - ni = ieee80211_dup_bss(ic->ic_sta, wh->i_addr2); + ni = ieee80211_dup_bss(&ic->ic_sta, wh->i_addr2); if (ni != NULL) { IEEE80211_SEND_MGMT(ic, ni, IEEE80211_FC0_SUBTYPE_DEAUTH, diff --git a/sys/net80211/ieee80211_ioctl.c b/sys/net80211/ieee80211_ioctl.c index 67d160c..b767f66 100644 --- a/sys/net80211/ieee80211_ioctl.c +++ b/sys/net80211/ieee80211_ioctl.c @@ -868,9 +868,7 @@ ieee80211_ioctl_getkey(struct ieee80211com *ic, struct ieee80211req *ireq) return error; kid = ik.ik_keyix; if (kid == IEEE80211_KEYIX_NONE) { - if (ic->ic_sta == NULL) - return EINVAL; - ni = ieee80211_find_node(ic->ic_sta, ik.ik_macaddr); + ni = ieee80211_find_node(&ic->ic_sta, ik.ik_macaddr); if (ni == NULL) return EINVAL; /* XXX */ wk = &ni->ni_ucastkey; @@ -958,9 +956,7 @@ ieee80211_ioctl_getwpaie(struct ieee80211com *ic, struct ieee80211req *ireq) error = copyin(ireq->i_data, wpaie.wpa_macaddr, IEEE80211_ADDR_LEN); if (error != 0) return error; - if (ic->ic_sta == NULL) - return EINVAL; - ni = ieee80211_find_node(ic->ic_sta, wpaie.wpa_macaddr); + ni = ieee80211_find_node(&ic->ic_sta, wpaie.wpa_macaddr); if (ni == NULL) return EINVAL; /* XXX */ memset(wpaie.wpa_ie, 0, sizeof(wpaie.wpa_ie)); @@ -989,9 +985,7 @@ ieee80211_ioctl_getstastats(struct ieee80211com *ic, struct ieee80211req *ireq) error = copyin(ireq->i_data, macaddr, IEEE80211_ADDR_LEN); if (error != 0) return error; - if (ic->ic_sta == NULL) - return EINVAL; - ni = ieee80211_find_node(ic->ic_sta, macaddr); + ni = ieee80211_find_node(&ic->ic_sta, macaddr); if (ni == NULL) return EINVAL; /* XXX */ if (ireq->i_len > sizeof(struct ieee80211req_sta_stats)) @@ -1137,9 +1131,7 @@ ieee80211_ioctl_getstainfo(struct ieee80211com *ic, struct ieee80211req *ireq) int error, space; u_int8_t *p, *cp; - nt = ic->ic_sta; - if (nt == NULL) - return EINVAL; + nt = &ic->ic_sta; p = ireq->i_data; space = ireq->i_len; error = 0; @@ -1181,9 +1173,7 @@ ieee80211_ioctl_getstatxpow(struct ieee80211com *ic, struct ieee80211req *ireq) error = copyin(ireq->i_data, &txpow, sizeof(txpow)); if (error != 0) return error; - if (ic->ic_sta == NULL) - return EINVAL; - ni = ieee80211_find_node(ic->ic_sta, txpow.it_macaddr); + ni = ieee80211_find_node(&ic->ic_sta, txpow.it_macaddr); if (ni == NULL) return EINVAL; /* XXX */ txpow.it_txpow = ni->ni_txpower; @@ -1506,9 +1496,7 @@ ieee80211_ioctl_setkey(struct ieee80211com *ic, struct ieee80211req *ireq) if (!IEEE80211_ADDR_EQ(ik.ik_macaddr, ni->ni_bssid)) return EADDRNOTAVAIL; } else { - if (ic->ic_sta == NULL) - return EINVAL; - ni = ieee80211_find_node(ic->ic_sta, ik.ik_macaddr); + ni = ieee80211_find_node(&ic->ic_sta, ik.ik_macaddr); if (ni == NULL) return ENOENT; } @@ -1561,9 +1549,7 @@ ieee80211_ioctl_delkey(struct ieee80211com *ic, struct ieee80211req *ireq) if (dk.idk_keyix == (u_int8_t) IEEE80211_KEYIX_NONE) { struct ieee80211_node *ni; - if (ic->ic_sta == NULL) - return EINVAL; - ni = ieee80211_find_node(ic->ic_sta, dk.idk_macaddr); + ni = ieee80211_find_node(&ic->ic_sta, dk.idk_macaddr); if (ni == NULL) return EINVAL; /* XXX */ /* XXX error return */ @@ -1644,15 +1630,13 @@ ieee80211_ioctl_setmlme(struct ieee80211com *ic, struct ieee80211req *ireq) case IEEE80211_M_HOSTAP: /* NB: the broadcast address means do 'em all */ if (!IEEE80211_ADDR_EQ(mlme.im_macaddr, ic->ic_ifp->if_broadcastaddr)) { - if (ic->ic_sta == NULL || - (ni = ieee80211_find_node(ic->ic_sta, + if ((ni = ieee80211_find_node(&ic->ic_sta, mlme.im_macaddr)) == NULL) return EINVAL; domlme(&mlme, ni); ieee80211_free_node(ni); } else { - if (ic->ic_sta != NULL) - ieee80211_iterate_nodes(ic->ic_sta, + ieee80211_iterate_nodes(&ic->ic_sta, domlme, &mlme); } break; @@ -1664,9 +1648,7 @@ ieee80211_ioctl_setmlme(struct ieee80211com *ic, struct ieee80211req *ireq) case IEEE80211_MLME_UNAUTHORIZE: if (ic->ic_opmode != IEEE80211_M_HOSTAP) return EINVAL; - if (ic->ic_sta == NULL) - return EINVAL; - ni = ieee80211_find_node(ic->ic_sta, mlme.im_macaddr); + ni = ieee80211_find_node(&ic->ic_sta, mlme.im_macaddr); if (ni == NULL) return EINVAL; if (mlme.im_op == IEEE80211_MLME_AUTHORIZE) @@ -1799,9 +1781,7 @@ ieee80211_ioctl_setstatxpow(struct ieee80211com *ic, struct ieee80211req *ireq) error = copyin(ireq->i_data, &txpow, sizeof(txpow)); if (error != 0) return error; - if (ic->ic_sta == NULL) - return EINVAL; - ni = ieee80211_find_node(ic->ic_sta, txpow.it_macaddr); + ni = ieee80211_find_node(&ic->ic_sta, txpow.it_macaddr); if (ni == NULL) return EINVAL; /* XXX */ ni->ni_txpower = txpow.it_txpow; diff --git a/sys/net80211/ieee80211_node.c b/sys/net80211/ieee80211_node.c index f7f55dd..fac5841 100644 --- a/sys/net80211/ieee80211_node.c +++ b/sys/net80211/ieee80211_node.c @@ -68,9 +68,6 @@ static void ieee80211_set_tim(struct ieee80211com *, static void ieee80211_node_table_init(struct ieee80211com *ic, struct ieee80211_node_table *nt, const char *name, int inact, void (*timeout)(struct ieee80211_node_table *)); -static struct ieee80211_node_table *ieee80211_node_table_alloc( - struct ieee80211com *ic, const char *name, int inact, - void (*timeout)(struct ieee80211_node_table *)); static void ieee80211_node_table_cleanup(struct ieee80211_node_table *nt); MALLOC_DEFINE(M_80211_NODE, "80211node", "802.11 node state"); @@ -79,7 +76,8 @@ void ieee80211_node_attach(struct ieee80211com *ic) { - ic->ic_sta = NULL; /* defer to when we need it */ + ieee80211_node_table_init(ic, &ic->ic_sta, "station", + IEEE80211_INACT_INIT, ieee80211_timeout_stations); ieee80211_node_table_init(ic, &ic->ic_scan, "scan", IEEE80211_INACT_SCAN, ieee80211_timeout_scan_candidates); @@ -176,10 +174,7 @@ ieee80211_node_detach(struct ieee80211com *ic) ic->ic_bss = NULL; } ieee80211_node_table_cleanup(&ic->ic_scan); - if (ic->ic_sta != NULL) { - ieee80211_node_table_free(ic->ic_sta); - ic->ic_sta = NULL; - } + ieee80211_node_table_cleanup(&ic->ic_sta); if (ic->ic_aid_bitmap != NULL) { FREE(ic->ic_aid_bitmap, M_DEVBUF); ic->ic_aid_bitmap = NULL; @@ -355,6 +350,7 @@ ieee80211_next_scan(struct ieee80211com *ic) void ieee80211_create_ibss(struct ieee80211com* ic, struct ieee80211_channel *chan) { + struct ieee80211_node_table *nt; struct ieee80211_node *ni; IEEE80211_DPRINTF(ic, IEEE80211_MSG_SCAN, @@ -366,33 +362,26 @@ ieee80211_create_ibss(struct ieee80211com* ic, struct ieee80211_channel *chan) * we create nodes only through discovery and they typically * are long-lived associations. */ - if (ic->ic_opmode == IEEE80211_M_HOSTAP) - ic->ic_sta = ieee80211_node_table_alloc(ic, - "station", ic->ic_inact_init, - ieee80211_timeout_stations); - else - ic->ic_sta = ieee80211_node_table_alloc(ic, - "neighbor", ic->ic_inact_run, - ieee80211_timeout_stations); - if (ic->ic_sta == NULL) { - /* - * Should remain in SCAN state and retry. - */ - /* XXX stat+msg */ - return; + nt = &ic->ic_sta; + IEEE80211_NODE_LOCK(nt); + if (ic->ic_opmode == IEEE80211_M_HOSTAP) { + nt->nt_name = "station"; + nt->nt_inact_init = ic->ic_inact_init; + } else { + nt->nt_name = "neighbor"; + nt->nt_inact_init = ic->ic_inact_run; } + IEEE80211_NODE_UNLOCK(nt); - ni = ic->ic_bss; - IEEE80211_ADDR_COPY(ni->ni_macaddr, ic->ic_myaddr); + ni = ieee80211_alloc_node(nt, ic->ic_myaddr); + if (ni == NULL) { + /* XXX recovery? */ + return; + } IEEE80211_ADDR_COPY(ni->ni_bssid, ic->ic_myaddr); ni->ni_esslen = ic->ic_des_esslen; memcpy(ni->ni_essid, ic->ic_des_essid, ni->ni_esslen); - ni->ni_rssi = 0; - ni->ni_rstamp = 0; - ni->ni_tstamp.tsf = 0; ni->ni_intval = ic->ic_lintval; - ni->ni_capinfo = 0; - ni->ni_erp = 0; if (ic->ic_flags & IEEE80211_F_PRIVACY) ni->ni_capinfo |= IEEE80211_CAPINFO_PRIVACY; if (ic->ic_phytype == IEEE80211_T_FH) { @@ -423,15 +412,8 @@ ieee80211_create_ibss(struct ieee80211com* ic, struct ieee80211_channel *chan) */ ieee80211_set11gbasicrates(&ni->ni_rates, IEEE80211_MODE_11B); } - /* - * Set the erp state (mostly the slot time) to deal with - * the auto-select case; this should be redundant if the - * mode is locked. - */ - ieee80211_reset_erp(ic); - ieee80211_wme_initparams(ic); - ieee80211_new_state(ic, IEEE80211_S_RUN, -1); + (void) ieee80211_sta_join(ic, ieee80211_ref_node(ni)); } void @@ -440,16 +422,14 @@ ieee80211_reset_bss(struct ieee80211com *ic) struct ieee80211_node *ni, *obss; ieee80211_node_table_reset(&ic->ic_scan); + ieee80211_node_table_reset(&ic->ic_sta); + ni = ieee80211_alloc_node(&ic->ic_scan, ic->ic_myaddr); KASSERT(ni != NULL, ("unable to setup inital BSS node")); obss = ic->ic_bss; ic->ic_bss = ieee80211_ref_node(ni); if (obss != NULL) ieee80211_free_node(obss); - if (ic->ic_sta != NULL) { - ieee80211_node_table_free(ic->ic_sta); - ic->ic_sta = NULL; - } } static int @@ -604,7 +584,7 @@ ieee80211_end_scan(struct ieee80211com *ic) * The passive scan to look for existing AP's completed, * select a channel to camp on. Identify the channels * that already have one or more AP's and try to locate - * an unnoccupied one. If that fails, pick a channel that + * an unoccupied one. If that fails, pick a channel that * looks to be quietest. */ memset(maxrssi, 0, sizeof(maxrssi)); @@ -745,7 +725,7 @@ ieee80211_ibss_merge(struct ieee80211com *ic, struct ieee80211_node *ni) ic->ic_flags&IEEE80211_F_SHSLOT ? "short" : "long", ic->ic_flags&IEEE80211_F_USEPROT ? ", protection" : "" ); - return ieee80211_sta_join(ic, ni); + return ieee80211_sta_join(ic, ieee80211_ref_node(ni)); } /* @@ -758,34 +738,29 @@ ieee80211_sta_join(struct ieee80211com *ic, struct ieee80211_node *selbs) struct ieee80211_node *obss; if (ic->ic_opmode == IEEE80211_M_IBSS) { + struct ieee80211_node_table *nt; /* * Delete unusable rates; we've already checked * that the negotiated rate set is acceptable. */ ieee80211_fix_rate(ic, selbs, IEEE80211_F_DODEL); /* - * Create the neighbor table; it will already + * Fillin the neighbor table; it will already * exist if we are simply switching mastership. + * XXX ic_sta always setup so this is unnecessary? */ - if (ic->ic_sta == NULL) { - ic->ic_sta = ieee80211_node_table_alloc(ic, - "neighbor", ic->ic_inact_run, - ieee80211_timeout_stations); - if (ic->ic_sta == NULL) { - /* - * Should remain in SCAN state and retry. - */ - /* XXX stat+msg */ - return 0; - } - } + nt = &ic->ic_sta; + IEEE80211_NODE_LOCK(nt); + nt->nt_name = "neighbor"; + nt->nt_inact_init = ic->ic_inact_run; + IEEE80211_NODE_UNLOCK(nt); } /* * Committed to selbs, setup state. */ obss = ic->ic_bss; - ic->ic_bss = selbs; + ic->ic_bss = selbs; /* NB: caller assumed to bump refcnt */ if (obss != NULL) ieee80211_free_node(obss); /* @@ -796,10 +771,11 @@ ieee80211_sta_join(struct ieee80211com *ic, struct ieee80211_node *selbs) ic->ic_curmode = ieee80211_chan2mode(ic, selbs->ni_chan); ieee80211_reset_erp(ic); ieee80211_wme_initparams(ic); - if (ic->ic_opmode == IEEE80211_M_IBSS) - ieee80211_new_state(ic, IEEE80211_S_RUN, -1); - else + + if (ic->ic_opmode == IEEE80211_M_STA) ieee80211_new_state(ic, IEEE80211_S_AUTH, -1); + else + ieee80211_new_state(ic, IEEE80211_S_RUN, -1); return 1; } @@ -1071,7 +1047,7 @@ ieee80211_find_rxnode(struct ieee80211com *ic, (ic->ic_flags & IEEE80211_F_SCAN)) nt = &ic->ic_scan; else - nt = ic->ic_sta; + nt = &ic->ic_sta; /* XXX check ic_bss first in station mode */ /* XXX 4-address frames? */ IEEE80211_NODE_LOCK(nt); @@ -1098,7 +1074,7 @@ ieee80211_find_txnode_debug(struct ieee80211com *ic, const u_int8_t *macaddr, ieee80211_find_txnode(struct ieee80211com *ic, const u_int8_t *macaddr) #endif { - struct ieee80211_node_table *nt = ic->ic_sta; + struct ieee80211_node_table *nt = &ic->ic_sta; struct ieee80211_node *ni; /* @@ -1106,7 +1082,7 @@ ieee80211_find_txnode(struct ieee80211com *ic, const u_int8_t *macaddr) * unless we are operating in station mode or this is a * multicast/broadcast frame. */ - if (nt == NULL || IEEE80211_IS_MULTICAST(macaddr)) + if (ic->ic_opmode == IEEE80211_M_STA || IEEE80211_IS_MULTICAST(macaddr)) return ieee80211_ref_node(ic->ic_bss); /* XXX can't hold lock across dup_bss 'cuz of recursive locking */ @@ -1274,7 +1250,7 @@ node_reclaim(struct ieee80211_node_table *nt, struct ieee80211_node *ni) * Other references are present, just remove the * node from the table so it cannot be found. When * the references are dropped storage will be - * reclaimed. This normally only happens for ic_bss. + * reclaimed. */ TAILQ_REMOVE(&nt->nt_node, ni, ni_list); LIST_REMOVE(ni, ni_hash); @@ -1771,7 +1747,7 @@ u_int8_t ieee80211_getrssi(struct ieee80211com *ic) { #define NZ(x) ((x) == 0 ? 1 : (x)) - struct ieee80211_node_table *nt = ic->ic_sta; + struct ieee80211_node_table *nt = &ic->ic_sta; u_int32_t rssi_samples, rssi_total; struct ieee80211_node *ni; @@ -1779,32 +1755,23 @@ ieee80211_getrssi(struct ieee80211com *ic) rssi_samples = 0; switch (ic->ic_opmode) { case IEEE80211_M_IBSS: /* average of all ibss neighbors */ - nt = ic->ic_sta; - if (nt == NULL) - break; /* XXX locking */ - TAILQ_FOREACH(ni, &ic->ic_sta->nt_node, ni_list) + TAILQ_FOREACH(ni, &nt->nt_node, ni_list) if (ni->ni_capinfo & IEEE80211_CAPINFO_IBSS) { rssi_samples++; rssi_total += ic->ic_node_getrssi(ni); } break; case IEEE80211_M_AHDEMO: /* average of all neighbors */ - nt = ic->ic_sta; - if (nt == NULL) - break; /* XXX locking */ - TAILQ_FOREACH(ni, &ic->ic_sta->nt_node, ni_list) { + TAILQ_FOREACH(ni, &nt->nt_node, ni_list) { rssi_samples++; rssi_total += ic->ic_node_getrssi(ni); } break; case IEEE80211_M_HOSTAP: /* average of all associated stations */ - nt = ic->ic_sta; - if (nt == NULL) - break; /* XXX locking */ - TAILQ_FOREACH(ni, &ic->ic_sta->nt_node, ni_list) + TAILQ_FOREACH(ni, &nt->nt_node, ni_list) if (IEEE80211_AID(ni->ni_associd) != 0) { rssi_samples++; rssi_total += ic->ic_node_getrssi(ni); @@ -1877,24 +1844,6 @@ ieee80211_node_table_init(struct ieee80211com *ic, nt->nt_timeout = timeout; } -static struct ieee80211_node_table * -ieee80211_node_table_alloc(struct ieee80211com *ic, - const char *name, int inact, - void (*timeout)(struct ieee80211_node_table *)) -{ - struct ieee80211_node_table *nt; - - MALLOC(nt, struct ieee80211_node_table *, - sizeof(struct ieee80211_node_table), - M_DEVBUF, M_NOWAIT | M_ZERO); - if (nt == NULL) { - printf("%s: no memory node table!\n", __func__); - return NULL; - } - ieee80211_node_table_init(ic, nt, name, inact, timeout); - return nt; -} - void ieee80211_node_table_reset(struct ieee80211_node_table *nt) { @@ -1919,19 +1868,3 @@ ieee80211_node_table_cleanup(struct ieee80211_node_table *nt) IEEE80211_SCAN_LOCK_DESTROY(nt); IEEE80211_NODE_LOCK_DESTROY(nt); } - -/* - * NB: public for use in ieee80211_proto.c - */ -void -ieee80211_node_table_free(struct ieee80211_node_table *nt) -{ - - IEEE80211_DPRINTF(nt->nt_ic, IEEE80211_MSG_NODE, - "%s %s table\n", __func__, nt->nt_name); - - IEEE80211_NODE_LOCK(nt); - nt->nt_inact_timer = 0; - ieee80211_node_table_cleanup(nt); - FREE(nt, M_DEVBUF); -} diff --git a/sys/net80211/ieee80211_node.h b/sys/net80211/ieee80211_node.h index 20f9335..20556e0 100644 --- a/sys/net80211/ieee80211_node.h +++ b/sys/net80211/ieee80211_node.h @@ -218,7 +218,6 @@ struct ieee80211_node_table { void (*nt_timeout)(struct ieee80211_node_table *); }; extern void ieee80211_node_table_reset(struct ieee80211_node_table *); -extern void ieee80211_node_table_free(struct ieee80211_node_table *); extern struct ieee80211_node *ieee80211_alloc_node( struct ieee80211_node_table *, const u_int8_t *); diff --git a/sys/net80211/ieee80211_proto.c b/sys/net80211/ieee80211_proto.c index 1d15726d..0c7672d 100644 --- a/sys/net80211/ieee80211_proto.c +++ b/sys/net80211/ieee80211_proto.c @@ -845,11 +845,7 @@ ieee80211_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg ieee80211_sta_leave(ic, ni); break; case IEEE80211_M_HOSTAP: - nt = ic->ic_sta; - if (nt == NULL) { /* XXX cannot happen */ - if_printf(ifp, "no sta table (run)\n"); - break; - } + nt = &ic->ic_sta; IEEE80211_NODE_LOCK(nt); TAILQ_FOREACH(ni, &nt->nt_node, ni_list) { if (ni->ni_associd == 0) @@ -872,11 +868,7 @@ ieee80211_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg IEEE80211_REASON_AUTH_LEAVE); break; case IEEE80211_M_HOSTAP: - nt = ic->ic_sta; - if (nt == NULL) { /* XXX cannot happen */ - if_printf(ifp, "no sta table (assoc)\n"); - break; - } + nt = &ic->ic_sta; IEEE80211_NODE_LOCK(nt); TAILQ_FOREACH(ni, &nt->nt_node, ni_list) { IEEE80211_SEND_MGMT(ic, ni, @@ -1072,8 +1064,7 @@ ieee80211_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg * XXX */ ic->ic_scan.nt_inact_timer = IEEE80211_INACT_WAIT; - if (ic->ic_sta != NULL) - ic->ic_sta->nt_inact_timer = IEEE80211_INACT_WAIT; + ic->ic_sta.nt_inact_timer = IEEE80211_INACT_WAIT; break; } return 0; diff --git a/sys/net80211/ieee80211_var.h b/sys/net80211/ieee80211_var.h index 790bcdc..e6e5e70 100644 --- a/sys/net80211/ieee80211_var.h +++ b/sys/net80211/ieee80211_var.h @@ -114,7 +114,7 @@ struct ieee80211com { enum ieee80211_state ic_state; /* 802.11 state */ enum ieee80211_protmode ic_protmode; /* 802.11g protection mode */ enum ieee80211_roamingmode ic_roaming; /* roaming mode */ - struct ieee80211_node_table *ic_sta; /* stations/neighbors */ + struct ieee80211_node_table ic_sta; /* stations/neighbors */ u_int32_t *ic_aid_bitmap; /* association id map */ u_int16_t ic_max_aid; u_int16_t ic_sta_assoc; /* stations associated */ |