[PATCH] softmac: do shared key auth in workqueue
Johann Uhrmann reported a bcm43xx crash and Michael Buesch tracked it down to a problem with the new shared key auth code (recursive calls into the driver) This patch (effectively Michael's patch with a couple of small modifications) solves the problem by sending the authentication challenge response frame from a workqueue entry. I also removed a lone \n from the bcm43xx messages relating to authentication mode - this small change was previously discussed but not patched in. Signed-off-by: Daniel Drake <dsd@gentoo.org> Acked-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: Michael Buesch <mb@bu3sch.de> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
8fa9ea18e8
commit
345f6b8beb
2 changed files with 23 additions and 7 deletions
|
@ -3701,7 +3701,7 @@ static void bcm43xx_ieee80211_set_security(struct net_device *net_dev,
|
|||
}
|
||||
if (sec->flags & SEC_AUTH_MODE) {
|
||||
secinfo->auth_mode = sec->auth_mode;
|
||||
dprintk(", .auth_mode = %d\n", sec->auth_mode);
|
||||
dprintk(", .auth_mode = %d", sec->auth_mode);
|
||||
}
|
||||
dprintk("\n");
|
||||
if (bcm43xx_status(bcm) == BCM43xx_STAT_INITIALIZED &&
|
||||
|
|
|
@ -116,6 +116,16 @@ ieee80211softmac_auth_queue(void *data)
|
|||
kfree(auth);
|
||||
}
|
||||
|
||||
/* Sends a response to an auth challenge (for shared key auth). */
|
||||
static void
|
||||
ieee80211softmac_auth_challenge_response(void *_aq)
|
||||
{
|
||||
struct ieee80211softmac_auth_queue_item *aq = _aq;
|
||||
|
||||
/* Send our response */
|
||||
ieee80211softmac_send_mgt_frame(aq->mac, aq->net, IEEE80211_STYPE_AUTH, aq->state);
|
||||
}
|
||||
|
||||
/* Handle the auth response from the AP
|
||||
* This should be registered with ieee80211 as handle_auth
|
||||
*/
|
||||
|
@ -197,24 +207,30 @@ ieee80211softmac_auth_resp(struct net_device *dev, struct ieee80211_auth *auth)
|
|||
case IEEE80211SOFTMAC_AUTH_SHARED_CHALLENGE:
|
||||
/* Check to make sure we have a challenge IE */
|
||||
data = (u8 *)auth->info_element;
|
||||
if(*data++ != MFIE_TYPE_CHALLENGE){
|
||||
if (*data++ != MFIE_TYPE_CHALLENGE) {
|
||||
printkl(KERN_NOTICE PFX "Shared Key Authentication failed due to a missing challenge.\n");
|
||||
break;
|
||||
}
|
||||
/* Save the challenge */
|
||||
spin_lock_irqsave(&mac->lock, flags);
|
||||
net->challenge_len = *data++;
|
||||
if(net->challenge_len > WLAN_AUTH_CHALLENGE_LEN)
|
||||
if (net->challenge_len > WLAN_AUTH_CHALLENGE_LEN)
|
||||
net->challenge_len = WLAN_AUTH_CHALLENGE_LEN;
|
||||
if(net->challenge != NULL)
|
||||
if (net->challenge != NULL)
|
||||
kfree(net->challenge);
|
||||
net->challenge = kmalloc(net->challenge_len, GFP_ATOMIC);
|
||||
memcpy(net->challenge, data, net->challenge_len);
|
||||
aq->state = IEEE80211SOFTMAC_AUTH_SHARED_RESPONSE;
|
||||
spin_unlock_irqrestore(&mac->lock, flags);
|
||||
|
||||
/* Send our response */
|
||||
ieee80211softmac_send_mgt_frame(mac, aq->net, IEEE80211_STYPE_AUTH, aq->state);
|
||||
/* We reuse the work struct from the auth request here.
|
||||
* It is safe to do so as each one is per-request, and
|
||||
* at this point (dealing with authentication response)
|
||||
* we have obviously already sent the initial auth
|
||||
* request. */
|
||||
cancel_delayed_work(&aq->work);
|
||||
INIT_WORK(&aq->work, &ieee80211softmac_auth_challenge_response, (void *)aq);
|
||||
schedule_work(&aq->work);
|
||||
spin_unlock_irqrestore(&mac->lock, flags);
|
||||
return 0;
|
||||
case IEEE80211SOFTMAC_AUTH_SHARED_PASS:
|
||||
kfree(net->challenge);
|
||||
|
|
Loading…
Reference in a new issue