ibss.c 35.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * IBSS mode implementation
 * Copyright 2003-2008, Jouni Malinen <j@w1.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>
 * Copyright 2009, Johannes Berg <johannes@sipsolutions.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/delay.h>
16
#include <linux/slab.h>
17 18 19 20 21 22 23 24
#include <linux/if_ether.h>
#include <linux/skbuff.h>
#include <linux/if_arp.h>
#include <linux/etherdevice.h>
#include <linux/rtnetlink.h>
#include <net/mac80211.h>

#include "ieee80211_i.h"
25
#include "driver-ops.h"
26 27 28 29 30 31 32
#include "rate.h"

#define IEEE80211_SCAN_INTERVAL (2 * HZ)
#define IEEE80211_IBSS_JOIN_TIMEOUT (7 * HZ)

#define IEEE80211_IBSS_MERGE_INTERVAL (30 * HZ)
#define IEEE80211_IBSS_INACTIVITY_LIMIT (60 * HZ)
33
#define IEEE80211_IBSS_RSN_INACTIVITY_LIMIT (10 * HZ)
34 35 36

#define IEEE80211_IBSS_MAX_STA_ENTRIES 128

37 38 39 40 41 42
static struct beacon_data *
ieee80211_ibss_build_presp(struct ieee80211_sub_if_data *sdata,
			   const int beacon_int, const u32 basic_rates,
			   const u16 capability, u64 tsf,
			   struct cfg80211_chan_def *chandef,
			   bool *have_higher_than_11mbit)
43 44 45
{
	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
	struct ieee80211_local *local = sdata->local;
46
	int rates_n = 0, i, ri;
47 48 49
	struct ieee80211_mgmt *mgmt;
	u8 *pos;
	struct ieee80211_supported_band *sband;
50
	u32 rate_flags, rates = 0, rates_added = 0;
51 52
	struct beacon_data *presp;
	int frame_len;
53
	int shift;
54

55
	/* Build IBSS probe response */
56 57 58 59 60 61 62 63 64 65 66 67
	frame_len = sizeof(struct ieee80211_hdr_3addr) +
		    12 /* struct ieee80211_mgmt.u.beacon */ +
		    2 + IEEE80211_MAX_SSID_LEN /* max SSID */ +
		    2 + 8 /* max Supported Rates */ +
		    3 /* max DS params */ +
		    4 /* IBSS params */ +
		    2 + (IEEE80211_MAX_SUPP_RATES - 8) +
		    2 + sizeof(struct ieee80211_ht_cap) +
		    2 + sizeof(struct ieee80211_ht_operation) +
		    ifibss->ie_len;
	presp = kzalloc(sizeof(*presp) + frame_len, GFP_KERNEL);
	if (!presp)
68
		return NULL;
69 70 71 72

	presp->head = (void *)(presp + 1);

	mgmt = (void *) presp->head;
73 74
	mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
					  IEEE80211_STYPE_PROBE_RESP);
J
Johannes Berg 已提交
75
	eth_broadcast_addr(mgmt->da);
76
	memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
77
	memcpy(mgmt->bssid, ifibss->bssid, ETH_ALEN);
78
	mgmt->u.beacon.beacon_int = cpu_to_le16(beacon_int);
79
	mgmt->u.beacon.timestamp = cpu_to_le64(tsf);
80 81
	mgmt->u.beacon.capab_info = cpu_to_le16(capability);

82 83
	pos = (u8 *)mgmt + offsetof(struct ieee80211_mgmt, u.beacon.variable);

84 85 86
	*pos++ = WLAN_EID_SSID;
	*pos++ = ifibss->ssid_len;
	memcpy(pos, ifibss->ssid, ifibss->ssid_len);
87
	pos += ifibss->ssid_len;
88

89 90 91 92 93 94 95
	sband = local->hw.wiphy->bands[chandef->chan->band];
	rate_flags = ieee80211_chandef_rate_flags(chandef);
	shift = ieee80211_chandef_get_shift(chandef);
	rates_n = 0;
	if (have_higher_than_11mbit)
		*have_higher_than_11mbit = false;

96 97 98
	for (i = 0; i < sband->n_bitrates; i++) {
		if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
			continue;
99 100 101
		if (sband->bitrates[i].bitrate > 110 &&
		    have_higher_than_11mbit)
			*have_higher_than_11mbit = true;
102 103 104 105 106

		rates |= BIT(i);
		rates_n++;
	}

107
	*pos++ = WLAN_EID_SUPP_RATES;
108 109 110 111
	*pos++ = min_t(int, 8, rates_n);
	for (ri = 0; ri < sband->n_bitrates; ri++) {
		int rate = DIV_ROUND_UP(sband->bitrates[ri].bitrate,
					5 * (1 << shift));
112
		u8 basic = 0;
113 114 115 116
		if (!(rates & BIT(ri)))
			continue;

		if (basic_rates & BIT(ri))
117
			basic = 0x80;
118
		*pos++ = basic | (u8) rate;
119 120
		if (++rates_added == 8) {
			ri++; /* continue at next rate for EXT_SUPP_RATES */
121
			break;
122
		}
123
	}
124 125 126 127

	if (sband->band == IEEE80211_BAND_2GHZ) {
		*pos++ = WLAN_EID_DS_PARAMS;
		*pos++ = 1;
128 129
		*pos++ = ieee80211_frequency_to_channel(
				chandef->chan->center_freq);
130 131 132 133 134 135 136 137
	}

	*pos++ = WLAN_EID_IBSS_PARAMS;
	*pos++ = 2;
	/* FIX: set ATIM window based on scan results */
	*pos++ = 0;
	*pos++ = 0;

138 139
	/* put the remaining rates in WLAN_EID_EXT_SUPP_RATES */
	if (rates_n > 8) {
140
		*pos++ = WLAN_EID_EXT_SUPP_RATES;
141 142 143 144
		*pos++ = rates_n - 8;
		for (; ri < sband->n_bitrates; ri++) {
			int rate = DIV_ROUND_UP(sband->bitrates[ri].bitrate,
						5 * (1 << shift));
145
			u8 basic = 0;
146 147 148 149
			if (!(rates & BIT(ri)))
				continue;

			if (basic_rates & BIT(ri))
150
				basic = 0x80;
151
			*pos++ = basic | (u8) rate;
152
		}
153 154
	}

155 156 157 158
	if (ifibss->ie_len) {
		memcpy(pos, ifibss->ie, ifibss->ie_len);
		pos += ifibss->ie_len;
	}
159

160
	/* add HT capability and information IEs */
