wlcore: set default_wep_key when configured
When associating to an AP with WEP set the default key upon association by implementing the set_deafult_key_idx op. Fixes auto-arp sent with wrong key_idx bug. Signed-off-by: Yoni Divinsky <yoni.divinsky@ti.com> Signed-off-by: Eyal Shapira <eyal@wizery.com> Signed-off-by: Eliad Peller <eliad@wizery.com> Signed-off-by: Luciano Coelho <coelho@ti.com>
This commit is contained in:

committed by
Luciano Coelho

parent
bc2ab3b850
commit
ba1e6eb96d
@@ -3196,14 +3196,6 @@ static int wl1271_set_key(struct wl1271 *wl, struct wl12xx_vif *wlvif,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* the default WEP key needs to be configured at least once */
|
|
||||||
if (key_type == KEY_WEP) {
|
|
||||||
ret = wl12xx_cmd_set_default_wep_key(wl,
|
|
||||||
wlvif->default_key,
|
|
||||||
wlvif->sta.hlid);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -3360,6 +3352,46 @@ int wlcore_set_key(struct wl1271 *wl, enum set_key_cmd cmd,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(wlcore_set_key);
|
EXPORT_SYMBOL_GPL(wlcore_set_key);
|
||||||
|
|
||||||
|
static void wl1271_op_set_default_key_idx(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif,
|
||||||
|
int key_idx)
|
||||||
|
{
|
||||||
|
struct wl1271 *wl = hw->priv;
|
||||||
|
struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
wl1271_debug(DEBUG_MAC80211, "mac80211 set default key idx %d",
|
||||||
|
key_idx);
|
||||||
|
|
||||||
|
mutex_lock(&wl->mutex);
|
||||||
|
|
||||||
|
if (unlikely(wl->state != WLCORE_STATE_ON)) {
|
||||||
|
ret = -EAGAIN;
|
||||||
|
goto out_unlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = wl1271_ps_elp_wakeup(wl);
|
||||||
|
if (ret < 0)
|
||||||
|
goto out_unlock;
|
||||||
|
|
||||||
|
wlvif->default_key = key_idx;
|
||||||
|
|
||||||
|
/* the default WEP key needs to be configured at least once */
|
||||||
|
if (wlvif->encryption_type == KEY_WEP) {
|
||||||
|
ret = wl12xx_cmd_set_default_wep_key(wl,
|
||||||
|
key_idx,
|
||||||
|
wlvif->sta.hlid);
|
||||||
|
if (ret < 0)
|
||||||
|
goto out_sleep;
|
||||||
|
}
|
||||||
|
|
||||||
|
out_sleep:
|
||||||
|
wl1271_ps_elp_sleep(wl);
|
||||||
|
|
||||||
|
out_unlock:
|
||||||
|
mutex_unlock(&wl->mutex);
|
||||||
|
}
|
||||||
|
|
||||||
void wlcore_regdomain_config(struct wl1271 *wl)
|
void wlcore_regdomain_config(struct wl1271 *wl)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
@@ -5352,6 +5384,7 @@ static const struct ieee80211_ops wl1271_ops = {
|
|||||||
.ampdu_action = wl1271_op_ampdu_action,
|
.ampdu_action = wl1271_op_ampdu_action,
|
||||||
.tx_frames_pending = wl1271_tx_frames_pending,
|
.tx_frames_pending = wl1271_tx_frames_pending,
|
||||||
.set_bitrate_mask = wl12xx_set_bitrate_mask,
|
.set_bitrate_mask = wl12xx_set_bitrate_mask,
|
||||||
|
.set_default_unicast_key = wl1271_op_set_default_key_idx,
|
||||||
.channel_switch = wl12xx_op_channel_switch,
|
.channel_switch = wl12xx_op_channel_switch,
|
||||||
.flush = wlcore_op_flush,
|
.flush = wlcore_op_flush,
|
||||||
.remain_on_channel = wlcore_op_remain_on_channel,
|
.remain_on_channel = wlcore_op_remain_on_channel,
|
||||||
|
@@ -386,7 +386,7 @@ static int wl1271_prepare_tx_frame(struct wl1271 *wl, struct wl12xx_vif *wlvif,
|
|||||||
is_wep = (cipher == WLAN_CIPHER_SUITE_WEP40) ||
|
is_wep = (cipher == WLAN_CIPHER_SUITE_WEP40) ||
|
||||||
(cipher == WLAN_CIPHER_SUITE_WEP104);
|
(cipher == WLAN_CIPHER_SUITE_WEP104);
|
||||||
|
|
||||||
if (unlikely(is_wep && wlvif->default_key != idx)) {
|
if (WARN_ON(is_wep && wlvif->default_key != idx)) {
|
||||||
ret = wl1271_set_default_wep_key(wl, wlvif, idx);
|
ret = wl1271_set_default_wep_key(wl, wlvif, idx);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
Reference in New Issue
Block a user