Skip to content

Commit

Permalink
ath10k: fix multiple key static wep with ibss
Browse files Browse the repository at this point in the history
Apparently firmware requires both pairwise and
groupwise keys to be installed per-peer for static
WEP in IBSS. This wasn't necessary for AP mode
(and installing both doesn't seem to break AP
mode thus there's no special handling).

Also there seems to be some kind of issue with
mapping tx/rx keys in firmware properly which
resulted in wrong keys being used and broken
communication between devices.

It can be argued the vdev param part is more of a
workaround than a real fix. However I couldn't
figure out how to fix this differently. It works
and isn't super ugly.

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 Apr 17, 2015
1 parent 73dc5a1 commit ce90b27
Showing 1 changed file with 28 additions and 3 deletions.
31 changes: 28 additions & 3 deletions drivers/net/wireless/ath/ath10k/mac.c
Original file line number Diff line number Diff line change
Expand Up @@ -230,9 +230,13 @@ static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
flags = 0;
flags |= WMI_KEY_PAIRWISE;

/* set TX_USAGE flag for default key id */
if (arvif->def_wep_key_idx == i)
flags |= WMI_KEY_TX_USAGE;
ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
addr, flags);
if (ret)
return ret;

flags = 0;
flags |= WMI_KEY_GROUP;

ret = ath10k_install_key(arvif, arvif->wep_keys[i], SET_KEY,
addr, flags);
Expand All @@ -244,6 +248,27 @@ static int ath10k_install_peer_wep_keys(struct ath10k_vif *arvif,
spin_unlock_bh(&ar->data_lock);
}

/* In some cases (notably with static WEP IBSS with multiple keys)
* multicast Tx becomes broken. Both pairwise and groupwise keys are
* installed already. Using WMI_KEY_TX_USAGE in different combinations
* didn't seem help. Using def_keyid vdev parameter seems to be
* effective so use that.
*
* FIXME: Revisit. Perhaps this can be done in a less hacky way.
*/
if (arvif->def_wep_key_idx == -1)
return 0;

ret = ath10k_wmi_vdev_set_param(arvif->ar,
arvif->vdev_id,
arvif->ar->wmi.vdev_param->def_keyid,
arvif->def_wep_key_idx);
if (ret) {
ath10k_warn(ar, "failed to re-set def wpa key idxon vdev %i: %d\n",
arvif->vdev_id, ret);
return ret;
}

return 0;
}

Expand Down

0 comments on commit ce90b27

Please sign in to comment.