161 162 163
	if (chandef->width != NL80211_CHAN_WIDTH_20_NOHT &&
	    chandef->width != NL80211_CHAN_WIDTH_5 &&
	    chandef->width != NL80211_CHAN_WIDTH_10 &&
164
	    sband->ht_cap.ht_supported) {
165 166 167 168 169 170
		struct ieee80211_sta_ht_cap ht_cap;

		memcpy(&ht_cap, &sband->ht_cap, sizeof(ht_cap));
		ieee80211_apply_htcap_overrides(sdata, &ht_cap);

		pos = ieee80211_ie_build_ht_cap(pos, &ht_cap, ht_cap.cap);
171 172 173 174 175
		/*
		 * Note: According to 802.11n-2009 9.13.3.1, HT Protection
		 * field and RIFS Mode are reserved in IBSS mode, therefore
		 * keep them at 0
		 */
176
		pos = ieee80211_ie_build_ht_oper(pos, &sband->ht_cap,
177
						 chandef, 0);
178 179
	}

J
Johannes Berg 已提交
180
	if (local->hw.queues >= IEEE80211_NUM_ACS) {
181 182 183 184 185 186 187 188 189 190 191
		*pos++ = WLAN_EID_VENDOR_SPECIFIC;
		*pos++ = 7; /* len */
		*pos++ = 0x00; /* Microsoft OUI 00:50:F2 */
		*pos++ = 0x50;
		*pos++ = 0xf2;
		*pos++ = 2; /* WME */
		*pos++ = 0; /* WME info */
		*pos++ = 1; /* WME ver */
		*pos++ = 0; /* U-APSD no in use */
	}

192 193
	presp->head_len = pos - presp->head;
	if (WARN_ON(presp->head_len > frame_len))
194 195 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 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
		goto error;

	return presp;
error:
	kfree(presp);
	return NULL;
}

static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
				      const u8 *bssid, const int beacon_int,
				      struct ieee80211_channel *chan,
				      const u32 basic_rates,
				      const u16 capability, u64 tsf,
				      bool creator)
{
	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
	struct ieee80211_local *local = sdata->local;
	struct ieee80211_supported_band *sband;
	struct ieee80211_mgmt *mgmt;
	struct cfg80211_bss *bss;
	u32 bss_change;
	struct cfg80211_chan_def chandef;
	struct beacon_data *presp;
	enum nl80211_bss_scan_width scan_width;
	bool have_higher_than_11mbit;

	sdata_assert_lock(sdata);

	/* Reset own TSF to allow time synchronization work. */
	drv_reset_tsf(local, sdata);

	if (!ether_addr_equal(ifibss->bssid, bssid))
		sta_info_flush(sdata);

	/* if merging, indicate to driver that we leave the old IBSS */
	if (sdata->vif.bss_conf.ibss_joined) {
		sdata->vif.bss_conf.ibss_joined = false;
		sdata->vif.bss_conf.ibss_creator = false;
		sdata->vif.bss_conf.enable_beacon = false;
		netif_carrier_off(sdata->dev);
		ieee80211_bss_info_change_notify(sdata,
						 BSS_CHANGED_IBSS |
						 BSS_CHANGED_BEACON_ENABLED);
	}

	presp = rcu_dereference_protected(ifibss->presp,
					  lockdep_is_held(&sdata->wdev.mtx));
	rcu_assign_pointer(ifibss->presp, NULL);
	if (presp)
		kfree_rcu(presp, rcu_head);

	sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;

	chandef = ifibss->chandef;
	if (!cfg80211_reg_can_beacon(local->hw.wiphy, &chandef)) {
		if (chandef.width == NL80211_CHAN_WIDTH_5 ||
		    chandef.width == NL80211_CHAN_WIDTH_10 ||
		    chandef.width == NL80211_CHAN_WIDTH_20_NOHT ||
		    chandef.width == NL80211_CHAN_WIDTH_20) {
			sdata_info(sdata,
				   "Failed to join IBSS, beacons forbidden\n");
			return;
		}
		chandef.width = NL80211_CHAN_WIDTH_20;
		chandef.center_freq1 = chan->center_freq;
	}

	ieee80211_vif_release_channel(sdata);
	if (ieee80211_vif_use_channel(sdata, &chandef,
				      ifibss->fixed_channel ?
					IEEE80211_CHANCTX_SHARED :
					IEEE80211_CHANCTX_EXCLUSIVE)) {
		sdata_info(sdata, "Failed to join IBSS, no channel context\n");
		return;
	}

	memcpy(ifibss->bssid, bssid, ETH_ALEN);

	sband = local->hw.wiphy->bands[chan->band];

	presp = ieee80211_ibss_build_presp(sdata, beacon_int, basic_rates,
					   capability, tsf, &chandef,
					   &have_higher_than_11mbit);
	if (!presp)
278 279 280
		return;

	rcu_assign_pointer(ifibss->presp, presp);
281
	mgmt = (void *)presp->head;
282

283
	sdata->vif.bss_conf.enable_beacon = true;
284
	sdata->vif.bss_conf.beacon_int = beacon_int;
285
	sdata->vif.bss_conf.basic_rates = basic_rates;
286 287
	sdata->vif.bss_conf.ssid_len = ifibss->ssid_len;
	memcpy(sdata->vif.bss_conf.ssid, ifibss->ssid, ifibss->ssid_len);
288 289 290 291 292
	bss_change = BSS_CHANGED_BEACON_INT;
	bss_change |= ieee80211_reset_erp_info(sdata);
	bss_change |= BSS_CHANGED_BSSID;
	bss_change |= BSS_CHANGED_BEACON;
	bss_change |= BSS_CHANGED_BEACON_ENABLED;
293
	bss_change |= BSS_CHANGED_BASIC_RATES;
294
	bss_change |= BSS_CHANGED_HT;
295
	bss_change |= BSS_CHANGED_IBSS;
296
	bss_change |= BSS_CHANGED_SSID;
297 298 299 300 301 302 303 304 305 306 307 308 309 310

	/*
	 * In 5 GHz/802.11a, we can always use short slot time.
	 * (IEEE 802.11-2012 18.3.8.7)
	 *
	 * In 2.4GHz, we must always use long slots in IBSS for compatibility
	 * reasons.
	 * (IEEE 802.11-2012 19.4.5)
	 *
	 * HT follows these specifications (IEEE 802.11-2012 20.3.18)
	 */
	sdata->vif.bss_conf.use_short_slot = chan->band == IEEE80211_BAND_5GHZ;
	bss_change |= BSS_CHANGED_ERP_SLOT;

311 312 313 314 315 316
	/* cf. IEEE 802.11 9.2.12 */
	if (chan->band == IEEE80211_BAND_2GHZ && have_higher_than_11mbit)
		sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE;
	else
		sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE;

317
	sdata->vif.bss_conf.ibss_joined = true;
318
	sdata->vif.bss_conf.ibss_creator = creator;
319
	ieee80211_bss_info_change_notify(sdata, bss_change);
320

321
	ieee80211_set_wmm_default(sdata, true);
322 323

	ifibss->state = IEEE80211_IBSS_MLME_JOINED;
324 325
	mod_timer(&ifibss->timer,
		  round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL));
