scan.c 25.6 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 37
	if (!bss)
		return;
	cfg80211_put_bss(container_of((void *)bss, struct cfg80211_bss, priv));
38 39
}

K
Kalle Valo 已提交
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
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;
}

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

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

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

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

82 83
	bss->device_ts = rx_status->device_timestamp;

P
Paul Stewart 已提交
84 85 86 87 88 89 90 91 92 93 94 95
	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;
	}

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

106
	/* replace old supported rates if we get new values */
P
Paul Stewart 已提交
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
	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;
		}
130 131
	}

P
Paul Stewart 已提交
132 133 134 135 136 137 138
	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;
	}
139 140 141

	return bss;
}
142

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

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

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

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

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

		elements = mgmt->u.probe_resp.variable;
		baselen = offsetof(struct ieee80211_mgmt, u.probe_resp.variable);
J
Johannes Berg 已提交
174
		beacon = false;
175 176 177
	} else {
		baselen = offsetof(struct ieee80211_mgmt, u.beacon.variable);
		elements = mgmt->u.beacon.variable;
J
Johannes Berg 已提交
178
		beacon = true;
179 180 181
	}

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

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

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
	ieee80211_configure_filter(local);
334

335 336 337
	/* We need to set power level at maximum rate for scanning. */
	ieee80211_hw_config(local, 0);

338
	ieee80211_queue_delayed_work(&local->hw,
339
				     &local->scan_work, 0);
340 341 342 343

	return 0;
}

344 345 346
static bool ieee80211_can_scan(struct ieee80211_local *local,
			       struct ieee80211_sub_if_data *sdata)
{
347
	if (!list_empty(&local->roc_list))
348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364
		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;

365 366 367 368
	if (!ieee80211_can_scan(local,
				rcu_dereference_protected(
					local->scan_sdata,
					lockdep_is_held(&local->mtx))))
369 370 371 372 373
		return;

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

375 376 377 378
static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
					    unsigned long *next_delay)
{
	int i;
379
	struct ieee80211_sub_if_data *sdata;
380 381
	enum ieee80211_band band = local->hw.conf.channel->band;

382
	sdata = rcu_dereference_protected(local->scan_sdata,
383
					  lockdep_is_held(&local->mtx));
384

385 386 387 388 389 390 391
	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,
392 393
			local->scan_req->no_cck ?
				IEEE80211_TX_CTL_NO_CCK_RATE : 0,
J
Johannes Berg 已提交
394
			local->hw.conf.channel, true);
395 396 397 398 399 400 401 402 403

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

404 405 406 407 408 409
static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
				  struct cfg80211_scan_request *req)
{
	struct ieee80211_local *local = sdata->local;
	int rc;

410 411
	lockdep_assert_held(&local->mtx);

412 413 414
	if (local->scan_req)
		return -EBUSY;

415
	if (!ieee80211_can_scan(local, sdata)) {
416
		/* wait for the work to finish/time out */
417
		local->scan_req = req;
418
		rcu_assign_pointer(local->scan_sdata, sdata);
419 420 421
		return 0;
	}

422 423 424
	if (local->ops->hw_scan) {
		u8 *ies;

425 426 427
		local->hw_scan_ies_bufsize = 2 + IEEE80211_MAX_SSID_LEN +
					     local->scan_ies_len +
					     req->ie_len;
428 429 430
		local->hw_scan_req = kmalloc(
				sizeof(*local->hw_scan_req) +
				req->n_channels * sizeof(req->channels[0]) +
431
				local->hw_scan_ies_bufsize, GFP_KERNEL);
432
		if (!local->hw_scan_req)
433 434
			return -ENOMEM;

435 436 437 438 439 440
		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;
441
		local->hw_scan_req->flags = req->flags;
442 443

		local->hw_scan_band = 0;
444 445 446 447 448 449 450 451

		/*
		 * 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.
		 */
452 453 454
	}

	local->scan_req = req;
455
	rcu_assign_pointer(local->scan_sdata, sdata);
456

457
	if (local->ops->hw_scan) {
458
		__set_bit(SCAN_HW_SCANNING, &local->scanning);
459
	} else if ((req->n_channels == 1) &&
J
Johannes Berg 已提交
460
		   (req->channels[0] == local->_oper_channel)) {
461 462 463
		/*
		 * If we are scanning only on the operating channel
		 * then we do not need to stop normal activities
464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494
		 */
		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 */
495
		__set_bit(SCAN_SW_SCANNING, &local->scanning);
496
	}
497

J
Johannes Berg 已提交
498
	ieee80211_recalc_idle(local);
499

500 501
	if (local->ops->hw_scan) {
		WARN_ON(!ieee80211_prep_hw_scan(local));
502
		rc = drv_hw_scan(local, sdata, local->hw_scan_req);
503
	} else
504 505 506
		rc = ieee80211_start_sw_scan(local);

