mac80211: fix regression when initializing ibss wmm params
[linux-block.git] / net / mac80211 / ibss.c
CommitLineData
46900298
JB
1/*
2 * IBSS mode implementation
3 * Copyright 2003-2008, Jouni Malinen <j@w1.fi>
4 * Copyright 2004, Instant802 Networks, Inc.
5 * Copyright 2005, Devicescape Software, Inc.
6 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
7 * Copyright 2007, Michael Wu <flamingice@sourmilk.net>
8 * Copyright 2009, Johannes Berg <johannes@sipsolutions.net>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 */
14
15#include <linux/delay.h>
5a0e3ad6 16#include <linux/slab.h>
46900298
JB
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>
46900298
JB
23
24#include "ieee80211_i.h"
24487981 25#include "driver-ops.h"
46900298
JB
26#include "rate.h"
27
28#define IEEE80211_SCAN_INTERVAL (2 * HZ)
46900298
JB
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
34#define IEEE80211_IBSS_MAX_STA_ENTRIES 128
35
36
af8cdcd8
JB
37static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
38 const u8 *bssid, const int beacon_int,
39 struct ieee80211_channel *chan,
b59066a2 40 const u32 basic_rates,
c13a765b
SM
41 const u16 capability, u64 tsf,
42 bool creator)
46900298
JB
43{
44 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
45 struct ieee80211_local *local = sdata->local;
2103dec1 46 int rates_n = 0, i, ri;
46900298
JB
47 struct ieee80211_mgmt *mgmt;
48 u8 *pos;
49 struct ieee80211_supported_band *sband;
f446d10f 50 struct cfg80211_bss *bss;
2103dec1 51 u32 bss_change, rate_flags, rates = 0, rates_added = 0;
683b6d3b 52 struct cfg80211_chan_def chandef;
7ca15a0a 53 enum nl80211_bss_scan_width scan_width;
2ec9c1f6 54 bool have_higher_than_11mbit = false;
c3ffeab4
JB
55 struct beacon_data *presp;
56 int frame_len;
2103dec1 57 int shift;
24487981 58
8d61ffa5 59 sdata_assert_lock(sdata);
7a17a33c 60
24487981 61 /* Reset own TSF to allow time synchronization work. */
37a41b4a 62 drv_reset_tsf(local, sdata);
46900298 63
b203ca39 64 if (!ether_addr_equal(ifibss->bssid, bssid))
b998e8bb 65 sta_info_flush(sdata);
46900298 66
49b5c7f4
JB
67 /* if merging, indicate to driver that we leave the old IBSS */
68 if (sdata->vif.bss_conf.ibss_joined) {
69 sdata->vif.bss_conf.ibss_joined = false;
c13a765b 70 sdata->vif.bss_conf.ibss_creator = false;
1852d40e 71 sdata->vif.bss_conf.enable_beacon = false;
86a2ea41 72 netif_carrier_off(sdata->dev);
1852d40e
JB
73 ieee80211_bss_info_change_notify(sdata,
74 BSS_CHANGED_IBSS |
75 BSS_CHANGED_BEACON_ENABLED);
49b5c7f4
JB
76 }
77
c3ffeab4 78 presp = rcu_dereference_protected(ifibss->presp,
8d61ffa5 79 lockdep_is_held(&sdata->wdev.mtx));
c3ffeab4
JB
80 rcu_assign_pointer(ifibss->presp, NULL);
81 if (presp)
82 kfree_rcu(presp, rcu_head);
1852d40e 83
af8cdcd8 84 sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;
46900298 85
3aede78a 86 chandef = ifibss->chandef;
4bf88530 87 if (!cfg80211_reg_can_beacon(local->hw.wiphy, &chandef)) {
4b42aab1
SW
88 if (chandef.width == NL80211_CHAN_WIDTH_5 ||
89 chandef.width == NL80211_CHAN_WIDTH_10 ||
90 chandef.width == NL80211_CHAN_WIDTH_20_NOHT ||
91 chandef.width == NL80211_CHAN_WIDTH_20) {
92 sdata_info(sdata,
93 "Failed to join IBSS, beacons forbidden\n");
94 return;
95 }
4bf88530
JB
96 chandef.width = NL80211_CHAN_WIDTH_20;
97 chandef.center_freq1 = chan->center_freq;
98 }
55de908a
JB
99
100 ieee80211_vif_release_channel(sdata);
4bf88530 101 if (ieee80211_vif_use_channel(sdata, &chandef,
55de908a
JB
102 ifibss->fixed_channel ?
103 IEEE80211_CHANCTX_SHARED :
104 IEEE80211_CHANCTX_EXCLUSIVE)) {
105 sdata_info(sdata, "Failed to join IBSS, no channel context\n");
106 return;
13c40c54 107 }
55de908a
JB
108
109 memcpy(ifibss->bssid, bssid, ETH_ALEN);
57c4d7b4 110
af8cdcd8 111 sband = local->hw.wiphy->bands[chan->band];
2103dec1 112 shift = ieee80211_vif_get_shift(&sdata->vif);
46900298
JB
113
114 /* Build IBSS probe response */
c3ffeab4
JB
115 frame_len = sizeof(struct ieee80211_hdr_3addr) +
116 12 /* struct ieee80211_mgmt.u.beacon */ +
117 2 + IEEE80211_MAX_SSID_LEN /* max SSID */ +
118 2 + 8 /* max Supported Rates */ +
119 3 /* max DS params */ +
120 4 /* IBSS params */ +
121 2 + (IEEE80211_MAX_SUPP_RATES - 8) +
122 2 + sizeof(struct ieee80211_ht_cap) +
123 2 + sizeof(struct ieee80211_ht_operation) +
124 ifibss->ie_len;
125 presp = kzalloc(sizeof(*presp) + frame_len, GFP_KERNEL);
126 if (!presp)
127 return;
128
129 presp->head = (void *)(presp + 1);
130
131 mgmt = (void *) presp->head;
46900298
JB
132 mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
133 IEEE80211_STYPE_PROBE_RESP);
e83e6541 134 eth_broadcast_addr(mgmt->da);
47846c9b 135 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
46900298 136 memcpy(mgmt->bssid, ifibss->bssid, ETH_ALEN);
57c4d7b4 137 mgmt->u.beacon.beacon_int = cpu_to_le16(beacon_int);
707c1b4e 138 mgmt->u.beacon.timestamp = cpu_to_le64(tsf);
46900298
JB
139 mgmt->u.beacon.capab_info = cpu_to_le16(capability);
140
c3ffeab4
JB
141 pos = (u8 *)mgmt + offsetof(struct ieee80211_mgmt, u.beacon.variable);
142
46900298
JB
143 *pos++ = WLAN_EID_SSID;
144 *pos++ = ifibss->ssid_len;
145 memcpy(pos, ifibss->ssid, ifibss->ssid_len);
c3ffeab4 146 pos += ifibss->ssid_len;
46900298 147
2103dec1
SW
148 rate_flags = ieee80211_chandef_rate_flags(&chandef);
149 for (i = 0; i < sband->n_bitrates; i++) {
150 if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
151 continue;
2ec9c1f6
SW
152 if (sband->bitrates[i].bitrate > 110)
153 have_higher_than_11mbit = true;
2103dec1
SW
154
155 rates |= BIT(i);
156 rates_n++;
157 }
158
46900298 159 *pos++ = WLAN_EID_SUPP_RATES;
2103dec1
SW
160 *pos++ = min_t(int, 8, rates_n);
161 for (ri = 0; ri < sband->n_bitrates; ri++) {
162 int rate = DIV_ROUND_UP(sband->bitrates[ri].bitrate,
163 5 * (1 << shift));
c3ffeab4 164 u8 basic = 0;
2103dec1
SW
165 if (!(rates & BIT(ri)))
166 continue;
167
168 if (basic_rates & BIT(ri))
c3ffeab4 169 basic = 0x80;
2103dec1
SW
170 *pos++ = basic | (u8) rate;
171 if (++rates_added == 8)
172 break;
c3ffeab4 173 }
46900298
JB
174
175 if (sband->band == IEEE80211_BAND_2GHZ) {
46900298
JB
176 *pos++ = WLAN_EID_DS_PARAMS;
177 *pos++ = 1;
af8cdcd8 178 *pos++ = ieee80211_frequency_to_channel(chan->center_freq);
46900298
JB
179 }
180
46900298
JB
181 *pos++ = WLAN_EID_IBSS_PARAMS;
182 *pos++ = 2;
183 /* FIX: set ATIM window based on scan results */
184 *pos++ = 0;
185 *pos++ = 0;
186
2103dec1
SW
187 /* put the remaining rates in WLAN_EID_EXT_SUPP_RATES */
188 if (rates_n > 8) {
46900298 189 *pos++ = WLAN_EID_EXT_SUPP_RATES;
2103dec1
SW
190 *pos++ = rates_n - 8;
191 for (; ri < sband->n_bitrates; ri++) {
192 int rate = DIV_ROUND_UP(sband->bitrates[ri].bitrate,
193 5 * (1 << shift));
c3ffeab4 194 u8 basic = 0;
2103dec1
SW
195 if (!(rates & BIT(ri)))
196 continue;
197
198 if (basic_rates & BIT(ri))
c3ffeab4 199 basic = 0x80;
2103dec1 200 *pos++ = basic | (u8) rate;
c3ffeab4 201 }
46900298
JB
202 }
203
c3ffeab4
JB
204 if (ifibss->ie_len) {
205 memcpy(pos, ifibss->ie, ifibss->ie_len);
206 pos += ifibss->ie_len;
207 }
af8cdcd8 208
13c40c54 209 /* add HT capability and information IEs */
4bf88530 210 if (chandef.width != NL80211_CHAN_WIDTH_20_NOHT &&
0418a445
SW
211 chandef.width != NL80211_CHAN_WIDTH_5 &&
212 chandef.width != NL80211_CHAN_WIDTH_10 &&
683b6d3b 213 sband->ht_cap.ht_supported) {
822854b0
SW
214 struct ieee80211_sta_ht_cap ht_cap;
215
216 memcpy(&ht_cap, &sband->ht_cap, sizeof(ht_cap));
217 ieee80211_apply_htcap_overrides(sdata, &ht_cap);
218
219 pos = ieee80211_ie_build_ht_cap(pos, &ht_cap, ht_cap.cap);
0d894ec5
AN
220 /*
221 * Note: According to 802.11n-2009 9.13.3.1, HT Protection
222 * field and RIFS Mode are reserved in IBSS mode, therefore
223 * keep them at 0
224 */
074d46d1 225 pos = ieee80211_ie_build_ht_oper(pos, &sband->ht_cap,
4bf88530 226 &chandef, 0);
13c40c54
AS
227 }
228
32c5057b 229 if (local->hw.queues >= IEEE80211_NUM_ACS) {
9eba6125
BR
230 *pos++ = WLAN_EID_VENDOR_SPECIFIC;
231 *pos++ = 7; /* len */
232 *pos++ = 0x00; /* Microsoft OUI 00:50:F2 */
233 *pos++ = 0x50;
234 *pos++ = 0xf2;
235 *pos++ = 2; /* WME */
236 *pos++ = 0; /* WME info */
237 *pos++ = 1; /* WME ver */
238 *pos++ = 0; /* U-APSD no in use */
239 }
240
c3ffeab4
JB
241 presp->head_len = pos - presp->head;
242 if (WARN_ON(presp->head_len > frame_len))
243 return;
244
245 rcu_assign_pointer(ifibss->presp, presp);
46900298 246
d6a83228 247 sdata->vif.bss_conf.enable_beacon = true;
2d0ddec5 248 sdata->vif.bss_conf.beacon_int = beacon_int;
fbd2c8dc 249 sdata->vif.bss_conf.basic_rates = basic_rates;
0ca54f6c
MP
250 sdata->vif.bss_conf.ssid_len = ifibss->ssid_len;
251 memcpy(sdata->vif.bss_conf.ssid, ifibss->ssid, ifibss->ssid_len);
2d0ddec5
JB
252 bss_change = BSS_CHANGED_BEACON_INT;
253 bss_change |= ieee80211_reset_erp_info(sdata);
254 bss_change |= BSS_CHANGED_BSSID;
255 bss_change |= BSS_CHANGED_BEACON;
256 bss_change |= BSS_CHANGED_BEACON_ENABLED;
392cfdb1 257 bss_change |= BSS_CHANGED_BASIC_RATES;
13c40c54 258 bss_change |= BSS_CHANGED_HT;
8fc214ba 259 bss_change |= BSS_CHANGED_IBSS;
0ca54f6c 260 bss_change |= BSS_CHANGED_SSID;
2f91a967
SW
261
262 /*
263 * In 5 GHz/802.11a, we can always use short slot time.
264 * (IEEE 802.11-2012 18.3.8.7)
265 *
266 * In 2.4GHz, we must always use long slots in IBSS for compatibility
267 * reasons.
268 * (IEEE 802.11-2012 19.4.5)
269 *
270 * HT follows these specifications (IEEE 802.11-2012 20.3.18)
271 */
272 sdata->vif.bss_conf.use_short_slot = chan->band == IEEE80211_BAND_5GHZ;
273 bss_change |= BSS_CHANGED_ERP_SLOT;
274
2ec9c1f6
SW
275 /* cf. IEEE 802.11 9.2.12 */
276 if (chan->band == IEEE80211_BAND_2GHZ && have_higher_than_11mbit)
277 sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE;
278 else
279 sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE;
280
8fc214ba 281 sdata->vif.bss_conf.ibss_joined = true;
c13a765b 282 sdata->vif.bss_conf.ibss_creator = creator;
2d0ddec5 283 ieee80211_bss_info_change_notify(sdata, bss_change);
46900298 284
2ec9c1f6 285 ieee80211_set_wmm_default(sdata, true);
46900298 286
46900298 287 ifibss->state = IEEE80211_IBSS_MLME_JOINED;
af8cdcd8
JB
288 mod_timer(&ifibss->timer,
289 round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL));
46900298 290
7ca15a0a
SW
291 scan_width = cfg80211_chandef_to_scan_width(&chandef);
292 bss = cfg80211_inform_bss_width_frame(local->hw.wiphy, chan,
293 scan_width, mgmt,
294 presp->head_len, 0, GFP_KERNEL);
5b112d3d 295 cfg80211_put_bss(local->hw.wiphy, bss);
86a2ea41 296 netif_carrier_on(sdata->dev);
af8cdcd8 297 cfg80211_ibss_joined(sdata->dev, ifibss->bssid, GFP_KERNEL);
46900298
JB
298}
299
af8cdcd8
JB
300static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
301 struct ieee80211_bss *bss)
46900298 302{
0c1ad2ca
JB
303 struct cfg80211_bss *cbss =
304 container_of((void *)bss, struct cfg80211_bss, priv);
b59066a2
JB
305 struct ieee80211_supported_band *sband;
306 u32 basic_rates;
307 int i, j;
0c1ad2ca 308 u16 beacon_int = cbss->beacon_interval;
8cef2c9d
JB
309 const struct cfg80211_bss_ies *ies;
310 u64 tsf;
2103dec1
SW
311 u32 rate_flags;
312 int shift;
57c4d7b4 313
8d61ffa5 314 sdata_assert_lock(sdata);
7a17a33c 315
57c4d7b4
JB
316 if (beacon_int < 10)
317 beacon_int = 10;
318
0c1ad2ca 319 sband = sdata->local->hw.wiphy->bands[cbss->channel->band];
2103dec1
SW
320 rate_flags = ieee80211_chandef_rate_flags(&sdata->u.ibss.chandef);
321 shift = ieee80211_vif_get_shift(&sdata->vif);
b59066a2
JB
322
323 basic_rates = 0;
324
325 for (i = 0; i < bss->supp_rates_len; i++) {
2103dec1 326 int rate = bss->supp_rates[i] & 0x7f;
b59066a2
JB
327 bool is_basic = !!(bss->supp_rates[i] & 0x80);
328
329 for (j = 0; j < sband->n_bitrates; j++) {
2103dec1
SW
330 int brate;
331 if ((rate_flags & sband->bitrates[j].flags)
332 != rate_flags)
333 continue;
334
335 brate = DIV_ROUND_UP(sband->bitrates[j].bitrate,
336 5 * (1 << shift));
337 if (brate == rate) {
b59066a2
JB
338 if (is_basic)
339 basic_rates |= BIT(j);
340 break;
341 }
342 }
343 }
344
8cef2c9d
JB
345 rcu_read_lock();
346 ies = rcu_dereference(cbss->ies);
347 tsf = ies->tsf;
348 rcu_read_unlock();
349
0c1ad2ca 350 __ieee80211_sta_join_ibss(sdata, cbss->bssid,
57c4d7b4 351 beacon_int,
0c1ad2ca 352 cbss->channel,
b59066a2 353 basic_rates,
0c1ad2ca 354 cbss->capability,
8cef2c9d 355 tsf, false);
46900298
JB
356}
357
52874a5e 358static struct sta_info *ieee80211_ibss_finish_sta(struct sta_info *sta)
8bf11d8d
JB
359 __acquires(RCU)
360{
361 struct ieee80211_sub_if_data *sdata = sta->sdata;
362 u8 addr[ETH_ALEN];
363
364 memcpy(addr, sta->sta.addr, ETH_ALEN);
365
bdcbd8e0 366 ibss_dbg(sdata, "Adding new IBSS station %pM\n", addr);
8bf11d8d 367
83d5cc01
JB
368 sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
369 sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
267335d6
AQ
370 /* authorize the station only if the network is not RSN protected. If
371 * not wait for the userspace to authorize it */
372 if (!sta->sdata->u.ibss.control_port)
373 sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED);
8bf11d8d
JB
374
375 rate_control_rate_init(sta);
376
377 /* If it fails, maybe we raced another insertion? */
378 if (sta_info_insert_rcu(sta))
379 return sta_info_get(sdata, addr);
380 return sta;
381}
382
383static struct sta_info *
52874a5e
AQ
384ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, const u8 *bssid,
385 const u8 *addr, u32 supp_rates)
8bf11d8d
JB
386 __acquires(RCU)
387{
388 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
389 struct ieee80211_local *local = sdata->local;
390 struct sta_info *sta;
55de908a 391 struct ieee80211_chanctx_conf *chanctx_conf;
b422c6cd 392 struct ieee80211_supported_band *sband;
74608aca 393 enum nl80211_bss_scan_width scan_width;
55de908a 394 int band;
8bf11d8d
JB
395
396 /*
397 * XXX: Consider removing the least recently used entry and
398 * allow new one to be added.
399 */
400 if (local->num_sta >= IEEE80211_IBSS_MAX_STA_ENTRIES) {
bdcbd8e0 401 net_info_ratelimited("%s: No room for a new IBSS STA entry %pM\n",
e87cc472 402 sdata->name, addr);
8bf11d8d
JB
403 rcu_read_lock();
404 return NULL;
405 }
406
407 if (ifibss->state == IEEE80211_IBSS_MLME_SEARCH) {
408 rcu_read_lock();
409 return NULL;
410 }
411
b203ca39 412 if (!ether_addr_equal(bssid, sdata->u.ibss.bssid)) {
8bf11d8d
JB
413 rcu_read_lock();
414 return NULL;
415 }
416
55de908a
JB
417 rcu_read_lock();
418 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
419 if (WARN_ON_ONCE(!chanctx_conf))
420 return NULL;
4bf88530 421 band = chanctx_conf->def.chan->band;
74608aca 422 scan_width = cfg80211_chandef_to_scan_width(&chanctx_conf->def);
55de908a
JB
423 rcu_read_unlock();
424
8bf11d8d
JB
425 sta = sta_info_alloc(sdata, addr, GFP_KERNEL);
426 if (!sta) {
427 rcu_read_lock();
428 return NULL;
429 }
430
431 sta->last_rx = jiffies;
432
433 /* make sure mandatory rates are always added */
b422c6cd 434 sband = local->hw.wiphy->bands[band];
8bf11d8d 435 sta->sta.supp_rates[band] = supp_rates |
74608aca 436 ieee80211_mandatory_rates(sband, scan_width);
8bf11d8d 437
52874a5e 438 return ieee80211_ibss_finish_sta(sta);
6d810f10
AQ
439}
440
2cc59e78
AQ
441static void ieee80211_rx_mgmt_deauth_ibss(struct ieee80211_sub_if_data *sdata,
442 struct ieee80211_mgmt *mgmt,
443 size_t len)
444{
445 u16 reason = le16_to_cpu(mgmt->u.deauth.reason_code);
446
447 if (len < IEEE80211_DEAUTH_FRAME_LEN)
448 return;
449
450 ibss_dbg(sdata, "RX DeAuth SA=%pM DA=%pM BSSID=%pM (reason: %d)\n",
451 mgmt->sa, mgmt->da, mgmt->bssid, reason);
452 sta_info_destroy_addr(sdata, mgmt->sa);
453}
454
6d810f10
AQ
455static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
456 struct ieee80211_mgmt *mgmt,
457 size_t len)
458{
459 u16 auth_alg, auth_transaction;
460
8d61ffa5 461 sdata_assert_lock(sdata);
6d810f10
AQ
462
463 if (len < 24 + 6)
464 return;
465
466 auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
467 auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
468
bdcbd8e0
JB
469 ibss_dbg(sdata,
470 "RX Auth SA=%pM DA=%pM BSSID=%pM (auth_transaction=%d)\n",
471 mgmt->sa, mgmt->da, mgmt->bssid, auth_transaction);
7bed2050
AQ
472
473 if (auth_alg != WLAN_AUTH_OPEN || auth_transaction != 1)
474 return;
475
6d810f10
AQ
476 /*
477 * IEEE 802.11 standard does not require authentication in IBSS
478 * networks and most implementations do not seem to use it.
479 * However, try to reply to authentication attempts if someone
480 * has actually implemented this.
481 */
700e8ea6 482 ieee80211_send_auth(sdata, 2, WLAN_AUTH_OPEN, 0, NULL, 0,
1672c0e3 483 mgmt->sa, sdata->u.ibss.bssid, NULL, 0, 0, 0);
8bf11d8d
JB
484}
485
46900298 486static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
d45c4172 487 struct ieee80211_mgmt *mgmt, size_t len,
46900298 488 struct ieee80211_rx_status *rx_status,
d45c4172 489 struct ieee802_11_elems *elems)
46900298
JB
490{
491 struct ieee80211_local *local = sdata->local;
492 int freq;
0c1ad2ca 493 struct cfg80211_bss *cbss;
46900298
JB
494 struct ieee80211_bss *bss;
495 struct sta_info *sta;
496 struct ieee80211_channel *channel;
497 u64 beacon_timestamp, rx_timestamp;
498 u32 supp_rates = 0;
499 enum ieee80211_band band = rx_status->band;
74608aca 500 enum nl80211_bss_scan_width scan_width;
13c40c54
AS
501 struct ieee80211_supported_band *sband = local->hw.wiphy->bands[band];
502 bool rates_updated = false;
46900298 503
1cd8e88e 504 if (elems->ds_params)
59eb21a6
BR
505 freq = ieee80211_channel_to_frequency(elems->ds_params[0],
506 band);
46900298
JB
507 else
508 freq = rx_status->freq;
509
510 channel = ieee80211_get_channel(local->hw.wiphy, freq);
511
512 if (!channel || channel->flags & IEEE80211_CHAN_DISABLED)
513 return;
514
9eba6125 515 if (sdata->vif.type == NL80211_IFTYPE_ADHOC &&
b203ca39 516 ether_addr_equal(mgmt->bssid, sdata->u.ibss.bssid)) {
46900298
JB
517
518 rcu_read_lock();
abe60632 519 sta = sta_info_get(sdata, mgmt->sa);
46900298 520
9eba6125 521 if (elems->supp_rates) {
2103dec1 522 supp_rates = ieee80211_sta_get_rates(sdata, elems,
9ebb61a2 523 band, NULL);
9eba6125
BR
524 if (sta) {
525 u32 prev_rates;
526
527 prev_rates = sta->sta.supp_rates[band];
528 /* make sure mandatory rates are always added */
74608aca
SW
529 scan_width = NL80211_BSS_CHAN_WIDTH_20;
530 if (rx_status->flag & RX_FLAG_5MHZ)
531 scan_width = NL80211_BSS_CHAN_WIDTH_5;
532 if (rx_status->flag & RX_FLAG_10MHZ)
533 scan_width = NL80211_BSS_CHAN_WIDTH_10;
46900298 534
74608aca
SW
535 sta->sta.supp_rates[band] = supp_rates |
536 ieee80211_mandatory_rates(sband,
537 scan_width);
9eba6125 538 if (sta->sta.supp_rates[band] != prev_rates) {
bdcbd8e0
JB
539 ibss_dbg(sdata,
540 "updated supp_rates set for %pM based on beacon/probe_resp (0x%x -> 0x%x)\n",
541 sta->sta.addr, prev_rates,
542 sta->sta.supp_rates[band]);
13c40c54 543 rates_updated = true;
9eba6125 544 }
8bf11d8d
JB
545 } else {
546 rcu_read_unlock();
9eba6125 547 sta = ieee80211_ibss_add_sta(sdata, mgmt->bssid,
52874a5e 548 mgmt->sa, supp_rates);
8bf11d8d 549 }
34e89507 550 }
9eba6125
BR
551
552 if (sta && elems->wmm_info)
c2c98fde 553 set_sta_flag(sta, WLAN_STA_WME);
9eba6125 554
074d46d1 555 if (sta && elems->ht_operation && elems->ht_cap_elem &&
3aede78a
SW
556 sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT &&
557 sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_5 &&
558 sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_10) {
13c40c54 559 /* we both use HT */
e1a0c6b3 560 struct ieee80211_ht_cap htcap_ie;
4bf88530
JB
561 struct cfg80211_chan_def chandef;
562
563 ieee80211_ht_oper_to_chandef(channel,
564 elems->ht_operation,
565 &chandef);
13c40c54 566
e1a0c6b3 567 memcpy(&htcap_ie, elems->ht_cap_elem, sizeof(htcap_ie));
13c40c54
AS
568
569 /*
570 * fall back to HT20 if we don't use or use
571 * the other extension channel
572 */
3aede78a
SW
573 if (chandef.center_freq1 !=
574 sdata->u.ibss.chandef.center_freq1)
e1a0c6b3
JB
575 htcap_ie.cap_info &=
576 cpu_to_le16(~IEEE80211_HT_CAP_SUP_WIDTH_20_40);
577
578 rates_updated |= ieee80211_ht_cap_ie_to_sta_ht_cap(
579 sdata, sband, &htcap_ie, sta);
13c40c54
AS
580 }
581
e687f61e
AQ
582 if (sta && rates_updated) {
583 drv_sta_rc_update(local, sdata, &sta->sta,
584 IEEE80211_RC_SUPP_RATES_CHANGED);
13c40c54 585 rate_control_rate_init(sta);
e687f61e 586 }
13c40c54 587
9eba6125 588 rcu_read_unlock();
46900298
JB
589 }
590
591 bss = ieee80211_bss_info_update(local, rx_status, mgmt, len, elems,
d45c4172 592 channel);
46900298
JB
593 if (!bss)
594 return;
595
0c1ad2ca
JB
596 cbss = container_of((void *)bss, struct cfg80211_bss, priv);
597
8cef2c9d
JB
598 /* same for beacon and probe response */
599 beacon_timestamp = le64_to_cpu(mgmt->u.beacon.timestamp);
46900298
JB
600
601 /* check if we need to merge IBSS */
602
46900298 603 /* we use a fixed BSSID */
a98bfec2 604 if (sdata->u.ibss.fixed_bssid)
46900298
JB
605 goto put_bss;
606
607 /* not an IBSS */
0c1ad2ca 608 if (!(cbss->capability & WLAN_CAPABILITY_IBSS))
46900298
JB
609 goto put_bss;
610
611 /* different channel */
55de908a 612 if (sdata->u.ibss.fixed_channel &&
3aede78a 613 sdata->u.ibss.chandef.chan != cbss->channel)
46900298
JB
614 goto put_bss;
615
616 /* different SSID */
617 if (elems->ssid_len != sdata->u.ibss.ssid_len ||
618 memcmp(elems->ssid, sdata->u.ibss.ssid,
619 sdata->u.ibss.ssid_len))
620 goto put_bss;
621
34e8f082 622 /* same BSSID */
b203ca39 623 if (ether_addr_equal(cbss->bssid, sdata->u.ibss.bssid))
34e8f082
AF
624 goto put_bss;
625
f4bda337
TP
626 if (ieee80211_have_rx_timestamp(rx_status)) {
627 /* time when timestamp field was received */
628 rx_timestamp =
629 ieee80211_calculate_rx_timestamp(local, rx_status,
630 len + FCS_LEN, 24);
24487981
JB
631 } else {
632 /*
633 * second best option: get current TSF
634 * (will return -1 if not supported)
635 */
37a41b4a 636 rx_timestamp = drv_get_tsf(local, sdata);
24487981 637 }
46900298 638
bdcbd8e0
JB
639 ibss_dbg(sdata,
640 "RX beacon SA=%pM BSSID=%pM TSF=0x%llx BCN=0x%llx diff=%lld @%lu\n",
641 mgmt->sa, mgmt->bssid,
642 (unsigned long long)rx_timestamp,
643 (unsigned long long)beacon_timestamp,
644 (unsigned long long)(rx_timestamp - beacon_timestamp),
645 jiffies);
46900298
JB
646
647 if (beacon_timestamp > rx_timestamp) {
bdcbd8e0
JB
648 ibss_dbg(sdata,
649 "beacon TSF higher than local TSF - IBSS merge with BSSID %pM\n",
650 mgmt->bssid);
46900298 651 ieee80211_sta_join_ibss(sdata, bss);
2103dec1 652 supp_rates = ieee80211_sta_get_rates(sdata, elems, band, NULL);
34e89507 653 ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa,
52874a5e 654 supp_rates);
8bf11d8d 655 rcu_read_unlock();
46900298
JB
656 }
657
658 put_bss:
659 ieee80211_rx_bss_put(local, bss);
660}
661
8bf11d8d
JB
662void ieee80211_ibss_rx_no_sta(struct ieee80211_sub_if_data *sdata,
663 const u8 *bssid, const u8 *addr,
664 u32 supp_rates)
46900298 665{
2e10d330 666 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
46900298
JB
667 struct ieee80211_local *local = sdata->local;
668 struct sta_info *sta;
55de908a 669 struct ieee80211_chanctx_conf *chanctx_conf;
b422c6cd 670 struct ieee80211_supported_band *sband;
74608aca 671 enum nl80211_bss_scan_width scan_width;
55de908a 672 int band;
46900298 673
af8cdcd8
JB
674 /*
675 * XXX: Consider removing the least recently used entry and
676 * allow new one to be added.
677 */
46900298 678 if (local->num_sta >= IEEE80211_IBSS_MAX_STA_ENTRIES) {
bdcbd8e0 679 net_info_ratelimited("%s: No room for a new IBSS STA entry %pM\n",
e87cc472 680 sdata->name, addr);
8bf11d8d 681 return;
46900298
JB
682 }
683
2e10d330 684 if (ifibss->state == IEEE80211_IBSS_MLME_SEARCH)
8bf11d8d 685 return;
2e10d330 686
b203ca39 687 if (!ether_addr_equal(bssid, sdata->u.ibss.bssid))
8bf11d8d 688 return;
46900298 689
55de908a
JB
690 rcu_read_lock();
691 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
692 if (WARN_ON_ONCE(!chanctx_conf)) {
693 rcu_read_unlock();
694 return;
695 }
4bf88530 696 band = chanctx_conf->def.chan->band;
74608aca 697 scan_width = cfg80211_chandef_to_scan_width(&chanctx_conf->def);
55de908a
JB
698 rcu_read_unlock();
699
8bf11d8d 700 sta = sta_info_alloc(sdata, addr, GFP_ATOMIC);
46900298 701 if (!sta)
8bf11d8d 702 return;
46900298 703
c8716d9d 704 sta->last_rx = jiffies;
d9a7ddb0 705
46900298 706 /* make sure mandatory rates are always added */
b422c6cd 707 sband = local->hw.wiphy->bands[band];
46900298 708 sta->sta.supp_rates[band] = supp_rates |
74608aca 709 ieee80211_mandatory_rates(sband, scan_width);
46900298 710
8bf11d8d
JB
711 spin_lock(&ifibss->incomplete_lock);
712 list_add(&sta->list, &ifibss->incomplete_stations);
713 spin_unlock(&ifibss->incomplete_lock);
714 ieee80211_queue_work(&local->hw, &sdata->work);
46900298
JB
715}
716
717static int ieee80211_sta_active_ibss(struct ieee80211_sub_if_data *sdata)
718{
719 struct ieee80211_local *local = sdata->local;
720 int active = 0;
721 struct sta_info *sta;
722
8d61ffa5 723 sdata_assert_lock(sdata);
7a17a33c 724
46900298
JB
725 rcu_read_lock();
726
727 list_for_each_entry_rcu(sta, &local->sta_list, list) {
728 if (sta->sdata == sdata &&
729 time_after(sta->last_rx + IEEE80211_IBSS_MERGE_INTERVAL,
730 jiffies)) {
731 active++;
732 break;
733 }
734 }
735
736 rcu_read_unlock();
737
738 return active;
739}
740
ce9058ae
BP
741/*
742 * This function is called with state == IEEE80211_IBSS_MLME_JOINED
743 */
46900298
JB
744
745static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata)
746{
747 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
7ca15a0a 748 enum nl80211_bss_scan_width scan_width;
46900298 749
8d61ffa5 750 sdata_assert_lock(sdata);
7a17a33c 751
af8cdcd8
JB
752 mod_timer(&ifibss->timer,
753 round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL));
46900298
JB
754
755 ieee80211_sta_expire(sdata, IEEE80211_IBSS_INACTIVITY_LIMIT);
af8cdcd8 756
450aae3d
S
757 if (time_before(jiffies, ifibss->last_scan_completed +
758 IEEE80211_IBSS_MERGE_INTERVAL))
759 return;
760
46900298
JB
761 if (ieee80211_sta_active_ibss(sdata))
762 return;
763
c037b836 764 if (ifibss->fixed_channel)
46900298
JB
765 return;
766
bdcbd8e0
JB
767 sdata_info(sdata,
768 "No active IBSS STAs - trying to scan for other IBSS networks with same SSID (merge)\n");
46900298 769
7ca15a0a 770 scan_width = cfg80211_chandef_to_scan_width(&ifibss->chandef);
34bcf715 771 ieee80211_request_ibss_scan(sdata, ifibss->ssid, ifibss->ssid_len,
7ca15a0a 772 NULL, scan_width);
46900298
JB
773}
774
af8cdcd8 775static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
46900298
JB
776{
777 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
46900298 778 u8 bssid[ETH_ALEN];
46900298
JB
779 u16 capability;
780 int i;
781
8d61ffa5 782 sdata_assert_lock(sdata);
7a17a33c 783
af8cdcd8 784 if (ifibss->fixed_bssid) {
46900298
JB
785 memcpy(bssid, ifibss->bssid, ETH_ALEN);
786 } else {
787 /* Generate random, not broadcast, locally administered BSSID. Mix in
788 * own MAC address to make sure that devices that do not have proper
789 * random number generator get different BSSID. */
790 get_random_bytes(bssid, ETH_ALEN);
791 for (i = 0; i < ETH_ALEN; i++)
47846c9b 792 bssid[i] ^= sdata->vif.addr[i];
46900298
JB
793 bssid[0] &= ~0x01;
794 bssid[0] |= 0x02;
795 }
796
bdcbd8e0 797 sdata_info(sdata, "Creating new IBSS network, BSSID %pM\n", bssid);
46900298 798
46900298
JB
799 capability = WLAN_CAPABILITY_IBSS;
800
fffd0934 801 if (ifibss->privacy)
46900298
JB
802 capability |= WLAN_CAPABILITY_PRIVACY;
803 else
804 sdata->drop_unencrypted = 0;
805
57c4d7b4 806 __ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
3aede78a 807 ifibss->chandef.chan, ifibss->basic_rates,
c13a765b 808 capability, 0, true);
46900298
JB
809}
810
ce9058ae
BP
811/*
812 * This function is called with state == IEEE80211_IBSS_MLME_SEARCH
813 */
814
af8cdcd8 815static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata)
46900298
JB
816{
817 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
818 struct ieee80211_local *local = sdata->local;
0c1ad2ca 819 struct cfg80211_bss *cbss;
af8cdcd8 820 struct ieee80211_channel *chan = NULL;
46900298 821 const u8 *bssid = NULL;
7ca15a0a 822 enum nl80211_bss_scan_width scan_width;
46900298 823 int active_ibss;
e0d61887 824 u16 capability;
46900298 825
8d61ffa5 826 sdata_assert_lock(sdata);
7a17a33c 827
46900298 828 active_ibss = ieee80211_sta_active_ibss(sdata);
bdcbd8e0 829 ibss_dbg(sdata, "sta_find_ibss (active_ibss=%d)\n", active_ibss);
46900298
JB
830
831 if (active_ibss)
af8cdcd8 832 return;
46900298 833
e0d61887 834 capability = WLAN_CAPABILITY_IBSS;
fffd0934 835 if (ifibss->privacy)
e0d61887 836 capability |= WLAN_CAPABILITY_PRIVACY;
af8cdcd8
JB
837 if (ifibss->fixed_bssid)
838 bssid = ifibss->bssid;
839 if (ifibss->fixed_channel)
3aede78a 840 chan = ifibss->chandef.chan;
af8cdcd8 841 if (!is_zero_ether_addr(ifibss->bssid))
46900298 842 bssid = ifibss->bssid;
0c1ad2ca
JB
843 cbss = cfg80211_get_bss(local->hw.wiphy, chan, bssid,
844 ifibss->ssid, ifibss->ssid_len,
845 WLAN_CAPABILITY_IBSS | WLAN_CAPABILITY_PRIVACY,
846 capability);
847
848 if (cbss) {
849 struct ieee80211_bss *bss;
46900298 850
0c1ad2ca 851 bss = (void *)cbss->priv;
bdcbd8e0
JB
852 ibss_dbg(sdata,
853 "sta_find_ibss: selected %pM current %pM\n",
854 cbss->bssid, ifibss->bssid);
855 sdata_info(sdata,
856 "Selected IBSS BSSID %pM based on configured SSID\n",
857 cbss->bssid);
46900298 858
af8cdcd8 859 ieee80211_sta_join_ibss(sdata, bss);
46900298 860 ieee80211_rx_bss_put(local, bss);
af8cdcd8 861 return;
d419b9f0 862 }
46900298 863
bdcbd8e0 864 ibss_dbg(sdata, "sta_find_ibss: did not try to join ibss\n");
46900298
JB
865
866 /* Selected IBSS not found in current scan results - try to scan */
ce9058ae 867 if (time_after(jiffies, ifibss->last_scan_completed +
46900298 868 IEEE80211_SCAN_INTERVAL)) {
bdcbd8e0 869 sdata_info(sdata, "Trigger new scan to find an IBSS to join\n");
46900298 870
7ca15a0a 871 scan_width = cfg80211_chandef_to_scan_width(&ifibss->chandef);
34bcf715 872 ieee80211_request_ibss_scan(sdata, ifibss->ssid,
7ca15a0a
SW
873 ifibss->ssid_len, chan,
874 scan_width);
ce9058ae 875 } else {
46900298
JB
876 int interval = IEEE80211_SCAN_INTERVAL;
877
878 if (time_after(jiffies, ifibss->ibss_join_req +
55de908a
JB
879 IEEE80211_IBSS_JOIN_TIMEOUT))
880 ieee80211_sta_create_ibss(sdata);
46900298 881
af8cdcd8
JB
882 mod_timer(&ifibss->timer,
883 round_jiffies(jiffies + interval));
46900298 884 }
46900298
JB
885}
886
887static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata,
c269a203 888 struct sk_buff *req)
46900298 889{
c269a203 890 struct ieee80211_mgmt *mgmt = (void *)req->data;
46900298
JB
891 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
892 struct ieee80211_local *local = sdata->local;
c269a203 893 int tx_last_beacon, len = req->len;
46900298 894 struct sk_buff *skb;
c3ffeab4 895 struct beacon_data *presp;
46900298
JB
896 u8 *pos, *end;
897
8d61ffa5 898 sdata_assert_lock(sdata);
7a17a33c 899
40b275b6 900 presp = rcu_dereference_protected(ifibss->presp,
8d61ffa5 901 lockdep_is_held(&sdata->wdev.mtx));
40b275b6 902
46900298 903 if (ifibss->state != IEEE80211_IBSS_MLME_JOINED ||
40b275b6 904 len < 24 + 2 || !presp)
46900298
JB
905 return;
906
24487981 907 tx_last_beacon = drv_tx_last_beacon(local);
46900298 908
bdcbd8e0
JB
909 ibss_dbg(sdata,
910 "RX ProbeReq SA=%pM DA=%pM BSSID=%pM (tx_last_beacon=%d)\n",
911 mgmt->sa, mgmt->da, mgmt->bssid, tx_last_beacon);
46900298 912
1ed76487 913 if (!tx_last_beacon && is_multicast_ether_addr(mgmt->da))
46900298
JB
914 return;
915
b203ca39 916 if (!ether_addr_equal(mgmt->bssid, ifibss->bssid) &&
888d04df 917 !is_broadcast_ether_addr(mgmt->bssid))
46900298
JB
918 return;
919
920 end = ((u8 *) mgmt) + len;
921 pos = mgmt->u.probe_req.variable;
922 if (pos[0] != WLAN_EID_SSID ||
923 pos + 2 + pos[1] > end) {
bdcbd8e0
JB
924 ibss_dbg(sdata, "Invalid SSID IE in ProbeReq from %pM\n",
925 mgmt->sa);
46900298
JB
926 return;
927 }
928 if (pos[1] != 0 &&
929 (pos[1] != ifibss->ssid_len ||
0da780c2 930 memcmp(pos + 2, ifibss->ssid, ifibss->ssid_len))) {
46900298
JB
931 /* Ignore ProbeReq for foreign SSID */
932 return;
933 }
934
935 /* Reply with ProbeResp */
c3ffeab4 936 skb = dev_alloc_skb(local->tx_headroom + presp->head_len);
46900298
JB
937 if (!skb)
938 return;
939
c3ffeab4
JB
940 skb_reserve(skb, local->tx_headroom);
941 memcpy(skb_put(skb, presp->head_len), presp->head, presp->head_len);
942
943 memcpy(((struct ieee80211_mgmt *) skb->data)->da, mgmt->sa, ETH_ALEN);
944 ibss_dbg(sdata, "Sending ProbeResp to %pM\n", mgmt->sa);
62ae67be
JB
945 IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
946 ieee80211_tx_skb(sdata, skb);
46900298
JB
947}
948
d45c4172
EG
949static
950void ieee80211_rx_mgmt_probe_beacon(struct ieee80211_sub_if_data *sdata,
951 struct ieee80211_mgmt *mgmt, size_t len,
952 struct ieee80211_rx_status *rx_status)
46900298
JB
953{
954 size_t baselen;
955 struct ieee802_11_elems elems;
956
d45c4172
EG
957 BUILD_BUG_ON(offsetof(typeof(mgmt->u.probe_resp), variable) !=
958 offsetof(typeof(mgmt->u.beacon), variable));
959
960 /*
961 * either beacon or probe_resp but the variable field is at the
962 * same offset
963 */
46900298
JB
964 baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt;
965 if (baselen > len)
966 return;
967
968 ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen,
b2e506bf 969 false, &elems);
46900298 970
d45c4172 971 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems);
46900298
JB
972}
973
1fa57d01
JB
974void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
975 struct sk_buff *skb)
46900298
JB
976{
977 struct ieee80211_rx_status *rx_status;
978 struct ieee80211_mgmt *mgmt;
979 u16 fc;
980
f1d58c25 981 rx_status = IEEE80211_SKB_RXCB(skb);
46900298
JB
982 mgmt = (struct ieee80211_mgmt *) skb->data;
983 fc = le16_to_cpu(mgmt->frame_control);
984
8d61ffa5 985 sdata_lock(sdata);
7a17a33c 986
c926d006
TH
987 if (!sdata->u.ibss.ssid_len)
988 goto mgmt_out; /* not ready to merge yet */
989
46900298
JB
990 switch (fc & IEEE80211_FCTL_STYPE) {
991 case IEEE80211_STYPE_PROBE_REQ:
c269a203 992 ieee80211_rx_mgmt_probe_req(sdata, skb);
46900298
JB
993 break;
994 case IEEE80211_STYPE_PROBE_RESP:
46900298 995 case IEEE80211_STYPE_BEACON:
d45c4172
EG
996 ieee80211_rx_mgmt_probe_beacon(sdata, mgmt, skb->len,
997 rx_status);
46900298
JB
998 break;
999 case IEEE80211_STYPE_AUTH:
1000 ieee80211_rx_mgmt_auth_ibss(sdata, mgmt, skb->len);
1001 break;
2cc59e78
AQ
1002 case IEEE80211_STYPE_DEAUTH:
1003 ieee80211_rx_mgmt_deauth_ibss(sdata, mgmt, skb->len);
1004 break;
46900298 1005 }
7a17a33c 1006
c926d006 1007 mgmt_out:
8d61ffa5 1008 sdata_unlock(sdata);
46900298
JB
1009}
1010
1fa57d01 1011void ieee80211_ibss_work(struct ieee80211_sub_if_data *sdata)
46900298 1012{
1fa57d01 1013 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
8bf11d8d 1014 struct sta_info *sta;
46900298 1015
8d61ffa5 1016 sdata_lock(sdata);
7a17a33c
JB
1017
1018 /*
1019 * Work could be scheduled after scan or similar
1020 * when we aren't even joined (or trying) with a
1021 * network.
1022 */
1023 if (!ifibss->ssid_len)
1024 goto out;
46900298 1025
8bf11d8d
JB
1026 spin_lock_bh(&ifibss->incomplete_lock);
1027 while (!list_empty(&ifibss->incomplete_stations)) {
1028 sta = list_first_entry(&ifibss->incomplete_stations,
1029 struct sta_info, list);
1030 list_del(&sta->list);
1031 spin_unlock_bh(&ifibss->incomplete_lock);
1032
52874a5e 1033 ieee80211_ibss_finish_sta(sta);
8bf11d8d
JB
1034 rcu_read_unlock();
1035 spin_lock_bh(&ifibss->incomplete_lock);
1036 }
1037 spin_unlock_bh(&ifibss->incomplete_lock);
1038
46900298
JB
1039 switch (ifibss->state) {
1040 case IEEE80211_IBSS_MLME_SEARCH:
1041 ieee80211_sta_find_ibss(sdata);
1042 break;
1043 case IEEE80211_IBSS_MLME_JOINED:
1044 ieee80211_sta_merge_ibss(sdata);
1045 break;
1046 default:
1047 WARN_ON(1);
1048 break;
1049 }
46900298 1050
7a17a33c 1051 out:
8d61ffa5 1052 sdata_unlock(sdata);
3a4d4aa2
JB
1053}
1054
46900298
JB
1055static void ieee80211_ibss_timer(unsigned long data)
1056{
1057 struct ieee80211_sub_if_data *sdata =
1058 (struct ieee80211_sub_if_data *) data;
5bb644a0 1059
a6182943 1060 ieee80211_queue_work(&sdata->local->hw, &sdata->work);
5bb644a0 1061}
5bb644a0 1062
46900298
JB
1063void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata)
1064{
1065 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1066
46900298
JB
1067 setup_timer(&ifibss->timer, ieee80211_ibss_timer,
1068 (unsigned long) sdata);
8bf11d8d
JB
1069 INIT_LIST_HEAD(&ifibss->incomplete_stations);
1070 spin_lock_init(&ifibss->incomplete_lock);
46900298
JB
1071}
1072
1073/* scan finished notification */
1074void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local)
1075{
af8cdcd8 1076 struct ieee80211_sub_if_data *sdata;
46900298 1077
29b4a4f7
JB
1078 mutex_lock(&local->iflist_mtx);
1079 list_for_each_entry(sdata, &local->interfaces, list) {
9607e6b6 1080 if (!ieee80211_sdata_running(sdata))
0e41f715 1081 continue;
af8cdcd8
JB
1082 if (sdata->vif.type != NL80211_IFTYPE_ADHOC)
1083 continue;
1084 sdata->u.ibss.last_scan_completed = jiffies;
7a17a33c 1085 ieee80211_queue_work(&local->hw, &sdata->work);
46900298 1086 }
29b4a4f7 1087 mutex_unlock(&local->iflist_mtx);
46900298
JB
1088}
1089
af8cdcd8
JB
1090int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
1091 struct cfg80211_ibss_params *params)
1092{
ff3cc5f4 1093 u32 changed = 0;
2103dec1
SW
1094 u32 rate_flags;
1095 struct ieee80211_supported_band *sband;
1096 int i;
af8cdcd8 1097
af8cdcd8
JB
1098 if (params->bssid) {
1099 memcpy(sdata->u.ibss.bssid, params->bssid, ETH_ALEN);
1100 sdata->u.ibss.fixed_bssid = true;
1101 } else
1102 sdata->u.ibss.fixed_bssid = false;
1103
fffd0934 1104 sdata->u.ibss.privacy = params->privacy;
267335d6 1105 sdata->u.ibss.control_port = params->control_port;
fbd2c8dc 1106 sdata->u.ibss.basic_rates = params->basic_rates;
2103dec1
SW
1107
1108 /* fix basic_rates if channel does not support these rates */
1109 rate_flags = ieee80211_chandef_rate_flags(&params->chandef);
1110 sband = sdata->local->hw.wiphy->bands[params->chandef.chan->band];
1111 for (i = 0; i < sband->n_bitrates; i++) {
1112 if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
1113 sdata->u.ibss.basic_rates &= ~BIT(i);
1114 }
dd5b4cc7
FF
1115 memcpy(sdata->vif.bss_conf.mcast_rate, params->mcast_rate,
1116 sizeof(params->mcast_rate));
fffd0934 1117
57c4d7b4
JB
1118 sdata->vif.bss_conf.beacon_int = params->beacon_interval;
1119
3aede78a 1120 sdata->u.ibss.chandef = params->chandef;
af8cdcd8
JB
1121 sdata->u.ibss.fixed_channel = params->channel_fixed;
1122
1123 if (params->ie) {
1124 sdata->u.ibss.ie = kmemdup(params->ie, params->ie_len,
1125 GFP_KERNEL);
1126 if (sdata->u.ibss.ie)
1127 sdata->u.ibss.ie_len = params->ie_len;
1128 }
1129
af8cdcd8
JB
1130 sdata->u.ibss.state = IEEE80211_IBSS_MLME_SEARCH;
1131 sdata->u.ibss.ibss_join_req = jiffies;
1132
badecb00 1133 memcpy(sdata->u.ibss.ssid, params->ssid, params->ssid_len);
0e41f715
JB
1134 sdata->u.ibss.ssid_len = params->ssid_len;
1135
822854b0
SW
1136 memcpy(&sdata->u.ibss.ht_capa, &params->ht_capa,
1137 sizeof(sdata->u.ibss.ht_capa));
1138 memcpy(&sdata->u.ibss.ht_capa_mask, &params->ht_capa_mask,
1139 sizeof(sdata->u.ibss.ht_capa_mask));
1140
ff3cc5f4
SW
1141 /*
1142 * 802.11n-2009 9.13.3.1: In an IBSS, the HT Protection field is
1143 * reserved, but an HT STA shall protect HT transmissions as though
1144 * the HT Protection field were set to non-HT mixed mode.
1145 *
1146 * In an IBSS, the RIFS Mode field of the HT Operation element is
1147 * also reserved, but an HT STA shall operate as though this field
1148 * were set to 1.
1149 */
1150
1151 sdata->vif.bss_conf.ht_operation_mode |=
1152 IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED
1153 | IEEE80211_HT_PARAM_RIFS_MODE;
1154
1155 changed |= BSS_CHANGED_HT;
1156 ieee80211_bss_info_change_notify(sdata, changed);
1157
04ecd257
JB
1158 sdata->smps_mode = IEEE80211_SMPS_OFF;
1159 sdata->needed_rx_chains = sdata->local->rx_chains;
1160
64592c8f 1161 ieee80211_queue_work(&sdata->local->hw, &sdata->work);
af8cdcd8
JB
1162
1163 return 0;
1164}
1165
1166int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
1167{
5ea096c0
TP
1168 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1169 struct ieee80211_local *local = sdata->local;
1170 struct cfg80211_bss *cbss;
1171 u16 capability;
7a17a33c 1172 int active_ibss;
8bf11d8d 1173 struct sta_info *sta;
c3ffeab4 1174 struct beacon_data *presp;
7a17a33c 1175
5ea096c0
TP
1176 active_ibss = ieee80211_sta_active_ibss(sdata);
1177
1178 if (!active_ibss && !is_zero_ether_addr(ifibss->bssid)) {
1179 capability = WLAN_CAPABILITY_IBSS;
1180
1181 if (ifibss->privacy)
1182 capability |= WLAN_CAPABILITY_PRIVACY;
1183
3aede78a 1184 cbss = cfg80211_get_bss(local->hw.wiphy, ifibss->chandef.chan,
5ea096c0
TP
1185 ifibss->bssid, ifibss->ssid,
1186 ifibss->ssid_len, WLAN_CAPABILITY_IBSS |
1187 WLAN_CAPABILITY_PRIVACY,
1188 capability);
1189
1190 if (cbss) {
1191 cfg80211_unlink_bss(local->hw.wiphy, cbss);
5b112d3d 1192 cfg80211_put_bss(local->hw.wiphy, cbss);
5ea096c0
TP
1193 }
1194 }
af8cdcd8 1195
b78a4932
SW
1196 ifibss->state = IEEE80211_IBSS_MLME_SEARCH;
1197 memset(ifibss->bssid, 0, ETH_ALEN);
1198 ifibss->ssid_len = 0;
1199
b998e8bb 1200 sta_info_flush(sdata);
8bf11d8d
JB
1201
1202 spin_lock_bh(&ifibss->incomplete_lock);
1203 while (!list_empty(&ifibss->incomplete_stations)) {
1204 sta = list_first_entry(&ifibss->incomplete_stations,
1205 struct sta_info, list);
1206 list_del(&sta->list);
1207 spin_unlock_bh(&ifibss->incomplete_lock);
1208
1209 sta_info_free(local, sta);
1210 spin_lock_bh(&ifibss->incomplete_lock);
1211 }
1212 spin_unlock_bh(&ifibss->incomplete_lock);
1213
86a2ea41 1214 netif_carrier_off(sdata->dev);
af8cdcd8
JB
1215
1216 /* remove beacon */
1217 kfree(sdata->u.ibss.ie);
c3ffeab4 1218 presp = rcu_dereference_protected(ifibss->presp,
8d61ffa5 1219 lockdep_is_held(&sdata->wdev.mtx));
a9b3cd7f 1220 RCU_INIT_POINTER(sdata->u.ibss.presp, NULL);
822854b0
SW
1221
1222 /* on the next join, re-program HT parameters */
1223 memset(&ifibss->ht_capa, 0, sizeof(ifibss->ht_capa));
1224 memset(&ifibss->ht_capa_mask, 0, sizeof(ifibss->ht_capa_mask));
1225
8fc214ba 1226 sdata->vif.bss_conf.ibss_joined = false;
c13a765b 1227 sdata->vif.bss_conf.ibss_creator = false;
d6a83228 1228 sdata->vif.bss_conf.enable_beacon = false;
0ca54f6c 1229 sdata->vif.bss_conf.ssid_len = 0;
d6a83228 1230 clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
8fc214ba
JB
1231 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED |
1232 BSS_CHANGED_IBSS);
af8cdcd8 1233 synchronize_rcu();
c3ffeab4 1234 kfree(presp);
af8cdcd8 1235
35f20c14 1236 skb_queue_purge(&sdata->skb_queue);
5cff20e6 1237
bc05d19f 1238 del_timer_sync(&sdata->u.ibss.timer);
7a17a33c 1239
af8cdcd8
JB
1240 return 0;
1241}