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 <[EMAIL PROTECTED]>
> Acked-by: Johannes Berg <[EMAIL PROTECTED]>

Signed-off-by: Michael Buesch <[EMAIL PROTECTED]>

> 
> 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.
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to