Commit ad325cb5 authored by Michal Kazior's avatar Michal Kazior Committed by Kalle Valo

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: default avatarMichal Kazior <michal.kazior@tieto.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 370e5673
...@@ -297,6 +297,39 @@ static int ath10k_mac_vif_sta_fix_wep_key(struct ath10k_vif *arvif) ...@@ -297,6 +297,39 @@ static int ath10k_mac_vif_sta_fix_wep_key(struct ath10k_vif *arvif)
return 0; 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 */ /* General utilities */
/*********************/ /*********************/
...@@ -3967,6 +4000,14 @@ static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, ...@@ -3967,6 +4000,14 @@ static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
if (cmd == DISABLE_KEY) if (cmd == DISABLE_KEY)
ath10k_clear_vdev_key(arvif, 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() /* 802.1x never sets the def_wep_key_idx so each set_key()
* call changes default tx key. * call changes default tx key.
* *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment