blob: 071d093f29893bf5d838a664747fc2d4662c3438 [file] [log] [blame]
Jeff Garzikb4538722005-05-12 22:48:20 -04001/******************************************************************************
2
3 Copyright(c) 2003 - 2004 Intel Corporation. All rights reserved.
4
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of version 2 of the GNU General Public License as
7 published by the Free Software Foundation.
8
9 This program is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 more details.
13
14 You should have received a copy of the GNU General Public License along with
15 this program; if not, write to the Free Software Foundation, Inc., 59
16 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
18 The full GNU General Public License is included in this distribution in the
19 file called LICENSE.
20
21 Contact Information:
22 James P. Ketrenos <ipw2100-admin@linux.intel.com>
23 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
24
25******************************************************************************/
26#include <linux/compiler.h>
27#include <linux/config.h>
28#include <linux/errno.h>
29#include <linux/if_arp.h>
30#include <linux/in6.h>
31#include <linux/in.h>
32#include <linux/ip.h>
33#include <linux/kernel.h>
34#include <linux/module.h>
35#include <linux/netdevice.h>
Jeff Garzikb4538722005-05-12 22:48:20 -040036#include <linux/proc_fs.h>
37#include <linux/skbuff.h>
38#include <linux/slab.h>
39#include <linux/tcp.h>
40#include <linux/types.h>
41#include <linux/version.h>
42#include <linux/wireless.h>
43#include <linux/etherdevice.h>
44#include <asm/uaccess.h>
45
46#include <net/ieee80211.h>
47
48
49/*
50
51
52802.11 Data Frame
53
54 ,-------------------------------------------------------------------.
55Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 |
56 |------|------|---------|---------|---------|------|---------|------|
57Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | Frame | fcs |
58 | | tion | (BSSID) | | | ence | data | |
59 `--------------------------------------------------| |------'
60Total: 28 non-data bytes `----.----'
61 |
62 .- 'Frame data' expands to <---------------------------'
63 |
64 V
65 ,---------------------------------------------------.
66Bytes | 1 | 1 | 1 | 3 | 2 | 0-2304 |
67 |------|------|---------|----------|------|---------|
68Desc. | SNAP | SNAP | Control |Eth Tunnel| Type | IP |
69 | DSAP | SSAP | | | | Packet |
70 | 0xAA | 0xAA |0x03 (UI)|0x00-00-F8| | |
71 `-----------------------------------------| |
72Total: 8 non-data bytes `----.----'
73 |
74 .- 'IP Packet' expands, if WEP enabled, to <--'
75 |
76 V
77 ,-----------------------.
78Bytes | 4 | 0-2296 | 4 |
79 |-----|-----------|-----|
80Desc. | IV | Encrypted | ICV |
81 | | IP Packet | |
82 `-----------------------'
83Total: 8 non-data bytes
84
85
86802.3 Ethernet Data Frame
87
88 ,-----------------------------------------.
89Bytes | 6 | 6 | 2 | Variable | 4 |
90 |-------|-------|------|-----------|------|
91Desc. | Dest. | Source| Type | IP Packet | fcs |
92 | MAC | MAC | | | |
93 `-----------------------------------------'
94Total: 18 non-data bytes
95
96In the event that fragmentation is required, the incoming payload is split into
97N parts of size ieee->fts. The first fragment contains the SNAP header and the
98remaining packets are just data.
99
100If encryption is enabled, each fragment payload size is reduced by enough space
101to add the prefix and postfix (IV and ICV totalling 8 bytes in the case of WEP)
102So if you have 1500 bytes of payload with ieee->fts set to 500 without
103encryption it will take 3 frames. With WEP it will take 4 frames as the
104payload of each frame is reduced to 492 bytes.
105
106* SKB visualization
107*
108* ,- skb->data
109* |
110* | ETHERNET HEADER ,-<-- PAYLOAD
111* | | 14 bytes from skb->data
112* | 2 bytes for Type --> ,T. | (sizeof ethhdr)
113* | | | |
114* |,-Dest.--. ,--Src.---. | | |
115* | 6 bytes| | 6 bytes | | | |
116* v | | | | | |
117* 0 | v 1 | v | v 2
118* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
119* ^ | ^ | ^ |
120* | | | | | |
121* | | | | `T' <---- 2 bytes for Type
122* | | | |
123* | | '---SNAP--' <-------- 6 bytes for SNAP
124* | |
125* `-IV--' <-------------------- 4 bytes for IV (WEP)
126*
127* SNAP HEADER
128*
129*/
130
131static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
132static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
133
134static inline int ieee80211_put_snap(u8 *data, u16 h_proto)
135{
136 struct ieee80211_snap_hdr *snap;
137 u8 *oui;
138
139 snap = (struct ieee80211_snap_hdr *)data;
140 snap->dsap = 0xaa;
141 snap->ssap = 0xaa;
142 snap->ctrl = 0x03;
143
144 if (h_proto == 0x8137 || h_proto == 0x80f3)
145 oui = P802_1H_OUI;
146 else
147 oui = RFC1042_OUI;
148 snap->oui[0] = oui[0];
149 snap->oui[1] = oui[1];
150 snap->oui[2] = oui[2];
151
152 *(u16 *)(data + SNAP_SIZE) = htons(h_proto);
153
154 return SNAP_SIZE + sizeof(u16);
155}
156
157static inline int ieee80211_encrypt_fragment(
158 struct ieee80211_device *ieee,
159 struct sk_buff *frag,
160 int hdr_len)
161{
162 struct ieee80211_crypt_data* crypt = ieee->crypt[ieee->tx_keyidx];
163 int res;
164
165#ifdef CONFIG_IEEE80211_CRYPT_TKIP
166 struct ieee80211_hdr *header;
167
168 if (ieee->tkip_countermeasures &&
169 crypt && crypt->ops && strcmp(crypt->ops->name, "TKIP") == 0) {
170 header = (struct ieee80211_hdr *) frag->data;
171 if (net_ratelimit()) {
172 printk(KERN_DEBUG "%s: TKIP countermeasures: dropped "
173 "TX packet to " MAC_FMT "\n",
174 ieee->dev->name, MAC_ARG(header->addr1));
175 }
176 return -1;
177 }
178#endif
179 /* To encrypt, frame format is:
180 * IV (4 bytes), clear payload (including SNAP), ICV (4 bytes) */
181
182 // PR: FIXME: Copied from hostap. Check fragmentation/MSDU/MPDU encryption.
183 /* Host-based IEEE 802.11 fragmentation for TX is not yet supported, so
184 * call both MSDU and MPDU encryption functions from here. */
185 atomic_inc(&crypt->refcnt);
186 res = 0;
187 if (crypt->ops->encrypt_msdu)
188 res = crypt->ops->encrypt_msdu(frag, hdr_len, crypt->priv);
189 if (res == 0 && crypt->ops->encrypt_mpdu)
190 res = crypt->ops->encrypt_mpdu(frag, hdr_len, crypt->priv);
191
192 atomic_dec(&crypt->refcnt);
193 if (res < 0) {
194 printk(KERN_INFO "%s: Encryption failed: len=%d.\n",
195 ieee->dev->name, frag->len);
196 ieee->ieee_stats.tx_discards++;
197 return -1;
198 }
199
200 return 0;
201}
202
203
204void ieee80211_txb_free(struct ieee80211_txb *txb) {
205 int i;
206 if (unlikely(!txb))
207 return;
208 for (i = 0; i < txb->nr_frags; i++)
209 if (txb->fragments[i])
210 dev_kfree_skb_any(txb->fragments[i]);
211 kfree(txb);
212}
213
Adrian Bunke1572492005-05-06 23:32:39 +0200214static struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size,
215 int gfp_mask)
Jeff Garzikb4538722005-05-12 22:48:20 -0400216{
217 struct ieee80211_txb *txb;
218 int i;
219 txb = kmalloc(
220 sizeof(struct ieee80211_txb) + (sizeof(u8*) * nr_frags),
221 gfp_mask);
222 if (!txb)
223 return NULL;
224
Adrian Bunk0a989b22005-04-11 16:52:15 -0700225 memset(txb, 0, sizeof(struct ieee80211_txb));
Jeff Garzikb4538722005-05-12 22:48:20 -0400226 txb->nr_frags = nr_frags;
227 txb->frag_size = txb_size;
228
229 for (i = 0; i < nr_frags; i++) {
230 txb->fragments[i] = dev_alloc_skb(txb_size);
231 if (unlikely(!txb->fragments[i])) {
232 i--;
233 break;
234 }
235 }
236 if (unlikely(i != nr_frags)) {
237 while (i >= 0)
238 dev_kfree_skb_any(txb->fragments[i--]);
239 kfree(txb);
240 return NULL;
241 }
242 return txb;
243}
244
245/* SKBs are added to the ieee->tx_queue. */
246int ieee80211_xmit(struct sk_buff *skb,
247 struct net_device *dev)
248{
249 struct ieee80211_device *ieee = netdev_priv(dev);
250 struct ieee80211_txb *txb = NULL;
251 struct ieee80211_hdr *frag_hdr;
252 int i, bytes_per_frag, nr_frags, bytes_last_frag, frag_size;
253 unsigned long flags;
254 struct net_device_stats *stats = &ieee->stats;
255 int ether_type, encrypt;
256 int bytes, fc, hdr_len;
257 struct sk_buff *skb_frag;
258 struct ieee80211_hdr header = { /* Ensure zero initialized */
259 .duration_id = 0,
260 .seq_ctl = 0
261 };
262 u8 dest[ETH_ALEN], src[ETH_ALEN];
263
264 struct ieee80211_crypt_data* crypt;
265
266 spin_lock_irqsave(&ieee->lock, flags);
267
268 /* If there is no driver handler to take the TXB, dont' bother
269 * creating it... */
270 if (!ieee->hard_start_xmit) {
271 printk(KERN_WARNING "%s: No xmit handler.\n",
272 ieee->dev->name);
273 goto success;
274 }
275
276 if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) {
277 printk(KERN_WARNING "%s: skb too small (%d).\n",
278 ieee->dev->name, skb->len);
279 goto success;
280 }
281
282 ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto);
283
284 crypt = ieee->crypt[ieee->tx_keyidx];
285
286 encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) &&
287 ieee->host_encrypt && crypt && crypt->ops;
288
289 if (!encrypt && ieee->ieee802_1x &&
290 ieee->drop_unencrypted && ether_type != ETH_P_PAE) {
291 stats->tx_dropped++;
292 goto success;
293 }
294
295#ifdef CONFIG_IEEE80211_DEBUG
296 if (crypt && !encrypt && ether_type == ETH_P_PAE) {
297 struct eapol *eap = (struct eapol *)(skb->data +
298 sizeof(struct ethhdr) - SNAP_SIZE - sizeof(u16));
299 IEEE80211_DEBUG_EAP("TX: IEEE 802.11 EAPOL frame: %s\n",
300 eap_get_type(eap->type));
301 }
302#endif
303
304 /* Save source and destination addresses */
305 memcpy(&dest, skb->data, ETH_ALEN);
306 memcpy(&src, skb->data+ETH_ALEN, ETH_ALEN);
307
308 /* Advance the SKB to the start of the payload */
309 skb_pull(skb, sizeof(struct ethhdr));
310
311 /* Determine total amount of storage required for TXB packets */
312 bytes = skb->len + SNAP_SIZE + sizeof(u16);
313
314 if (encrypt)
315 fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA |
Jiri Bencf13baae2005-08-25 20:11:46 -0400316 IEEE80211_FCTL_PROTECTED;
Jeff Garzikb4538722005-05-12 22:48:20 -0400317 else
318 fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA;
319
320 if (ieee->iw_mode == IW_MODE_INFRA) {
321 fc |= IEEE80211_FCTL_TODS;
322 /* To DS: Addr1 = BSSID, Addr2 = SA,
323 Addr3 = DA */
324 memcpy(&header.addr1, ieee->bssid, ETH_ALEN);
325 memcpy(&header.addr2, &src, ETH_ALEN);
326 memcpy(&header.addr3, &dest, ETH_ALEN);
327 } else if (ieee->iw_mode == IW_MODE_ADHOC) {
328 /* not From/To DS: Addr1 = DA, Addr2 = SA,
329 Addr3 = BSSID */
330 memcpy(&header.addr1, dest, ETH_ALEN);
331 memcpy(&header.addr2, src, ETH_ALEN);
332 memcpy(&header.addr3, ieee->bssid, ETH_ALEN);
333 }
334 header.frame_ctl = cpu_to_le16(fc);
335 hdr_len = IEEE80211_3ADDR_LEN;
336
337 /* Determine fragmentation size based on destination (multicast
338 * and broadcast are not fragmented) */
339 if (is_multicast_ether_addr(dest) ||
340 is_broadcast_ether_addr(dest))
341 frag_size = MAX_FRAG_THRESHOLD;
342 else
343 frag_size = ieee->fts;
344
345 /* Determine amount of payload per fragment. Regardless of if
346 * this stack is providing the full 802.11 header, one will
347 * eventually be affixed to this fragment -- so we must account for
348 * it when determining the amount of payload space. */
349 bytes_per_frag = frag_size - IEEE80211_3ADDR_LEN;
350 if (ieee->config &
351 (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
352 bytes_per_frag -= IEEE80211_FCS_LEN;
353
354 /* Each fragment may need to have room for encryptiong pre/postfix */
355 if (encrypt)
356 bytes_per_frag -= crypt->ops->extra_prefix_len +
357 crypt->ops->extra_postfix_len;
358
359 /* Number of fragments is the total bytes_per_frag /
360 * payload_per_fragment */
361 nr_frags = bytes / bytes_per_frag;
362 bytes_last_frag = bytes % bytes_per_frag;
363 if (bytes_last_frag)
364 nr_frags++;
365 else
366 bytes_last_frag = bytes_per_frag;
367
368 /* When we allocate the TXB we allocate enough space for the reserve
369 * and full fragment bytes (bytes_per_frag doesn't include prefix,
370 * postfix, header, FCS, etc.) */
371 txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC);
372 if (unlikely(!txb)) {
373 printk(KERN_WARNING "%s: Could not allocate TXB\n",
374 ieee->dev->name);
375 goto failed;
376 }
377 txb->encrypted = encrypt;
378 txb->payload_size = bytes;
379
380 for (i = 0; i < nr_frags; i++) {
381 skb_frag = txb->fragments[i];
382
383 if (encrypt)
384 skb_reserve(skb_frag, crypt->ops->extra_prefix_len);
385
386 frag_hdr = (struct ieee80211_hdr *)skb_put(skb_frag, hdr_len);
387 memcpy(frag_hdr, &header, hdr_len);
388
389 /* If this is not the last fragment, then add the MOREFRAGS
390 * bit to the frame control */
391 if (i != nr_frags - 1) {
392 frag_hdr->frame_ctl = cpu_to_le16(
393 fc | IEEE80211_FCTL_MOREFRAGS);
394 bytes = bytes_per_frag;
395 } else {
396 /* The last fragment takes the remaining length */
397 bytes = bytes_last_frag;
398 }
399
400 /* Put a SNAP header on the first fragment */
401 if (i == 0) {
402 ieee80211_put_snap(
403 skb_put(skb_frag, SNAP_SIZE + sizeof(u16)),
404 ether_type);
405 bytes -= SNAP_SIZE + sizeof(u16);
406 }
407
408 memcpy(skb_put(skb_frag, bytes), skb->data, bytes);
409
410 /* Advance the SKB... */
411 skb_pull(skb, bytes);
412
413 /* Encryption routine will move the header forward in order
414 * to insert the IV between the header and the payload */
415 if (encrypt)
416 ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len);
417 if (ieee->config &
418 (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
419 skb_put(skb_frag, 4);
420 }
421
422
423 success:
424 spin_unlock_irqrestore(&ieee->lock, flags);
425
426 dev_kfree_skb_any(skb);
427
428 if (txb) {
429 if ((*ieee->hard_start_xmit)(txb, dev) == 0) {
430 stats->tx_packets++;
431 stats->tx_bytes += txb->payload_size;
432 return 0;
433 }
434 ieee80211_txb_free(txb);
435 }
436
437 return 0;
438
439 failed:
440 spin_unlock_irqrestore(&ieee->lock, flags);
441 netif_stop_queue(dev);
442 stats->tx_errors++;
443 return 1;
444
445}
446
447EXPORT_SYMBOL(ieee80211_txb_free);