source: trunk/package/mac80211/patches/550-ath9k_mmic_verify.patch @ 27564

Last change on this file since 27564 was 27564, checked in by nbd, 5 years ago

ath9k: add more fixes for TKIP MIC validation

File size: 2.6 KB
  • drivers/net/wireless/ath/ath9k/recv.c

    a b static bool ath9k_rx_accept(struct ath_c 
    814814                            struct ath_rx_status *rx_stats, 
    815815                            bool *decrypt_error) 
    816816{ 
    817 #define is_mc_or_valid_tkip_keyix ((is_mc ||                    \ 
    818                 (rx_stats->rs_keyix != ATH9K_RXKEYIX_INVALID && \ 
    819                 test_bit(rx_stats->rs_keyix, common->tkip_keymap)))) 
    820  
     817        bool is_mc, is_valid_tkip, strip_mic, mic_error = false; 
    821818        struct ath_hw *ah = common->ah; 
    822819        __le16 fc; 
    823820        u8 rx_status_len = ah->caps.rx_status_len; 
    824821 
    825822        fc = hdr->frame_control; 
    826823 
     824        is_mc = !!is_multicast_ether_addr(hdr->addr1); 
     825        is_valid_tkip = rx_stats->rs_keyix != ATH9K_RXKEYIX_INVALID && 
     826                test_bit(rx_stats->rs_keyix, common->tkip_keymap); 
     827        strip_mic = is_valid_tkip && !(rx_stats->rs_status & 
     828                (ATH9K_RXERR_DECRYPT | ATH9K_RXERR_CRC | ATH9K_RXERR_MIC)); 
     829 
    827830        if (!rx_stats->rs_datalen) 
    828831                return false; 
    829832        /* 
    static bool ath9k_rx_accept(struct ath_c 
    850853                if (rx_stats->rs_status & ATH9K_RXERR_PHY) 
    851854                        return false; 
    852855 
    853                 if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) { 
     856                if (rx_stats->rs_status & ATH9K_RXERR_DECRYPT) 
    854857                        *decrypt_error = true; 
    855                 } else if (rx_stats->rs_status & ATH9K_RXERR_MIC) { 
    856                         bool is_mc; 
    857                         /* 
    858                          * The MIC error bit is only valid if the frame 
    859                          * is not a control frame or fragment, and it was 
    860                          * decrypted using a valid TKIP key. 
    861                          */ 
    862                         is_mc = !!is_multicast_ether_addr(hdr->addr1); 
    863858 
    864                         if (!ieee80211_is_ctl(fc) && 
    865                             !ieee80211_has_morefrags(fc) && 
    866                             !(le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG) && 
    867                             is_mc_or_valid_tkip_keyix) 
    868                                 rxs->flag |= RX_FLAG_MMIC_ERROR; 
    869                         else 
    870                                 rx_stats->rs_status &= ~ATH9K_RXERR_MIC; 
    871                 } 
    872859                /* 
    873860                 * Reject error frames with the exception of 
    874861                 * decryption and MIC failures. For monitor mode, 
    static bool ath9k_rx_accept(struct ath_c 
    886873                        } 
    887874                } 
    888875        } 
     876 
     877        /* 
     878         * For unicast frames the MIC error bit can have false positives, 
     879         * so all MIC error reports need to be validated in software. 
     880         * False negatives are not common, so skip software verification 
     881         * if the hardware considers the MIC valid. 
     882         */ 
     883        if (strip_mic) 
     884                rxs->flag |= RX_FLAG_MMIC_STRIPPED; 
     885        else if (is_mc && mic_error) 
     886                rxs->flag |= RX_FLAG_MMIC_ERROR; 
     887 
    889888        return true; 
    890889} 
    891890 
    int ath_rx_tasklet(struct ath_softc *sc, 
    18821881                        ath9k_rx_skb_postprocess(common, hdr_skb, &rs, 
    18831882                                                 rxs, decrypt_error); 
    18841883 
     1884                if (rxs->flag & RX_FLAG_MMIC_STRIPPED) 
     1885                        skb_trim(skb, skb->len - 8); 
     1886 
    18851887                /* We will now give hardware our shiny new allocated skb */ 
    18861888                bf->bf_mpdu = requeue_skb; 
    18871889                bf->bf_buf_addr = dma_map_single(sc->dev, requeue_skb->data, 
Note: See TracBrowser for help on using the repository browser.