提交 ad325cb5 编写于 作者: M Michal Kazior 提交者: 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: NMichal Kazior <michal.kazior@tieto.com>
Signed-off-by: NKalle Valo <kvalo@qca.qualcomm.com>
上级 370e5673
......@@ -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.
*
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册