ath6kl: Fix static WEP configuration in AP mode
authorJouni Malinen <jouni@qca.qualcomm.com>
Thu, 15 Sep 2011 12:10:16 +0000 (15:10 +0300)
committerKalle Valo <kvalo@qca.qualcomm.com>
Mon, 19 Sep 2011 06:57:22 +0000 (09:57 +0300)
Configuration of the WEP keys needs to be delayed until the AP mode has
been properly started at the target. Partial support for delaying the
WEP key configuration was already in place in the driver, but the actual
part of deciding when to do this was missing.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath6kl/cfg80211.c
drivers/net/wireless/ath/ath6kl/main.c

index 17bb8e28b338746f60822a740dae07fc93dce0c5..e196097e7524e8813c4b5d035f462da8052d62de 100644 (file)
@@ -904,6 +904,20 @@ static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
                }
        }
 
+       if (ar->next_mode == AP_NETWORK && key_type == WEP_CRYPT &&
+           !test_bit(CONNECTED, &ar->flag)) {
+               /*
+                * Store the key locally so that it can be re-configured after
+                * the AP mode has properly started
+                * (ath6kl_install_statioc_wep_keys).
+                */
+               ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "Delay WEP key configuration "
+                          "until AP mode has been started\n");
+               ar->wep_key_list[key_index].key_len = key->key_len;
+               memcpy(ar->wep_key_list[key_index].key, key->key, key->key_len);
+               return 0;
+       }
+
        status = ath6kl_wmi_addkey_cmd(ar->wmi, ar->def_txkey_index,
                                       key_type, key_usage, key->key_len,
                                       key->seq, key->key, KEY_OP_INIT_VAL,
@@ -1018,7 +1032,7 @@ static int ath6kl_cfg80211_set_default_key(struct wiphy *wiphy,
        if (multicast)
                key_type = ar->grp_crypto;
 
-       if (ar->nw_type == AP_NETWORK && !test_bit(CONNECTED, &ar->flag))
+       if (ar->next_mode == AP_NETWORK && !test_bit(CONNECTED, &ar->flag))
                return 0; /* Delay until AP mode has been started */
 
        status = ath6kl_wmi_addkey_cmd(ar->wmi, ar->def_txkey_index,
index d510046c99d60f12e5b003bda05bffa21dbc9329..acbd35d8df2b1186bbdece1ebcd5c5c4207b8d0e 100644 (file)
@@ -1364,8 +1364,10 @@ void ath6kl_disconnect_event(struct ath6kl *ar, u8 reason, u8 *bssid,
                        cfg80211_del_sta(ar->net_dev, bssid, GFP_KERNEL);
                }
 
-               if (memcmp(ar->net_dev->dev_addr, bssid, ETH_ALEN) == 0)
+               if (memcmp(ar->net_dev->dev_addr, bssid, ETH_ALEN) == 0) {
+                       memset(ar->wep_key_list, 0, sizeof(ar->wep_key_list));
                        clear_bit(CONNECTED, &ar->flag);
+               }
                return;
        }