diff options
author | Felix Fietkau <nbd@openwrt.org> | 2010-05-25 17:29:50 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2010-05-25 17:29:50 +0000 |
commit | b674689a98cfba7a782bec4283c8a6fe8d1a41c0 (patch) | |
tree | 9e5b5bd0ab2fc36069886cecb6758156758e0d22 /package/mac80211/patches/521-ath9k_common-use_mcast_search.patch | |
parent | 7ca97b03d9e3f8128b0f62680d10a25798076ee9 (diff) | |
download | upstream-b674689a98cfba7a782bec4283c8a6fe8d1a41c0.tar.gz upstream-b674689a98cfba7a782bec4283c8a6fe8d1a41c0.tar.bz2 upstream-b674689a98cfba7a782bec4283c8a6fe8d1a41c0.zip |
mac80211: update to wireless-testing 2010-05-24
SVN-Revision: 21568
Diffstat (limited to 'package/mac80211/patches/521-ath9k_common-use_mcast_search.patch')
-rw-r--r-- | package/mac80211/patches/521-ath9k_common-use_mcast_search.patch | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/package/mac80211/patches/521-ath9k_common-use_mcast_search.patch b/package/mac80211/patches/521-ath9k_common-use_mcast_search.patch new file mode 100644 index 0000000000..b83e9583cb --- /dev/null +++ b/package/mac80211/patches/521-ath9k_common-use_mcast_search.patch @@ -0,0 +1,72 @@ +--- a/drivers/net/wireless/ath/ath9k/common.c ++++ b/drivers/net/wireless/ath/ath9k/common.c +@@ -211,10 +211,14 @@ static int ath_reserve_key_cache_slot_tk + return -1; + } + +-static int ath_reserve_key_cache_slot(struct ath_common *common) ++static int ath_reserve_key_cache_slot(struct ath_common *common, ++ enum ieee80211_key_alg alg) + { + int i; + ++ if (alg == ALG_TKIP) ++ return ath_reserve_key_cache_slot_tkip(common); ++ + /* First, try to find slots that would not be available for TKIP. */ + if (common->splitmic) { + for (i = IEEE80211_WEP_NKID; i < common->keymax / 4; i++) { +@@ -283,6 +287,7 @@ int ath9k_cmn_key_config(struct ath_comm + struct ath_hw *ah = common->ah; + struct ath9k_keyval hk; + const u8 *mac = NULL; ++ u8 gmac[ETH_ALEN]; + int ret = 0; + int idx; + +@@ -306,9 +311,23 @@ int ath9k_cmn_key_config(struct ath_comm + memcpy(hk.kv_val, key->key, key->keylen); + + if (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) { +- /* For now, use the default keys for broadcast keys. This may +- * need to change with virtual interfaces. */ +- idx = key->keyidx; ++ switch (vif->type) { ++ case NL80211_IFTYPE_AP: ++ memcpy(gmac, vif->addr, ETH_ALEN); ++ gmac[0] |= 0x01; ++ mac = gmac; ++ idx = ath_reserve_key_cache_slot(common, key->alg); ++ break; ++ case NL80211_IFTYPE_ADHOC: ++ memcpy(gmac, sta->addr, ETH_ALEN); ++ gmac[0] |= 0x01; ++ mac = gmac; ++ idx = ath_reserve_key_cache_slot(common, key->alg); ++ break; ++ default: ++ idx = key->keyidx; ++ break; ++ } + } else if (key->keyidx) { + if (WARN_ON(!sta)) + return -EOPNOTSUPP; +@@ -325,14 +344,12 @@ int ath9k_cmn_key_config(struct ath_comm + return -EOPNOTSUPP; + mac = sta->addr; + +- if (key->alg == ALG_TKIP) +- idx = ath_reserve_key_cache_slot_tkip(common); +- else +- idx = ath_reserve_key_cache_slot(common); +- if (idx < 0) +- return -ENOSPC; /* no free key cache entries */ ++ idx = ath_reserve_key_cache_slot(common, key->alg); + } + ++ if (idx < 0) ++ return -ENOSPC; /* no free key cache entries */ ++ + if (key->alg == ALG_TKIP) + ret = ath_setkey_tkip(common, idx, key->key, &hk, mac, + vif->type == NL80211_IFTYPE_AP); |