326

327 328 329 330
	scan_width = cfg80211_chandef_to_scan_width(&chandef);
	bss = cfg80211_inform_bss_width_frame(local->hw.wiphy, chan,
					      scan_width, mgmt,
					      presp->head_len, 0, GFP_KERNEL);
331
	cfg80211_put_bss(local->hw.wiphy, bss);
332
	netif_carrier_on(sdata->dev);
333
	cfg80211_ibss_joined(sdata->dev, ifibss->bssid, GFP_KERNEL);
334 335
}

336 337
static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
				    struct ieee80211_bss *bss)
338
{
339 340
	struct cfg80211_bss *cbss =
		container_of((void *)bss, struct cfg80211_bss, priv);
341 342 343
	struct ieee80211_supported_band *sband;
	u32 basic_rates;
	int i, j;
344
	u16 beacon_int = cbss->beacon_interval;
J
Johannes Berg 已提交
345 346
	const struct cfg80211_bss_ies *ies;
	u64 tsf;
347 348
	u32 rate_flags;
	int shift;
349

350
	sdata_assert_lock(sdata);
J
Johannes Berg 已提交
351

352 353 354
	if (beacon_int < 10)
		beacon_int = 10;

355
	sband = sdata->local->hw.wiphy->bands[cbss->channel->band];
356 357
	rate_flags = ieee80211_chandef_rate_flags(&sdata->u.ibss.chandef);
	shift = ieee80211_vif_get_shift(&sdata->vif);
358 359 360 361

	basic_rates = 0;

	for (i = 0; i < bss->supp_rates_len; i++) {
362
		int rate = bss->supp_rates[i] & 0x7f;
363 364 365
		bool is_basic = !!(bss->supp_rates[i] & 0x80);

		for (j = 0; j < sband->n_bitrates; j++) {
366 367 368 369 370 371 372 373
			int brate;
			if ((rate_flags & sband->bitrates[j].flags)
			    != rate_flags)
				continue;

			brate = DIV_ROUND_UP(sband->bitrates[j].bitrate,
					     5 * (1 << shift));
			if (brate == rate) {
374 375 376 377 378 379 380
				if (is_basic)
					basic_rates |= BIT(j);
				break;
			}
		}
	}

J
Johannes Berg 已提交
381 382 383 384 385
	rcu_read_lock();
	ies = rcu_dereference(cbss->ies);
	tsf = ies->tsf;
	rcu_read_unlock();

386
	__ieee80211_sta_join_ibss(sdata, cbss->bssid,
387
				  beacon_int,
388
				  cbss->channel,
389
				  basic_rates,
390
				  cbss->capability,
J
Johannes Berg 已提交
391
				  tsf, false);
392 393
}

394
static struct sta_info *ieee80211_ibss_finish_sta(struct sta_info *sta)
395 396 397 398 399 400 401
	__acquires(RCU)
{
	struct ieee80211_sub_if_data *sdata = sta->sdata;
	u8 addr[ETH_ALEN];

	memcpy(addr, sta->sta.addr, ETH_ALEN);

J
Johannes Berg 已提交
402
	ibss_dbg(sdata, "Adding new IBSS station %pM\n", addr);
403

404 405
	sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
	sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
406 407 408 409
	/* authorize the station only if the network is not RSN protected. If
	 * not wait for the userspace to authorize it */
	if (!sta->sdata->u.ibss.control_port)
		sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED);
410 411 412 413 414 415 416 417 418 419

	rate_control_rate_init(sta);

	/* If it fails, maybe we raced another insertion? */
	if (sta_info_insert_rcu(sta))
		return sta_info_get(sdata, addr);
	return sta;
}

static struct sta_info *
420 421
ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, const u8 *bssid,
		       const u8 *addr, u32 supp_rates)
422 423 424 425 426
	__acquires(RCU)
{
	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
	struct ieee80211_local *local = sdata->local;
	struct sta_info *sta;
J
Johannes Berg 已提交
427
	struct ieee80211_chanctx_conf *chanctx_conf;
428
	struct ieee80211_supported_band *sband;
429
	enum nl80211_bss_scan_width scan_width;
J
Johannes Berg 已提交
430
	int band;
431 432 433 434 435 436

	/*
	 * XXX: Consider removing the least recently used entry and
	 * 	allow new one to be added.
	 */
	if (local->num_sta >= IEEE80211_IBSS_MAX_STA_ENTRIES) {
J
Johannes Berg 已提交
437
		net_info_ratelimited("%s: No room for a new IBSS STA entry %pM\n",
438
				    sdata->name, addr);
439 440 441 442 443 444 445 446 447
		rcu_read_lock();
		return NULL;
	}

	if (ifibss->state == IEEE80211_IBSS_MLME_SEARCH) {
		rcu_read_lock();
		return NULL;
	}

448
	if (!ether_addr_equal(bssid, sdata->u.ibss.bssid)) {
449 450 451 452
		rcu_read_lock();
		return NULL;
	}

J
Johannes Berg 已提交
453 454 455 456
	rcu_read_lock();
	chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
	if (WARN_ON_ONCE(!chanctx_conf))
		return NULL;
457
	band = chanctx_conf->def.chan->band;
458
	scan_width = cfg80211_chandef_to_scan_width(&chanctx_conf->def);
J
Johannes Berg 已提交
459 460
	rcu_read_unlock();

461 462 463 464 465 466 467 468 469
	sta = sta_info_alloc(sdata, addr, GFP_KERNEL);
	if (!sta) {
		rcu_read_lock();
		return NULL;
	}

	sta->last_rx = jiffies;

	/* make sure mandatory rates are always added */
470
	sband = local->hw.wiphy->bands[band];
471
	sta->sta.supp_rates[band] = supp_rates |
472
			ieee80211_mandatory_rates(sband, scan_width);
473

474
	return ieee80211_ibss_finish_sta(sta);
475 476
}

477 478 479 480 481 482 483 484 485 486 487 488 489 490
static void ieee80211_rx_mgmt_deauth_ibss(struct ieee80211_sub_if_data *sdata,
					  struct ieee80211_mgmt *mgmt,
					  size_t len)
{
	u16 reason = le16_to_cpu(mgmt->u.deauth.reason_code);

	if (len < IEEE80211_DEAUTH_FRAME_LEN)
		return;

	ibss_dbg(sdata, "RX DeAuth SA=%pM DA=%pM BSSID=%pM (reason: %d)\n",
		 mgmt->sa, mgmt->da, mgmt->bssid, reason);
	sta_info_destroy_addr(sdata, mgmt->sa);
}

491 492 493 494 495 496
static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
					struct ieee80211_mgmt *mgmt,
					size_t len)
{
	u16 auth_alg, auth_transaction;

497
	sdata_assert_lock(sdata);
498 499 500 501 502 503 504

	if (len < 24 + 6)
		return;

	auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
	auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);

