scan.c 25.9 KB
Newer Older
1
/*
2 3
 * Scanning implementation
 *
4 5 6 7 8 9 10 11 12 13 14 15
 * Copyright 2003, Jouni Malinen <jkmaline@cc.hut.fi>
 * Copyright 2004, Instant802 Networks, Inc.
 * Copyright 2005, Devicescape Software, Inc.
 * Copyright 2006-2007	Jiri Benc <jbenc@suse.cz>
 * Copyright 2007, Michael Wu <flamingice@sourmilk.net>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#include <linux/if_arp.h>
16
#include <linux/etherdevice.h>
17
#include <linux/rtnetlink.h>
18
#include <linux/pm_qos.h>
19
#include <net/sch_generic.h>
20
#include <linux/slab.h>
21
#include <linux/export.h>
22 23 24
#include <net/mac80211.h>

#include "ieee80211_i.h"
25
#include "driver-ops.h"
26
#include "mesh.h"
27 28 29

#define IEEE80211_PROBE_DELAY (HZ / 33)
#define IEEE80211_CHANNEL_TIME (HZ / 33)
30
#define IEEE80211_PASSIVE_CHANNEL_TIME (HZ / 9)
31

32
void ieee80211_rx_bss_put(struct ieee80211_local *local,
33
			  struct ieee80211_bss *bss)
34
{
35 36
	if (!bss)
		return;
37 38
	cfg80211_put_bss(local->hw.wiphy,
			 container_of((void *)bss, struct cfg80211_bss, priv));
39 40
}

K
Kalle Valo 已提交
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
static bool is_uapsd_supported(struct ieee802_11_elems *elems)
{
	u8 qos_info;

	if (elems->wmm_info && elems->wmm_info_len == 7
	    && elems->wmm_info[5] == 1)
		qos_info = elems->wmm_info[6];
	else if (elems->wmm_param && elems->wmm_param_len == 24
		 && elems->wmm_param[5] == 1)
		qos_info = elems->wmm_param[6];
	else
		/* no valid wmm information or parameter element found */
		return false;

	return qos_info & IEEE80211_WMM_IE_AP_QOSINFO_UAPSD;
}

58
struct ieee80211_bss *
59 60
ieee80211_bss_info_update(struct ieee80211_local *local,
			  struct ieee80211_rx_status *rx_status,
61
			  struct ieee80211_mgmt *mgmt, size_t len,
62
			  struct ieee802_11_elems *elems,
63
			  struct ieee80211_channel *channel)
64
{
65
	bool beacon = ieee80211_is_beacon(mgmt->frame_control);
66
	struct cfg80211_bss *cbss;
67
	struct ieee80211_bss *bss;
68
	int clen, srlen;
69 70
	s32 signal = 0;

J
Johannes Berg 已提交
71
	if (local->hw.flags & IEEE80211_HW_SIGNAL_DBM)
72
		signal = rx_status->signal * 100;
J
Johannes Berg 已提交
73
	else if (local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)
74 75
		signal = (rx_status->signal * 100) / local->hw.max_signal;

76 77 78
	cbss = cfg80211_inform_bss_frame(local->hw.wiphy, channel,
					 mgmt, len, signal, GFP_ATOMIC);
	if (!cbss)
79 80
		return NULL;

81
	bss = (void *)cbss->priv;
82

83 84 85 86
	if (beacon)
		bss->device_ts_beacon = rx_status->device_timestamp;
	else
		bss->device_ts_presp = rx_status->device_timestamp;
87

P
Paul Stewart 已提交
88 89 90 91 92 93 94 95 96 97 98 99
	if (elems->parse_error) {
		if (beacon)
			bss->corrupt_data |= IEEE80211_BSS_CORRUPT_BEACON;
		else
			bss->corrupt_data |= IEEE80211_BSS_CORRUPT_PROBE_RESP;
	} else {
		if (beacon)
			bss->corrupt_data &= ~IEEE80211_BSS_CORRUPT_BEACON;
		else
			bss->corrupt_data &= ~IEEE80211_BSS_CORRUPT_PROBE_RESP;
	}

100
	/* save the ERP value so that it is available at association time */
101 102
	if (elems->erp_info && (!elems->parse_error ||
				!(bss->valid_data & IEEE80211_BSS_VALID_ERP))) {
103
		bss->erp_value = elems->erp_info[0];
104
		bss->has_erp_value = true;
P
Paul Stewart 已提交
105 106
		if (!elems->parse_error)
			bss->valid_data |= IEEE80211_BSS_VALID_ERP;
107 108
	}

109
	/* replace old supported rates if we get new values */
P
Paul Stewart 已提交
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
	if (!elems->parse_error ||
	    !(bss->valid_data & IEEE80211_BSS_VALID_RATES)) {
		srlen = 0;
		if (elems->supp_rates) {
			clen = IEEE80211_MAX_SUPP_RATES;
			if (clen > elems->supp_rates_len)
				clen = elems->supp_rates_len;
			memcpy(bss->supp_rates, elems->supp_rates, clen);
			srlen += clen;
		}
		if (elems->ext_supp_rates) {
			clen = IEEE80211_MAX_SUPP_RATES - srlen;
			if (clen > elems->ext_supp_rates_len)
				clen = elems->ext_supp_rates_len;
			memcpy(bss->supp_rates + srlen, elems->ext_supp_rates,
			       clen);
			srlen += clen;
		}
		if (srlen) {
			bss->supp_rates_len = srlen;
			if (!elems->parse_error)
				bss->valid_data |= IEEE80211_BSS_VALID_RATES;
		}
133 134
	}

P
Paul Stewart 已提交
135 136 137 138 139 140 141
	if (!elems->parse_error ||
	    !(bss->valid_data & IEEE80211_BSS_VALID_WMM)) {
		bss->wmm_used = elems->wmm_param || elems->wmm_info;
		bss->uapsd_supported = is_uapsd_supported(elems);
		if (!elems->parse_error)
			bss->valid_data |= IEEE80211_BSS_VALID_WMM;
	}
142 143 144

	return bss;
}
145

