diff options
Diffstat (limited to 'net/mac80211/mlme.c')
| -rw-r--r-- | net/mac80211/mlme.c | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 2af306f67d78..6dc7b5ad9a41 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -426,7 +426,8 @@ static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata, | |||
| 426 | memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs)); | 426 | memcpy(pos, &sband->ht_cap.mcs, sizeof(sband->ht_cap.mcs)); |
| 427 | } | 427 | } |
| 428 | 428 | ||
| 429 | ieee80211_tx_skb(sdata, skb, 0); | 429 | IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; |
| 430 | ieee80211_tx_skb(sdata, skb); | ||
| 430 | } | 431 | } |
| 431 | 432 | ||
| 432 | 433 | ||
| @@ -467,7 +468,9 @@ static void ieee80211_send_deauth_disassoc(struct ieee80211_sub_if_data *sdata, | |||
| 467 | __cfg80211_send_disassoc(sdata->dev, (u8 *)mgmt, skb->len); | 468 | __cfg80211_send_disassoc(sdata->dev, (u8 *)mgmt, skb->len); |
| 468 | else | 469 | else |
| 469 | cfg80211_send_disassoc(sdata->dev, (u8 *)mgmt, skb->len); | 470 | cfg80211_send_disassoc(sdata->dev, (u8 *)mgmt, skb->len); |
| 470 | ieee80211_tx_skb(sdata, skb, ifmgd->flags & IEEE80211_STA_MFP_ENABLED); | 471 | if (!(ifmgd->flags & IEEE80211_STA_MFP_ENABLED)) |
| 472 | IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; | ||
| 473 | ieee80211_tx_skb(sdata, skb); | ||
| 471 | } | 474 | } |
| 472 | 475 | ||
| 473 | void ieee80211_send_pspoll(struct ieee80211_local *local, | 476 | void ieee80211_send_pspoll(struct ieee80211_local *local, |
| @@ -498,7 +501,8 @@ void ieee80211_send_pspoll(struct ieee80211_local *local, | |||
| 498 | memcpy(pspoll->bssid, ifmgd->bssid, ETH_ALEN); | 501 | memcpy(pspoll->bssid, ifmgd->bssid, ETH_ALEN); |
| 499 | memcpy(pspoll->ta, sdata->dev->dev_addr, ETH_ALEN); | 502 | memcpy(pspoll->ta, sdata->dev->dev_addr, ETH_ALEN); |
| 500 | 503 | ||
| 501 | ieee80211_tx_skb(sdata, skb, 0); | 504 | IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; |
| 505 | ieee80211_tx_skb(sdata, skb); | ||
| 502 | } | 506 | } |
| 503 | 507 | ||
| 504 | void ieee80211_send_nullfunc(struct ieee80211_local *local, | 508 | void ieee80211_send_nullfunc(struct ieee80211_local *local, |
| @@ -531,7 +535,8 @@ void ieee80211_send_nullfunc(struct ieee80211_local *local, | |||
| 531 | memcpy(nullfunc->addr2, sdata->dev->dev_addr, ETH_ALEN); | 535 | memcpy(nullfunc->addr2, sdata->dev->dev_addr, ETH_ALEN); |
| 532 | memcpy(nullfunc->addr3, sdata->u.mgd.bssid, ETH_ALEN); | 536 | memcpy(nullfunc->addr3, sdata->u.mgd.bssid, ETH_ALEN); |
| 533 | 537 | ||
| 534 | ieee80211_tx_skb(sdata, skb, 0); | 538 | IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; |
| 539 | ieee80211_tx_skb(sdata, skb); | ||
| 535 | } | 540 | } |
| 536 | 541 | ||
| 537 | /* spectrum management related things */ | 542 | /* spectrum management related things */ |
| @@ -2503,6 +2508,7 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, | |||
| 2503 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; | 2508 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; |
| 2504 | struct ieee80211_mgd_work *wk; | 2509 | struct ieee80211_mgd_work *wk; |
| 2505 | const u8 *bssid = NULL; | 2510 | const u8 *bssid = NULL; |
| 2511 | bool not_auth_yet = false; | ||
| 2506 | 2512 | ||
| 2507 | mutex_lock(&ifmgd->mtx); | 2513 | mutex_lock(&ifmgd->mtx); |
| 2508 | 2514 | ||
| @@ -2512,6 +2518,8 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, | |||
| 2512 | } else list_for_each_entry(wk, &ifmgd->work_list, list) { | 2518 | } else list_for_each_entry(wk, &ifmgd->work_list, list) { |
| 2513 | if (&wk->bss->cbss == req->bss) { | 2519 | if (&wk->bss->cbss == req->bss) { |
| 2514 | bssid = req->bss->bssid; | 2520 | bssid = req->bss->bssid; |
| 2521 | if (wk->state == IEEE80211_MGD_STATE_PROBE) | ||
| 2522 | not_auth_yet = true; | ||
| 2515 | list_del(&wk->list); | 2523 | list_del(&wk->list); |
| 2516 | kfree(wk); | 2524 | kfree(wk); |
| 2517 | break; | 2525 | break; |
| @@ -2519,6 +2527,20 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, | |||
| 2519 | } | 2527 | } |
| 2520 | 2528 | ||
| 2521 | /* | 2529 | /* |
| 2530 | * If somebody requests authentication and we haven't | ||
| 2531 | * sent out an auth frame yet there's no need to send | ||
| 2532 | * out a deauth frame either. If the state was PROBE, | ||
| 2533 | * then this is the case. If it's AUTH we have sent a | ||
| 2534 | * frame, and if it's IDLE we have completed the auth | ||
| 2535 | * process already. | ||
| 2536 | */ | ||
| 2537 | if (not_auth_yet) { | ||
| 2538 | mutex_unlock(&ifmgd->mtx); | ||
| 2539 | __cfg80211_auth_canceled(sdata->dev, bssid); | ||
| 2540 | return 0; | ||
| 2541 | } | ||
| 2542 | |||
| 2543 | /* | ||
| 2522 | * cfg80211 should catch this ... but it's racy since | 2544 | * cfg80211 should catch this ... but it's racy since |
| 2523 | * we can receive a deauth frame, process it, hand it | 2545 | * we can receive a deauth frame, process it, hand it |
| 2524 | * to cfg80211 while that's in a locked section already | 2546 | * to cfg80211 while that's in a locked section already |
