diff options
Diffstat (limited to 'drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c')
| -rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | 17 | 
1 files changed, 12 insertions, 5 deletions
| diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c index c21736f80c29..af5a6dd81c41 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c @@ -272,10 +272,10 @@ static void iwl_mvm_get_signal_strength(struct iwl_mvm *mvm,  	rx_status->chain_signal[2] = S8_MIN;  } -static int iwl_mvm_rx_mgmt_crypto(struct ieee80211_sta *sta, -				  struct ieee80211_hdr *hdr, -				  struct iwl_rx_mpdu_desc *desc, -				  u32 status) +static int iwl_mvm_rx_mgmt_prot(struct ieee80211_sta *sta, +				struct ieee80211_hdr *hdr, +				struct iwl_rx_mpdu_desc *desc, +				u32 status)  {  	struct iwl_mvm_sta *mvmsta;  	struct iwl_mvm_vif *mvmvif; @@ -285,6 +285,9 @@ static int iwl_mvm_rx_mgmt_crypto(struct ieee80211_sta *sta,  	u32 len = le16_to_cpu(desc->mpdu_len);  	const u8 *frame = (void *)hdr; +	if ((status & IWL_RX_MPDU_STATUS_SEC_MASK) == IWL_RX_MPDU_STATUS_SEC_NONE) +		return 0; +  	/*  	 * For non-beacon, we don't really care. But beacons may  	 * be filtered out, and we thus need the firmware's replay @@ -356,6 +359,10 @@ static int iwl_mvm_rx_crypto(struct iwl_mvm *mvm, struct ieee80211_sta *sta,  	    IWL_RX_MPDU_STATUS_SEC_UNKNOWN && !mvm->monitor_on)  		return -1; +	if (unlikely(ieee80211_is_mgmt(hdr->frame_control) && +		     !ieee80211_has_protected(hdr->frame_control))) +		return iwl_mvm_rx_mgmt_prot(sta, hdr, desc, status); +  	if (!ieee80211_has_protected(hdr->frame_control) ||  	    (status & IWL_RX_MPDU_STATUS_SEC_MASK) ==  	    IWL_RX_MPDU_STATUS_SEC_NONE) @@ -411,7 +418,7 @@ static int iwl_mvm_rx_crypto(struct iwl_mvm *mvm, struct ieee80211_sta *sta,  		stats->flag |= RX_FLAG_DECRYPTED;  		return 0;  	case RX_MPDU_RES_STATUS_SEC_CMAC_GMAC_ENC: -		return iwl_mvm_rx_mgmt_crypto(sta, hdr, desc, status); +		break;  	default:  		/*  		 * Sometimes we can get frames that were not decrypted |