X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/8c89eaecce01e502dabf7610d29e2a2016d8238a..978a0e3a4c1b9ce21f6c87040498bdca51be276f:/package/madwifi/patches/309-micfail_detect.patch diff --git a/package/madwifi/patches/309-micfail_detect.patch b/package/madwifi/patches/309-micfail_detect.patch index a482a823f..c1b622442 100644 --- a/package/madwifi/patches/309-micfail_detect.patch +++ b/package/madwifi/patches/309-micfail_detect.patch @@ -1,16 +1,16 @@ -Index: madwifi-ng-r2420-20070602/ath/if_ath.c +Index: madwifi-dfs-r3246/ath/if_ath.c =================================================================== ---- madwifi-ng-r2420-20070602.orig/ath/if_ath.c 2007-06-30 23:52:00.743038750 +0200 -+++ madwifi-ng-r2420-20070602/ath/if_ath.c 2007-07-01 00:12:19.127183000 +0200 -@@ -5602,6 +5602,7 @@ +--- madwifi-dfs-r3246.orig/ath/if_ath.c 2008-01-25 16:33:11.528293596 +0100 ++++ madwifi-dfs-r3246/ath/if_ath.c 2008-01-25 16:36:40.024175098 +0100 +@@ -6393,6 +6393,7 @@ u_int phyerr; u_int processed = 0, early_stop = 0; u_int rx_limit = dev->quota; + u_int mic_fail = 0; - /* Let the 802.11 layer know about the new noise floor */ - sc->sc_channoise = ath_hal_get_channel_noise(ah, &(sc->sc_curchan)); -@@ -5696,25 +5697,7 @@ + DPRINTF(sc, ATH_DEBUG_RX_PROC, "%s\n", __func__); + process_rx_again: +@@ -6492,24 +6493,8 @@ } if (rs->rs_status & HAL_RXERR_MIC) { sc->sc_stats.ast_rx_badmic++; @@ -19,7 +19,6 @@ Index: madwifi-ng-r2420-20070602/ath/if_ath.c - * the 802.11 header for notification. - */ - /* XXX frag's and QoS frames */ -- len = rs->rs_datalen; - if (len >= sizeof (struct ieee80211_frame)) { - bus_dma_sync_single(sc->sc_bdev, - bf->bf_skbaddr, len, @@ -27,17 +26,18 @@ Index: madwifi-ng-r2420-20070602/ath/if_ath.c -#if 0 -/* XXX revalidate MIC, lookup ni to find VAP */ - ieee80211_notify_michael_failure(ic, -- (struct ieee80211_frame *) skb->data, +- (struct ieee80211_frame *)skb->data, - sc->sc_splitmic ? - rs->rs_keyix - 32 : rs->rs_keyix - ); -#endif - } + mic_fail = 1; ++ goto rx_accept; } /* - * Reject error frames if we have no vaps that -@@ -5772,8 +5755,9 @@ + * Reject error frames if we have no vaps that +@@ -6562,8 +6547,9 @@ /* * Finished monitor mode handling, now reject * error frames before passing to other vaps @@ -45,18 +45,17 @@ Index: madwifi-ng-r2420-20070602/ath/if_ath.c */ - if (rs->rs_status != 0) { + if (rs->rs_status & ~(HAL_RXERR_MIC | HAL_RXERR_DECRYPT)) { - dev_kfree_skb(skb); - skb = NULL; + ieee80211_dev_kfree_skb(&skb); goto rx_next; -@@ -5804,6 +5788,27 @@ - sc->sc_hwmap[rs->rs_rate].ieeerate, - rs->rs_rssi); + } +@@ -6571,6 +6557,26 @@ + /* remove the CRC */ + skb_trim(skb, skb->len - IEEE80211_CRC_LEN); -+ /* MIC failure. Drop the packet in any case */ + if (mic_fail) { + /* Ignore control frames which are reported with mic error */ + if ((((struct ieee80211_frame *)skb->data)->i_fc[0] & -+ IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) ++ IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) + goto drop_micfail; + + ni = ieee80211_find_rxnode(ic, (const struct ieee80211_frame_min *) skb->data); @@ -71,16 +70,24 @@ Index: madwifi-ng-r2420-20070602/ath/if_ath.c + skb = NULL; + mic_fail = 0; + goto rx_next; -+ } ++ } + /* - * Locate the node for sender, track state, and then - * pass the (referenced) node up to the 802.11 layer -Index: madwifi-ng-r2420-20070602/net80211/ieee80211_crypto_ccmp.c + * From this point on we assume the frame is at least + * as large as ieee80211_frame_min; verify that. +@@ -6583,6 +6589,7 @@ + goto rx_next; + } + ++ /* MIC failure. Drop the packet in any case */ + /* + * Normal receive. + */ +Index: madwifi-dfs-r3246/net80211/ieee80211_crypto_ccmp.c =================================================================== ---- madwifi-ng-r2420-20070602.orig/net80211/ieee80211_crypto_ccmp.c 2007-06-30 23:52:00.042995000 +0200 -+++ madwifi-ng-r2420-20070602/net80211/ieee80211_crypto_ccmp.c 2007-06-30 23:52:00.999054750 +0200 -@@ -78,7 +78,7 @@ +--- madwifi-dfs-r3246.orig/net80211/ieee80211_crypto_ccmp.c 2008-01-25 16:28:31.292323859 +0100 ++++ madwifi-dfs-r3246/net80211/ieee80211_crypto_ccmp.c 2008-01-25 16:36:01.926004007 +0100 +@@ -73,7 +73,7 @@ static int ccmp_encap(struct ieee80211_key *, struct sk_buff *, u_int8_t); static int ccmp_decap(struct ieee80211_key *, struct sk_buff *, int); static int ccmp_enmic(struct ieee80211_key *, struct sk_buff *, int); @@ -89,7 +96,7 @@ Index: madwifi-ng-r2420-20070602/net80211/ieee80211_crypto_ccmp.c static const struct ieee80211_cipher ccmp = { .ic_name = "AES-CCM", -@@ -304,7 +304,7 @@ +@@ -308,7 +308,7 @@ * Verify and strip MIC from the frame. */ static int @@ -98,10 +105,10 @@ Index: madwifi-ng-r2420-20070602/net80211/ieee80211_crypto_ccmp.c { return 1; } -Index: madwifi-ng-r2420-20070602/net80211/ieee80211_crypto.h +Index: madwifi-dfs-r3246/net80211/ieee80211_crypto.h =================================================================== ---- madwifi-ng-r2420-20070602.orig/net80211/ieee80211_crypto.h 2007-06-30 23:51:53.942613750 +0200 -+++ madwifi-ng-r2420-20070602/net80211/ieee80211_crypto.h 2007-06-30 23:52:01.107061500 +0200 +--- madwifi-dfs-r3246.orig/net80211/ieee80211_crypto.h 2008-01-25 16:27:28.000000000 +0100 ++++ madwifi-dfs-r3246/net80211/ieee80211_crypto.h 2008-01-25 16:36:01.926004007 +0100 @@ -145,7 +145,7 @@ int (*ic_encap)(struct ieee80211_key *, struct sk_buff *, u_int8_t); int (*ic_decap)(struct ieee80211_key *, struct sk_buff *, int); @@ -124,10 +131,10 @@ Index: madwifi-ng-r2420-20070602/net80211/ieee80211_crypto.h } /* -Index: madwifi-ng-r2420-20070602/net80211/ieee80211_crypto_none.c +Index: madwifi-dfs-r3246/net80211/ieee80211_crypto_none.c =================================================================== ---- madwifi-ng-r2420-20070602.orig/net80211/ieee80211_crypto_none.c 2007-06-30 23:51:53.950614250 +0200 -+++ madwifi-ng-r2420-20070602/net80211/ieee80211_crypto_none.c 2007-06-30 23:52:01.171065500 +0200 +--- madwifi-dfs-r3246.orig/net80211/ieee80211_crypto_none.c 2008-01-25 16:27:28.000000000 +0100 ++++ madwifi-dfs-r3246/net80211/ieee80211_crypto_none.c 2008-01-25 16:36:01.926004007 +0100 @@ -52,7 +52,7 @@ static int none_encap(struct ieee80211_key *, struct sk_buff *, u_int8_t); static int none_decap(struct ieee80211_key *, struct sk_buff *, int); @@ -146,10 +153,10 @@ Index: madwifi-ng-r2420-20070602/net80211/ieee80211_crypto_none.c { struct ieee80211vap *vap = k->wk_private; -Index: madwifi-ng-r2420-20070602/net80211/ieee80211_crypto_tkip.c +Index: madwifi-dfs-r3246/net80211/ieee80211_crypto_tkip.c =================================================================== ---- madwifi-ng-r2420-20070602.orig/net80211/ieee80211_crypto_tkip.c 2007-06-30 23:51:53.958614750 +0200 -+++ madwifi-ng-r2420-20070602/net80211/ieee80211_crypto_tkip.c 2007-06-30 23:52:01.203067500 +0200 +--- madwifi-dfs-r3246.orig/net80211/ieee80211_crypto_tkip.c 2008-01-25 16:27:28.000000000 +0100 ++++ madwifi-dfs-r3246/net80211/ieee80211_crypto_tkip.c 2008-01-25 16:36:01.930004236 +0100 @@ -57,7 +57,7 @@ static int tkip_encap(struct ieee80211_key *, struct sk_buff *, u_int8_t); static int tkip_enmic(struct ieee80211_key *, struct sk_buff *, int); @@ -177,10 +184,10 @@ Index: madwifi-ng-r2420-20070602/net80211/ieee80211_crypto_tkip.c struct ieee80211vap *vap = ctx->tc_vap; u8 mic[IEEE80211_WEP_MICLEN]; u8 mic0[IEEE80211_WEP_MICLEN]; -Index: madwifi-ng-r2420-20070602/net80211/ieee80211_crypto_wep.c +Index: madwifi-dfs-r3246/net80211/ieee80211_crypto_wep.c =================================================================== ---- madwifi-ng-r2420-20070602.orig/net80211/ieee80211_crypto_wep.c 2007-06-30 23:51:53.966615250 +0200 -+++ madwifi-ng-r2420-20070602/net80211/ieee80211_crypto_wep.c 2007-06-30 23:52:01.211068000 +0200 +--- madwifi-dfs-r3246.orig/net80211/ieee80211_crypto_wep.c 2008-01-25 16:27:28.000000000 +0100 ++++ madwifi-dfs-r3246/net80211/ieee80211_crypto_wep.c 2008-01-25 16:36:01.930004236 +0100 @@ -54,7 +54,7 @@ static int wep_encap(struct ieee80211_key *, struct sk_buff *, u_int8_t); static int wep_decap(struct ieee80211_key *, struct sk_buff *, int); @@ -199,11 +206,11 @@ Index: madwifi-ng-r2420-20070602/net80211/ieee80211_crypto_wep.c { return 1; } -Index: madwifi-ng-r2420-20070602/net80211/ieee80211_input.c +Index: madwifi-dfs-r3246/net80211/ieee80211_input.c =================================================================== ---- madwifi-ng-r2420-20070602.orig/net80211/ieee80211_input.c 2007-06-30 23:52:00.799042250 +0200 -+++ madwifi-ng-r2420-20070602/net80211/ieee80211_input.c 2007-06-30 23:52:01.239069750 +0200 -@@ -632,7 +632,7 @@ +--- madwifi-dfs-r3246.orig/net80211/ieee80211_input.c 2008-01-25 16:35:46.341115878 +0100 ++++ madwifi-dfs-r3246/net80211/ieee80211_input.c 2008-01-25 16:36:01.934004465 +0100 +@@ -669,7 +669,7 @@ * Next strip any MSDU crypto bits. */ if (key != NULL && @@ -212,12 +219,12 @@ Index: madwifi-ng-r2420-20070602/net80211/ieee80211_input.c IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT, ni->ni_macaddr, "data", "%s", "demic error"); IEEE80211_NODE_STAT(ni, rx_demicfail); -@@ -3730,6 +3730,47 @@ +@@ -4221,6 +4221,47 @@ } #endif +/* -+ * Process a frame w/ hw detected MIC failure. ++ * Process a frame w/ hw detected MIC failure. + * The frame will be dropped in any case. + */ +void @@ -229,7 +236,7 @@ Index: madwifi-ng-r2420-20070602/net80211/ieee80211_input.c + struct ieee80211_key *key; + int hdrspace; + struct ieee80211com *ic = vap->iv_ic; -+ ++ + if (skb->len < sizeof(struct ieee80211_frame_min)) { + IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ANY, + ni->ni_macaddr, NULL, @@ -239,7 +246,7 @@ Index: madwifi-ng-r2420-20070602/net80211/ieee80211_input.c + } + + wh = (struct ieee80211_frame *)skb->data; -+ ++ + hdrspace = ieee80211_hdrspace(ic, wh); + key = ieee80211_crypto_decap(ni, skb, hdrspace); + if (key == NULL) { @@ -260,11 +267,11 @@ Index: madwifi-ng-r2420-20070602/net80211/ieee80211_input.c #ifdef IEEE80211_DEBUG /* * Debugging support. -Index: madwifi-ng-r2420-20070602/net80211/ieee80211_proto.h +Index: madwifi-dfs-r3246/net80211/ieee80211_proto.h =================================================================== ---- madwifi-ng-r2420-20070602.orig/net80211/ieee80211_proto.h 2007-06-30 23:52:00.331013000 +0200 -+++ madwifi-ng-r2420-20070602/net80211/ieee80211_proto.h 2007-06-30 23:52:01.295073250 +0200 -@@ -91,6 +91,7 @@ +--- madwifi-dfs-r3246.orig/net80211/ieee80211_proto.h 2008-01-25 16:27:28.000000000 +0100 ++++ madwifi-dfs-r3246/net80211/ieee80211_proto.h 2008-01-25 16:36:01.934004465 +0100 +@@ -90,6 +90,7 @@ void ieee80211_set11gbasicrates(struct ieee80211_rateset *, enum ieee80211_phymode); enum ieee80211_phymode ieee80211_get11gbasicrates(struct ieee80211_rateset *); void ieee80211_send_pspoll(struct ieee80211_node *); @@ -272,11 +279,11 @@ Index: madwifi-ng-r2420-20070602/net80211/ieee80211_proto.h /* * Return the size of the 802.11 header for a management or data frame. -Index: madwifi-ng-r2420-20070602/net80211/ieee80211_linux.c +Index: madwifi-dfs-r3246/net80211/ieee80211_linux.c =================================================================== ---- madwifi-ng-r2420-20070602.orig/net80211/ieee80211_linux.c 2007-06-30 23:52:00.026994000 +0200 -+++ madwifi-ng-r2420-20070602/net80211/ieee80211_linux.c 2007-06-30 23:52:01.347076500 +0200 -@@ -291,8 +291,8 @@ +--- madwifi-dfs-r3246.orig/net80211/ieee80211_linux.c 2008-01-25 16:28:31.280323176 +0100 ++++ madwifi-dfs-r3246/net80211/ieee80211_linux.c 2008-01-25 16:36:01.934004465 +0100 +@@ -337,8 +337,8 @@ /* TODO: needed parameters: count, keyid, key type, src address, TSC */ snprintf(buf, sizeof(buf), "%s(keyid=%d %scast addr=%s)", tag, k->wk_keyix, @@ -287,11 +294,11 @@ Index: madwifi-ng-r2420-20070602/net80211/ieee80211_linux.c memset(&wrqu, 0, sizeof(wrqu)); wrqu.data.length = strlen(buf); wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf); -Index: madwifi-ng-r2420-20070602/net80211/ieee80211_output.c +Index: madwifi-dfs-r3246/net80211/ieee80211_output.c =================================================================== ---- madwifi-ng-r2420-20070602.orig/net80211/ieee80211_output.c 2007-06-30 23:52:00.118999750 +0200 -+++ madwifi-ng-r2420-20070602/net80211/ieee80211_output.c 2007-06-30 23:52:01.355077000 +0200 -@@ -1077,13 +1077,16 @@ +--- madwifi-dfs-r3246.orig/net80211/ieee80211_output.c 2008-01-25 16:27:28.000000000 +0100 ++++ madwifi-dfs-r3246/net80211/ieee80211_output.c 2008-01-25 16:36:01.938004695 +0100 +@@ -1083,13 +1083,16 @@ cip = (struct ieee80211_cipher *) key->wk_cipher; ciphdrsize = cip->ic_header; tailsize += (cip->ic_trailer + cip->ic_miclen); @@ -311,24 +318,24 @@ Index: madwifi-ng-r2420-20070602/net80211/ieee80211_output.c /* * Allocate sk_buff for each subsequent fragment; First fragment -Index: madwifi-ng-r2420-20070602/net80211/ieee80211_node.c +Index: madwifi-dfs-r3246/net80211/ieee80211_node.c =================================================================== ---- madwifi-ng-r2420-20070602.orig/net80211/ieee80211_node.c 2007-06-30 23:52:54.850420250 +0200 -+++ madwifi-ng-r2420-20070602/net80211/ieee80211_node.c 2007-07-01 00:18:32.370509250 +0200 -@@ -1885,11 +1885,13 @@ +--- madwifi-dfs-r3246.orig/net80211/ieee80211_node.c 2008-01-25 16:33:11.540294282 +0100 ++++ madwifi-dfs-r3246/net80211/ieee80211_node.c 2008-01-25 16:36:01.938004695 +0100 +@@ -2259,11 +2259,13 @@ /* From this point onwards we can no longer find the node, * so no more references are generated */ - ieee80211_remove_wds_addr(nt, ni->ni_macaddr); - ieee80211_del_wds_node(nt, ni); - IEEE80211_NODE_TABLE_LOCK_IRQ(nt); -- _node_table_leave(nt, ni); +- node_table_leave_locked(nt, ni); - IEEE80211_NODE_TABLE_UNLOCK_IRQ(nt); + if (nt) { + ieee80211_remove_wds_addr(nt, ni->ni_macaddr); + ieee80211_del_wds_node(nt, ni); + IEEE80211_NODE_TABLE_LOCK_IRQ(nt); -+ _node_table_leave(nt, ni); ++ node_table_leave_locked(nt, ni); + IEEE80211_NODE_TABLE_UNLOCK_IRQ(nt); + }