J
Johannes Berg 已提交
146
void ieee80211_scan_rx(struct ieee80211_local *local, struct sk_buff *skb)
147
{
148
	struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb);
J
Johannes Berg 已提交
149 150
	struct ieee80211_sub_if_data *sdata1, *sdata2;
	struct ieee80211_mgmt *mgmt = (void *)skb->data;
151
	struct ieee80211_bss *bss;
152 153 154 155 156
	u8 *elements;
	struct ieee80211_channel *channel;
	size_t baselen;
	struct ieee802_11_elems elems;

J
Johannes Berg 已提交
157 158 159 160
	if (skb->len < 24 ||
	    (!ieee80211_is_probe_resp(mgmt->frame_control) &&
	     !ieee80211_is_beacon(mgmt->frame_control)))
		return;
161

J
Johannes Berg 已提交
162 163
	sdata1 = rcu_dereference(local->scan_sdata);
	sdata2 = rcu_dereference(local->sched_scan_sdata);
164

J
Johannes Berg 已提交
165 166
	if (likely(!sdata1 && !sdata2))
		return;
167

J
Johannes Berg 已提交
168
	if (ieee80211_is_probe_resp(mgmt->frame_control)) {
169
		/* ignore ProbeResp to foreign address */
J
Johannes Berg 已提交
170 171 172
		if ((!sdata1 || !ether_addr_equal(mgmt->da, sdata1->vif.addr)) &&
		    (!sdata2 || !ether_addr_equal(mgmt->da, sdata2->vif.addr)))
			return;
173 174 175 176 177 178 179 180 181

		elements = mgmt->u.probe_resp.variable;
		baselen = offsetof(struct ieee80211_mgmt, u.probe_resp.variable);
	} else {
		baselen = offsetof(struct ieee80211_mgmt, u.beacon.variable);
		elements = mgmt->u.beacon.variable;
	}

	if (baselen > skb->len)
J
Johannes Berg 已提交
182
		return;
183

184
	ieee802_11_parse_elems(elements, skb->len - baselen, false, &elems);
185

186
	channel = ieee80211_get_channel(local->hw.wiphy, rx_status->freq);
187 188

	if (!channel || channel->flags & IEEE80211_CHAN_DISABLED)
J
Johannes Berg 已提交
189
		return;
190

J
Johannes Berg 已提交
191
	bss = ieee80211_bss_info_update(local, rx_status,
192
					mgmt, skb->len, &elems,
193
					channel);
194
	if (bss)
J
Johannes Berg 已提交
195
		ieee80211_rx_bss_put(local, bss);
196 197
}

198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224
/* return false if no more work */
static bool ieee80211_prep_hw_scan(struct ieee80211_local *local)
{
	struct cfg80211_scan_request *req = local->scan_req;
	enum ieee80211_band band;
	int i, ielen, n_chans;

	do {
		if (local->hw_scan_band == IEEE80211_NUM_BANDS)
			return false;

		band = local->hw_scan_band;
		n_chans = 0;
		for (i = 0; i < req->n_channels; i++) {
			if (req->channels[i]->band == band) {
				local->hw_scan_req->channels[n_chans] =
							req->channels[i];
				n_chans++;
			}
		}

		local->hw_scan_band++;
	} while (!n_chans);

	local->hw_scan_req->n_channels = n_chans;

	ielen = ieee80211_build_preq_ies(local, (u8 *)local->hw_scan_req->ie,
225
					 local->hw_scan_ies_bufsize,
226
					 req->ie, req->ie_len, band,
227
					 req->rates[band], 0);
228
	local->hw_scan_req->ie_len = ielen;
229
	local->hw_scan_req->no_cck = req->no_cck;
230 231 232 233

	return true;
}

