xref: /openbmc/linux/net/mac80211/util.c (revision 96de0e252cedffad61b3cb5e05662c591898e69a)
1 /*
2  * Copyright 2002-2005, Instant802 Networks, Inc.
3  * Copyright 2005-2006, Devicescape Software, Inc.
4  * Copyright 2006-2007	Jiri Benc <jbenc@suse.cz>
5  * Copyright 2007	Johannes Berg <johannes@sipsolutions.net>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  *
11  * utilities for mac80211
12  */
13 
14 #include <net/mac80211.h>
15 #include <linux/netdevice.h>
16 #include <linux/types.h>
17 #include <linux/slab.h>
18 #include <linux/skbuff.h>
19 #include <linux/etherdevice.h>
20 #include <linux/if_arp.h>
21 #include <linux/wireless.h>
22 #include <linux/bitmap.h>
23 #include <net/net_namespace.h>
24 #include <net/cfg80211.h>
25 
26 #include "ieee80211_i.h"
27 #include "ieee80211_rate.h"
28 #include "wme.h"
29 
30 /* privid for wiphys to determine whether they belong to us or not */
31 void *mac80211_wiphy_privid = &mac80211_wiphy_privid;
32 
33 /* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */
34 /* Ethernet-II snap header (RFC1042 for most EtherTypes) */
35 const unsigned char rfc1042_header[] =
36 	{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
37 
38 /* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
39 const unsigned char bridge_tunnel_header[] =
40 	{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 };
41 
42 /* No encapsulation header if EtherType < 0x600 (=length) */
43 static const unsigned char eapol_header[] =
44 	{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8e };
45 
46 
47 static int rate_list_match(const int *rate_list, int rate)
48 {
49 	int i;
50 
51 	if (!rate_list)
52 		return 0;
53 
54 	for (i = 0; rate_list[i] >= 0; i++)
55 		if (rate_list[i] == rate)
56 			return 1;
57 
58 	return 0;
59 }
60 
61 void ieee80211_prepare_rates(struct ieee80211_local *local,
62 			     struct ieee80211_hw_mode *mode)
63 {
64 	int i;
65 
66 	for (i = 0; i < mode->num_rates; i++) {
67 		struct ieee80211_rate *rate = &mode->rates[i];
68 
69 		rate->flags &= ~(IEEE80211_RATE_SUPPORTED |
70 				 IEEE80211_RATE_BASIC);
71 
72 		if (local->supp_rates[mode->mode]) {
73 			if (!rate_list_match(local->supp_rates[mode->mode],
74 					     rate->rate))
75 				continue;
76 		}
77 
78 		rate->flags |= IEEE80211_RATE_SUPPORTED;
79 
80 		/* Use configured basic rate set if it is available. If not,
81 		 * use defaults that are sane for most cases. */
82 		if (local->basic_rates[mode->mode]) {
83 			if (rate_list_match(local->basic_rates[mode->mode],
84 					    rate->rate))
85 				rate->flags |= IEEE80211_RATE_BASIC;
86 		} else switch (mode->mode) {
87 		case MODE_IEEE80211A:
88 			if (rate->rate == 60 || rate->rate == 120 ||
89 			    rate->rate == 240)
90 				rate->flags |= IEEE80211_RATE_BASIC;
91 			break;
92 		case MODE_IEEE80211B:
93 			if (rate->rate == 10 || rate->rate == 20)
94 				rate->flags |= IEEE80211_RATE_BASIC;
95 			break;
96 		case MODE_IEEE80211G:
97 			if (rate->rate == 10 || rate->rate == 20 ||
98 			    rate->rate == 55 || rate->rate == 110)
99 				rate->flags |= IEEE80211_RATE_BASIC;
100 			break;
101 		case NUM_IEEE80211_MODES:
102 			/* not useful */
103 			break;
104 		}
105 
106 		/* Set ERP and MANDATORY flags based on phymode */
107 		switch (mode->mode) {
108 		case MODE_IEEE80211A:
109 			if (rate->rate == 60 || rate->rate == 120 ||
110 			    rate->rate == 240)
111 				rate->flags |= IEEE80211_RATE_MANDATORY;
112 			break;
113 		case MODE_IEEE80211B:
114 			if (rate->rate == 10)
115 				rate->flags |= IEEE80211_RATE_MANDATORY;
116 			break;
117 		case MODE_IEEE80211G:
118 			if (rate->rate == 10 || rate->rate == 20 ||
119 			    rate->rate == 55 || rate->rate == 110 ||
120 			    rate->rate == 60 || rate->rate == 120 ||
121 			    rate->rate == 240)
122 				rate->flags |= IEEE80211_RATE_MANDATORY;
123 			break;
124 		case NUM_IEEE80211_MODES:
125 			/* not useful */
126 			break;
127 		}
128 		if (ieee80211_is_erp_rate(mode->mode, rate->rate))
129 			rate->flags |= IEEE80211_RATE_ERP;
130 	}
131 }
132 
133 u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len)
134 {
135 	u16 fc;
136 
137 	if (len < 24)
138 		return NULL;
139 
140 	fc = le16_to_cpu(hdr->frame_control);
141 
142 	switch (fc & IEEE80211_FCTL_FTYPE) {
143 	case IEEE80211_FTYPE_DATA:
144 		switch (fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) {
145 		case IEEE80211_FCTL_TODS:
146 			return hdr->addr1;
147 		case (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS):
148 			return NULL;
149 		case IEEE80211_FCTL_FROMDS:
150 			return hdr->addr2;
151 		case 0:
152 			return hdr->addr3;
153 		}
154 		break;
155 	case IEEE80211_FTYPE_MGMT:
156 		return hdr->addr3;
157 	case IEEE80211_FTYPE_CTL:
158 		if ((fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_PSPOLL)
159 			return hdr->addr1;
160 		else
161 			return NULL;
162 	}
163 
164 	return NULL;
165 }
166 
167 int ieee80211_get_hdrlen(u16 fc)
168 {
169 	int hdrlen = 24;
170 
171 	switch (fc & IEEE80211_FCTL_FTYPE) {
172 	case IEEE80211_FTYPE_DATA:
173 		if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS))
174 			hdrlen = 30; /* Addr4 */
175 		/*
176 		 * The QoS Control field is two bytes and its presence is
177 		 * indicated by the IEEE80211_STYPE_QOS_DATA bit. Add 2 to
178 		 * hdrlen if that bit is set.
179 		 * This works by masking out the bit and shifting it to
180 		 * bit position 1 so the result has the value 0 or 2.
181 		 */
182 		hdrlen += (fc & IEEE80211_STYPE_QOS_DATA)
183 				>> (ilog2(IEEE80211_STYPE_QOS_DATA)-1);
184 		break;
185 	case IEEE80211_FTYPE_CTL:
186 		/*
187 		 * ACK and CTS are 10 bytes, all others 16. To see how
188 		 * to get this condition consider
189 		 *   subtype mask:   0b0000000011110000 (0x00F0)
190 		 *   ACK subtype:    0b0000000011010000 (0x00D0)
191 		 *   CTS subtype:    0b0000000011000000 (0x00C0)
192 		 *   bits that matter:         ^^^      (0x00E0)
193 		 *   value of those: 0b0000000011000000 (0x00C0)
194 		 */
195 		if ((fc & 0xE0) == 0xC0)
196 			hdrlen = 10;
197 		else
198 			hdrlen = 16;
199 		break;
200 	}
201 
202 	return hdrlen;
203 }
204 EXPORT_SYMBOL(ieee80211_get_hdrlen);
205 
206 int ieee80211_get_hdrlen_from_skb(const struct sk_buff *skb)
207 {
208 	const struct ieee80211_hdr *hdr = (const struct ieee80211_hdr *) skb->data;
209 	int hdrlen;
210 
211 	if (unlikely(skb->len < 10))
212 		return 0;
213 	hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_control));
214 	if (unlikely(hdrlen > skb->len))
215 		return 0;
216 	return hdrlen;
217 }
218 EXPORT_SYMBOL(ieee80211_get_hdrlen_from_skb);
219 
220 int ieee80211_is_eapol(const struct sk_buff *skb)
221 {
222 	const struct ieee80211_hdr *hdr;
223 	u16 fc;
224 	int hdrlen;
225 
226 	if (unlikely(skb->len < 10))
227 		return 0;
228 
229 	hdr = (const struct ieee80211_hdr *) skb->data;
230 	fc = le16_to_cpu(hdr->frame_control);
231 
232 	if (unlikely(!WLAN_FC_DATA_PRESENT(fc)))
233 		return 0;
234 
235 	hdrlen = ieee80211_get_hdrlen(fc);
236 
237 	if (unlikely(skb->len >= hdrlen + sizeof(eapol_header) &&
238 		     memcmp(skb->data + hdrlen, eapol_header,
239 			    sizeof(eapol_header)) == 0))
240 		return 1;
241 
242 	return 0;
243 }
244 
245 void ieee80211_tx_set_iswep(struct ieee80211_txrx_data *tx)
246 {
247 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) tx->skb->data;
248 
249 	hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
250 	if (tx->u.tx.extra_frag) {
251 		struct ieee80211_hdr *fhdr;
252 		int i;
253 		for (i = 0; i < tx->u.tx.num_extra_frag; i++) {
254 			fhdr = (struct ieee80211_hdr *)
255 				tx->u.tx.extra_frag[i]->data;
256 			fhdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
257 		}
258 	}
259 }
260 
261 int ieee80211_frame_duration(struct ieee80211_local *local, size_t len,
262 			     int rate, int erp, int short_preamble)
263 {
264 	int dur;
265 
266 	/* calculate duration (in microseconds, rounded up to next higher
267 	 * integer if it includes a fractional microsecond) to send frame of
268 	 * len bytes (does not include FCS) at the given rate. Duration will
269 	 * also include SIFS.
270 	 *
271 	 * rate is in 100 kbps, so divident is multiplied by 10 in the
272 	 * DIV_ROUND_UP() operations.
273 	 */
274 
275 	if (local->hw.conf.phymode == MODE_IEEE80211A || erp) {
276 		/*
277 		 * OFDM:
278 		 *
279 		 * N_DBPS = DATARATE x 4
280 		 * N_SYM = Ceiling((16+8xLENGTH+6) / N_DBPS)
281 		 *	(16 = SIGNAL time, 6 = tail bits)
282 		 * TXTIME = T_PREAMBLE + T_SIGNAL + T_SYM x N_SYM + Signal Ext
283 		 *
284 		 * T_SYM = 4 usec
285 		 * 802.11a - 17.5.2: aSIFSTime = 16 usec
286 		 * 802.11g - 19.8.4: aSIFSTime = 10 usec +
287 		 *	signal ext = 6 usec
288 		 */
289 		dur = 16; /* SIFS + signal ext */
290 		dur += 16; /* 17.3.2.3: T_PREAMBLE = 16 usec */
291 		dur += 4; /* 17.3.2.3: T_SIGNAL = 4 usec */
292 		dur += 4 * DIV_ROUND_UP((16 + 8 * (len + 4) + 6) * 10,
293 					4 * rate); /* T_SYM x N_SYM */
294 	} else {
295 		/*
296 		 * 802.11b or 802.11g with 802.11b compatibility:
297 		 * 18.3.4: TXTIME = PreambleLength + PLCPHeaderTime +
298 		 * Ceiling(((LENGTH+PBCC)x8)/DATARATE). PBCC=0.
299 		 *
300 		 * 802.11 (DS): 15.3.3, 802.11b: 18.3.4
301 		 * aSIFSTime = 10 usec
302 		 * aPreambleLength = 144 usec or 72 usec with short preamble
303 		 * aPLCPHeaderLength = 48 usec or 24 usec with short preamble
304 		 */
305 		dur = 10; /* aSIFSTime = 10 usec */
306 		dur += short_preamble ? (72 + 24) : (144 + 48);
307 
308 		dur += DIV_ROUND_UP(8 * (len + 4) * 10, rate);
309 	}
310 
311 	return dur;
312 }
313 
314 /* Exported duration function for driver use */
315 __le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw, int if_id,
316 					size_t frame_len, int rate)
317 {
318 	struct ieee80211_local *local = hw_to_local(hw);
319 	struct net_device *bdev = dev_get_by_index(&init_net, if_id);
320 	struct ieee80211_sub_if_data *sdata;
321 	u16 dur;
322 	int erp;
323 
324 	if (unlikely(!bdev))
325 		return 0;
326 
327 	sdata = IEEE80211_DEV_TO_SUB_IF(bdev);
328 	erp = ieee80211_is_erp_rate(hw->conf.phymode, rate);
329 	dur = ieee80211_frame_duration(local, frame_len, rate,
330 		       erp, sdata->flags & IEEE80211_SDATA_SHORT_PREAMBLE);
331 
332 	dev_put(bdev);
333 	return cpu_to_le16(dur);
334 }
335 EXPORT_SYMBOL(ieee80211_generic_frame_duration);
336 
337 __le16 ieee80211_rts_duration(struct ieee80211_hw *hw, int if_id,
338 			      size_t frame_len,
339 			      const struct ieee80211_tx_control *frame_txctl)
340 {
341 	struct ieee80211_local *local = hw_to_local(hw);
342 	struct ieee80211_rate *rate;
343 	struct net_device *bdev = dev_get_by_index(&init_net, if_id);
344 	struct ieee80211_sub_if_data *sdata;
345 	int short_preamble;
346 	int erp;
347 	u16 dur;
348 
349 	if (unlikely(!bdev))
350 		return 0;
351 
352 	sdata = IEEE80211_DEV_TO_SUB_IF(bdev);
353 	short_preamble = sdata->flags & IEEE80211_SDATA_SHORT_PREAMBLE;
354 
355 	rate = frame_txctl->rts_rate;
356 	erp = !!(rate->flags & IEEE80211_RATE_ERP);
357 
358 	/* CTS duration */
359 	dur = ieee80211_frame_duration(local, 10, rate->rate,
360 				       erp, short_preamble);
361 	/* Data frame duration */
362 	dur += ieee80211_frame_duration(local, frame_len, rate->rate,
363 					erp, short_preamble);
364 	/* ACK duration */
365 	dur += ieee80211_frame_duration(local, 10, rate->rate,
366 					erp, short_preamble);
367 
368 	dev_put(bdev);
369 	return cpu_to_le16(dur);
370 }
371 EXPORT_SYMBOL(ieee80211_rts_duration);
372 
373 __le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw, int if_id,
374 				    size_t frame_len,
375 				    const struct ieee80211_tx_control *frame_txctl)
376 {
377 	struct ieee80211_local *local = hw_to_local(hw);
378 	struct ieee80211_rate *rate;
379 	struct net_device *bdev = dev_get_by_index(&init_net, if_id);
380 	struct ieee80211_sub_if_data *sdata;
381 	int short_preamble;
382 	int erp;
383 	u16 dur;
384 
385 	if (unlikely(!bdev))
386 		return 0;
387 
388 	sdata = IEEE80211_DEV_TO_SUB_IF(bdev);
389 	short_preamble = sdata->flags & IEEE80211_SDATA_SHORT_PREAMBLE;
390 
391 	rate = frame_txctl->rts_rate;
392 	erp = !!(rate->flags & IEEE80211_RATE_ERP);
393 
394 	/* Data frame duration */
395 	dur = ieee80211_frame_duration(local, frame_len, rate->rate,
396 				       erp, short_preamble);
397 	if (!(frame_txctl->flags & IEEE80211_TXCTL_NO_ACK)) {
398 		/* ACK duration */
399 		dur += ieee80211_frame_duration(local, 10, rate->rate,
400 						erp, short_preamble);
401 	}
402 
403 	dev_put(bdev);
404 	return cpu_to_le16(dur);
405 }
406 EXPORT_SYMBOL(ieee80211_ctstoself_duration);
407 
408 struct ieee80211_rate *
409 ieee80211_get_rate(struct ieee80211_local *local, int phymode, int hw_rate)
410 {
411 	struct ieee80211_hw_mode *mode;
412 	int r;
413 
414 	list_for_each_entry(mode, &local->modes_list, list) {
415 		if (mode->mode != phymode)
416 			continue;
417 		for (r = 0; r < mode->num_rates; r++) {
418 			struct ieee80211_rate *rate = &mode->rates[r];
419 			if (rate->val == hw_rate ||
420 			    (rate->flags & IEEE80211_RATE_PREAMBLE2 &&
421 			     rate->val2 == hw_rate))
422 				return rate;
423 		}
424 	}
425 
426 	return NULL;
427 }
428 
429 void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue)
430 {
431 	struct ieee80211_local *local = hw_to_local(hw);
432 
433 	if (test_and_clear_bit(IEEE80211_LINK_STATE_XOFF,
434 			       &local->state[queue])) {
435 		if (test_bit(IEEE80211_LINK_STATE_PENDING,
436 			     &local->state[queue]))
437 			tasklet_schedule(&local->tx_pending_tasklet);
438 		else
439 			if (!ieee80211_qdisc_installed(local->mdev)) {
440 				if (queue == 0)
441 					netif_wake_queue(local->mdev);
442 			} else
443 				__netif_schedule(local->mdev);
444 	}
445 }
446 EXPORT_SYMBOL(ieee80211_wake_queue);
447 
448 void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue)
449 {
450 	struct ieee80211_local *local = hw_to_local(hw);
451 
452 	if (!ieee80211_qdisc_installed(local->mdev) && queue == 0)
453 		netif_stop_queue(local->mdev);
454 	set_bit(IEEE80211_LINK_STATE_XOFF, &local->state[queue]);
455 }
456 EXPORT_SYMBOL(ieee80211_stop_queue);
457 
458 void ieee80211_start_queues(struct ieee80211_hw *hw)
459 {
460 	struct ieee80211_local *local = hw_to_local(hw);
461 	int i;
462 
463 	for (i = 0; i < local->hw.queues; i++)
464 		clear_bit(IEEE80211_LINK_STATE_XOFF, &local->state[i]);
465 	if (!ieee80211_qdisc_installed(local->mdev))
466 		netif_start_queue(local->mdev);
467 }
468 EXPORT_SYMBOL(ieee80211_start_queues);
469 
470 void ieee80211_stop_queues(struct ieee80211_hw *hw)
471 {
472 	int i;
473 
474 	for (i = 0; i < hw->queues; i++)
475 		ieee80211_stop_queue(hw, i);
476 }
477 EXPORT_SYMBOL(ieee80211_stop_queues);
478 
479 void ieee80211_wake_queues(struct ieee80211_hw *hw)
480 {
481 	int i;
482 
483 	for (i = 0; i < hw->queues; i++)
484 		ieee80211_wake_queue(hw, i);
485 }
486 EXPORT_SYMBOL(ieee80211_wake_queues);
487