Date: Wed, 3 Aug 2005 23:31:26 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 81420 for review Message-ID: <200508032331.j73NVQ16027438@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=81420 Change 81420 by sam@sam_ebb on 2005/08/03 23:30:45 Cleanup key ix map stuff: o dynamically allocate table based on max key ix (defined as 4 by default w/ driver override) o defer sta table allocation to late attach so driver can override max key index o use late attach deferral to do max aid also o change key ix checks to be against nt_keyixmax; w/ unsigned don't need explicit check for KEYIX_NONE Affected files ... .. //depot/projects/wifi/sys/dev/ath/if_ath.c#97 edit .. //depot/projects/wifi/sys/net80211/ieee80211_crypto.c#16 edit .. //depot/projects/wifi/sys/net80211/ieee80211_crypto.h#11 edit .. //depot/projects/wifi/sys/net80211/ieee80211_node.c#60 edit .. //depot/projects/wifi/sys/net80211/ieee80211_node.h#29 edit Differences ... ==== //depot/projects/wifi/sys/dev/ath/if_ath.c#97 (text+ko) ==== @@ -586,6 +586,7 @@ ic->ic_scan_start = ath_scan_start; ic->ic_scan_end = ath_scan_end; ic->ic_set_channel = ath_set_channel; + ic->ic_crypto.cs_max_keyix = sc->sc_keymax; ic->ic_crypto.cs_key_alloc = ath_key_alloc; ic->ic_crypto.cs_key_delete = ath_key_delete; ic->ic_crypto.cs_key_set = ath_key_set; ==== //depot/projects/wifi/sys/net80211/ieee80211_crypto.c#16 (text+ko) ==== @@ -143,6 +143,7 @@ /* NB: we assume everything is pre-zero'd */ cs->cs_def_txkey = IEEE80211_KEYIX_NONE; + cs->cs_max_keyix = IEEE80211_WEP_NKID; ciphers[IEEE80211_CIPHER_NONE] = &ieee80211_cipher_none; for (i = 0; i < IEEE80211_WEP_NKID; i++) ieee80211_crypto_resetkey(ic, &cs->cs_nw_keys[i], ==== //depot/projects/wifi/sys/net80211/ieee80211_crypto.h#11 (text+ko) ==== @@ -121,6 +121,7 @@ struct ieee80211_crypto_state { struct ieee80211_key cs_nw_keys[IEEE80211_WEP_NKID]; u_int16_t cs_def_txkey; /* default/group tx key index */ + u_int16_t cs_max_keyix; /* max h/w key index */ int (*cs_key_alloc)(struct ieee80211com *, const struct ieee80211_key *); ==== //depot/projects/wifi/sys/net80211/ieee80211_node.c#60 (text+ko) ==== @@ -71,7 +71,8 @@ static void _ieee80211_free_node(struct ieee80211_node *); static void ieee80211_node_table_init(struct ieee80211com *ic, - struct ieee80211_node_table *nt, const char *name, int inact); + struct ieee80211_node_table *nt, const char *name, + int inact, int keymaxix); static void ieee80211_node_table_reset(struct ieee80211_node_table *); static void ieee80211_node_table_cleanup(struct ieee80211_node_table *nt); @@ -81,9 +82,6 @@ ieee80211_node_attach(struct ieee80211com *ic) { - ieee80211_node_table_init(ic, &ic->ic_sta, "station", - IEEE80211_INACT_INIT); - ic->ic_node_alloc = node_alloc; ic->ic_node_free = node_free; ic->ic_node_cleanup = node_cleanup; @@ -97,10 +95,16 @@ callout_init(&ic->ic_inact, CALLOUT_MPSAFE); - /* XXX defer */ - if (ic->ic_max_aid == 0) - ic->ic_max_aid = IEEE80211_AID_DEF; - else if (ic->ic_max_aid > IEEE80211_AID_MAX) + /* NB: driver should override */ + ic->ic_max_aid = IEEE80211_AID_DEF; +} + +void +ieee80211_node_lateattach(struct ieee80211com *ic) +{ + struct ieee80211_rsnparms *rsn; + + if (ic->ic_max_aid > IEEE80211_AID_MAX) ic->ic_max_aid = IEEE80211_AID_MAX; MALLOC(ic->ic_aid_bitmap, u_int32_t *, howmany(ic->ic_max_aid, 32) * sizeof(u_int32_t), @@ -110,12 +114,9 @@ printf("%s: no memory for AID bitmap!\n", __func__); ic->ic_max_aid = 0; } -} -void -ieee80211_node_lateattach(struct ieee80211com *ic) -{ - struct ieee80211_rsnparms *rsn; + ieee80211_node_table_init(ic, &ic->ic_sta, "station", + IEEE80211_INACT_INIT, ic->ic_crypto.cs_max_keyix); ieee80211_reset_bss(ic); /* @@ -956,9 +957,10 @@ nt = &ic->ic_sta; IEEE80211_NODE_LOCK(nt); - KASSERT(keyix == IEEE80211_KEYIX_NONE || keyix < 128, - ("keyix %u out of bounds (1)", keyix)); - ni = (keyix != IEEE80211_KEYIX_NONE) ? nt->nt_keyixmap[keyix] : NULL; + if (nt->nt_keyixmap != NULL && keyix < nt->nt_keyixmax) + ni = nt->nt_keyixmap[keyix]; + else + ni = NULL; if (ni == NULL) { if (IS_CTL(wh) && !IS_PSPOLL(wh) /*&& !IS_RTS(ah)*/) ni = _ieee80211_find_node(nt, wh->i_addr1); @@ -966,21 +968,21 @@ ni = _ieee80211_find_node(nt, wh->i_addr2); if (ni == NULL) ni = ieee80211_ref_node(ic->ic_bss); - /* - * If the station has a unicast key cache slot - * assigned update the key->node mapping table. - */ - keyix = ni->ni_ucastkey.wk_keyix; - KASSERT(keyix == IEEE80211_KEYIX_NONE || keyix < 128, - ("keyix %u out of bounds (2)", keyix)); - /* XXX can keyixmap[keyix] != NULL? */ - if (keyix != IEEE80211_KEYIX_NONE && - nt->nt_keyixmap[keyix] == NULL) { - IEEE80211_DPRINTF(ni->ni_ic, IEEE80211_MSG_NODE, - "%s: add key map entry %p<%s> refcnt %d\n", - __func__, ni, ether_sprintf(ni->ni_macaddr), - ieee80211_node_refcnt(ni)+1); - nt->nt_keyixmap[keyix] = ieee80211_ref_node(ni); + if (nt->nt_keyixmap != NULL) { + /* + * If the station has a unicast key cache slot + * assigned update the key->node mapping table. + */ + keyix = ni->ni_ucastkey.wk_keyix; + /* XXX can keyixmap[keyix] != NULL? */ + if (keyix < nt->nt_keyixmax && + nt->nt_keyixmap[keyix] == NULL) { + IEEE80211_DPRINTF(ni->ni_ic, IEEE80211_MSG_NODE, + "%s: add key map entry %p<%s> refcnt %d\n", + __func__, ni, ether_sprintf(ni->ni_macaddr), + ieee80211_node_refcnt(ni)+1); + nt->nt_keyixmap[keyix] = ieee80211_ref_node(ni); + } } } else ieee80211_ref_node(ni); @@ -1136,13 +1138,14 @@ * Last reference, reclaim state. */ _ieee80211_free_node(ni); - } else if (ieee80211_node_refcnt(ni) == 1) { + } else if (ieee80211_node_refcnt(ni) == 1 && + nt->nt_keyixmap != NULL) { u_int16_t keyix; /* * Check for a last reference in the key mapping table. */ keyix = ni->ni_ucastkey.wk_keyix; - if (keyix != IEEE80211_KEYIX_NONE && + if (keyix < nt->nt_keyixmax && nt->nt_keyixmap[keyix] == ni) { IEEE80211_DPRINTF(ni->ni_ic, IEEE80211_MSG_NODE, "%s: %p<%s> clear key map entry", __func__, @@ -1172,8 +1175,11 @@ /* XXX can be entered w/ or w/o lock */ if (!isowned) IEEE80211_NODE_LOCK(nt); - ni = nt->nt_keyixmap[keyix]; - nt->nt_keyixmap[keyix] = NULL;; + if (nt->nt_keyixmap != NULL && keyix < nt->nt_keyixmax) { + ni = nt->nt_keyixmap[keyix]; + nt->nt_keyixmap[keyix] = NULL;; + } else + ni = NULL; if (!isowned) IEEE80211_NODE_UNLOCK(nt); @@ -1210,7 +1216,8 @@ * being cleared because the node may not be free'd. */ keyix = ni->ni_ucastkey.wk_keyix; - if (keyix != IEEE80211_KEYIX_NONE && nt->nt_keyixmap[keyix] == ni) { + if (nt->nt_keyixmap != NULL && keyix < nt->nt_keyixmax && + nt->nt_keyixmap[keyix] == ni) { IEEE80211_DPRINTF(ni->ni_ic, IEEE80211_MSG_NODE, "%s: %p<%s> clear key map entry\n", __func__, ni, ether_sprintf(ni->ni_macaddr)); @@ -1272,8 +1279,6 @@ ic->ic_opmode == IEEE80211_M_AHDEMO); IEEE80211_SCAN_LOCK(nt); gen = nt->nt_scangen++; - IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE, - "%s: %s scangen %u\n", __func__, nt->nt_name, gen); restart: IEEE80211_NODE_LOCK(nt); TAILQ_FOREACH(ni, &nt->nt_node, ni_list) { @@ -1737,7 +1742,7 @@ static void ieee80211_node_table_init(struct ieee80211com *ic, struct ieee80211_node_table *nt, - const char *name, int inact) + const char *name, int inact, int keyixmax) { IEEE80211_DPRINTF(ic, IEEE80211_MSG_NODE, @@ -1751,6 +1756,17 @@ nt->nt_name = name; nt->nt_scangen = 1; nt->nt_inact_init = inact; + nt->nt_keyixmax = keyixmax; + if (nt->nt_keyixmax > 0) { + MALLOC(nt->nt_keyixmap, struct ieee80211_node **, + keyixmax * sizeof(struct ieee80211_node *), + M_80211_NODE, M_NOWAIT | M_ZERO); + if (nt->nt_keyixmap == NULL) + if_printf(ic->ic_ifp, + "Cannot allocate key index map with %u entries\n", + keyixmax); + } else + nt->nt_keyixmap = NULL; } static void @@ -1774,6 +1790,11 @@ IEEE80211_NODE_LOCK(nt); ieee80211_free_allnodes_locked(nt); + if (nt->nt_keyixmap != NULL) { + /* XXX verify all entries are NULL */ + FREE(nt->nt_keyixmap, M_80211_NODE); + nt->nt_keyixmap = NULL; + } IEEE80211_SCAN_LOCK_DESTROY(nt); IEEE80211_NODE_LOCK_DESTROY(nt); } ==== //depot/projects/wifi/sys/net80211/ieee80211_node.h#29 (text+ko) ==== @@ -210,7 +210,8 @@ ieee80211_node_lock_t nt_nodelock; /* on node table */ TAILQ_HEAD(, ieee80211_node) nt_node; /* information of all nodes */ LIST_HEAD(, ieee80211_node) nt_hash[IEEE80211_NODE_HASHSIZE]; - struct ieee80211_node *nt_keyixmap[128];/* key ix -> node map */ + struct ieee80211_node **nt_keyixmap; /* key ix -> node map */ + int nt_keyixmax; /* keyixmap size */ const char *nt_name; /* for debugging */ ieee80211_scan_lock_t nt_scanlock; /* on nt_scangen */ u_int nt_scangen; /* gen# for timeout scan */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200508032331.j73NVQ16027438>