234
static void __ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted,
235
				       bool was_hw_scan)
236 237 238
{
	struct ieee80211_local *local = hw_to_local(hw);

239
	lockdep_assert_held(&local->mtx);
240

241 242 243 244 245 246 247 248
	/*
	 * It's ok to abort a not-yet-running scan (that
	 * we have one at all will be verified by checking
	 * local->scan_req next), but not to complete it
	 * successfully.
	 */
	if (WARN_ON(!local->scanning && !aborted))
		aborted = true;
249

250
	if (WARN_ON(!local->scan_req))
251
		return;
252

253
	if (was_hw_scan && !aborted && ieee80211_prep_hw_scan(local)) {
254 255 256 257 258 259 260
		int rc;

		rc = drv_hw_scan(local,
			rcu_dereference_protected(local->scan_sdata,
						  lockdep_is_held(&local->mtx)),
			local->hw_scan_req);

261
		if (rc == 0)
262
			return;
263 264 265 266
	}

	kfree(local->hw_scan_req);
	local->hw_scan_req = NULL;
267

268
	if (local->scan_req != local->int_scan_req)
269 270
		cfg80211_scan_done(local->scan_req, aborted);
	local->scan_req = NULL;
271
	rcu_assign_pointer(local->scan_sdata, NULL);
272

273
	local->scanning = 0;
J
Johannes Berg 已提交
274
	local->scan_channel = NULL;
275

276 277
	/* Set power back to normal operating levels. */
	ieee80211_hw_config(local, 0);
278

279 280 281
	if (!was_hw_scan) {
		ieee80211_configure_filter(local);
		drv_sw_scan_complete(local);
282
		ieee80211_offchannel_return(local);
283
	}
284

J
Johannes Berg 已提交
285
	ieee80211_recalc_idle(local);
286

287
	ieee80211_mlme_notify_scan_completed(local);
288
	ieee80211_ibss_notify_scan_completed(local);
289
	ieee80211_mesh_notify_scan_completed(local);
290
	ieee80211_start_next_roc(local);
291
}
292 293 294 295 296 297 298 299 300 301 302 303

void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
{
	struct ieee80211_local *local = hw_to_local(hw);

	trace_api_scan_completed(local, aborted);

	set_bit(SCAN_COMPLETED, &local->scanning);
	if (aborted)
		set_bit(SCAN_ABORTED, &local->scanning);
	ieee80211_queue_delayed_work(&local->hw, &local->scan_work, 0);
}
304 305
EXPORT_SYMBOL(ieee80211_scan_completed);

306 307
static int ieee80211_start_sw_scan(struct ieee80211_local *local)
{
308 309 310 311
	/* Software scan is not supported in multi-channel cases */
	if (local->use_chanctx)
		return -EOPNOTSUPP;

312 313 314 315 316 317 318 319 320 321 322 323 324
	/*
	 * Hardware/driver doesn't support hw_scan, so use software
	 * scanning instead. First send a nullfunc frame with power save
	 * bit on so that AP will buffer the frames for us while we are not
	 * listening, then send probe requests to each channel and wait for
	 * the responses. After all channels are scanned, tune back to the
	 * original channel and send a nullfunc frame with power save bit
	 * off to trigger the AP to send us all the buffered frames.
	 *
	 * Note that while local->sw_scanning is true everything else but
	 * nullfunc frames and probe requests will be dropped in
	 * ieee80211_tx_h_check_assoc().
	 */
325
	drv_sw_scan_start(local);
326

327
	local->leave_oper_channel_time = jiffies;
328
	local->next_scan_state = SCAN_DECISION;
329 330
	local->scan_channel_idx = 0;

331
	ieee80211_offchannel_stop_vifs(local);
332

333
	/* ensure nullfunc is transmitted before leaving operating channel */
334
	ieee80211_flush_queues(local, NULL);
335

336
	ieee80211_configure_filter(local);
337

338 339 340
	/* We need to set power level at maximum rate for scanning. */
	ieee80211_hw_config(local, 0);

341
	ieee80211_queue_delayed_work(&local->hw,
342
				     &local->scan_work, 0);
343 344 345 346

	return 0;
}

347 348 349
static bool ieee80211_can_scan(struct ieee80211_local *local,
			       struct ieee80211_sub_if_data *sdata)
{
350 351 352
	if (local->radar_detect_enabled)
		return false;

353
	if (!list_empty(&local->roc_list))
354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370
		return false;

	if (sdata->vif.type == NL80211_IFTYPE_STATION &&
	    sdata->u.mgd.flags & (IEEE80211_STA_BEACON_POLL |
				  IEEE80211_STA_CONNECTION_POLL))
		return false;

