diff options
Diffstat (limited to 'net/mac80211/rx.c')
-rw-r--r-- | net/mac80211/rx.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 54395d7583ba..8e908e17e248 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -2402,7 +2402,8 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx) | |||
2402 | return RX_DROP_UNUSABLE; | 2402 | return RX_DROP_UNUSABLE; |
2403 | 2403 | ||
2404 | if (!rx->sta && mgmt->u.action.category != WLAN_CATEGORY_PUBLIC && | 2404 | if (!rx->sta && mgmt->u.action.category != WLAN_CATEGORY_PUBLIC && |
2405 | mgmt->u.action.category != WLAN_CATEGORY_SELF_PROTECTED) | 2405 | mgmt->u.action.category != WLAN_CATEGORY_SELF_PROTECTED && |
2406 | mgmt->u.action.category != WLAN_CATEGORY_SPECTRUM_MGMT) | ||
2406 | return RX_DROP_UNUSABLE; | 2407 | return RX_DROP_UNUSABLE; |
2407 | 2408 | ||
2408 | if (!(status->rx_flags & IEEE80211_RX_RA_MATCH)) | 2409 | if (!(status->rx_flags & IEEE80211_RX_RA_MATCH)) |
@@ -2566,31 +2567,46 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx) | |||
2566 | 2567 | ||
2567 | goto queue; | 2568 | goto queue; |
2568 | case WLAN_CATEGORY_SPECTRUM_MGMT: | 2569 | case WLAN_CATEGORY_SPECTRUM_MGMT: |
2569 | if (status->band != IEEE80211_BAND_5GHZ) | ||
2570 | break; | ||
2571 | |||
2572 | if (sdata->vif.type != NL80211_IFTYPE_STATION) | ||
2573 | break; | ||
2574 | |||
2575 | /* verify action_code is present */ | 2570 | /* verify action_code is present */ |
2576 | if (len < IEEE80211_MIN_ACTION_SIZE + 1) | 2571 | if (len < IEEE80211_MIN_ACTION_SIZE + 1) |
2577 | break; | 2572 | break; |
2578 | 2573 | ||
2579 | switch (mgmt->u.action.u.measurement.action_code) { | 2574 | switch (mgmt->u.action.u.measurement.action_code) { |
2580 | case WLAN_ACTION_SPCT_MSR_REQ: | 2575 | case WLAN_ACTION_SPCT_MSR_REQ: |
2576 | if (status->band != IEEE80211_BAND_5GHZ) | ||
2577 | break; | ||
2578 | |||
2581 | if (len < (IEEE80211_MIN_ACTION_SIZE + | 2579 | if (len < (IEEE80211_MIN_ACTION_SIZE + |
2582 | sizeof(mgmt->u.action.u.measurement))) | 2580 | sizeof(mgmt->u.action.u.measurement))) |
2583 | break; | 2581 | break; |
2582 | |||
2583 | if (sdata->vif.type != NL80211_IFTYPE_STATION) | ||
2584 | break; | ||
2585 | |||
2584 | ieee80211_process_measurement_req(sdata, mgmt, len); | 2586 | ieee80211_process_measurement_req(sdata, mgmt, len); |
2585 | goto handled; | 2587 | goto handled; |
2586 | case WLAN_ACTION_SPCT_CHL_SWITCH: | 2588 | case WLAN_ACTION_SPCT_CHL_SWITCH: { |
2587 | if (sdata->vif.type != NL80211_IFTYPE_STATION) | 2589 | u8 *bssid; |
2590 | if (len < (IEEE80211_MIN_ACTION_SIZE + | ||
2591 | sizeof(mgmt->u.action.u.chan_switch))) | ||
2588 | break; | 2592 | break; |
2589 | 2593 | ||
2590 | if (!ether_addr_equal(mgmt->bssid, sdata->u.mgd.bssid)) | 2594 | if (sdata->vif.type != NL80211_IFTYPE_STATION && |
2595 | sdata->vif.type != NL80211_IFTYPE_ADHOC) | ||
2596 | break; | ||
2597 | |||
2598 | if (sdata->vif.type == NL80211_IFTYPE_STATION) | ||
2599 | bssid = sdata->u.mgd.bssid; | ||
2600 | else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) | ||
2601 | bssid = sdata->u.ibss.bssid; | ||
2602 | else | ||
2603 | break; | ||
2604 | |||
2605 | if (!ether_addr_equal(mgmt->bssid, bssid)) | ||
2591 | break; | 2606 | break; |
2592 | 2607 | ||
2593 | goto queue; | 2608 | goto queue; |
2609 | } | ||
2594 | } | 2610 | } |
2595 | break; | 2611 | break; |
2596 | case WLAN_CATEGORY_SA_QUERY: | 2612 | case WLAN_CATEGORY_SA_QUERY: |