J
Johannes Berg 已提交
505 506 507
	ibss_dbg(sdata,
		 "RX Auth SA=%pM DA=%pM BSSID=%pM (auth_transaction=%d)\n",
		 mgmt->sa, mgmt->da, mgmt->bssid, auth_transaction);
508 509 510 511

	if (auth_alg != WLAN_AUTH_OPEN || auth_transaction != 1)
		return;

512 513 514 515 516 517
	/*
	 * IEEE 802.11 standard does not require authentication in IBSS
	 * networks and most implementations do not seem to use it.
	 * However, try to reply to authentication attempts if someone
	 * has actually implemented this.
	 */
518
	ieee80211_send_auth(sdata, 2, WLAN_AUTH_OPEN, 0, NULL, 0,
519
			    mgmt->sa, sdata->u.ibss.bssid, NULL, 0, 0, 0);
520 521
}

522
static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
523
				  struct ieee80211_mgmt *mgmt, size_t len,
524
				  struct ieee80211_rx_status *rx_status,
525
				  struct ieee802_11_elems *elems)
526 527 528
{
	struct ieee80211_local *local = sdata->local;
	int freq;
529
	struct cfg80211_bss *cbss;
530 531 532 533 534 535
	struct ieee80211_bss *bss;
	struct sta_info *sta;
	struct ieee80211_channel *channel;
	u64 beacon_timestamp, rx_timestamp;
	u32 supp_rates = 0;
	enum ieee80211_band band = rx_status->band;
536
	enum nl80211_bss_scan_width scan_width;
537 538
	struct ieee80211_supported_band *sband = local->hw.wiphy->bands[band];
	bool rates_updated = false;
539

540
	if (elems->ds_params)
541 542
		freq = ieee80211_channel_to_frequency(elems->ds_params[0],
						      band);
543 544 545 546 547 548 549 550
	else
		freq = rx_status->freq;

	channel = ieee80211_get_channel(local->hw.wiphy, freq);

	if (!channel || channel->flags & IEEE80211_CHAN_DISABLED)
		return;

551
	if (sdata->vif.type == NL80211_IFTYPE_ADHOC &&
552
	    ether_addr_equal(mgmt->bssid, sdata->u.ibss.bssid)) {
553 554

		rcu_read_lock();
555
		sta = sta_info_get(sdata, mgmt->sa);
556

557
		if (elems->supp_rates) {
558
			supp_rates = ieee80211_sta_get_rates(sdata, elems,
559
							     band, NULL);
560 561 562 563 564
			if (sta) {
				u32 prev_rates;

				prev_rates = sta->sta.supp_rates[band];
				/* make sure mandatory rates are always added */
565 566 567 568 569
				scan_width = NL80211_BSS_CHAN_WIDTH_20;
				if (rx_status->flag & RX_FLAG_5MHZ)
					scan_width = NL80211_BSS_CHAN_WIDTH_5;
				if (rx_status->flag & RX_FLAG_10MHZ)
					scan_width = NL80211_BSS_CHAN_WIDTH_10;
570

571 572 573
				sta->sta.supp_rates[band] = supp_rates |
					ieee80211_mandatory_rates(sband,
								  scan_width);
574
				if (sta->sta.supp_rates[band] != prev_rates) {
J
Johannes Berg 已提交
575 576 577 578
					ibss_dbg(sdata,
						 "updated supp_rates set for %pM based on beacon/probe_resp (0x%x -> 0x%x)\n",
						 sta->sta.addr, prev_rates,
						 sta->sta.supp_rates[band]);
579
					rates_updated = true;
580
				}
581 582
			} else {
				rcu_read_unlock();
583
				sta = ieee80211_ibss_add_sta(sdata, mgmt->bssid,
584
						mgmt->sa, supp_rates);
585
			}
586
		}
587 588

		if (sta && elems->wmm_info)
J
Johannes Berg 已提交
589
			set_sta_flag(sta, WLAN_STA_WME);
590

591
		if (sta && elems->ht_operation && elems->ht_cap_elem &&
592 593 594
		    sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT &&
		    sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_5 &&
		    sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_10) {
595
			/* we both use HT */
596
			struct ieee80211_ht_cap htcap_ie;
597 598 599 600 601
			struct cfg80211_chan_def chandef;

			ieee80211_ht_oper_to_chandef(channel,
						     elems->ht_operation,
						     &chandef);
602

603
			memcpy(&htcap_ie, elems->ht_cap_elem, sizeof(htcap_ie));
604 605 606 607 608

			/*
			 * fall back to HT20 if we don't use or use
			 * the other extension channel
			 */
609 610
			if (chandef.center_freq1 !=
			    sdata->u.ibss.chandef.center_freq1)
611 612 613 614 615
				htcap_ie.cap_info &=
					cpu_to_le16(~IEEE80211_HT_CAP_SUP_WIDTH_20_40);

			rates_updated |= ieee80211_ht_cap_ie_to_sta_ht_cap(
						sdata, sband, &htcap_ie, sta);
616 617
		}

618 619 620
		if (sta && rates_updated) {
			drv_sta_rc_update(local, sdata, &sta->sta,
					  IEEE80211_RC_SUPP_RATES_CHANGED);
621
			rate_control_rate_init(sta);
622
		}
623

624
		rcu_read_unlock();
625 626 627
	}

	bss = ieee80211_bss_info_update(local, rx_status, mgmt, len, elems,
628
					channel);
629 630 631
	if (!bss)
		return;

632 633
	cbss = container_of((void *)bss, struct cfg80211_bss, priv);

J
Johannes Berg 已提交
634 635
	/* same for beacon and probe response */
	beacon_timestamp = le64_to_cpu(mgmt->u.beacon.timestamp);
636 637 638 639

	/* check if we need to merge IBSS */

	/* we use a fixed BSSID */
640
	if (sdata->u.ibss.fixed_bssid)
641 642 643
		goto put_bss;

	/* not an IBSS */
644
	if (!(cbss->capability & WLAN_CAPABILITY_IBSS))
645 646 647
		goto put_bss;

	/* different channel */
J
Johannes Berg 已提交
648
	if (sdata->u.ibss.fixed_channel &&
649
	    sdata->u.ibss.chandef.chan != cbss->channel)
650 651 652 653 654 655 656 657
		goto put_bss;

	/* different SSID */
	if (elems->ssid_len != sdata->u.ibss.ssid_len ||
	    memcmp(elems->ssid, sdata->u.ibss.ssid,
				sdata->u.ibss.ssid_len))
		goto put_bss;

658
	/* same BSSID */
659
	if (ether_addr_equal(cbss->bssid, sdata->u.ibss.bssid))
660 661
		goto put_bss;

662 663 664 665 666
	if (ieee80211_have_rx_timestamp(rx_status)) {
		/* time when timestamp field was received */
		rx_timestamp =
			ieee80211_calculate_rx_timestamp(local, rx_status,
							 len + FCS_LEN, 24);
667 668 669 670 671
	} else {
		/*
		 * second best option: get current TSF
		 * (will return -1 if not supported)
		 */
672
		rx_timestamp = drv_get_tsf(local, sdata);
673
	}
674

J
Johannes Berg 已提交
675 676 677 678 679 680 681
	ibss_dbg(sdata,
		 "RX beacon SA=%pM BSSID=%pM TSF=0x%llx BCN=0x%llx diff=%lld @%lu\n",
		 mgmt->sa, mgmt->bssid,
		 (unsigned long long)rx_timestamp,
		 (unsigned long long)beacon_timestamp,
		 (unsigned long long)(rx_timestamp - beacon_timestamp),
		 jiffies);
682 683

	if (beacon_timestamp > rx_timestamp) {
J
Johannes Berg 已提交
684 685 686
		ibss_dbg(sdata,
			 "beacon TSF higher than local TSF - IBSS merge with BSSID %pM\n",
			 mgmt->bssid);
687
		ieee80211_sta_join_ibss(sdata, bss);
688
		supp_rates = ieee80211_sta_get_rates(sdata, elems, band, NULL);
689
		ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa,
690
				       supp_rates);
691
		rcu_read_unlock();
692 693 694 695 696 697
	}

 put_bss:
	ieee80211_rx_bss_put(local, bss);
}

