diff options
author | Jouni Malinen <jouni.malinen@atheros.com> | 2009-01-19 09:52:00 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-01-29 16:00:51 -0500 |
commit | e0463f501fb945c1fde536d98eefc5ba156ff497 (patch) | |
tree | a4b7fb8a0ce07ab01e1efd408d21eea280827e96 | |
parent | 6cd0b1cb872b3bf9fc5de4536404206ab74bafdd (diff) |
mac80211: Fix drop-unencrypted for management frames
ADDBA request Action frame was sent out before 4-way handshake was
completed and the initial 802.11w code ended up dropping the frame
even if MFP was not enabled. While the sending of Action frames this
early is not really a good idea (will break with MFP enabled), we
should not break this for the MFP disabled case.
This patch fixes ieee80211_tx_h_select_key() not to drop management
frames if MFP is disabled. If MFP is enabled, Action frames will be
dropped before keys are set per IEEE 802.11w/D7.0. Other robust
management frames (i.e., Deauthentication and Disassociation frames)
are allowed unprotected prior to key configuration.
Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | net/mac80211/tx.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index ad53ea9e9c77..7b013fb0d27f 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -432,7 +432,10 @@ ieee80211_tx_h_select_key(struct ieee80211_tx_data *tx) | |||
432 | tx->key = key; | 432 | tx->key = key; |
433 | else if (tx->sdata->drop_unencrypted && | 433 | else if (tx->sdata->drop_unencrypted && |
434 | (tx->skb->protocol != cpu_to_be16(ETH_P_PAE)) && | 434 | (tx->skb->protocol != cpu_to_be16(ETH_P_PAE)) && |
435 | !(info->flags & IEEE80211_TX_CTL_INJECTED)) { | 435 | !(info->flags & IEEE80211_TX_CTL_INJECTED) && |
436 | (!ieee80211_is_robust_mgmt_frame(hdr) || | ||
437 | (ieee80211_is_action(hdr->frame_control) && | ||
438 | tx->sta && test_sta_flags(tx->sta, WLAN_STA_MFP)))) { | ||
436 | I802_DEBUG_INC(tx->local->tx_handlers_drop_unencrypted); | 439 | I802_DEBUG_INC(tx->local->tx_handlers_drop_unencrypted); |
437 | return TX_DROP; | 440 | return TX_DROP; |
438 | } else | 441 | } else |