OSDN Git Service

ath10k: add mic bytes for pmf management packet
authorWen Gong <wgong@codeaurora.org>
Wed, 4 Sep 2019 06:33:36 +0000 (09:33 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 10 Sep 2019 13:14:29 +0000 (16:14 +0300)
For PMF case, the action,deauth,disassoc management need to encrypt
by hardware, it need to reserve 8 bytes for encryption, otherwise
the packet will be sent out with error format, then PMF case will
fail.

After add the 8 bytes, it will pass the PMF case.

Tested with QCA6174 SDIO with firmware
WLAN.RMH.4.4.1-00005-QCARMSWP-1.

Signed-off-by: Wen Gong <wgong@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/ath10k/htt_tx.c

index 2ef717f..a182c09 100644 (file)
@@ -1237,6 +1237,7 @@ static int ath10k_htt_tx_hl(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txm
        struct ath10k *ar = htt->ar;
        int res, data_len;
        struct htt_cmd_hdr *cmd_hdr;
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)msdu->data;
        struct htt_data_tx_desc *tx_desc;
        struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(msdu);
        struct sk_buff *tmp_skb;
@@ -1247,6 +1248,13 @@ static int ath10k_htt_tx_hl(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txm
        u16 flags1 = 0;
        u16 msdu_id = 0;
 
+       if ((ieee80211_is_action(hdr->frame_control) ||
+            ieee80211_is_deauth(hdr->frame_control) ||
+            ieee80211_is_disassoc(hdr->frame_control)) &&
+            ieee80211_has_protected(hdr->frame_control)) {
+               skb_put(msdu, IEEE80211_CCMP_MIC_LEN);
+       }
+
        data_len = msdu->len;
 
        switch (txmode) {