svn commit: r204364 - stable/8/sys/dev/ath
Rui Paulo
rpaulo at FreeBSD.org
Fri Feb 26 18:46:17 UTC 2010
Author: rpaulo
Date: Fri Feb 26 18:46:16 2010
New Revision: 204364
URL: http://svn.freebsd.org/changeset/base/204364
Log:
MFC r203683:
Add multicast key search support. This fixes corrupted mcast packets
when we have more than one hostap vap.
Modified:
stable/8/sys/dev/ath/if_ath.c
stable/8/sys/dev/ath/if_athvar.h
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
stable/8/sys/dev/xen/xenpci/ (props changed)
stable/8/sys/netinet/ (props changed)
Modified: stable/8/sys/dev/ath/if_ath.c
==============================================================================
--- stable/8/sys/dev/ath/if_ath.c Fri Feb 26 18:18:02 2010 (r204363)
+++ stable/8/sys/dev/ath/if_ath.c Fri Feb 26 18:46:16 2010 (r204364)
@@ -621,6 +621,13 @@ ath_attach(u_int16_t devid, struct ath_s
sc->sc_wmetkipmic = 1;
}
sc->sc_hasclrkey = ath_hal_ciphersupported(ah, HAL_CIPHER_CLR);
+ /*
+ * Check for multicast key sarch support.
+ */
+ if (ath_hal_hasmcastkeysearch(sc->sc_ah) &&
+ !ath_hal_getmcastkeysearch(sc->sc_ah)) {
+ ath_hal_setmcastkeysearch(sc->sc_ah, 1);
+ }
sc->sc_mcastkey = ath_hal_getmcastkeysearch(ah);
/*
* Mark key cache slots associated with global keys
@@ -2039,7 +2046,7 @@ ath_keyset(struct ath_softc *sc, const s
if ((k->wk_flags & IEEE80211_KEY_GROUP) && sc->sc_mcastkey) {
/*
* Group keys on hardware that supports multicast frame
- * key search use a mac that is the sender's address with
+ * key search use a MAC that is the sender's address with
* the high bit set instead of the app-specified address.
*/
IEEE80211_ADDR_COPY(gmac, bss->ni_macaddr);
@@ -2219,8 +2226,10 @@ ath_key_alloc(struct ieee80211vap *vap,
* it permits us to support multiple users for adhoc and/or
* multi-station operation.
*/
- if (k->wk_keyix != IEEE80211_KEYIX_NONE || /* global key */
- ((k->wk_flags & IEEE80211_KEY_GROUP) && !sc->sc_mcastkey)) {
+ if (k->wk_keyix != IEEE80211_KEYIX_NONE) {
+ /*
+ * Only global keys should have key index assigned.
+ */
if (!(&vap->iv_nw_keys[0] <= k &&
k < &vap->iv_nw_keys[IEEE80211_WEP_NKID])) {
/* should not happen */
@@ -2228,12 +2237,22 @@ ath_key_alloc(struct ieee80211vap *vap,
"%s: bogus group key\n", __func__);
return 0;
}
+ */
+ if (vap->iv_opmode != IEEE80211_M_HOSTAP ||
+ !(k->wk_flags & IEEE80211_KEY_GROUP) ||
+ !sc->sc_mcastkey) {
+ /*
+ * XXX we pre-allocate the global keys so
+ * have no way to check if they've already
+ * been allocated.
+ */
+ *keyix = *rxkeyix = k - vap->iv_nw_keys;
+ return 1;
+ }
/*
- * XXX we pre-allocate the global keys so
- * have no way to check if they've already been allocated.
+ * Group key and device supports multicast key search.
*/
- *keyix = *rxkeyix = k - vap->iv_nw_keys;
- return 1;
+ k->wk_keyix = IEEE80211_KEYIX_NONE;
}
/*
@@ -6945,6 +6964,8 @@ ath_announce(struct ath_softc *sc)
if_printf(ifp, "using %u rx buffers\n", ath_rxbuf);
if (ath_txbuf != ATH_TXBUF)
if_printf(ifp, "using %u tx buffers\n", ath_txbuf);
+ if (sc->sc_mcastkey && bootverbose)
+ if_printf(ifp, "using multicast key search\n");
}
#ifdef IEEE80211_SUPPORT_TDMA
Modified: stable/8/sys/dev/ath/if_athvar.h
==============================================================================
--- stable/8/sys/dev/ath/if_athvar.h Fri Feb 26 18:18:02 2010 (r204363)
+++ stable/8/sys/dev/ath/if_athvar.h Fri Feb 26 18:46:16 2010 (r204364)
@@ -580,14 +580,12 @@ void ath_intr(void *);
ath_hal_setcapability(_ah, HAL_CAP_TPC, 1, _v, NULL)
#define ath_hal_hasbursting(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_BURST, 0, NULL) == HAL_OK)
-#ifdef notyet
+#define ath_hal_setmcastkeysearch(_ah, _v) \
+ ath_hal_setcapability(_ah, HAL_CAP_MCAST_KEYSRCH, 0, _v, NULL)
#define ath_hal_hasmcastkeysearch(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_MCAST_KEYSRCH, 0, NULL) == HAL_OK)
#define ath_hal_getmcastkeysearch(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_MCAST_KEYSRCH, 1, NULL) == HAL_OK)
-#else
-#define ath_hal_getmcastkeysearch(_ah) 0
-#endif
#define ath_hal_hasfastframes(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_FASTFRAME, 0, NULL) == HAL_OK)
#define ath_hal_hasbssidmask(_ah) \
More information about the svn-src-all
mailing list