source: trunk/package/mac80211/patches/570-ath9k_mic_failure_fix.patch @ 22825

Last change on this file since 22825 was 22825, checked in by nbd, 6 years ago

ath9k: add some extra checks to the mic failure fix

File size: 2.9 KB
  • drivers/net/wireless/ath/ath.h

    a b struct ath_common { 
    119119 
    120120        u32 keymax; 
    121121        DECLARE_BITMAP(keymap, ATH_KEYMAX); 
     122        DECLARE_BITMAP(tkip_keymap, ATH_KEYMAX); 
    122123        u8 splitmic; 
    123124 
    124125        struct ath_regulatory regulatory; 
  • drivers/net/wireless/ath/ath9k/common.c

    a b int ath9k_cmn_key_config(struct ath_comm 
    366366        set_bit(idx, common->keymap); 
    367367        if (key->alg == ALG_TKIP) { 
    368368                set_bit(idx + 64, common->keymap); 
     369                set_bit(idx, common->tkip_keymap); 
     370                set_bit(idx + 64, common->tkip_keymap); 
    369371                if (common->splitmic) { 
    370372                        set_bit(idx + 32, common->keymap); 
    371373                        set_bit(idx + 64 + 32, common->keymap); 
     374                        set_bit(idx + 32, common->tkip_keymap); 
     375                        set_bit(idx + 64 + 32, common->tkip_keymap); 
    372376                } 
    373377        } 
    374378 
    void ath9k_cmn_key_delete(struct ath_com 
    393397                return; 
    394398 
    395399        clear_bit(key->hw_key_idx + 64, common->keymap); 
     400 
     401        clear_bit(key->hw_key_idx, common->tkip_keymap); 
     402        clear_bit(key->hw_key_idx + 64, common->tkip_keymap); 
     403 
    396404        if (common->splitmic) { 
    397405                ath9k_hw_keyreset(ah, key->hw_key_idx + 32); 
    398406                clear_bit(key->hw_key_idx + 32, common->keymap); 
    399407                clear_bit(key->hw_key_idx + 64 + 32, common->keymap); 
     408 
     409                clear_bit(key->hw_key_idx + 32, common->tkip_keymap); 
     410                clear_bit(key->hw_key_idx + 64 + 32, common->tkip_keymap); 
    400411        } 
    401412} 
    402413EXPORT_SYMBOL(ath9k_cmn_key_delete); 
  • drivers/net/wireless/ath/ath9k/recv.c

    a b static bool ath9k_rx_accept(struct ath_c 
    870870                if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) { 
    871871                        *decrypt_error = true; 
    872872                } else if (rx_stats->rs_status & ATH9K_RXERR_MIC) { 
    873                         if (ieee80211_is_ctl(fc)) 
    874                                 /* 
    875                                  * Sometimes, we get invalid 
    876                                  * MIC failures on valid control frames. 
    877                                  * Remove these mic errors. 
    878                                  */ 
    879                                 rx_stats->rs_status &= ~ATH9K_RXERR_MIC; 
    880                         else 
     873                        /* 
     874                         * The MIC error bit is only valid if the frame 
     875                         * is not a control frame or fragment, and it was 
     876                         * decrypted using a valid TKIP key. 
     877                         */ 
     878                        if (!ieee80211_is_ctl(fc) && 
     879                            !ieee80211_has_morefrags(fc) && 
     880                            !(le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG) && 
     881                            test_bit(rx_stats->rs_keyix, common->tkip_keymap)) 
    881882                                rxs->flag |= RX_FLAG_MMIC_ERROR; 
     883                        else 
     884                                rx_stats->rs_status &= ~ATH9K_RXERR_MIC; 
    882885                } 
    883886                /* 
    884887                 * Reject error frames with the exception of 
  • drivers/net/wireless/ath/ath9k/mac.c

    a b int ath9k_hw_rxprocdesc(struct ath_hw *a 
    711711                        rs->rs_phyerr = phyerr; 
    712712                } else if (ads.ds_rxstatus8 & AR_DecryptCRCErr) 
    713713                        rs->rs_status |= ATH9K_RXERR_DECRYPT; 
    714                 else if (ads.ds_rxstatus8 & AR_MichaelErr) 
     714                else if ((ads.ds_rxstatus8 & AR_MichaelErr) && 
     715                         rs->rs_keyix != ATH9K_RXKEYIX_INVALID) 
    715716                        rs->rs_status |= ATH9K_RXERR_MIC; 
    716717                else if (ads.ds_rxstatus8 & AR_KeyMiss) 
    717718                        rs->rs_status |= ATH9K_RXERR_DECRYPT; 
Note: See TracBrowser for help on using the repository browser.