mac80211: improve IBSS scanning
When IBSS is fixed to a frequency, it can still scan to try to find the right BSSID. This makes sense if the BSSID isn't also fixed, but it need not scan all channels -- just one is sufficient. Make it do that by moving the scan setup code to ieee80211_request_internal_scan() and include a channel variable setting. Note that this can be further improved to start the IBSS right away if both frequency and BSSID are fixed. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:

committed by
John W. Linville

parent
a75b4363ea
commit
be4a4b6a5d
@@ -728,10 +728,12 @@ int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
|
||||
}
|
||||
|
||||
int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
|
||||
const u8 *ssid, u8 ssid_len)
|
||||
const u8 *ssid, u8 ssid_len,
|
||||
struct ieee80211_channel *chan)
|
||||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
int ret = -EBUSY;
|
||||
enum nl80211_band band;
|
||||
|
||||
mutex_lock(&local->scan_mtx);
|
||||
|
||||
@@ -739,6 +741,30 @@ int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
|
||||
if (local->scan_req)
|
||||
goto unlock;
|
||||
|
||||
/* fill internal scan request */
|
||||
if (!chan) {
|
||||
int i, nchan = 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] =
|
||||
&local->hw.wiphy->bands[band]->channels[i];
|
||||
nchan++;
|
||||
}
|
||||
}
|
||||
|
||||
local->int_scan_req->n_channels = nchan;
|
||||
} else {
|
||||
local->int_scan_req->channels[0] = chan;
|
||||
local->int_scan_req->n_channels = 1;
|
||||
}
|
||||
|
||||
local->int_scan_req->ssids = &local->scan_ssid;
|
||||
local->int_scan_req->n_ssids = 1;
|
||||
memcpy(local->int_scan_req->ssids[0].ssid, ssid, IEEE80211_MAX_SSID_LEN);
|
||||
local->int_scan_req->ssids[0].ssid_len = ssid_len;
|
||||
|
||||
|
Reference in New Issue
Block a user