	return true;
}

void ieee80211_run_deferred_scan(struct ieee80211_local *local)
{
	lockdep_assert_held(&local->mtx);

	if (!local->scan_req || local->scanning)
		return;

371 372 373 374
	if (!ieee80211_can_scan(local,
				rcu_dereference_protected(
					local->scan_sdata,
					lockdep_is_held(&local->mtx))))
375 376 377 378 379
		return;

	ieee80211_queue_delayed_work(&local->hw, &local->scan_work,
				     round_jiffies_relative(0));
}
380

381 382 383 384
static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
					    unsigned long *next_delay)
{
	int i;
385
	struct ieee80211_sub_if_data *sdata;
386
	enum ieee80211_band band = local->hw.conf.chandef.chan->band;
387 388 389 390 391
	u32 tx_flags;

	tx_flags = IEEE80211_TX_INTFL_OFFCHAN_TX_OK;
	if (local->scan_req->no_cck)
		tx_flags |= IEEE80211_TX_CTL_NO_CCK_RATE;
392

393
	sdata = rcu_dereference_protected(local->scan_sdata,
394
					  lockdep_is_held(&local->mtx));
395

396 397 398 399 400 401 402
	for (i = 0; i < local->scan_req->n_ssids; i++)
		ieee80211_send_probe_req(
			sdata, NULL,
			local->scan_req->ssids[i].ssid,
			local->scan_req->ssids[i].ssid_len,
			local->scan_req->ie, local->scan_req->ie_len,
			local->scan_req->rates[band], false,
403
			tx_flags, local->hw.conf.chandef.chan, true);
404 405 406 407 408 409 410 411 412

	/*
	 * After sending probe requests, wait for probe responses
	 * on the channel.
	 */
	*next_delay = IEEE80211_CHANNEL_TIME;
	local->next_scan_state = SCAN_DECISION;
}

413 414 415 416 417 418
static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
				  struct cfg80211_scan_request *req)
{
	struct ieee80211_local *local = sdata->local;
	int rc;

419 420
	lockdep_assert_held(&local->mtx);

421 422 423
	if (local->scan_req)
		return -EBUSY;

424
	if (!ieee80211_can_scan(local, sdata)) {
425
		/* wait for the work to finish/time out */
426
		local->scan_req = req;
427
		rcu_assign_pointer(local->scan_sdata, sdata);
428 429 430
		return 0;
	}

431 432 433
	if (local->ops->hw_scan) {
		u8 *ies;

434 435 436
		local->hw_scan_ies_bufsize = 2 + IEEE80211_MAX_SSID_LEN +
					     local->scan_ies_len +
					     req->ie_len;
437 438 439
		local->hw_scan_req = kmalloc(
				sizeof(*local->hw_scan_req) +
				req->n_channels * sizeof(req->channels[0]) +
440
				local->hw_scan_ies_bufsize, GFP_KERNEL);
441
		if (!local->hw_scan_req)
442 443
			return -ENOMEM;

444 445 446 447 448 449
		local->hw_scan_req->ssids = req->ssids;
		local->hw_scan_req->n_ssids = req->n_ssids;
		ies = (u8 *)local->hw_scan_req +
			sizeof(*local->hw_scan_req) +
			req->n_channels * sizeof(req->channels[0]);
		local->hw_scan_req->ie = ies;
450
		local->hw_scan_req->flags = req->flags;
451 452

		local->hw_scan_band = 0;
453 454 455 456 457 458 459 460

		/*
		 * After allocating local->hw_scan_req, we must
		 * go through until ieee80211_prep_hw_scan(), so
		 * anything that might be changed here and leave
		 * this function early must not go after this
		 * allocation.
		 */
461 462 463
	}

	local->scan_req = req;
464
	rcu_assign_pointer(local->scan_sdata, sdata);
465

466
	if (local->ops->hw_scan) {
467
		__set_bit(SCAN_HW_SCANNING, &local->scanning);
468
	} else if ((req->n_channels == 1) &&
469
		   (req->channels[0] == local->_oper_chandef.chan)) {
470 471 472
		/*
		 * If we are scanning only on the operating channel
		 * then we do not need to stop normal activities
473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503
		 */
		unsigned long next_delay;

		__set_bit(SCAN_ONCHANNEL_SCANNING, &local->scanning);

		ieee80211_recalc_idle(local);

		/* Notify driver scan is starting, keep order of operations
		 * same as normal software scan, in case that matters. */
		drv_sw_scan_start(local);

		ieee80211_configure_filter(local); /* accept probe-responses */

		/* We need to ensure power level is at max for scanning. */
		ieee80211_hw_config(local, 0);

		if ((req->channels[0]->flags &
		     IEEE80211_CHAN_PASSIVE_SCAN) ||
		    !local->scan_req->n_ssids) {
			next_delay = IEEE80211_PASSIVE_CHANNEL_TIME;
		} else {
			ieee80211_scan_state_send_probe(local, &next_delay);
			next_delay = IEEE80211_CHANNEL_TIME;
		}

		/* Now, just wait a bit and we are all done! */
		ieee80211_queue_delayed_work(&local->hw, &local->scan_work,
					     next_delay);
		return 0;
	} else {
		/* Do normal software scan */
504
		__set_bit(SCAN_SW_SCANNING, &local->scanning);
505
	}
506

J
Johannes Berg 已提交
507
	ieee80211_recalc_idle(local);
508

509 510
	if (local->ops->hw_scan) {
		WARN_ON(!ieee80211_prep_hw_scan(local));
511
		rc = drv_hw_scan(local, sdata, local->hw_scan_req);
512
	} else
513 514 515
		rc = ieee80211_start_sw_scan(local);

