blob: 5f5ea3ad330b5282a185ae85b471e0988943775b [file] [log] [blame]
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +05301/*
Jeff Johnsone8216e82017-01-26 15:54:51 -08002 * Copyright (c) 2016-2017 The Linux Foundation. All rights reserved.
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +05303 *
4 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/**
20 * DOC : wlan_hdd_disa.c
21 *
22 * WLAN Host Device Driver file for DISA certification
23 *
24 */
25
26#include "wlan_hdd_disa.h"
Jeff Johnsonb915bae2017-01-30 13:40:00 -080027#include "wlan_hdd_request_manager.h"
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053028#include "sme_api.h"
Sandeep Puligillafdd201e2017-02-02 18:43:46 -080029#include <qca_vendor.h>
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053030
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053031#define WLAN_WAIT_TIME_ENCRYPT_DECRYPT 1000
32
33
34/**
35 * hdd_encrypt_decrypt_msg_context - hdd encrypt/decrypt message context
Jeff Johnsonb915bae2017-01-30 13:40:00 -080036 * @status: status of response. 0: no error, -ENOMEM: unable to allocate
37 * memory for the response payload
38 * @request: encrypt/decrypt request
39 * @response: encrypt/decrypt response
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053040 */
41struct hdd_encrypt_decrypt_msg_context {
Jeff Johnsonb915bae2017-01-30 13:40:00 -080042 int status;
43 struct encrypt_decrypt_req_params request;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053044 struct sir_encrypt_decrypt_rsp_params response;
45};
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053046
47/**
Jeff Johnsonb915bae2017-01-30 13:40:00 -080048 * hdd_encrypt_decrypt_msg_cb () - encrypt/decrypt response message handler
49 * @cookie: hdd request cookie
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053050 * @encrypt_decrypt_rsp_params: encrypt/decrypt response parameters
51 *
52 * Return: none
53 */
Jeff Johnsonb915bae2017-01-30 13:40:00 -080054static void hdd_encrypt_decrypt_msg_cb(void *cookie,
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053055 struct sir_encrypt_decrypt_rsp_params *encrypt_decrypt_rsp_params)
56{
Jeff Johnsonb915bae2017-01-30 13:40:00 -080057 struct hdd_request *request;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053058 struct hdd_encrypt_decrypt_msg_context *context;
59
60 ENTER();
61
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053062 if (!encrypt_decrypt_rsp_params) {
63 hdd_err("rsp params is NULL");
64 return;
65 }
66
Jeff Johnsonb915bae2017-01-30 13:40:00 -080067 request = hdd_request_get(cookie);
68 if (!request) {
69 hdd_err("Obsolete request");
70 return;
71 }
72
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053073 print_hex_dump(KERN_INFO, "Data in hdd_encrypt_decrypt_msg_cb: ",
74 DUMP_PREFIX_NONE, 16, 1,
75 encrypt_decrypt_rsp_params->data,
76 encrypt_decrypt_rsp_params->data_length, 0);
77
Srinivas Girigowda21534c72017-03-06 16:16:31 -080078 hdd_debug("vdev_id: %d status:%d data_length: %d",
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053079 encrypt_decrypt_rsp_params->vdev_id,
80 encrypt_decrypt_rsp_params->status,
81 encrypt_decrypt_rsp_params->data_length);
82
Jeff Johnsonb915bae2017-01-30 13:40:00 -080083 context = hdd_request_priv(request);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053084 context->response = *encrypt_decrypt_rsp_params;
Jeff Johnsonb915bae2017-01-30 13:40:00 -080085 context->status = 0;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053086 if (encrypt_decrypt_rsp_params->data_length) {
87 context->response.data =
88 qdf_mem_malloc(sizeof(uint8_t) *
89 encrypt_decrypt_rsp_params->data_length);
Jeff Johnsonb915bae2017-01-30 13:40:00 -080090 if (!context->response.data) {
91 hdd_err("memory allocation failed");
92 context->status = -ENOMEM;
93 } else {
94 qdf_mem_copy(context->response.data,
95 encrypt_decrypt_rsp_params->data,
96 encrypt_decrypt_rsp_params->data_length);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053097 }
Jeff Johnsonb915bae2017-01-30 13:40:00 -080098 } else {
99 /* make sure we don't have a rogue pointer */
100 context->response.data = NULL;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530101 }
102
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800103 hdd_request_complete(request);
104 hdd_request_put(request);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530105 EXIT();
106}
107
108
109/**
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800110 * hdd_post_encrypt_decrypt_msg_rsp () - send encrypt/decrypt data to user space
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530111 * @encrypt_decrypt_rsp_params: encrypt/decrypt response parameters
112 *
113 * Return: none
114 */
Jeff Johnson2cd92112017-08-28 12:03:48 -0700115static int hdd_post_encrypt_decrypt_msg_rsp(struct hdd_context *hdd_ctx,
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530116 struct sir_encrypt_decrypt_rsp_params *encrypt_decrypt_rsp_params)
117{
118 struct sk_buff *skb;
119 uint32_t nl_buf_len;
120
121 ENTER();
122
123 nl_buf_len = encrypt_decrypt_rsp_params->data_length + NLA_HDRLEN;
124
125 skb = cfg80211_vendor_cmd_alloc_reply_skb(hdd_ctx->wiphy, nl_buf_len);
126 if (!skb) {
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800127 hdd_err("cfg80211_vendor_cmd_alloc_reply_skb failed");
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530128 return -ENOMEM;
129 }
130
131 if (encrypt_decrypt_rsp_params->data_length) {
132 if (nla_put(skb, QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_DATA,
133 encrypt_decrypt_rsp_params->data_length,
134 encrypt_decrypt_rsp_params->data)) {
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800135 hdd_err("put fail");
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530136 goto nla_put_failure;
137 }
138 }
139
140 cfg80211_vendor_cmd_reply(skb);
141 EXIT();
142 return 0;
143
144nla_put_failure:
145 kfree_skb(skb);
146 return -EINVAL;
147}
148
Jeff Johnson5286eac2017-06-06 12:53:28 -0700149static const struct nla_policy
150encrypt_decrypt_policy[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_MAX + 1] = {
151 [QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_NEEDS_DECRYPTION] = {
152 .type = NLA_FLAG},
153 [QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_KEYID] = {
154 .type = NLA_U8},
155 [QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_CIPHER] = {
156 .type = NLA_U32},
157};
158
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530159/**
160 * hdd_fill_encrypt_decrypt_params () - parses data from user space
161 * and fills encrypt/decrypt parameters
162 * @encrypt_decrypt_params: encrypt/decrypt request parameters
163 * @adapter : adapter context
164 * @data: Pointer to data
165 * @data_len: Data length
166 *
167 Return: 0 on success, negative errno on failure
168 */
169static int hdd_fill_encrypt_decrypt_params(struct encrypt_decrypt_req_params
170 *encrypt_decrypt_params,
Jeff Johnsonc7f3ded2017-08-29 14:36:34 -0700171 struct hdd_adapter *adapter,
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530172 const void *data,
173 int data_len)
174{
175 struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_MAX + 1];
176 uint8_t len, mac_hdr_len;
177 uint8_t *tmp;
178 uint8_t fc[2];
179
Dustin Brown3fb15042017-08-15 15:54:49 -0700180 if (hdd_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_MAX,
Jeff Johnson5286eac2017-06-06 12:53:28 -0700181 data, data_len, encrypt_decrypt_policy)) {
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530182 hdd_err("Invalid ATTR");
183 return -EINVAL;
184 }
185
186 encrypt_decrypt_params->vdev_id = adapter->sessionId;
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800187 hdd_debug("vdev_id: %d", encrypt_decrypt_params->vdev_id);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530188
189 if (!tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_NEEDS_DECRYPTION]) {
190 hdd_err("attr flag NEEDS_DECRYPTION not present");
191 encrypt_decrypt_params->key_flag = WMI_ENCRYPT;
192 } else {
193 hdd_err("attr flag NEEDS_DECRYPTION present");
194 encrypt_decrypt_params->key_flag = WMI_DECRYPT;
195 }
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800196 hdd_debug("Key flag: %d", encrypt_decrypt_params->key_flag);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530197
198 if (!tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_KEYID]) {
199 hdd_err("attr key id failed");
200 return -EINVAL;
201 }
202 encrypt_decrypt_params->key_idx = nla_get_u8(tb
203 [QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_KEYID]);
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800204 hdd_debug("Key Idx: %d", encrypt_decrypt_params->key_idx);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530205
206 if (!tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_CIPHER]) {
207 hdd_err("attr Cipher failed");
208 return -EINVAL;
209 }
210 encrypt_decrypt_params->key_cipher = nla_get_u32(tb
211 [QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_CIPHER]);
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800212 hdd_debug("key_cipher: %d", encrypt_decrypt_params->key_cipher);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530213
214 if (!tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_TK]) {
215 hdd_err("attr TK failed");
216 return -EINVAL;
217 }
218 encrypt_decrypt_params->key_len =
219 nla_len(tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_TK]);
220 if (!encrypt_decrypt_params->key_len) {
221 hdd_err("Invalid TK length");
222 return -EINVAL;
223 }
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800224 hdd_debug("Key len: %d", encrypt_decrypt_params->key_len);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530225
226 if (encrypt_decrypt_params->key_len > SIR_MAC_MAX_KEY_LENGTH)
227 encrypt_decrypt_params->key_len = SIR_MAC_MAX_KEY_LENGTH;
228
229 tmp = nla_data(tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_TK]);
230
231 qdf_mem_copy(encrypt_decrypt_params->key_data, tmp,
232 encrypt_decrypt_params->key_len);
233
234 print_hex_dump(KERN_INFO, "Key : ", DUMP_PREFIX_NONE, 16, 1,
235 &encrypt_decrypt_params->key_data,
236 encrypt_decrypt_params->key_len, 0);
237
238 if (!tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_PN]) {
239 hdd_err("attr PN failed");
240 return -EINVAL;
241 }
242 len = nla_len(tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_PN]);
Jeff Johnson5286eac2017-06-06 12:53:28 -0700243 if (!len || len > sizeof(encrypt_decrypt_params->pn)) {
244 hdd_err("Invalid PN length %u", len);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530245 return -EINVAL;
246 }
247
248 tmp = nla_data(tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_PN]);
249
250 qdf_mem_copy(encrypt_decrypt_params->pn, tmp, len);
251
252 print_hex_dump(KERN_INFO, "PN received : ", DUMP_PREFIX_NONE, 16, 1,
253 &encrypt_decrypt_params->pn, len, 0);
254
255 if (!tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_DATA]) {
256 hdd_err("attr header failed");
257 return -EINVAL;
258 }
259 len = nla_len(tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_DATA]);
Jeff Johnson5286eac2017-06-06 12:53:28 -0700260 if (len < MIN_MAC_HEADER_LEN) {
261 hdd_err("Invalid header and payload length %u", len);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530262 return -EINVAL;
263 }
264
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800265 hdd_debug("Header and Payload length: %d", len);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530266
267 tmp = nla_data(tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_DATA]);
268
269 print_hex_dump(KERN_INFO, "Header and Payload received: ",
270 DUMP_PREFIX_NONE, 16, 1,
271 tmp, len, 0);
272
273 mac_hdr_len = MIN_MAC_HEADER_LEN;
274
275 /*
276 * Check to find out address 4. Address 4 is present if ToDS and FromDS
277 * are 1 and data representation is little endian.
278 */
279 fc[1] = *tmp;
280 fc[0] = *(tmp + 1);
281 if ((fc[0] & 0x03) == 0x03) {
282 hdd_err("Address 4 is present");
283 mac_hdr_len += IEEE80211_ADDR_LEN;
284 }
285
286 /*
287 * Check to find out Qos control field. Qos control field is present
288 * if msb of subtype field is 1 and data representation is
289 * little endian.
290 */
291 if (fc[1] & 0x80) {
292 hdd_err("Qos control is present");
293 mac_hdr_len += QOS_CONTROL_LEN;
294 }
295
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800296 hdd_debug("mac_hdr_len: %d", mac_hdr_len);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530297
Jeff Johnson5286eac2017-06-06 12:53:28 -0700298 if (len < mac_hdr_len) {
299 hdd_err("Invalid header and payload length %u", len);
300 return -EINVAL;
301 }
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530302 qdf_mem_copy(encrypt_decrypt_params->mac_header,
303 tmp, mac_hdr_len);
304
305 print_hex_dump(KERN_INFO, "Header received in request: ",
306 DUMP_PREFIX_NONE, 16, 1,
307 encrypt_decrypt_params->mac_header,
308 mac_hdr_len, 0);
309
310 encrypt_decrypt_params->data_len =
311 len - mac_hdr_len;
312
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800313 hdd_debug("Payload length: %d", encrypt_decrypt_params->data_len);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530314
315 if (encrypt_decrypt_params->data_len) {
316 encrypt_decrypt_params->data =
317 qdf_mem_malloc(sizeof(uint8_t) *
318 encrypt_decrypt_params->data_len);
319
320 if (encrypt_decrypt_params->data == NULL) {
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800321 hdd_err("memory allocation failed");
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530322 return -ENOMEM;
323 }
324
325 qdf_mem_copy(encrypt_decrypt_params->data,
326 tmp + mac_hdr_len,
327 encrypt_decrypt_params->data_len);
328
329 print_hex_dump(KERN_INFO, "Data received in request: ",
330 DUMP_PREFIX_NONE, 16, 1,
331 encrypt_decrypt_params->data,
332 encrypt_decrypt_params->data_len, 0);
333 }
334
335 return 0;
336}
337
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800338static void hdd_encrypt_decrypt_context_dealloc(void *priv)
339{
340 struct hdd_encrypt_decrypt_msg_context *context = priv;
341
342 qdf_mem_free(context->request.data);
343 qdf_mem_free(context->response.data);
344}
345
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530346/**
347 * hdd_encrypt_decrypt_msg () - process encrypt/decrypt message
348 * @adapter : adapter context
349 * @hdd_ctx: hdd context
350 * @data: Pointer to data
351 * @data_len: Data length
352 *
353 Return: 0 on success, negative errno on failure
354 */
Jeff Johnsonc7f3ded2017-08-29 14:36:34 -0700355static int hdd_encrypt_decrypt_msg(struct hdd_adapter *adapter,
Jeff Johnson2cd92112017-08-28 12:03:48 -0700356 struct hdd_context *hdd_ctx,
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800357 const void *data,
358 int data_len)
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530359{
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530360 QDF_STATUS qdf_status;
361 int ret;
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800362 void *cookie;
363 struct hdd_request *request;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530364 struct hdd_encrypt_decrypt_msg_context *context;
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800365 static const struct hdd_request_params params = {
366 .priv_size = sizeof(*context),
367 .timeout_ms = WLAN_WAIT_TIME_ENCRYPT_DECRYPT,
368 .dealloc = hdd_encrypt_decrypt_context_dealloc,
369 };
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530370
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800371 request = hdd_request_alloc(&params);
372 if (!request) {
373 hdd_err("Request allocation failure");
374 return -ENOMEM;
375 }
376 context = hdd_request_priv(request);
377
378 ret = hdd_fill_encrypt_decrypt_params(&context->request, adapter,
379 data, data_len);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530380 if (ret)
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800381 goto cleanup;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530382
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800383 cookie = hdd_request_cookie(request);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530384 qdf_status = sme_encrypt_decrypt_msg(hdd_ctx->hHal,
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800385 &context->request,
Jeff Johnsone8216e82017-01-26 15:54:51 -0800386 hdd_encrypt_decrypt_msg_cb,
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800387 cookie);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530388
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530389
390 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
391 hdd_err("Unable to post encrypt/decrypt message");
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800392 ret = -EINVAL;
393 goto cleanup;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530394 }
395
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800396 ret = hdd_request_wait_for_response(request);
397 if (ret) {
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530398 hdd_err("Target response timed out");
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800399 goto cleanup;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530400 }
401
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800402 ret = context->status;
403 if (ret) {
404 hdd_err("Target response processing failed");
405 goto cleanup;
406 }
407
408 ret = hdd_post_encrypt_decrypt_msg_rsp(hdd_ctx, &context->response);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530409 if (ret)
410 hdd_err("Failed to post encrypt/decrypt message response");
411
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800412cleanup:
413 hdd_request_put(request);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530414
415 EXIT();
416 return ret;
417}
418
419/**
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530420 * __wlan_hdd_cfg80211_encrypt_decrypt_msg () - Encrypt/Decrypt msg
421 * @wiphy: Pointer to wireless phy
422 * @wdev: Pointer to wireless device
423 * @data: Pointer to data
424 * @data_len: Data length
425 *
426 * Return: 0 on success, negative errno on failure
427 */
428static int __wlan_hdd_cfg80211_encrypt_decrypt_msg(struct wiphy *wiphy,
429 struct wireless_dev *wdev,
430 const void *data,
431 int data_len)
432{
Jeff Johnson2cd92112017-08-28 12:03:48 -0700433 struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530434 struct net_device *dev = wdev->netdev;
Jeff Johnsonc7f3ded2017-08-29 14:36:34 -0700435 struct hdd_adapter *adapter = NULL;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530436 int ret;
437
438 ENTER_DEV(dev);
439
440 ret = wlan_hdd_validate_context(hdd_ctx);
441 if (ret)
442 return ret;
443
444 adapter = WLAN_HDD_GET_PRIV_PTR(dev);
445
446 ret = hdd_encrypt_decrypt_msg(adapter, hdd_ctx, data, data_len);
447
448 return ret;
449}
450
451/**
452 * wlan_hdd_cfg80211_encrypt_decrypt_msg () - Encrypt/Decrypt msg
453 * @wiphy: Pointer to wireless phy
454 * @wdev: Pointer to wireless device
455 * @data: Pointer to data
456 * @data_len: Data length
457 *
458 * Return: 0 on success, negative errno on failure
459 */
460int wlan_hdd_cfg80211_encrypt_decrypt_msg(struct wiphy *wiphy,
461 struct wireless_dev *wdev,
462 const void *data,
463 int data_len)
464{
465 int ret;
466
467 cds_ssr_protect(__func__);
468 ret = __wlan_hdd_cfg80211_encrypt_decrypt_msg(wiphy, wdev,
469 data, data_len);
470 cds_ssr_unprotect(__func__);
471
472 return ret;
473}