Commit 8674d909 authored by Michal Kazior's avatar Michal Kazior Committed by Kalle Valo

ath10k: split ap/ibss wep key install process

Apparently it's not safe to install both pairwise
and groupwise keys on AP vdevs as it can cause
traffic to stop working in some multi-vif
(WPA+WEP) cases.

Fixes: ce90b271 ("ath10k: fix multiple key static wep with ibss")
Signed-off-by: default avatarMichal Kazior <michal.kazior@tieto.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent 9c8fb548
...@@ -247,6 +247,10 @@ static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif, ...@@ -247,6 +247,10 @@ static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
lockdep_assert_held(&ar->conf_mutex); lockdep_assert_held(&ar->conf_mutex);
if (WARN_ON(arvif->vif->type != NL80211_IFTYPE_AP &&
arvif->vif->type != NL80211_IFTYPE_ADHOC))
return -EINVAL;
spin_lock_bh(&ar->data_lock); spin_lock_bh(&ar->data_lock);
peer = ath10k_peer_find(ar, arvif->vdev_id, addr); peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
spin_unlock_bh(&ar->data_lock); spin_unlock_bh(&ar->data_lock);
...@@ -258,21 +262,34 @@ static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif, ...@@ -258,21 +262,34 @@ static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
if (arvif->wep_keys[i] == NULL) if (arvif->wep_keys[i] == NULL)
continue; continue;
flags = 0; switch (arvif->vif->type) {
flags |= WMI_KEY_PAIRWISE; case NL80211_IFTYPE_AP:
flags = WMI_KEY_PAIRWISE;
if (arvif->def_wep_key_idx == i)
flags |= WMI_KEY_TX_USAGE;
ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY, ret = ath10k_install_key(arvif, arvif->wep_keys[i],
addr, flags); SET_KEY, addr, flags);
if (ret < 0)
return ret;
break;
case NL80211_IFTYPE_ADHOC:
ret = ath10k_install_key(arvif, arvif->wep_keys[i],
SET_KEY, addr,
WMI_KEY_PAIRWISE);
if (ret < 0) if (ret < 0)
return ret; return ret;
flags = 0; ret = ath10k_install_key(arvif, arvif->wep_keys[i],
flags |= WMI_KEY_GROUP; SET_KEY, addr, WMI_KEY_GROUP);
ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
addr, flags);
if (ret < 0) if (ret < 0)
return ret; return ret;
break;
default:
WARN_ON(1);
return -EINVAL;
}
spin_lock_bh(&ar->data_lock); spin_lock_bh(&ar->data_lock);
peer->keys[i] = arvif->wep_keys[i]; peer->keys[i] = arvif->wep_keys[i];
...@@ -287,6 +304,9 @@ static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif, ...@@ -287,6 +304,9 @@ static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
* *
* FIXME: Revisit. Perhaps this can be done in a less hacky way. * FIXME: Revisit. Perhaps this can be done in a less hacky way.
*/ */
if (arvif->vif->type != NL80211_IFTYPE_ADHOC)
return 0;
if (arvif->def_wep_key_idx == -1) if (arvif->def_wep_key_idx == -1)
return 0; return 0;
......
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