	if (rc) {
516 517
		kfree(local->hw_scan_req);
		local->hw_scan_req = NULL;
518
		local->scanning = 0;
519

J
Johannes Berg 已提交
520 521
		ieee80211_recalc_idle(local);

522
		local->scan_req = NULL;
523
		rcu_assign_pointer(local->scan_sdata, NULL);
524 525 526 527 528
	}

	return rc;
}

529 530 531 532 533 534 535 536 537 538 539 540
static unsigned long
ieee80211_scan_get_channel_time(struct ieee80211_channel *chan)
{
	/*
	 * TODO: channel switching also consumes quite some time,
	 * add that delay as well to get a better estimation
	 */
	if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN)
		return IEEE80211_PASSIVE_CHANNEL_TIME;
	return IEEE80211_PROBE_DELAY + IEEE80211_CHANNEL_TIME;
}

541 542
static void ieee80211_scan_state_decision(struct ieee80211_local *local,
					  unsigned long *next_delay)
H
Helmut Schaa 已提交
543
{
544
	bool associated = false;
545 546
	bool tx_empty = true;
	bool bad_latency;
547
	struct ieee80211_sub_if_data *sdata;
548
	struct ieee80211_channel *next_chan;
549
	enum mac80211_scan_state next_scan_state;
550

551 552 553 554 555
	/*
	 * check if at least one STA interface is associated,
	 * check if at least one STA interface has pending tx frames
	 * and grab the lowest used beacon interval
	 */
556 557
	mutex_lock(&local->iflist_mtx);
	list_for_each_entry(sdata, &local->interfaces, list) {
558
		if (!ieee80211_sdata_running(sdata))
559 560 561 562 563
			continue;

		if (sdata->vif.type == NL80211_IFTYPE_STATION) {
			if (sdata->u.mgd.associated) {
				associated = true;
564 565 566 567 568

				if (!qdisc_all_tx_empty(sdata->dev)) {
					tx_empty = false;
					break;
				}
569 570 571 572 573
			}
		}
	}
	mutex_unlock(&local->iflist_mtx);

574 575
	next_chan = local->scan_req->channels[local->scan_channel_idx];

576
	/*
577 578 579 580
	 * we're currently scanning a different channel, let's
	 * see if we can scan another channel without interfering
	 * with the current traffic situation.
	 *
581
	 * Keep good latency, do not stay off-channel more than 125 ms.
582 583
	 */

584
	bad_latency = time_after(jiffies +
585 586
				 ieee80211_scan_get_channel_time(next_chan),
				 local->leave_oper_channel_time + HZ / 8);
587

588 589 590 591 592
	if (associated && !tx_empty) {
		if (local->scan_req->flags & NL80211_SCAN_FLAG_LOW_PRIORITY)
			next_scan_state = SCAN_ABORT;
		else
			next_scan_state = SCAN_SUSPEND;
593
	} else if (associated && bad_latency) {
594 595 596 597 598 599
		next_scan_state = SCAN_SUSPEND;
	} else {
		next_scan_state = SCAN_SET_CHANNEL;
	}

	local->next_scan_state = next_scan_state;
600

601
	*next_delay = 0;
602 603
}

604 605 606 607 608 609
static void ieee80211_scan_state_set_channel(struct ieee80211_local *local,
					     unsigned long *next_delay)
{
	int skip;
	struct ieee80211_channel *chan;

H
Helmut Schaa 已提交
610 611 612
	skip = 0;
	chan = local->scan_req->channels[local->scan_channel_idx];

J
Johannes Berg 已提交
613
	local->scan_channel = chan;
614

615 616
	if (ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL))
		skip = 1;
H
Helmut Schaa 已提交
617 618 619 620

	/* advance state machine to next channel/band */
	local->scan_channel_idx++;

