mac80211: allow not sending MIC up from driver for HW crypto
When HW crypto is used, there's no need for the CCMP/GCMP MIC to be available to mac80211, and the hardware might have removed it already after checking. The MIC is also useless to have when the frame is already decrypted, so allow indicating that it's not present. Since we are running out of bits in mac80211_rx_flags, make the flags field a u64. Signed-off-by: Sara Sharon <sara.sharon@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:

committed by
Johannes Berg

parent
162dd6a725
commit
f980ebc058
@@ -2724,8 +2724,9 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
|
||||
|
||||
rate = cfg80211_calculate_bitrate(&ri);
|
||||
if (WARN_ONCE(!rate,
|
||||
"Invalid bitrate: flags=0x%x, idx=%d, vht_nss=%d\n",
|
||||
status->flag, status->rate_idx, status->vht_nss))
|
||||
"Invalid bitrate: flags=0x%llx, idx=%d, vht_nss=%d\n",
|
||||
(unsigned long long)status->flag, status->rate_idx,
|
||||
status->vht_nss))
|
||||
return 0;
|
||||
|
||||
/* rewind from end of MPDU */
|
||||
|
@@ -504,18 +504,20 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx,
|
||||
!ieee80211_is_robust_mgmt_frame(skb))
|
||||
return RX_CONTINUE;
|
||||
|
||||
data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN - mic_len;
|
||||
if (!rx->sta || data_len < 0)
|
||||
return RX_DROP_UNUSABLE;
|
||||
|
||||
if (status->flag & RX_FLAG_DECRYPTED) {
|
||||
if (!pskb_may_pull(rx->skb, hdrlen + IEEE80211_CCMP_HDR_LEN))
|
||||
return RX_DROP_UNUSABLE;
|
||||
if (status->flag & RX_FLAG_MIC_STRIPPED)
|
||||
mic_len = 0;
|
||||
} else {
|
||||
if (skb_linearize(rx->skb))
|
||||
return RX_DROP_UNUSABLE;
|
||||
}
|
||||
|
||||
data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN - mic_len;
|
||||
if (!rx->sta || data_len < 0)
|
||||
return RX_DROP_UNUSABLE;
|
||||
|
||||
if (!(status->flag & RX_FLAG_PN_VALIDATED)) {
|
||||
ccmp_hdr2pn(pn, skb->data + hdrlen);
|
||||
|
||||
@@ -720,8 +722,7 @@ ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx)
|
||||
struct sk_buff *skb = rx->skb;
|
||||
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
|
||||
u8 pn[IEEE80211_GCMP_PN_LEN];
|
||||
int data_len;
|
||||
int queue;
|
||||
int data_len, queue, mic_len = IEEE80211_GCMP_MIC_LEN;
|
||||
|
||||
hdrlen = ieee80211_hdrlen(hdr->frame_control);
|
||||
|
||||
@@ -729,19 +730,20 @@ ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx)
|
||||
!ieee80211_is_robust_mgmt_frame(skb))
|
||||
return RX_CONTINUE;
|
||||
|
||||
data_len = skb->len - hdrlen - IEEE80211_GCMP_HDR_LEN -
|
||||
IEEE80211_GCMP_MIC_LEN;
|
||||
if (!rx->sta || data_len < 0)
|
||||
return RX_DROP_UNUSABLE;
|
||||
|
||||
if (status->flag & RX_FLAG_DECRYPTED) {
|
||||
if (!pskb_may_pull(rx->skb, hdrlen + IEEE80211_GCMP_HDR_LEN))
|
||||
return RX_DROP_UNUSABLE;
|
||||
if (status->flag & RX_FLAG_MIC_STRIPPED)
|
||||
mic_len = 0;
|
||||
} else {
|
||||
if (skb_linearize(rx->skb))
|
||||
return RX_DROP_UNUSABLE;
|
||||
}
|
||||
|
||||
data_len = skb->len - hdrlen - IEEE80211_GCMP_HDR_LEN - mic_len;
|
||||
if (!rx->sta || data_len < 0)
|
||||
return RX_DROP_UNUSABLE;
|
||||
|
||||
if (!(status->flag & RX_FLAG_PN_VALIDATED)) {
|
||||
gcmp_hdr2pn(pn, skb->data + hdrlen);
|
||||
|
||||
@@ -772,7 +774,7 @@ ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx)
|
||||
}
|
||||
|
||||
/* Remove GCMP header and MIC */
|
||||
if (pskb_trim(skb, skb->len - IEEE80211_GCMP_MIC_LEN))
|
||||
if (pskb_trim(skb, skb->len - mic_len))
|
||||
return RX_DROP_UNUSABLE;
|
||||
memmove(skb->data + IEEE80211_GCMP_HDR_LEN, skb->data, hdrlen);
|
||||
skb_pull(skb, IEEE80211_GCMP_HDR_LEN);
|
||||
|
Reference in New Issue
Block a user