698 699 700
void ieee80211_ibss_rx_no_sta(struct ieee80211_sub_if_data *sdata,
			      const u8 *bssid, const u8 *addr,
			      u32 supp_rates)
701
{
702
	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
703 704
	struct ieee80211_local *local = sdata->local;
	struct sta_info *sta;
J
Johannes Berg 已提交
705
	struct ieee80211_chanctx_conf *chanctx_conf;
706
	struct ieee80211_supported_band *sband;
707
	enum nl80211_bss_scan_width scan_width;
J
Johannes Berg 已提交
708
	int band;
709

710 711 712 713
	/*
	 * XXX: Consider removing the least recently used entry and
	 * 	allow new one to be added.
	 */
714
	if (local->num_sta >= IEEE80211_IBSS_MAX_STA_ENTRIES) {
J
Johannes Berg 已提交
715
		net_info_ratelimited("%s: No room for a new IBSS STA entry %pM\n",
716
				    sdata->name, addr);
717
		return;
718 719
	}

720
	if (ifibss->state == IEEE80211_IBSS_MLME_SEARCH)
721
		return;
722

723
	if (!ether_addr_equal(bssid, sdata->u.ibss.bssid))
724
		return;
725

J
Johannes Berg 已提交
726 727 728 729 730 731
	rcu_read_lock();
	chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
	if (WARN_ON_ONCE(!chanctx_conf)) {
		rcu_read_unlock();
		return;
	}
732
	band = chanctx_conf->def.chan->band;
733
	scan_width = cfg80211_chandef_to_scan_width(&chanctx_conf->def);
J
Johannes Berg 已提交
734 735
	rcu_read_unlock();

736
	sta = sta_info_alloc(sdata, addr, GFP_ATOMIC);
737
	if (!sta)
738
		return;
739

740
	sta->last_rx = jiffies;
741

742
	/* make sure mandatory rates are always added */
743
	sband = local->hw.wiphy->bands[band];
744
	sta->sta.supp_rates[band] = supp_rates |
745
			ieee80211_mandatory_rates(sband, scan_width);
746

747 748 749 750
	spin_lock(&ifibss->incomplete_lock);
	list_add(&sta->list, &ifibss->incomplete_stations);
	spin_unlock(&ifibss->incomplete_lock);
	ieee80211_queue_work(&local->hw, &sdata->work);
751 752 753 754 755 756 757 758
}

static int ieee80211_sta_active_ibss(struct ieee80211_sub_if_data *sdata)
{
	struct ieee80211_local *local = sdata->local;
	int active = 0;
	struct sta_info *sta;

759
	sdata_assert_lock(sdata);
J
Johannes Berg 已提交
760

761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776
	rcu_read_lock();

	list_for_each_entry_rcu(sta, &local->sta_list, list) {
		if (sta->sdata == sdata &&
		    time_after(sta->last_rx + IEEE80211_IBSS_MERGE_INTERVAL,
			       jiffies)) {
			active++;
			break;
		}
	}

	rcu_read_unlock();

	return active;
}

777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803
static void ieee80211_ibss_sta_expire(struct ieee80211_sub_if_data *sdata)
{
	struct ieee80211_local *local = sdata->local;
	struct sta_info *sta, *tmp;
	unsigned long exp_time = IEEE80211_IBSS_INACTIVITY_LIMIT;
	unsigned long exp_rsn_time = IEEE80211_IBSS_RSN_INACTIVITY_LIMIT;

	mutex_lock(&local->sta_mtx);

	list_for_each_entry_safe(sta, tmp, &local->sta_list, list) {
		if (sdata != sta->sdata)
			continue;

		if (time_after(jiffies, sta->last_rx + exp_time) ||
		    (time_after(jiffies, sta->last_rx + exp_rsn_time) &&
		     sta->sta_state != IEEE80211_STA_AUTHORIZED)) {
			sta_dbg(sta->sdata, "expiring inactive %sSTA %pM\n",
				sta->sta_state != IEEE80211_STA_AUTHORIZED ?
				"not authorized " : "", sta->sta.addr);

			WARN_ON(__sta_info_destroy(sta));
		}
	}

	mutex_unlock(&local->sta_mtx);
}

804 805 806
/*
 * This function is called with state == IEEE80211_IBSS_MLME_JOINED
 */
807 808 809 810

static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata)
{
	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
811
	enum nl80211_bss_scan_width scan_width;
812

813
	sdata_assert_lock(sdata);
J
Johannes Berg 已提交
814

815 816
	mod_timer(&ifibss->timer,
		  round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL));
817

818
	ieee80211_ibss_sta_expire(sdata);
819

S
Sujith 已提交
820 821 822 823
	if (time_before(jiffies, ifibss->last_scan_completed +
		       IEEE80211_IBSS_MERGE_INTERVAL))
		return;

824 825 826
	if (ieee80211_sta_active_ibss(sdata))
		return;

827
	if (ifibss->fixed_channel)
828 829
		return;

J
Johannes Berg 已提交
830 831
	sdata_info(sdata,
		   "No active IBSS STAs - trying to scan for other IBSS networks with same SSID (merge)\n");
832

833
	scan_width = cfg80211_chandef_to_scan_width(&ifibss->chandef);
S
Stanislaw Gruszka 已提交
834
	ieee80211_request_ibss_scan(sdata, ifibss->ssid, ifibss->ssid_len,
835
				    NULL, scan_width);
