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>
52 ,-------------------------------------------------------------------.
53 Bytes | 2 | 2 | 6 | 6 | 6 | 2 | 0..2312 | 4 |
54 |------|------|---------|---------|---------|------|---------|------|
55 Desc. | ctrl | dura | DA/RA | TA | SA | Sequ | Frame | fcs |
56 | | tion | (BSSID) | | | ence | data | |
57 `--------------------------------------------------| |------'
58 Total: 28 non-data bytes `----.----'
60 .- 'Frame data' expands to <---------------------------'
63 ,---------------------------------------------------.
64 Bytes | 1 | 1 | 1 | 3 | 2 | 0-2304 |
65 |------|------|---------|----------|------|---------|
66 Desc. | SNAP | SNAP | Control |Eth Tunnel| Type | IP |
67 | DSAP | SSAP | | | | Packet |
68 | 0xAA | 0xAA |0x03 (UI)|0x00-00-F8| | |
69 `-----------------------------------------| |
70 Total: 8 non-data bytes `----.----'
72 .- 'IP Packet' expands, if WEP enabled, to <--'
75 ,-----------------------.
76 Bytes | 4 | 0-2296 | 4 |
77 |-----|-----------|-----|
78 Desc. | IV | Encrypted | ICV |
80 `-----------------------'
81 Total: 8 non-data bytes
83 802.3 Ethernet Data Frame
85 ,-----------------------------------------.
86 Bytes | 6 | 6 | 2 | Variable | 4 |
87 |-------|-------|------|-----------|------|
88 Desc. | Dest. | Source| Type | IP Packet | fcs |
90 `-----------------------------------------'
91 Total: 18 non-data bytes
93 In the event that fragmentation is required, the incoming payload is split into
94 N parts of size ieee->fts. The first fragment contains the SNAP header and the
95 remaining packets are just data.
97 If encryption is enabled, each fragment payload size is reduced by enough space
98 to add the prefix and postfix (IV and ICV totalling 8 bytes in the case of WEP)
99 So if you have 1500 bytes of payload with ieee->fts set to 500 without
100 encryption it will take 3 frames. With WEP it will take 4 frames as the
101 payload of each frame is reduced to 492 bytes.
107 * | ETHERNET HEADER ,-<-- PAYLOAD
108 * | | 14 bytes from skb->data
109 * | 2 bytes for Type --> ,T. | (sizeof ethhdr)
111 * |,-Dest.--. ,--Src.---. | | |
112 * | 6 bytes| | 6 bytes | | | |
115 * 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
118 * | | | | `T' <---- 2 bytes for Type
120 * | | '---SNAP--' <-------- 6 bytes for SNAP
122 * `-IV--' <-------------------- 4 bytes for IV (WEP)
128 static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
129 static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
131 static inline int ieee80211_put_snap(u8 * data, u16 h_proto)
133 struct ieee80211_snap_hdr *snap;
136 snap = (struct ieee80211_snap_hdr *)data;
141 if (h_proto == 0x8137 || h_proto == 0x80f3)
145 snap->oui[0] = oui[0];
146 snap->oui[1] = oui[1];
147 snap->oui[2] = oui[2];
149 *(u16 *) (data + SNAP_SIZE) = htons(h_proto);
151 return SNAP_SIZE + sizeof(u16);
154 static inline int ieee80211_encrypt_fragment(struct ieee80211_device *ieee,
155 struct sk_buff *frag, int hdr_len)
157 struct ieee80211_crypt_data *crypt = ieee->crypt[ieee->tx_keyidx];
160 /* To encrypt, frame format is:
161 * IV (4 bytes), clear payload (including SNAP), ICV (4 bytes) */
163 // PR: FIXME: Copied from hostap. Check fragmentation/MSDU/MPDU encryption.
164 /* Host-based IEEE 802.11 fragmentation for TX is not yet supported, so
165 * call both MSDU and MPDU encryption functions from here. */
166 atomic_inc(&crypt->refcnt);
168 if (crypt->ops->encrypt_msdu)
169 res = crypt->ops->encrypt_msdu(frag, hdr_len, crypt->priv);
170 if (res == 0 && crypt->ops->encrypt_mpdu)
171 res = crypt->ops->encrypt_mpdu(frag, hdr_len, crypt->priv);
173 atomic_dec(&crypt->refcnt);
175 printk(KERN_INFO "%s: Encryption failed: len=%d.\n",
176 ieee->dev->name, frag->len);
177 ieee->ieee_stats.tx_discards++;
184 void ieee80211_txb_free(struct ieee80211_txb *txb)
189 for (i = 0; i < txb->nr_frags; i++)
190 if (txb->fragments[i])
191 dev_kfree_skb_any(txb->fragments[i]);
195 static struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size,
198 struct ieee80211_txb *txb;
200 txb = kmalloc(sizeof(struct ieee80211_txb) + (sizeof(u8 *) * nr_frags),
205 memset(txb, 0, sizeof(struct ieee80211_txb));
206 txb->nr_frags = nr_frags;
207 txb->frag_size = txb_size;
209 for (i = 0; i < nr_frags; i++) {
210 txb->fragments[i] = dev_alloc_skb(txb_size);
211 if (unlikely(!txb->fragments[i])) {
216 if (unlikely(i != nr_frags)) {
218 dev_kfree_skb_any(txb->fragments[i--]);
225 /* Incoming skb is converted to a txb which consist of
226 * a block of 802.11 fragment packets (stored as skbs) */
227 int ieee80211_xmit(struct sk_buff *skb, struct net_device *dev)
229 struct ieee80211_device *ieee = netdev_priv(dev);
230 struct ieee80211_txb *txb = NULL;
231 struct ieee80211_hdr_3addr *frag_hdr;
232 int i, bytes_per_frag, nr_frags, bytes_last_frag, frag_size,
235 struct net_device_stats *stats = &ieee->stats;
236 int ether_type, encrypt, host_encrypt;
237 int bytes, fc, hdr_len;
238 struct sk_buff *skb_frag;
239 struct ieee80211_hdr_3addr header = { /* Ensure zero initialized */
243 u8 dest[ETH_ALEN], src[ETH_ALEN];
245 struct ieee80211_crypt_data *crypt;
247 spin_lock_irqsave(&ieee->lock, flags);
249 /* If there is no driver handler to take the TXB, dont' bother
251 if (!ieee->hard_start_xmit) {
252 printk(KERN_WARNING "%s: No xmit handler.\n", ieee->dev->name);
256 if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) {
257 printk(KERN_WARNING "%s: skb too small (%d).\n",
258 ieee->dev->name, skb->len);
262 ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto);
264 crypt = ieee->crypt[ieee->tx_keyidx];
266 encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) &&
268 host_encrypt = ieee->host_encrypt && encrypt;
270 if (!encrypt && ieee->ieee802_1x &&
271 ieee->drop_unencrypted && ether_type != ETH_P_PAE) {
276 /* Save source and destination addresses */
277 memcpy(dest, skb->data, ETH_ALEN);
278 memcpy(src, skb->data + ETH_ALEN, ETH_ALEN);
280 /* Advance the SKB to the start of the payload */
281 skb_pull(skb, sizeof(struct ethhdr));
283 /* Determine total amount of storage required for TXB packets */
284 bytes = skb->len + SNAP_SIZE + sizeof(u16);
287 fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA |
288 IEEE80211_FCTL_PROTECTED;
290 fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA;
292 if (ieee->iw_mode == IW_MODE_INFRA) {
293 fc |= IEEE80211_FCTL_TODS;
294 /* To DS: Addr1 = BSSID, Addr2 = SA,
296 memcpy(header.addr1, ieee->bssid, ETH_ALEN);
297 memcpy(header.addr2, src, ETH_ALEN);
298 memcpy(header.addr3, dest, ETH_ALEN);
299 } else if (ieee->iw_mode == IW_MODE_ADHOC) {
300 /* not From/To DS: Addr1 = DA, Addr2 = SA,
302 memcpy(header.addr1, dest, ETH_ALEN);
303 memcpy(header.addr2, src, ETH_ALEN);
304 memcpy(header.addr3, ieee->bssid, ETH_ALEN);
306 header.frame_ctl = cpu_to_le16(fc);
307 hdr_len = IEEE80211_3ADDR_LEN;
309 /* Determine fragmentation size based on destination (multicast
310 * and broadcast are not fragmented) */
311 if (is_multicast_ether_addr(dest) || is_broadcast_ether_addr(dest))
312 frag_size = MAX_FRAG_THRESHOLD;
314 frag_size = ieee->fts;
316 /* Determine amount of payload per fragment. Regardless of if
317 * this stack is providing the full 802.11 header, one will
318 * eventually be affixed to this fragment -- so we must account for
319 * it when determining the amount of payload space. */
320 bytes_per_frag = frag_size - IEEE80211_3ADDR_LEN;
322 (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
323 bytes_per_frag -= IEEE80211_FCS_LEN;
325 /* Each fragment may need to have room for encryptiong pre/postfix */
327 bytes_per_frag -= crypt->ops->extra_prefix_len +
328 crypt->ops->extra_postfix_len;
330 /* Number of fragments is the total bytes_per_frag /
331 * payload_per_fragment */
332 nr_frags = bytes / bytes_per_frag;
333 bytes_last_frag = bytes % bytes_per_frag;
337 bytes_last_frag = bytes_per_frag;
339 rts_required = (frag_size > ieee->rts
340 && ieee->config & CFG_IEEE80211_RTS);
344 bytes_last_frag = bytes_per_frag;
346 /* When we allocate the TXB we allocate enough space for the reserve
347 * and full fragment bytes (bytes_per_frag doesn't include prefix,
348 * postfix, header, FCS, etc.) */
349 txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC);
350 if (unlikely(!txb)) {
351 printk(KERN_WARNING "%s: Could not allocate TXB\n",
355 txb->encrypted = encrypt;
356 txb->payload_size = bytes;
359 skb_frag = txb->fragments[0];
361 (struct ieee80211_hdr_3addr *)skb_put(skb_frag, hdr_len);
364 * Set header frame_ctl to the RTS.
367 cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS);
368 memcpy(frag_hdr, &header, hdr_len);
371 * Restore header frame_ctl to the original data setting.
373 header.frame_ctl = cpu_to_le16(fc);
376 (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
377 skb_put(skb_frag, 4);
379 txb->rts_included = 1;
384 for (; i < nr_frags; i++) {
385 skb_frag = txb->fragments[i];
388 skb_reserve(skb_frag, crypt->ops->extra_prefix_len);
391 (struct ieee80211_hdr_3addr *)skb_put(skb_frag, hdr_len);
392 memcpy(frag_hdr, &header, hdr_len);
394 /* If this is not the last fragment, then add the MOREFRAGS
395 * bit to the frame control */
396 if (i != nr_frags - 1) {
397 frag_hdr->frame_ctl =
398 cpu_to_le16(fc | IEEE80211_FCTL_MOREFRAGS);
399 bytes = bytes_per_frag;
401 /* The last fragment takes the remaining length */
402 bytes = bytes_last_frag;
405 /* Put a SNAP header on the first fragment */
407 ieee80211_put_snap(skb_put
408 (skb_frag, SNAP_SIZE + sizeof(u16)),
410 bytes -= SNAP_SIZE + sizeof(u16);
413 memcpy(skb_put(skb_frag, bytes), skb->data, bytes);
415 /* Advance the SKB... */
416 skb_pull(skb, bytes);
418 /* Encryption routine will move the header forward in order
419 * to insert the IV between the header and the payload */
421 ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len);
423 /* ipw2200/2915 Hardware encryption doesn't support TKIP MIC */
424 if (!ieee->host_encrypt && encrypt &&
425 (ieee->sec.level == SEC_LEVEL_2) &&
426 crypt && crypt->ops && crypt->ops->encrypt_msdu) {
428 res = crypt->ops->encrypt_msdu(skb_frag, hdr_len,
431 IEEE80211_ERROR("TKIP MIC encryption failed\n");
437 (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
438 skb_put(skb_frag, 4);
442 spin_unlock_irqrestore(&ieee->lock, flags);
444 dev_kfree_skb_any(skb);
447 if ((*ieee->hard_start_xmit) (txb, dev) == 0) {
449 stats->tx_bytes += txb->payload_size;
452 ieee80211_txb_free(txb);
458 spin_unlock_irqrestore(&ieee->lock, flags);
459 netif_stop_queue(dev);
465 EXPORT_SYMBOL(ieee80211_txb_free);