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 8ed83dcc149..d59fc6818b1 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c @@ -113,18 +113,6 @@ ieee80211_bss_info_update(struct ieee80211_local *local,  			bss->valid_data |= IEEE80211_BSS_VALID_ERP;  	} -	if (elems->tim && (!elems->parse_error || -			   !(bss->valid_data & IEEE80211_BSS_VALID_DTIM))) { -		struct ieee80211_tim_ie *tim_ie = elems->tim; -		bss->dtim_period = tim_ie->dtim_period; -		if (!elems->parse_error) -			bss->valid_data |= IEEE80211_BSS_VALID_DTIM; -	} - -	/* If the beacon had no TIM IE, or it was invalid, use 1 */ -	if (beacon && !bss->dtim_period) -		bss->dtim_period = 1; -  	/* replace old supported rates if we get new values */  	if (!elems->parse_error ||  	    !(bss->valid_data & IEEE80211_BSS_VALID_RATES)) { @@ -832,9 +820,9 @@ int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,  	return res;  } -int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata, -				    const u8 *ssid, u8 ssid_len, -				    struct ieee80211_channel *chan) +int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata, +				const u8 *ssid, u8 ssid_len, +				struct ieee80211_channel *chan)  {  	struct ieee80211_local *local = sdata->local;  	int ret = -EBUSY; @@ -848,22 +836,36 @@ int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,  	/* fill internal scan request */  	if (!chan) { -		int i, nchan = 0; +		int i, max_n; +		int n_ch = 0;  		for (band = 0; band < IEEE80211_NUM_BANDS; band++) {  			if (!local->hw.wiphy->bands[band])  				continue; -			for (i = 0; -			     i < local->hw.wiphy->bands[band]->n_channels; -			     i++) { -				local->int_scan_req->channels[nchan] = + +			max_n = local->hw.wiphy->bands[band]->n_channels; +			for (i = 0; i < max_n; i++) { +				struct ieee80211_channel *tmp_ch =  				    &local->hw.wiphy->bands[band]->channels[i]; -				nchan++; + +				if (tmp_ch->flags & (IEEE80211_CHAN_NO_IBSS | +						     IEEE80211_CHAN_DISABLED)) +					continue; + +				local->int_scan_req->channels[n_ch] = tmp_ch; +				n_ch++;  			}  		} -		local->int_scan_req->n_channels = nchan; +		if (WARN_ON_ONCE(n_ch == 0)) +			goto unlock; + +		local->int_scan_req->n_channels = n_ch;  	} else { +		if (WARN_ON_ONCE(chan->flags & (IEEE80211_CHAN_NO_IBSS | +						IEEE80211_CHAN_DISABLED))) +			goto unlock; +  		local->int_scan_req->channels[0] = chan;  		local->int_scan_req->n_channels = 1;  	}  |