This fixes bugs and does a cleanup of the hwcrypto stuff.
Signed-off-by: Michael Buesch <[EMAIL PROTECTED]>
Cc: Johannes Berg <[EMAIL PROTECTED]>
Index: wireless-dev-new/drivers/net/wireless/b43/b43.h
===================================================================
--- wireless-dev-new.orig/drivers/net/wireless/b43/b43.h 2007-08-23
22:55:18.000000000 +0200
+++ wireless-dev-new/drivers/net/wireless/b43/b43.h 2007-08-24
00:14:00.000000000 +0200
@@ -571,8 +571,10 @@ struct b43_stats {
};
struct b43_key {
- void *keyconf;
- bool enabled;
+ /* If keyconf is NULL, this key is disabled.
+ * keyconf is a cookie. Don't derefenrence it outside of the set_key
+ * path, because b43 doesn't own it. */
+ struct ieee80211_key_conf *keyconf;
u8 algorithm;
};
Index: wireless-dev-new/drivers/net/wireless/b43/main.c
===================================================================
--- wireless-dev-new.orig/drivers/net/wireless/b43/main.c 2007-08-23
23:42:20.000000000 +0200
+++ wireless-dev-new/drivers/net/wireless/b43/main.c 2007-08-24
00:03:09.000000000 +0200
@@ -806,31 +806,29 @@ static int b43_key_write(struct b43_wlde
{
int i;
int sta_keys_start;
+ bool removal = 0;
if (key_len > B43_SEC_KEYSIZE)
return -EINVAL;
if (index < 0) {
- /* Per station key with associated MAC address.
- * Look if it already exists, if yes update, otherwise
- * allocate a new key.
- */
+ /* Either pairwise key or address is 00:00:00:00:00:00
+ * for transmit-only keys. Search the index. */
if (b43_new_kidx_api(dev))
sta_keys_start = 4;
else
sta_keys_start = 8;
for (i = sta_keys_start; i < dev->max_nr_keys; i++) {
if (dev->key[i].keyconf == keyconf) {
- /*
- * we already have this key so we must be
- * in removal (there is no update)
- */
+ /* we already have this key so we must be
+ * in removal (there is no update) */
+ removal = 1;
index = i;
break;
}
}
if (index < 0) {
for (i = sta_keys_start; i < dev->max_nr_keys; i++) {
- if (!dev->key[i].enabled) {
+ if (!dev->key[i].keyconf) {
/* found empty */
index = i;
break;
@@ -851,6 +849,7 @@ static int b43_key_write(struct b43_wlde
do_key_write(dev, index + 4, algorithm, key, key_len, NULL);
}
keyconf->hw_key_idx = index;
+ dev->key[index].keyconf = removal ? NULL : keyconf;
return 0;
}
@@ -864,7 +863,7 @@ static void b43_clear_keys(struct b43_wl
for (i = 0; i < dev->max_nr_keys; i++) {
do_key_write(dev, i, B43_SEC_ALGO_NONE,
zero, B43_SEC_KEYSIZE, zero);
- dev->key[i].enabled = 0;
+ dev->key[i].keyconf = NULL;
}
}
@@ -2960,7 +2959,6 @@ static int b43_dev_set_key(struct ieee80
}
if (err)
goto out_unlock;
- dev->key[key->hw_key_idx].enabled = 1;
if (algorithm == B43_SEC_ALGO_WEP40 ||
algorithm == B43_SEC_ALGO_WEP104) {
@@ -2974,16 +2972,11 @@ static int b43_dev_set_key(struct ieee80
static const u8 zero[B43_SEC_KEYSIZE] = { 0 };
algorithm = B43_SEC_ALGO_NONE;
- if (is_broadcast_ether_addr(addr)) {
- err = b43_key_write(dev, index, algorithm,
- zero, B43_SEC_KEYSIZE,
- NULL, key);
- } else {
- err = b43_key_write(dev, -1, algorithm,
- zero, B43_SEC_KEYSIZE,
- addr, key);
- }
- dev->key[key->hw_key_idx].enabled = 0;
+ err = b43_key_write(dev, index, algorithm,
+ zero, B43_SEC_KEYSIZE,
+ NULL, key);
+ if (err)
+ goto out_unlock;
break;
}
default:
Index: wireless-dev-new/drivers/net/wireless/b43/xmit.c
===================================================================
--- wireless-dev-new.orig/drivers/net/wireless/b43/xmit.c 2007-08-23
22:55:18.000000000 +0200
+++ wireless-dev-new/drivers/net/wireless/b43/xmit.c 2007-08-24
00:06:28.000000000 +0200
@@ -234,23 +234,20 @@ static void generate_txhdr_fw4(struct b4
B43_WARN_ON(key_idx >= dev->max_nr_keys);
key = &(dev->key[key_idx]);
+ B43_WARN_ON(!key->keyconf);
- if (key->enabled) {
- /* Hardware appends ICV. */
- plcp_fragment_len += txctl->icv_len;
-
- key_idx = b43_kidx_to_fw(dev, key_idx);
- mac_ctl |= (key_idx << B43_TX4_MAC_KEYIDX_SHIFT) &
- B43_TX4_MAC_KEYIDX;
- mac_ctl |=
- (key->
- algorithm << B43_TX4_MAC_KEYALG_SHIFT) &
- B43_TX4_MAC_KEYALG;
- wlhdr_len = ieee80211_get_hdrlen(fctl);
- iv_len = min((size_t) txctl->iv_len,
- ARRAY_SIZE(txhdr->iv));
- memcpy(txhdr->iv, ((u8 *) wlhdr) + wlhdr_len, iv_len);
- }
+ /* Hardware appends ICV. */
+ plcp_fragment_len += txctl->icv_len;
+
+ key_idx = b43_kidx_to_fw(dev, key_idx);
+ mac_ctl |= (key_idx << B43_TX4_MAC_KEYIDX_SHIFT) &
+ B43_TX4_MAC_KEYIDX;
+ mac_ctl |= (key->algorithm << B43_TX4_MAC_KEYALG_SHIFT) &
+ B43_TX4_MAC_KEYALG;
+ wlhdr_len = ieee80211_get_hdrlen(fctl);
+ iv_len = min((size_t) txctl->iv_len,
+ ARRAY_SIZE(txhdr->iv));
+ memcpy(txhdr->iv, ((u8 *) wlhdr) + wlhdr_len, iv_len);
}
b43_generate_plcp_hdr((struct b43_plcp_hdr4 *)(&txhdr->plcp),
plcp_fragment_len, rate);
--
_______________________________________________
Bcm43xx-dev mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/bcm43xx-dev