PERFORCE change 81420 for review
Sam Leffler
sam at FreeBSD.org
Wed Aug 3 23:31:28 GMT 2005
http://perforce.freebsd.org/chv.cgi?CH=81420
Change 81420 by sam at 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 */
More information about the p4-projects
mailing list