621 622 623
	if (skip) {
		/* if we skip this channel return to the decision state */
		local->next_scan_state = SCAN_DECISION;
624
		return;
625
	}
H
Helmut Schaa 已提交
626 627 628 629 630 631 632 633 634 635 636 637 638 639

	/*
	 * Probe delay is used to update the NAV, cf. 11.1.3.2.2
	 * (which unfortunately doesn't say _why_ step a) is done,
	 * but it waits for the probe delay or until a frame is
	 * received - and the received frame would update the NAV).
	 * For now, we do not support waiting until a frame is
	 * received.
	 *
	 * In any case, it is not necessary for a passive scan.
	 */
	if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN ||
	    !local->scan_req->n_ssids) {
		*next_delay = IEEE80211_PASSIVE_CHANNEL_TIME;
640
		local->next_scan_state = SCAN_DECISION;
641
		return;
H
Helmut Schaa 已提交
642 643
	}

644
	/* active scan, send probes */
H
Helmut Schaa 已提交
645
	*next_delay = IEEE80211_PROBE_DELAY;
646
	local->next_scan_state = SCAN_SEND_PROBE;
H
Helmut Schaa 已提交
647 648
}

649 650 651 652 653 654 655
static void ieee80211_scan_state_suspend(struct ieee80211_local *local,
					 unsigned long *next_delay)
{
	/* switch back to the operating channel */
	local->scan_channel = NULL;
	ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);

656 657
	/* disable PS */
	ieee80211_offchannel_return(local);
658 659 660 661 662 663 664 665 666

	*next_delay = HZ / 5;
	/* afterwards, resume scan & go to next channel */
	local->next_scan_state = SCAN_RESUME;
}

static void ieee80211_scan_state_resume(struct ieee80211_local *local,
					unsigned long *next_delay)
{
667
	ieee80211_offchannel_stop_vifs(local);
668 669

	if (local->ops->flush) {
670
		ieee80211_flush_queues(local, NULL);
671 672 673 674 675 676 677 678
		*next_delay = 0;
	} else
		*next_delay = HZ / 10;

	/* remember when we left the operating channel */
	local->leave_oper_channel_time = jiffies;

	/* advance to the next channel to be scanned */
679
	local->next_scan_state = SCAN_SET_CHANNEL;
680 681
}

682
void ieee80211_scan_work(struct work_struct *work)
683 684 685
{
	struct ieee80211_local *local =
		container_of(work, struct ieee80211_local, scan_work.work);
686
	struct ieee80211_sub_if_data *sdata;
687
	unsigned long next_delay = 0;
688
	bool aborted, hw_scan;
689

690
	mutex_lock(&local->mtx);
691

692 693
	sdata = rcu_dereference_protected(local->scan_sdata,
					  lockdep_is_held(&local->mtx));
694

695 696 697 698 699 700
	/* When scanning on-channel, the first-callback means completed. */
	if (test_bit(SCAN_ONCHANNEL_SCANNING, &local->scanning)) {
		aborted = test_and_clear_bit(SCAN_ABORTED, &local->scanning);
		goto out_complete;
	}

701
	if (test_and_clear_bit(SCAN_COMPLETED, &local->scanning)) {
702
		aborted = test_and_clear_bit(SCAN_ABORTED, &local->scanning);
703
		goto out_complete;
704 705
	}

706 707
	if (!sdata || !local->scan_req)
		goto out;
708

709
	if (local->scan_req && !local->scanning) {
710 711 712 713
		struct cfg80211_scan_request *req = local->scan_req;
		int rc;

		local->scan_req = NULL;
714
		rcu_assign_pointer(local->scan_sdata, NULL);
715 716

		rc = __ieee80211_start_scan(sdata, req);
717
		if (rc) {
718 719
			/* need to complete scan in cfg80211 */
			local->scan_req = req;
720 721 722 723
			aborted = true;
			goto out_complete;
		} else
			goto out;
724 725
	}

726 727 728
	/*
	 * Avoid re-scheduling when the sdata is going away.
	 */
729
	if (!ieee80211_sdata_running(sdata)) {
730 731
		aborted = true;
		goto out_complete;
732
	}
733

734 735 736 737 738
	/*
	 * as long as no delay is required advance immediately
	 * without scheduling a new work
	 */
	do {
739 740 741 742 743
		if (!ieee80211_sdata_running(sdata)) {
			aborted = true;
			goto out_complete;
		}

744
		switch (local->next_scan_state) {
745
		case SCAN_DECISION:
746 747 748 749 750 751
			/* if no more bands/channels left, complete scan */
			if (local->scan_channel_idx >= local->scan_req->n_channels) {
				aborted = false;
				goto out_complete;
			}
			ieee80211_scan_state_decision(local, &next_delay);
752
			break;
753 754 755
		case SCAN_SET_CHANNEL:
			ieee80211_scan_state_set_channel(local, &next_delay);
			break;
756 757 758
		case SCAN_SEND_PROBE:
			ieee80211_scan_state_send_probe(local, &next_delay);
			break;
759 760
		case SCAN_SUSPEND:
			ieee80211_scan_state_suspend(local, &next_delay);
761
			break;
762 763
		case SCAN_RESUME:
			ieee80211_scan_state_resume(local, &next_delay);
764
			break;
765 766 767
		case SCAN_ABORT:
			aborted = true;
			goto out_complete;
768 769
		}
	} while (next_delay == 0);
770

771
	ieee80211_queue_delayed_work(&local->hw, &local->scan_work, next_delay);
772
	goto out;
773 774

out_complete:
775
	hw_scan = test_bit(SCAN_HW_SCANNING, &local->scanning);
776
	__ieee80211_scan_completed(&local->hw, aborted, hw_scan);
777 778
out:
	mutex_unlock(&local->mtx);
779 780
}