836 837
}

838
static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
839 840 841 842 843 844
{
	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
	u8 bssid[ETH_ALEN];
	u16 capability;
	int i;

845
	sdata_assert_lock(sdata);
J
Johannes Berg 已提交
846

847
	if (ifibss->fixed_bssid) {
848 849 850 851 852 853 854
		memcpy(bssid, ifibss->bssid, ETH_ALEN);
	} else {
		/* Generate random, not broadcast, locally administered BSSID. Mix in
		 * own MAC address to make sure that devices that do not have proper
		 * random number generator get different BSSID. */
		get_random_bytes(bssid, ETH_ALEN);
		for (i = 0; i < ETH_ALEN; i++)
855
			bssid[i] ^= sdata->vif.addr[i];
856 857 858 859
		bssid[0] &= ~0x01;
		bssid[0] |= 0x02;
	}

J
Johannes Berg 已提交
860
	sdata_info(sdata, "Creating new IBSS network, BSSID %pM\n", bssid);
861 862 863

	capability = WLAN_CAPABILITY_IBSS;

J
Johannes Berg 已提交
864
	if (ifibss->privacy)
865 866 867 868
		capability |= WLAN_CAPABILITY_PRIVACY;
	else
		sdata->drop_unencrypted = 0;

869
	__ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
870
				  ifibss->chandef.chan, ifibss->basic_rates,
871
				  capability, 0, true);
872 873
}

874 875 876 877
/*
 * This function is called with state == IEEE80211_IBSS_MLME_SEARCH
 */

878
static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata)
879 880 881
{
	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
	struct ieee80211_local *local = sdata->local;
882
	struct cfg80211_bss *cbss;
883
	struct ieee80211_channel *chan = NULL;
884
	const u8 *bssid = NULL;
885
	enum nl80211_bss_scan_width scan_width;
886
	int active_ibss;
887
	u16 capability;
888

889
	sdata_assert_lock(sdata);
J
Johannes Berg 已提交
890

891
	active_ibss = ieee80211_sta_active_ibss(sdata);
J
Johannes Berg 已提交
892
	ibss_dbg(sdata, "sta_find_ibss (active_ibss=%d)\n", active_ibss);
893 894

	if (active_ibss)
895
		return;
896

897
	capability = WLAN_CAPABILITY_IBSS;
J
Johannes Berg 已提交
898
	if (ifibss->privacy)
899
		capability |= WLAN_CAPABILITY_PRIVACY;
900 901 902
	if (ifibss->fixed_bssid)
		bssid = ifibss->bssid;
	if (ifibss->fixed_channel)
903
		chan = ifibss->chandef.chan;
904
	if (!is_zero_ether_addr(ifibss->bssid))
905
		bssid = ifibss->bssid;
906 907 908 909 910 911 912
	cbss = cfg80211_get_bss(local->hw.wiphy, chan, bssid,
				ifibss->ssid, ifibss->ssid_len,
				WLAN_CAPABILITY_IBSS | WLAN_CAPABILITY_PRIVACY,
				capability);

	if (cbss) {
		struct ieee80211_bss *bss;
913

914
		bss = (void *)cbss->priv;
J
Johannes Berg 已提交
915 916 917 918 919 920
		ibss_dbg(sdata,
			 "sta_find_ibss: selected %pM current %pM\n",
			 cbss->bssid, ifibss->bssid);
		sdata_info(sdata,
			   "Selected IBSS BSSID %pM based on configured SSID\n",
			   cbss->bssid);
921

922
		ieee80211_sta_join_ibss(sdata, bss);
923
		ieee80211_rx_bss_put(local, bss);
924
		return;
R
Reinette Chatre 已提交
925
	}
926

927 928 929 930 931 932 933 934 935 936 937
	/* if a fixed bssid and a fixed freq have been provided create the IBSS
	 * directly and do not waste time scanning
	 */
	if (ifibss->fixed_bssid && ifibss->fixed_channel) {
		sdata_info(sdata, "Created IBSS using preconfigured BSSID %pM\n",
			   bssid);
		ieee80211_sta_create_ibss(sdata);
		return;
	}


J
Johannes Berg 已提交
938
	ibss_dbg(sdata, "sta_find_ibss: did not try to join ibss\n");
939 940

	/* Selected IBSS not found in current scan results - try to scan */
941
	if (time_after(jiffies, ifibss->last_scan_completed +
942
					IEEE80211_SCAN_INTERVAL)) {
J
Johannes Berg 已提交
943
		sdata_info(sdata, "Trigger new scan to find an IBSS to join\n");
944

945
		scan_width = cfg80211_chandef_to_scan_width(&ifibss->chandef);
S
Stanislaw Gruszka 已提交
946
		ieee80211_request_ibss_scan(sdata, ifibss->ssid,
947 948
					    ifibss->ssid_len, chan,
					    scan_width);
949
	} else {
950 951 952
		int interval = IEEE80211_SCAN_INTERVAL;

		if (time_after(jiffies, ifibss->ibss_join_req +
J
Johannes Berg 已提交
953 954
			       IEEE80211_IBSS_JOIN_TIMEOUT))
			ieee80211_sta_create_ibss(sdata);
955

956 957
		mod_timer(&ifibss->timer,
			  round_jiffies(jiffies + interval));
958 959 960 961
	}
}

static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata,
962
					struct sk_buff *req)
963
{
964
	struct ieee80211_mgmt *mgmt = (void *)req->data;
965 966
	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
	struct ieee80211_local *local = sdata->local;
967
	int tx_last_beacon, len = req->len;
968
	struct sk_buff *skb;
969
	struct beacon_data *presp;
970 971
	u8 *pos, *end;

972
	sdata_assert_lock(sdata);
J
Johannes Berg 已提交
973

J
Johannes Berg 已提交
974
	presp = rcu_dereference_protected(ifibss->presp,
975
					  lockdep_is_held(&sdata->wdev.mtx));
J
Johannes Berg 已提交
976

977
	if (ifibss->state != IEEE80211_IBSS_MLME_JOINED ||
J
Johannes Berg 已提交
978
	    len < 24 + 2 || !presp)
979 980
		return;

981
	tx_last_beacon = drv_tx_last_beacon(local);
982

J
Johannes Berg 已提交
983 984 985
	ibss_dbg(sdata,
		 "RX ProbeReq SA=%pM DA=%pM BSSID=%pM (tx_last_beacon=%d)\n",
		 mgmt->sa, mgmt->da, mgmt->bssid, tx_last_beacon);
986

987
	if (!tx_last_beacon && is_multicast_ether_addr(mgmt->da))
988 989
		return;

990
	if (!ether_addr_equal(mgmt->bssid, ifibss->bssid) &&
991
	    !is_broadcast_ether_addr(mgmt->bssid))
992 993 994 995 996 997
		return;

	end = ((u8 *) mgmt) + len;
	pos = mgmt->u.probe_req.variable;
	if (pos[0] != WLAN_EID_SSID ||
	    pos + 2 + pos[1] > end) {
J
Johannes Berg 已提交
998 999
		ibss_dbg(sdata, "Invalid SSID IE in ProbeReq from %pM\n",
			 mgmt->sa);
1000 1001 1002 1003
		return;
	}
	if (pos[1] != 0 &&
	    (pos[1] != ifibss->ssid_len ||
1004
	     memcmp(pos + 2, ifibss->ssid, ifibss->ssid_len))) {
1005 1006 1007 1008 1009
		/* Ignore ProbeReq for foreign SSID */
		return;
	}

	/* Reply with ProbeResp */
1010
	skb = dev_alloc_skb(local->tx_headroom + presp->head_len);
1011 1012 1013
	if (!skb)
		return;

1014 1015 1016 1017 1018
	skb_reserve(skb, local->tx_headroom);
	memcpy(skb_put(skb, presp->head_len), presp->head, presp->head_len);

	memcpy(((struct ieee80211_mgmt *) skb->data)->da, mgmt->sa, ETH_ALEN);
	ibss_dbg(sdata, "Sending ProbeResp to %pM\n", mgmt->sa);
1019 1020
	IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
	ieee80211_tx_skb(sdata, skb);
1021 1022
}

