Thread (1 message) 1 message, 1 author, 2011-01-24

Re: [PATCH] RFC: ath: Fix WEP hardware encryption

From: Vasanthakumar Thiagarajan <hidden>
Date: 2011-01-24 11:22:06

Adding  linux-wireless in CC
On Sat, Jan 22, 2011 at 08:00:25AM +0530, Bruno Randolf wrote:
On Saturday 22 January 2011 00:10:23 Vasanthakumar Thiagarajan wrote:
quoted
On Fri, Jan 21, 2011 at 03:46:08PM +0530, Bruno Randolf wrote:
quoted
I need this to enable HW encryption for WEP.
Otherwise we fall back to software decryption - i only checked the
decryption case.
Encryption/Decryption is done in hw by default. In which case are you
seeing it done in sw?.
Sorry i was not very verbose in my description yesterday.

I'm seeing the problem when i have an AP configured with WEP.

The reason is that the index returned by the "reserve_keycache_entry" function 
(sorry i dont have the code here right now) is >= 4 (hw_key_index) while the 
key index in the packet header is 0-3. This is ok for transmit but received 
packets are not decrypted and therefore mac80211 has to decrypt it in SW - 
this can be easily seen by adding some debug prints in mac80211/wep.c. I have 
noticed it by watching the system CPU load under high traffic.

bruno
quoted
quoted
Any comments?

bruno
---

 drivers/net/wireless/ath/key.c |   14 +++++++++++---
 1 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/drivers/net/wireless/ath/key.c
b/drivers/net/wireless/ath/key.c index 5d465e5..5748dae 100644
--- a/drivers/net/wireless/ath/key.c
+++ b/drivers/net/wireless/ath/key.c
@@ -465,6 +465,16 @@ int ath_key_config(struct ath_common *common,

 	hk.kv_len = key->keylen;
 	memcpy(hk.kv_val, key->key, key->keylen);

+	/* set WEP keys directly to index */
+	if ((key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
+	     key->cipher == WLAN_CIPHER_SUITE_WEP104) && key->keyidx < 4) {
+		ret = ath_hw_set_keycache_entry(common, key->keyidx, &hk, 
NULL);
quoted
quoted
+		if (!ret)
+			return -EIO;
+		set_bit(key->keyidx, common->keymap);
+		return key->keyidx;
+	}
+

 	if (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
 	
 		switch (vif->type) {

 		case NL80211_IFTYPE_AP:
@@ -541,10 +551,8 @@ EXPORT_SYMBOL(ath_key_config);

 void ath_key_delete(struct ath_common *common, struct ieee80211_key_conf
 *key) {
 
 	ath_hw_keyreset(common, key->hw_key_idx);

-	if (key->hw_key_idx < IEEE80211_WEP_NKID)
-		return;
-

 	clear_bit(key->hw_key_idx, common->keymap);

+

 	if (key->cipher != WLAN_CIPHER_SUITE_TKIP)
 	
 		return;
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help