wifi: iwlwifi: mvm: report beacon protection failures
[ Upstream commit 91380f768d7f6e3d003755defa792e9a00a1444a ]
Andrei reports that we just silently drop beacons after we
report the key counters, but never report to userspace, so
wpa_supplicant cannot send the WNM action frame. Fix that.
Fixes: b1fdc2505a
("iwlwifi: mvm: advertise BIGTK client support if available")
Reported-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Reviewed-by: Gregory Greenman <gregory.greenman@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240128084842.7d855442cdce.Iba90b26f893dc8c49bfb8be65373cd0a138af12c@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Родитель
f8ff4b4df7
Коммит
3a5d424cff
|
@ -305,6 +305,7 @@ static int iwl_mvm_rx_mgmt_prot(struct ieee80211_sta *sta,
|
|||
u32 status,
|
||||
struct ieee80211_rx_status *stats)
|
||||
{
|
||||
struct wireless_dev *wdev;
|
||||
struct iwl_mvm_sta *mvmsta;
|
||||
struct iwl_mvm_vif *mvmvif;
|
||||
u8 keyid;
|
||||
|
@ -326,9 +327,15 @@ static int iwl_mvm_rx_mgmt_prot(struct ieee80211_sta *sta,
|
|||
if (!ieee80211_is_beacon(hdr->frame_control))
|
||||
return 0;
|
||||
|
||||
if (!sta)
|
||||
return -1;
|
||||
|
||||
mvmsta = iwl_mvm_sta_from_mac80211(sta);
|
||||
mvmvif = iwl_mvm_vif_from_mac80211(mvmsta->vif);
|
||||
|
||||
/* key mismatch - will also report !MIC_OK but we shouldn't count it */
|
||||
if (!(status & IWL_RX_MPDU_STATUS_KEY_VALID))
|
||||
return -1;
|
||||
goto report;
|
||||
|
||||
/* good cases */
|
||||
if (likely(status & IWL_RX_MPDU_STATUS_MIC_OK &&
|
||||
|
@ -337,13 +344,6 @@ static int iwl_mvm_rx_mgmt_prot(struct ieee80211_sta *sta,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (!sta)
|
||||
return -1;
|
||||
|
||||
mvmsta = iwl_mvm_sta_from_mac80211(sta);
|
||||
|
||||
mvmvif = iwl_mvm_vif_from_mac80211(mvmsta->vif);
|
||||
|
||||
/*
|
||||
* both keys will have the same cipher and MIC length, use
|
||||
* whichever one is available
|
||||
|
@ -352,11 +352,11 @@ static int iwl_mvm_rx_mgmt_prot(struct ieee80211_sta *sta,
|
|||
if (!key) {
|
||||
key = rcu_dereference(mvmvif->bcn_prot.keys[1]);
|
||||
if (!key)
|
||||
return -1;
|
||||
goto report;
|
||||
}
|
||||
|
||||
if (len < key->icv_len + IEEE80211_GMAC_PN_LEN + 2)
|
||||
return -1;
|
||||
goto report;
|
||||
|
||||
/* get the real key ID */
|
||||
keyid = frame[len - key->icv_len - IEEE80211_GMAC_PN_LEN - 2];
|
||||
|
@ -370,7 +370,7 @@ static int iwl_mvm_rx_mgmt_prot(struct ieee80211_sta *sta,
|
|||
return -1;
|
||||
key = rcu_dereference(mvmvif->bcn_prot.keys[keyid - 6]);
|
||||
if (!key)
|
||||
return -1;
|
||||
goto report;
|
||||
}
|
||||
|
||||
/* Report status to mac80211 */
|
||||
|
@ -378,6 +378,10 @@ static int iwl_mvm_rx_mgmt_prot(struct ieee80211_sta *sta,
|
|||
ieee80211_key_mic_failure(key);
|
||||
else if (status & IWL_RX_MPDU_STATUS_REPLAY_ERROR)
|
||||
ieee80211_key_replay(key);
|
||||
report:
|
||||
wdev = ieee80211_vif_to_wdev(mvmsta->vif);
|
||||
if (wdev->netdev)
|
||||
cfg80211_rx_unprot_mlme_mgmt(wdev->netdev, (void *)hdr, len);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче