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

Reply via email to