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>
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.
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>
24 #include "ieee80211_i.h"
25 #include "driver-ops.h"
28 #define IEEE80211_SCAN_INTERVAL (2 * HZ)
29 #define IEEE80211_IBSS_JOIN_TIMEOUT (7 * HZ)
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)
35 #define IEEE80211_IBSS_MAX_STA_ENTRIES 128
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
)
44 struct ieee80211_if_ibss
*ifibss
= &sdata
->u
.ibss
;
45 struct ieee80211_local
*local
= sdata
->local
;
46 int rates_n
= 0, i
, ri
;
47 struct ieee80211_mgmt
*mgmt
;
49 struct ieee80211_supported_band
*sband
;
50 u32 rate_flags
, rates
= 0, rates_added
= 0;
51 struct beacon_data
*presp
;
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 */ +
62 2 + (IEEE80211_MAX_SUPP_RATES
- 8) +
63 2 + sizeof(struct ieee80211_ht_cap
) +
64 2 + sizeof(struct ieee80211_ht_operation
) +
66 presp
= kzalloc(sizeof(*presp
) + frame_len
, GFP_KERNEL
);
70 presp
->head
= (void *)(presp
+ 1);
72 mgmt
= (void *) presp
->head
;
73 mgmt
->frame_control
= cpu_to_le16(IEEE80211_FTYPE_MGMT
|
74 IEEE80211_STYPE_PROBE_RESP
);
75 eth_broadcast_addr(mgmt
->da
);
76 memcpy(mgmt
->sa
, sdata
->vif
.addr
, ETH_ALEN
);
77 memcpy(mgmt
->bssid
, ifibss
->bssid
, ETH_ALEN
);
78 mgmt
->u
.beacon
.beacon_int
= cpu_to_le16(beacon_int
);
79 mgmt
->u
.beacon
.timestamp
= cpu_to_le64(tsf
);
80 mgmt
->u
.beacon
.capab_info
= cpu_to_le16(capability
);
82 pos
= (u8
*)mgmt
+ offsetof(struct ieee80211_mgmt
, u
.beacon
.variable
);
84 *pos
++ = WLAN_EID_SSID
;
85 *pos
++ = ifibss
->ssid_len
;
86 memcpy(pos
, ifibss
->ssid
, ifibss
->ssid_len
);
87 pos
+= ifibss
->ssid_len
;
89 sband
= local
->hw
.wiphy
->bands
[chandef
->chan
->band
];
90 rate_flags
= ieee80211_chandef_rate_flags(chandef
);
91 shift
= ieee80211_chandef_get_shift(chandef
);
93 if (have_higher_than_11mbit
)
94 *have_higher_than_11mbit
= false;
96 for (i
= 0; i
< sband
->n_bitrates
; i
++) {
97 if ((rate_flags
& sband
->bitrates
[i
].flags
) != rate_flags
)
99 if (sband
->bitrates
[i
].bitrate
> 110 &&
100 have_higher_than_11mbit
)
101 *have_higher_than_11mbit
= true;
107 *pos
++ = WLAN_EID_SUPP_RATES
;
108 *pos
++ = min_t(int, 8, rates_n
);
109 for (ri
= 0; ri
< sband
->n_bitrates
; ri
++) {
110 int rate
= DIV_ROUND_UP(sband
->bitrates
[ri
].bitrate
,
113 if (!(rates
& BIT(ri
)))
116 if (basic_rates
& BIT(ri
))
118 *pos
++ = basic
| (u8
) rate
;
119 if (++rates_added
== 8) {
120 ri
++; /* continue at next rate for EXT_SUPP_RATES */
125 if (sband
->band
== IEEE80211_BAND_2GHZ
) {
126 *pos
++ = WLAN_EID_DS_PARAMS
;
128 *pos
++ = ieee80211_frequency_to_channel(
129 chandef
->chan
->center_freq
);
132 *pos
++ = WLAN_EID_IBSS_PARAMS
;
134 /* FIX: set ATIM window based on scan results */
138 /* put the remaining rates in WLAN_EID_EXT_SUPP_RATES */
140 *pos
++ = WLAN_EID_EXT_SUPP_RATES
;
141 *pos
++ = rates_n
- 8;
142 for (; ri
< sband
->n_bitrates
; ri
++) {
143 int rate
= DIV_ROUND_UP(sband
->bitrates
[ri
].bitrate
,
146 if (!(rates
& BIT(ri
)))
149 if (basic_rates
& BIT(ri
))
151 *pos
++ = basic
| (u8
) rate
;
155 if (ifibss
->ie_len
) {
156 memcpy(pos
, ifibss
->ie
, ifibss
->ie_len
);
157 pos
+= ifibss
->ie_len
;
160 /* add HT capability and information IEs */
161 if (chandef
->width
!= NL80211_CHAN_WIDTH_20_NOHT
&&
162 chandef
->width
!= NL80211_CHAN_WIDTH_5
&&
163 chandef
->width
!= NL80211_CHAN_WIDTH_10
&&
164 sband
->ht_cap
.ht_supported
) {
165 struct ieee80211_sta_ht_cap ht_cap
;
167 memcpy(&ht_cap
, &sband
->ht_cap
, sizeof(ht_cap
));
168 ieee80211_apply_htcap_overrides(sdata
, &ht_cap
);
170 pos
= ieee80211_ie_build_ht_cap(pos
, &ht_cap
, ht_cap
.cap
);
172 * Note: According to 802.11n-2009 9.13.3.1, HT Protection
173 * field and RIFS Mode are reserved in IBSS mode, therefore
176 pos
= ieee80211_ie_build_ht_oper(pos
, &sband
->ht_cap
,
180 if (local
->hw
.queues
>= IEEE80211_NUM_ACS
) {
181 *pos
++ = WLAN_EID_VENDOR_SPECIFIC
;
182 *pos
++ = 7; /* len */
183 *pos
++ = 0x00; /* Microsoft OUI 00:50:F2 */
186 *pos
++ = 2; /* WME */
187 *pos
++ = 0; /* WME info */
188 *pos
++ = 1; /* WME ver */
189 *pos
++ = 0; /* U-APSD no in use */
192 presp
->head_len
= pos
- presp
->head
;
193 if (WARN_ON(presp
->head_len
> frame_len
))
202 static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data
*sdata
,
203 const u8
*bssid
, const int beacon_int
,
204 struct cfg80211_chan_def
*req_chandef
,
205 const u32 basic_rates
,
206 const u16 capability
, u64 tsf
,
209 struct ieee80211_if_ibss
*ifibss
= &sdata
->u
.ibss
;
210 struct ieee80211_local
*local
= sdata
->local
;
211 struct ieee80211_supported_band
*sband
;
212 struct ieee80211_mgmt
*mgmt
;
213 struct cfg80211_bss
*bss
;
215 struct cfg80211_chan_def chandef
;
216 struct ieee80211_channel
*chan
;
217 struct beacon_data
*presp
;
218 enum nl80211_bss_scan_width scan_width
;
219 bool have_higher_than_11mbit
;
221 sdata_assert_lock(sdata
);
223 /* Reset own TSF to allow time synchronization work. */
224 drv_reset_tsf(local
, sdata
);
226 if (!ether_addr_equal(ifibss
->bssid
, bssid
))
227 sta_info_flush(sdata
);
229 /* if merging, indicate to driver that we leave the old IBSS */
230 if (sdata
->vif
.bss_conf
.ibss_joined
) {
231 sdata
->vif
.bss_conf
.ibss_joined
= false;
232 sdata
->vif
.bss_conf
.ibss_creator
= false;
233 sdata
->vif
.bss_conf
.enable_beacon
= false;
234 netif_carrier_off(sdata
->dev
);
235 ieee80211_bss_info_change_notify(sdata
,
237 BSS_CHANGED_BEACON_ENABLED
);
240 presp
= rcu_dereference_protected(ifibss
->presp
,
241 lockdep_is_held(&sdata
->wdev
.mtx
));
242 rcu_assign_pointer(ifibss
->presp
, NULL
);
244 kfree_rcu(presp
, rcu_head
);
246 sdata
->drop_unencrypted
= capability
& WLAN_CAPABILITY_PRIVACY
? 1 : 0;
248 /* make a copy of the chandef, it could be modified below. */
249 chandef
= *req_chandef
;
251 if (!cfg80211_reg_can_beacon(local
->hw
.wiphy
, &chandef
)) {
252 if (chandef
.width
== NL80211_CHAN_WIDTH_5
||
253 chandef
.width
== NL80211_CHAN_WIDTH_10
||
254 chandef
.width
== NL80211_CHAN_WIDTH_20_NOHT
||
255 chandef
.width
== NL80211_CHAN_WIDTH_20
) {
257 "Failed to join IBSS, beacons forbidden\n");
260 chandef
.width
= NL80211_CHAN_WIDTH_20
;
261 chandef
.center_freq1
= chan
->center_freq
;
264 ieee80211_vif_release_channel(sdata
);
265 if (ieee80211_vif_use_channel(sdata
, &chandef
,
266 ifibss
->fixed_channel
?
267 IEEE80211_CHANCTX_SHARED
:
268 IEEE80211_CHANCTX_EXCLUSIVE
)) {
269 sdata_info(sdata
, "Failed to join IBSS, no channel context\n");
273 memcpy(ifibss
->bssid
, bssid
, ETH_ALEN
);
275 sband
= local
->hw
.wiphy
->bands
[chan
->band
];
277 presp
= ieee80211_ibss_build_presp(sdata
, beacon_int
, basic_rates
,
278 capability
, tsf
, &chandef
,
279 &have_higher_than_11mbit
);
283 rcu_assign_pointer(ifibss
->presp
, presp
);
284 mgmt
= (void *)presp
->head
;
286 sdata
->vif
.bss_conf
.enable_beacon
= true;
287 sdata
->vif
.bss_conf
.beacon_int
= beacon_int
;
288 sdata
->vif
.bss_conf
.basic_rates
= basic_rates
;
289 sdata
->vif
.bss_conf
.ssid_len
= ifibss
->ssid_len
;
290 memcpy(sdata
->vif
.bss_conf
.ssid
, ifibss
->ssid
, ifibss
->ssid_len
);
291 bss_change
= BSS_CHANGED_BEACON_INT
;
292 bss_change
|= ieee80211_reset_erp_info(sdata
);
293 bss_change
|= BSS_CHANGED_BSSID
;
294 bss_change
|= BSS_CHANGED_BEACON
;
295 bss_change
|= BSS_CHANGED_BEACON_ENABLED
;
296 bss_change
|= BSS_CHANGED_BASIC_RATES
;
297 bss_change
|= BSS_CHANGED_HT
;
298 bss_change
|= BSS_CHANGED_IBSS
;
299 bss_change
|= BSS_CHANGED_SSID
;
302 * In 5 GHz/802.11a, we can always use short slot time.
303 * (IEEE 802.11-2012 18.3.8.7)
305 * In 2.4GHz, we must always use long slots in IBSS for compatibility
307 * (IEEE 802.11-2012 19.4.5)
309 * HT follows these specifications (IEEE 802.11-2012 20.3.18)
311 sdata
->vif
.bss_conf
.use_short_slot
= chan
->band
== IEEE80211_BAND_5GHZ
;
312 bss_change
|= BSS_CHANGED_ERP_SLOT
;
314 /* cf. IEEE 802.11 9.2.12 */
315 if (chan
->band
== IEEE80211_BAND_2GHZ
&& have_higher_than_11mbit
)
316 sdata
->flags
|= IEEE80211_SDATA_OPERATING_GMODE
;
318 sdata
->flags
&= ~IEEE80211_SDATA_OPERATING_GMODE
;
320 sdata
->vif
.bss_conf
.ibss_joined
= true;
321 sdata
->vif
.bss_conf
.ibss_creator
= creator
;
322 ieee80211_bss_info_change_notify(sdata
, bss_change
);
324 ieee80211_set_wmm_default(sdata
, true);
326 ifibss
->state
= IEEE80211_IBSS_MLME_JOINED
;
327 mod_timer(&ifibss
->timer
,
328 round_jiffies(jiffies
+ IEEE80211_IBSS_MERGE_INTERVAL
));
330 scan_width
= cfg80211_chandef_to_scan_width(&chandef
);
331 bss
= cfg80211_inform_bss_width_frame(local
->hw
.wiphy
, chan
,
333 presp
->head_len
, 0, GFP_KERNEL
);
334 cfg80211_put_bss(local
->hw
.wiphy
, bss
);
335 netif_carrier_on(sdata
->dev
);
336 cfg80211_ibss_joined(sdata
->dev
, ifibss
->bssid
, GFP_KERNEL
);
339 static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data
*sdata
,
340 struct ieee80211_bss
*bss
)
342 struct cfg80211_bss
*cbss
=
343 container_of((void *)bss
, struct cfg80211_bss
, priv
);
344 struct ieee80211_supported_band
*sband
;
345 struct cfg80211_chan_def chandef
;
348 u16 beacon_int
= cbss
->beacon_interval
;
349 const struct cfg80211_bss_ies
*ies
;
350 enum nl80211_channel_type chan_type
;
355 sdata_assert_lock(sdata
);
360 switch (sdata
->u
.ibss
.chandef
.width
) {
361 case NL80211_CHAN_WIDTH_20_NOHT
:
362 case NL80211_CHAN_WIDTH_20
:
363 case NL80211_CHAN_WIDTH_40
:
364 chan_type
= cfg80211_get_chandef_type(&sdata
->u
.ibss
.chandef
);
365 cfg80211_chandef_create(&chandef
, cbss
->channel
, chan_type
);
367 case NL80211_CHAN_WIDTH_5
:
368 case NL80211_CHAN_WIDTH_10
:
369 cfg80211_chandef_create(&chandef
, cbss
->channel
,
370 NL80211_CHAN_WIDTH_20_NOHT
);
371 chandef
.width
= sdata
->u
.ibss
.chandef
.width
;
374 /* fall back to 20 MHz for unsupported modes */
375 cfg80211_chandef_create(&chandef
, cbss
->channel
,
376 NL80211_CHAN_WIDTH_20_NOHT
);
380 sband
= sdata
->local
->hw
.wiphy
->bands
[cbss
->channel
->band
];
381 rate_flags
= ieee80211_chandef_rate_flags(&sdata
->u
.ibss
.chandef
);
382 shift
= ieee80211_vif_get_shift(&sdata
->vif
);
386 for (i
= 0; i
< bss
->supp_rates_len
; i
++) {
387 int rate
= bss
->supp_rates
[i
] & 0x7f;
388 bool is_basic
= !!(bss
->supp_rates
[i
] & 0x80);
390 for (j
= 0; j
< sband
->n_bitrates
; j
++) {
392 if ((rate_flags
& sband
->bitrates
[j
].flags
)
396 brate
= DIV_ROUND_UP(sband
->bitrates
[j
].bitrate
,
400 basic_rates
|= BIT(j
);
407 ies
= rcu_dereference(cbss
->ies
);
411 __ieee80211_sta_join_ibss(sdata
, cbss
->bssid
,
419 static struct sta_info
*ieee80211_ibss_finish_sta(struct sta_info
*sta
)
422 struct ieee80211_sub_if_data
*sdata
= sta
->sdata
;
425 memcpy(addr
, sta
->sta
.addr
, ETH_ALEN
);
427 ibss_dbg(sdata
, "Adding new IBSS station %pM\n", addr
);
429 sta_info_pre_move_state(sta
, IEEE80211_STA_AUTH
);
430 sta_info_pre_move_state(sta
, IEEE80211_STA_ASSOC
);
431 /* authorize the station only if the network is not RSN protected. If
432 * not wait for the userspace to authorize it */
433 if (!sta
->sdata
->u
.ibss
.control_port
)
434 sta_info_pre_move_state(sta
, IEEE80211_STA_AUTHORIZED
);
436 rate_control_rate_init(sta
);
438 /* If it fails, maybe we raced another insertion? */
439 if (sta_info_insert_rcu(sta
))
440 return sta_info_get(sdata
, addr
);
444 static struct sta_info
*
445 ieee80211_ibss_add_sta(struct ieee80211_sub_if_data
*sdata
, const u8
*bssid
,
446 const u8
*addr
, u32 supp_rates
)
449 struct ieee80211_if_ibss
*ifibss
= &sdata
->u
.ibss
;
450 struct ieee80211_local
*local
= sdata
->local
;
451 struct sta_info
*sta
;
452 struct ieee80211_chanctx_conf
*chanctx_conf
;
453 struct ieee80211_supported_band
*sband
;
454 enum nl80211_bss_scan_width scan_width
;
458 * XXX: Consider removing the least recently used entry and
459 * allow new one to be added.
461 if (local
->num_sta
>= IEEE80211_IBSS_MAX_STA_ENTRIES
) {
462 net_info_ratelimited("%s: No room for a new IBSS STA entry %pM\n",
468 if (ifibss
->state
== IEEE80211_IBSS_MLME_SEARCH
) {
473 if (!ether_addr_equal(bssid
, sdata
->u
.ibss
.bssid
)) {
479 chanctx_conf
= rcu_dereference(sdata
->vif
.chanctx_conf
);
480 if (WARN_ON_ONCE(!chanctx_conf
))
482 band
= chanctx_conf
->def
.chan
->band
;
483 scan_width
= cfg80211_chandef_to_scan_width(&chanctx_conf
->def
);
486 sta
= sta_info_alloc(sdata
, addr
, GFP_KERNEL
);
492 sta
->last_rx
= jiffies
;
494 /* make sure mandatory rates are always added */
495 sband
= local
->hw
.wiphy
->bands
[band
];
496 sta
->sta
.supp_rates
[band
] = supp_rates
|
497 ieee80211_mandatory_rates(sband
, scan_width
);
499 return ieee80211_ibss_finish_sta(sta
);
502 static void ieee80211_rx_mgmt_deauth_ibss(struct ieee80211_sub_if_data
*sdata
,
503 struct ieee80211_mgmt
*mgmt
,
506 u16 reason
= le16_to_cpu(mgmt
->u
.deauth
.reason_code
);
508 if (len
< IEEE80211_DEAUTH_FRAME_LEN
)
511 ibss_dbg(sdata
, "RX DeAuth SA=%pM DA=%pM BSSID=%pM (reason: %d)\n",
512 mgmt
->sa
, mgmt
->da
, mgmt
->bssid
, reason
);
513 sta_info_destroy_addr(sdata
, mgmt
->sa
);
516 static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data
*sdata
,
517 struct ieee80211_mgmt
*mgmt
,
520 u16 auth_alg
, auth_transaction
;
522 sdata_assert_lock(sdata
);
527 auth_alg
= le16_to_cpu(mgmt
->u
.auth
.auth_alg
);
528 auth_transaction
= le16_to_cpu(mgmt
->u
.auth
.auth_transaction
);
531 "RX Auth SA=%pM DA=%pM BSSID=%pM (auth_transaction=%d)\n",
532 mgmt
->sa
, mgmt
->da
, mgmt
->bssid
, auth_transaction
);
534 if (auth_alg
!= WLAN_AUTH_OPEN
|| auth_transaction
!= 1)
538 * IEEE 802.11 standard does not require authentication in IBSS
539 * networks and most implementations do not seem to use it.
540 * However, try to reply to authentication attempts if someone
541 * has actually implemented this.
543 ieee80211_send_auth(sdata
, 2, WLAN_AUTH_OPEN
, 0, NULL
, 0,
544 mgmt
->sa
, sdata
->u
.ibss
.bssid
, NULL
, 0, 0, 0);
547 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data
*sdata
,
548 struct ieee80211_mgmt
*mgmt
, size_t len
,
549 struct ieee80211_rx_status
*rx_status
,
550 struct ieee802_11_elems
*elems
)
552 struct ieee80211_local
*local
= sdata
->local
;
554 struct cfg80211_bss
*cbss
;
555 struct ieee80211_bss
*bss
;
556 struct sta_info
*sta
;
557 struct ieee80211_channel
*channel
;
558 u64 beacon_timestamp
, rx_timestamp
;
560 enum ieee80211_band band
= rx_status
->band
;
561 enum nl80211_bss_scan_width scan_width
;
562 struct ieee80211_supported_band
*sband
= local
->hw
.wiphy
->bands
[band
];
563 bool rates_updated
= false;
565 if (elems
->ds_params
)
566 freq
= ieee80211_channel_to_frequency(elems
->ds_params
[0],
569 freq
= rx_status
->freq
;
571 channel
= ieee80211_get_channel(local
->hw
.wiphy
, freq
);
573 if (!channel
|| channel
->flags
& IEEE80211_CHAN_DISABLED
)
576 if (sdata
->vif
.type
== NL80211_IFTYPE_ADHOC
&&
577 ether_addr_equal(mgmt
->bssid
, sdata
->u
.ibss
.bssid
)) {
580 sta
= sta_info_get(sdata
, mgmt
->sa
);
582 if (elems
->supp_rates
) {
583 supp_rates
= ieee80211_sta_get_rates(sdata
, elems
,
588 prev_rates
= sta
->sta
.supp_rates
[band
];
589 /* make sure mandatory rates are always added */
590 scan_width
= NL80211_BSS_CHAN_WIDTH_20
;
591 if (rx_status
->flag
& RX_FLAG_5MHZ
)
592 scan_width
= NL80211_BSS_CHAN_WIDTH_5
;
593 if (rx_status
->flag
& RX_FLAG_10MHZ
)
594 scan_width
= NL80211_BSS_CHAN_WIDTH_10
;
596 sta
->sta
.supp_rates
[band
] = supp_rates
|
597 ieee80211_mandatory_rates(sband
,
599 if (sta
->sta
.supp_rates
[band
] != prev_rates
) {
601 "updated supp_rates set for %pM based on beacon/probe_resp (0x%x -> 0x%x)\n",
602 sta
->sta
.addr
, prev_rates
,
603 sta
->sta
.supp_rates
[band
]);
604 rates_updated
= true;
608 sta
= ieee80211_ibss_add_sta(sdata
, mgmt
->bssid
,
609 mgmt
->sa
, supp_rates
);
613 if (sta
&& elems
->wmm_info
)
614 set_sta_flag(sta
, WLAN_STA_WME
);
616 if (sta
&& elems
->ht_operation
&& elems
->ht_cap_elem
&&
617 sdata
->u
.ibss
.chandef
.width
!= NL80211_CHAN_WIDTH_20_NOHT
&&
618 sdata
->u
.ibss
.chandef
.width
!= NL80211_CHAN_WIDTH_5
&&
619 sdata
->u
.ibss
.chandef
.width
!= NL80211_CHAN_WIDTH_10
) {
621 struct ieee80211_ht_cap htcap_ie
;
622 struct cfg80211_chan_def chandef
;
624 ieee80211_ht_oper_to_chandef(channel
,
628 memcpy(&htcap_ie
, elems
->ht_cap_elem
, sizeof(htcap_ie
));
631 * fall back to HT20 if we don't use or use
632 * the other extension channel
634 if (chandef
.center_freq1
!=
635 sdata
->u
.ibss
.chandef
.center_freq1
)
637 cpu_to_le16(~IEEE80211_HT_CAP_SUP_WIDTH_20_40
);
639 rates_updated
|= ieee80211_ht_cap_ie_to_sta_ht_cap(
640 sdata
, sband
, &htcap_ie
, sta
);
643 if (sta
&& rates_updated
) {
644 drv_sta_rc_update(local
, sdata
, &sta
->sta
,
645 IEEE80211_RC_SUPP_RATES_CHANGED
);
646 rate_control_rate_init(sta
);
652 bss
= ieee80211_bss_info_update(local
, rx_status
, mgmt
, len
, elems
,
657 cbss
= container_of((void *)bss
, struct cfg80211_bss
, priv
);
659 /* same for beacon and probe response */
660 beacon_timestamp
= le64_to_cpu(mgmt
->u
.beacon
.timestamp
);
662 /* check if we need to merge IBSS */
664 /* we use a fixed BSSID */
665 if (sdata
->u
.ibss
.fixed_bssid
)
669 if (!(cbss
->capability
& WLAN_CAPABILITY_IBSS
))
672 /* different channel */
673 if (sdata
->u
.ibss
.fixed_channel
&&
674 sdata
->u
.ibss
.chandef
.chan
!= cbss
->channel
)
678 if (elems
->ssid_len
!= sdata
->u
.ibss
.ssid_len
||
679 memcmp(elems
->ssid
, sdata
->u
.ibss
.ssid
,
680 sdata
->u
.ibss
.ssid_len
))
684 if (ether_addr_equal(cbss
->bssid
, sdata
->u
.ibss
.bssid
))
687 if (ieee80211_have_rx_timestamp(rx_status
)) {
688 /* time when timestamp field was received */
690 ieee80211_calculate_rx_timestamp(local
, rx_status
,
694 * second best option: get current TSF
695 * (will return -1 if not supported)
697 rx_timestamp
= drv_get_tsf(local
, sdata
);
701 "RX beacon SA=%pM BSSID=%pM TSF=0x%llx BCN=0x%llx diff=%lld @%lu\n",
702 mgmt
->sa
, mgmt
->bssid
,
703 (unsigned long long)rx_timestamp
,
704 (unsigned long long)beacon_timestamp
,
705 (unsigned long long)(rx_timestamp
- beacon_timestamp
),
708 if (beacon_timestamp
> rx_timestamp
) {
710 "beacon TSF higher than local TSF - IBSS merge with BSSID %pM\n",
712 ieee80211_sta_join_ibss(sdata
, bss
);
713 supp_rates
= ieee80211_sta_get_rates(sdata
, elems
, band
, NULL
);
714 ieee80211_ibss_add_sta(sdata
, mgmt
->bssid
, mgmt
->sa
,
720 ieee80211_rx_bss_put(local
, bss
);
723 void ieee80211_ibss_rx_no_sta(struct ieee80211_sub_if_data
*sdata
,
724 const u8
*bssid
, const u8
*addr
,
727 struct ieee80211_if_ibss
*ifibss
= &sdata
->u
.ibss
;
728 struct ieee80211_local
*local
= sdata
->local
;
729 struct sta_info
*sta
;
730 struct ieee80211_chanctx_conf
*chanctx_conf
;
731 struct ieee80211_supported_band
*sband
;
732 enum nl80211_bss_scan_width scan_width
;
736 * XXX: Consider removing the least recently used entry and
737 * allow new one to be added.
739 if (local
->num_sta
>= IEEE80211_IBSS_MAX_STA_ENTRIES
) {
740 net_info_ratelimited("%s: No room for a new IBSS STA entry %pM\n",
745 if (ifibss
->state
== IEEE80211_IBSS_MLME_SEARCH
)
748 if (!ether_addr_equal(bssid
, sdata
->u
.ibss
.bssid
))
752 chanctx_conf
= rcu_dereference(sdata
->vif
.chanctx_conf
);
753 if (WARN_ON_ONCE(!chanctx_conf
)) {
757 band
= chanctx_conf
->def
.chan
->band
;
758 scan_width
= cfg80211_chandef_to_scan_width(&chanctx_conf
->def
);
761 sta
= sta_info_alloc(sdata
, addr
, GFP_ATOMIC
);
765 sta
->last_rx
= jiffies
;
767 /* make sure mandatory rates are always added */
768 sband
= local
->hw
.wiphy
->bands
[band
];
769 sta
->sta
.supp_rates
[band
] = supp_rates
|
770 ieee80211_mandatory_rates(sband
, scan_width
);
772 spin_lock(&ifibss
->incomplete_lock
);
773 list_add(&sta
->list
, &ifibss
->incomplete_stations
);
774 spin_unlock(&ifibss
->incomplete_lock
);
775 ieee80211_queue_work(&local
->hw
, &sdata
->work
);
778 static int ieee80211_sta_active_ibss(struct ieee80211_sub_if_data
*sdata
)
780 struct ieee80211_local
*local
= sdata
->local
;
782 struct sta_info
*sta
;
784 sdata_assert_lock(sdata
);
788 list_for_each_entry_rcu(sta
, &local
->sta_list
, list
) {
789 if (sta
->sdata
== sdata
&&
790 time_after(sta
->last_rx
+ IEEE80211_IBSS_MERGE_INTERVAL
,
802 static void ieee80211_ibss_sta_expire(struct ieee80211_sub_if_data
*sdata
)
804 struct ieee80211_local
*local
= sdata
->local
;
805 struct sta_info
*sta
, *tmp
;
806 unsigned long exp_time
= IEEE80211_IBSS_INACTIVITY_LIMIT
;
807 unsigned long exp_rsn_time
= IEEE80211_IBSS_RSN_INACTIVITY_LIMIT
;
809 mutex_lock(&local
->sta_mtx
);
811 list_for_each_entry_safe(sta
, tmp
, &local
->sta_list
, list
) {
812 if (sdata
!= sta
->sdata
)
815 if (time_after(jiffies
, sta
->last_rx
+ exp_time
) ||
816 (time_after(jiffies
, sta
->last_rx
+ exp_rsn_time
) &&
817 sta
->sta_state
!= IEEE80211_STA_AUTHORIZED
)) {
818 sta_dbg(sta
->sdata
, "expiring inactive %sSTA %pM\n",
819 sta
->sta_state
!= IEEE80211_STA_AUTHORIZED
?
820 "not authorized " : "", sta
->sta
.addr
);
822 WARN_ON(__sta_info_destroy(sta
));
826 mutex_unlock(&local
->sta_mtx
);
830 * This function is called with state == IEEE80211_IBSS_MLME_JOINED
833 static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data
*sdata
)
835 struct ieee80211_if_ibss
*ifibss
= &sdata
->u
.ibss
;
836 enum nl80211_bss_scan_width scan_width
;
838 sdata_assert_lock(sdata
);
840 mod_timer(&ifibss
->timer
,
841 round_jiffies(jiffies
+ IEEE80211_IBSS_MERGE_INTERVAL
));
843 ieee80211_ibss_sta_expire(sdata
);
845 if (time_before(jiffies
, ifibss
->last_scan_completed
+
846 IEEE80211_IBSS_MERGE_INTERVAL
))
849 if (ieee80211_sta_active_ibss(sdata
))
852 if (ifibss
->fixed_channel
)
856 "No active IBSS STAs - trying to scan for other IBSS networks with same SSID (merge)\n");
858 scan_width
= cfg80211_chandef_to_scan_width(&ifibss
->chandef
);
859 ieee80211_request_ibss_scan(sdata
, ifibss
->ssid
, ifibss
->ssid_len
,
863 static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data
*sdata
)
865 struct ieee80211_if_ibss
*ifibss
= &sdata
->u
.ibss
;
870 sdata_assert_lock(sdata
);
872 if (ifibss
->fixed_bssid
) {
873 memcpy(bssid
, ifibss
->bssid
, ETH_ALEN
);
875 /* Generate random, not broadcast, locally administered BSSID. Mix in
876 * own MAC address to make sure that devices that do not have proper
877 * random number generator get different BSSID. */
878 get_random_bytes(bssid
, ETH_ALEN
);
879 for (i
= 0; i
< ETH_ALEN
; i
++)
880 bssid
[i
] ^= sdata
->vif
.addr
[i
];
885 sdata_info(sdata
, "Creating new IBSS network, BSSID %pM\n", bssid
);
887 capability
= WLAN_CAPABILITY_IBSS
;
890 capability
|= WLAN_CAPABILITY_PRIVACY
;
892 sdata
->drop_unencrypted
= 0;
894 __ieee80211_sta_join_ibss(sdata
, bssid
, sdata
->vif
.bss_conf
.beacon_int
,
895 &ifibss
->chandef
, ifibss
->basic_rates
,
896 capability
, 0, true);
900 * This function is called with state == IEEE80211_IBSS_MLME_SEARCH
903 static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data
*sdata
)
905 struct ieee80211_if_ibss
*ifibss
= &sdata
->u
.ibss
;
906 struct ieee80211_local
*local
= sdata
->local
;
907 struct cfg80211_bss
*cbss
;
908 struct ieee80211_channel
*chan
= NULL
;
909 const u8
*bssid
= NULL
;
910 enum nl80211_bss_scan_width scan_width
;
914 sdata_assert_lock(sdata
);
916 active_ibss
= ieee80211_sta_active_ibss(sdata
);
917 ibss_dbg(sdata
, "sta_find_ibss (active_ibss=%d)\n", active_ibss
);
922 capability
= WLAN_CAPABILITY_IBSS
;
924 capability
|= WLAN_CAPABILITY_PRIVACY
;
925 if (ifibss
->fixed_bssid
)
926 bssid
= ifibss
->bssid
;
927 if (ifibss
->fixed_channel
)
928 chan
= ifibss
->chandef
.chan
;
929 if (!is_zero_ether_addr(ifibss
->bssid
))
930 bssid
= ifibss
->bssid
;
931 cbss
= cfg80211_get_bss(local
->hw
.wiphy
, chan
, bssid
,
932 ifibss
->ssid
, ifibss
->ssid_len
,
933 WLAN_CAPABILITY_IBSS
| WLAN_CAPABILITY_PRIVACY
,
937 struct ieee80211_bss
*bss
;
939 bss
= (void *)cbss
->priv
;
941 "sta_find_ibss: selected %pM current %pM\n",
942 cbss
->bssid
, ifibss
->bssid
);
944 "Selected IBSS BSSID %pM based on configured SSID\n",
947 ieee80211_sta_join_ibss(sdata
, bss
);
948 ieee80211_rx_bss_put(local
, bss
);
952 /* if a fixed bssid and a fixed freq have been provided create the IBSS
953 * directly and do not waste time scanning
955 if (ifibss
->fixed_bssid
&& ifibss
->fixed_channel
) {
956 sdata_info(sdata
, "Created IBSS using preconfigured BSSID %pM\n",
958 ieee80211_sta_create_ibss(sdata
);
963 ibss_dbg(sdata
, "sta_find_ibss: did not try to join ibss\n");
965 /* Selected IBSS not found in current scan results - try to scan */
966 if (time_after(jiffies
, ifibss
->last_scan_completed
+
967 IEEE80211_SCAN_INTERVAL
)) {
968 sdata_info(sdata
, "Trigger new scan to find an IBSS to join\n");
970 scan_width
= cfg80211_chandef_to_scan_width(&ifibss
->chandef
);
971 ieee80211_request_ibss_scan(sdata
, ifibss
->ssid
,
972 ifibss
->ssid_len
, chan
,
975 int interval
= IEEE80211_SCAN_INTERVAL
;
977 if (time_after(jiffies
, ifibss
->ibss_join_req
+
978 IEEE80211_IBSS_JOIN_TIMEOUT
))
979 ieee80211_sta_create_ibss(sdata
);
981 mod_timer(&ifibss
->timer
,
982 round_jiffies(jiffies
+ interval
));
986 static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data
*sdata
,
989 struct ieee80211_mgmt
*mgmt
= (void *)req
->data
;
990 struct ieee80211_if_ibss
*ifibss
= &sdata
->u
.ibss
;
991 struct ieee80211_local
*local
= sdata
->local
;
992 int tx_last_beacon
, len
= req
->len
;
994 struct beacon_data
*presp
;
997 sdata_assert_lock(sdata
);
999 presp
= rcu_dereference_protected(ifibss
->presp
,
1000 lockdep_is_held(&sdata
->wdev
.mtx
));
1002 if (ifibss
->state
!= IEEE80211_IBSS_MLME_JOINED
||
1003 len
< 24 + 2 || !presp
)
1006 tx_last_beacon
= drv_tx_last_beacon(local
);
1009 "RX ProbeReq SA=%pM DA=%pM BSSID=%pM (tx_last_beacon=%d)\n",
1010 mgmt
->sa
, mgmt
->da
, mgmt
->bssid
, tx_last_beacon
);
1012 if (!tx_last_beacon
&& is_multicast_ether_addr(mgmt
->da
))
1015 if (!ether_addr_equal(mgmt
->bssid
, ifibss
->bssid
) &&
1016 !is_broadcast_ether_addr(mgmt
->bssid
))
1019 end
= ((u8
*) mgmt
) + len
;
1020 pos
= mgmt
->u
.probe_req
.variable
;
1021 if (pos
[0] != WLAN_EID_SSID
||
1022 pos
+ 2 + pos
[1] > end
) {
1023 ibss_dbg(sdata
, "Invalid SSID IE in ProbeReq from %pM\n",
1028 (pos
[1] != ifibss
->ssid_len
||
1029 memcmp(pos
+ 2, ifibss
->ssid
, ifibss
->ssid_len
))) {
1030 /* Ignore ProbeReq for foreign SSID */
1034 /* Reply with ProbeResp */
1035 skb
= dev_alloc_skb(local
->tx_headroom
+ presp
->head_len
);
1039 skb_reserve(skb
, local
->tx_headroom
);
1040 memcpy(skb_put(skb
, presp
->head_len
), presp
->head
, presp
->head_len
);
1042 memcpy(((struct ieee80211_mgmt
*) skb
->data
)->da
, mgmt
->sa
, ETH_ALEN
);
1043 ibss_dbg(sdata
, "Sending ProbeResp to %pM\n", mgmt
->sa
);
1044 IEEE80211_SKB_CB(skb
)->flags
|= IEEE80211_TX_INTFL_DONT_ENCRYPT
;
1045 ieee80211_tx_skb(sdata
, skb
);
1049 void ieee80211_rx_mgmt_probe_beacon(struct ieee80211_sub_if_data
*sdata
,
1050 struct ieee80211_mgmt
*mgmt
, size_t len
,
1051 struct ieee80211_rx_status
*rx_status
)
1054 struct ieee802_11_elems elems
;
1056 BUILD_BUG_ON(offsetof(typeof(mgmt
->u
.probe_resp
), variable
) !=
1057 offsetof(typeof(mgmt
->u
.beacon
), variable
));
1060 * either beacon or probe_resp but the variable field is at the
1063 baselen
= (u8
*) mgmt
->u
.probe_resp
.variable
- (u8
*) mgmt
;
1067 ieee802_11_parse_elems(mgmt
->u
.probe_resp
.variable
, len
- baselen
,
1070 ieee80211_rx_bss_info(sdata
, mgmt
, len
, rx_status
, &elems
);
1073 void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data
*sdata
,
1074 struct sk_buff
*skb
)
1076 struct ieee80211_rx_status
*rx_status
;
1077 struct ieee80211_mgmt
*mgmt
;
1080 rx_status
= IEEE80211_SKB_RXCB(skb
);
1081 mgmt
= (struct ieee80211_mgmt
*) skb
->data
;
1082 fc
= le16_to_cpu(mgmt
->frame_control
);
1086 if (!sdata
->u
.ibss
.ssid_len
)
1087 goto mgmt_out
; /* not ready to merge yet */
1089 switch (fc
& IEEE80211_FCTL_STYPE
) {
1090 case IEEE80211_STYPE_PROBE_REQ
:
1091 ieee80211_rx_mgmt_probe_req(sdata
, skb
);
1093 case IEEE80211_STYPE_PROBE_RESP
:
1094 case IEEE80211_STYPE_BEACON
:
1095 ieee80211_rx_mgmt_probe_beacon(sdata
, mgmt
, skb
->len
,
1098 case IEEE80211_STYPE_AUTH
:
1099 ieee80211_rx_mgmt_auth_ibss(sdata
, mgmt
, skb
->len
);
1101 case IEEE80211_STYPE_DEAUTH
:
1102 ieee80211_rx_mgmt_deauth_ibss(sdata
, mgmt
, skb
->len
);
1107 sdata_unlock(sdata
);
1110 void ieee80211_ibss_work(struct ieee80211_sub_if_data
*sdata
)
1112 struct ieee80211_if_ibss
*ifibss
= &sdata
->u
.ibss
;
1113 struct sta_info
*sta
;
1118 * Work could be scheduled after scan or similar
1119 * when we aren't even joined (or trying) with a
1122 if (!ifibss
->ssid_len
)
1125 spin_lock_bh(&ifibss
->incomplete_lock
);
1126 while (!list_empty(&ifibss
->incomplete_stations
)) {
1127 sta
= list_first_entry(&ifibss
->incomplete_stations
,
1128 struct sta_info
, list
);
1129 list_del(&sta
->list
);
1130 spin_unlock_bh(&ifibss
->incomplete_lock
);
1132 ieee80211_ibss_finish_sta(sta
);
1134 spin_lock_bh(&ifibss
->incomplete_lock
);
1136 spin_unlock_bh(&ifibss
->incomplete_lock
);
1138 switch (ifibss
->state
) {
1139 case IEEE80211_IBSS_MLME_SEARCH
:
1140 ieee80211_sta_find_ibss(sdata
);
1142 case IEEE80211_IBSS_MLME_JOINED
:
1143 ieee80211_sta_merge_ibss(sdata
);
1151 sdata_unlock(sdata
);
1154 static void ieee80211_ibss_timer(unsigned long data
)
1156 struct ieee80211_sub_if_data
*sdata
=
1157 (struct ieee80211_sub_if_data
*) data
;
1159 ieee80211_queue_work(&sdata
->local
->hw
, &sdata
->work
);
1162 void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data
*sdata
)
1164 struct ieee80211_if_ibss
*ifibss
= &sdata
->u
.ibss
;
1166 setup_timer(&ifibss
->timer
, ieee80211_ibss_timer
,
1167 (unsigned long) sdata
);
1168 INIT_LIST_HEAD(&ifibss
->incomplete_stations
);
1169 spin_lock_init(&ifibss
->incomplete_lock
);
1172 /* scan finished notification */
1173 void ieee80211_ibss_notify_scan_completed(struct ieee80211_local
*local
)
1175 struct ieee80211_sub_if_data
*sdata
;
1177 mutex_lock(&local
->iflist_mtx
);
1178 list_for_each_entry(sdata
, &local
->interfaces
, list
) {
1179 if (!ieee80211_sdata_running(sdata
))
1181 if (sdata
->vif
.type
!= NL80211_IFTYPE_ADHOC
)
1183 sdata
->u
.ibss
.last_scan_completed
= jiffies
;
1184 ieee80211_queue_work(&local
->hw
, &sdata
->work
);
1186 mutex_unlock(&local
->iflist_mtx
);
1189 int ieee80211_ibss_join(struct ieee80211_sub_if_data
*sdata
,
1190 struct cfg80211_ibss_params
*params
)
1194 struct ieee80211_supported_band
*sband
;
1197 if (params
->bssid
) {
1198 memcpy(sdata
->u
.ibss
.bssid
, params
->bssid
, ETH_ALEN
);
1199 sdata
->u
.ibss
.fixed_bssid
= true;
1201 sdata
->u
.ibss
.fixed_bssid
= false;
1203 sdata
->u
.ibss
.privacy
= params
->privacy
;
1204 sdata
->u
.ibss
.control_port
= params
->control_port
;
1205 sdata
->u
.ibss
.basic_rates
= params
->basic_rates
;
1206 sdata
->u
.ibss
.last_scan_completed
= jiffies
;
1208 /* fix basic_rates if channel does not support these rates */
1209 rate_flags
= ieee80211_chandef_rate_flags(¶ms
->chandef
);
1210 sband
= sdata
->local
->hw
.wiphy
->bands
[params
->chandef
.chan
->band
];
1211 for (i
= 0; i
< sband
->n_bitrates
; i
++) {
1212 if ((rate_flags
& sband
->bitrates
[i
].flags
) != rate_flags
)
1213 sdata
->u
.ibss
.basic_rates
&= ~BIT(i
);
1215 memcpy(sdata
->vif
.bss_conf
.mcast_rate
, params
->mcast_rate
,
1216 sizeof(params
->mcast_rate
));
1218 sdata
->vif
.bss_conf
.beacon_int
= params
->beacon_interval
;
1220 sdata
->u
.ibss
.chandef
= params
->chandef
;
1221 sdata
->u
.ibss
.fixed_channel
= params
->channel_fixed
;
1224 sdata
->u
.ibss
.ie
= kmemdup(params
->ie
, params
->ie_len
,
1226 if (sdata
->u
.ibss
.ie
)
1227 sdata
->u
.ibss
.ie_len
= params
->ie_len
;
1230 sdata
->u
.ibss
.state
= IEEE80211_IBSS_MLME_SEARCH
;
1231 sdata
->u
.ibss
.ibss_join_req
= jiffies
;
1233 memcpy(sdata
->u
.ibss
.ssid
, params
->ssid
, params
->ssid_len
);
1234 sdata
->u
.ibss
.ssid_len
= params
->ssid_len
;
1236 memcpy(&sdata
->u
.ibss
.ht_capa
, ¶ms
->ht_capa
,
1237 sizeof(sdata
->u
.ibss
.ht_capa
));
1238 memcpy(&sdata
->u
.ibss
.ht_capa_mask
, ¶ms
->ht_capa_mask
,
1239 sizeof(sdata
->u
.ibss
.ht_capa_mask
));
1242 * 802.11n-2009 9.13.3.1: In an IBSS, the HT Protection field is
1243 * reserved, but an HT STA shall protect HT transmissions as though
1244 * the HT Protection field were set to non-HT mixed mode.
1246 * In an IBSS, the RIFS Mode field of the HT Operation element is
1247 * also reserved, but an HT STA shall operate as though this field
1251 sdata
->vif
.bss_conf
.ht_operation_mode
|=
1252 IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED
1253 | IEEE80211_HT_PARAM_RIFS_MODE
;
1255 changed
|= BSS_CHANGED_HT
;
1256 ieee80211_bss_info_change_notify(sdata
, changed
);
1258 sdata
->smps_mode
= IEEE80211_SMPS_OFF
;
1259 sdata
->needed_rx_chains
= sdata
->local
->rx_chains
;
1261 ieee80211_queue_work(&sdata
->local
->hw
, &sdata
->work
);
1266 int ieee80211_ibss_leave(struct ieee80211_sub_if_data
*sdata
)
1268 struct ieee80211_if_ibss
*ifibss
= &sdata
->u
.ibss
;
1269 struct ieee80211_local
*local
= sdata
->local
;
1270 struct cfg80211_bss
*cbss
;
1273 struct sta_info
*sta
;
1274 struct beacon_data
*presp
;
1276 active_ibss
= ieee80211_sta_active_ibss(sdata
);
1278 if (!active_ibss
&& !is_zero_ether_addr(ifibss
->bssid
)) {
1279 capability
= WLAN_CAPABILITY_IBSS
;
1281 if (ifibss
->privacy
)
1282 capability
|= WLAN_CAPABILITY_PRIVACY
;
1284 cbss
= cfg80211_get_bss(local
->hw
.wiphy
, ifibss
->chandef
.chan
,
1285 ifibss
->bssid
, ifibss
->ssid
,
1286 ifibss
->ssid_len
, WLAN_CAPABILITY_IBSS
|
1287 WLAN_CAPABILITY_PRIVACY
,
1291 cfg80211_unlink_bss(local
->hw
.wiphy
, cbss
);
1292 cfg80211_put_bss(local
->hw
.wiphy
, cbss
);
1296 ifibss
->state
= IEEE80211_IBSS_MLME_SEARCH
;
1297 memset(ifibss
->bssid
, 0, ETH_ALEN
);
1298 ifibss
->ssid_len
= 0;
1300 sta_info_flush(sdata
);
1302 spin_lock_bh(&ifibss
->incomplete_lock
);
1303 while (!list_empty(&ifibss
->incomplete_stations
)) {
1304 sta
= list_first_entry(&ifibss
->incomplete_stations
,
1305 struct sta_info
, list
);
1306 list_del(&sta
->list
);
1307 spin_unlock_bh(&ifibss
->incomplete_lock
);
1309 sta_info_free(local
, sta
);
1310 spin_lock_bh(&ifibss
->incomplete_lock
);
1312 spin_unlock_bh(&ifibss
->incomplete_lock
);
1314 netif_carrier_off(sdata
->dev
);
1317 kfree(sdata
->u
.ibss
.ie
);
1318 presp
= rcu_dereference_protected(ifibss
->presp
,
1319 lockdep_is_held(&sdata
->wdev
.mtx
));
1320 RCU_INIT_POINTER(sdata
->u
.ibss
.presp
, NULL
);
1322 /* on the next join, re-program HT parameters */
1323 memset(&ifibss
->ht_capa
, 0, sizeof(ifibss
->ht_capa
));
1324 memset(&ifibss
->ht_capa_mask
, 0, sizeof(ifibss
->ht_capa_mask
));
1326 sdata
->vif
.bss_conf
.ibss_joined
= false;
1327 sdata
->vif
.bss_conf
.ibss_creator
= false;
1328 sdata
->vif
.bss_conf
.enable_beacon
= false;
1329 sdata
->vif
.bss_conf
.ssid_len
= 0;
1330 clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED
, &sdata
->state
);
1331 ieee80211_bss_info_change_notify(sdata
, BSS_CHANGED_BEACON_ENABLED
|
1333 ieee80211_vif_release_channel(sdata
);
1337 skb_queue_purge(&sdata
->skb_queue
);
1339 del_timer_sync(&sdata
->u
.ibss
.timer
);