netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] softmac: do shared key auth in workqueue
@ 2006-07-11 22:16 Daniel Drake
  2006-07-11 22:49 ` Michael Buesch
  0 siblings, 1 reply; 2+ messages in thread
From: Daniel Drake @ 2006-07-11 22:16 UTC (permalink / raw)
  To: linville; +Cc: netdev, johannes, mb

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>

Index: linux/net/ieee80211/softmac/ieee80211softmac_auth.c
===================================================================
--- linux.orig/net/ieee80211/softmac/ieee80211softmac_auth.c
+++ linux/net/ieee80211/softmac/ieee80211softmac_auth.c
@@ -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_de
 		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);
Index: linux/drivers/net/wireless/bcm43xx/bcm43xx_main.c
===================================================================
--- linux.orig/drivers/net/wireless/bcm43xx/bcm43xx_main.c
+++ linux/drivers/net/wireless/bcm43xx/bcm43xx_main.c
@@ -3701,7 +3701,7 @@ static void bcm43xx_ieee80211_set_securi
 	}
 	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 &&

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH] softmac: do shared key auth in workqueue
  2006-07-11 22:16 [PATCH] softmac: do shared key auth in workqueue Daniel Drake
@ 2006-07-11 22:49 ` Michael Buesch
  0 siblings, 0 replies; 2+ messages in thread
From: Michael Buesch @ 2006-07-11 22:49 UTC (permalink / raw)
  To: Daniel Drake; +Cc: linville, netdev, johannes

On Wednesday 12 July 2006 00:16, you wrote:
> 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>

> 
> Index: linux/net/ieee80211/softmac/ieee80211softmac_auth.c
> ===================================================================
> --- linux.orig/net/ieee80211/softmac/ieee80211softmac_auth.c
> +++ linux/net/ieee80211/softmac/ieee80211softmac_auth.c
> @@ -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_de
>  		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);
> Index: linux/drivers/net/wireless/bcm43xx/bcm43xx_main.c
> ===================================================================
> --- linux.orig/drivers/net/wireless/bcm43xx/bcm43xx_main.c
> +++ linux/drivers/net/wireless/bcm43xx/bcm43xx_main.c
> @@ -3701,7 +3701,7 @@ static void bcm43xx_ieee80211_set_securi
>  	}
>  	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 &&
> 

-- 
Greetings Michael.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-07-11 22:48 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-07-11 22:16 [PATCH] softmac: do shared key auth in workqueue Daniel Drake
2006-07-11 22:49 ` Michael Buesch

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).