diff options
Diffstat (limited to 'net/mac80211/scan.c')
| -rw-r--r-- | net/mac80211/scan.c | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index 8ed83dcc149f..d59fc6818b1c 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
| @@ -113,18 +113,6 @@ ieee80211_bss_info_update(struct ieee80211_local *local, | |||
| 113 | bss->valid_data |= IEEE80211_BSS_VALID_ERP; | 113 | bss->valid_data |= IEEE80211_BSS_VALID_ERP; |
| 114 | } | 114 | } |
| 115 | 115 | ||
| 116 | if (elems->tim && (!elems->parse_error || | ||
| 117 | !(bss->valid_data & IEEE80211_BSS_VALID_DTIM))) { | ||
| 118 | struct ieee80211_tim_ie *tim_ie = elems->tim; | ||
| 119 | bss->dtim_period = tim_ie->dtim_period; | ||
| 120 | if (!elems->parse_error) | ||
| 121 | bss->valid_data |= IEEE80211_BSS_VALID_DTIM; | ||
| 122 | } | ||
| 123 | |||
| 124 | /* If the beacon had no TIM IE, or it was invalid, use 1 */ | ||
| 125 | if (beacon && !bss->dtim_period) | ||
| 126 | bss->dtim_period = 1; | ||
| 127 | |||
| 128 | /* replace old supported rates if we get new values */ | 116 | /* replace old supported rates if we get new values */ |
| 129 | if (!elems->parse_error || | 117 | if (!elems->parse_error || |
| 130 | !(bss->valid_data & IEEE80211_BSS_VALID_RATES)) { | 118 | !(bss->valid_data & IEEE80211_BSS_VALID_RATES)) { |
| @@ -832,9 +820,9 @@ int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata, | |||
| 832 | return res; | 820 | return res; |
| 833 | } | 821 | } |
| 834 | 822 | ||
| 835 | int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata, | 823 | int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata, |
| 836 | const u8 *ssid, u8 ssid_len, | 824 | const u8 *ssid, u8 ssid_len, |
| 837 | struct ieee80211_channel *chan) | 825 | struct ieee80211_channel *chan) |
| 838 | { | 826 | { |
| 839 | struct ieee80211_local *local = sdata->local; | 827 | struct ieee80211_local *local = sdata->local; |
| 840 | int ret = -EBUSY; | 828 | int ret = -EBUSY; |
| @@ -848,22 +836,36 @@ int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata, | |||
| 848 | 836 | ||
| 849 | /* fill internal scan request */ | 837 | /* fill internal scan request */ |
| 850 | if (!chan) { | 838 | if (!chan) { |
| 851 | int i, nchan = 0; | 839 | int i, max_n; |
| 840 | int n_ch = 0; | ||
| 852 | 841 | ||
| 853 | for (band = 0; band < IEEE80211_NUM_BANDS; band++) { | 842 | for (band = 0; band < IEEE80211_NUM_BANDS; band++) { |
| 854 | if (!local->hw.wiphy->bands[band]) | 843 | if (!local->hw.wiphy->bands[band]) |
| 855 | continue; | 844 | continue; |
| 856 | for (i = 0; | 845 | |
| 857 | i < local->hw.wiphy->bands[band]->n_channels; | 846 | max_n = local->hw.wiphy->bands[band]->n_channels; |
| 858 | i++) { | 847 | for (i = 0; i < max_n; i++) { |
| 859 | local->int_scan_req->channels[nchan] = | 848 | struct ieee80211_channel *tmp_ch = |
| 860 | &local->hw.wiphy->bands[band]->channels[i]; | 849 | &local->hw.wiphy->bands[band]->channels[i]; |
| 861 | nchan++; | 850 | |
| 851 | if (tmp_ch->flags & (IEEE80211_CHAN_NO_IBSS | | ||
| 852 | IEEE80211_CHAN_DISABLED)) | ||
| 853 | continue; | ||
| 854 | |||
| 855 | local->int_scan_req->channels[n_ch] = tmp_ch; | ||
| 856 | n_ch++; | ||
| 862 | } | 857 | } |
| 863 | } | 858 | } |
| 864 | 859 | ||
| 865 | local->int_scan_req->n_channels = nchan; | 860 | if (WARN_ON_ONCE(n_ch == 0)) |
| 861 | goto unlock; | ||
| 862 | |||
| 863 | local->int_scan_req->n_channels = n_ch; | ||
| 866 | } else { | 864 | } else { |
| 865 | if (WARN_ON_ONCE(chan->flags & (IEEE80211_CHAN_NO_IBSS | | ||
| 866 | IEEE80211_CHAN_DISABLED))) | ||
| 867 | goto unlock; | ||
| 868 | |||
| 867 | local->int_scan_req->channels[0] = chan; | 869 | local->int_scan_req->channels[0] = chan; |
| 868 | local->int_scan_req->n_channels = 1; | 870 | local->int_scan_req->n_channels = 1; |
| 869 | } | 871 | } |