1023 1024 1025 1026
static
void ieee80211_rx_mgmt_probe_beacon(struct ieee80211_sub_if_data *sdata,
				    struct ieee80211_mgmt *mgmt, size_t len,
				    struct ieee80211_rx_status *rx_status)
1027 1028 1029 1030
{
	size_t baselen;
	struct ieee802_11_elems elems;

1031 1032 1033 1034 1035 1036 1037
	BUILD_BUG_ON(offsetof(typeof(mgmt->u.probe_resp), variable) !=
		     offsetof(typeof(mgmt->u.beacon), variable));

	/*
	 * either beacon or probe_resp but the variable field is at the
	 * same offset
	 */
1038 1039 1040 1041 1042
	baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt;
	if (baselen > len)
		return;

	ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen,
1043
			       false, &elems);
1044

1045
	ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems);
1046 1047
}

1048 1049
void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
				   struct sk_buff *skb)
1050 1051 1052 1053 1054
{
	struct ieee80211_rx_status *rx_status;
	struct ieee80211_mgmt *mgmt;
	u16 fc;

1055
	rx_status = IEEE80211_SKB_RXCB(skb);
1056 1057 1058
	mgmt = (struct ieee80211_mgmt *) skb->data;
	fc = le16_to_cpu(mgmt->frame_control);

1059
	sdata_lock(sdata);
J
Johannes Berg 已提交
1060

1061 1062 1063
	if (!sdata->u.ibss.ssid_len)
		goto mgmt_out; /* not ready to merge yet */

1064 1065
	switch (fc & IEEE80211_FCTL_STYPE) {
	case IEEE80211_STYPE_PROBE_REQ:
1066
		ieee80211_rx_mgmt_probe_req(sdata, skb);
1067 1068 1069
		break;
	case IEEE80211_STYPE_PROBE_RESP:
	case IEEE80211_STYPE_BEACON:
1070 1071
		ieee80211_rx_mgmt_probe_beacon(sdata, mgmt, skb->len,
					       rx_status);
1072 1073 1074 1075
		break;
	case IEEE80211_STYPE_AUTH:
		ieee80211_rx_mgmt_auth_ibss(sdata, mgmt, skb->len);
		break;
1076 1077 1078
	case IEEE80211_STYPE_DEAUTH:
		ieee80211_rx_mgmt_deauth_ibss(sdata, mgmt, skb->len);
		break;
1079
	}
J
Johannes Berg 已提交
1080

1081
 mgmt_out:
1082
	sdata_unlock(sdata);
1083 1084
}

1085
void ieee80211_ibss_work(struct ieee80211_sub_if_data *sdata)
1086
{
1087
	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1088
	struct sta_info *sta;
1089

1090
	sdata_lock(sdata);
J
Johannes Berg 已提交
1091 1092 1093 1094 1095 1096 1097 1098

	/*
	 * Work could be scheduled after scan or similar
	 * when we aren't even joined (or trying) with a
	 * network.
	 */
	if (!ifibss->ssid_len)
		goto out;
1099

1100 1101 1102 1103 1104 1105 1106
	spin_lock_bh(&ifibss->incomplete_lock);
	while (!list_empty(&ifibss->incomplete_stations)) {
		sta = list_first_entry(&ifibss->incomplete_stations,
				       struct sta_info, list);
		list_del(&sta->list);
		spin_unlock_bh(&ifibss->incomplete_lock);

1107
		ieee80211_ibss_finish_sta(sta);
1108 1109 1110 1111 1112
		rcu_read_unlock();
		spin_lock_bh(&ifibss->incomplete_lock);
	}
	spin_unlock_bh(&ifibss->incomplete_lock);

1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124
	switch (ifibss->state) {
	case IEEE80211_IBSS_MLME_SEARCH:
		ieee80211_sta_find_ibss(sdata);
		break;
	case IEEE80211_IBSS_MLME_JOINED:
		ieee80211_sta_merge_ibss(sdata);
		break;
	default:
		WARN_ON(1);
		break;
	}

J
Johannes Berg 已提交
1125
 out:
1126
	sdata_unlock(sdata);
1127 1128
}

1129 1130 1131 1132
static void ieee80211_ibss_timer(unsigned long data)
{
	struct ieee80211_sub_if_data *sdata =
		(struct ieee80211_sub_if_data *) data;
1133

1134
	ieee80211_queue_work(&sdata->local->hw, &sdata->work);
1135 1136
}

1137 1138 1139 1140 1141 1142
void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata)
{
	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;

	setup_timer(&ifibss->timer, ieee80211_ibss_timer,
		    (unsigned long) sdata);
1143 1144
	INIT_LIST_HEAD(&ifibss->incomplete_stations);
	spin_lock_init(&ifibss->incomplete_lock);
1145 1146 1147 1148 1149
}

/* scan finished notification */
void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local)
{
1150
	struct ieee80211_sub_if_data *sdata;
1151

1152 1153
	mutex_lock(&local->iflist_mtx);
	list_for_each_entry(sdata, &local->interfaces, list) {
1154
		if (!ieee80211_sdata_running(sdata))
1155
			continue;
1156 1157 1158
		if (sdata->vif.type != NL80211_IFTYPE_ADHOC)
			continue;
		sdata->u.ibss.last_scan_completed = jiffies;
J
Johannes Berg 已提交
1159
		ieee80211_queue_work(&local->hw, &sdata->work);
1160
	}
1161
	mutex_unlock(&local->iflist_mtx);
1162 1163
}

