blob: 00e8e64436f7e0c9ed9beb46e8600c828cdc5590 [file] [log] [blame]
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +05301/*
Nachiket Kukade98f562a2017-12-15 12:18:07 +05302 * Copyright (c) 2016-2018 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"
Nachiket Kukade98f562a2017-12-15 12:18:07 +053027#include "wlan_disa_ucfg_api.h"
Jeff Johnsonb915bae2017-01-30 13:40:00 -080028#include "wlan_hdd_request_manager.h"
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053029#include "sme_api.h"
Sandeep Puligillafdd201e2017-02-02 18:43:46 -080030#include <qca_vendor.h>
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053031
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053032#define WLAN_WAIT_TIME_ENCRYPT_DECRYPT 1000
33
34
35/**
36 * hdd_encrypt_decrypt_msg_context - hdd encrypt/decrypt message context
Jeff Johnsonb915bae2017-01-30 13:40:00 -080037 * @status: status of response. 0: no error, -ENOMEM: unable to allocate
38 * memory for the response payload
39 * @request: encrypt/decrypt request
40 * @response: encrypt/decrypt response
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053041 */
42struct hdd_encrypt_decrypt_msg_context {
Jeff Johnsonb915bae2017-01-30 13:40:00 -080043 int status;
Nachiket Kukade98f562a2017-12-15 12:18:07 +053044 struct disa_encrypt_decrypt_req_params request;
45 struct disa_encrypt_decrypt_resp_params response;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053046};
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053047
48/**
Jeff Johnsonb915bae2017-01-30 13:40:00 -080049 * hdd_encrypt_decrypt_msg_cb () - encrypt/decrypt response message handler
50 * @cookie: hdd request cookie
Nachiket Kukade98f562a2017-12-15 12:18:07 +053051 * @resp: encrypt/decrypt response parameters
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053052 *
53 * Return: none
54 */
Jeff Johnsonb915bae2017-01-30 13:40:00 -080055static void hdd_encrypt_decrypt_msg_cb(void *cookie,
Nachiket Kukade98f562a2017-12-15 12:18:07 +053056 struct disa_encrypt_decrypt_resp_params *resp)
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053057{
Jeff Johnsonb915bae2017-01-30 13:40:00 -080058 struct hdd_request *request;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053059 struct hdd_encrypt_decrypt_msg_context *context;
60
61 ENTER();
62
Nachiket Kukade98f562a2017-12-15 12:18:07 +053063 if (!resp) {
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053064 hdd_err("rsp params is NULL");
65 return;
66 }
67
Jeff Johnsonb915bae2017-01-30 13:40:00 -080068 request = hdd_request_get(cookie);
69 if (!request) {
70 hdd_err("Obsolete request");
71 return;
72 }
73
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053074 print_hex_dump(KERN_INFO, "Data in hdd_encrypt_decrypt_msg_cb: ",
75 DUMP_PREFIX_NONE, 16, 1,
Nachiket Kukade98f562a2017-12-15 12:18:07 +053076 resp->data,
77 resp->data_len, 0);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053078
Srinivas Girigowda21534c72017-03-06 16:16:31 -080079 hdd_debug("vdev_id: %d status:%d data_length: %d",
Nachiket Kukade98f562a2017-12-15 12:18:07 +053080 resp->vdev_id,
81 resp->status,
82 resp->data_len);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053083
Jeff Johnsonb915bae2017-01-30 13:40:00 -080084 context = hdd_request_priv(request);
Nachiket Kukade98f562a2017-12-15 12:18:07 +053085 context->response = *resp;
Jeff Johnsonb915bae2017-01-30 13:40:00 -080086 context->status = 0;
Nachiket Kukade98f562a2017-12-15 12:18:07 +053087 if (resp->data_len) {
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053088 context->response.data =
89 qdf_mem_malloc(sizeof(uint8_t) *
Nachiket Kukade98f562a2017-12-15 12:18:07 +053090 resp->data_len);
Jeff Johnsonb915bae2017-01-30 13:40:00 -080091 if (!context->response.data) {
92 hdd_err("memory allocation failed");
93 context->status = -ENOMEM;
94 } else {
95 qdf_mem_copy(context->response.data,
Nachiket Kukade98f562a2017-12-15 12:18:07 +053096 resp->data,
97 resp->data_len);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +053098 }
Jeff Johnsonb915bae2017-01-30 13:40:00 -080099 } else {
100 /* make sure we don't have a rogue pointer */
101 context->response.data = NULL;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530102 }
103
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800104 hdd_request_complete(request);
105 hdd_request_put(request);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530106 EXIT();
107}
108
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530109/**
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,
Nachiket Kukade98f562a2017-12-15 12:18:07 +0530116 struct disa_encrypt_decrypt_resp_params *resp)
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530117{
118 struct sk_buff *skb;
119 uint32_t nl_buf_len;
120
121 ENTER();
122
Nachiket Kukade98f562a2017-12-15 12:18:07 +0530123 nl_buf_len = resp->data_len + NLA_HDRLEN;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530124
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
Nachiket Kukade98f562a2017-12-15 12:18:07 +0530131 if (resp->data_len) {
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530132 if (nla_put(skb, QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_DATA,
Nachiket Kukade98f562a2017-12-15 12:18:07 +0530133 resp->data_len, resp->data)) {
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800134 hdd_err("put fail");
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530135 goto nla_put_failure;
136 }
137 }
138
139 cfg80211_vendor_cmd_reply(skb);
140 EXIT();
141 return 0;
142
143nla_put_failure:
144 kfree_skb(skb);
145 return -EINVAL;
146}
147
Jeff Johnson5286eac2017-06-06 12:53:28 -0700148static const struct nla_policy
149encrypt_decrypt_policy[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_MAX + 1] = {
150 [QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_NEEDS_DECRYPTION] = {
151 .type = NLA_FLAG},
Jeff Johnson5286eac2017-06-06 12:53:28 -0700152 [QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_CIPHER] = {
153 .type = NLA_U32},
Nachiket Kukade98f562a2017-12-15 12:18:07 +0530154 [QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_KEYID] = {
155 .type = NLA_U8},
Jeff Johnson5286eac2017-06-06 12:53:28 -0700156};
157
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530158/**
159 * hdd_fill_encrypt_decrypt_params () - parses data from user space
160 * and fills encrypt/decrypt parameters
161 * @encrypt_decrypt_params: encrypt/decrypt request parameters
162 * @adapter : adapter context
163 * @data: Pointer to data
164 * @data_len: Data length
165 *
166 Return: 0 on success, negative errno on failure
167 */
Nachiket Kukade98f562a2017-12-15 12:18:07 +0530168static int
169hdd_fill_encrypt_decrypt_params(struct disa_encrypt_decrypt_req_params
170 *encrypt_decrypt_params,
171 struct hdd_adapter *adapter,
172 const void *data,
173 int data_len)
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530174{
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 Brown4ea21db2018-01-05 14:13:17 -0800180 if (wlan_cfg80211_nla_parse(tb,
181 QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_MAX,
182 data, data_len, encrypt_decrypt_policy)) {
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530183 hdd_err("Invalid ATTR");
184 return -EINVAL;
185 }
186
Jeff Johnson1b780e42017-10-31 14:11:45 -0700187 encrypt_decrypt_params->vdev_id = adapter->session_id;
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800188 hdd_debug("vdev_id: %d", encrypt_decrypt_params->vdev_id);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530189
190 if (!tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_NEEDS_DECRYPTION]) {
191 hdd_err("attr flag NEEDS_DECRYPTION not present");
192 encrypt_decrypt_params->key_flag = WMI_ENCRYPT;
193 } else {
194 hdd_err("attr flag NEEDS_DECRYPTION present");
195 encrypt_decrypt_params->key_flag = WMI_DECRYPT;
196 }
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800197 hdd_debug("Key flag: %d", encrypt_decrypt_params->key_flag);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530198
199 if (!tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_KEYID]) {
200 hdd_err("attr key id failed");
201 return -EINVAL;
202 }
203 encrypt_decrypt_params->key_idx = nla_get_u8(tb
204 [QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_KEYID]);
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800205 hdd_debug("Key Idx: %d", encrypt_decrypt_params->key_idx);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530206
207 if (!tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_CIPHER]) {
208 hdd_err("attr Cipher failed");
209 return -EINVAL;
210 }
211 encrypt_decrypt_params->key_cipher = nla_get_u32(tb
212 [QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_CIPHER]);
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800213 hdd_debug("key_cipher: %d", encrypt_decrypt_params->key_cipher);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530214
215 if (!tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_TK]) {
216 hdd_err("attr TK failed");
217 return -EINVAL;
218 }
219 encrypt_decrypt_params->key_len =
220 nla_len(tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_TK]);
221 if (!encrypt_decrypt_params->key_len) {
222 hdd_err("Invalid TK length");
223 return -EINVAL;
224 }
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800225 hdd_debug("Key len: %d", encrypt_decrypt_params->key_len);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530226
227 if (encrypt_decrypt_params->key_len > SIR_MAC_MAX_KEY_LENGTH)
228 encrypt_decrypt_params->key_len = SIR_MAC_MAX_KEY_LENGTH;
229
230 tmp = nla_data(tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_TK]);
231
232 qdf_mem_copy(encrypt_decrypt_params->key_data, tmp,
233 encrypt_decrypt_params->key_len);
234
235 print_hex_dump(KERN_INFO, "Key : ", DUMP_PREFIX_NONE, 16, 1,
236 &encrypt_decrypt_params->key_data,
237 encrypt_decrypt_params->key_len, 0);
238
239 if (!tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_PN]) {
240 hdd_err("attr PN failed");
241 return -EINVAL;
242 }
243 len = nla_len(tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_PN]);
Jeff Johnson5286eac2017-06-06 12:53:28 -0700244 if (!len || len > sizeof(encrypt_decrypt_params->pn)) {
245 hdd_err("Invalid PN length %u", len);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530246 return -EINVAL;
247 }
248
249 tmp = nla_data(tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_PN]);
250
251 qdf_mem_copy(encrypt_decrypt_params->pn, tmp, len);
252
253 print_hex_dump(KERN_INFO, "PN received : ", DUMP_PREFIX_NONE, 16, 1,
254 &encrypt_decrypt_params->pn, len, 0);
255
256 if (!tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_DATA]) {
257 hdd_err("attr header failed");
258 return -EINVAL;
259 }
260 len = nla_len(tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_DATA]);
Jeff Johnson5286eac2017-06-06 12:53:28 -0700261 if (len < MIN_MAC_HEADER_LEN) {
262 hdd_err("Invalid header and payload length %u", len);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530263 return -EINVAL;
264 }
265
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800266 hdd_debug("Header and Payload length: %d", len);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530267
268 tmp = nla_data(tb[QCA_WLAN_VENDOR_ATTR_ENCRYPTION_TEST_DATA]);
269
270 print_hex_dump(KERN_INFO, "Header and Payload received: ",
271 DUMP_PREFIX_NONE, 16, 1,
272 tmp, len, 0);
273
274 mac_hdr_len = MIN_MAC_HEADER_LEN;
275
276 /*
277 * Check to find out address 4. Address 4 is present if ToDS and FromDS
278 * are 1 and data representation is little endian.
279 */
280 fc[1] = *tmp;
281 fc[0] = *(tmp + 1);
282 if ((fc[0] & 0x03) == 0x03) {
283 hdd_err("Address 4 is present");
284 mac_hdr_len += IEEE80211_ADDR_LEN;
285 }
286
287 /*
288 * Check to find out Qos control field. Qos control field is present
289 * if msb of subtype field is 1 and data representation is
290 * little endian.
291 */
292 if (fc[1] & 0x80) {
293 hdd_err("Qos control is present");
294 mac_hdr_len += QOS_CONTROL_LEN;
295 }
296
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800297 hdd_debug("mac_hdr_len: %d", mac_hdr_len);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530298
Jeff Johnson5286eac2017-06-06 12:53:28 -0700299 if (len < mac_hdr_len) {
300 hdd_err("Invalid header and payload length %u", len);
301 return -EINVAL;
302 }
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530303 qdf_mem_copy(encrypt_decrypt_params->mac_header,
304 tmp, mac_hdr_len);
305
306 print_hex_dump(KERN_INFO, "Header received in request: ",
307 DUMP_PREFIX_NONE, 16, 1,
308 encrypt_decrypt_params->mac_header,
309 mac_hdr_len, 0);
310
311 encrypt_decrypt_params->data_len =
312 len - mac_hdr_len;
313
Srinivas Girigowda21534c72017-03-06 16:16:31 -0800314 hdd_debug("Payload length: %d", encrypt_decrypt_params->data_len);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530315
316 if (encrypt_decrypt_params->data_len) {
317 encrypt_decrypt_params->data =
318 qdf_mem_malloc(sizeof(uint8_t) *
319 encrypt_decrypt_params->data_len);
320
321 if (encrypt_decrypt_params->data == NULL) {
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800322 hdd_err("memory allocation failed");
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530323 return -ENOMEM;
324 }
325
326 qdf_mem_copy(encrypt_decrypt_params->data,
327 tmp + mac_hdr_len,
328 encrypt_decrypt_params->data_len);
329
330 print_hex_dump(KERN_INFO, "Data received in request: ",
331 DUMP_PREFIX_NONE, 16, 1,
332 encrypt_decrypt_params->data,
333 encrypt_decrypt_params->data_len, 0);
334 }
335
336 return 0;
337}
338
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800339static void hdd_encrypt_decrypt_context_dealloc(void *priv)
340{
341 struct hdd_encrypt_decrypt_msg_context *context = priv;
342
343 qdf_mem_free(context->request.data);
344 qdf_mem_free(context->response.data);
345}
346
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530347/**
348 * hdd_encrypt_decrypt_msg () - process encrypt/decrypt message
349 * @adapter : adapter context
350 * @hdd_ctx: hdd context
351 * @data: Pointer to data
352 * @data_len: Data length
353 *
354 Return: 0 on success, negative errno on failure
355 */
Jeff Johnsonc7f3ded2017-08-29 14:36:34 -0700356static int hdd_encrypt_decrypt_msg(struct hdd_adapter *adapter,
Jeff Johnson2cd92112017-08-28 12:03:48 -0700357 struct hdd_context *hdd_ctx,
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800358 const void *data,
359 int data_len)
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530360{
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530361 QDF_STATUS qdf_status;
362 int ret;
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800363 void *cookie;
364 struct hdd_request *request;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530365 struct hdd_encrypt_decrypt_msg_context *context;
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800366 static const struct hdd_request_params params = {
367 .priv_size = sizeof(*context),
368 .timeout_ms = WLAN_WAIT_TIME_ENCRYPT_DECRYPT,
369 .dealloc = hdd_encrypt_decrypt_context_dealloc,
370 };
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530371
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800372 request = hdd_request_alloc(&params);
373 if (!request) {
374 hdd_err("Request allocation failure");
375 return -ENOMEM;
376 }
377 context = hdd_request_priv(request);
378
379 ret = hdd_fill_encrypt_decrypt_params(&context->request, adapter,
380 data, data_len);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530381 if (ret)
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800382 goto cleanup;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530383
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800384 cookie = hdd_request_cookie(request);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530385
Nachiket Kukade98f562a2017-12-15 12:18:07 +0530386 qdf_status = ucfg_disa_encrypt_decrypt_req(hdd_ctx->hdd_psoc,
387 &context->request,
388 hdd_encrypt_decrypt_msg_cb,
389 cookie);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530390
391 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
392 hdd_err("Unable to post encrypt/decrypt message");
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800393 ret = -EINVAL;
394 goto cleanup;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530395 }
396
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800397 ret = hdd_request_wait_for_response(request);
398 if (ret) {
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530399 hdd_err("Target response timed out");
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800400 goto cleanup;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530401 }
402
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800403 ret = context->status;
404 if (ret) {
405 hdd_err("Target response processing failed");
406 goto cleanup;
407 }
408
409 ret = hdd_post_encrypt_decrypt_msg_rsp(hdd_ctx, &context->response);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530410 if (ret)
411 hdd_err("Failed to post encrypt/decrypt message response");
412
Jeff Johnsonb915bae2017-01-30 13:40:00 -0800413cleanup:
414 hdd_request_put(request);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530415
416 EXIT();
417 return ret;
418}
419
420/**
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530421 * __wlan_hdd_cfg80211_encrypt_decrypt_msg () - Encrypt/Decrypt msg
422 * @wiphy: Pointer to wireless phy
423 * @wdev: Pointer to wireless device
424 * @data: Pointer to data
425 * @data_len: Data length
426 *
427 * Return: 0 on success, negative errno on failure
428 */
429static int __wlan_hdd_cfg80211_encrypt_decrypt_msg(struct wiphy *wiphy,
430 struct wireless_dev *wdev,
431 const void *data,
432 int data_len)
433{
Jeff Johnson2cd92112017-08-28 12:03:48 -0700434 struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530435 struct net_device *dev = wdev->netdev;
Jeff Johnsonc7f3ded2017-08-29 14:36:34 -0700436 struct hdd_adapter *adapter = NULL;
Padma, Santhosh Kumard7cc0792016-06-28 18:54:12 +0530437 int ret;
438
439 ENTER_DEV(dev);
440
441 ret = wlan_hdd_validate_context(hdd_ctx);
442 if (ret)
443 return ret;
444
445 adapter = WLAN_HDD_GET_PRIV_PTR(dev);
446
447 ret = hdd_encrypt_decrypt_msg(adapter, hdd_ctx, data, data_len);
448
449 return ret;
450}
451
452/**
453 * wlan_hdd_cfg80211_encrypt_decrypt_msg () - Encrypt/Decrypt msg
454 * @wiphy: Pointer to wireless phy
455 * @wdev: Pointer to wireless device
456 * @data: Pointer to data
457 * @data_len: Data length
458 *
459 * Return: 0 on success, negative errno on failure
460 */
461int wlan_hdd_cfg80211_encrypt_decrypt_msg(struct wiphy *wiphy,
462 struct wireless_dev *wdev,
463 const void *data,
464 int data_len)
465{
466 int ret;
467
468 cds_ssr_protect(__func__);
469 ret = __wlan_hdd_cfg80211_encrypt_decrypt_msg(wiphy, wdev,
470 data, data_len);
471 cds_ssr_unprotect(__func__);
472
473 return ret;
474}