Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mac80211: move RX WEP weak IV counting

This is better done inside the WEP decrypt
function where it doesn't have to check all
the conditions any more since they've been
tested already.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Johannes Berg and committed by
John W. Linville
617bbde8 6b6fa586

+6 -12
-7
net/mac80211/rx.c
··· 1070 1070 switch (rx->key->conf.cipher) { 1071 1071 case WLAN_CIPHER_SUITE_WEP40: 1072 1072 case WLAN_CIPHER_SUITE_WEP104: 1073 - /* Check for weak IVs if possible */ 1074 - if (rx->sta && ieee80211_is_data(fc) && 1075 - (!(status->flag & RX_FLAG_IV_STRIPPED) || 1076 - !(status->flag & RX_FLAG_DECRYPTED)) && 1077 - ieee80211_wep_is_weak_iv(rx->skb, rx->key)) 1078 - rx->sta->wep_weak_iv_count++; 1079 - 1080 1073 result = ieee80211_crypto_wep_decrypt(rx); 1081 1074 break; 1082 1075 case WLAN_CIPHER_SUITE_TKIP:
+6 -4
net/mac80211/wep.c
··· 263 263 } 264 264 265 265 266 - bool ieee80211_wep_is_weak_iv(struct sk_buff *skb, struct ieee80211_key *key) 266 + static bool ieee80211_wep_is_weak_iv(struct sk_buff *skb, 267 + struct ieee80211_key *key) 267 268 { 268 269 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 269 270 unsigned int hdrlen; 270 271 u8 *ivpos; 271 272 u32 iv; 272 - 273 - if (!ieee80211_has_protected(hdr->frame_control)) 274 - return false; 275 273 276 274 hdrlen = ieee80211_hdrlen(hdr->frame_control); 277 275 ivpos = skb->data + hdrlen; ··· 290 292 return RX_CONTINUE; 291 293 292 294 if (!(status->flag & RX_FLAG_DECRYPTED)) { 295 + if (rx->sta && ieee80211_wep_is_weak_iv(rx->skb, rx->key)) 296 + rx->sta->wep_weak_iv_count++; 293 297 if (ieee80211_wep_decrypt(rx->local, rx->skb, rx->key)) 294 298 return RX_DROP_UNUSABLE; 295 299 } else if (!(status->flag & RX_FLAG_IV_STRIPPED)) { 300 + if (rx->sta && ieee80211_wep_is_weak_iv(rx->skb, rx->key)) 301 + rx->sta->wep_weak_iv_count++; 296 302 ieee80211_wep_remove_iv(rx->local, rx->skb, rx->key); 297 303 /* remove ICV */ 298 304 skb_trim(rx->skb, rx->skb->len - WEP_ICV_LEN);
-1
net/mac80211/wep.h
··· 25 25 const u8 *key, int keylen, int keyidx); 26 26 int ieee80211_wep_decrypt_data(struct crypto_cipher *tfm, u8 *rc4key, 27 27 size_t klen, u8 *data, size_t data_len); 28 - bool ieee80211_wep_is_weak_iv(struct sk_buff *skb, struct ieee80211_key *key); 29 28 30 29 ieee80211_rx_result 31 30 ieee80211_crypto_wep_decrypt(struct ieee80211_rx_data *rx);