~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/net/mac80211/ibss.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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 *
 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 
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 
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 
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 
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 
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 
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 *
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 
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 
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 
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 
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
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
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 
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 
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 
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 
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 
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 
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 
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 
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 
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
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 
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 
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
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 
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 
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 
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 
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 */
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 
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 
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 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php