Browse Source

rt2x00: Fix MMIC Countermeasures

Set RX_FLAG_DECRYPTED in case of MMIC failure so that
ieee80211_rx_h_decrypt() doesnt drop the frame before getting to
ieee80211_rx_h_michael_mic_verify().

Signed-off-by: Michael Skeffington <mike@astro.ai>
Acked-by: Stanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Michael Skeffington 8 years ago
parent
commit
2db3aaba0a

+ 11 - 2
drivers/net/wireless/ralink/rt2x00/rt2800mmio.c

@@ -136,10 +136,19 @@ void rt2800mmio_fill_rxdone(struct queue_entry *entry,
 		 */
 		 */
 		rxdesc->flags |= RX_FLAG_MMIC_STRIPPED;
 		rxdesc->flags |= RX_FLAG_MMIC_STRIPPED;
 
 
-		if (rxdesc->cipher_status == RX_CRYPTO_SUCCESS)
+		if (rxdesc->cipher_status == RX_CRYPTO_SUCCESS) {
 			rxdesc->flags |= RX_FLAG_DECRYPTED;
 			rxdesc->flags |= RX_FLAG_DECRYPTED;
-		else if (rxdesc->cipher_status == RX_CRYPTO_FAIL_MIC)
+		} else if (rxdesc->cipher_status == RX_CRYPTO_FAIL_MIC) {
+			/*
+			 * In order to check the Michael Mic, the packet must have
+			 * been decrypted.  Mac80211 doesnt check the MMIC failure 
+			 * flag to initiate MMIC countermeasures if the decoded flag
+			 * has not been set.
+			 */
+			rxdesc->flags |= RX_FLAG_DECRYPTED;
+
 			rxdesc->flags |= RX_FLAG_MMIC_ERROR;
 			rxdesc->flags |= RX_FLAG_MMIC_ERROR;
+		}
 	}
 	}
 
 
 	if (rt2x00_get_field32(word, RXD_W3_MY_BSS))
 	if (rt2x00_get_field32(word, RXD_W3_MY_BSS))

+ 12 - 3
drivers/net/wireless/ralink/rt2x00/rt2800usb.c

@@ -697,11 +697,20 @@ static void rt2800usb_fill_rxdone(struct queue_entry *entry,
 		 * stripped it from the frame. Signal this to mac80211.
 		 * stripped it from the frame. Signal this to mac80211.
 		 */
 		 */
 		rxdesc->flags |= RX_FLAG_MMIC_STRIPPED;
 		rxdesc->flags |= RX_FLAG_MMIC_STRIPPED;
-
-		if (rxdesc->cipher_status == RX_CRYPTO_SUCCESS)
+        
+		if (rxdesc->cipher_status == RX_CRYPTO_SUCCESS) {
+			rxdesc->flags |= RX_FLAG_DECRYPTED;
+		} else if (rxdesc->cipher_status == RX_CRYPTO_FAIL_MIC) {
+			/*
+			 * In order to check the Michael Mic, the packet must have
+			 * been decrypted.  Mac80211 doesnt check the MMIC failure 
+			 * flag to initiate MMIC countermeasures if the decoded flag
+			 * has not been set.
+			 */
 			rxdesc->flags |= RX_FLAG_DECRYPTED;
 			rxdesc->flags |= RX_FLAG_DECRYPTED;
-		else if (rxdesc->cipher_status == RX_CRYPTO_FAIL_MIC)
+
 			rxdesc->flags |= RX_FLAG_MMIC_ERROR;
 			rxdesc->flags |= RX_FLAG_MMIC_ERROR;
+		}
 	}
 	}
 
 
 	if (rt2x00_get_field32(word, RXD_W0_MY_BSS))
 	if (rt2x00_get_field32(word, RXD_W0_MY_BSS))