ibss.c revision dd5b4cc71cd09c33e1579cc6d5720656e94e52de
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>
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#include <asm/unaligned.h>
24
25#include "ieee80211_i.h"
26#include "driver-ops.h"
27#include "rate.h"
28
29#define IEEE80211_SCAN_INTERVAL (2 * HZ)
30#define IEEE80211_SCAN_INTERVAL_SLOW (15 * HZ)
31#define IEEE80211_IBSS_JOIN_TIMEOUT (7 * HZ)
32
33#define IEEE80211_IBSS_MERGE_INTERVAL (30 * HZ)
34#define IEEE80211_IBSS_MERGE_DELAY 0x400000
35#define IEEE80211_IBSS_INACTIVITY_LIMIT (60 * HZ)
36
37#define IEEE80211_IBSS_MAX_STA_ENTRIES 128
38
39
40static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
41					struct ieee80211_mgmt *mgmt,
42					size_t len)
43{
44	u16 auth_alg, auth_transaction, status_code;
45
46	lockdep_assert_held(&sdata->u.ibss.mtx);
47
48	if (len < 24 + 6)
49		return;
50
51	auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
52	auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
53	status_code = le16_to_cpu(mgmt->u.auth.status_code);
54
55	/*
56	 * IEEE 802.11 standard does not require authentication in IBSS
57	 * networks and most implementations do not seem to use it.
58	 * However, try to reply to authentication attempts if someone
59	 * has actually implemented this.
60	 */
61	if (auth_alg == WLAN_AUTH_OPEN && auth_transaction == 1)
62		ieee80211_send_auth(sdata, 2, WLAN_AUTH_OPEN, NULL, 0,
63				    sdata->u.ibss.bssid, NULL, 0, 0);
64}
65
66static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
67				      const u8 *bssid, const int beacon_int,
68				      struct ieee80211_channel *chan,
69				      const u32 basic_rates,
70				      const u16 capability, u64 tsf)
71{
72	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
73	struct ieee80211_local *local = sdata->local;
74	int rates, i;
75	struct sk_buff *skb;
76	struct ieee80211_mgmt *mgmt;
77	u8 *pos;
78	struct ieee80211_supported_band *sband;
79	struct cfg80211_bss *bss;
80	u32 bss_change;
81	u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
82
83	lockdep_assert_held(&ifibss->mtx);
84
85	/* Reset own TSF to allow time synchronization work. */
86	drv_reset_tsf(local);
87
88	skb = ifibss->skb;
89	rcu_assign_pointer(ifibss->presp, NULL);
90	synchronize_rcu();
91	skb->data = skb->head;
92	skb->len = 0;
93	skb_reset_tail_pointer(skb);
94	skb_reserve(skb, sdata->local->hw.extra_tx_headroom);
95
96	if (memcmp(ifibss->bssid, bssid, ETH_ALEN))
97		sta_info_flush(sdata->local, sdata);
98
99	/* if merging, indicate to driver that we leave the old IBSS */
100	if (sdata->vif.bss_conf.ibss_joined) {
101		sdata->vif.bss_conf.ibss_joined = false;
102		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_IBSS);
103	}
104
105	memcpy(ifibss->bssid, bssid, ETH_ALEN);
106
107	sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;
108
109	local->oper_channel = chan;
110	WARN_ON(!ieee80211_set_channel_type(local, sdata, NL80211_CHAN_NO_HT));
111	ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
112
113	sband = local->hw.wiphy->bands[chan->band];
114
115	/* build supported rates array */
116	pos = supp_rates;
117	for (i = 0; i < sband->n_bitrates; i++) {
118		int rate = sband->bitrates[i].bitrate;
119		u8 basic = 0;
120		if (basic_rates & BIT(i))
121			basic = 0x80;
122		*pos++ = basic | (u8) (rate / 5);
123	}
124
125	/* Build IBSS probe response */
126	mgmt = (void *) skb_put(skb, 24 + sizeof(mgmt->u.beacon));
127	memset(mgmt, 0, 24 + sizeof(mgmt->u.beacon));
128	mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
129					  IEEE80211_STYPE_PROBE_RESP);
130	memset(mgmt->da, 0xff, ETH_ALEN);
131	memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
132	memcpy(mgmt->bssid, ifibss->bssid, ETH_ALEN);
133	mgmt->u.beacon.beacon_int = cpu_to_le16(beacon_int);
134	mgmt->u.beacon.timestamp = cpu_to_le64(tsf);
135	mgmt->u.beacon.capab_info = cpu_to_le16(capability);
136
137	pos = skb_put(skb, 2 + ifibss->ssid_len);
138	*pos++ = WLAN_EID_SSID;
139	*pos++ = ifibss->ssid_len;
140	memcpy(pos, ifibss->ssid, ifibss->ssid_len);
141
142	rates = sband->n_bitrates;
143	if (rates > 8)
144		rates = 8;
145	pos = skb_put(skb, 2 + rates);
146	*pos++ = WLAN_EID_SUPP_RATES;
147	*pos++ = rates;
148	memcpy(pos, supp_rates, rates);
149
150	if (sband->band == IEEE80211_BAND_2GHZ) {
151		pos = skb_put(skb, 2 + 1);
152		*pos++ = WLAN_EID_DS_PARAMS;
153		*pos++ = 1;
154		*pos++ = ieee80211_frequency_to_channel(chan->center_freq);
155	}
156
157	pos = skb_put(skb, 2 + 2);
158	*pos++ = WLAN_EID_IBSS_PARAMS;
159	*pos++ = 2;
160	/* FIX: set ATIM window based on scan results */
161	*pos++ = 0;
162	*pos++ = 0;
163
164	if (sband->n_bitrates > 8) {
165		rates = sband->n_bitrates - 8;
166		pos = skb_put(skb, 2 + rates);
167		*pos++ = WLAN_EID_EXT_SUPP_RATES;
168		*pos++ = rates;
169		memcpy(pos, &supp_rates[8], rates);
170	}
171
172	if (ifibss->ie_len)
173		memcpy(skb_put(skb, ifibss->ie_len),
174		       ifibss->ie, ifibss->ie_len);
175
176	if (local->hw.queues >= 4) {
177		pos = skb_put(skb, 9);
178		*pos++ = WLAN_EID_VENDOR_SPECIFIC;
179		*pos++ = 7; /* len */
180		*pos++ = 0x00; /* Microsoft OUI 00:50:F2 */
181		*pos++ = 0x50;
182		*pos++ = 0xf2;
183		*pos++ = 2; /* WME */
184		*pos++ = 0; /* WME info */
185		*pos++ = 1; /* WME ver */
186		*pos++ = 0; /* U-APSD no in use */
187	}
188
189	rcu_assign_pointer(ifibss->presp, skb);
190
191	sdata->vif.bss_conf.beacon_int = beacon_int;
192	sdata->vif.bss_conf.basic_rates = basic_rates;
193	bss_change = BSS_CHANGED_BEACON_INT;
194	bss_change |= ieee80211_reset_erp_info(sdata);
195	bss_change |= BSS_CHANGED_BSSID;
196	bss_change |= BSS_CHANGED_BEACON;
197	bss_change |= BSS_CHANGED_BEACON_ENABLED;
198	bss_change |= BSS_CHANGED_BASIC_RATES;
199	bss_change |= BSS_CHANGED_IBSS;
200	sdata->vif.bss_conf.ibss_joined = true;
201	ieee80211_bss_info_change_notify(sdata, bss_change);
202
203	ieee80211_sta_def_wmm_params(sdata, sband->n_bitrates, supp_rates);
204
205	ifibss->state = IEEE80211_IBSS_MLME_JOINED;
206	mod_timer(&ifibss->timer,
207		  round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL));
208
209	bss = cfg80211_inform_bss_frame(local->hw.wiphy, local->hw.conf.channel,
210					mgmt, skb->len, 0, GFP_KERNEL);
211	cfg80211_put_bss(bss);
212	cfg80211_ibss_joined(sdata->dev, ifibss->bssid, GFP_KERNEL);
213}
214
215static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
216				    struct ieee80211_bss *bss)
217{
218	struct cfg80211_bss *cbss =
219		container_of((void *)bss, struct cfg80211_bss, priv);
220	struct ieee80211_supported_band *sband;
221	u32 basic_rates;
222	int i, j;
223	u16 beacon_int = cbss->beacon_interval;
224
225	lockdep_assert_held(&sdata->u.ibss.mtx);
226
227	if (beacon_int < 10)
228		beacon_int = 10;
229
230	sband = sdata->local->hw.wiphy->bands[cbss->channel->band];
231
232	basic_rates = 0;
233
234	for (i = 0; i < bss->supp_rates_len; i++) {
235		int rate = (bss->supp_rates[i] & 0x7f) * 5;
236		bool is_basic = !!(bss->supp_rates[i] & 0x80);
237
238		for (j = 0; j < sband->n_bitrates; j++) {
239			if (sband->bitrates[j].bitrate == rate) {
240				if (is_basic)
241					basic_rates |= BIT(j);
242				break;
243			}
244		}
245	}
246
247	__ieee80211_sta_join_ibss(sdata, cbss->bssid,
248				  beacon_int,
249				  cbss->channel,
250				  basic_rates,
251				  cbss->capability,
252				  cbss->tsf);
253}
254
255static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
256				  struct ieee80211_mgmt *mgmt,
257				  size_t len,
258				  struct ieee80211_rx_status *rx_status,
259				  struct ieee802_11_elems *elems,
260				  bool beacon)
261{
262	struct ieee80211_local *local = sdata->local;
263	int freq;
264	struct cfg80211_bss *cbss;
265	struct ieee80211_bss *bss;
266	struct sta_info *sta;
267	struct ieee80211_channel *channel;
268	u64 beacon_timestamp, rx_timestamp;
269	u32 supp_rates = 0;
270	enum ieee80211_band band = rx_status->band;
271
272	if (elems->ds_params && elems->ds_params_len == 1)
273		freq = ieee80211_channel_to_frequency(elems->ds_params[0]);
274	else
275		freq = rx_status->freq;
276
277	channel = ieee80211_get_channel(local->hw.wiphy, freq);
278
279	if (!channel || channel->flags & IEEE80211_CHAN_DISABLED)
280		return;
281
282	if (sdata->vif.type == NL80211_IFTYPE_ADHOC &&
283	    memcmp(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN) == 0) {
284
285		rcu_read_lock();
286		sta = sta_info_get(sdata, mgmt->sa);
287
288		if (elems->supp_rates) {
289			supp_rates = ieee80211_sta_get_rates(local, elems,
290							     band);
291			if (sta) {
292				u32 prev_rates;
293
294				prev_rates = sta->sta.supp_rates[band];
295				/* make sure mandatory rates are always added */
296				sta->sta.supp_rates[band] = supp_rates |
297					ieee80211_mandatory_rates(local, band);
298
299				if (sta->sta.supp_rates[band] != prev_rates) {
300#ifdef CONFIG_MAC80211_IBSS_DEBUG
301					printk(KERN_DEBUG
302						"%s: updated supp_rates set "
303						"for %pM based on beacon"
304						"/probe_resp (0x%x -> 0x%x)\n",
305						sdata->name, sta->sta.addr,
306						prev_rates,
307						sta->sta.supp_rates[band]);
308#endif
309					rate_control_rate_init(sta);
310				}
311			} else
312				sta = ieee80211_ibss_add_sta(sdata, mgmt->bssid,
313						mgmt->sa, supp_rates,
314						GFP_ATOMIC);
315		}
316
317		if (sta && elems->wmm_info)
318			set_sta_flags(sta, WLAN_STA_WME);
319
320		rcu_read_unlock();
321	}
322
323	bss = ieee80211_bss_info_update(local, rx_status, mgmt, len, elems,
324					channel, beacon);
325	if (!bss)
326		return;
327
328	cbss = container_of((void *)bss, struct cfg80211_bss, priv);
329
330	/* was just updated in ieee80211_bss_info_update */
331	beacon_timestamp = cbss->tsf;
332
333	/* check if we need to merge IBSS */
334
335	/* we use a fixed BSSID */
336	if (sdata->u.ibss.fixed_bssid)
337		goto put_bss;
338
339	/* not an IBSS */
340	if (!(cbss->capability & WLAN_CAPABILITY_IBSS))
341		goto put_bss;
342
343	/* different channel */
344	if (cbss->channel != local->oper_channel)
345		goto put_bss;
346
347	/* different SSID */
348	if (elems->ssid_len != sdata->u.ibss.ssid_len ||
349	    memcmp(elems->ssid, sdata->u.ibss.ssid,
350				sdata->u.ibss.ssid_len))
351		goto put_bss;
352
353	/* same BSSID */
354	if (memcmp(cbss->bssid, sdata->u.ibss.bssid, ETH_ALEN) == 0)
355		goto put_bss;
356
357	if (rx_status->flag & RX_FLAG_TSFT) {
358		/*
359		 * For correct IBSS merging we need mactime; since mactime is
360		 * defined as the time the first data symbol of the frame hits
361		 * the PHY, and the timestamp of the beacon is defined as "the
362		 * time that the data symbol containing the first bit of the
363		 * timestamp is transmitted to the PHY plus the transmitting
364		 * STA's delays through its local PHY from the MAC-PHY
365		 * interface to its interface with the WM" (802.11 11.1.2)
366		 * - equals the time this bit arrives at the receiver - we have
367		 * to take into account the offset between the two.
368		 *
369		 * E.g. at 1 MBit that means mactime is 192 usec earlier
370		 * (=24 bytes * 8 usecs/byte) than the beacon timestamp.
371		 */
372		int rate;
373
374		if (rx_status->flag & RX_FLAG_HT)
375			rate = 65; /* TODO: HT rates */
376		else
377			rate = local->hw.wiphy->bands[band]->
378				bitrates[rx_status->rate_idx].bitrate;
379
380		rx_timestamp = rx_status->mactime + (24 * 8 * 10 / rate);
381	} else {
382		/*
383		 * second best option: get current TSF
384		 * (will return -1 if not supported)
385		 */
386		rx_timestamp = drv_get_tsf(local);
387	}
388
389#ifdef CONFIG_MAC80211_IBSS_DEBUG
390	printk(KERN_DEBUG "RX beacon SA=%pM BSSID="
391	       "%pM TSF=0x%llx BCN=0x%llx diff=%lld @%lu\n",
392	       mgmt->sa, mgmt->bssid,
393	       (unsigned long long)rx_timestamp,
394	       (unsigned long long)beacon_timestamp,
395	       (unsigned long long)(rx_timestamp - beacon_timestamp),
396	       jiffies);
397#endif
398
399	/* give slow hardware some time to do the TSF sync */
400	if (rx_timestamp < IEEE80211_IBSS_MERGE_DELAY)
401		goto put_bss;
402
403	if (beacon_timestamp > rx_timestamp) {
404#ifdef CONFIG_MAC80211_IBSS_DEBUG
405		printk(KERN_DEBUG "%s: beacon TSF higher than "
406		       "local TSF - IBSS merge with BSSID %pM\n",
407		       sdata->name, mgmt->bssid);
408#endif
409		ieee80211_sta_join_ibss(sdata, bss);
410		supp_rates = ieee80211_sta_get_rates(local, elems, band);
411		ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa,
412				       supp_rates, GFP_KERNEL);
413	}
414
415 put_bss:
416	ieee80211_rx_bss_put(local, bss);
417}
418
419/*
420 * Add a new IBSS station, will also be called by the RX code when,
421 * in IBSS mode, receiving a frame from a yet-unknown station, hence
422 * must be callable in atomic context.
423 */
424struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
425					u8 *bssid,u8 *addr, u32 supp_rates,
426					gfp_t gfp)
427{
428	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
429	struct ieee80211_local *local = sdata->local;
430	struct sta_info *sta;
431	int band = local->hw.conf.channel->band;
432
433	/*
434	 * XXX: Consider removing the least recently used entry and
435	 * 	allow new one to be added.
436	 */
437	if (local->num_sta >= IEEE80211_IBSS_MAX_STA_ENTRIES) {
438		if (net_ratelimit())
439			printk(KERN_DEBUG "%s: No room for a new IBSS STA entry %pM\n",
440			       sdata->name, addr);
441		return NULL;
442	}
443
444	if (ifibss->state == IEEE80211_IBSS_MLME_SEARCH)
445		return NULL;
446
447	if (compare_ether_addr(bssid, sdata->u.ibss.bssid))
448		return NULL;
449
450#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
451	wiphy_debug(local->hw.wiphy, "Adding new IBSS station %pM (dev=%s)\n",
452		    addr, sdata->name);
453#endif
454
455	sta = sta_info_alloc(sdata, addr, gfp);
456	if (!sta)
457		return NULL;
458
459	sta->last_rx = jiffies;
460	set_sta_flags(sta, WLAN_STA_AUTHORIZED);
461
462	/* make sure mandatory rates are always added */
463	sta->sta.supp_rates[band] = supp_rates |
464			ieee80211_mandatory_rates(local, band);
465
466	rate_control_rate_init(sta);
467
468	/* If it fails, maybe we raced another insertion? */
469	if (sta_info_insert(sta))
470		return sta_info_get(sdata, addr);
471	return sta;
472}
473
474static int ieee80211_sta_active_ibss(struct ieee80211_sub_if_data *sdata)
475{
476	struct ieee80211_local *local = sdata->local;
477	int active = 0;
478	struct sta_info *sta;
479
480	lockdep_assert_held(&sdata->u.ibss.mtx);
481
482	rcu_read_lock();
483
484	list_for_each_entry_rcu(sta, &local->sta_list, list) {
485		if (sta->sdata == sdata &&
486		    time_after(sta->last_rx + IEEE80211_IBSS_MERGE_INTERVAL,
487			       jiffies)) {
488			active++;
489			break;
490		}
491	}
492
493	rcu_read_unlock();
494
495	return active;
496}
497
498/*
499 * This function is called with state == IEEE80211_IBSS_MLME_JOINED
500 */
501
502static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata)
503{
504	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
505
506	lockdep_assert_held(&ifibss->mtx);
507
508	mod_timer(&ifibss->timer,
509		  round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL));
510
511	ieee80211_sta_expire(sdata, IEEE80211_IBSS_INACTIVITY_LIMIT);
512
513	if (time_before(jiffies, ifibss->last_scan_completed +
514		       IEEE80211_IBSS_MERGE_INTERVAL))
515		return;
516
517	if (ieee80211_sta_active_ibss(sdata))
518		return;
519
520	if (ifibss->fixed_channel)
521		return;
522
523	printk(KERN_DEBUG "%s: No active IBSS STAs - trying to scan for other "
524	       "IBSS networks with same SSID (merge)\n", sdata->name);
525
526	ieee80211_request_internal_scan(sdata,
527			ifibss->ssid, ifibss->ssid_len,
528			ifibss->fixed_channel ? ifibss->channel : NULL);
529}
530
531static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
532{
533	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
534	struct ieee80211_local *local = sdata->local;
535	struct ieee80211_supported_band *sband;
536	u8 bssid[ETH_ALEN];
537	u16 capability;
538	int i;
539
540	lockdep_assert_held(&ifibss->mtx);
541
542	if (ifibss->fixed_bssid) {
543		memcpy(bssid, ifibss->bssid, ETH_ALEN);
544	} else {
545		/* Generate random, not broadcast, locally administered BSSID. Mix in
546		 * own MAC address to make sure that devices that do not have proper
547		 * random number generator get different BSSID. */
548		get_random_bytes(bssid, ETH_ALEN);
549		for (i = 0; i < ETH_ALEN; i++)
550			bssid[i] ^= sdata->vif.addr[i];
551		bssid[0] &= ~0x01;
552		bssid[0] |= 0x02;
553	}
554
555	printk(KERN_DEBUG "%s: Creating new IBSS network, BSSID %pM\n",
556	       sdata->name, bssid);
557
558	sband = local->hw.wiphy->bands[ifibss->channel->band];
559
560	capability = WLAN_CAPABILITY_IBSS;
561
562	if (ifibss->privacy)
563		capability |= WLAN_CAPABILITY_PRIVACY;
564	else
565		sdata->drop_unencrypted = 0;
566
567	__ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
568				  ifibss->channel, ifibss->basic_rates,
569				  capability, 0);
570}
571
572/*
573 * This function is called with state == IEEE80211_IBSS_MLME_SEARCH
574 */
575
576static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata)
577{
578	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
579	struct ieee80211_local *local = sdata->local;
580	struct cfg80211_bss *cbss;
581	struct ieee80211_channel *chan = NULL;
582	const u8 *bssid = NULL;
583	int active_ibss;
584	u16 capability;
585
586	lockdep_assert_held(&ifibss->mtx);
587
588	active_ibss = ieee80211_sta_active_ibss(sdata);
589#ifdef CONFIG_MAC80211_IBSS_DEBUG
590	printk(KERN_DEBUG "%s: sta_find_ibss (active_ibss=%d)\n",
591	       sdata->name, active_ibss);
592#endif /* CONFIG_MAC80211_IBSS_DEBUG */
593
594	if (active_ibss)
595		return;
596
597	capability = WLAN_CAPABILITY_IBSS;
598	if (ifibss->privacy)
599		capability |= WLAN_CAPABILITY_PRIVACY;
600	if (ifibss->fixed_bssid)
601		bssid = ifibss->bssid;
602	if (ifibss->fixed_channel)
603		chan = ifibss->channel;
604	if (!is_zero_ether_addr(ifibss->bssid))
605		bssid = ifibss->bssid;
606	cbss = cfg80211_get_bss(local->hw.wiphy, chan, bssid,
607				ifibss->ssid, ifibss->ssid_len,
608				WLAN_CAPABILITY_IBSS | WLAN_CAPABILITY_PRIVACY,
609				capability);
610
611	if (cbss) {
612		struct ieee80211_bss *bss;
613
614		bss = (void *)cbss->priv;
615#ifdef CONFIG_MAC80211_IBSS_DEBUG
616		printk(KERN_DEBUG "   sta_find_ibss: selected %pM current "
617		       "%pM\n", cbss->bssid, ifibss->bssid);
618#endif /* CONFIG_MAC80211_IBSS_DEBUG */
619
620		printk(KERN_DEBUG "%s: Selected IBSS BSSID %pM"
621		       " based on configured SSID\n",
622		       sdata->name, cbss->bssid);
623
624		ieee80211_sta_join_ibss(sdata, bss);
625		ieee80211_rx_bss_put(local, bss);
626		return;
627	}
628
629#ifdef CONFIG_MAC80211_IBSS_DEBUG
630	printk(KERN_DEBUG "   did not try to join ibss\n");
631#endif /* CONFIG_MAC80211_IBSS_DEBUG */
632
633	/* Selected IBSS not found in current scan results - try to scan */
634	if (time_after(jiffies, ifibss->last_scan_completed +
635					IEEE80211_SCAN_INTERVAL)) {
636		printk(KERN_DEBUG "%s: Trigger new scan to find an IBSS to "
637		       "join\n", sdata->name);
638
639		ieee80211_request_internal_scan(sdata,
640				ifibss->ssid, ifibss->ssid_len,
641				ifibss->fixed_channel ? ifibss->channel : NULL);
642	} else {
643		int interval = IEEE80211_SCAN_INTERVAL;
644
645		if (time_after(jiffies, ifibss->ibss_join_req +
646			       IEEE80211_IBSS_JOIN_TIMEOUT)) {
647			if (!(local->oper_channel->flags & IEEE80211_CHAN_NO_IBSS)) {
648				ieee80211_sta_create_ibss(sdata);
649				return;
650			}
651			printk(KERN_DEBUG "%s: IBSS not allowed on"
652			       " %d MHz\n", sdata->name,
653			       local->hw.conf.channel->center_freq);
654
655			/* No IBSS found - decrease scan interval and continue
656			 * scanning. */
657			interval = IEEE80211_SCAN_INTERVAL_SLOW;
658		}
659
660		mod_timer(&ifibss->timer,
661			  round_jiffies(jiffies + interval));
662	}
663}
664
665static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata,
666					struct ieee80211_mgmt *mgmt,
667					size_t len)
668{
669	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
670	struct ieee80211_local *local = sdata->local;
671	int tx_last_beacon;
672	struct sk_buff *skb;
673	struct ieee80211_mgmt *resp;
674	u8 *pos, *end;
675
676	lockdep_assert_held(&ifibss->mtx);
677
678	if (ifibss->state != IEEE80211_IBSS_MLME_JOINED ||
679	    len < 24 + 2 || !ifibss->presp)
680		return;
681
682	tx_last_beacon = drv_tx_last_beacon(local);
683
684#ifdef CONFIG_MAC80211_IBSS_DEBUG
685	printk(KERN_DEBUG "%s: RX ProbeReq SA=%pM DA=%pM BSSID=%pM"
686	       " (tx_last_beacon=%d)\n",
687	       sdata->name, mgmt->sa, mgmt->da,
688	       mgmt->bssid, tx_last_beacon);
689#endif /* CONFIG_MAC80211_IBSS_DEBUG */
690
691	if (!tx_last_beacon)
692		return;
693
694	if (memcmp(mgmt->bssid, ifibss->bssid, ETH_ALEN) != 0 &&
695	    memcmp(mgmt->bssid, "\xff\xff\xff\xff\xff\xff", ETH_ALEN) != 0)
696		return;
697
698	end = ((u8 *) mgmt) + len;
699	pos = mgmt->u.probe_req.variable;
700	if (pos[0] != WLAN_EID_SSID ||
701	    pos + 2 + pos[1] > end) {
702#ifdef CONFIG_MAC80211_IBSS_DEBUG
703		printk(KERN_DEBUG "%s: Invalid SSID IE in ProbeReq "
704		       "from %pM\n",
705		       sdata->name, mgmt->sa);
706#endif
707		return;
708	}
709	if (pos[1] != 0 &&
710	    (pos[1] != ifibss->ssid_len ||
711	     memcmp(pos + 2, ifibss->ssid, ifibss->ssid_len))) {
712		/* Ignore ProbeReq for foreign SSID */
713		return;
714	}
715
716	/* Reply with ProbeResp */
717	skb = skb_copy(ifibss->presp, GFP_KERNEL);
718	if (!skb)
719		return;
720
721	resp = (struct ieee80211_mgmt *) skb->data;
722	memcpy(resp->da, mgmt->sa, ETH_ALEN);
723#ifdef CONFIG_MAC80211_IBSS_DEBUG
724	printk(KERN_DEBUG "%s: Sending ProbeResp to %pM\n",
725	       sdata->name, resp->da);
726#endif /* CONFIG_MAC80211_IBSS_DEBUG */
727	IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
728	ieee80211_tx_skb(sdata, skb);
729}
730
731static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata,
732					 struct ieee80211_mgmt *mgmt,
733					 size_t len,
734					 struct ieee80211_rx_status *rx_status)
735{
736	size_t baselen;
737	struct ieee802_11_elems elems;
738
739	if (memcmp(mgmt->da, sdata->vif.addr, ETH_ALEN))
740		return; /* ignore ProbeResp to foreign address */
741
742	baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt;
743	if (baselen > len)
744		return;
745
746	ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen,
747				&elems);
748
749	ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems, false);
750}
751
752static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
753				     struct ieee80211_mgmt *mgmt,
754				     size_t len,
755				     struct ieee80211_rx_status *rx_status)
756{
757	size_t baselen;
758	struct ieee802_11_elems elems;
759
760	/* Process beacon from the current BSS */
761	baselen = (u8 *) mgmt->u.beacon.variable - (u8 *) mgmt;
762	if (baselen > len)
763		return;
764
765	ieee802_11_parse_elems(mgmt->u.beacon.variable, len - baselen, &elems);
766
767	ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems, true);
768}
769
770void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
771				   struct sk_buff *skb)
772{
773	struct ieee80211_rx_status *rx_status;
774	struct ieee80211_mgmt *mgmt;
775	u16 fc;
776
777	rx_status = IEEE80211_SKB_RXCB(skb);
778	mgmt = (struct ieee80211_mgmt *) skb->data;
779	fc = le16_to_cpu(mgmt->frame_control);
780
781	mutex_lock(&sdata->u.ibss.mtx);
782
783	switch (fc & IEEE80211_FCTL_STYPE) {
784	case IEEE80211_STYPE_PROBE_REQ:
785		ieee80211_rx_mgmt_probe_req(sdata, mgmt, skb->len);
786		break;
787	case IEEE80211_STYPE_PROBE_RESP:
788		ieee80211_rx_mgmt_probe_resp(sdata, mgmt, skb->len,
789					     rx_status);
790		break;
791	case IEEE80211_STYPE_BEACON:
792		ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len,
793					 rx_status);
794		break;
795	case IEEE80211_STYPE_AUTH:
796		ieee80211_rx_mgmt_auth_ibss(sdata, mgmt, skb->len);
797		break;
798	}
799
800	mutex_unlock(&sdata->u.ibss.mtx);
801}
802
803void ieee80211_ibss_work(struct ieee80211_sub_if_data *sdata)
804{
805	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
806
807	mutex_lock(&ifibss->mtx);
808
809	/*
810	 * Work could be scheduled after scan or similar
811	 * when we aren't even joined (or trying) with a
812	 * network.
813	 */
814	if (!ifibss->ssid_len)
815		goto out;
816
817	switch (ifibss->state) {
818	case IEEE80211_IBSS_MLME_SEARCH:
819		ieee80211_sta_find_ibss(sdata);
820		break;
821	case IEEE80211_IBSS_MLME_JOINED:
822		ieee80211_sta_merge_ibss(sdata);
823		break;
824	default:
825		WARN_ON(1);
826		break;
827	}
828
829 out:
830	mutex_unlock(&ifibss->mtx);
831}
832
833static void ieee80211_ibss_timer(unsigned long data)
834{
835	struct ieee80211_sub_if_data *sdata =
836		(struct ieee80211_sub_if_data *) data;
837	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
838	struct ieee80211_local *local = sdata->local;
839
840	if (local->quiescing) {
841		ifibss->timer_running = true;
842		return;
843	}
844
845	ieee80211_queue_work(&local->hw, &sdata->work);
846}
847
848#ifdef CONFIG_PM
849void ieee80211_ibss_quiesce(struct ieee80211_sub_if_data *sdata)
850{
851	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
852
853	if (del_timer_sync(&ifibss->timer))
854		ifibss->timer_running = true;
855}
856
857void ieee80211_ibss_restart(struct ieee80211_sub_if_data *sdata)
858{
859	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
860
861	if (ifibss->timer_running) {
862		add_timer(&ifibss->timer);
863		ifibss->timer_running = false;
864	}
865}
866#endif
867
868void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata)
869{
870	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
871
872	setup_timer(&ifibss->timer, ieee80211_ibss_timer,
873		    (unsigned long) sdata);
874	mutex_init(&ifibss->mtx);
875}
876
877/* scan finished notification */
878void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local)
879{
880	struct ieee80211_sub_if_data *sdata;
881
882	mutex_lock(&local->iflist_mtx);
883	list_for_each_entry(sdata, &local->interfaces, list) {
884		if (!ieee80211_sdata_running(sdata))
885			continue;
886		if (sdata->vif.type != NL80211_IFTYPE_ADHOC)
887			continue;
888		sdata->u.ibss.last_scan_completed = jiffies;
889		ieee80211_queue_work(&local->hw, &sdata->work);
890	}
891	mutex_unlock(&local->iflist_mtx);
892}
893
894int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
895			struct cfg80211_ibss_params *params)
896{
897	struct sk_buff *skb;
898
899	skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom +
900			    36 /* bitrates */ +
901			    34 /* SSID */ +
902			    3  /* DS params */ +
903			    4  /* IBSS params */ +
904			    params->ie_len);
905	if (!skb)
906		return -ENOMEM;
907
908	mutex_lock(&sdata->u.ibss.mtx);
909
910	if (params->bssid) {
911		memcpy(sdata->u.ibss.bssid, params->bssid, ETH_ALEN);
912		sdata->u.ibss.fixed_bssid = true;
913	} else
914		sdata->u.ibss.fixed_bssid = false;
915
916	sdata->u.ibss.privacy = params->privacy;
917	sdata->u.ibss.basic_rates = params->basic_rates;
918	memcpy(sdata->vif.bss_conf.mcast_rate, params->mcast_rate,
919	       sizeof(params->mcast_rate));
920
921	sdata->vif.bss_conf.beacon_int = params->beacon_interval;
922
923	sdata->u.ibss.channel = params->channel;
924	sdata->u.ibss.fixed_channel = params->channel_fixed;
925
926	/* fix ourselves to that channel now already */
927	if (params->channel_fixed) {
928		sdata->local->oper_channel = params->channel;
929		WARN_ON(!ieee80211_set_channel_type(sdata->local, sdata,
930						    NL80211_CHAN_NO_HT));
931	}
932
933	if (params->ie) {
934		sdata->u.ibss.ie = kmemdup(params->ie, params->ie_len,
935					   GFP_KERNEL);
936		if (sdata->u.ibss.ie)
937			sdata->u.ibss.ie_len = params->ie_len;
938	}
939
940	sdata->u.ibss.skb = skb;
941	sdata->u.ibss.state = IEEE80211_IBSS_MLME_SEARCH;
942	sdata->u.ibss.ibss_join_req = jiffies;
943
944	memcpy(sdata->u.ibss.ssid, params->ssid, IEEE80211_MAX_SSID_LEN);
945	sdata->u.ibss.ssid_len = params->ssid_len;
946
947	mutex_unlock(&sdata->u.ibss.mtx);
948
949	mutex_lock(&sdata->local->mtx);
950	ieee80211_recalc_idle(sdata->local);
951	mutex_unlock(&sdata->local->mtx);
952
953	ieee80211_queue_work(&sdata->local->hw, &sdata->work);
954
955	return 0;
956}
957
958int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
959{
960	struct sk_buff *skb;
961	struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
962	struct ieee80211_local *local = sdata->local;
963	struct cfg80211_bss *cbss;
964	u16 capability;
965	int active_ibss;
966
967	mutex_lock(&sdata->u.ibss.mtx);
968
969	active_ibss = ieee80211_sta_active_ibss(sdata);
970
971	if (!active_ibss && !is_zero_ether_addr(ifibss->bssid)) {
972		capability = WLAN_CAPABILITY_IBSS;
973
974		if (ifibss->privacy)
975			capability |= WLAN_CAPABILITY_PRIVACY;
976
977		cbss = cfg80211_get_bss(local->hw.wiphy, ifibss->channel,
978					ifibss->bssid, ifibss->ssid,
979					ifibss->ssid_len, WLAN_CAPABILITY_IBSS |
980					WLAN_CAPABILITY_PRIVACY,
981					capability);
982
983		if (cbss) {
984			cfg80211_unlink_bss(local->hw.wiphy, cbss);
985			cfg80211_put_bss(cbss);
986		}
987	}
988
989	sta_info_flush(sdata->local, sdata);
990
991	/* remove beacon */
992	kfree(sdata->u.ibss.ie);
993	skb = sdata->u.ibss.presp;
994	rcu_assign_pointer(sdata->u.ibss.presp, NULL);
995	sdata->vif.bss_conf.ibss_joined = false;
996	ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED |
997						BSS_CHANGED_IBSS);
998	synchronize_rcu();
999	kfree_skb(skb);
1000
1001	skb_queue_purge(&sdata->skb_queue);
1002	memset(sdata->u.ibss.bssid, 0, ETH_ALEN);
1003	sdata->u.ibss.ssid_len = 0;
1004
1005	del_timer_sync(&sdata->u.ibss.timer);
1006
1007	mutex_unlock(&sdata->u.ibss.mtx);
1008
1009	mutex_lock(&local->mtx);
1010	ieee80211_recalc_idle(sdata->local);
1011	mutex_unlock(&local->mtx);
1012
1013	return 0;
1014}
1015