blob: 9f36857b30226b3bc4e428eeecdf146de33d7a82 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Rajeev Kumar Sirasanagandla5b21a9c2018-01-08 17:05:11 +05302 * Copyright (c) 2012-2016, 2018 The Linux Foundation. All rights reserved.
Kiet Lam1ed83fc2014-02-19 01:15:45 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Jeff Johnson295189b2012-06-20 16:38:30 -070020 */
Kiet Lam1ed83fc2014-02-19 01:15:45 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Jeff Johnson295189b2012-06-20 16:38:30 -070028/*============================================================================
29 FILE: vos_utils.c
30
31 OVERVIEW: This source file contains definitions for vOS crypto APIs
32 The four APIs mentioned in this file are used for
33 initializing, and de-initializing a crypto context, and
34 obtaining truly random data (for keys), as well as
35 SHA1 HMAC, and AES encrypt and decrypt routines.
36
37 The routines include:
38 vos_crypto_init() - Initializes Crypto module
39 vos_crypto_deinit() - De-initializes Crypto module
40 vos_rand_get_bytes() - Generates random byte
41 vos_sha1_hmac_str() - Generate the HMAC-SHA1 of a string given a key
42 vos_encrypt_AES() - Generate AES Encrypted byte stream
43 vos_decrypt_AES() - Decrypts an AES Encrypted byte stream
44
45 DEPENDENCIES:
46
Jeff Johnson295189b2012-06-20 16:38:30 -070047============================================================================*/
48
49/*============================================================================
50 EDIT HISTORY FOR MODULE
51
52============================================================================*/
53
54/*----------------------------------------------------------------------------
55 * Include Files
56 * -------------------------------------------------------------------------*/
57
58#include "vos_trace.h"
59#include "vos_utils.h"
60#include "vos_memory.h"
Hardik Kantilal Patel8c2d5232015-01-08 00:31:38 +053061#include <linux/wcnss_wlan.h>
Jeff Johnson295189b2012-06-20 16:38:30 -070062
63#include <linux/err.h>
64#include <linux/random.h>
65#include <linux/crypto.h>
66#include <linux/scatterlist.h>
67#include <linux/completion.h>
Girish Gowlifb0bfd32015-01-13 11:42:11 +053068#include <linux/vmalloc.h>
Jeff Johnson295189b2012-06-20 16:38:30 -070069#include <crypto/hash.h>
Abhishek Singh888420b2016-01-06 12:28:03 +053070#include "vos_diag_core_event.h"
71
Jeff Johnson295189b2012-06-20 16:38:30 -070072
73/*----------------------------------------------------------------------------
74 * Preprocessor Definitions and Constants
75 * -------------------------------------------------------------------------*/
76
77/*----------------------------------------------------------------------------
78 * Type Declarations
79 * -------------------------------------------------------------------------*/
80/*----------------------------------------------------------------------------
81 * Global Data Definitions
82 * -------------------------------------------------------------------------*/
Rajeev Kumar Sirasanagandla5b21a9c2018-01-08 17:05:11 +053083
84#if (LINUX_VERSION_CODE <= KERNEL_VERSION(3,19,0)) || \
85 defined(WLAN_BTAMP_FEATURE)
Jeff Johnson295189b2012-06-20 16:38:30 -070086extern struct crypto_ahash *wcnss_wlan_crypto_alloc_ahash(const char *alg_name,
87 unsigned int type,
88 unsigned int mask);
Jeff Johnson295189b2012-06-20 16:38:30 -070089extern int wcnss_wlan_crypto_ahash_digest(struct ahash_request *req);
90extern void wcnss_wlan_crypto_free_ahash(struct crypto_ahash *tfm);
91extern int wcnss_wlan_crypto_ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
92 unsigned int keylen);
93extern struct crypto_ablkcipher *wcnss_wlan_crypto_alloc_ablkcipher(const char *alg_name,
94 u32 type, u32 mask);
Jeff Johnson295189b2012-06-20 16:38:30 -070095extern void wcnss_wlan_crypto_free_ablkcipher(struct crypto_ablkcipher *tfm);
Rajeev Kumar Sirasanagandla5b21a9c2018-01-08 17:05:11 +053096extern void wcnss_wlan_ablkcipher_request_free(struct ablkcipher_request *req);
Jeff Johnson295189b2012-06-20 16:38:30 -070097
98/*----------------------------------------------------------------------------
99 * Static Variable Definitions
100 * -------------------------------------------------------------------------*/
101
102/*----------------------------------------------------------------------------
103 Function Definitions and Documentation
104 * -------------------------------------------------------------------------*/
105
106/*--------------------------------------------------------------------------
107
108 \brief vos_crypto_init() - Initializes Crypto module
109
110 The vos_crypto_init() function initializes Crypto module.
111
112 \param phCryptProv - pointer to the Crypt handle
113
114 \return VOS_STATUS_SUCCESS - Successfully generated random memory.
115
116 VOS_STATUS_E_FAULT - pbBuf is an invalid pointer.
117
118 VOS_STATUS_E_FAILURE - default return value if it fails due to
119 unknown reasons
120
121 ***VOS_STATUS_E_RESOURCES - System resources (other than memory)
122 are unavailable
123 \sa
124
125 ( *** return value not considered yet )
126 --------------------------------------------------------------------------*/
127VOS_STATUS vos_crypto_init( v_U32_t *phCryptProv )
128{
129 VOS_STATUS uResult = VOS_STATUS_E_FAILURE;
130
131 // This implementation doesn't require a crypto context
Jeff Johnson8d09bfb2013-12-27 15:01:38 -0800132 *phCryptProv = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700133 uResult = VOS_STATUS_SUCCESS;
134 return ( uResult );
135}
136
137VOS_STATUS vos_crypto_deinit( v_U32_t hCryptProv )
138{
139 VOS_STATUS uResult = VOS_STATUS_E_FAILURE;
140
141 // CryptReleaseContext succeeded
142 uResult = VOS_STATUS_SUCCESS;
143
144 return ( uResult );
145}
146
Rajeev Kumar Sirasanagandla5b21a9c2018-01-08 17:05:11 +0530147#endif
148
Jeff Johnson295189b2012-06-20 16:38:30 -0700149/*--------------------------------------------------------------------------
150
151 \brief vos_rand_get_bytes() - Generates random byte
152
153 The vos_rand_get_bytes() function generate random bytes.
154
155 Buffer should be allocated before calling vos_rand_get_bytes().
156
157 Attempting to initialize an already initialized lock results in
158 a failure.
159
160 \param lock - pointer to the opaque lock object to initialize
161
162 \return VOS_STATUS_SUCCESS - Successfully generated random memory.
163
164 VOS_STATUS_E_FAULT - pbBuf is an invalid pointer.
165
166 VOS_STATUS_E_FAILURE - default return value if it fails due to
167 unknown reasons
168
169 ***VOS_STATUS_E_RESOURCES - System resources (other than memory)
170 are unavailable
171 \sa
172
173 ( *** return value not considered yet )
174 --------------------------------------------------------------------------*/
175VOS_STATUS vos_rand_get_bytes( v_U32_t cryptHandle, v_U8_t *pbBuf, v_U32_t numBytes )
176{
177 VOS_STATUS uResult = VOS_STATUS_E_FAILURE;
178 //v_UINT_t uCode;
179// HCRYPTPROV hCryptProv = (HCRYPTPROV) cryptHandle;
180
181 //check for invalid pointer
182 if ( NULL == pbBuf )
183 {
184 uResult = VOS_STATUS_E_FAULT;
185 return ( uResult );
186 }
187
188//#if 0
189 // get_random_bytes() is a void procedure
190 get_random_bytes( pbBuf, numBytes);
191 // "Random sequence generated."
192 uResult = VOS_STATUS_SUCCESS;
193//#endif
194
195 return ( uResult );
196}
197
198
Rajeev Kumar Sirasanagandla5b21a9c2018-01-08 17:05:11 +0530199#if (LINUX_VERSION_CODE <= KERNEL_VERSION(3,19,0)) || \
200 defined(WLAN_BTAMP_FEATURE)
Jeff Johnson295189b2012-06-20 16:38:30 -0700201/**
202 * vos_sha1_hmac_str
203 *
204 * FUNCTION:
205 * Generate the HMAC-SHA1 of a string given a key.
206 *
207 * LOGIC:
208 * Standard HMAC processing from RFC 2104. The code is provided in the
209 * appendix of the RFC.
210 *
211 * ASSUMPTIONS:
212 * The RFC is correct.
213 *
214 * @param text text to be hashed
215 * @param textLen length of text
216 * @param key key to use for HMAC
217 * @param keyLen length of key
218 * @param digest holds resultant SHA1 HMAC (20B)
219 *
220 * @return VOS_STATUS_SUCCSS if the operation succeeds
221 *
222 */
223
224struct hmac_sha1_result {
225 struct completion completion;
226 int err;
227};
228
229static void hmac_sha1_complete(struct crypto_async_request *req, int err)
230{
231 struct hmac_sha1_result *r = req->data;
232 if (err == -EINPROGRESS)
233 return;
234 r->err = err;
235 complete(&r->completion);
236}
237
238int hmac_sha1(v_U8_t *key, v_U8_t ksize, char *plaintext, v_U8_t psize,
239 v_U8_t *output, v_U8_t outlen)
240{
241 int ret = 0;
242 struct crypto_ahash *tfm;
243 struct scatterlist sg;
244 struct ahash_request *req;
245 struct hmac_sha1_result tresult;
246 void *hash_buff = NULL;
247
248 unsigned char hash_result[64];
249 int i;
250
251 memset(output, 0, outlen);
252
253 init_completion(&tresult.completion);
254
255 tfm = wcnss_wlan_crypto_alloc_ahash("hmac(sha1)", CRYPTO_ALG_TYPE_AHASH,
256 CRYPTO_ALG_TYPE_AHASH_MASK);
257 if (IS_ERR(tfm)) {
258 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_alloc_ahash failed");
259 ret = PTR_ERR(tfm);
260 goto err_tfm;
261 }
262
263 req = ahash_request_alloc(tfm, GFP_KERNEL);
264 if (!req) {
265 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "failed to allocate request for hmac(sha1)");
266 ret = -ENOMEM;
267 goto err_req;
268 }
269
270 ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
271 hmac_sha1_complete, &tresult);
272
273 hash_buff = kzalloc(psize, GFP_KERNEL);
274 if (!hash_buff) {
275 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "failed to kzalloc hash_buff");
276 ret = -ENOMEM;
277 goto err_hash_buf;
278 }
279
280 memset(hash_result, 0, 64);
Rajesh Babu Prathipatiddbe2892014-07-01 18:57:16 +0530281 vos_mem_copy(hash_buff, plaintext, psize);
Jeff Johnson295189b2012-06-20 16:38:30 -0700282 sg_init_one(&sg, hash_buff, psize);
283
284 if (ksize) {
285 crypto_ahash_clear_flags(tfm, ~0);
286 ret = wcnss_wlan_crypto_ahash_setkey(tfm, key, ksize);
287
288 if (ret) {
289 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_ahash_setkey failed");
290 goto err_setkey;
291 }
292 }
293
294 ahash_request_set_crypt(req, &sg, hash_result, psize);
295 ret = wcnss_wlan_crypto_ahash_digest(req);
296
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +0530297 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "ret 0x%x", ret);
Jeff Johnson295189b2012-06-20 16:38:30 -0700298
299 switch (ret) {
300 case 0:
301 for (i=0; i< outlen; i++)
302 output[i] = hash_result[i];
303 break;
304 case -EINPROGRESS:
305 case -EBUSY:
306 ret = wait_for_completion_interruptible(&tresult.completion);
307 if (!ret && !tresult.err) {
Sachin Ahuja4f06a792014-12-04 18:14:32 +0530308 for (i=0; i< outlen; i++)
309 output[i] = hash_result[i];
Jeff Johnson295189b2012-06-20 16:38:30 -0700310 INIT_COMPLETION(tresult.completion);
311 break;
312 } else {
313 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "wait_for_completion_interruptible failed");
314 if (!ret)
315 ret = tresult.err;
316 goto out;
317 }
318 default:
319 goto out;
320 }
321
322out:
323err_setkey:
324 kfree(hash_buff);
325err_hash_buf:
326 ahash_request_free(req);
327err_req:
328 wcnss_wlan_crypto_free_ahash(tfm);
329err_tfm:
330 return ret;
331}
332
333VOS_STATUS vos_sha1_hmac_str(v_U32_t cryptHandle, /* Handle */
334 v_U8_t *pText, /* pointer to data stream */
335 v_U32_t textLen, /* length of data stream */
336 v_U8_t *pKey, /* pointer to authentication key */
337 v_U32_t keyLen, /* length of authentication key */
338 v_U8_t digest[VOS_DIGEST_SHA1_SIZE])/* caller digest to be filled in */
339{
340 int ret = 0;
341
342 ret = hmac_sha1(
343 pKey, //v_U8_t *key,
344 (v_U8_t) keyLen, //v_U8_t ksize,
345 (char *)pText, //char *plaintext,
346 (v_U8_t) textLen, //v_U8_t psize,
347 digest, //v_U8_t *output,
348 VOS_DIGEST_SHA1_SIZE //v_U8_t outlen
349 );
350
351 if (ret != 0) {
352 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR,"hmac_sha1() call failed");
353 return VOS_STATUS_E_FAULT;
354 }
355
356 return VOS_STATUS_SUCCESS;
357}
358
359/**
360 * vos_md5_hmac_str
361 *
362 * FUNCTION:
363 * Generate the HMAC-MD5 of a string given a key.
364 *
365 * LOGIC:
366 * Standard HMAC processing from RFC 2104. The code is provided in the
367 * appendix of the RFC.
368 *
369 * ASSUMPTIONS:
370 * The RFC is correct.
371 *
372 * @param text text to be hashed
373 * @param textLen length of text
374 * @param key key to use for HMAC
375 * @param keyLen length of key
376 * @param digest holds resultant MD5 HMAC (20B)
377 *
378 * @return VOS_STATUS_SUCCSS if the operation succeeds
379 *
380 */
381struct hmac_md5_result {
382 struct completion completion;
383 int err;
384};
385
386static void hmac_md5_complete(struct crypto_async_request *req, int err)
387{
388 struct hmac_md5_result *r = req->data;
389 if (err == -EINPROGRESS)
390 return;
391 r->err = err;
392 complete(&r->completion);
393}
394
395int hmac_md5(v_U8_t *key, v_U8_t ksize, char *plaintext, v_U8_t psize,
396 v_U8_t *output, v_U8_t outlen)
397{
398 int ret = 0;
399 struct crypto_ahash *tfm;
400 struct scatterlist sg;
401 struct ahash_request *req;
Yue Mad8cac142013-03-28 11:33:46 -0700402 struct hmac_md5_result tresult = {.err = 0};
Jeff Johnson295189b2012-06-20 16:38:30 -0700403 void *hash_buff = NULL;
404
405 unsigned char hash_result[64];
406 int i;
407
408 memset(output, 0, outlen);
409
410 init_completion(&tresult.completion);
411
412 tfm = wcnss_wlan_crypto_alloc_ahash("hmac(md5)", CRYPTO_ALG_TYPE_AHASH,
413 CRYPTO_ALG_TYPE_AHASH_MASK);
414 if (IS_ERR(tfm)) {
415 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_alloc_ahash failed");
416 ret = PTR_ERR(tfm);
417 goto err_tfm;
418 }
419
420 req = ahash_request_alloc(tfm, GFP_KERNEL);
421 if (!req) {
422 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "failed to allocate request for hmac(md5)");
423 ret = -ENOMEM;
424 goto err_req;
425 }
426
427 ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
428 hmac_md5_complete, &tresult);
429
430 hash_buff = kzalloc(psize, GFP_KERNEL);
431 if (!hash_buff) {
432 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "failed to kzalloc hash_buff");
433 ret = -ENOMEM;
434 goto err_hash_buf;
435 }
436
437 memset(hash_result, 0, 64);
Rajesh Babu Prathipatiddbe2892014-07-01 18:57:16 +0530438 vos_mem_copy(hash_buff, plaintext, psize);
Jeff Johnson295189b2012-06-20 16:38:30 -0700439 sg_init_one(&sg, hash_buff, psize);
440
441 if (ksize) {
442 crypto_ahash_clear_flags(tfm, ~0);
443 ret = wcnss_wlan_crypto_ahash_setkey(tfm, key, ksize);
444
445 if (ret) {
446 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_ahash_setkey failed");
447 goto err_setkey;
448 }
449 }
450
451 ahash_request_set_crypt(req, &sg, hash_result, psize);
452 ret = wcnss_wlan_crypto_ahash_digest(req);
453
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +0530454 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "ret 0x%x", ret);
Jeff Johnson295189b2012-06-20 16:38:30 -0700455
456 switch (ret) {
457 case 0:
458 for (i=0; i< outlen; i++)
459 output[i] = hash_result[i];
460 break;
461 case -EINPROGRESS:
462 case -EBUSY:
463 ret = wait_for_completion_interruptible(&tresult.completion);
464 if (!ret && !tresult.err) {
Sachin Ahuja4f06a792014-12-04 18:14:32 +0530465 for (i=0; i< outlen; i++)
466 output[i] = hash_result[i];
467 INIT_COMPLETION(tresult.completion);
468 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700469 } else {
470 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "wait_for_completion_interruptible failed");
471 if (!ret)
472 ret = tresult.err;
473 goto out;
474 }
475 default:
476 goto out;
477 }
478
479out:
480err_setkey:
481 kfree(hash_buff);
482err_hash_buf:
483 ahash_request_free(req);
484err_req:
485 wcnss_wlan_crypto_free_ahash(tfm);
486err_tfm:
487 return ret;
488}
489
490VOS_STATUS vos_md5_hmac_str(v_U32_t cryptHandle, /* Handle */
491 v_U8_t *pText, /* pointer to data stream */
492 v_U32_t textLen, /* length of data stream */
493 v_U8_t *pKey, /* pointer to authentication key */
494 v_U32_t keyLen, /* length of authentication key */
495 v_U8_t digest[VOS_DIGEST_MD5_SIZE])/* caller digest to be filled in */
496{
497 int ret = 0;
498
499 ret = hmac_md5(
500 pKey, //v_U8_t *key,
501 (v_U8_t) keyLen, //v_U8_t ksize,
502 (char *)pText, //char *plaintext,
503 (v_U8_t) textLen, //v_U8_t psize,
504 digest, //v_U8_t *output,
505 VOS_DIGEST_MD5_SIZE //v_U8_t outlen
506 );
507
508 if (ret != 0) {
509 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR,"hmac_md5() call failed");
510 return VOS_STATUS_E_FAULT;
511 }
512
513 return VOS_STATUS_SUCCESS;
514}
515
516
517struct ecb_aes_result {
518 struct completion completion;
519 int err;
520};
521
522static void ecb_aes_complete(struct crypto_async_request *req, int err)
523{
524 struct ecb_aes_result *r = req->data;
525 if (err == -EINPROGRESS)
526 return;
527 r->err = err;
528 complete(&r->completion);
529}
530
531
532/*--------------------------------------------------------------------------
533
534 \brief vos_encrypt_AES() - Generate AES Encrypted byte stream
535
536 The vos_encrypt_AES() function generates the encrypted byte stream for given text.
537
538 Buffer should be allocated before calling vos_rand_get_bytes().
539
540 Attempting to initialize an already initialized lock results in
541 a failure.
542
543 \param lock - pointer to the opaque lock object to initialize
544
545 \return VOS_STATUS_SUCCESS - Successfully generated random memory.
546
547 VOS_STATUS_E_FAULT - pbBuf is an invalid pointer.
548
549 VOS_STATUS_E_FAILURE - default return value if it fails due to
550 unknown reasons
551
552 ***VOS_STATUS_E_RESOURCES - System resources (other than memory)
553 are unavailable
554 \sa
555
556 ( *** return value not considered yet )
557 --------------------------------------------------------------------------*/
558
559#define IV_SIZE_AES_128 16
560#define KEY_SIZE_AES_128 16
561#define AES_BLOCK_SIZE 16
562
563VOS_STATUS vos_encrypt_AES(v_U32_t cryptHandle, /* Handle */
564 v_U8_t *pPlainText, /* pointer to data stream */
565 v_U8_t *pCiphertext,
566 v_U8_t *pKey) /* pointer to authentication key */
567{
568// VOS_STATUS uResult = VOS_STATUS_E_FAILURE;
569 struct ecb_aes_result result;
570 struct ablkcipher_request *req;
571 struct crypto_ablkcipher *tfm;
572 int ret = 0;
573 char iv[IV_SIZE_AES_128];
574 struct scatterlist sg_in;
575 struct scatterlist sg_out;
576
577 init_completion(&result.completion);
578
579 tfm = wcnss_wlan_crypto_alloc_ablkcipher( "cbc(aes)", 0, 0);
580 if (IS_ERR(tfm)) {
581 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_alloc_ablkcipher failed");
582 ret = PTR_ERR(tfm);
583 goto err_tfm;
584 }
585
586 req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
587 if (!req) {
588 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "Failed to allocate request for cbc(aes)");
589 ret = -ENOMEM;
590 goto err_req;
591 }
592
593 ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
594 ecb_aes_complete, &result);
595
596
597 crypto_ablkcipher_clear_flags(tfm, ~0);
598
599 ret = crypto_ablkcipher_setkey(tfm, pKey, KEY_SIZE_AES_128);
600 if (ret) {
601 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_cipher_setkey failed");
602 goto err_setkey;
603 }
604
605 memset(iv, 0, IV_SIZE_AES_128);
606
607 sg_init_one(&sg_in, pPlainText, AES_BLOCK_SIZE);
608
609 sg_init_one(&sg_out, pCiphertext, AES_BLOCK_SIZE);
610
611 ablkcipher_request_set_crypt(req, &sg_in, &sg_out, AES_BLOCK_SIZE, iv);
612
613 crypto_ablkcipher_encrypt(req);
614
615
616
617// -------------------------------------
618err_setkey:
619 wcnss_wlan_ablkcipher_request_free(req);
620err_req:
621 wcnss_wlan_crypto_free_ablkcipher(tfm);
622err_tfm:
623 //return ret;
624 if (ret != 0) {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700625 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR,"%s() call failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700626 return VOS_STATUS_E_FAULT;
627 }
628
629 return VOS_STATUS_SUCCESS;
630}
631
632/*--------------------------------------------------------------------------
633
634 \brief vos_decrypt_AES() - Decrypts an AES Encrypted byte stream
635
636 The vos_decrypt_AES() function decrypts the encrypted byte stream.
637
638 Buffer should be allocated before calling vos_rand_get_bytes().
639
640 Attempting to initialize an already initialized lock results in
641 a failure.
642
643 \param lock - pointer to the opaque lock object to initialize
644
645 \return VOS_STATUS_SUCCESS - Successfully generated random memory.
646
647 VOS_STATUS_E_FAULT - pbBuf is an invalid pointer.
648
649 VOS_STATUS_E_FAILURE - default return value if it fails due to
650 unknown reasons
651
652 ***VOS_STATUS_E_RESOURCES - System resources (other than memory)
653 are unavailable
654 \sa
655
656 ( *** return value not considered yet )
657 --------------------------------------------------------------------------*/
658
659VOS_STATUS vos_decrypt_AES(v_U32_t cryptHandle, /* Handle */
660 v_U8_t *pText, /* pointer to data stream */
661 v_U8_t *pDecrypted,
662 v_U8_t *pKey) /* pointer to authentication key */
663{
664// VOS_STATUS uResult = VOS_STATUS_E_FAILURE;
665 struct ecb_aes_result result;
666 struct ablkcipher_request *req;
667 struct crypto_ablkcipher *tfm;
668 int ret = 0;
669 char iv[IV_SIZE_AES_128];
670 struct scatterlist sg_in;
671 struct scatterlist sg_out;
672
673 init_completion(&result.completion);
674
675 tfm = wcnss_wlan_crypto_alloc_ablkcipher( "cbc(aes)", 0, 0);
676 if (IS_ERR(tfm)) {
677 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_alloc_ablkcipher failed");
678 ret = PTR_ERR(tfm);
679 goto err_tfm;
680 }
681
682 req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
683 if (!req) {
684 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "Failed to allocate request for cbc(aes)");
685 ret = -ENOMEM;
686 goto err_req;
687 }
688
689 ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
690 ecb_aes_complete, &result);
691
692
693 crypto_ablkcipher_clear_flags(tfm, ~0);
694
695 ret = crypto_ablkcipher_setkey(tfm, pKey, KEY_SIZE_AES_128);
696 if (ret) {
697 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_cipher_setkey failed");
698 goto err_setkey;
699 }
700
701 memset(iv, 0, IV_SIZE_AES_128);
702
703 sg_init_one(&sg_in, pText, AES_BLOCK_SIZE);
704
705 sg_init_one(&sg_out, pDecrypted, AES_BLOCK_SIZE);
706
707 ablkcipher_request_set_crypt(req, &sg_in, &sg_out, AES_BLOCK_SIZE, iv);
708
709 crypto_ablkcipher_decrypt(req);
710
711
712
713// -------------------------------------
714err_setkey:
715 wcnss_wlan_ablkcipher_request_free(req);
716err_req:
717 wcnss_wlan_crypto_free_ablkcipher(tfm);
718err_tfm:
719 //return ret;
720 if (ret != 0) {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700721 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR,"%s() call failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700722 return VOS_STATUS_E_FAULT;
723 }
724
725 return VOS_STATUS_SUCCESS;
726}
Abhishek Singhe3fa11f2014-05-13 11:11:10 +0530727
Rajeev Kumar Sirasanagandla5b21a9c2018-01-08 17:05:11 +0530728#endif
729
Abhishek Singhe3fa11f2014-05-13 11:11:10 +0530730v_U8_t vos_chan_to_band(v_U32_t chan)
731{
732 if (chan <= VOS_24_GHZ_CHANNEL_14)
733 return VOS_BAND_2GHZ;
734
735 return VOS_BAND_5GHZ;
736}
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530737
Hardik Kantilal Patel8c2d5232015-01-08 00:31:38 +0530738void vos_get_wlan_unsafe_channel(v_U16_t *unsafeChannelList,
739 v_U16_t buffer_size, v_U16_t *unsafeChannelCount)
740{
741 /* Get unsafe channel list from cached location */
742 wcnss_get_wlan_unsafe_channel(unsafeChannelList, buffer_size,
743 unsafeChannelCount);
744}
745
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530746
747#include <linux/skbuff.h>
748#include "vos_timer.h"
749#include "i_vos_packet.h"
750
751#define MAC_ADDR_ARRAY(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
752#define MAC_ADDRESS_STR "%02x:%02x:%02x:%02x:%02x:%02x"
753#define DXE_DATA_MAGIC_NO 0x010
754#define DXE_MGMT_MAGIC_NO 0x011
755
756//Define gRoamDelayMetaInfo
757tRoamDelayMetaInfo gRoamDelayMetaInfo = {0};
Girish Gowlifb0bfd32015-01-13 11:42:11 +0530758tRoamDelayMetaInfo *gpRoamDelayTable = NULL;
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530759v_BOOL_t gRoamDelayCurrentIndex = 0;
760
761#define VOS_ETHERTYPE_802_1_X ( 0x888E )
762#define VOS_ETHERTYPE_802_1_X_SIZE ( 2 )
763//802.3 frame header have SRC MAC (6), DST(6),next will PROTOCOL type
764#define VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_3_PKT ( 12 )
765
766//802.11 header wil have 26 byte (Inculding QoS Info)
767//8Byte LLC / SNAP header in which last two byte will be PROTOCOL type
768//So offset will 32 if it is QoS data pkt else it will be 30
769#define VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_11_PKT ( 32 )
770#define VOS_QOS_DATA_VALUE ( 0x88 )
771#define VOS_NON_QOS_DATA_VALUE ( 0x80 )
772
Sushant Kaushik33200572015-08-05 16:46:20 +0530773//802.11 header wil have 24 byte excluding qos
774#define VOS_802_11_HEADER_SIZE ( 24 )
775#define VOS_QOS_SIZE ( 2 )
776#define VOS_LLC_HEADER_SIZE (8)
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +0530777#define VOS_IP_HEADER_SIZE (20)
778#define VOS_TCP_MIN_HEADER_SIZE (20)
779#define VOS_DEF_PKT_STATS_LEN_TO_COPY \
780 (VOS_802_11_HEADER_SIZE + VOS_LLC_HEADER_SIZE \
781 + VOS_IP_HEADER_SIZE + VOS_TCP_MIN_HEADER_SIZE)
782// DHCP Port number
783#define VOS_DHCP_SOURCE_PORT 0x4400
784#define VOS_DHCP_DESTINATION_PORT 0x4300
785
786
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530787
788// Frame Type definitions
789#define VOS_MAC_MGMT_FRAME 0x0
790#define VOS_MAC_CTRL_FRAME 0x1
791#define VOS_MAC_DATA_FRAME 0x2
792
793#define MONITOR_STOP 0x0
794#define MONITOR_START 0x1
795#define MONITOR_EAPOL_DONE 0x2
796#define MONITOR_FIRST_DATA_DONE 0x4
797
798v_BOOL_t vos_skb_is_eapol(struct sk_buff *skb,
799 v_SIZE_t pktOffset,
800 v_SIZE_t numBytes)
801{
802 void *pBuffer = NULL;
803 v_BOOL_t fEAPOL = VOS_FALSE;
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +0530804
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530805 // Validate the skb
806 if (unlikely(NULL == skb))
807 {
808 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
809 "vos_skb_is_eapol [%d]: NULL skb", __LINE__);
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +0530810 return VOS_FALSE;
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530811 }
812 // check for overflow
813 if (unlikely((pktOffset + numBytes) > skb->len))
814 {
815 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
816 "vos_skb_is_eapol [%d]: Packet overflow, offset %d size %d len %d",
817 __LINE__, pktOffset, numBytes, skb->len);
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +0530818 return VOS_FALSE;
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530819 }
820 //check for the Qos Data, if Offset length is more 12.
821 //it means it will 802.11 header skb
822 if((pktOffset > VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_3_PKT)
823 && (skb->data[0] == VOS_NON_QOS_DATA_VALUE))
824 {
825 // reduced 2 byte of Qos ctrl field in DOT11 header
826 pktOffset = pktOffset - 2;
827 }
828 pBuffer = &skb->data[pktOffset];
829 if (pBuffer && vos_be16_to_cpu( *(unsigned short*)pBuffer ) == VOS_ETHERTYPE_802_1_X )
830 {
831 fEAPOL = VOS_TRUE;
832 }
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530833 return fEAPOL;
834}
835
Girish Gowlifb0bfd32015-01-13 11:42:11 +0530836v_BOOL_t vos_roam_delay_stats_init(void)
837{
838 if (gpRoamDelayTable == NULL)
839 {
840 gpRoamDelayTable = vmalloc(sizeof(tRoamDelayMetaInfo) * ROAM_DELAY_TABLE_SIZE);
841 if (gpRoamDelayTable == NULL)
842 {
843 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "Memory allocation failed");
844 return VOS_FALSE;
845 }
846 }
847 else
848 {
849 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO, "Memory is already allocated");
850 return VOS_FALSE;
851 }
852
853 return VOS_TRUE;
854}
855
856
857v_BOOL_t vos_roam_delay_stats_deinit(void)
858{
859 if (gpRoamDelayTable != NULL)
860 {
861 vfree(gpRoamDelayTable);
862 gpRoamDelayTable = NULL;
863 }
864 else
865 {
866 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO, "Memory is already freed");
867 return VOS_FALSE;
868 }
869
870 return VOS_TRUE;
871}
872
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530873void vos_record_roam_event(enum e_roaming_event roam_event, void *pBuff, v_ULONG_t buff_len)
874{
Girish Gowlifb0bfd32015-01-13 11:42:11 +0530875 if (gpRoamDelayTable == NULL)
876 {
877 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
878 "Roam delay table is not initialized\n");
879 return;
880 }
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530881 switch(roam_event)
882 {
883 case e_HDD_DISABLE_TX_QUEUE:
884 gRoamDelayMetaInfo.hdd_monitor_tx = MONITOR_STOP;
885 gRoamDelayMetaInfo.disable_tx_queues_time = vos_timer_get_system_time();
886 break;
887 case e_SME_PREAUTH_REASSOC_START:
888 gRoamDelayMetaInfo.preauth_reassoc_start_time = vos_timer_get_system_time();
889 break;
890 case e_SME_PREAUTH_CALLBACK_HIT:
891 gRoamDelayMetaInfo.preauth_cb_time = vos_timer_get_system_time();
892 break;
893 case e_SME_ISSUE_REASSOC_REQ:
894 gRoamDelayMetaInfo.issue_reassoc_req_time = vos_timer_get_system_time();
895 //HACK buff len will carry the AuthType
896 gRoamDelayMetaInfo.hdd_auth_type = buff_len;
897 break;
898 case e_LIM_SEND_REASSOC_REQ:
899 gRoamDelayMetaInfo.send_reassoc_req_time = vos_timer_get_system_time();
900 //we can enable the rx eapol monitoring ASAP we send the REASSOC REQ Because
901 //there is very less delay in between REASSOC RSP and M1 Sent by the AP
902 gRoamDelayMetaInfo.hdd_monitor_rx = MONITOR_START;
903 gRoamDelayMetaInfo.dxe_monitor_rx = MONITOR_START;
904 break;
905 case e_CACHE_ROAM_PEER_MAC:
906 vos_mem_copy(&gRoamDelayMetaInfo.peer_mac_addr, pBuff, buff_len);
907 break;
908 case e_HDD_SEND_REASSOC_RSP:
909 gRoamDelayMetaInfo.hdd_sendassoc_rsp_time = vos_timer_get_system_time();
910 break;
911 case e_SME_DISASSOC_ISSUE:
912 gRoamDelayMetaInfo.disassoc_issue_time = vos_timer_get_system_time();
913 break;
914 case e_SME_DISASSOC_COMPLETE:
915 gRoamDelayMetaInfo.disassoc_comp_time = vos_timer_get_system_time();
916 break;
917 case e_LIM_ADD_BS_REQ:
918 gRoamDelayMetaInfo.lim_add_bss_req_time = vos_timer_get_system_time();
919 break;
920 case e_LIM_ADD_BS_RSP:
921 gRoamDelayMetaInfo.lim_add_bss_rsp_time = vos_timer_get_system_time();
922 break;
923 case e_HDD_ENABLE_TX_QUEUE:
924 gRoamDelayMetaInfo.hdd_monitor_tx = MONITOR_START;
925 gRoamDelayMetaInfo.enable_tx_queues_reassoc_time = vos_timer_get_system_time();
926 break;
927 case e_HDD_SET_PTK_REQ:
928 gRoamDelayMetaInfo.set_ptk_roam_key_time = vos_timer_get_system_time();
929 break;
930 case e_HDD_SET_GTK_REQ:
931 gRoamDelayMetaInfo.set_gtk_roam_key_time = vos_timer_get_system_time();
932 break;
933 case e_HDD_SET_PTK_RSP:
934 gRoamDelayMetaInfo.complete_ptk_roam_key_time = vos_timer_get_system_time();
935 //vos_mem_copy(&gRoamDelayMetaInfo.peer_mac_addr, pBuff, buff_len);
936 break;
937 case e_HDD_SET_GTK_RSP:
938 gRoamDelayMetaInfo.complete_gtk_roam_key_time = vos_timer_get_system_time();
939 break;
940 case e_TL_FIRST_XMIT_TIME:
941 if(gRoamDelayMetaInfo.log_tl)
942 {
943 gRoamDelayMetaInfo.tl_fetch_pkt_time = vos_timer_get_system_time();
944 gRoamDelayMetaInfo.log_tl = VOS_FALSE;
945 }
946 break;
947 case e_HDD_FIRST_XMIT_TIME:
948 if(gRoamDelayMetaInfo.hdd_monitor_tx != MONITOR_STOP)
949 {
950 struct sk_buff *skb = (struct sk_buff *)pBuff;
951 if(!skb)
952 {
953 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
954 "event e_HDD_FIRST_XMIT_TIME skb is null");
955 return;
956 }
957 if((gRoamDelayMetaInfo.hdd_auth_type == eVOS_AUTH_TYPE_RSN_PSK) ||
958 (gRoamDelayMetaInfo.hdd_auth_type == eVOS_AUTH_TYPE_WPA_PSK))
959 {
960 //Hdd xmit will have only 802.3 pkt so offset will pass as accordingly
961 if(vos_skb_is_eapol(skb, VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_3_PKT,
962 VOS_ETHERTYPE_802_1_X_SIZE) == VOS_TRUE)
963 {
964 if(gRoamDelayMetaInfo.hdd_eapol_m2 == 0)
965 {
Girish Gowli1702d212014-12-24 15:31:07 +0530966 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"HDD XMIT m2");
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530967 gRoamDelayMetaInfo.hdd_eapol_m2 = vos_timer_get_system_time();
968 gRoamDelayMetaInfo.dxe_monitor_tx = MONITOR_START;
969 }
970 else if((gRoamDelayMetaInfo.hdd_eapol_m2) && (gRoamDelayMetaInfo.hdd_eapol_m4 == 0))
971 {
972 gRoamDelayMetaInfo.hdd_eapol_m4 = vos_timer_get_system_time();
Girish Gowli1702d212014-12-24 15:31:07 +0530973 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"HDD XMIT m4");
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530974 gRoamDelayMetaInfo.hdd_monitor_tx = MONITOR_EAPOL_DONE;
975 //We should return from here so can cache the time for first data pkt
976 return;
977 }
978 }
979 }
980 else
981 {
982 gRoamDelayMetaInfo.hdd_monitor_tx = MONITOR_EAPOL_DONE;
983 gRoamDelayMetaInfo.dxe_monitor_tx = MONITOR_START;
984 }
985 //Eapol is done it must be first data frame capture it
986 if(gRoamDelayMetaInfo.hdd_monitor_tx == MONITOR_EAPOL_DONE)
987 {
988 gRoamDelayMetaInfo.hdd_first_pkt_len = 50;
989 gRoamDelayMetaInfo.hdd_first_xmit_time = vos_timer_get_system_time();
990 gRoamDelayMetaInfo.log_tl = VOS_TRUE;
991 gRoamDelayMetaInfo.hdd_monitor_tx = MONITOR_STOP;
992 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
993 "HDD %s XMIT first data frame after roaming", __func__);
994 if(skb->len < gRoamDelayMetaInfo.hdd_first_pkt_len)
995 gRoamDelayMetaInfo.hdd_first_pkt_len = skb->len;
996 vos_mem_copy(&gRoamDelayMetaInfo.hdd_first_pkt_data,
997 skb->data,gRoamDelayMetaInfo.hdd_first_pkt_len);
998 }
999 }
1000 break;
1001 case e_HDD_RX_PKT_CBK_TIME:
1002 if(gRoamDelayMetaInfo.hdd_monitor_rx != MONITOR_STOP)
1003 {
1004 struct sk_buff *skb = (struct sk_buff *)pBuff;
1005 if(!skb)
1006 {
1007 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1008 "event e_HDD_RX_PKT_CBK_TIME skb is null");
1009 return;
1010 }
1011 if((gRoamDelayMetaInfo.hdd_auth_type == eVOS_AUTH_TYPE_RSN_PSK) ||
1012 (gRoamDelayMetaInfo.hdd_auth_type == eVOS_AUTH_TYPE_WPA_PSK))
1013 {
1014 if(vos_skb_is_eapol(skb, VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_3_PKT,
1015 VOS_ETHERTYPE_802_1_X_SIZE) == VOS_TRUE)
1016 {
1017 if(gRoamDelayMetaInfo.hdd_eapol_m1 == 0)
1018 {
Girish Gowli1702d212014-12-24 15:31:07 +05301019 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"HDD recv m1");
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301020 gRoamDelayMetaInfo.hdd_eapol_m1 = vos_timer_get_system_time();
1021 }
1022 else if((gRoamDelayMetaInfo.hdd_eapol_m1) && (gRoamDelayMetaInfo.hdd_eapol_m3 == 0))
1023 {
1024 gRoamDelayMetaInfo.hdd_eapol_m3 = vos_timer_get_system_time();
Girish Gowli1702d212014-12-24 15:31:07 +05301025 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"HDD recv m3");
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301026 gRoamDelayMetaInfo.hdd_monitor_rx = MONITOR_EAPOL_DONE;
1027 }
1028 }
1029 }
1030 else
1031 {
1032 gRoamDelayMetaInfo.hdd_monitor_rx = MONITOR_EAPOL_DONE;
1033 }
1034 if(gRoamDelayMetaInfo.hdd_monitor_rx == MONITOR_EAPOL_DONE)
1035 {
1036 gRoamDelayMetaInfo.hdd_monitor_rx = MONITOR_STOP;
1037 }
1038 }
1039 break;
1040 case e_DXE_RX_PKT_TIME:
1041 if(gRoamDelayMetaInfo.dxe_monitor_rx != MONITOR_STOP)
1042 {
1043 vos_pkt_t *vos_pkt = NULL;
1044 struct sk_buff *skb = NULL;
1045 vos_pkt = (vos_pkt_t *)pBuff;
1046 if(!vos_pkt)
1047 {
1048 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1049 "event e_DXE_RX_PKT_TIME vos_pkt is null");
1050 return;
1051 }
1052 skb = vos_pkt->pSkb;
1053 if(!skb)
1054 {
1055 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1056 "event e_DXE_RX_PKT_TIME skb is null");
1057 return;
1058 }
1059 //DXE can RECV MGMT and DATA frame, we are interetsed in only DATA frame
1060 if(buff_len & VOS_MAC_DATA_FRAME)
1061 {
1062 if((gRoamDelayMetaInfo.hdd_auth_type == eVOS_AUTH_TYPE_RSN_PSK) ||
1063 (gRoamDelayMetaInfo.hdd_auth_type == eVOS_AUTH_TYPE_WPA_PSK))
1064 {
1065 if(vos_skb_is_eapol(skb, VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_11_PKT,
1066 VOS_ETHERTYPE_802_1_X_SIZE) == VOS_TRUE)
1067 {
1068 if(gRoamDelayMetaInfo.dxe_eapol_m1 == 0)
1069 {
Girish Gowli1702d212014-12-24 15:31:07 +05301070 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"DXE recv m1");
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301071 gRoamDelayMetaInfo.dxe_eapol_m1 = vos_timer_get_system_time();
1072 }
1073 else if((gRoamDelayMetaInfo.dxe_eapol_m1) && (gRoamDelayMetaInfo.dxe_eapol_m3 == 0))
1074 {
1075 gRoamDelayMetaInfo.dxe_eapol_m3 = vos_timer_get_system_time();
Girish Gowli1702d212014-12-24 15:31:07 +05301076 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"DXE recv m3");
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301077 gRoamDelayMetaInfo.dxe_monitor_rx = MONITOR_EAPOL_DONE;
1078 }
1079 }
1080 }
1081 else
1082 {
1083 gRoamDelayMetaInfo.dxe_monitor_rx = MONITOR_EAPOL_DONE;
1084 }
1085 if(gRoamDelayMetaInfo.dxe_monitor_rx == MONITOR_EAPOL_DONE)
1086 {
1087 gRoamDelayMetaInfo.dxe_monitor_rx = MONITOR_STOP;
1088 }
1089 }
1090 /*
1091 else
1092 {
1093 printk("e_DXE_RX_PKT_TIME dump mgmt frames");
1094 vos_trace_hex_dump( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, &skb->data[0], skb->len);
1095 }
1096 */
1097 }
1098 break;
1099 case e_DXE_FIRST_XMIT_TIME:
1100 if(gRoamDelayMetaInfo.dxe_monitor_tx != MONITOR_STOP)
1101 {
1102 vos_pkt_t *vos_pkt = NULL;
1103 struct sk_buff *skb = NULL;
1104 vos_pkt = (vos_pkt_t *)pBuff;
1105 if(!vos_pkt)
1106 {
1107 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1108 "event e_DXE_FIRST_XMIT_TIME vos_pkt is null");
1109 return;
1110 }
1111 skb = vos_pkt->pSkb;
1112 if(!skb)
1113 {
1114 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1115 "event e_DXE_FIRST_XMIT_TIME skb is null");
1116 return;
1117 }
1118 //DXE can Txmit MGMT and DATA frame, we are interetsed in only DATA frame
1119 if(buff_len & VOS_MAC_DATA_FRAME)
1120 {
1121 if((gRoamDelayMetaInfo.hdd_auth_type == eVOS_AUTH_TYPE_RSN_PSK) ||
1122 (gRoamDelayMetaInfo.hdd_auth_type == eVOS_AUTH_TYPE_WPA_PSK))
1123 {
1124 if(vos_skb_is_eapol(skb, VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_11_PKT,
1125 VOS_ETHERTYPE_802_1_X_SIZE) == VOS_TRUE)
1126 {
1127 if(gRoamDelayMetaInfo.dxe_eapol_m2 == 0)
1128 {
Girish Gowli1702d212014-12-24 15:31:07 +05301129 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"DXE XMIT m2");
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301130 gRoamDelayMetaInfo.dxe_eapol_m2 = vos_timer_get_system_time();
1131 }
1132 else if((gRoamDelayMetaInfo.dxe_eapol_m2) && (gRoamDelayMetaInfo.dxe_eapol_m4 == 0))
1133 {
1134 gRoamDelayMetaInfo.dxe_eapol_m4 = vos_timer_get_system_time();
Girish Gowli1702d212014-12-24 15:31:07 +05301135 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"DXE XMIT m4");
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301136 gRoamDelayMetaInfo.dxe_monitor_tx = MONITOR_EAPOL_DONE;
1137 //We should return from here so can cache the time for first data pkt
1138 return;
1139 }
1140 }
1141 }
1142 else
1143 {
1144 gRoamDelayMetaInfo.dxe_monitor_tx = MONITOR_EAPOL_DONE;
1145 }
1146 //HACK buff len is getting used as FRAME TYPE
1147 if(gRoamDelayMetaInfo.dxe_monitor_tx == MONITOR_EAPOL_DONE)
1148 {
1149 gRoamDelayMetaInfo.dxe_first_tx_time = vos_timer_get_system_time();
1150 gRoamDelayMetaInfo.dxe_monitor_tx = MONITOR_STOP;
1151 gRoamDelayMetaInfo.dxe_first_pkt_len = 75;
1152 if(skb->len < gRoamDelayMetaInfo.dxe_first_pkt_len)
1153 gRoamDelayMetaInfo.dxe_first_pkt_len = skb->len;
1154 vos_mem_copy(&gRoamDelayMetaInfo.dxe_first_pkt_data, skb->data,
1155 gRoamDelayMetaInfo.dxe_first_pkt_len);
1156 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1157 "DXE %s XMIT first data frame after roaming", __func__);
1158 }
1159 }
1160 }
1161 break;
1162 case e_SME_VO_ADDTS_REQ:
1163 gRoamDelayMetaInfo.hdd_addts_vo_req_time = vos_timer_get_system_time();
1164 break;
1165 case e_SME_VO_ADDTS_RSP:
1166 gRoamDelayMetaInfo.hdd_addts_vo_rsp_time = vos_timer_get_system_time();
1167 break;
1168 case e_SME_VI_ADDTS_REQ:
1169 gRoamDelayMetaInfo.hdd_addts_vi_req_time = vos_timer_get_system_time();
1170 break;
1171 case e_SME_VI_ADDTS_RSP:
1172 gRoamDelayMetaInfo.hdd_addts_vi_rsp_time = vos_timer_get_system_time();
1173 break;
1174 case e_CACHE_ROAM_DELAY_DATA:
1175 //Let us copy roam meta info
1176 if(gRoamDelayCurrentIndex > ROAM_DELAY_TABLE_SIZE)
1177 gRoamDelayCurrentIndex = 0;
Girish Gowlifb0bfd32015-01-13 11:42:11 +05301178 vos_mem_copy(&gpRoamDelayTable[gRoamDelayCurrentIndex++],
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301179 &gRoamDelayMetaInfo, sizeof(gRoamDelayMetaInfo));
1180 vos_mem_set(&gRoamDelayMetaInfo, sizeof(gRoamDelayMetaInfo), 0);
1181 break;
1182 default:
1183 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1184 "%s Invalid roam_event = %d received ", __func__, roam_event);
1185 break;
1186 }
1187}
1188
1189void vos_reset_roam_timer_log(void)
1190{
Girish Gowlifb0bfd32015-01-13 11:42:11 +05301191 if (gpRoamDelayTable != NULL)
1192 {
1193 //Set zero to whole gpRoamDelayTable
1194 vos_mem_set(gpRoamDelayTable, (sizeof(tRoamDelayMetaInfo) * ROAM_DELAY_TABLE_SIZE), 0);
1195 }
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301196}
1197
1198void vos_dump_roam_time_log_service(void)
1199{
Girish Gowlid5634b42014-09-04 23:59:06 +05301200 v_SLONG_t slA, slB, slC, slD, slE, slF, slG, slH, slI, slJ, slK, slL, slM, slRoamDelay;
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301201 tRoamDelayMetaInfo currentRoamDelayInfo;
Girish Gowli1702d212014-12-24 15:31:07 +05301202 v_ULONG_t index = 0,i=0;
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301203
Girish Gowlifb0bfd32015-01-13 11:42:11 +05301204 if (gpRoamDelayTable == NULL)
1205 {
1206 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1207 "Roam delay table is not initialized\n");
1208 return;
1209 }
1210 //Let us first copy the current gRoamDelayMetaInfo into gpRoamDelayTable
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301211 if(gRoamDelayCurrentIndex > ROAM_DELAY_TABLE_SIZE)
1212 gRoamDelayCurrentIndex = 0;
Girish Gowlifb0bfd32015-01-13 11:42:11 +05301213 vos_mem_copy(&gpRoamDelayTable[gRoamDelayCurrentIndex++], &gRoamDelayMetaInfo, sizeof(gRoamDelayMetaInfo));
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301214
Girish Gowli1702d212014-12-24 15:31:07 +05301215 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1216 "** RoamDelay = ( dxe_first_tx_time - disable_tx_queues_time)\n");
Girish Gowlid5634b42014-09-04 23:59:06 +05301217
Girish Gowli1702d212014-12-24 15:31:07 +05301218 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Girish Gowlid5634b42014-09-04 23:59:06 +05301219 "||========================"
1220 "===============|====== A ======|====== B ======|====== C ======|"
1221 "====== D ======|====== E ======|====== F ======|====== G ======|"
1222 "====== H ======|====== I ======|====== J ======|====== K ======|"
1223 "====== L ======|====== M ======||\n");
1224
Girish Gowli1702d212014-12-24 15:31:07 +05301225 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Girish Gowlid5634b42014-09-04 23:59:06 +05301226 "||Sl | Peer MAC address |"
1227 " **RoamDelay** | PreAuth Timer | Disassoc Issue| Add BSS Req |"
1228 " AddBssRsp to | ReassocReq to | ReassocRsp to | Disable to |"
1229 " M1-M2 DXE SW | M1-M2 HDD SW | M3-M4 DXE SW | M3-M4 HDD SW |"
1230 " ReassocRsp to | HDD to DXE ||\n");
1231
Girish Gowli1702d212014-12-24 15:31:07 +05301232 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Girish Gowlid5634b42014-09-04 23:59:06 +05301233 "||No.| |"
1234 " ************* | to Roam Start | to Complete | to Rsp time |"
1235 " Reassoc Req | ReassocRsp | Enable Tx Que | Enable Tx Que |"
1236 " | | | |"
1237 " Set GTK | 1st data frame||\n");
1238
Girish Gowli1702d212014-12-24 15:31:07 +05301239 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Girish Gowlid5634b42014-09-04 23:59:06 +05301240 "||========================"
1241 "================================================================"
1242 "================================================================"
1243 "================================================================"
1244 "===============================||\n");
1245
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301246 for (index = 0; index < gRoamDelayCurrentIndex; index++)
1247 {
Girish Gowlifb0bfd32015-01-13 11:42:11 +05301248 currentRoamDelayInfo = gpRoamDelayTable[index];
Girish Gowlid5634b42014-09-04 23:59:06 +05301249 /* PreAuth Timer to Roam Start */
1250 slA = (currentRoamDelayInfo.preauth_cb_time -
1251 currentRoamDelayInfo.preauth_reassoc_start_time);
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301252
Girish Gowlid5634b42014-09-04 23:59:06 +05301253 /* Disassoc Issue to Complete */
1254 slB = (currentRoamDelayInfo.disassoc_comp_time -
1255 currentRoamDelayInfo.disassoc_issue_time);
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301256
Girish Gowlid5634b42014-09-04 23:59:06 +05301257 /* Add BSS Req to Rsp time */
1258 slC = (currentRoamDelayInfo.lim_add_bss_rsp_time -
1259 currentRoamDelayInfo.lim_add_bss_req_time);
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301260
Girish Gowlid5634b42014-09-04 23:59:06 +05301261 /* AddBssRsp to Reassoc Req */
1262 slD = (currentRoamDelayInfo.send_reassoc_req_time -
1263 currentRoamDelayInfo.lim_add_bss_rsp_time);
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301264
Girish Gowlid5634b42014-09-04 23:59:06 +05301265 /* ReassocReq to ReassocRsp */
1266 slE = (currentRoamDelayInfo.hdd_sendassoc_rsp_time -
1267 currentRoamDelayInfo.send_reassoc_req_time);
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301268
Girish Gowlid5634b42014-09-04 23:59:06 +05301269 /* ReassocRsp to Enable Tx Que */
1270 slF = (currentRoamDelayInfo.enable_tx_queues_reassoc_time -
1271 currentRoamDelayInfo.hdd_sendassoc_rsp_time);
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301272
Girish Gowlid5634b42014-09-04 23:59:06 +05301273 /* Disable to Enable Tx Que */
1274 slG = (currentRoamDelayInfo.enable_tx_queues_reassoc_time -
1275 currentRoamDelayInfo.disable_tx_queues_time);
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301276
Girish Gowlid5634b42014-09-04 23:59:06 +05301277 /* M1-M2 DXE SW */
1278 slH = (currentRoamDelayInfo.dxe_eapol_m2 -
1279 currentRoamDelayInfo.dxe_eapol_m1);
1280
1281 /* M1-M2 HDD SW */
1282 slI = (currentRoamDelayInfo.hdd_eapol_m2 -
1283 currentRoamDelayInfo.hdd_eapol_m1);
1284
1285 /* M3-M4 DXE SW */
1286 slJ = (currentRoamDelayInfo.dxe_eapol_m4 -
1287 currentRoamDelayInfo.dxe_eapol_m3);
1288
1289 /* M3-M4 HDD SW */
1290 slK = (currentRoamDelayInfo.hdd_eapol_m4 -
1291 currentRoamDelayInfo.hdd_eapol_m3);
1292
1293 /* ReassocRsp to Set GTK */
1294 slL = (currentRoamDelayInfo.set_gtk_roam_key_time -
1295 currentRoamDelayInfo.hdd_sendassoc_rsp_time);
1296
1297 /* HDD to DXE 1st data frame */
1298 slM = (currentRoamDelayInfo.dxe_first_tx_time -
1299 currentRoamDelayInfo.hdd_first_xmit_time);
1300
1301 /* Calculate roam delay */
Girish Gowli1702d212014-12-24 15:31:07 +05301302 slRoamDelay = (currentRoamDelayInfo.dxe_first_tx_time -
1303 currentRoamDelayInfo.disable_tx_queues_time);
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301304
Girish Gowli1702d212014-12-24 15:31:07 +05301305 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Girish Gowlid5634b42014-09-04 23:59:06 +05301306 "||%2ld:|<"MAC_ADDRESS_STR">|"
1307 "%14ld |%14ld |%14ld |%14ld |"
1308 "%14ld |%14ld |%14ld |%14ld |"
1309 "%14ld |%14ld |%14ld |%14ld |"
1310 "%14ld |%14ld ||\n",
1311 (index+1), MAC_ADDR_ARRAY(currentRoamDelayInfo.peer_mac_addr),
1312 slRoamDelay, slA, slB, slC,
1313 slD, slE, slF, slG,
1314 slH, slI, slJ, slK,
1315 slL, slM );
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301316 }
Girish Gowlid5634b42014-09-04 23:59:06 +05301317
Girish Gowli1702d212014-12-24 15:31:07 +05301318 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Girish Gowlid5634b42014-09-04 23:59:06 +05301319 "||========================"
1320 "================================================================"
1321 "================================================================"
1322 "================================================================"
1323 "===============================||\n");
1324
Girish Gowli1702d212014-12-24 15:31:07 +05301325 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1326 "||== More Details ====================="
1327 "===============================||\n");
1328
1329 for (index = 0; index < gRoamDelayCurrentIndex; index++)
1330 {
1331
Girish Gowlifb0bfd32015-01-13 11:42:11 +05301332 currentRoamDelayInfo = gpRoamDelayTable[index];
Girish Gowli1702d212014-12-24 15:31:07 +05301333 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1334 "||%2ld: Peer Mac: <"MAC_ADDRESS_STR">\n",
1335 (index+1), MAC_ADDR_ARRAY(currentRoamDelayInfo.peer_mac_addr)
1336 );
1337
1338 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1339 "||preauth_reassoc_start_time : %14ld\n",
1340 currentRoamDelayInfo.preauth_reassoc_start_time
1341 );
1342
1343 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1344 "||preauth_cb_time : %14ld\n",
1345 currentRoamDelayInfo.preauth_cb_time
1346 );
1347
1348 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1349 "||disable_tx_queues_time : %14ld\n",
1350 currentRoamDelayInfo.disable_tx_queues_time
1351 );
1352
1353 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1354 "||disassoc_issue_time : %14ld\n",
1355 currentRoamDelayInfo.disassoc_issue_time
1356 );
1357
1358 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1359 "||lim_add_bss_req_time : %14ld\n",
1360 currentRoamDelayInfo.lim_add_bss_req_time
1361 );
1362
1363 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1364 "||lim_add_bss_rsp_time : %14ld\n",
1365 currentRoamDelayInfo.lim_add_bss_rsp_time
1366 );
1367
1368 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1369 "||disassoc_comp_time : %14ld\n",
1370 currentRoamDelayInfo.disassoc_comp_time
1371 );
1372
1373 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1374 "||send_reassoc_req_time : %14ld\n",
1375 currentRoamDelayInfo.send_reassoc_req_time
1376 );
1377
1378 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1379 "||hdd_sendassoc_rsp_time : %14ld\n",
1380 currentRoamDelayInfo.hdd_sendassoc_rsp_time
1381 );
1382
1383 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1384 "||enable_tx_queues_time : %14ld\n",
1385 currentRoamDelayInfo.enable_tx_queues_reassoc_time
1386 );
1387
1388 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1389 "||hdd_eapol_m1 : %14ld\n",
1390 currentRoamDelayInfo.hdd_eapol_m1
1391 );
1392
1393 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1394 "||hdd_eapol_m2 : %14ld\n",
1395 currentRoamDelayInfo.hdd_eapol_m2
1396 );
1397
1398 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1399 "||hdd_eapol_m3 : %14ld\n",
1400 currentRoamDelayInfo.hdd_eapol_m3
1401 );
1402
1403 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1404 "||hdd_eapol_m4 : %14ld\n",
1405 currentRoamDelayInfo.hdd_eapol_m4
1406 );
1407
1408 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1409 "||dxe_eapol_m1 : %14ld\n",
1410 currentRoamDelayInfo.dxe_eapol_m1
1411 );
1412
1413 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1414 "||dxe_eapol_m2 : %14ld\n",
1415 currentRoamDelayInfo.dxe_eapol_m2
1416 );
1417
1418 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1419 "||dxe_eapol_m3 : %14ld\n",
1420 currentRoamDelayInfo.dxe_eapol_m3
1421 );
1422
1423 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1424 "||dxe_eapol_m4 : %14ld\n",
1425 currentRoamDelayInfo.dxe_eapol_m4
1426 );
1427
1428 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1429 "||set_ptk_roam_key_time : %14ld\n",
1430 currentRoamDelayInfo.set_ptk_roam_key_time
1431 );
1432
1433 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1434 "||set_gtk_roam_key_time : %14ld\n",
1435 currentRoamDelayInfo.set_gtk_roam_key_time
1436 );
1437
1438 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1439 "||tl_fetch_pkt_time : %14ld\n",
1440 currentRoamDelayInfo.tl_fetch_pkt_time
1441 );
1442
1443 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1444 "||hdd_first_xmit_time : %14ld\n",
1445 currentRoamDelayInfo.hdd_first_xmit_time
1446 );
1447
1448 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1449 "||dxe_first_tx_time : %14ld\n",
1450 currentRoamDelayInfo.dxe_first_tx_time
1451 );
1452
1453 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1454 "||hdd_first_pkt_data : \n"
1455 );
1456
1457
1458 for (i=0; i<currentRoamDelayInfo.hdd_first_pkt_len && i< (50-8); i+=8)
1459 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1460 "||%2X, %2X, %2X, %2X, %2X, %2X, %2X, %2X, ",
1461 currentRoamDelayInfo.hdd_first_pkt_data[i],
1462 currentRoamDelayInfo.hdd_first_pkt_data[i+1],
1463 currentRoamDelayInfo.hdd_first_pkt_data[i+2],
1464 currentRoamDelayInfo.hdd_first_pkt_data[i+3],
1465 currentRoamDelayInfo.hdd_first_pkt_data[i+4],
1466 currentRoamDelayInfo.hdd_first_pkt_data[i+5],
1467 currentRoamDelayInfo.hdd_first_pkt_data[i+6],
1468 currentRoamDelayInfo.hdd_first_pkt_data[i+7]
1469 );
1470
1471 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1472 "||dxe_first_pkt_data : \n"
1473 );
1474
1475 for (i=0; i<currentRoamDelayInfo.dxe_first_pkt_len && i < (75-8); i+=8)
1476 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1477 "||%2X, %2X, %2X, %2X, %2X, %2X, %2X, %2X, ",
1478 currentRoamDelayInfo.dxe_first_pkt_data[i],
1479 currentRoamDelayInfo.dxe_first_pkt_data[i+1],
1480 currentRoamDelayInfo.dxe_first_pkt_data[i+2],
1481 currentRoamDelayInfo.dxe_first_pkt_data[i+3],
1482 currentRoamDelayInfo.dxe_first_pkt_data[i+4],
1483 currentRoamDelayInfo.dxe_first_pkt_data[i+5],
1484 currentRoamDelayInfo.dxe_first_pkt_data[i+6],
1485 currentRoamDelayInfo.dxe_first_pkt_data[i+7]
1486 );
1487 }
1488 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1489 "||== END ====================="
1490 "===============================||\n");
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301491}
Sushant Kaushik33200572015-08-05 16:46:20 +05301492
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +05301493v_U32_t vos_copy_80211_data(void *pBuff, v_U8_t *dst, v_U8_t frametype)
Sushant Kaushik33200572015-08-05 16:46:20 +05301494{
1495 vos_pkt_t *vos_pkt = NULL;
1496 struct sk_buff *skb = NULL;
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +05301497 v_U32_t length_to_copy;
Sushant Kaushik33200572015-08-05 16:46:20 +05301498
1499 vos_pkt = (vos_pkt_t *)pBuff;
1500
1501 if(!vos_pkt || !dst)
1502 {
1503 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1504 "vos_pkt/dst is null");
1505 return 0;
1506 }
1507 skb = vos_pkt->pSkb;
1508 if(!skb)
1509 {
1510 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1511 " skb is null");
1512 return 0;
1513 }
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +05301514 if (VOS_MAC_MGMT_FRAME == frametype)
Sushant Kaushik33200572015-08-05 16:46:20 +05301515 {
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +05301516 length_to_copy = skb->len;
1517 }
1518 else
1519 {
1520 length_to_copy = VOS_DEF_PKT_STATS_LEN_TO_COPY;
1521 if(skb->data[0] == VOS_QOS_DATA_VALUE)
1522 length_to_copy += VOS_QOS_SIZE;
1523
1524 /* Copy whole skb data if DHCP or EAPOL pkt.Here length_to_copy
1525 * will give the pointer to IP header and adding VOS_IP_HEADER_SIZE
1526 * to it will give the DHCP port number.
1527 */
1528 if (((skb->len > (length_to_copy + VOS_IP_HEADER_SIZE)) &&
1529 ((*((u16*)((u8*)skb->data + length_to_copy + VOS_IP_HEADER_SIZE))
1530 == VOS_DHCP_SOURCE_PORT) ||
1531 (*((u16*)((u8*)skb->data + length_to_copy + VOS_IP_HEADER_SIZE))
1532 == VOS_DHCP_DESTINATION_PORT))) ||
1533 vos_skb_is_eapol(skb,
1534 VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_11_PKT,
1535 VOS_ETHERTYPE_802_1_X_SIZE))
1536 {
1537 length_to_copy = skb->len;
1538 }
Sushant Kaushik33200572015-08-05 16:46:20 +05301539 }
1540
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +05301541 if (length_to_copy > skb->len)
Sushant Kaushik33200572015-08-05 16:46:20 +05301542 {
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +05301543 length_to_copy = skb->len;
1544 }
1545 if (length_to_copy > MAX_PKT_STAT_DATA_LEN)
1546 {
1547 length_to_copy = MAX_PKT_STAT_DATA_LEN;
Sushant Kaushik33200572015-08-05 16:46:20 +05301548 }
1549
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +05301550 vos_mem_copy(dst, skb->data, length_to_copy);
Sushant Kaushik33200572015-08-05 16:46:20 +05301551 return length_to_copy;
1552}
Abhishek Singh888420b2016-01-06 12:28:03 +05301553
1554#ifdef FEATURE_WLAN_DIAG_SUPPORT
1555/**
1556 * vos_tdls_tx_rx_mgmt_event()- send tdls mgmt rx tx event
1557 *
1558 * @event_id: event id
1559 * @tx_rx: tx or rx
1560 * @type: type of frame
1561 * @action_sub_type: action frame type
1562 * @peer_mac: peer mac
1563 *
1564 * This Function sendsend tdls mgmt rx tx diag event
1565 *
1566 * Return: void.
1567 */
1568void vos_tdls_tx_rx_mgmt_event(uint8_t event_id, uint8_t tx_rx,
1569 uint8_t type, uint8_t action_sub_type, uint8_t *peer_mac)
1570{
1571 WLAN_VOS_DIAG_EVENT_DEF(tdls_tx_rx_mgmt,
1572 struct vos_event_tx_rx_mgmt);
1573 vos_mem_zero(&tdls_tx_rx_mgmt, sizeof(tdls_tx_rx_mgmt));
1574
1575 tdls_tx_rx_mgmt.event_id = event_id;
1576 tdls_tx_rx_mgmt.tx_rx = tx_rx;
1577 tdls_tx_rx_mgmt.type = type;
1578 tdls_tx_rx_mgmt.action_sub_type = action_sub_type;
1579 vos_mem_copy(tdls_tx_rx_mgmt.peer_mac,
1580 peer_mac, VOS_MAC_ADDR_SIZE);
1581 WLAN_VOS_DIAG_EVENT_REPORT(&tdls_tx_rx_mgmt,
1582 EVENT_WLAN_TX_RX_MGMT);
1583}
1584#endif