diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/atmel.c | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/drivers/net/wireless/atmel.c b/drivers/net/wireless/atmel.c index c1c27e10b8df..dfc24016ba81 100644 --- a/drivers/net/wireless/atmel.c +++ b/drivers/net/wireless/atmel.c | |||
@@ -3064,17 +3064,26 @@ static void authenticate(struct atmel_private *priv, u16 frame_len) | |||
3064 | } | 3064 | } |
3065 | 3065 | ||
3066 | if (status == C80211_MGMT_SC_Success && priv->wep_is_on) { | 3066 | if (status == C80211_MGMT_SC_Success && priv->wep_is_on) { |
3067 | int should_associate = 0; | ||
3067 | /* WEP */ | 3068 | /* WEP */ |
3068 | if (trans_seq_no != priv->ExpectedAuthentTransactionSeqNum) | 3069 | if (trans_seq_no != priv->ExpectedAuthentTransactionSeqNum) |
3069 | return; | 3070 | return; |
3070 | 3071 | ||
3071 | if (trans_seq_no == 0x0002 && | 3072 | if (system == C80211_MGMT_AAN_OPENSYSTEM) { |
3072 | auth->el_id == C80211_MGMT_ElementID_ChallengeText) { | 3073 | if (trans_seq_no == 0x0002) { |
3073 | send_authentication_request(priv, system, auth->chall_text, auth->chall_text_len); | 3074 | should_associate = 1; |
3074 | return; | 3075 | } |
3076 | } else if (system == C80211_MGMT_AAN_SHAREDKEY) { | ||
3077 | if (trans_seq_no == 0x0002 && | ||
3078 | auth->el_id == C80211_MGMT_ElementID_ChallengeText) { | ||
3079 | send_authentication_request(priv, system, auth->chall_text, auth->chall_text_len); | ||
3080 | return; | ||
3081 | } else if (trans_seq_no == 0x0004) { | ||
3082 | should_associate = 1; | ||
3083 | } | ||
3075 | } | 3084 | } |
3076 | 3085 | ||
3077 | if (trans_seq_no == 0x0004) { | 3086 | if (should_associate) { |
3078 | if(priv->station_was_associated) { | 3087 | if(priv->station_was_associated) { |
3079 | atmel_enter_state(priv, STATION_STATE_REASSOCIATING); | 3088 | atmel_enter_state(priv, STATION_STATE_REASSOCIATING); |
3080 | send_association_request(priv, 1); | 3089 | send_association_request(priv, 1); |
@@ -3087,11 +3096,13 @@ static void authenticate(struct atmel_private *priv, u16 frame_len) | |||
3087 | } | 3096 | } |
3088 | } | 3097 | } |
3089 | 3098 | ||
3090 | if (status == C80211_MGMT_SC_AuthAlgNotSupported) { | 3099 | if (status == WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG) { |
3091 | /* Do opensystem first, then try sharedkey */ | 3100 | /* Do opensystem first, then try sharedkey */ |
3092 | if (system == C80211_MGMT_AAN_OPENSYSTEM) { | 3101 | if (system == WLAN_AUTH_OPEN) { |
3093 | priv->CurrentAuthentTransactionSeqNum = 0x001; | 3102 | priv->CurrentAuthentTransactionSeqNum = 0x001; |
3094 | send_authentication_request(priv, C80211_MGMT_AAN_SHAREDKEY, NULL, 0); | 3103 | priv->exclude_unencrypted = 1; |
3104 | send_authentication_request(priv, WLAN_AUTH_SHARED_KEY, NULL, 0); | ||
3105 | return; | ||
3095 | } else if (priv->connect_to_any_BSS) { | 3106 | } else if (priv->connect_to_any_BSS) { |
3096 | int bss_index; | 3107 | int bss_index; |
3097 | 3108 | ||
@@ -3442,10 +3453,13 @@ static void atmel_management_timer(u_long a) | |||
3442 | priv->AuthenticationRequestRetryCnt = 0; | 3453 | priv->AuthenticationRequestRetryCnt = 0; |
3443 | restart_search(priv); | 3454 | restart_search(priv); |
3444 | } else { | 3455 | } else { |
3456 | int auth = C80211_MGMT_AAN_OPENSYSTEM; | ||
3445 | priv->AuthenticationRequestRetryCnt++; | 3457 | priv->AuthenticationRequestRetryCnt++; |
3446 | priv->CurrentAuthentTransactionSeqNum = 0x0001; | 3458 | priv->CurrentAuthentTransactionSeqNum = 0x0001; |
3447 | mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); | 3459 | mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); |
3448 | send_authentication_request(priv, C80211_MGMT_AAN_OPENSYSTEM, NULL, 0); | 3460 | if (priv->wep_is_on && priv->exclude_unencrypted) |
3461 | auth = C80211_MGMT_AAN_SHAREDKEY; | ||
3462 | send_authentication_request(priv, auth, NULL, 0); | ||
3449 | } | 3463 | } |
3450 | break; | 3464 | break; |
3451 | 3465 | ||
@@ -3544,12 +3558,15 @@ static void atmel_command_irq(struct atmel_private *priv) | |||
3544 | priv->station_was_associated = priv->station_is_associated; | 3558 | priv->station_was_associated = priv->station_is_associated; |
3545 | atmel_enter_state(priv, STATION_STATE_READY); | 3559 | atmel_enter_state(priv, STATION_STATE_READY); |
3546 | } else { | 3560 | } else { |
3561 | int auth = C80211_MGMT_AAN_OPENSYSTEM; | ||
3547 | priv->AuthenticationRequestRetryCnt = 0; | 3562 | priv->AuthenticationRequestRetryCnt = 0; |
3548 | atmel_enter_state(priv, STATION_STATE_AUTHENTICATING); | 3563 | atmel_enter_state(priv, STATION_STATE_AUTHENTICATING); |
3549 | 3564 | ||
3550 | mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); | 3565 | mod_timer(&priv->management_timer, jiffies + MGMT_JIFFIES); |
3551 | priv->CurrentAuthentTransactionSeqNum = 0x0001; | 3566 | priv->CurrentAuthentTransactionSeqNum = 0x0001; |
3552 | send_authentication_request(priv, C80211_MGMT_AAN_SHAREDKEY, NULL, 0); | 3567 | if (priv->wep_is_on && priv->exclude_unencrypted) |
3568 | auth = C80211_MGMT_AAN_SHAREDKEY; | ||
3569 | send_authentication_request(priv, auth, NULL, 0); | ||
3553 | } | 3570 | } |
3554 | return; | 3571 | return; |
3555 | } | 3572 | } |