	if (rc) {
507 508
		kfree(local->hw_scan_req);
		local->hw_scan_req = NULL;
509
		local->scanning = 0;
510

J
Johannes Berg 已提交
511 512
		ieee80211_recalc_idle(local);

513
		local->scan_req = NULL;
514
		rcu_assign_pointer(local->scan_sdata, NULL);
515 516 517 518 519
	}

	return rc;
}

520 521 522 523 524 525 526 527 528 529 530 531
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;
}

532 533
static void ieee80211_scan_state_decision(struct ieee80211_local *local,
					  unsigned long *next_delay)
H
Helmut Schaa 已提交
534
{
535
	bool associated = false;
536 537
	bool tx_empty = true;
	bool bad_latency;
538
	struct ieee80211_sub_if_data *sdata;
539
	struct ieee80211_channel *next_chan;
540
	enum mac80211_scan_state next_scan_state;
541

542 543 544 545 546
	/*
	 * 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
	 */
547 548
	mutex_lock(&local->iflist_mtx);
	list_for_each_entry(sdata, &local->interfaces, list) {
549
		if (!ieee80211_sdata_running(sdata))
550 551 552 553 554
			continue;

		if (sdata->vif.type == NL80211_IFTYPE_STATION) {
			if (sdata->u.mgd.associated) {
				associated = true;
555 556 557 558 559

				if (!qdisc_all_tx_empty(sdata->dev)) {
					tx_empty = false;
					break;
				}
560 561 562 563 564
			}
		}
	}
	mutex_unlock(&local->iflist_mtx);

565 566
	next_chan = local->scan_req->channels[local->scan_channel_idx];

567
	/*
568 569 570 571
	 * we're currently scanning a different channel, let's
	 * see if we can scan another channel without interfering
	 * with the current traffic situation.
	 *
572
	 * Keep good latency, do not stay off-channel more than 125 ms.
573 574
	 */

575
	bad_latency = time_after(jiffies +
576 577
				 ieee80211_scan_get_channel_time(next_chan),
				 local->leave_oper_channel_time + HZ / 8);
578

579 580 581 582 583
	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;
584
	} else if (associated && bad_latency) {
585 586 587 588 589 590
		next_scan_state = SCAN_SUSPEND;
	} else {
		next_scan_state = SCAN_SET_CHANNEL;
	}

	local->next_scan_state = next_scan_state;
591

592
	*next_delay = 0;
593 594
}

595 596 597 598 599 600
static void ieee80211_scan_state_set_channel(struct ieee80211_local *local,
					     unsigned long *next_delay)
{
	int skip;
	struct ieee80211_channel *chan;

H
Helmut Schaa 已提交
601 602 603
	skip = 0;
	chan = local->scan_req->channels[local->scan_channel_idx];

J
Johannes Berg 已提交
604
	local->scan_channel = chan;
605

606 607
	if (ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL))
		skip = 1;
H
Helmut Schaa 已提交
608 609 610 611

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

612 613 614
	if (skip) {
		/* if we skip this channel return to the decision state */
		local->next_scan_state = SCAN_DECISION;
615
		return;
616
	}
H
Helmut Schaa 已提交
617 618 619 620 621 622 623 624 625 626 627 628 629 630

	/*
	 * 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;
631
		local->next_scan_state = SCAN_DECISION;
632
		return;
H
Helmut Schaa 已提交
633 634
	}

635
	/* active scan, send probes */
H
Helmut Schaa 已提交
636
	*next_delay = IEEE80211_PROBE_DELAY;
637
	local->next_scan_state = SCAN_SEND_PROBE;
H
Helmut Schaa 已提交
638 639
}

640 641 642 643 644 645 646
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);

647 648
	/* disable PS */
	ieee80211_offchannel_return(local);
