cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ibss.c (52841B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * IBSS mode implementation
      4 * Copyright 2003-2008, Jouni Malinen <j@w1.fi>
      5 * Copyright 2004, Instant802 Networks, Inc.
      6 * Copyright 2005, Devicescape Software, Inc.
      7 * Copyright 2006-2007	Jiri Benc <jbenc@suse.cz>
      8 * Copyright 2007, Michael Wu <flamingice@sourmilk.net>
      9 * Copyright 2009, Johannes Berg <johannes@sipsolutions.net>
     10 * Copyright 2013-2014  Intel Mobile Communications GmbH
     11 * Copyright(c) 2016 Intel Deutschland GmbH
     12 * Copyright(c) 2018-2021 Intel Corporation
     13 */
     14
     15#include <linux/delay.h>
     16#include <linux/slab.h>
     17#include <linux/if_ether.h>
     18#include <linux/skbuff.h>
     19#include <linux/if_arp.h>
     20#include <linux/etherdevice.h>
     21#include <linux/rtnetlink.h>
     22#include <net/mac80211.h>
     23
     24#include "ieee80211_i.h"
     25#include "driver-ops.h"
     26#include "rate.h"
     27
     28#define IEEE80211_SCAN_INTERVAL (2 * HZ)
     29#define IEEE80211_IBSS_JOIN_TIMEOUT (7 * HZ)
     30
     31#define IEEE80211_IBSS_MERGE_INTERVAL (30 * HZ)
     32#define IEEE80211_IBSS_INACTIVITY_LIMIT (60 * HZ)
     33#define IEEE80211_IBSS_RSN_INACTIVITY_LIMIT (10 * HZ)
     34
     35#define IEEE80211_IBSS_MAX_STA_ENTRIES 128
     36
     37static struct beacon_data *
     38ieee80211_ibss_build_presp(struct ieee80211_sub_if_data *sdata,
     39			   const int beacon_int, const u32 basic_rates,
     40			   const u16 capability, u64 tsf,
     41			   struct cfg80211_chan_def *chandef,
     42			   bool *have_higher_than_11mbit,
     43			   struct cfg80211_csa_settings *csa_settings)
     44{
     45	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
     46	struct ieee80211_local *local = sdata->local;
     47	int rates_n = 0, i, ri;
     48	struct ieee80211_mgmt *mgmt;
     49	u8 *pos;
     50	struct ieee80211_supported_band *sband;
     51	u32 rate_flags, rates = 0, rates_added = 0;
     52	struct beacon_data *presp;
     53	int frame_len;
     54	int shift;
     55
     56	/* Build IBSS probe response */
     57	frame_len = sizeof(struct ieee80211_hdr_3addr) +
     58		    12 /* struct ieee80211_mgmt.u.beacon */ +
     59		    2 + IEEE80211_MAX_SSID_LEN /* max SSID */ +
     60		    2 + 8 /* max Supported Rates */ +
     61		    3 /* max DS params */ +
     62		    4 /* IBSS params */ +
     63		    5 /* Channel Switch Announcement */ +
     64		    2 + (IEEE80211_MAX_SUPP_RATES - 8) +
     65		    2 + sizeof(struct ieee80211_ht_cap) +
     66		    2 + sizeof(struct ieee80211_ht_operation) +
     67		    2 + sizeof(struct ieee80211_vht_cap) +
     68		    2 + sizeof(struct ieee80211_vht_operation) +
     69		    ifibss->ie_len;
     70	presp = kzalloc(sizeof(*presp) + frame_len, GFP_KERNEL);
     71	if (!presp)
     72		return NULL;
     73
     74	presp->head = (void *)(presp + 1);
     75
     76	mgmt = (void *) presp->head;
     77	mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
     78					  IEEE80211_STYPE_PROBE_RESP);
     79	eth_broadcast_addr(mgmt->da);
     80	memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
     81	memcpy(mgmt->bssid, ifibss->bssid, ETH_ALEN);
     82	mgmt->u.beacon.beacon_int = cpu_to_le16(beacon_int);
     83	mgmt->u.beacon.timestamp = cpu_to_le64(tsf);
     84	mgmt->u.beacon.capab_info = cpu_to_le16(capability);
     85
     86	pos = (u8 *)mgmt + offsetof(struct ieee80211_mgmt, u.beacon.variable);
     87
     88	*pos++ = WLAN_EID_SSID;
     89	*pos++ = ifibss->ssid_len;
     90	memcpy(pos, ifibss->ssid, ifibss->ssid_len);
     91	pos += ifibss->ssid_len;
     92
     93	sband = local->hw.wiphy->bands[chandef->chan->band];
     94	rate_flags = ieee80211_chandef_rate_flags(chandef);
     95	shift = ieee80211_chandef_get_shift(chandef);
     96	rates_n = 0;
     97	if (have_higher_than_11mbit)
     98		*have_higher_than_11mbit = false;
     99
    100	for (i = 0; i < sband->n_bitrates; i++) {
    101		if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
    102			continue;
    103		if (sband->bitrates[i].bitrate > 110 &&
    104		    have_higher_than_11mbit)
    105			*have_higher_than_11mbit = true;
    106
    107		rates |= BIT(i);
    108		rates_n++;
    109	}
    110
    111	*pos++ = WLAN_EID_SUPP_RATES;
    112	*pos++ = min_t(int, 8, rates_n);
    113	for (ri = 0; ri < sband->n_bitrates; ri++) {
    114		int rate = DIV_ROUND_UP(sband->bitrates[ri].bitrate,
    115					5 * (1 << shift));
    116		u8 basic = 0;
    117		if (!(rates & BIT(ri)))
    118			continue;
    119
    120		if (basic_rates & BIT(ri))
    121			basic = 0x80;
    122		*pos++ = basic | (u8) rate;
    123		if (++rates_added == 8) {
    124			ri++; /* continue at next rate for EXT_SUPP_RATES */
    125			break;
    126		}
    127	}
    128
    129	if (sband->band == NL80211_BAND_2GHZ) {
    130		*pos++ = WLAN_EID_DS_PARAMS;
    131		*pos++ = 1;
    132		*pos++ = ieee80211_frequency_to_channel(
    133				chandef->chan->center_freq);
    134	}
    135
    136	*pos++ = WLAN_EID_IBSS_PARAMS;
    137	*pos++ = 2;
    138	/* FIX: set ATIM window based on scan results */
    139	*pos++ = 0;
    140	*pos++ = 0;
    141
    142	if (csa_settings) {
    143		*pos++ = WLAN_EID_CHANNEL_SWITCH;
    144		*pos++ = 3;
    145		*pos++ = csa_settings->block_tx ? 1 : 0;
    146		*pos++ = ieee80211_frequency_to_channel(
    147				csa_settings->chandef.chan->center_freq);
    148		presp->cntdwn_counter_offsets[0] = (pos - presp->head);
    149		*pos++ = csa_settings->count;
    150		presp->cntdwn_current_counter = csa_settings->count;
    151	}
    152
    153	/* put the remaining rates in WLAN_EID_EXT_SUPP_RATES */
    154	if (rates_n > 8) {
    155		*pos++ = WLAN_EID_EXT_SUPP_RATES;
    156		*pos++ = rates_n - 8;
    157		for (; ri < sband->n_bitrates; ri++) {
    158			int rate = DIV_ROUND_UP(sband->bitrates[ri].bitrate,
    159						5 * (1 << shift));
    160			u8 basic = 0;
    161			if (!(rates & BIT(ri)))
    162				continue;
    163
    164			if (basic_rates & BIT(ri))
    165				basic = 0x80;
    166			*pos++ = basic | (u8) rate;
    167		}
    168	}
    169
    170	if (ifibss->ie_len) {
    171		memcpy(pos, ifibss->ie, ifibss->ie_len);
    172		pos += ifibss->ie_len;
    173	}
    174
    175	/* add HT capability and information IEs */
    176	if (chandef->width != NL80211_CHAN_WIDTH_20_NOHT &&
    177	    chandef->width != NL80211_CHAN_WIDTH_5 &&
    178	    chandef->width != NL80211_CHAN_WIDTH_10 &&
    179	    sband->ht_cap.ht_supported) {
    180		struct ieee80211_sta_ht_cap ht_cap;
    181
    182		memcpy(&ht_cap, &sband->ht_cap, sizeof(ht_cap));
    183		ieee80211_apply_htcap_overrides(sdata, &ht_cap);
    184
    185		pos = ieee80211_ie_build_ht_cap(pos, &ht_cap, ht_cap.cap);
    186		/*
    187		 * Note: According to 802.11n-2009 9.13.3.1, HT Protection
    188		 * field and RIFS Mode are reserved in IBSS mode, therefore
    189		 * keep them at 0
    190		 */
    191		pos = ieee80211_ie_build_ht_oper(pos, &sband->ht_cap,
    192						 chandef, 0, false);
    193
    194		/* add VHT capability and information IEs */
    195		if (chandef->width != NL80211_CHAN_WIDTH_20 &&
    196		    chandef->width != NL80211_CHAN_WIDTH_40 &&
    197		    sband->vht_cap.vht_supported) {
    198			pos = ieee80211_ie_build_vht_cap(pos, &sband->vht_cap,
    199							 sband->vht_cap.cap);
    200			pos = ieee80211_ie_build_vht_oper(pos, &sband->vht_cap,
    201							  chandef);
    202		}
    203	}
    204
    205	if (local->hw.queues >= IEEE80211_NUM_ACS)
    206		pos = ieee80211_add_wmm_info_ie(pos, 0); /* U-APSD not in use */
    207
    208	presp->head_len = pos - presp->head;
    209	if (WARN_ON(presp->head_len > frame_len))
    210		goto error;
    211
    212	return presp;
    213error:
    214	kfree(presp);
    215	return NULL;
    216}
    217
    218static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
    219				      const u8 *bssid, const int beacon_int,
    220				      struct cfg80211_chan_def *req_chandef,
    221				      const u32 basic_rates,
    222				      const u16 capability, u64 tsf,
    223				      bool creator)
    224{
    225	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
    226	struct ieee80211_local *local = sdata->local;
    227	struct ieee80211_mgmt *mgmt;
    228	struct cfg80211_bss *bss;
    229	u32 bss_change;
    230	struct cfg80211_chan_def chandef;
    231	struct ieee80211_channel *chan;
    232	struct beacon_data *presp;
    233	struct cfg80211_inform_bss bss_meta = {};
    234	bool have_higher_than_11mbit;
    235	bool radar_required;
    236	int err;
    237
    238	sdata_assert_lock(sdata);
    239
    240	/* Reset own TSF to allow time synchronization work. */
    241	drv_reset_tsf(local, sdata);
    242
    243	if (!ether_addr_equal(ifibss->bssid, bssid))
    244		sta_info_flush(sdata);
    245
    246	/* if merging, indicate to driver that we leave the old IBSS */
    247	if (sdata->vif.bss_conf.ibss_joined) {
    248		sdata->vif.bss_conf.ibss_joined = false;
    249		sdata->vif.bss_conf.ibss_creator = false;
    250		sdata->vif.bss_conf.enable_beacon = false;
    251		netif_carrier_off(sdata->dev);
    252		ieee80211_bss_info_change_notify(sdata,
    253						 BSS_CHANGED_IBSS |
    254						 BSS_CHANGED_BEACON_ENABLED);
    255		drv_leave_ibss(local, sdata);
    256	}
    257
    258	presp = rcu_dereference_protected(ifibss->presp,
    259					  lockdep_is_held(&sdata->wdev.mtx));
    260	RCU_INIT_POINTER(ifibss->presp, NULL);
    261	if (presp)
    262		kfree_rcu(presp, rcu_head);
    263
    264	/* make a copy of the chandef, it could be modified below. */
    265	chandef = *req_chandef;
    266	chan = chandef.chan;
    267	if (!cfg80211_reg_can_beacon(local->hw.wiphy, &chandef,
    268				     NL80211_IFTYPE_ADHOC)) {
    269		if (chandef.width == NL80211_CHAN_WIDTH_5 ||
    270		    chandef.width == NL80211_CHAN_WIDTH_10 ||
    271		    chandef.width == NL80211_CHAN_WIDTH_20_NOHT ||
    272		    chandef.width == NL80211_CHAN_WIDTH_20) {
    273			sdata_info(sdata,
    274				   "Failed to join IBSS, beacons forbidden\n");
    275			return;
    276		}
    277		chandef.width = NL80211_CHAN_WIDTH_20;
    278		chandef.center_freq1 = chan->center_freq;
    279		/* check again for downgraded chandef */
    280		if (!cfg80211_reg_can_beacon(local->hw.wiphy, &chandef,
    281					     NL80211_IFTYPE_ADHOC)) {
    282			sdata_info(sdata,
    283				   "Failed to join IBSS, beacons forbidden\n");
    284			return;
    285		}
    286	}
    287
    288	err = cfg80211_chandef_dfs_required(sdata->local->hw.wiphy,
    289					    &chandef, NL80211_IFTYPE_ADHOC);
    290	if (err < 0) {
    291		sdata_info(sdata,
    292			   "Failed to join IBSS, invalid chandef\n");
    293		return;
    294	}
    295	if (err > 0 && !ifibss->userspace_handles_dfs) {
    296		sdata_info(sdata,
    297			   "Failed to join IBSS, DFS channel without control program\n");
    298		return;
    299	}
    300
    301	radar_required = err;
    302
    303	mutex_lock(&local->mtx);
    304	if (ieee80211_vif_use_channel(sdata, &chandef,
    305				      ifibss->fixed_channel ?
    306					IEEE80211_CHANCTX_SHARED :
    307					IEEE80211_CHANCTX_EXCLUSIVE)) {
    308		sdata_info(sdata, "Failed to join IBSS, no channel context\n");
    309		mutex_unlock(&local->mtx);
    310		return;
    311	}
    312	sdata->radar_required = radar_required;
    313	mutex_unlock(&local->mtx);
    314
    315	memcpy(ifibss->bssid, bssid, ETH_ALEN);
    316
    317	presp = ieee80211_ibss_build_presp(sdata, beacon_int, basic_rates,
    318					   capability, tsf, &chandef,
    319					   &have_higher_than_11mbit, NULL);
    320	if (!presp)
    321		return;
    322
    323	rcu_assign_pointer(ifibss->presp, presp);
    324	mgmt = (void *)presp->head;
    325
    326	sdata->vif.bss_conf.enable_beacon = true;
    327	sdata->vif.bss_conf.beacon_int = beacon_int;
    328	sdata->vif.bss_conf.basic_rates = basic_rates;
    329	sdata->vif.bss_conf.ssid_len = ifibss->ssid_len;
    330	memcpy(sdata->vif.bss_conf.ssid, ifibss->ssid, ifibss->ssid_len);
    331	bss_change = BSS_CHANGED_BEACON_INT;
    332	bss_change |= ieee80211_reset_erp_info(sdata);
    333	bss_change |= BSS_CHANGED_BSSID;
    334	bss_change |= BSS_CHANGED_BEACON;
    335	bss_change |= BSS_CHANGED_BEACON_ENABLED;
    336	bss_change |= BSS_CHANGED_BASIC_RATES;
    337	bss_change |= BSS_CHANGED_HT;
    338	bss_change |= BSS_CHANGED_IBSS;
    339	bss_change |= BSS_CHANGED_SSID;
    340
    341	/*
    342	 * In 5 GHz/802.11a, we can always use short slot time.
    343	 * (IEEE 802.11-2012 18.3.8.7)
    344	 *
    345	 * In 2.4GHz, we must always use long slots in IBSS for compatibility
    346	 * reasons.
    347	 * (IEEE 802.11-2012 19.4.5)
    348	 *
    349	 * HT follows these specifications (IEEE 802.11-2012 20.3.18)
    350	 */
    351	sdata->vif.bss_conf.use_short_slot = chan->band == NL80211_BAND_5GHZ;
    352	bss_change |= BSS_CHANGED_ERP_SLOT;
    353
    354	/* cf. IEEE 802.11 9.2.12 */
    355	if (chan->band == NL80211_BAND_2GHZ && have_higher_than_11mbit)
    356		sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE;
    357	else
    358		sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE;
    359
    360	ieee80211_set_wmm_default(sdata, true, false);
    361
    362	sdata->vif.bss_conf.ibss_joined = true;
    363	sdata->vif.bss_conf.ibss_creator = creator;
    364
    365	err = drv_join_ibss(local, sdata);
    366	if (err) {
    367		sdata->vif.bss_conf.ibss_joined = false;
    368		sdata->vif.bss_conf.ibss_creator = false;
    369		sdata->vif.bss_conf.enable_beacon = false;
    370		sdata->vif.bss_conf.ssid_len = 0;
    371		RCU_INIT_POINTER(ifibss->presp, NULL);
    372		kfree_rcu(presp, rcu_head);
    373		mutex_lock(&local->mtx);
    374		ieee80211_vif_release_channel(sdata);
    375		mutex_unlock(&local->mtx);
    376		sdata_info(sdata, "Failed to join IBSS, driver failure: %d\n",
    377			   err);
    378		return;
    379	}
    380
    381	ieee80211_bss_info_change_notify(sdata, bss_change);
    382
    383	ifibss->state = IEEE80211_IBSS_MLME_JOINED;
    384	mod_timer(&ifibss->timer,
    385		  round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL));
    386
    387	bss_meta.chan = chan;
    388	bss_meta.scan_width = cfg80211_chandef_to_scan_width(&chandef);
    389	bss = cfg80211_inform_bss_frame_data(local->hw.wiphy, &bss_meta, mgmt,
    390					     presp->head_len, GFP_KERNEL);
    391
    392	cfg80211_put_bss(local->hw.wiphy, bss);
    393	netif_carrier_on(sdata->dev);
    394	cfg80211_ibss_joined(sdata->dev, ifibss->bssid, chan, GFP_KERNEL);
    395}
    396
    397static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
    398				    struct ieee80211_bss *bss)
    399{
    400	struct cfg80211_bss *cbss =
    401		container_of((void *)bss, struct cfg80211_bss, priv);
    402	struct ieee80211_supported_band *sband;
    403	struct cfg80211_chan_def chandef;
    404	u32 basic_rates;
    405	int i, j;
    406	u16 beacon_int = cbss->beacon_interval;
    407	const struct cfg80211_bss_ies *ies;
    408	enum nl80211_channel_type chan_type;
    409	u64 tsf;
    410	u32 rate_flags;
    411	int shift;
    412
    413	sdata_assert_lock(sdata);
    414
    415	if (beacon_int < 10)
    416		beacon_int = 10;
    417
    418	switch (sdata->u.ibss.chandef.width) {
    419	case NL80211_CHAN_WIDTH_20_NOHT:
    420	case NL80211_CHAN_WIDTH_20:
    421	case NL80211_CHAN_WIDTH_40:
    422		chan_type = cfg80211_get_chandef_type(&sdata->u.ibss.chandef);
    423		cfg80211_chandef_create(&chandef, cbss->channel, chan_type);
    424		break;
    425	case NL80211_CHAN_WIDTH_5:
    426	case NL80211_CHAN_WIDTH_10:
    427		cfg80211_chandef_create(&chandef, cbss->channel,
    428					NL80211_CHAN_NO_HT);
    429		chandef.width = sdata->u.ibss.chandef.width;
    430		break;
    431	case NL80211_CHAN_WIDTH_80:
    432	case NL80211_CHAN_WIDTH_80P80:
    433	case NL80211_CHAN_WIDTH_160:
    434		chandef = sdata->u.ibss.chandef;
    435		chandef.chan = cbss->channel;
    436		break;
    437	default:
    438		/* fall back to 20 MHz for unsupported modes */
    439		cfg80211_chandef_create(&chandef, cbss->channel,
    440					NL80211_CHAN_NO_HT);
    441		break;
    442	}
    443
    444	sband = sdata->local->hw.wiphy->bands[cbss->channel->band];
    445	rate_flags = ieee80211_chandef_rate_flags(&sdata->u.ibss.chandef);
    446	shift = ieee80211_vif_get_shift(&sdata->vif);
    447
    448	basic_rates = 0;
    449
    450	for (i = 0; i < bss->supp_rates_len; i++) {
    451		int rate = bss->supp_rates[i] & 0x7f;
    452		bool is_basic = !!(bss->supp_rates[i] & 0x80);
    453
    454		for (j = 0; j < sband->n_bitrates; j++) {
    455			int brate;
    456			if ((rate_flags & sband->bitrates[j].flags)
    457			    != rate_flags)
    458				continue;
    459
    460			brate = DIV_ROUND_UP(sband->bitrates[j].bitrate,
    461					     5 * (1 << shift));
    462			if (brate == rate) {
    463				if (is_basic)
    464					basic_rates |= BIT(j);
    465				break;
    466			}
    467		}
    468	}
    469
    470	rcu_read_lock();
    471	ies = rcu_dereference(cbss->ies);
    472	tsf = ies->tsf;
    473	rcu_read_unlock();
    474
    475	__ieee80211_sta_join_ibss(sdata, cbss->bssid,
    476				  beacon_int,
    477				  &chandef,
    478				  basic_rates,
    479				  cbss->capability,
    480				  tsf, false);
    481}
    482
    483int ieee80211_ibss_csa_beacon(struct ieee80211_sub_if_data *sdata,
    484			      struct cfg80211_csa_settings *csa_settings)
    485{
    486	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
    487	struct beacon_data *presp, *old_presp;
    488	struct cfg80211_bss *cbss;
    489	const struct cfg80211_bss_ies *ies;
    490	u16 capability = WLAN_CAPABILITY_IBSS;
    491	u64 tsf;
    492
    493	sdata_assert_lock(sdata);
    494
    495	if (ifibss->privacy)
    496		capability |= WLAN_CAPABILITY_PRIVACY;
    497
    498	cbss = cfg80211_get_bss(sdata->local->hw.wiphy, ifibss->chandef.chan,
    499				ifibss->bssid, ifibss->ssid,
    500				ifibss->ssid_len, IEEE80211_BSS_TYPE_IBSS,
    501				IEEE80211_PRIVACY(ifibss->privacy));
    502
    503	if (WARN_ON(!cbss))
    504		return -EINVAL;
    505
    506	rcu_read_lock();
    507	ies = rcu_dereference(cbss->ies);
    508	tsf = ies->tsf;
    509	rcu_read_unlock();
    510	cfg80211_put_bss(sdata->local->hw.wiphy, cbss);
    511
    512	old_presp = rcu_dereference_protected(ifibss->presp,
    513					  lockdep_is_held(&sdata->wdev.mtx));
    514
    515	presp = ieee80211_ibss_build_presp(sdata,
    516					   sdata->vif.bss_conf.beacon_int,
    517					   sdata->vif.bss_conf.basic_rates,
    518					   capability, tsf, &ifibss->chandef,
    519					   NULL, csa_settings);
    520	if (!presp)
    521		return -ENOMEM;
    522
    523	rcu_assign_pointer(ifibss->presp, presp);
    524	if (old_presp)
    525		kfree_rcu(old_presp, rcu_head);
    526
    527	return BSS_CHANGED_BEACON;
    528}
    529
    530int ieee80211_ibss_finish_csa(struct ieee80211_sub_if_data *sdata)
    531{
    532	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
    533	struct cfg80211_bss *cbss;
    534
    535	sdata_assert_lock(sdata);
    536
    537	/* update cfg80211 bss information with the new channel */
    538	if (!is_zero_ether_addr(ifibss->bssid)) {
    539		cbss = cfg80211_get_bss(sdata->local->hw.wiphy,
    540					ifibss->chandef.chan,
    541					ifibss->bssid, ifibss->ssid,
    542					ifibss->ssid_len,
    543					IEEE80211_BSS_TYPE_IBSS,
    544					IEEE80211_PRIVACY(ifibss->privacy));
    545		/* XXX: should not really modify cfg80211 data */
    546		if (cbss) {
    547			cbss->channel = sdata->csa_chandef.chan;
    548			cfg80211_put_bss(sdata->local->hw.wiphy, cbss);
    549		}
    550	}
    551
    552	ifibss->chandef = sdata->csa_chandef;
    553
    554	/* generate the beacon */
    555	return ieee80211_ibss_csa_beacon(sdata, NULL);
    556}
    557
    558void ieee80211_ibss_stop(struct ieee80211_sub_if_data *sdata)
    559{
    560	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
    561
    562	cancel_work_sync(&ifibss->csa_connection_drop_work);
    563}
    564
    565static struct sta_info *ieee80211_ibss_finish_sta(struct sta_info *sta)
    566	__acquires(RCU)
    567{
    568	struct ieee80211_sub_if_data *sdata = sta->sdata;
    569	u8 addr[ETH_ALEN];
    570
    571	memcpy(addr, sta->sta.addr, ETH_ALEN);
    572
    573	ibss_dbg(sdata, "Adding new IBSS station %pM\n", addr);
    574
    575	sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
    576	sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
    577	/* authorize the station only if the network is not RSN protected. If
    578	 * not wait for the userspace to authorize it */
    579	if (!sta->sdata->u.ibss.control_port)
    580		sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED);
    581
    582	rate_control_rate_init(sta);
    583
    584	/* If it fails, maybe we raced another insertion? */
    585	if (sta_info_insert_rcu(sta))
    586		return sta_info_get(sdata, addr);
    587	return sta;
    588}
    589
    590static struct sta_info *
    591ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, const u8 *bssid,
    592		       const u8 *addr, u32 supp_rates)
    593	__acquires(RCU)
    594{
    595	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
    596	struct ieee80211_local *local = sdata->local;
    597	struct sta_info *sta;
    598	struct ieee80211_chanctx_conf *chanctx_conf;
    599	struct ieee80211_supported_band *sband;
    600	enum nl80211_bss_scan_width scan_width;
    601	int band;
    602
    603	/*
    604	 * XXX: Consider removing the least recently used entry and
    605	 * 	allow new one to be added.
    606	 */
    607	if (local->num_sta >= IEEE80211_IBSS_MAX_STA_ENTRIES) {
    608		net_info_ratelimited("%s: No room for a new IBSS STA entry %pM\n",
    609				    sdata->name, addr);
    610		rcu_read_lock();
    611		return NULL;
    612	}
    613
    614	if (ifibss->state == IEEE80211_IBSS_MLME_SEARCH) {
    615		rcu_read_lock();
    616		return NULL;
    617	}
    618
    619	if (!ether_addr_equal(bssid, sdata->u.ibss.bssid)) {
    620		rcu_read_lock();
    621		return NULL;
    622	}
    623
    624	rcu_read_lock();
    625	chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
    626	if (WARN_ON_ONCE(!chanctx_conf))
    627		return NULL;
    628	band = chanctx_conf->def.chan->band;
    629	scan_width = cfg80211_chandef_to_scan_width(&chanctx_conf->def);
    630	rcu_read_unlock();
    631
    632	sta = sta_info_alloc(sdata, addr, GFP_KERNEL);
    633	if (!sta) {
    634		rcu_read_lock();
    635		return NULL;
    636	}
    637
    638	/* make sure mandatory rates are always added */
    639	sband = local->hw.wiphy->bands[band];
    640	sta->sta.deflink.supp_rates[band] = supp_rates |
    641			ieee80211_mandatory_rates(sband, scan_width);
    642
    643	return ieee80211_ibss_finish_sta(sta);
    644}
    645
    646static int ieee80211_sta_active_ibss(struct ieee80211_sub_if_data *sdata)
    647{
    648	struct ieee80211_local *local = sdata->local;
    649	int active = 0;
    650	struct sta_info *sta;
    651
    652	sdata_assert_lock(sdata);
    653
    654	rcu_read_lock();
    655
    656	list_for_each_entry_rcu(sta, &local->sta_list, list) {
    657		unsigned long last_active = ieee80211_sta_last_active(sta);
    658
    659		if (sta->sdata == sdata &&
    660		    time_is_after_jiffies(last_active +
    661					  IEEE80211_IBSS_MERGE_INTERVAL)) {
    662			active++;
    663			break;
    664		}
    665	}
    666
    667	rcu_read_unlock();
    668
    669	return active;
    670}
    671
    672static void ieee80211_ibss_disconnect(struct ieee80211_sub_if_data *sdata)
    673{
    674	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
    675	struct ieee80211_local *local = sdata->local;
    676	struct cfg80211_bss *cbss;
    677	struct beacon_data *presp;
    678	struct sta_info *sta;
    679
    680	if (!is_zero_ether_addr(ifibss->bssid)) {
    681		cbss = cfg80211_get_bss(local->hw.wiphy, ifibss->chandef.chan,
    682					ifibss->bssid, ifibss->ssid,
    683					ifibss->ssid_len,
    684					IEEE80211_BSS_TYPE_IBSS,
    685					IEEE80211_PRIVACY(ifibss->privacy));
    686
    687		if (cbss) {
    688			cfg80211_unlink_bss(local->hw.wiphy, cbss);
    689			cfg80211_put_bss(sdata->local->hw.wiphy, cbss);
    690		}
    691	}
    692
    693	ifibss->state = IEEE80211_IBSS_MLME_SEARCH;
    694
    695	sta_info_flush(sdata);
    696
    697	spin_lock_bh(&ifibss->incomplete_lock);
    698	while (!list_empty(&ifibss->incomplete_stations)) {
    699		sta = list_first_entry(&ifibss->incomplete_stations,
    700				       struct sta_info, list);
    701		list_del(&sta->list);
    702		spin_unlock_bh(&ifibss->incomplete_lock);
    703
    704		sta_info_free(local, sta);
    705		spin_lock_bh(&ifibss->incomplete_lock);
    706	}
    707	spin_unlock_bh(&ifibss->incomplete_lock);
    708
    709	netif_carrier_off(sdata->dev);
    710
    711	sdata->vif.bss_conf.ibss_joined = false;
    712	sdata->vif.bss_conf.ibss_creator = false;
    713	sdata->vif.bss_conf.enable_beacon = false;
    714	sdata->vif.bss_conf.ssid_len = 0;
    715
    716	/* remove beacon */
    717	presp = rcu_dereference_protected(ifibss->presp,
    718					  lockdep_is_held(&sdata->wdev.mtx));
    719	RCU_INIT_POINTER(sdata->u.ibss.presp, NULL);
    720	if (presp)
    721		kfree_rcu(presp, rcu_head);
    722
    723	clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
    724	ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED |
    725						BSS_CHANGED_IBSS);
    726	drv_leave_ibss(local, sdata);
    727	mutex_lock(&local->mtx);
    728	ieee80211_vif_release_channel(sdata);
    729	mutex_unlock(&local->mtx);
    730}
    731
    732static void ieee80211_csa_connection_drop_work(struct work_struct *work)
    733{
    734	struct ieee80211_sub_if_data *sdata =
    735		container_of(work, struct ieee80211_sub_if_data,
    736			     u.ibss.csa_connection_drop_work);
    737
    738	sdata_lock(sdata);
    739
    740	ieee80211_ibss_disconnect(sdata);
    741	synchronize_rcu();
    742	skb_queue_purge(&sdata->skb_queue);
    743
    744	/* trigger a scan to find another IBSS network to join */
    745	ieee80211_queue_work(&sdata->local->hw, &sdata->work);
    746
    747	sdata_unlock(sdata);
    748}
    749
    750static void ieee80211_ibss_csa_mark_radar(struct ieee80211_sub_if_data *sdata)
    751{
    752	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
    753	int err;
    754
    755	/* if the current channel is a DFS channel, mark the channel as
    756	 * unavailable.
    757	 */
    758	err = cfg80211_chandef_dfs_required(sdata->local->hw.wiphy,
    759					    &ifibss->chandef,
    760					    NL80211_IFTYPE_ADHOC);
    761	if (err > 0)
    762		cfg80211_radar_event(sdata->local->hw.wiphy, &ifibss->chandef,
    763				     GFP_ATOMIC);
    764}
    765
    766static bool
    767ieee80211_ibss_process_chanswitch(struct ieee80211_sub_if_data *sdata,
    768				  struct ieee802_11_elems *elems,
    769				  bool beacon)
    770{
    771	struct cfg80211_csa_settings params;
    772	struct ieee80211_csa_ie csa_ie;
    773	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
    774	enum nl80211_channel_type ch_type;
    775	int err;
    776	u32 sta_flags;
    777	u32 vht_cap_info = 0;
    778
    779	sdata_assert_lock(sdata);
    780
    781	sta_flags = IEEE80211_STA_DISABLE_VHT;
    782	switch (ifibss->chandef.width) {
    783	case NL80211_CHAN_WIDTH_5:
    784	case NL80211_CHAN_WIDTH_10:
    785	case NL80211_CHAN_WIDTH_20_NOHT:
    786		sta_flags |= IEEE80211_STA_DISABLE_HT;
    787		fallthrough;
    788	case NL80211_CHAN_WIDTH_20:
    789		sta_flags |= IEEE80211_STA_DISABLE_40MHZ;
    790		break;
    791	default:
    792		break;
    793	}
    794
    795	if (elems->vht_cap_elem)
    796		vht_cap_info = le32_to_cpu(elems->vht_cap_elem->vht_cap_info);
    797
    798	memset(&params, 0, sizeof(params));
    799	err = ieee80211_parse_ch_switch_ie(sdata, elems,
    800					   ifibss->chandef.chan->band,
    801					   vht_cap_info,
    802					   sta_flags, ifibss->bssid, &csa_ie);
    803	/* can't switch to destination channel, fail */
    804	if (err < 0)
    805		goto disconnect;
    806
    807	/* did not contain a CSA */
    808	if (err)
    809		return false;
    810
    811	/* channel switch is not supported, disconnect */
    812	if (!(sdata->local->hw.wiphy->flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH))
    813		goto disconnect;
    814
    815	params.count = csa_ie.count;
    816	params.chandef = csa_ie.chandef;
    817
    818	switch (ifibss->chandef.width) {
    819	case NL80211_CHAN_WIDTH_20_NOHT:
    820	case NL80211_CHAN_WIDTH_20:
    821	case NL80211_CHAN_WIDTH_40:
    822		/* keep our current HT mode (HT20/HT40+/HT40-), even if
    823		 * another mode  has been announced. The mode is not adopted
    824		 * within the beacon while doing CSA and we should therefore
    825		 * keep the mode which we announce.
    826		 */
    827		ch_type = cfg80211_get_chandef_type(&ifibss->chandef);
    828		cfg80211_chandef_create(&params.chandef, params.chandef.chan,
    829					ch_type);
    830		break;
    831	case NL80211_CHAN_WIDTH_5:
    832	case NL80211_CHAN_WIDTH_10:
    833		if (params.chandef.width != ifibss->chandef.width) {
    834			sdata_info(sdata,
    835				   "IBSS %pM received channel switch from incompatible channel width (%d MHz, width:%d, CF1/2: %d/%d MHz), disconnecting\n",
    836				   ifibss->bssid,
    837				   params.chandef.chan->center_freq,
    838				   params.chandef.width,
    839				   params.chandef.center_freq1,
    840				   params.chandef.center_freq2);
    841			goto disconnect;
    842		}
    843		break;
    844	default:
    845		/* should not happen, sta_flags should prevent VHT modes. */
    846		WARN_ON(1);
    847		goto disconnect;
    848	}
    849
    850	if (!cfg80211_reg_can_beacon(sdata->local->hw.wiphy, &params.chandef,
    851				     NL80211_IFTYPE_ADHOC)) {
    852		sdata_info(sdata,
    853			   "IBSS %pM switches to unsupported channel (%d MHz, width:%d, CF1/2: %d/%d MHz), disconnecting\n",
    854			   ifibss->bssid,
    855			   params.chandef.chan->center_freq,
    856			   params.chandef.width,
    857			   params.chandef.center_freq1,
    858			   params.chandef.center_freq2);
    859		goto disconnect;
    860	}
    861
    862	err = cfg80211_chandef_dfs_required(sdata->local->hw.wiphy,
    863					    &params.chandef,
    864					    NL80211_IFTYPE_ADHOC);
    865	if (err < 0)
    866		goto disconnect;
    867	if (err > 0 && !ifibss->userspace_handles_dfs) {
    868		/* IBSS-DFS only allowed with a control program */
    869		goto disconnect;
    870	}
    871
    872	params.radar_required = err;
    873
    874	if (cfg80211_chandef_identical(&params.chandef,
    875				       &sdata->vif.bss_conf.chandef)) {
    876		ibss_dbg(sdata,
    877			 "received csa with an identical chandef, ignoring\n");
    878		return true;
    879	}
    880
    881	/* all checks done, now perform the channel switch. */
    882	ibss_dbg(sdata,
    883		 "received channel switch announcement to go to channel %d MHz\n",
    884		 params.chandef.chan->center_freq);
    885
    886	params.block_tx = !!csa_ie.mode;
    887
    888	if (ieee80211_channel_switch(sdata->local->hw.wiphy, sdata->dev,
    889				     &params))
    890		goto disconnect;
    891
    892	ieee80211_ibss_csa_mark_radar(sdata);
    893
    894	return true;
    895disconnect:
    896	ibss_dbg(sdata, "Can't handle channel switch, disconnect\n");
    897	ieee80211_queue_work(&sdata->local->hw,
    898			     &ifibss->csa_connection_drop_work);
    899
    900	ieee80211_ibss_csa_mark_radar(sdata);
    901
    902	return true;
    903}
    904
    905static void
    906ieee80211_rx_mgmt_spectrum_mgmt(struct ieee80211_sub_if_data *sdata,
    907				struct ieee80211_mgmt *mgmt, size_t len,
    908				struct ieee80211_rx_status *rx_status,
    909				struct ieee802_11_elems *elems)
    910{
    911	int required_len;
    912
    913	if (len < IEEE80211_MIN_ACTION_SIZE + 1)
    914		return;
    915
    916	/* CSA is the only action we handle for now */
    917	if (mgmt->u.action.u.measurement.action_code !=
    918	    WLAN_ACTION_SPCT_CHL_SWITCH)
    919		return;
    920
    921	required_len = IEEE80211_MIN_ACTION_SIZE +
    922		       sizeof(mgmt->u.action.u.chan_switch);
    923	if (len < required_len)
    924		return;
    925
    926	if (!sdata->vif.csa_active)
    927		ieee80211_ibss_process_chanswitch(sdata, elems, false);
    928}
    929
    930static void ieee80211_rx_mgmt_deauth_ibss(struct ieee80211_sub_if_data *sdata,
    931					  struct ieee80211_mgmt *mgmt,
    932					  size_t len)
    933{
    934	u16 reason = le16_to_cpu(mgmt->u.deauth.reason_code);
    935
    936	if (len < IEEE80211_DEAUTH_FRAME_LEN)
    937		return;
    938
    939	ibss_dbg(sdata, "RX DeAuth SA=%pM DA=%pM\n", mgmt->sa, mgmt->da);
    940	ibss_dbg(sdata, "\tBSSID=%pM (reason: %d)\n", mgmt->bssid, reason);
    941	sta_info_destroy_addr(sdata, mgmt->sa);
    942}
    943
    944static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
    945					struct ieee80211_mgmt *mgmt,
    946					size_t len)
    947{
    948	u16 auth_alg, auth_transaction;
    949
    950	sdata_assert_lock(sdata);
    951
    952	if (len < 24 + 6)
    953		return;
    954
    955	auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
    956	auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
    957
    958	ibss_dbg(sdata, "RX Auth SA=%pM DA=%pM\n", mgmt->sa, mgmt->da);
    959	ibss_dbg(sdata, "\tBSSID=%pM (auth_transaction=%d)\n",
    960		 mgmt->bssid, auth_transaction);
    961
    962	if (auth_alg != WLAN_AUTH_OPEN || auth_transaction != 1)
    963		return;
    964
    965	/*
    966	 * IEEE 802.11 standard does not require authentication in IBSS
    967	 * networks and most implementations do not seem to use it.
    968	 * However, try to reply to authentication attempts if someone
    969	 * has actually implemented this.
    970	 */
    971	ieee80211_send_auth(sdata, 2, WLAN_AUTH_OPEN, 0, NULL, 0,
    972			    mgmt->sa, sdata->u.ibss.bssid, NULL, 0, 0, 0);
    973}
    974
    975static void ieee80211_update_sta_info(struct ieee80211_sub_if_data *sdata,
    976				      struct ieee80211_mgmt *mgmt, size_t len,
    977				      struct ieee80211_rx_status *rx_status,
    978				      struct ieee802_11_elems *elems,
    979				      struct ieee80211_channel *channel)
    980{
    981	struct sta_info *sta;
    982	enum nl80211_band band = rx_status->band;
    983	enum nl80211_bss_scan_width scan_width;
    984	struct ieee80211_local *local = sdata->local;
    985	struct ieee80211_supported_band *sband;
    986	bool rates_updated = false;
    987	u32 supp_rates = 0;
    988
    989	if (sdata->vif.type != NL80211_IFTYPE_ADHOC)
    990		return;
    991
    992	if (!ether_addr_equal(mgmt->bssid, sdata->u.ibss.bssid))
    993		return;
    994
    995	sband = local->hw.wiphy->bands[band];
    996	if (WARN_ON(!sband))
    997		return;
    998
    999	rcu_read_lock();
   1000	sta = sta_info_get(sdata, mgmt->sa);
   1001
   1002	if (elems->supp_rates) {
   1003		supp_rates = ieee80211_sta_get_rates(sdata, elems,
   1004						     band, NULL);
   1005		if (sta) {
   1006			u32 prev_rates;
   1007
   1008			prev_rates = sta->sta.deflink.supp_rates[band];
   1009			/* make sure mandatory rates are always added */
   1010			scan_width = NL80211_BSS_CHAN_WIDTH_20;
   1011			if (rx_status->bw == RATE_INFO_BW_5)
   1012				scan_width = NL80211_BSS_CHAN_WIDTH_5;
   1013			else if (rx_status->bw == RATE_INFO_BW_10)
   1014				scan_width = NL80211_BSS_CHAN_WIDTH_10;
   1015
   1016			sta->sta.deflink.supp_rates[band] = supp_rates |
   1017				ieee80211_mandatory_rates(sband, scan_width);
   1018			if (sta->sta.deflink.supp_rates[band] != prev_rates) {
   1019				ibss_dbg(sdata,
   1020					 "updated supp_rates set for %pM based on beacon/probe_resp (0x%x -> 0x%x)\n",
   1021					 sta->sta.addr, prev_rates,
   1022					 sta->sta.deflink.supp_rates[band]);
   1023				rates_updated = true;
   1024			}
   1025		} else {
   1026			rcu_read_unlock();
   1027			sta = ieee80211_ibss_add_sta(sdata, mgmt->bssid,
   1028						     mgmt->sa, supp_rates);
   1029		}
   1030	}
   1031
   1032	if (sta && !sta->sta.wme &&
   1033	    (elems->wmm_info || elems->s1g_capab) &&
   1034	    local->hw.queues >= IEEE80211_NUM_ACS) {
   1035		sta->sta.wme = true;
   1036		ieee80211_check_fast_xmit(sta);
   1037	}
   1038
   1039	if (sta && elems->ht_operation && elems->ht_cap_elem &&
   1040	    sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT &&
   1041	    sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_5 &&
   1042	    sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_10) {
   1043		/* we both use HT */
   1044		struct ieee80211_ht_cap htcap_ie;
   1045		struct cfg80211_chan_def chandef;
   1046		enum ieee80211_sta_rx_bandwidth bw = sta->sta.deflink.bandwidth;
   1047
   1048		cfg80211_chandef_create(&chandef, channel, NL80211_CHAN_NO_HT);
   1049		ieee80211_chandef_ht_oper(elems->ht_operation, &chandef);
   1050
   1051		memcpy(&htcap_ie, elems->ht_cap_elem, sizeof(htcap_ie));
   1052		rates_updated |= ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
   1053								   &htcap_ie,
   1054								   sta);
   1055
   1056		if (elems->vht_operation && elems->vht_cap_elem &&
   1057		    sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_20 &&
   1058		    sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_40) {
   1059			/* we both use VHT */
   1060			struct ieee80211_vht_cap cap_ie;
   1061			struct ieee80211_sta_vht_cap cap = sta->sta.deflink.vht_cap;
   1062			u32 vht_cap_info =
   1063				le32_to_cpu(elems->vht_cap_elem->vht_cap_info);
   1064
   1065			ieee80211_chandef_vht_oper(&local->hw, vht_cap_info,
   1066						   elems->vht_operation,
   1067						   elems->ht_operation,
   1068						   &chandef);
   1069			memcpy(&cap_ie, elems->vht_cap_elem, sizeof(cap_ie));
   1070			ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
   1071							    &cap_ie, sta);
   1072			if (memcmp(&cap, &sta->sta.deflink.vht_cap, sizeof(cap)))
   1073				rates_updated |= true;
   1074		}
   1075
   1076		if (bw != sta->sta.deflink.bandwidth)
   1077			rates_updated |= true;
   1078
   1079		if (!cfg80211_chandef_compatible(&sdata->u.ibss.chandef,
   1080						 &chandef))
   1081			WARN_ON_ONCE(1);
   1082	}
   1083
   1084	if (sta && rates_updated) {
   1085		u32 changed = IEEE80211_RC_SUPP_RATES_CHANGED;
   1086		u8 rx_nss = sta->sta.deflink.rx_nss;
   1087
   1088		/* Force rx_nss recalculation */
   1089		sta->sta.deflink.rx_nss = 0;
   1090		rate_control_rate_init(sta);
   1091		if (sta->sta.deflink.rx_nss != rx_nss)
   1092			changed |= IEEE80211_RC_NSS_CHANGED;
   1093
   1094		drv_sta_rc_update(local, sdata, &sta->sta, changed);
   1095	}
   1096
   1097	rcu_read_unlock();
   1098}
   1099
   1100static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
   1101				  struct ieee80211_mgmt *mgmt, size_t len,
   1102				  struct ieee80211_rx_status *rx_status,
   1103				  struct ieee802_11_elems *elems)
   1104{
   1105	struct ieee80211_local *local = sdata->local;
   1106	struct cfg80211_bss *cbss;
   1107	struct ieee80211_bss *bss;
   1108	struct ieee80211_channel *channel;
   1109	u64 beacon_timestamp, rx_timestamp;
   1110	u32 supp_rates = 0;
   1111	enum nl80211_band band = rx_status->band;
   1112
   1113	channel = ieee80211_get_channel(local->hw.wiphy, rx_status->freq);
   1114	if (!channel)
   1115		return;
   1116
   1117	ieee80211_update_sta_info(sdata, mgmt, len, rx_status, elems, channel);
   1118
   1119	bss = ieee80211_bss_info_update(local, rx_status, mgmt, len, channel);
   1120	if (!bss)
   1121		return;
   1122
   1123	cbss = container_of((void *)bss, struct cfg80211_bss, priv);
   1124
   1125	/* same for beacon and probe response */
   1126	beacon_timestamp = le64_to_cpu(mgmt->u.beacon.timestamp);
   1127
   1128	/* check if we need to merge IBSS */
   1129
   1130	/* not an IBSS */
   1131	if (!(cbss->capability & WLAN_CAPABILITY_IBSS))
   1132		goto put_bss;
   1133
   1134	/* different channel */
   1135	if (sdata->u.ibss.fixed_channel &&
   1136	    sdata->u.ibss.chandef.chan != cbss->channel)
   1137		goto put_bss;
   1138
   1139	/* different SSID */
   1140	if (elems->ssid_len != sdata->u.ibss.ssid_len ||
   1141	    memcmp(elems->ssid, sdata->u.ibss.ssid,
   1142				sdata->u.ibss.ssid_len))
   1143		goto put_bss;
   1144
   1145	/* process channel switch */
   1146	if (sdata->vif.csa_active ||
   1147	    ieee80211_ibss_process_chanswitch(sdata, elems, true))
   1148		goto put_bss;
   1149
   1150	/* same BSSID */
   1151	if (ether_addr_equal(cbss->bssid, sdata->u.ibss.bssid))
   1152		goto put_bss;
   1153
   1154	/* we use a fixed BSSID */
   1155	if (sdata->u.ibss.fixed_bssid)
   1156		goto put_bss;
   1157
   1158	if (ieee80211_have_rx_timestamp(rx_status)) {
   1159		/* time when timestamp field was received */
   1160		rx_timestamp =
   1161			ieee80211_calculate_rx_timestamp(local, rx_status,
   1162							 len + FCS_LEN, 24);
   1163	} else {
   1164		/*
   1165		 * second best option: get current TSF
   1166		 * (will return -1 if not supported)
   1167		 */
   1168		rx_timestamp = drv_get_tsf(local, sdata);
   1169	}
   1170
   1171	ibss_dbg(sdata, "RX beacon SA=%pM BSSID=%pM TSF=0x%llx\n",
   1172		 mgmt->sa, mgmt->bssid,
   1173		 (unsigned long long)rx_timestamp);
   1174	ibss_dbg(sdata, "\tBCN=0x%llx diff=%lld @%lu\n",
   1175		 (unsigned long long)beacon_timestamp,
   1176		 (unsigned long long)(rx_timestamp - beacon_timestamp),
   1177		 jiffies);
   1178
   1179	if (beacon_timestamp > rx_timestamp) {
   1180		ibss_dbg(sdata,
   1181			 "beacon TSF higher than local TSF - IBSS merge with BSSID %pM\n",
   1182			 mgmt->bssid);
   1183		ieee80211_sta_join_ibss(sdata, bss);
   1184		supp_rates = ieee80211_sta_get_rates(sdata, elems, band, NULL);
   1185		ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa,
   1186				       supp_rates);
   1187		rcu_read_unlock();
   1188	}
   1189
   1190 put_bss:
   1191	ieee80211_rx_bss_put(local, bss);
   1192}
   1193
   1194void ieee80211_ibss_rx_no_sta(struct ieee80211_sub_if_data *sdata,
   1195			      const u8 *bssid, const u8 *addr,
   1196			      u32 supp_rates)
   1197{
   1198	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
   1199	struct ieee80211_local *local = sdata->local;
   1200	struct sta_info *sta;
   1201	struct ieee80211_chanctx_conf *chanctx_conf;
   1202	struct ieee80211_supported_band *sband;
   1203	enum nl80211_bss_scan_width scan_width;
   1204	int band;
   1205
   1206	/*
   1207	 * XXX: Consider removing the least recently used entry and
   1208	 * 	allow new one to be added.
   1209	 */
   1210	if (local->num_sta >= IEEE80211_IBSS_MAX_STA_ENTRIES) {
   1211		net_info_ratelimited("%s: No room for a new IBSS STA entry %pM\n",
   1212				    sdata->name, addr);
   1213		return;
   1214	}
   1215
   1216	if (ifibss->state == IEEE80211_IBSS_MLME_SEARCH)
   1217		return;
   1218
   1219	if (!ether_addr_equal(bssid, sdata->u.ibss.bssid))
   1220		return;
   1221
   1222	rcu_read_lock();
   1223	chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
   1224	if (WARN_ON_ONCE(!chanctx_conf)) {
   1225		rcu_read_unlock();
   1226		return;
   1227	}
   1228	band = chanctx_conf->def.chan->band;
   1229	scan_width = cfg80211_chandef_to_scan_width(&chanctx_conf->def);
   1230	rcu_read_unlock();
   1231
   1232	sta = sta_info_alloc(sdata, addr, GFP_ATOMIC);
   1233	if (!sta)
   1234		return;
   1235
   1236	/* make sure mandatory rates are always added */
   1237	sband = local->hw.wiphy->bands[band];
   1238	sta->sta.deflink.supp_rates[band] = supp_rates |
   1239			ieee80211_mandatory_rates(sband, scan_width);
   1240
   1241	spin_lock(&ifibss->incomplete_lock);
   1242	list_add(&sta->list, &ifibss->incomplete_stations);
   1243	spin_unlock(&ifibss->incomplete_lock);
   1244	ieee80211_queue_work(&local->hw, &sdata->work);
   1245}
   1246
   1247static void ieee80211_ibss_sta_expire(struct ieee80211_sub_if_data *sdata)
   1248{
   1249	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
   1250	struct ieee80211_local *local = sdata->local;
   1251	struct sta_info *sta, *tmp;
   1252	unsigned long exp_time = IEEE80211_IBSS_INACTIVITY_LIMIT;
   1253	unsigned long exp_rsn = IEEE80211_IBSS_RSN_INACTIVITY_LIMIT;
   1254
   1255	mutex_lock(&local->sta_mtx);
   1256
   1257	list_for_each_entry_safe(sta, tmp, &local->sta_list, list) {
   1258		unsigned long last_active = ieee80211_sta_last_active(sta);
   1259
   1260		if (sdata != sta->sdata)
   1261			continue;
   1262
   1263		if (time_is_before_jiffies(last_active + exp_time) ||
   1264		    (time_is_before_jiffies(last_active + exp_rsn) &&
   1265		     sta->sta_state != IEEE80211_STA_AUTHORIZED)) {
   1266			u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN];
   1267
   1268			sta_dbg(sta->sdata, "expiring inactive %sSTA %pM\n",
   1269				sta->sta_state != IEEE80211_STA_AUTHORIZED ?
   1270				"not authorized " : "", sta->sta.addr);
   1271
   1272			ieee80211_send_deauth_disassoc(sdata, sta->sta.addr,
   1273						       ifibss->bssid,
   1274						       IEEE80211_STYPE_DEAUTH,
   1275						       WLAN_REASON_DEAUTH_LEAVING,
   1276						       true, frame_buf);
   1277			WARN_ON(__sta_info_destroy(sta));
   1278		}
   1279	}
   1280
   1281	mutex_unlock(&local->sta_mtx);
   1282}
   1283
   1284/*
   1285 * This function is called with state == IEEE80211_IBSS_MLME_JOINED
   1286 */
   1287
   1288static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata)
   1289{
   1290	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
   1291	enum nl80211_bss_scan_width scan_width;
   1292
   1293	sdata_assert_lock(sdata);
   1294
   1295	mod_timer(&ifibss->timer,
   1296		  round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL));
   1297
   1298	ieee80211_ibss_sta_expire(sdata);
   1299
   1300	if (time_before(jiffies, ifibss->last_scan_completed +
   1301		       IEEE80211_IBSS_MERGE_INTERVAL))
   1302		return;
   1303
   1304	if (ieee80211_sta_active_ibss(sdata))
   1305		return;
   1306
   1307	if (ifibss->fixed_channel)
   1308		return;
   1309
   1310	sdata_info(sdata,
   1311		   "No active IBSS STAs - trying to scan for other IBSS networks with same SSID (merge)\n");
   1312
   1313	scan_width = cfg80211_chandef_to_scan_width(&ifibss->chandef);
   1314	ieee80211_request_ibss_scan(sdata, ifibss->ssid, ifibss->ssid_len,
   1315				    NULL, 0, scan_width);
   1316}
   1317
   1318static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
   1319{
   1320	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
   1321	u8 bssid[ETH_ALEN];
   1322	u16 capability;
   1323	int i;
   1324
   1325	sdata_assert_lock(sdata);
   1326
   1327	if (ifibss->fixed_bssid) {
   1328		memcpy(bssid, ifibss->bssid, ETH_ALEN);
   1329	} else {
   1330		/* Generate random, not broadcast, locally administered BSSID. Mix in
   1331		 * own MAC address to make sure that devices that do not have proper
   1332		 * random number generator get different BSSID. */
   1333		get_random_bytes(bssid, ETH_ALEN);
   1334		for (i = 0; i < ETH_ALEN; i++)
   1335			bssid[i] ^= sdata->vif.addr[i];
   1336		bssid[0] &= ~0x01;
   1337		bssid[0] |= 0x02;
   1338	}
   1339
   1340	sdata_info(sdata, "Creating new IBSS network, BSSID %pM\n", bssid);
   1341
   1342	capability = WLAN_CAPABILITY_IBSS;
   1343
   1344	if (ifibss->privacy)
   1345		capability |= WLAN_CAPABILITY_PRIVACY;
   1346
   1347	__ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
   1348				  &ifibss->chandef, ifibss->basic_rates,
   1349				  capability, 0, true);
   1350}
   1351
   1352static unsigned ibss_setup_channels(struct wiphy *wiphy,
   1353				    struct ieee80211_channel **channels,
   1354				    unsigned int channels_max,
   1355				    u32 center_freq, u32 width)
   1356{
   1357	struct ieee80211_channel *chan = NULL;
   1358	unsigned int n_chan = 0;
   1359	u32 start_freq, end_freq, freq;
   1360
   1361	if (width <= 20) {
   1362		start_freq = center_freq;
   1363		end_freq = center_freq;
   1364	} else {
   1365		start_freq = center_freq - width / 2 + 10;
   1366		end_freq = center_freq + width / 2 - 10;
   1367	}
   1368
   1369	for (freq = start_freq; freq <= end_freq; freq += 20) {
   1370		chan = ieee80211_get_channel(wiphy, freq);
   1371		if (!chan)
   1372			continue;
   1373		if (n_chan >= channels_max)
   1374			return n_chan;
   1375
   1376		channels[n_chan] = chan;
   1377		n_chan++;
   1378	}
   1379
   1380	return n_chan;
   1381}
   1382
   1383static unsigned int
   1384ieee80211_ibss_setup_scan_channels(struct wiphy *wiphy,
   1385				   const struct cfg80211_chan_def *chandef,
   1386				   struct ieee80211_channel **channels,
   1387				   unsigned int channels_max)
   1388{
   1389	unsigned int n_chan = 0;
   1390	u32 width, cf1, cf2 = 0;
   1391
   1392	switch (chandef->width) {
   1393	case NL80211_CHAN_WIDTH_40:
   1394		width = 40;
   1395		break;
   1396	case NL80211_CHAN_WIDTH_80P80:
   1397		cf2 = chandef->center_freq2;
   1398		fallthrough;
   1399	case NL80211_CHAN_WIDTH_80:
   1400		width = 80;
   1401		break;
   1402	case NL80211_CHAN_WIDTH_160:
   1403		width = 160;
   1404		break;
   1405	default:
   1406		width = 20;
   1407		break;
   1408	}
   1409
   1410	cf1 = chandef->center_freq1;
   1411
   1412	n_chan = ibss_setup_channels(wiphy, channels, channels_max, cf1, width);
   1413
   1414	if (cf2)
   1415		n_chan += ibss_setup_channels(wiphy, &channels[n_chan],
   1416					      channels_max - n_chan, cf2,
   1417					      width);
   1418
   1419	return n_chan;
   1420}
   1421
   1422/*
   1423 * This function is called with state == IEEE80211_IBSS_MLME_SEARCH
   1424 */
   1425
   1426static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata)
   1427{
   1428	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
   1429	struct ieee80211_local *local = sdata->local;
   1430	struct cfg80211_bss *cbss;
   1431	struct ieee80211_channel *chan = NULL;
   1432	const u8 *bssid = NULL;
   1433	enum nl80211_bss_scan_width scan_width;
   1434	int active_ibss;
   1435
   1436	sdata_assert_lock(sdata);
   1437
   1438	active_ibss = ieee80211_sta_active_ibss(sdata);
   1439	ibss_dbg(sdata, "sta_find_ibss (active_ibss=%d)\n", active_ibss);
   1440
   1441	if (active_ibss)
   1442		return;
   1443
   1444	if (ifibss->fixed_bssid)
   1445		bssid = ifibss->bssid;
   1446	if (ifibss->fixed_channel)
   1447		chan = ifibss->chandef.chan;
   1448	if (!is_zero_ether_addr(ifibss->bssid))
   1449		bssid = ifibss->bssid;
   1450	cbss = cfg80211_get_bss(local->hw.wiphy, chan, bssid,
   1451				ifibss->ssid, ifibss->ssid_len,
   1452				IEEE80211_BSS_TYPE_IBSS,
   1453				IEEE80211_PRIVACY(ifibss->privacy));
   1454
   1455	if (cbss) {
   1456		struct ieee80211_bss *bss;
   1457
   1458		bss = (void *)cbss->priv;
   1459		ibss_dbg(sdata,
   1460			 "sta_find_ibss: selected %pM current %pM\n",
   1461			 cbss->bssid, ifibss->bssid);
   1462		sdata_info(sdata,
   1463			   "Selected IBSS BSSID %pM based on configured SSID\n",
   1464			   cbss->bssid);
   1465
   1466		ieee80211_sta_join_ibss(sdata, bss);
   1467		ieee80211_rx_bss_put(local, bss);
   1468		return;
   1469	}
   1470
   1471	/* if a fixed bssid and a fixed freq have been provided create the IBSS
   1472	 * directly and do not waste time scanning
   1473	 */
   1474	if (ifibss->fixed_bssid && ifibss->fixed_channel) {
   1475		sdata_info(sdata, "Created IBSS using preconfigured BSSID %pM\n",
   1476			   bssid);
   1477		ieee80211_sta_create_ibss(sdata);
   1478		return;
   1479	}
   1480
   1481
   1482	ibss_dbg(sdata, "sta_find_ibss: did not try to join ibss\n");
   1483
   1484	/* Selected IBSS not found in current scan results - try to scan */
   1485	if (time_after(jiffies, ifibss->last_scan_completed +
   1486					IEEE80211_SCAN_INTERVAL)) {
   1487		struct ieee80211_channel *channels[8];
   1488		unsigned int num;
   1489
   1490		sdata_info(sdata, "Trigger new scan to find an IBSS to join\n");
   1491
   1492		scan_width = cfg80211_chandef_to_scan_width(&ifibss->chandef);
   1493
   1494		if (ifibss->fixed_channel) {
   1495			num = ieee80211_ibss_setup_scan_channels(local->hw.wiphy,
   1496								 &ifibss->chandef,
   1497								 channels,
   1498								 ARRAY_SIZE(channels));
   1499			ieee80211_request_ibss_scan(sdata, ifibss->ssid,
   1500						    ifibss->ssid_len, channels,
   1501						    num, scan_width);
   1502		} else {
   1503			ieee80211_request_ibss_scan(sdata, ifibss->ssid,
   1504						    ifibss->ssid_len, NULL,
   1505						    0, scan_width);
   1506		}
   1507	} else {
   1508		int interval = IEEE80211_SCAN_INTERVAL;
   1509
   1510		if (time_after(jiffies, ifibss->ibss_join_req +
   1511			       IEEE80211_IBSS_JOIN_TIMEOUT))
   1512			ieee80211_sta_create_ibss(sdata);
   1513
   1514		mod_timer(&ifibss->timer,
   1515			  round_jiffies(jiffies + interval));
   1516	}
   1517}
   1518
   1519static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata,
   1520					struct sk_buff *req)
   1521{
   1522	struct ieee80211_mgmt *mgmt = (void *)req->data;
   1523	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
   1524	struct ieee80211_local *local = sdata->local;
   1525	int tx_last_beacon, len = req->len;
   1526	struct sk_buff *skb;
   1527	struct beacon_data *presp;
   1528	u8 *pos, *end;
   1529
   1530	sdata_assert_lock(sdata);
   1531
   1532	presp = rcu_dereference_protected(ifibss->presp,
   1533					  lockdep_is_held(&sdata->wdev.mtx));
   1534
   1535	if (ifibss->state != IEEE80211_IBSS_MLME_JOINED ||
   1536	    len < 24 + 2 || !presp)
   1537		return;
   1538
   1539	tx_last_beacon = drv_tx_last_beacon(local);
   1540
   1541	ibss_dbg(sdata, "RX ProbeReq SA=%pM DA=%pM\n", mgmt->sa, mgmt->da);
   1542	ibss_dbg(sdata, "\tBSSID=%pM (tx_last_beacon=%d)\n",
   1543		 mgmt->bssid, tx_last_beacon);
   1544
   1545	if (!tx_last_beacon && is_multicast_ether_addr(mgmt->da))
   1546		return;
   1547
   1548	if (!ether_addr_equal(mgmt->bssid, ifibss->bssid) &&
   1549	    !is_broadcast_ether_addr(mgmt->bssid))
   1550		return;
   1551
   1552	end = ((u8 *) mgmt) + len;
   1553	pos = mgmt->u.probe_req.variable;
   1554	if (pos[0] != WLAN_EID_SSID ||
   1555	    pos + 2 + pos[1] > end) {
   1556		ibss_dbg(sdata, "Invalid SSID IE in ProbeReq from %pM\n",
   1557			 mgmt->sa);
   1558		return;
   1559	}
   1560	if (pos[1] != 0 &&
   1561	    (pos[1] != ifibss->ssid_len ||
   1562	     memcmp(pos + 2, ifibss->ssid, ifibss->ssid_len))) {
   1563		/* Ignore ProbeReq for foreign SSID */
   1564		return;
   1565	}
   1566
   1567	/* Reply with ProbeResp */
   1568	skb = dev_alloc_skb(local->tx_headroom + presp->head_len);
   1569	if (!skb)
   1570		return;
   1571
   1572	skb_reserve(skb, local->tx_headroom);
   1573	skb_put_data(skb, presp->head, presp->head_len);
   1574
   1575	memcpy(((struct ieee80211_mgmt *) skb->data)->da, mgmt->sa, ETH_ALEN);
   1576	ibss_dbg(sdata, "Sending ProbeResp to %pM\n", mgmt->sa);
   1577	IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
   1578
   1579	/* avoid excessive retries for probe request to wildcard SSIDs */
   1580	if (pos[1] == 0)
   1581		IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_NO_ACK;
   1582
   1583	ieee80211_tx_skb(sdata, skb);
   1584}
   1585
   1586static
   1587void ieee80211_rx_mgmt_probe_beacon(struct ieee80211_sub_if_data *sdata,
   1588				    struct ieee80211_mgmt *mgmt, size_t len,
   1589				    struct ieee80211_rx_status *rx_status)
   1590{
   1591	size_t baselen;
   1592	struct ieee802_11_elems *elems;
   1593
   1594	BUILD_BUG_ON(offsetof(typeof(mgmt->u.probe_resp), variable) !=
   1595		     offsetof(typeof(mgmt->u.beacon), variable));
   1596
   1597	/*
   1598	 * either beacon or probe_resp but the variable field is at the
   1599	 * same offset
   1600	 */
   1601	baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt;
   1602	if (baselen > len)
   1603		return;
   1604
   1605	elems = ieee802_11_parse_elems(mgmt->u.probe_resp.variable,
   1606				       len - baselen, false,
   1607				       mgmt->bssid, NULL);
   1608
   1609	if (elems) {
   1610		ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, elems);
   1611		kfree(elems);
   1612	}
   1613}
   1614
   1615void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
   1616				   struct sk_buff *skb)
   1617{
   1618	struct ieee80211_rx_status *rx_status;
   1619	struct ieee80211_mgmt *mgmt;
   1620	u16 fc;
   1621	struct ieee802_11_elems *elems;
   1622	int ies_len;
   1623
   1624	rx_status = IEEE80211_SKB_RXCB(skb);
   1625	mgmt = (struct ieee80211_mgmt *) skb->data;
   1626	fc = le16_to_cpu(mgmt->frame_control);
   1627
   1628	sdata_lock(sdata);
   1629
   1630	if (!sdata->u.ibss.ssid_len)
   1631		goto mgmt_out; /* not ready to merge yet */
   1632
   1633	switch (fc & IEEE80211_FCTL_STYPE) {
   1634	case IEEE80211_STYPE_PROBE_REQ:
   1635		ieee80211_rx_mgmt_probe_req(sdata, skb);
   1636		break;
   1637	case IEEE80211_STYPE_PROBE_RESP:
   1638	case IEEE80211_STYPE_BEACON:
   1639		ieee80211_rx_mgmt_probe_beacon(sdata, mgmt, skb->len,
   1640					       rx_status);
   1641		break;
   1642	case IEEE80211_STYPE_AUTH:
   1643		ieee80211_rx_mgmt_auth_ibss(sdata, mgmt, skb->len);
   1644		break;
   1645	case IEEE80211_STYPE_DEAUTH:
   1646		ieee80211_rx_mgmt_deauth_ibss(sdata, mgmt, skb->len);
   1647		break;
   1648	case IEEE80211_STYPE_ACTION:
   1649		switch (mgmt->u.action.category) {
   1650		case WLAN_CATEGORY_SPECTRUM_MGMT:
   1651			ies_len = skb->len -
   1652				  offsetof(struct ieee80211_mgmt,
   1653					   u.action.u.chan_switch.variable);
   1654
   1655			if (ies_len < 0)
   1656				break;
   1657
   1658			elems = ieee802_11_parse_elems(
   1659				mgmt->u.action.u.chan_switch.variable,
   1660				ies_len, true, mgmt->bssid, NULL);
   1661
   1662			if (elems && !elems->parse_error)
   1663				ieee80211_rx_mgmt_spectrum_mgmt(sdata, mgmt,
   1664								skb->len,
   1665								rx_status,
   1666								elems);
   1667			kfree(elems);
   1668			break;
   1669		}
   1670	}
   1671
   1672 mgmt_out:
   1673	sdata_unlock(sdata);
   1674}
   1675
   1676void ieee80211_ibss_work(struct ieee80211_sub_if_data *sdata)
   1677{
   1678	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
   1679	struct sta_info *sta;
   1680
   1681	sdata_lock(sdata);
   1682
   1683	/*
   1684	 * Work could be scheduled after scan or similar
   1685	 * when we aren't even joined (or trying) with a
   1686	 * network.
   1687	 */
   1688	if (!ifibss->ssid_len)
   1689		goto out;
   1690
   1691	spin_lock_bh(&ifibss->incomplete_lock);
   1692	while (!list_empty(&ifibss->incomplete_stations)) {
   1693		sta = list_first_entry(&ifibss->incomplete_stations,
   1694				       struct sta_info, list);
   1695		list_del(&sta->list);
   1696		spin_unlock_bh(&ifibss->incomplete_lock);
   1697
   1698		ieee80211_ibss_finish_sta(sta);
   1699		rcu_read_unlock();
   1700		spin_lock_bh(&ifibss->incomplete_lock);
   1701	}
   1702	spin_unlock_bh(&ifibss->incomplete_lock);
   1703
   1704	switch (ifibss->state) {
   1705	case IEEE80211_IBSS_MLME_SEARCH:
   1706		ieee80211_sta_find_ibss(sdata);
   1707		break;
   1708	case IEEE80211_IBSS_MLME_JOINED:
   1709		ieee80211_sta_merge_ibss(sdata);
   1710		break;
   1711	default:
   1712		WARN_ON(1);
   1713		break;
   1714	}
   1715
   1716 out:
   1717	sdata_unlock(sdata);
   1718}
   1719
   1720static void ieee80211_ibss_timer(struct timer_list *t)
   1721{
   1722	struct ieee80211_sub_if_data *sdata =
   1723		from_timer(sdata, t, u.ibss.timer);
   1724
   1725	ieee80211_queue_work(&sdata->local->hw, &sdata->work);
   1726}
   1727
   1728void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata)
   1729{
   1730	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
   1731
   1732	timer_setup(&ifibss->timer, ieee80211_ibss_timer, 0);
   1733	INIT_LIST_HEAD(&ifibss->incomplete_stations);
   1734	spin_lock_init(&ifibss->incomplete_lock);
   1735	INIT_WORK(&ifibss->csa_connection_drop_work,
   1736		  ieee80211_csa_connection_drop_work);
   1737}
   1738
   1739/* scan finished notification */
   1740void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local)
   1741{
   1742	struct ieee80211_sub_if_data *sdata;
   1743
   1744	mutex_lock(&local->iflist_mtx);
   1745	list_for_each_entry(sdata, &local->interfaces, list) {
   1746		if (!ieee80211_sdata_running(sdata))
   1747			continue;
   1748		if (sdata->vif.type != NL80211_IFTYPE_ADHOC)
   1749			continue;
   1750		sdata->u.ibss.last_scan_completed = jiffies;
   1751	}
   1752	mutex_unlock(&local->iflist_mtx);
   1753}
   1754
   1755int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
   1756			struct cfg80211_ibss_params *params)
   1757{
   1758	u32 changed = 0;
   1759	u32 rate_flags;
   1760	struct ieee80211_supported_band *sband;
   1761	enum ieee80211_chanctx_mode chanmode;
   1762	struct ieee80211_local *local = sdata->local;
   1763	int radar_detect_width = 0;
   1764	int i;
   1765	int ret;
   1766
   1767	if (params->chandef.chan->freq_offset) {
   1768		/* this may work, but is untested */
   1769		return -EOPNOTSUPP;
   1770	}
   1771
   1772	ret = cfg80211_chandef_dfs_required(local->hw.wiphy,
   1773					    &params->chandef,
   1774					    sdata->wdev.iftype);
   1775	if (ret < 0)
   1776		return ret;
   1777
   1778	if (ret > 0) {
   1779		if (!params->userspace_handles_dfs)
   1780			return -EINVAL;
   1781		radar_detect_width = BIT(params->chandef.width);
   1782	}
   1783
   1784	chanmode = (params->channel_fixed && !ret) ?
   1785		IEEE80211_CHANCTX_SHARED : IEEE80211_CHANCTX_EXCLUSIVE;
   1786
   1787	mutex_lock(&local->chanctx_mtx);
   1788	ret = ieee80211_check_combinations(sdata, &params->chandef, chanmode,
   1789					   radar_detect_width);
   1790	mutex_unlock(&local->chanctx_mtx);
   1791	if (ret < 0)
   1792		return ret;
   1793
   1794	if (params->bssid) {
   1795		memcpy(sdata->u.ibss.bssid, params->bssid, ETH_ALEN);
   1796		sdata->u.ibss.fixed_bssid = true;
   1797	} else
   1798		sdata->u.ibss.fixed_bssid = false;
   1799
   1800	sdata->u.ibss.privacy = params->privacy;
   1801	sdata->u.ibss.control_port = params->control_port;
   1802	sdata->u.ibss.userspace_handles_dfs = params->userspace_handles_dfs;
   1803	sdata->u.ibss.basic_rates = params->basic_rates;
   1804	sdata->u.ibss.last_scan_completed = jiffies;
   1805
   1806	/* fix basic_rates if channel does not support these rates */
   1807	rate_flags = ieee80211_chandef_rate_flags(&params->chandef);
   1808	sband = local->hw.wiphy->bands[params->chandef.chan->band];
   1809	for (i = 0; i < sband->n_bitrates; i++) {
   1810		if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
   1811			sdata->u.ibss.basic_rates &= ~BIT(i);
   1812	}
   1813	memcpy(sdata->vif.bss_conf.mcast_rate, params->mcast_rate,
   1814	       sizeof(params->mcast_rate));
   1815
   1816	sdata->vif.bss_conf.beacon_int = params->beacon_interval;
   1817
   1818	sdata->u.ibss.chandef = params->chandef;
   1819	sdata->u.ibss.fixed_channel = params->channel_fixed;
   1820
   1821	if (params->ie) {
   1822		sdata->u.ibss.ie = kmemdup(params->ie, params->ie_len,
   1823					   GFP_KERNEL);
   1824		if (sdata->u.ibss.ie)
   1825			sdata->u.ibss.ie_len = params->ie_len;
   1826	}
   1827
   1828	sdata->u.ibss.state = IEEE80211_IBSS_MLME_SEARCH;
   1829	sdata->u.ibss.ibss_join_req = jiffies;
   1830
   1831	memcpy(sdata->u.ibss.ssid, params->ssid, params->ssid_len);
   1832	sdata->u.ibss.ssid_len = params->ssid_len;
   1833
   1834	memcpy(&sdata->u.ibss.ht_capa, &params->ht_capa,
   1835	       sizeof(sdata->u.ibss.ht_capa));
   1836	memcpy(&sdata->u.ibss.ht_capa_mask, &params->ht_capa_mask,
   1837	       sizeof(sdata->u.ibss.ht_capa_mask));
   1838
   1839	/*
   1840	 * 802.11n-2009 9.13.3.1: In an IBSS, the HT Protection field is
   1841	 * reserved, but an HT STA shall protect HT transmissions as though
   1842	 * the HT Protection field were set to non-HT mixed mode.
   1843	 *
   1844	 * In an IBSS, the RIFS Mode field of the HT Operation element is
   1845	 * also reserved, but an HT STA shall operate as though this field
   1846	 * were set to 1.
   1847	 */
   1848
   1849	sdata->vif.bss_conf.ht_operation_mode |=
   1850		  IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED
   1851		| IEEE80211_HT_PARAM_RIFS_MODE;
   1852
   1853	changed |= BSS_CHANGED_HT | BSS_CHANGED_MCAST_RATE;
   1854	ieee80211_bss_info_change_notify(sdata, changed);
   1855
   1856	sdata->smps_mode = IEEE80211_SMPS_OFF;
   1857	sdata->needed_rx_chains = local->rx_chains;
   1858	sdata->control_port_over_nl80211 = params->control_port_over_nl80211;
   1859
   1860	ieee80211_queue_work(&local->hw, &sdata->work);
   1861
   1862	return 0;
   1863}
   1864
   1865int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
   1866{
   1867	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
   1868
   1869	ieee80211_ibss_disconnect(sdata);
   1870	ifibss->ssid_len = 0;
   1871	eth_zero_addr(ifibss->bssid);
   1872
   1873	/* remove beacon */
   1874	kfree(sdata->u.ibss.ie);
   1875	sdata->u.ibss.ie = NULL;
   1876	sdata->u.ibss.ie_len = 0;
   1877
   1878	/* on the next join, re-program HT parameters */
   1879	memset(&ifibss->ht_capa, 0, sizeof(ifibss->ht_capa));
   1880	memset(&ifibss->ht_capa_mask, 0, sizeof(ifibss->ht_capa_mask));
   1881
   1882	synchronize_rcu();
   1883
   1884	skb_queue_purge(&sdata->skb_queue);
   1885
   1886	del_timer_sync(&sdata->u.ibss.timer);
   1887
   1888	return 0;
   1889}