MFC r203683:

Add multicast key search support. This fixes corrupted mcast packets
 when we have more than one hostap vap.
This commit is contained in:
Rui Paulo 2010-02-26 18:46:16 +00:00
parent a5a931b33f
commit f5e8283aa9
2 changed files with 31 additions and 12 deletions

View File

@ -621,6 +621,13 @@ ath_attach(u_int16_t devid, struct ath_softc *sc)
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 struct ieee80211_key *k,
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, struct ieee80211_key *k,
* 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, struct ieee80211_key *k,
"%s: bogus group key\n", __func__);
return 0;
}
/*
* 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;
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;
}
/*
* Group key and device supports multicast key search.
*/
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

View File

@ -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) \