Mark files without an existing BSD licence as having a QCA ClearBSD
[open-ath9k-htc-firmware.git] / target_firmware / wlan / ieee80211_output.c
1 /*
2  * Copyright (c) 2013 Qualcomm Atheros, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted (subject to the limitations in the
7  * disclaimer below) provided that the following conditions are met:
8  *
9  *  * Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  *  * Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the
15  *    distribution.
16  *
17  *  * Neither the name of Qualcomm Atheros nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific prior written permission.
20  *
21  * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
22  * GRANTED BY THIS LICENSE.  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
23  * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
24  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
30  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
32  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
33  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  */
35
36 #include <adf_os_types.h>
37 #include <adf_os_dma.h>
38 #include <adf_os_timer.h>
39 #include <adf_os_lock.h>
40 #include <adf_os_io.h>
41 #include <adf_os_mem.h>
42 #include <adf_os_module.h>
43 #include <adf_os_util.h>
44 #include <adf_os_stdtypes.h>
45 #include <adf_os_defer.h>
46 #include <adf_os_atomic.h>
47 #include <adf_nbuf.h>
48 #include <adf_net.h>
49
50 #include <if_llc.h>
51 #include <if_ethersubr.h>
52 #include "ieee80211_var.h"
53
54 #include "_ieee80211.h"
55 #include "ieee80211.h"
56 #include <wlan_hdr.h>
57
58 a_status_t
59 ieee80211_tgt_crypto_encap(struct ieee80211_frame *wh,
60                            struct ieee80211_node_target *ni,
61                            a_uint8_t keytype)
62 {
63 #define CRYPTO_KEY_TYPE_AES          2
64 #define CRYPTO_KEY_TYPE_TKIP         3
65 #define CRYPTO_KEY_TYPE_WAPI         4
66 #define IEEE80211_WLAN_HDR_LEN      24
67
68         a_uint8_t *iv = NULL;
69         a_uint16_t tmp;
70         a_uint16_t offset = IEEE80211_WLAN_HDR_LEN;
71         a_uint8_t b1, b2;
72
73         if (IEEE80211_QOS_HAS_SEQ(wh))
74                 offset += 4;  // pad for 4 byte alignment
75
76         iv = (a_uint8_t *) wh;
77         iv = iv + offset;
78
79         switch (keytype) {
80         case CRYPTO_KEY_TYPE_AES:
81                 ni->ni_iv16++;
82                 if (ni->ni_iv16 == 0)
83                 {
84                         ni->ni_iv32++;
85                 }
86
87                 *iv++ = (a_uint8_t) ni->ni_iv16;
88                 *iv++ = (a_uint8_t) (ni->ni_iv16 >> 8);
89                 *iv++ = 0x00;
90                 *iv++ |= 0x20;
91
92                 tmp = (a_uint16_t) ni->ni_iv32;
93                 *iv++ = (a_uint8_t) tmp;
94                 *iv++ = (a_uint8_t) (tmp >> 8);
95
96                 tmp = (a_uint16_t) (ni->ni_iv32 >> 16);
97                 *iv++ = (a_uint8_t) tmp;
98                 *iv = (a_uint8_t) (tmp >> 8);
99                 break;
100         case CRYPTO_KEY_TYPE_TKIP:
101                 ni->ni_iv16++;
102                 if (ni->ni_iv16 == 0)
103                 {
104                         ni->ni_iv32++;
105                 }
106
107                 b1 = (a_uint8_t) (ni->ni_iv16 >> 8);
108                 b2 = (b1 | 0x20) & 0x7f;
109
110                 *iv++ = b1;
111                 *iv++ = b2;
112
113                 *iv++ = (a_uint8_t) ni->ni_iv16;
114                 *iv++ |= 0x20;
115
116                 tmp = (a_uint16_t) ni->ni_iv32;
117                 *iv++ = (a_uint8_t) tmp;
118                 *iv++ = (a_uint8_t) (tmp >> 8);
119
120                 tmp = (a_uint16_t) (ni->ni_iv32 >> 16);
121                 *iv++ = (a_uint8_t) tmp;
122                 *iv = (a_uint8_t) (tmp >> 8);
123                 break;
124         default:
125                 break;
126         }
127
128         return 1;
129
130 #undef CRYPTO_KEY_TYPE_TKIP
131 #undef CRYPTO_KEY_TYPE_AES
132 #undef CRYPTO_KEY_TYPE_WAPI
133 #undef IEEE80211_WLAN_HDR_LEN
134 }
135
136 adf_os_export_symbol(ieee80211_tgt_crypto_encap);
137
138 #undef  IEEE80211_ADDR_LEN