wil6210: fix PTK re-key race
Fix a race between cfg80211 add_key call and transmitting of 4/4 EAP packet. In case the transmit is delayed until after the add key takes place, message 4/4 will be encrypted with the new key, and the receiver side (AP) will drop it due to MIC error. Wil6210 will monitor and look for the transmitted packet 4/4 eap key. In case add_key takes place before the transmission completed, then wil6210 will let the FW store the key and wil6210 will notify the FW to use the PTK key only after 4/4 eap packet transmission was completed. Signed-off-by: Ahmad Masri <amasri@codeaurora.org> Signed-off-by: Maya Erez <merez@codeaurora.org> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
@@ -373,6 +373,7 @@ static void _wil6210_disconnect_complete(struct wil6210_vif *vif,
|
||||
}
|
||||
clear_bit(wil_vif_fwconnecting, vif->status);
|
||||
clear_bit(wil_vif_ft_roam, vif->status);
|
||||
vif->ptk_rekey_state = WIL_REKEY_IDLE;
|
||||
|
||||
break;
|
||||
case NL80211_IFTYPE_AP:
|
||||
@@ -724,6 +725,8 @@ int wil_priv_init(struct wil6210_priv *wil)
|
||||
INIT_LIST_HEAD(&wil->pending_wmi_ev);
|
||||
spin_lock_init(&wil->wmi_ev_lock);
|
||||
spin_lock_init(&wil->net_queue_lock);
|
||||
spin_lock_init(&wil->eap_lock);
|
||||
|
||||
init_waitqueue_head(&wil->wq);
|
||||
init_rwsem(&wil->mem_lock);
|
||||
|
||||
@@ -1654,6 +1657,7 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
|
||||
cancel_work_sync(&vif->disconnect_worker);
|
||||
wil6210_disconnect(vif, NULL,
|
||||
WLAN_REASON_DEAUTH_LEAVING);
|
||||
vif->ptk_rekey_state = WIL_REKEY_IDLE;
|
||||
}
|
||||
}
|
||||
wil_bcast_fini_all(wil);
|
||||
|
Reference in New Issue
Block a user