Skip to content

Commit

Permalink
ath10k: split ap/ibss wep key install process
Browse files Browse the repository at this point in the history
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: ce90b27 ("ath10k: fix multiple key static wep with ibss")
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
  • Loading branch information
Michal Kazior authored and Kalle Valo committed Aug 17, 2015
1 parent 9c8fb54 commit 8674d90
Showing 1 changed file with 32 additions and 12 deletions.
44 changes: 32 additions & 12 deletions drivers/net/wireless/ath/ath10k/mac.c
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,10 @@ static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,

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);
peer = ath10k_peer_find(ar, arvif->vdev_id, addr);
spin_unlock_bh(&ar->data_lock);
Expand All @@ -258,21 +262,34 @@ static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
if (arvif->wep_keys[i] == NULL)
continue;

flags = 0;
flags |= WMI_KEY_PAIRWISE;
switch (arvif->vif->type) {
case NL80211_IFTYPE_AP:
flags = WMI_KEY_PAIRWISE;

ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
addr, flags);
if (ret < 0)
return ret;
if (arvif->def_wep_key_idx == i)
flags |= WMI_KEY_TX_USAGE;

flags = 0;
flags |= WMI_KEY_GROUP;
ret = ath10k_install_key(arvif, arvif->wep_keys[i],
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)
return ret;

ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
addr, flags);
if (ret < 0)
return ret;
ret = ath10k_install_key(arvif, arvif->wep_keys[i],
SET_KEY, addr, WMI_KEY_GROUP);
if (ret < 0)
return ret;
break;
default:
WARN_ON(1);
return -EINVAL;
}

spin_lock_bh(&ar->data_lock);
peer->keys[i] = arvif->wep_keys[i];
Expand All @@ -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.
*/
if (arvif->vif->type != NL80211_IFTYPE_ADHOC)
return 0;

if (arvif->def_wep_key_idx == -1)
return 0;

Expand Down

0 comments on commit 8674d90

Please sign in to comment.