649 650 651 652 653 654 655 656 657

	*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)
{
658
	ieee80211_offchannel_stop_vifs(local);
659 660 661 662 663 664 665 666 667 668 669

	if (local->ops->flush) {
		drv_flush(local, false);
		*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 */
670
	local->next_scan_state = SCAN_SET_CHANNEL;
671 672
}

673
void ieee80211_scan_work(struct work_struct *work)
674 675 676
{
	struct ieee80211_local *local =
		container_of(work, struct ieee80211_local, scan_work.work);
677
	struct ieee80211_sub_if_data *sdata;
678
	unsigned long next_delay = 0;
679
	bool aborted, hw_scan;
680

681
	mutex_lock(&local->mtx);
682

683 684
	sdata = rcu_dereference_protected(local->scan_sdata,
					  lockdep_is_held(&local->mtx));
685

686 687 688 689 690 691
	/* 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;
	}

692
	if (test_and_clear_bit(SCAN_COMPLETED, &local->scanning)) {
693
		aborted = test_and_clear_bit(SCAN_ABORTED, &local->scanning);
694
		goto out_complete;
695 696
	}

697 698
	if (!sdata || !local->scan_req)
		goto out;
699

700
	if (local->scan_req && !local->scanning) {
701 702 703 704
		struct cfg80211_scan_request *req = local->scan_req;
		int rc;

		local->scan_req = NULL;
705
		rcu_assign_pointer(local->scan_sdata, NULL);
706 707

		rc = __ieee80211_start_scan(sdata, req);
708
		if (rc) {
709 710
			/* need to complete scan in cfg80211 */
			local->scan_req = req;
711 712 713 714
			aborted = true;
			goto out_complete;
		} else
			goto out;
715 716
	}

717 718 719
	/*
	 * Avoid re-scheduling when the sdata is going away.
	 */
720
	if (!ieee80211_sdata_running(sdata)) {
721 722
		aborted = true;
		goto out_complete;
723
	}
724

