Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / drivers / net / wireless / intel / ipw2x00 / libipw_tx.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /******************************************************************************
3
4   Copyright(c) 2003 - 2005 Intel Corporation. All rights reserved.
5
6
7   Contact Information:
8   Intel Linux Wireless <ilw@linux.intel.com>
9   Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
10
11 ******************************************************************************/
12 #include <linux/compiler.h>
13 #include <linux/errno.h>
14 #include <linux/if_arp.h>
15 #include <linux/in6.h>
16 #include <linux/in.h>
17 #include <linux/ip.h>
18 #include <linux/kernel.h>
19 #include <linux/module.h>
20 #include <linux/netdevice.h>
21 #include <linux/proc_fs.h>
22 #include <linux/skbuff.h>
23 #include <linux/slab.h>
24 #include <linux/tcp.h>
25 #include <linux/types.h>
26 #include <linux/wireless.h>
27 #include <linux/etherdevice.h>
28 #include <linux/uaccess.h>
29
30 #include "libipw.h"
31
32 /*
33
34 802.11 Data Frame
35
36       ,-------------------------------------------------------------------.
37 Bytes |  2   |  2   |    6    |    6    |    6    |  2   | 0..2312 |   4  |
38       |------|------|---------|---------|---------|------|---------|------|
39 Desc. | ctrl | dura |  DA/RA  |   TA    |    SA   | Sequ |  Frame  |  fcs |
40       |      | tion | (BSSID) |         |         | ence |  data   |      |
41       `--------------------------------------------------|         |------'
42 Total: 28 non-data bytes                                 `----.----'
43                                                               |
44        .- 'Frame data' expands, if WEP enabled, to <----------'
45        |
46        V
47       ,-----------------------.
48 Bytes |  4  |   0-2296  |  4  |
49       |-----|-----------|-----|
50 Desc. | IV  | Encrypted | ICV |
51       |     | Packet    |     |
52       `-----|           |-----'
53             `-----.-----'
54                   |
55        .- 'Encrypted Packet' expands to
56        |
57        V
58       ,---------------------------------------------------.
59 Bytes |  1   |  1   |    1    |    3     |  2   |  0-2304 |
60       |------|------|---------|----------|------|---------|
61 Desc. | SNAP | SNAP | Control |Eth Tunnel| Type | IP      |
62       | DSAP | SSAP |         |          |      | Packet  |
63       | 0xAA | 0xAA |0x03 (UI)|0x00-00-F8|      |         |
64       `----------------------------------------------------
65 Total: 8 non-data bytes
66
67 802.3 Ethernet Data Frame
68
69       ,-----------------------------------------.
70 Bytes |   6   |   6   |  2   |  Variable |   4  |
71       |-------|-------|------|-----------|------|
72 Desc. | Dest. | Source| Type | IP Packet |  fcs |
73       |  MAC  |  MAC  |      |           |      |
74       `-----------------------------------------'
75 Total: 18 non-data bytes
76
77 In the event that fragmentation is required, the incoming payload is split into
78 N parts of size ieee->fts.  The first fragment contains the SNAP header and the
79 remaining packets are just data.
80
81 If encryption is enabled, each fragment payload size is reduced by enough space
82 to add the prefix and postfix (IV and ICV totalling 8 bytes in the case of WEP)
83 So if you have 1500 bytes of payload with ieee->fts set to 500 without
84 encryption it will take 3 frames.  With WEP it will take 4 frames as the
85 payload of each frame is reduced to 492 bytes.
86
87 * SKB visualization
88 *
89 *  ,- skb->data
90 * |
91 * |    ETHERNET HEADER        ,-<-- PAYLOAD
92 * |                           |     14 bytes from skb->data
93 * |  2 bytes for Type --> ,T. |     (sizeof ethhdr)
94 * |                       | | |
95 * |,-Dest.--. ,--Src.---. | | |
96 * |  6 bytes| | 6 bytes | | | |
97 * v         | |         | | | |
98 * 0         | v       1 | v | v           2
99 * 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
100 *     ^     | ^         | ^ |
101 *     |     | |         | | |
102 *     |     | |         | `T' <---- 2 bytes for Type
103 *     |     | |         |
104 *     |     | '---SNAP--' <-------- 6 bytes for SNAP
105 *     |     |
106 *     `-IV--' <-------------------- 4 bytes for IV (WEP)
107 *
108 *      SNAP HEADER
109 *
110 */
111
112 static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
113 static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
114
115 static int libipw_copy_snap(u8 * data, __be16 h_proto)
116 {
117         struct libipw_snap_hdr *snap;
118         u8 *oui;
119
120         snap = (struct libipw_snap_hdr *)data;
121         snap->dsap = 0xaa;
122         snap->ssap = 0xaa;
123         snap->ctrl = 0x03;
124
125         if (h_proto == htons(ETH_P_AARP) || h_proto == htons(ETH_P_IPX))
126                 oui = P802_1H_OUI;
127         else
128                 oui = RFC1042_OUI;
129         snap->oui[0] = oui[0];
130         snap->oui[1] = oui[1];
131         snap->oui[2] = oui[2];
132
133         memcpy(data + SNAP_SIZE, &h_proto, sizeof(u16));
134
135         return SNAP_SIZE + sizeof(u16);
136 }
137
138 static int libipw_encrypt_fragment(struct libipw_device *ieee,
139                                              struct sk_buff *frag, int hdr_len)
140 {
141         struct lib80211_crypt_data *crypt =
142                 ieee->crypt_info.crypt[ieee->crypt_info.tx_keyidx];
143         int res;
144
145         if (crypt == NULL)
146                 return -1;
147
148         /* To encrypt, frame format is:
149          * IV (4 bytes), clear payload (including SNAP), ICV (4 bytes) */
150         atomic_inc(&crypt->refcnt);
151         res = 0;
152         if (crypt->ops && crypt->ops->encrypt_mpdu)
153                 res = crypt->ops->encrypt_mpdu(frag, hdr_len, crypt->priv);
154
155         atomic_dec(&crypt->refcnt);
156         if (res < 0) {
157                 printk(KERN_INFO "%s: Encryption failed: len=%d.\n",
158                        ieee->dev->name, frag->len);
159                 ieee->ieee_stats.tx_discards++;
160                 return -1;
161         }
162
163         return 0;
164 }
165
166 void libipw_txb_free(struct libipw_txb *txb)
167 {
168         int i;
169         if (unlikely(!txb))
170                 return;
171         for (i = 0; i < txb->nr_frags; i++)
172                 if (txb->fragments[i])
173                         dev_kfree_skb_any(txb->fragments[i]);
174         kfree(txb);
175 }
176
177 static struct libipw_txb *libipw_alloc_txb(int nr_frags, int txb_size,
178                                                  int headroom, gfp_t gfp_mask)
179 {
180         struct libipw_txb *txb;
181         int i;
182         txb = kmalloc(sizeof(struct libipw_txb) + (sizeof(u8 *) * nr_frags),
183                       gfp_mask);
184         if (!txb)
185                 return NULL;
186
187         memset(txb, 0, sizeof(struct libipw_txb));
188         txb->nr_frags = nr_frags;
189         txb->frag_size = txb_size;
190
191         for (i = 0; i < nr_frags; i++) {
192                 txb->fragments[i] = __dev_alloc_skb(txb_size + headroom,
193                                                     gfp_mask);
194                 if (unlikely(!txb->fragments[i])) {
195                         i--;
196                         break;
197                 }
198                 skb_reserve(txb->fragments[i], headroom);
199         }
200         if (unlikely(i != nr_frags)) {
201                 while (i >= 0)
202                         dev_kfree_skb_any(txb->fragments[i--]);
203                 kfree(txb);
204                 return NULL;
205         }
206         return txb;
207 }
208
209 static int libipw_classify(struct sk_buff *skb)
210 {
211         struct ethhdr *eth;
212         struct iphdr *ip;
213
214         eth = (struct ethhdr *)skb->data;
215         if (eth->h_proto != htons(ETH_P_IP))
216                 return 0;
217
218         ip = ip_hdr(skb);
219         switch (ip->tos & 0xfc) {
220         case 0x20:
221                 return 2;
222         case 0x40:
223                 return 1;
224         case 0x60:
225                 return 3;
226         case 0x80:
227                 return 4;
228         case 0xa0:
229                 return 5;
230         case 0xc0:
231                 return 6;
232         case 0xe0:
233                 return 7;
234         default:
235                 return 0;
236         }
237 }
238
239 /* Incoming skb is converted to a txb which consists of
240  * a block of 802.11 fragment packets (stored as skbs) */
241 netdev_tx_t libipw_xmit(struct sk_buff *skb, struct net_device *dev)
242 {
243         struct libipw_device *ieee = netdev_priv(dev);
244         struct libipw_txb *txb = NULL;
245         struct libipw_hdr_3addrqos *frag_hdr;
246         int i, bytes_per_frag, nr_frags, bytes_last_frag, frag_size,
247             rts_required;
248         unsigned long flags;
249         int encrypt, host_encrypt, host_encrypt_msdu;
250         __be16 ether_type;
251         int bytes, fc, hdr_len;
252         struct sk_buff *skb_frag;
253         struct libipw_hdr_3addrqos header = {/* Ensure zero initialized */
254                 .duration_id = 0,
255                 .seq_ctl = 0,
256                 .qos_ctl = 0
257         };
258         u8 dest[ETH_ALEN], src[ETH_ALEN];
259         struct lib80211_crypt_data *crypt;
260         int priority = skb->priority;
261         int snapped = 0;
262
263         if (ieee->is_queue_full && (*ieee->is_queue_full) (dev, priority))
264                 return NETDEV_TX_BUSY;
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", ieee->dev->name);
272                 goto success;
273         }
274
275         if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) {
276                 printk(KERN_WARNING "%s: skb too small (%d).\n",
277                        ieee->dev->name, skb->len);
278                 goto success;
279         }
280
281         ether_type = ((struct ethhdr *)skb->data)->h_proto;
282
283         crypt = ieee->crypt_info.crypt[ieee->crypt_info.tx_keyidx];
284
285         encrypt = !(ether_type == htons(ETH_P_PAE) && ieee->ieee802_1x) &&
286             ieee->sec.encrypt;
287
288         host_encrypt = ieee->host_encrypt && encrypt && crypt;
289         host_encrypt_msdu = ieee->host_encrypt_msdu && encrypt && crypt;
290
291         if (!encrypt && ieee->ieee802_1x &&
292             ieee->drop_unencrypted && ether_type != htons(ETH_P_PAE)) {
293                 dev->stats.tx_dropped++;
294                 goto success;
295         }
296
297         /* Save source and destination addresses */
298         skb_copy_from_linear_data(skb, dest, ETH_ALEN);
299         skb_copy_from_linear_data_offset(skb, ETH_ALEN, src, ETH_ALEN);
300
301         if (host_encrypt)
302                 fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA |
303                     IEEE80211_FCTL_PROTECTED;
304         else
305                 fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA;
306
307         if (ieee->iw_mode == IW_MODE_INFRA) {
308                 fc |= IEEE80211_FCTL_TODS;
309                 /* To DS: Addr1 = BSSID, Addr2 = SA, Addr3 = DA */
310                 memcpy(header.addr1, ieee->bssid, ETH_ALEN);
311                 memcpy(header.addr2, src, ETH_ALEN);
312                 memcpy(header.addr3, dest, ETH_ALEN);
313         } else if (ieee->iw_mode == IW_MODE_ADHOC) {
314                 /* not From/To DS: Addr1 = DA, Addr2 = SA, Addr3 = BSSID */
315                 memcpy(header.addr1, dest, ETH_ALEN);
316                 memcpy(header.addr2, src, ETH_ALEN);
317                 memcpy(header.addr3, ieee->bssid, ETH_ALEN);
318         }
319         hdr_len = LIBIPW_3ADDR_LEN;
320
321         if (ieee->is_qos_active && ieee->is_qos_active(dev, skb)) {
322                 fc |= IEEE80211_STYPE_QOS_DATA;
323                 hdr_len += 2;
324
325                 skb->priority = libipw_classify(skb);
326                 header.qos_ctl |= cpu_to_le16(skb->priority & LIBIPW_QCTL_TID);
327         }
328         header.frame_ctl = cpu_to_le16(fc);
329
330         /* Advance the SKB to the start of the payload */
331         skb_pull(skb, sizeof(struct ethhdr));
332
333         /* Determine total amount of storage required for TXB packets */
334         bytes = skb->len + SNAP_SIZE + sizeof(u16);
335
336         /* Encrypt msdu first on the whole data packet. */
337         if ((host_encrypt || host_encrypt_msdu) &&
338             crypt && crypt->ops && crypt->ops->encrypt_msdu) {
339                 int res = 0;
340                 int len = bytes + hdr_len + crypt->ops->extra_msdu_prefix_len +
341                     crypt->ops->extra_msdu_postfix_len;
342                 struct sk_buff *skb_new = dev_alloc_skb(len);
343
344                 if (unlikely(!skb_new))
345                         goto failed;
346
347                 skb_reserve(skb_new, crypt->ops->extra_msdu_prefix_len);
348                 skb_put_data(skb_new, &header, hdr_len);
349                 snapped = 1;
350                 libipw_copy_snap(skb_put(skb_new, SNAP_SIZE + sizeof(u16)),
351                                     ether_type);
352                 skb_copy_from_linear_data(skb, skb_put(skb_new, skb->len), skb->len);
353                 res = crypt->ops->encrypt_msdu(skb_new, hdr_len, crypt->priv);
354                 if (res < 0) {
355                         LIBIPW_ERROR("msdu encryption failed\n");
356                         dev_kfree_skb_any(skb_new);
357                         goto failed;
358                 }
359                 dev_kfree_skb_any(skb);
360                 skb = skb_new;
361                 bytes += crypt->ops->extra_msdu_prefix_len +
362                     crypt->ops->extra_msdu_postfix_len;
363                 skb_pull(skb, hdr_len);
364         }
365
366         if (host_encrypt || ieee->host_open_frag) {
367                 /* Determine fragmentation size based on destination (multicast
368                  * and broadcast are not fragmented) */
369                 if (is_multicast_ether_addr(dest) ||
370                     is_broadcast_ether_addr(dest))
371                         frag_size = MAX_FRAG_THRESHOLD;
372                 else
373                         frag_size = ieee->fts;
374
375                 /* Determine amount of payload per fragment.  Regardless of if
376                  * this stack is providing the full 802.11 header, one will
377                  * eventually be affixed to this fragment -- so we must account
378                  * for it when determining the amount of payload space. */
379                 bytes_per_frag = frag_size - hdr_len;
380                 if (ieee->config &
381                     (CFG_LIBIPW_COMPUTE_FCS | CFG_LIBIPW_RESERVE_FCS))
382                         bytes_per_frag -= LIBIPW_FCS_LEN;
383
384                 /* Each fragment may need to have room for encryption
385                  * pre/postfix */
386                 if (host_encrypt)
387                         bytes_per_frag -= crypt->ops->extra_mpdu_prefix_len +
388                             crypt->ops->extra_mpdu_postfix_len;
389
390                 /* Number of fragments is the total
391                  * bytes_per_frag / payload_per_fragment */
392                 nr_frags = bytes / bytes_per_frag;
393                 bytes_last_frag = bytes % bytes_per_frag;
394                 if (bytes_last_frag)
395                         nr_frags++;
396                 else
397                         bytes_last_frag = bytes_per_frag;
398         } else {
399                 nr_frags = 1;
400                 bytes_per_frag = bytes_last_frag = bytes;
401                 frag_size = bytes + hdr_len;
402         }
403
404         rts_required = (frag_size > ieee->rts
405                         && ieee->config & CFG_LIBIPW_RTS);
406         if (rts_required)
407                 nr_frags++;
408
409         /* When we allocate the TXB we allocate enough space for the reserve
410          * and full fragment bytes (bytes_per_frag doesn't include prefix,
411          * postfix, header, FCS, etc.) */
412         txb = libipw_alloc_txb(nr_frags, frag_size,
413                                   ieee->tx_headroom, GFP_ATOMIC);
414         if (unlikely(!txb)) {
415                 printk(KERN_WARNING "%s: Could not allocate TXB\n",
416                        ieee->dev->name);
417                 goto failed;
418         }
419         txb->encrypted = encrypt;
420         if (host_encrypt)
421                 txb->payload_size = frag_size * (nr_frags - 1) +
422                     bytes_last_frag;
423         else
424                 txb->payload_size = bytes;
425
426         if (rts_required) {
427                 skb_frag = txb->fragments[0];
428                 frag_hdr = skb_put(skb_frag, hdr_len);
429
430                 /*
431                  * Set header frame_ctl to the RTS.
432                  */
433                 header.frame_ctl =
434                     cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS);
435                 memcpy(frag_hdr, &header, hdr_len);
436
437                 /*
438                  * Restore header frame_ctl to the original data setting.
439                  */
440                 header.frame_ctl = cpu_to_le16(fc);
441
442                 if (ieee->config &
443                     (CFG_LIBIPW_COMPUTE_FCS | CFG_LIBIPW_RESERVE_FCS))
444                         skb_put(skb_frag, 4);
445
446                 txb->rts_included = 1;
447                 i = 1;
448         } else
449                 i = 0;
450
451         for (; i < nr_frags; i++) {
452                 skb_frag = txb->fragments[i];
453
454                 if (host_encrypt)
455                         skb_reserve(skb_frag,
456                                     crypt->ops->extra_mpdu_prefix_len);
457
458                 frag_hdr = skb_put_data(skb_frag, &header, hdr_len);
459
460                 /* If this is not the last fragment, then add the MOREFRAGS
461                  * bit to the frame control */
462                 if (i != nr_frags - 1) {
463                         frag_hdr->frame_ctl =
464                             cpu_to_le16(fc | IEEE80211_FCTL_MOREFRAGS);
465                         bytes = bytes_per_frag;
466                 } else {
467                         /* The last fragment takes the remaining length */
468                         bytes = bytes_last_frag;
469                 }
470
471                 if (i == 0 && !snapped) {
472                         libipw_copy_snap(skb_put
473                                             (skb_frag, SNAP_SIZE + sizeof(u16)),
474                                             ether_type);
475                         bytes -= SNAP_SIZE + sizeof(u16);
476                 }
477
478                 skb_copy_from_linear_data(skb, skb_put(skb_frag, bytes), bytes);
479
480                 /* Advance the SKB... */
481                 skb_pull(skb, bytes);
482
483                 /* Encryption routine will move the header forward in order
484                  * to insert the IV between the header and the payload */
485                 if (host_encrypt)
486                         libipw_encrypt_fragment(ieee, skb_frag, hdr_len);
487
488                 if (ieee->config &
489                     (CFG_LIBIPW_COMPUTE_FCS | CFG_LIBIPW_RESERVE_FCS))
490                         skb_put(skb_frag, 4);
491         }
492
493       success:
494         spin_unlock_irqrestore(&ieee->lock, flags);
495
496         dev_kfree_skb_any(skb);
497
498         if (txb) {
499                 netdev_tx_t ret = (*ieee->hard_start_xmit)(txb, dev, priority);
500                 if (ret == NETDEV_TX_OK) {
501                         dev->stats.tx_packets++;
502                         dev->stats.tx_bytes += txb->payload_size;
503                         return NETDEV_TX_OK;
504                 }
505
506                 libipw_txb_free(txb);
507         }
508
509         return NETDEV_TX_OK;
510
511       failed:
512         spin_unlock_irqrestore(&ieee->lock, flags);
513         netif_stop_queue(dev);
514         dev->stats.tx_errors++;
515         return NETDEV_TX_BUSY;
516 }
517 EXPORT_SYMBOL(libipw_xmit);
518
519 EXPORT_SYMBOL(libipw_txb_free);