781 782
int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
			   struct cfg80211_scan_request *req)
783
{
784
	int res;
785

786
	mutex_lock(&sdata->local->mtx);
787
	res = __ieee80211_start_scan(sdata, req);
788
	mutex_unlock(&sdata->local->mtx);
789

790
	return res;
791 792
}

S
Stanislaw Gruszka 已提交
793 794 795
int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
				const u8 *ssid, u8 ssid_len,
				struct ieee80211_channel *chan)
796 797
{
	struct ieee80211_local *local = sdata->local;
798
	int ret = -EBUSY;
799
	enum ieee80211_band band;
800

801
	mutex_lock(&local->mtx);
802

803 804 805
	/* busy scanning */
	if (local->scan_req)
		goto unlock;
J
Johannes Berg 已提交
806

J
Johannes Berg 已提交
807 808
	/* fill internal scan request */
	if (!chan) {
S
Stanislaw Gruszka 已提交
809 810
		int i, max_n;
		int n_ch = 0;
J
Johannes Berg 已提交
811 812 813 814

		for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
			if (!local->hw.wiphy->bands[band])
				continue;
S
Stanislaw Gruszka 已提交
815 816 817 818

			max_n = local->hw.wiphy->bands[band]->n_channels;
			for (i = 0; i < max_n; i++) {
				struct ieee80211_channel *tmp_ch =
J
Johannes Berg 已提交
819
				    &local->hw.wiphy->bands[band]->channels[i];
S
Stanislaw Gruszka 已提交
820 821 822 823 824 825 826

				if (tmp_ch->flags & (IEEE80211_CHAN_NO_IBSS |
						     IEEE80211_CHAN_DISABLED))
					continue;

				local->int_scan_req->channels[n_ch] = tmp_ch;
				n_ch++;
J
Johannes Berg 已提交
827 828 829
			}
		}

S
Stanislaw Gruszka 已提交
830 831 832 833
		if (WARN_ON_ONCE(n_ch == 0))
			goto unlock;

		local->int_scan_req->n_channels = n_ch;
J
Johannes Berg 已提交
834
	} else {
S
Stanislaw Gruszka 已提交
835 836 837 838
		if (WARN_ON_ONCE(chan->flags & (IEEE80211_CHAN_NO_IBSS |
						IEEE80211_CHAN_DISABLED)))
			goto unlock;

J
Johannes Berg 已提交
839 840 841 842 843 844
		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;
845 846
	memcpy(local->int_scan_req->ssids[0].ssid, ssid, IEEE80211_MAX_SSID_LEN);
	local->int_scan_req->ssids[0].ssid_len = ssid_len;
J
Johannes Berg 已提交
847

848
	ret = __ieee80211_start_scan(sdata, sdata->local->int_scan_req);
849
 unlock:
850
	mutex_unlock(&local->mtx);
851
	return ret;
852
}
853

854 855 856
/*
 * Only call this function when a scan can't be queued -- under RTNL.
 */
857 858 859
void ieee80211_scan_cancel(struct ieee80211_local *local)
{
	/*
860
	 * We are canceling software scan, or deferred scan that was not
861 862 863 864 865 866 867 868 869 870 871
	 * yet really started (see __ieee80211_start_scan ).
	 *
	 * Regarding hardware scan:
	 * - we can not call  __ieee80211_scan_completed() as when
	 *   SCAN_HW_SCANNING bit is set this function change
	 *   local->hw_scan_req to operate on 5G band, what race with
	 *   driver which can use local->hw_scan_req
	 *
	 * - we can not cancel scan_work since driver can schedule it
	 *   by ieee80211_scan_completed(..., true) to finish scan
	 *
872 873 874
	 * Hence we only call the cancel_hw_scan() callback, but the low-level
	 * driver is still responsible for calling ieee80211_scan_completed()
	 * after the scan was completed/aborted.
875
	 */
876

877
	mutex_lock(&local->mtx);
878 879 880 881 882
	if (!local->scan_req)
		goto out;

	if (test_bit(SCAN_HW_SCANNING, &local->scanning)) {
		if (local->ops->cancel_hw_scan)
883 884 885
			drv_cancel_hw_scan(local,
				rcu_dereference_protected(local->scan_sdata,
						lockdep_is_held(&local->mtx)));
886
		goto out;
887
	}
888 889 890 891 892 893 894 895 896 897

	/*
	 * If the work is currently running, it must be blocked on
	 * the mutex, but we'll set scan_sdata = NULL and it'll
	 * simply exit once it acquires the mutex.
	 */
	cancel_delayed_work(&local->scan_work);
	/* and clean up */
	__ieee80211_scan_completed(&local->hw, true, false);
out:
898
	mutex_unlock(&local->mtx);
899
}
900 901 902 903 904

