Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit be4a4b6a authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville
Browse files

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: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent a75b4363
Loading
Loading
Loading
Loading
+6 −3
Original line number Original line Diff line number Diff line
@@ -488,7 +488,9 @@ static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata)
	printk(KERN_DEBUG "%s: No active IBSS STAs - trying to scan for other "
	printk(KERN_DEBUG "%s: No active IBSS STAs - trying to scan for other "
	       "IBSS networks with same SSID (merge)\n", sdata->name);
	       "IBSS networks with same SSID (merge)\n", sdata->name);


	ieee80211_request_internal_scan(sdata, ifibss->ssid, ifibss->ssid_len);
	ieee80211_request_internal_scan(sdata,
			ifibss->ssid, ifibss->ssid_len,
			ifibss->fixed_channel ? ifibss->channel : NULL);
}
}


static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
@@ -595,8 +597,9 @@ static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata)
		printk(KERN_DEBUG "%s: Trigger new scan to find an IBSS to "
		printk(KERN_DEBUG "%s: Trigger new scan to find an IBSS to "
		       "join\n", sdata->name);
		       "join\n", sdata->name);


		ieee80211_request_internal_scan(sdata, ifibss->ssid,
		ieee80211_request_internal_scan(sdata,
						ifibss->ssid_len);
				ifibss->ssid, ifibss->ssid_len,
				ifibss->fixed_channel ? ifibss->channel : NULL);
	} else {
	} else {
		int interval = IEEE80211_SCAN_INTERVAL;
		int interval = IEEE80211_SCAN_INTERVAL;


+2 −1
Original line number Original line Diff line number Diff line
@@ -1020,7 +1020,8 @@ void ieee80211_ibss_restart(struct ieee80211_sub_if_data *sdata);
/* scan/BSS handling */
/* scan/BSS handling */
void ieee80211_scan_work(struct work_struct *work);
void ieee80211_scan_work(struct work_struct *work);
int ieee80211_request_internal_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);
int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
			   struct cfg80211_scan_request *req);
			   struct cfg80211_scan_request *req);
void ieee80211_scan_cancel(struct ieee80211_local *local);
void ieee80211_scan_cancel(struct ieee80211_local *local);
+1 −16
Original line number Original line Diff line number Diff line
@@ -439,7 +439,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
	struct ieee80211_local *local = hw_to_local(hw);
	struct ieee80211_local *local = hw_to_local(hw);
	int result;
	int result;
	enum ieee80211_band band;
	enum ieee80211_band band;
	int channels, i, j, max_bitrates;
	int channels, max_bitrates;
	bool supp_ht;
	bool supp_ht;
	static const u32 cipher_suites[] = {
	static const u32 cipher_suites[] = {
		WLAN_CIPHER_SUITE_WEP40,
		WLAN_CIPHER_SUITE_WEP40,
@@ -605,21 +605,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)


	ieee80211_led_init(local);
	ieee80211_led_init(local);


	/* alloc internal scan request */
	i = 0;
	local->int_scan_req->ssids = &local->scan_ssid;
	local->int_scan_req->n_ssids = 1;
	for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
		if (!hw->wiphy->bands[band])
			continue;
		for (j = 0; j < hw->wiphy->bands[band]->n_channels; j++) {
			local->int_scan_req->channels[i] =
				&hw->wiphy->bands[band]->channels[j];
			i++;
		}
	}
	local->int_scan_req->n_channels = i;

	local->network_latency_notifier.notifier_call =
	local->network_latency_notifier.notifier_call =
		ieee80211_max_network_latency;
		ieee80211_max_network_latency;
	result = pm_qos_add_notifier(PM_QOS_NETWORK_LATENCY,
	result = pm_qos_add_notifier(PM_QOS_NETWORK_LATENCY,
+27 −1
Original line number Original line Diff line number Diff line
@@ -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,
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;
	struct ieee80211_local *local = sdata->local;
	int ret = -EBUSY;
	int ret = -EBUSY;
	enum nl80211_band band;


	mutex_lock(&local->scan_mtx);
	mutex_lock(&local->scan_mtx);


@@ -739,6 +741,30 @@ int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
	if (local->scan_req)
	if (local->scan_req)
		goto unlock;
		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);
	memcpy(local->int_scan_req->ssids[0].ssid, ssid, IEEE80211_MAX_SSID_LEN);
	local->int_scan_req->ssids[0].ssid_len = ssid_len;
	local->int_scan_req->ssids[0].ssid_len = ssid_len;