1164 1165 1166
int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
			struct cfg80211_ibss_params *params)
{
1167
	u32 changed = 0;
1168 1169 1170
	u32 rate_flags;
	struct ieee80211_supported_band *sband;
	int i;
1171 1172 1173 1174 1175 1176 1177

	if (params->bssid) {
		memcpy(sdata->u.ibss.bssid, params->bssid, ETH_ALEN);
		sdata->u.ibss.fixed_bssid = true;
	} else
		sdata->u.ibss.fixed_bssid = false;

J
Johannes Berg 已提交
1178
	sdata->u.ibss.privacy = params->privacy;
1179
	sdata->u.ibss.control_port = params->control_port;
1180
	sdata->u.ibss.basic_rates = params->basic_rates;
1181 1182 1183 1184 1185 1186 1187 1188

	/* fix basic_rates if channel does not support these rates */
	rate_flags = ieee80211_chandef_rate_flags(&params->chandef);
	sband = sdata->local->hw.wiphy->bands[params->chandef.chan->band];
	for (i = 0; i < sband->n_bitrates; i++) {
		if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
			sdata->u.ibss.basic_rates &= ~BIT(i);
	}
1189 1190
	memcpy(sdata->vif.bss_conf.mcast_rate, params->mcast_rate,
	       sizeof(params->mcast_rate));
J
Johannes Berg 已提交
1191

1192 1193
	sdata->vif.bss_conf.beacon_int = params->beacon_interval;

1194
	sdata->u.ibss.chandef = params->chandef;
1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206
	sdata->u.ibss.fixed_channel = params->channel_fixed;

	if (params->ie) {
		sdata->u.ibss.ie = kmemdup(params->ie, params->ie_len,
					   GFP_KERNEL);
		if (sdata->u.ibss.ie)
			sdata->u.ibss.ie_len = params->ie_len;
	}

	sdata->u.ibss.state = IEEE80211_IBSS_MLME_SEARCH;
	sdata->u.ibss.ibss_join_req = jiffies;

1207
	memcpy(sdata->u.ibss.ssid, params->ssid, params->ssid_len);
1208 1209
	sdata->u.ibss.ssid_len = params->ssid_len;

1210 1211 1212 1213 1214
	memcpy(&sdata->u.ibss.ht_capa, &params->ht_capa,
	       sizeof(sdata->u.ibss.ht_capa));
	memcpy(&sdata->u.ibss.ht_capa_mask, &params->ht_capa_mask,
	       sizeof(sdata->u.ibss.ht_capa_mask));

1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231
	/*
	 * 802.11n-2009 9.13.3.1: In an IBSS, the HT Protection field is
	 * reserved, but an HT STA shall protect HT transmissions as though
	 * the HT Protection field were set to non-HT mixed mode.
	 *
	 * In an IBSS, the RIFS Mode field of the HT Operation element is
	 * also reserved, but an HT STA shall operate as though this field
	 * were set to 1.
	 */

	sdata->vif.bss_conf.ht_operation_mode |=
		  IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED
		| IEEE80211_HT_PARAM_RIFS_MODE;

	changed |= BSS_CHANGED_HT;
	ieee80211_bss_info_change_notify(sdata, changed);

1232 1233 1234
	sdata->smps_mode = IEEE80211_SMPS_OFF;
	sdata->needed_rx_chains = sdata->local->rx_chains;

J
Johannes Berg 已提交
1235
	ieee80211_queue_work(&sdata->local->hw, &sdata->work);
1236 1237 1238 1239 1240 1241

	return 0;
}

int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
{
1242 1243 1244 1245
	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
	struct ieee80211_local *local = sdata->local;
	struct cfg80211_bss *cbss;
	u16 capability;
J
Johannes Berg 已提交
1246
	int active_ibss;
1247
	struct sta_info *sta;
1248
	struct beacon_data *presp;
J
Johannes Berg 已提交
1249

1250 1251 1252 1253 1254 1255 1256 1257
	active_ibss = ieee80211_sta_active_ibss(sdata);

	if (!active_ibss && !is_zero_ether_addr(ifibss->bssid)) {
		capability = WLAN_CAPABILITY_IBSS;

		if (ifibss->privacy)
			capability |= WLAN_CAPABILITY_PRIVACY;

1258
		cbss = cfg80211_get_bss(local->hw.wiphy, ifibss->chandef.chan,
1259 1260 1261 1262 1263 1264 1265
					ifibss->bssid, ifibss->ssid,
					ifibss->ssid_len, WLAN_CAPABILITY_IBSS |
					WLAN_CAPABILITY_PRIVACY,
					capability);

		if (cbss) {
			cfg80211_unlink_bss(local->hw.wiphy, cbss);
1266
			cfg80211_put_bss(local->hw.wiphy, cbss);
1267 1268
		}
	}
1269

1270 1271 1272 1273
	ifibss->state = IEEE80211_IBSS_MLME_SEARCH;
	memset(ifibss->bssid, 0, ETH_ALEN);
	ifibss->ssid_len = 0;

1274
	sta_info_flush(sdata);
1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287

	spin_lock_bh(&ifibss->incomplete_lock);
	while (!list_empty(&ifibss->incomplete_stations)) {
		sta = list_first_entry(&ifibss->incomplete_stations,
				       struct sta_info, list);
		list_del(&sta->list);
		spin_unlock_bh(&ifibss->incomplete_lock);

		sta_info_free(local, sta);
		spin_lock_bh(&ifibss->incomplete_lock);
	}
	spin_unlock_bh(&ifibss->incomplete_lock);

1288
	netif_carrier_off(sdata->dev);
1289 1290 1291

	/* remove beacon */
	kfree(sdata->u.ibss.ie);
1292
	presp = rcu_dereference_protected(ifibss->presp,
1293
					  lockdep_is_held(&sdata->wdev.mtx));
1294
	RCU_INIT_POINTER(sdata->u.ibss.presp, NULL);
1295 1296 1297 1298 1299

	/* on the next join, re-program HT parameters */
	memset(&ifibss->ht_capa, 0, sizeof(ifibss->ht_capa));
	memset(&ifibss->ht_capa_mask, 0, sizeof(ifibss->ht_capa_mask));

1300
	sdata->vif.bss_conf.ibss_joined = false;
1301
	sdata->vif.bss_conf.ibss_creator = false;
1302
	sdata->vif.bss_conf.enable_beacon = false;
1303
	sdata->vif.bss_conf.ssid_len = 0;
1304
	clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
1305 1306
	ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED |
						BSS_CHANGED_IBSS);
1307
	synchronize_rcu();
1308
	kfree(presp);
1309

J
Johannes Berg 已提交
1310
	skb_queue_purge(&sdata->skb_queue);
J
Johannes Berg 已提交
1311

1312
	del_timer_sync(&sdata->u.ibss.timer);
J
Johannes Berg 已提交
1313

1314 1315
	return 0;
}