int ieee80211_request_sched_scan_start(struct ieee80211_sub_if_data *sdata,
				       struct cfg80211_sched_scan_request *req)
{
	struct ieee80211_local *local = sdata->local;
D
David Spinadel 已提交
905
	struct ieee80211_sched_scan_ies sched_scan_ies = {};
906 907 908 909
	int ret, i, iebufsz;

	iebufsz = 2 + IEEE80211_MAX_SSID_LEN +
		  local->scan_ies_len + req->ie_len;
910

911
	mutex_lock(&local->mtx);
912

913
	if (rcu_access_pointer(local->sched_scan_sdata)) {
914 915 916 917 918 919 920 921 922 923
		ret = -EBUSY;
		goto out;
	}

	if (!local->ops->sched_scan_start) {
		ret = -ENOTSUPP;
		goto out;
	}

	for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
924 925 926
		if (!local->hw.wiphy->bands[i])
			continue;

927
		sched_scan_ies.ie[i] = kzalloc(iebufsz, GFP_KERNEL);
928
		if (!sched_scan_ies.ie[i]) {
929 930 931 932
			ret = -ENOMEM;
			goto out_free;
		}

933 934
		sched_scan_ies.len[i] =
			ieee80211_build_preq_ies(local, sched_scan_ies.ie[i],
935 936
						 iebufsz, req->ie, req->ie_len,
						 i, (u32) -1, 0);
937 938
	}

939 940
	ret = drv_sched_scan_start(local, sdata, req, &sched_scan_ies);
	if (ret == 0)
941
		rcu_assign_pointer(local->sched_scan_sdata, sdata);
942 943 944

out_free:
	while (i > 0)
945
		kfree(sched_scan_ies.ie[--i]);
946
out:
947
	mutex_unlock(&local->mtx);
948 949 950
	return ret;
}

951
int ieee80211_request_sched_scan_stop(struct ieee80211_sub_if_data *sdata)
952 953
{
	struct ieee80211_local *local = sdata->local;
954
	int ret = 0;
955

956
	mutex_lock(&local->mtx);
957 958 959 960 961 962

	if (!local->ops->sched_scan_stop) {
		ret = -ENOTSUPP;
		goto out;
	}

963
	if (rcu_access_pointer(local->sched_scan_sdata))
964
		drv_sched_scan_stop(local, sdata);
965

966
out:
967
	mutex_unlock(&local->mtx);
968 969 970 971 972 973 974 975 976 977 978 979 980 981

	return ret;
}

void ieee80211_sched_scan_results(struct ieee80211_hw *hw)
{
	struct ieee80211_local *local = hw_to_local(hw);

	trace_api_sched_scan_results(local);

	cfg80211_sched_scan_results(hw->wiphy);
}
EXPORT_SYMBOL(ieee80211_sched_scan_results);

982 983 984 985 986 987 988 989
void ieee80211_sched_scan_stopped_work(struct work_struct *work)
{
	struct ieee80211_local *local =
		container_of(work, struct ieee80211_local,
			     sched_scan_stopped_work);

	mutex_lock(&local->mtx);

990
	if (!rcu_access_pointer(local->sched_scan_sdata)) {
991 992 993 994
		mutex_unlock(&local->mtx);
		return;
	}

995
	rcu_assign_pointer(local->sched_scan_sdata, NULL);
996 997 998 999 1000 1001

	mutex_unlock(&local->mtx);

	cfg80211_sched_scan_stopped(local->hw.wiphy);
}

1002 1003 1004 1005 1006 1007
void ieee80211_sched_scan_stopped(struct ieee80211_hw *hw)
{
	struct ieee80211_local *local = hw_to_local(hw);

	trace_api_sched_scan_stopped(local);

1008
	ieee80211_queue_work(&local->hw, &local->sched_scan_stopped_work);
1009 1010
}
EXPORT_SYMBOL(ieee80211_sched_scan_stopped);