mirror of https://gitee.com/openkylin/linux.git
ath10k: fix broken traffic for static WEP in IBSS
When WEP keys are uploaded it's possible that there are stations associated already (e.g. when merging) without any keys. Static WEP needs an explicit per-peer key upload. Make sure to re-upload wep keys if necessary. Signed-off-by: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
370e567363
commit
ad325cb528
|
@ -297,6 +297,39 @@ static int ath10k_mac_vif_sta_fix_wep_key(struct ath10k_vif *arvif)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ath10k_mac_vif_update_wep_key(struct ath10k_vif *arvif,
|
||||
struct ieee80211_key_conf *key)
|
||||
{
|
||||
struct ath10k *ar = arvif->ar;
|
||||
struct ath10k_peer *peer;
|
||||
int ret;
|
||||
|
||||
lockdep_assert_held(&ar->conf_mutex);
|
||||
|
||||
list_for_each_entry(peer, &ar->peers, list) {
|
||||
if (!memcmp(peer->addr, arvif->vif->addr, ETH_ALEN))
|
||||
continue;
|
||||
|
||||
if (!memcmp(peer->addr, arvif->bssid, ETH_ALEN))
|
||||
continue;
|
||||
|
||||
if (peer->keys[key->keyidx] == key)
|
||||
continue;
|
||||
|
||||
ath10k_dbg(ar, ATH10K_DBG_MAC, "mac vif vdev %i update key %i needs update\n",
|
||||
arvif->vdev_id, key->keyidx);
|
||||
|
||||
ret = ath10k_install_peer_wep_keys(arvif, peer->addr);
|
||||
if (ret) {
|
||||
ath10k_warn(ar, "failed to update wep keys on vdev %i for peer %pM: %d\n",
|
||||
arvif->vdev_id, peer->addr, ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*********************/
|
||||
/* General utilities */
|
||||
/*********************/
|
||||
|
@ -3967,6 +4000,14 @@ static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
|||
if (cmd == DISABLE_KEY)
|
||||
ath10k_clear_vdev_key(arvif, key);
|
||||
|
||||
/* When WEP keys are uploaded it's possible that there are
|
||||
* stations associated already (e.g. when merging) without any
|
||||
* keys. Static WEP needs an explicit per-peer key upload.
|
||||
*/
|
||||
if (vif->type == NL80211_IFTYPE_ADHOC &&
|
||||
cmd == SET_KEY)
|
||||
ath10k_mac_vif_update_wep_key(arvif, key);
|
||||
|
||||
/* 802.1x never sets the def_wep_key_idx so each set_key()
|
||||
* call changes default tx key.
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue