source: trunk/package/madwifi/patches/309-micfail_detect.patch @ 11932

Last change on this file since 11932 was 11932, checked in by nbd, 8 years ago

refresh madwifi patches

File size: 10.3 KB
  • ath/if_ath.c

    a b  
    64596459        int type; 
    64606460        u_int phyerr; 
    64616461        u_int processed = 0, early_stop = 0; 
     6462        u_int mic_fail = 0; 
    64626463 
    64636464        DPRINTF(sc, ATH_DEBUG_RX_PROC, "invoked\n"); 
    64646465process_rx_again: 
     
    65606561                        } 
    65616562                        if (rs->rs_status & HAL_RXERR_MIC) { 
    65626563                                sc->sc_stats.ast_rx_badmic++; 
    6563                                 /* 
    6564                                  * Do minimal work required to hand off 
    6565                                  * the 802.11 header for notification. 
    6566                                  */ 
    6567                                 /* XXX frag's and QoS frames */ 
    6568                                 if (len >= sizeof (struct ieee80211_frame)) { 
    6569                                         bus_dma_sync_single(sc->sc_bdev, 
    6570                                             bf->bf_skbaddr, len, 
    6571                                             BUS_DMA_FROMDEVICE); 
    6572 #if 0 
    6573 /* XXX revalidate MIC, lookup ni to find VAP */ 
    6574                                         ieee80211_notify_michael_failure(ic, 
    6575                                             (struct ieee80211_frame *)skb->data, 
    6576                                             sc->sc_splitmic ? 
    6577                                                 rs->rs_keyix - 32 : rs->rs_keyix 
    6578                                         ); 
    6579 #endif 
    6580                                 } 
     6564                                mic_fail = 1; 
     6565                                goto rx_accept; 
    65816566                        } 
    65826567                        /* 
    65836568                         * Reject error frames if we have no vaps that 
     
    66166601                /* 
    66176602                 * Finished monitor mode handling, now reject 
    66186603                 * error frames before passing to other vaps 
     6604                 * Ignore MIC failures here, as we need to recheck them 
    66196605                 */ 
    6620                 if (rs->rs_status != 0) { 
     6606                if (rs->rs_status & ~(HAL_RXERR_MIC | HAL_RXERR_DECRYPT)) { 
    66216607                        ieee80211_dev_kfree_skb(&skb); 
    66226608                        goto rx_next; 
    66236609                } 
     
    66256611                /* remove the CRC */ 
    66266612                skb_trim(skb, skb->len - IEEE80211_CRC_LEN); 
    66276613 
     6614                if (mic_fail) { 
     6615                        /* Ignore control frames which are reported with mic error */ 
     6616                    if ((((struct ieee80211_frame *)skb->data)->i_fc[0] & 
     6617                                        IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) 
     6618                                goto drop_micfail; 
     6619 
     6620                        ni = ieee80211_find_rxnode(ic, (const struct ieee80211_frame_min *) skb->data); 
     6621 
     6622                        if (ni && ni->ni_table) { 
     6623                                ieee80211_check_mic(ni, skb); 
     6624                                ieee80211_unref_node(&ni); 
     6625                        } 
     6626 
     6627drop_micfail: 
     6628                        dev_kfree_skb_any(skb); 
     6629                        skb = NULL; 
     6630                        mic_fail = 0; 
     6631                        goto rx_next; 
     6632                } 
     6633 
    66286634                /* 
    66296635                 * From this point on we assume the frame is at least 
    66306636                 * as large as ieee80211_frame_min; verify that. 
     
    66376643                        goto rx_next; 
    66386644                } 
    66396645 
     6646                /* MIC failure. Drop the packet in any case */ 
    66406647                /* 
    66416648                 * Normal receive. 
    66426649                 */ 
  • net80211/ieee80211_crypto_ccmp.c

    a b  
    7373static int ccmp_encap(struct ieee80211_key *, struct sk_buff *, u_int8_t); 
    7474static int ccmp_decap(struct ieee80211_key *, struct sk_buff *, int); 
    7575static int ccmp_enmic(struct ieee80211_key *, struct sk_buff *, int); 
    76 static int ccmp_demic(struct ieee80211_key *, struct sk_buff *, int); 
     76static int ccmp_demic(struct ieee80211_key *, struct sk_buff *, int, int); 
    7777 
    7878static const struct ieee80211_cipher ccmp = { 
    7979        .ic_name        = "AES-CCM", 
     
    308308 * Verify and strip MIC from the frame. 
    309309 */ 
    310310static int 
    311 ccmp_demic(struct ieee80211_key *k, struct sk_buff *skb, int hdrlen) 
     311ccmp_demic(struct ieee80211_key *k, struct sk_buff *skb, int hdrlen, int force) 
    312312{ 
    313313        return 1; 
    314314} 
  • net80211/ieee80211_crypto.h

    a b  
    145145        int (*ic_encap)(struct ieee80211_key *, struct sk_buff *, u_int8_t); 
    146146        int (*ic_decap)(struct ieee80211_key *, struct sk_buff *, int); 
    147147        int (*ic_enmic)(struct ieee80211_key *, struct sk_buff *, int); 
    148         int (*ic_demic)(struct ieee80211_key *, struct sk_buff *, int); 
     148        int (*ic_demic)(struct ieee80211_key *, struct sk_buff *, int, int); 
    149149}; 
    150150extern const struct ieee80211_cipher ieee80211_cipher_none; 
    151151 
     
    163163 */ 
    164164static __inline int 
    165165ieee80211_crypto_demic(struct ieee80211vap *vap, struct ieee80211_key *k, 
    166         struct sk_buff *skb, int hdrlen) 
     166        struct sk_buff *skb, int hdrlen, int force) 
    167167{ 
    168168        const struct ieee80211_cipher *cip = k->wk_cipher; 
    169         return (cip->ic_miclen > 0 ? cip->ic_demic(k, skb, hdrlen) : 1); 
     169        return (cip->ic_miclen > 0 ? cip->ic_demic(k, skb, hdrlen, force) : 1); 
    170170} 
    171171 
    172172/* 
  • net80211/ieee80211_crypto_none.c

    a b  
    5252static int none_encap(struct ieee80211_key *, struct sk_buff *, u_int8_t); 
    5353static int none_decap(struct ieee80211_key *, struct sk_buff *, int); 
    5454static int none_enmic(struct ieee80211_key *, struct sk_buff *, int); 
    55 static int none_demic(struct ieee80211_key *, struct sk_buff *, int); 
     55static int none_demic(struct ieee80211_key *, struct sk_buff *, int, int); 
    5656 
    5757const struct ieee80211_cipher ieee80211_cipher_none = { 
    5858        .ic_name        = "NONE", 
     
    137137} 
    138138 
    139139static int 
    140 none_demic(struct ieee80211_key *k, struct sk_buff *skb, int hdrlen) 
     140none_demic(struct ieee80211_key *k, struct sk_buff *skb, int hdrlen, int force) 
    141141{ 
    142142        struct ieee80211vap *vap = k->wk_private; 
    143143 
  • net80211/ieee80211_crypto_tkip.c

    a b  
    5757static int tkip_encap(struct ieee80211_key *, struct sk_buff *, u_int8_t); 
    5858static int tkip_enmic(struct ieee80211_key *, struct sk_buff *, int); 
    5959static int tkip_decap(struct ieee80211_key *, struct sk_buff *, int); 
    60 static int tkip_demic(struct ieee80211_key *, struct sk_buff *, int); 
     60static int tkip_demic(struct ieee80211_key *, struct sk_buff *, int, int); 
    6161 
    6262static const struct ieee80211_cipher tkip  = { 
    6363        .ic_name        = "TKIP", 
     
    339339 * Verify and strip MIC from the frame. 
    340340 */ 
    341341static int 
    342 tkip_demic(struct ieee80211_key *k, struct sk_buff *skb0, int hdrlen) 
     342tkip_demic(struct ieee80211_key *k, struct sk_buff *skb0, int hdrlen, int force) 
    343343{ 
    344344        struct tkip_ctx *ctx = k->wk_private; 
    345345        struct sk_buff *skb; 
     
    355355        } 
    356356        wh = (struct ieee80211_frame *) skb0->data; 
    357357        /* NB: skb left pointing at last in chain */ 
    358         if (k->wk_flags & IEEE80211_KEY_SWMIC) { 
     358        if ((k->wk_flags & IEEE80211_KEY_SWMIC) || force) { 
    359359                struct ieee80211vap *vap = ctx->tc_vap; 
    360360                u8 mic[IEEE80211_WEP_MICLEN]; 
    361361                u8 mic0[IEEE80211_WEP_MICLEN]; 
  • net80211/ieee80211_crypto_wep.c

    a b  
    5454static int wep_encap(struct ieee80211_key *, struct sk_buff *, u_int8_t); 
    5555static int wep_decap(struct ieee80211_key *, struct sk_buff *, int); 
    5656static int wep_enmic(struct ieee80211_key *, struct sk_buff *, int); 
    57 static int wep_demic(struct ieee80211_key *, struct sk_buff *, int); 
     57static int wep_demic(struct ieee80211_key *, struct sk_buff *, int, int); 
    5858 
    5959static const struct ieee80211_cipher wep = { 
    6060        .ic_name        = "WEP", 
     
    244244 * Verify and strip MIC from the frame. 
    245245 */ 
    246246static int 
    247 wep_demic(struct ieee80211_key *k, struct sk_buff *skb, int hdrlen) 
     247wep_demic(struct ieee80211_key *k, struct sk_buff *skb, int hdrlen, int force) 
    248248{ 
    249249        return 1; 
    250250} 
  • net80211/ieee80211_input.c

    a b  
    669669                 * Next strip any MSDU crypto bits. 
    670670                 */ 
    671671                if (key != NULL && 
    672                     !ieee80211_crypto_demic(vap, key, skb, hdrspace)) { 
     672                    !ieee80211_crypto_demic(vap, key, skb, hdrspace, 0)) { 
    673673                        IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT, 
    674674                                ni->ni_macaddr, "data", "%s", "demic error"); 
    675675                        IEEE80211_NODE_STAT(ni, rx_demicfail); 
     
    42934293} 
    42944294#endif 
    42954295 
     4296/* 
     4297 * Process a frame w/ hw detected MIC failure. 
     4298 * The frame will be dropped in any case. 
     4299 */ 
     4300void 
     4301ieee80211_check_mic(struct ieee80211_node *ni, struct sk_buff *skb) 
     4302{ 
     4303        struct ieee80211vap *vap = ni->ni_vap; 
     4304 
     4305        struct ieee80211_frame *wh; 
     4306        struct ieee80211_key *key; 
     4307        int hdrspace; 
     4308        struct ieee80211com *ic = vap->iv_ic; 
     4309 
     4310        if (skb->len < sizeof(struct ieee80211_frame_min)) { 
     4311                IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY, 
     4312                    ni->ni_macaddr, NULL, 
     4313                    "too short (1): len %u", skb->len); 
     4314                vap->iv_stats.is_rx_tooshort++; 
     4315                return; 
     4316        } 
     4317 
     4318        wh = (struct ieee80211_frame *)skb->data; 
     4319 
     4320        hdrspace = ieee80211_hdrspace(ic, wh); 
     4321        key = ieee80211_crypto_decap(ni, skb, hdrspace); 
     4322        if (key == NULL) { 
     4323                /* NB: stats+msgs handled in crypto_decap */ 
     4324                IEEE80211_NODE_STAT(ni, rx_wepfail); 
     4325                return; 
     4326        } 
     4327 
     4328        if (!ieee80211_crypto_demic(vap, key, skb, hdrspace, 1)) { 
     4329                IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT, 
     4330                        ni->ni_macaddr, "data", "%s", "demic error"); 
     4331                        IEEE80211_NODE_STAT(ni, rx_demicfail); 
     4332        } 
     4333        return; 
     4334} 
     4335EXPORT_SYMBOL(ieee80211_check_mic); 
     4336 
    42964337#ifdef IEEE80211_DEBUG 
    42974338/* 
    42984339 * Debugging support. 
  • net80211/ieee80211_proto.h

    a b  
    9090void ieee80211_set11gbasicrates(struct ieee80211_rateset *, enum ieee80211_phymode); 
    9191enum ieee80211_phymode ieee80211_get11gbasicrates(struct ieee80211_rateset *); 
    9292void ieee80211_send_pspoll(struct ieee80211_node *); 
     93void ieee80211_check_mic(struct ieee80211_node *, struct sk_buff *); 
    9394 
    9495/* 
    9596 * Return the size of the 802.11 header for a management or data frame. 
  • net80211/ieee80211_linux.c

    a b  
    337337        /* TODO: needed parameters: count, keyid, key type, src address, TSC */ 
    338338        snprintf(buf, sizeof(buf), "%s(keyid=%d %scast addr=" MAC_FMT ")", tag, 
    339339                k->wk_keyix, 
    340                 IEEE80211_IS_MULTICAST(wh->i_addr1) ?  "broad" : "uni", 
    341                 MAC_ADDR(wh->i_addr1)); 
     340                IEEE80211_IS_MULTICAST(wh->i_addr2) ?  "broad" : "uni", 
     341                MAC_ADDR(wh->i_addr2)); 
    342342        memset(&wrqu, 0, sizeof(wrqu)); 
    343343        wrqu.data.length = strlen(buf); 
    344344        wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); 
  • net80211/ieee80211_output.c

    a b  
    10741074                        cip = (struct ieee80211_cipher *) key->wk_cipher; 
    10751075                        ciphdrsize = cip->ic_header; 
    10761076                        tailsize += (cip->ic_trailer + cip->ic_miclen); 
     1077 
     1078                        /* add the 8 bytes MIC length */ 
     1079                        if (cip->ic_cipher == IEEE80211_CIPHER_TKIP) 
     1080                                pktlen += IEEE80211_WEP_MICLEN; 
    10771081                } 
    10781082 
    10791083                pdusize = vap->iv_fragthreshold - (hdrsize_nopad + ciphdrsize); 
    10801084                fragcnt = *framecnt = 
    1081                         ((pktlen - (hdrsize_nopad + ciphdrsize)) / pdusize) + 
    1082                         (((pktlen - (hdrsize_nopad + ciphdrsize)) % 
    1083                                 pdusize == 0) ? 0 : 1); 
     1085                        ((pktlen - hdrsize_nopad) / pdusize) + 
     1086                        (((pktlen - hdrsize_nopad) % pdusize == 0) ? 0 : 1); 
    10841087 
    10851088                /* 
    10861089                 * Allocate sk_buff for each subsequent fragment; First fragment 
  • net80211/ieee80211_node.c

    a b  
    22642264        /* From this point onwards we can no longer find the node, 
    22652265         * so no more references are generated 
    22662266         */ 
    2267         ieee80211_remove_wds_addr(nt, ni->ni_macaddr); 
    2268         ieee80211_del_wds_node(nt, ni); 
    2269         IEEE80211_NODE_TABLE_LOCK_IRQ(nt); 
    2270         node_table_leave_locked(nt, ni); 
    2271         IEEE80211_NODE_TABLE_UNLOCK_IRQ(nt); 
     2267        if (nt) { 
     2268                ieee80211_remove_wds_addr(nt, ni->ni_macaddr); 
     2269                ieee80211_del_wds_node(nt, ni); 
     2270                IEEE80211_NODE_TABLE_LOCK_IRQ(nt); 
     2271                node_table_leave_locked(nt, ni); 
     2272                IEEE80211_NODE_TABLE_UNLOCK_IRQ(nt); 
     2273        } 
    22722274 
    22732275        /* 
    22742276         * If node wasn't previously associated all 
Note: See TracBrowser for help on using the repository browser.