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