1 /******************************************************************************
3 Copyright(c) 2003 - 2004 Intel Corporation. All rights reserved.
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.
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
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.
18 The full GNU General Public License is included in this distribution in the
22 James P. Ketrenos <ipw2100-admin@linux.intel.com>
23 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
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>
33 #include <linux/kernel.h>
34 #include <linux/module.h>
35 #include <linux/netdevice.h>
36 #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>
46 #include <net/ieee80211.h>
54 ,-------------------------------------------------------------------.
55 Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 |
56 |------|------|---------|---------|---------|------|---------|------|
57 Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | Frame | fcs |
58 | | tion | (BSSID) | | | ence | data | |
59 `--------------------------------------------------| |------'
60 Total: 28 non-data bytes `----.----'
62 .- 'Frame data' expands to <---------------------------'
65 ,---------------------------------------------------.
66 Bytes | 1 | 1 | 1 | 3 | 2 | 0-2304 |
67 |------|------|---------|----------|------|---------|
68 Desc. | SNAP | SNAP | Control |Eth Tunnel| Type | IP |
69 | DSAP | SSAP | | | | Packet |
70 | 0xAA | 0xAA |0x03 (UI)|0x00-00-F8| | |
71 `-----------------------------------------| |
72 Total: 8 non-data bytes `----.----'
74 .- 'IP Packet' expands, if WEP enabled, to <--'
77 ,-----------------------.
78 Bytes | 4 | 0-2296 | 4 |
79 |-----|-----------|-----|
80 Desc. | IV | Encrypted | ICV |
82 `-----------------------'
83 Total: 8 non-data bytes
86 802.3 Ethernet Data Frame
88 ,-----------------------------------------.
89 Bytes | 6 | 6 | 2 | Variable | 4 |
90 |-------|-------|------|-----------|------|
91 Desc. | Dest. | Source| Type | IP Packet | fcs |
93 `-----------------------------------------'
94 Total: 18 non-data bytes
96 In the event that fragmentation is required, the incoming payload is split into
97 N parts of size ieee->fts. The first fragment contains the SNAP header and the
98 remaining packets are just data.
100 If encryption is enabled, each fragment payload size is reduced by enough space
101 to add the prefix and postfix (IV and ICV totalling 8 bytes in the case of WEP)
102 So if you have 1500 bytes of payload with ieee->fts set to 500 without
103 encryption it will take 3 frames. With WEP it will take 4 frames as the
104 payload of each frame is reduced to 492 bytes.
110 * | ETHERNET HEADER ,-<-- PAYLOAD
111 * | | 14 bytes from skb->data
112 * | 2 bytes for Type --> ,T. | (sizeof ethhdr)
114 * |,-Dest.--. ,--Src.---. | | |
115 * | 6 bytes| | 6 bytes | | | |
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
121 * | | | | `T' <---- 2 bytes for Type
123 * | | '---SNAP--' <-------- 6 bytes for SNAP
125 * `-IV--' <-------------------- 4 bytes for IV (WEP)
131 static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
132 static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
134 static inline int ieee80211_put_snap(u8 *data, u16 h_proto)
136 struct ieee80211_snap_hdr *snap;
139 snap = (struct ieee80211_snap_hdr *)data;
144 if (h_proto == 0x8137 || h_proto == 0x80f3)
148 snap->oui[0] = oui[0];
149 snap->oui[1] = oui[1];
150 snap->oui[2] = oui[2];
152 *(u16 *)(data + SNAP_SIZE) = htons(h_proto);
154 return SNAP_SIZE + sizeof(u16);
157 static inline int ieee80211_encrypt_fragment(
158 struct ieee80211_device *ieee,
159 struct sk_buff *frag,
162 struct ieee80211_crypt_data* crypt = ieee->crypt[ieee->tx_keyidx];
165 #ifdef CONFIG_IEEE80211_CRYPT_TKIP
166 struct ieee80211_hdr *header;
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));
179 /* To encrypt, frame format is:
180 * IV (4 bytes), clear payload (including SNAP), ICV (4 bytes) */
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);
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);
192 atomic_dec(&crypt->refcnt);
194 printk(KERN_INFO "%s: Encryption failed: len=%d.\n",
195 ieee->dev->name, frag->len);
196 ieee->ieee_stats.tx_discards++;
204 void ieee80211_txb_free(struct ieee80211_txb *txb) {
208 for (i = 0; i < txb->nr_frags; i++)
209 if (txb->fragments[i])
210 dev_kfree_skb_any(txb->fragments[i]);
214 static struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size,
217 struct ieee80211_txb *txb;
220 sizeof(struct ieee80211_txb) + (sizeof(u8*) * nr_frags),
225 memset(txb, 0, sizeof(struct ieee80211_txb));
226 txb->nr_frags = nr_frags;
227 txb->frag_size = txb_size;
229 for (i = 0; i < nr_frags; i++) {
230 txb->fragments[i] = dev_alloc_skb(txb_size);
231 if (unlikely(!txb->fragments[i])) {
236 if (unlikely(i != nr_frags)) {
238 dev_kfree_skb_any(txb->fragments[i--]);
245 /* SKBs are added to the ieee->tx_queue. */
246 int ieee80211_xmit(struct sk_buff *skb,
247 struct net_device *dev)
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;
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 */
262 u8 dest[ETH_ALEN], src[ETH_ALEN];
264 struct ieee80211_crypt_data* crypt;
266 spin_lock_irqsave(&ieee->lock, flags);
268 /* If there is no driver handler to take the TXB, dont' bother
270 if (!ieee->hard_start_xmit) {
271 printk(KERN_WARNING "%s: No xmit handler.\n",
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);
282 ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto);
284 crypt = ieee->crypt[ieee->tx_keyidx];
286 encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) &&
287 ieee->host_encrypt && crypt && crypt->ops;
289 if (!encrypt && ieee->ieee802_1x &&
290 ieee->drop_unencrypted && ether_type != ETH_P_PAE) {
295 /* Save source and destination addresses */
296 memcpy(&dest, skb->data, ETH_ALEN);
297 memcpy(&src, skb->data+ETH_ALEN, ETH_ALEN);
299 /* Advance the SKB to the start of the payload */
300 skb_pull(skb, sizeof(struct ethhdr));
302 /* Determine total amount of storage required for TXB packets */
303 bytes = skb->len + SNAP_SIZE + sizeof(u16);
306 fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA |
307 IEEE80211_FCTL_PROTECTED;
309 fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA;
311 if (ieee->iw_mode == IW_MODE_INFRA) {
312 fc |= IEEE80211_FCTL_TODS;
313 /* To DS: Addr1 = BSSID, Addr2 = SA,
315 memcpy(&header.addr1, ieee->bssid, ETH_ALEN);
316 memcpy(&header.addr2, &src, ETH_ALEN);
317 memcpy(&header.addr3, &dest, ETH_ALEN);
318 } else if (ieee->iw_mode == IW_MODE_ADHOC) {
319 /* not From/To DS: Addr1 = DA, Addr2 = SA,
321 memcpy(&header.addr1, dest, ETH_ALEN);
322 memcpy(&header.addr2, src, ETH_ALEN);
323 memcpy(&header.addr3, ieee->bssid, ETH_ALEN);
325 header.frame_ctl = cpu_to_le16(fc);
326 hdr_len = IEEE80211_3ADDR_LEN;
328 /* Determine fragmentation size based on destination (multicast
329 * and broadcast are not fragmented) */
330 if (is_multicast_ether_addr(dest) ||
331 is_broadcast_ether_addr(dest))
332 frag_size = MAX_FRAG_THRESHOLD;
334 frag_size = ieee->fts;
336 /* Determine amount of payload per fragment. Regardless of if
337 * this stack is providing the full 802.11 header, one will
338 * eventually be affixed to this fragment -- so we must account for
339 * it when determining the amount of payload space. */
340 bytes_per_frag = frag_size - IEEE80211_3ADDR_LEN;
342 (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
343 bytes_per_frag -= IEEE80211_FCS_LEN;
345 /* Each fragment may need to have room for encryptiong pre/postfix */
347 bytes_per_frag -= crypt->ops->extra_prefix_len +
348 crypt->ops->extra_postfix_len;
350 /* Number of fragments is the total bytes_per_frag /
351 * payload_per_fragment */
352 nr_frags = bytes / bytes_per_frag;
353 bytes_last_frag = bytes % bytes_per_frag;
357 bytes_last_frag = bytes_per_frag;
359 /* When we allocate the TXB we allocate enough space for the reserve
360 * and full fragment bytes (bytes_per_frag doesn't include prefix,
361 * postfix, header, FCS, etc.) */
362 txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC);
363 if (unlikely(!txb)) {
364 printk(KERN_WARNING "%s: Could not allocate TXB\n",
368 txb->encrypted = encrypt;
369 txb->payload_size = bytes;
371 for (i = 0; i < nr_frags; i++) {
372 skb_frag = txb->fragments[i];
375 skb_reserve(skb_frag, crypt->ops->extra_prefix_len);
377 frag_hdr = (struct ieee80211_hdr *)skb_put(skb_frag, hdr_len);
378 memcpy(frag_hdr, &header, hdr_len);
380 /* If this is not the last fragment, then add the MOREFRAGS
381 * bit to the frame control */
382 if (i != nr_frags - 1) {
383 frag_hdr->frame_ctl = cpu_to_le16(
384 fc | IEEE80211_FCTL_MOREFRAGS);
385 bytes = bytes_per_frag;
387 /* The last fragment takes the remaining length */
388 bytes = bytes_last_frag;
391 /* Put a SNAP header on the first fragment */
394 skb_put(skb_frag, SNAP_SIZE + sizeof(u16)),
396 bytes -= SNAP_SIZE + sizeof(u16);
399 memcpy(skb_put(skb_frag, bytes), skb->data, bytes);
401 /* Advance the SKB... */
402 skb_pull(skb, bytes);
404 /* Encryption routine will move the header forward in order
405 * to insert the IV between the header and the payload */
407 ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len);
409 (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
410 skb_put(skb_frag, 4);
415 spin_unlock_irqrestore(&ieee->lock, flags);
417 dev_kfree_skb_any(skb);
420 if ((*ieee->hard_start_xmit)(txb, dev) == 0) {
422 stats->tx_bytes += txb->payload_size;
425 ieee80211_txb_free(txb);
431 spin_unlock_irqrestore(&ieee->lock, flags);
432 netif_stop_queue(dev);
438 EXPORT_SYMBOL(ieee80211_txb_free);