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