725 726 727 728 729
	/*
	 * as long as no delay is required advance immediately
	 * without scheduling a new work
	 */
	do {
730 731 732 733 734
		if (!ieee80211_sdata_running(sdata)) {
			aborted = true;
			goto out_complete;
		}

735
		switch (local->next_scan_state) {
736
		case SCAN_DECISION:
737 738 739 740 741 742
			/* 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);
743
			break;
744 745 746
		case SCAN_SET_CHANNEL:
			ieee80211_scan_state_set_channel(local, &next_delay);
			break;
747 748 749
		case SCAN_SEND_PROBE:
			ieee80211_scan_state_send_probe(local, &next_delay);
			break;
750 751
		case SCAN_SUSPEND:
			ieee80211_scan_state_suspend(local, &next_delay);
752
			break;
753 754
		case SCAN_RESUME:
			ieee80211_scan_state_resume(local, &next_delay);
755
			break;
756 757 758
		case SCAN_ABORT:
			aborted = true;
			goto out_complete;
759 760
		}
	} while (next_delay == 0);
761

762
	ieee80211_queue_delayed_work(&local->hw, &local->scan_work, next_delay);
763
	goto out;
764 765

out_complete:
766
	hw_scan = test_bit(SCAN_HW_SCANNING, &local->scanning);
767
	__ieee80211_scan_completed(&local->hw, aborted, hw_scan);
768 769
out:
	mutex_unlock(&local->mtx);
770 771
}

772 773
int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
			   struct cfg80211_scan_request *req)
774
{
775
	int res;
776

777
	mutex_lock(&sdata->local->mtx);
778
	res = __ieee80211_start_scan(sdata, req);
779
	mutex_unlock(&sdata->local->mtx);
780

781
	return res;
782 783
}

S
Stanislaw Gruszka 已提交
784 785 786
int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
				const u8 *ssid, u8 ssid_len,
				struct ieee80211_channel *chan)
787 788
{
	struct ieee80211_local *local = sdata->local;
789
	int ret = -EBUSY;
790
	enum ieee80211_band band;
791

792
	mutex_lock(&local->mtx);
793

794 795 796
	/* busy scanning */
	if (local->scan_req)
		goto unlock;
J
Johannes Berg 已提交
797

J
Johannes Berg 已提交
798 799
	/* fill internal scan request */
	if (!chan) {
S
Stanislaw Gruszka 已提交
800 801
		int i, max_n;
		int n_ch = 0;
J
Johannes Berg 已提交
802 803 804 805

		for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
			if (!local->hw.wiphy->bands[band])
				continue;
S
Stanislaw Gruszka 已提交
806 807 808 809

			max_n = local->hw.wiphy->bands[band]->n_channels;
			for (i = 0; i < max_n; i++) {
				struct ieee80211_channel *tmp_ch =
J
Johannes Berg 已提交
810
				    &local->hw.wiphy->bands[band]->channels[i];
S
Stanislaw Gruszka 已提交
811 812 813 814 815 816 817

				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 已提交
818 819 820
			}
		}

S
Stanislaw Gruszka 已提交
821 822 823 824
		if (WARN_ON_ONCE(n_ch == 0))
			goto unlock;

		local->int_scan_req->n_channels = n_ch;
J
Johannes Berg 已提交
825
	} else {
S
Stanislaw Gruszka 已提交
826 827 828 829
		if (WARN_ON_ONCE(chan->flags & (IEEE80211_CHAN_NO_IBSS |
						IEEE80211_CHAN_DISABLED)))
			goto unlock;

J
Johannes Berg 已提交
830 831 832 833 834 835
		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;
836 837
	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 已提交
838

839
	ret = __ieee80211_start_scan(sdata, sdata->local->int_scan_req);
840
 unlock:
841
	mutex_unlock(&local->mtx);
842
	return ret;
843
}
844

845 846 847
/*
 * Only call this function when a scan can't be queued -- under RTNL.
 */
848 849 850
void ieee80211_scan_cancel(struct ieee80211_local *local)
{
	/*
851
	 * We are canceling software scan, or deferred scan that was not
852 853 854 855 856 857 858 859 860 861 862
	 * 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
	 *
863 864 865
	 * 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.
866
	 */
867

868
	mutex_lock(&local->mtx);
869 870 871 872 873
	if (!local->scan_req)
		goto out;

	if (test_bit(SCAN_HW_SCANNING, &local->scanning)) {
		if (local->ops->cancel_hw_scan)
874 875 876
			drv_cancel_hw_scan(local,
				rcu_dereference_protected(local->scan_sdata,
						lockdep_is_held(&local->mtx)));
877
		goto out;
878
	}
879 880 881 882 883 884 885 886 887 888

	/*
	 * 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:
889
	mutex_unlock(&local->mtx);
890
}
891 892 893 894 895

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 已提交
896
	struct ieee80211_sched_scan_ies sched_scan_ies = {};
897 898 899 900
	int ret, i, iebufsz;

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

902
	mutex_lock(&local->mtx);
903

904
	if (rcu_access_pointer(local->sched_scan_sdata)) {
905 906 907 908 909 910 911 912 913 914
		ret = -EBUSY;
		goto out;
	}

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

	for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
915 916 917
		if (!local->hw.wiphy->bands[i])
			continue;

918
		sched_scan_ies.ie[i] = kzalloc(iebufsz, GFP_KERNEL);
919
		if (!sched_scan_ies.ie[i]) {
920 921 922 923
			ret = -ENOMEM;
			goto out_free;
		}

924 925
		sched_scan_ies.len[i] =
			ieee80211_build_preq_ies(local, sched_scan_ies.ie[i],
926 927
						 iebufsz, req->ie, req->ie_len,
						 i, (u32) -1, 0);
928 929
	}

930 931
	ret = drv_sched_scan_start(local, sdata, req, &sched_scan_ies);
	if (ret == 0)
932
		rcu_assign_pointer(local->sched_scan_sdata, sdata);
933 934 935

out_free:
	while (i > 0)
936
		kfree(sched_scan_ies.ie[--i]);
937
out:
938
	mutex_unlock(&local->mtx);
939 940 941
	return ret;
}

942
int ieee80211_request_sched_scan_stop(struct ieee80211_sub_if_data *sdata)
943 944
{
	struct ieee80211_local *local = sdata->local;
945
	int ret = 0;
946

947
	mutex_lock(&local->mtx);
948 949 950 951 952 953

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

954
	if (rcu_access_pointer(local->sched_scan_sdata))
955
		drv_sched_scan_stop(local, sdata);
956

957
out:
958
	mutex_unlock(&local->mtx);
959 960 961 962 963 964 965 966 967 968 969 970 971 972

	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);

973 974 975 976 977 978 979 980
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);

981
	if (!rcu_access_pointer(local->sched_scan_sdata)) {
982 983 984 985
		mutex_unlock(&local->mtx);
		return;
	}

986
	rcu_assign_pointer(local->sched_scan_sdata, NULL);
987 988 989 990 991 992

	mutex_unlock(&local->mtx);

	cfg80211_sched_scan_stopped(local->hw.wiphy);
}

993 994 995 996 997 998
void ieee80211_sched_scan_stopped(struct ieee80211_hw *hw)
{
	struct ieee80211_local *local = hw_to_local(hw);

	trace_api_sched_scan_stopped(local);

999
	ieee80211_queue_work(&local->hw, &local->sched_scan_stopped_work);
1000 1001
}
EXPORT_SYMBOL(ieee80211_sched_scan_stopped);