blob: b2998f6bbfea46e382ed1dc8e32317d15cdbf6d9 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Kiet Lam1ed83fc2014-02-19 01:15:45 -08002 * Copyright (c) 2012-2013 The Linux Foundation. All rights reserved.
3 *
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>
70
71/*----------------------------------------------------------------------------
72 * Preprocessor Definitions and Constants
73 * -------------------------------------------------------------------------*/
74
75/*----------------------------------------------------------------------------
76 * Type Declarations
77 * -------------------------------------------------------------------------*/
78/*----------------------------------------------------------------------------
79 * Global Data Definitions
80 * -------------------------------------------------------------------------*/
81extern struct crypto_ahash *wcnss_wlan_crypto_alloc_ahash(const char *alg_name,
82 unsigned int type,
83 unsigned int mask);
84
85extern int wcnss_wlan_crypto_ahash_digest(struct ahash_request *req);
86extern void wcnss_wlan_crypto_free_ahash(struct crypto_ahash *tfm);
87extern int wcnss_wlan_crypto_ahash_setkey(struct crypto_ahash *tfm, const u8 *key,
88 unsigned int keylen);
89extern struct crypto_ablkcipher *wcnss_wlan_crypto_alloc_ablkcipher(const char *alg_name,
90 u32 type, u32 mask);
91extern void wcnss_wlan_ablkcipher_request_free(struct ablkcipher_request *req);
92extern void wcnss_wlan_crypto_free_ablkcipher(struct crypto_ablkcipher *tfm);
93
94/*----------------------------------------------------------------------------
95 * Static Variable Definitions
96 * -------------------------------------------------------------------------*/
97
98/*----------------------------------------------------------------------------
99 Function Definitions and Documentation
100 * -------------------------------------------------------------------------*/
101
102/*--------------------------------------------------------------------------
103
104 \brief vos_crypto_init() - Initializes Crypto module
105
106 The vos_crypto_init() function initializes Crypto module.
107
108 \param phCryptProv - pointer to the Crypt handle
109
110 \return VOS_STATUS_SUCCESS - Successfully generated random memory.
111
112 VOS_STATUS_E_FAULT - pbBuf is an invalid pointer.
113
114 VOS_STATUS_E_FAILURE - default return value if it fails due to
115 unknown reasons
116
117 ***VOS_STATUS_E_RESOURCES - System resources (other than memory)
118 are unavailable
119 \sa
120
121 ( *** return value not considered yet )
122 --------------------------------------------------------------------------*/
123VOS_STATUS vos_crypto_init( v_U32_t *phCryptProv )
124{
125 VOS_STATUS uResult = VOS_STATUS_E_FAILURE;
126
127 // This implementation doesn't require a crypto context
Jeff Johnson8d09bfb2013-12-27 15:01:38 -0800128 *phCryptProv = 0;
Jeff Johnson295189b2012-06-20 16:38:30 -0700129 uResult = VOS_STATUS_SUCCESS;
130 return ( uResult );
131}
132
133VOS_STATUS vos_crypto_deinit( v_U32_t hCryptProv )
134{
135 VOS_STATUS uResult = VOS_STATUS_E_FAILURE;
136
137 // CryptReleaseContext succeeded
138 uResult = VOS_STATUS_SUCCESS;
139
140 return ( uResult );
141}
142
143/*--------------------------------------------------------------------------
144
145 \brief vos_rand_get_bytes() - Generates random byte
146
147 The vos_rand_get_bytes() function generate random bytes.
148
149 Buffer should be allocated before calling vos_rand_get_bytes().
150
151 Attempting to initialize an already initialized lock results in
152 a failure.
153
154 \param lock - pointer to the opaque lock object to initialize
155
156 \return VOS_STATUS_SUCCESS - Successfully generated random memory.
157
158 VOS_STATUS_E_FAULT - pbBuf is an invalid pointer.
159
160 VOS_STATUS_E_FAILURE - default return value if it fails due to
161 unknown reasons
162
163 ***VOS_STATUS_E_RESOURCES - System resources (other than memory)
164 are unavailable
165 \sa
166
167 ( *** return value not considered yet )
168 --------------------------------------------------------------------------*/
169VOS_STATUS vos_rand_get_bytes( v_U32_t cryptHandle, v_U8_t *pbBuf, v_U32_t numBytes )
170{
171 VOS_STATUS uResult = VOS_STATUS_E_FAILURE;
172 //v_UINT_t uCode;
173// HCRYPTPROV hCryptProv = (HCRYPTPROV) cryptHandle;
174
175 //check for invalid pointer
176 if ( NULL == pbBuf )
177 {
178 uResult = VOS_STATUS_E_FAULT;
179 return ( uResult );
180 }
181
182//#if 0
183 // get_random_bytes() is a void procedure
184 get_random_bytes( pbBuf, numBytes);
185 // "Random sequence generated."
186 uResult = VOS_STATUS_SUCCESS;
187//#endif
188
189 return ( uResult );
190}
191
192
193/**
194 * vos_sha1_hmac_str
195 *
196 * FUNCTION:
197 * Generate the HMAC-SHA1 of a string given a key.
198 *
199 * LOGIC:
200 * Standard HMAC processing from RFC 2104. The code is provided in the
201 * appendix of the RFC.
202 *
203 * ASSUMPTIONS:
204 * The RFC is correct.
205 *
206 * @param text text to be hashed
207 * @param textLen length of text
208 * @param key key to use for HMAC
209 * @param keyLen length of key
210 * @param digest holds resultant SHA1 HMAC (20B)
211 *
212 * @return VOS_STATUS_SUCCSS if the operation succeeds
213 *
214 */
215
216struct hmac_sha1_result {
217 struct completion completion;
218 int err;
219};
220
221static void hmac_sha1_complete(struct crypto_async_request *req, int err)
222{
223 struct hmac_sha1_result *r = req->data;
224 if (err == -EINPROGRESS)
225 return;
226 r->err = err;
227 complete(&r->completion);
228}
229
230int hmac_sha1(v_U8_t *key, v_U8_t ksize, char *plaintext, v_U8_t psize,
231 v_U8_t *output, v_U8_t outlen)
232{
233 int ret = 0;
234 struct crypto_ahash *tfm;
235 struct scatterlist sg;
236 struct ahash_request *req;
237 struct hmac_sha1_result tresult;
238 void *hash_buff = NULL;
239
240 unsigned char hash_result[64];
241 int i;
242
243 memset(output, 0, outlen);
244
245 init_completion(&tresult.completion);
246
247 tfm = wcnss_wlan_crypto_alloc_ahash("hmac(sha1)", CRYPTO_ALG_TYPE_AHASH,
248 CRYPTO_ALG_TYPE_AHASH_MASK);
249 if (IS_ERR(tfm)) {
250 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_alloc_ahash failed");
251 ret = PTR_ERR(tfm);
252 goto err_tfm;
253 }
254
255 req = ahash_request_alloc(tfm, GFP_KERNEL);
256 if (!req) {
257 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "failed to allocate request for hmac(sha1)");
258 ret = -ENOMEM;
259 goto err_req;
260 }
261
262 ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
263 hmac_sha1_complete, &tresult);
264
265 hash_buff = kzalloc(psize, GFP_KERNEL);
266 if (!hash_buff) {
267 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "failed to kzalloc hash_buff");
268 ret = -ENOMEM;
269 goto err_hash_buf;
270 }
271
272 memset(hash_result, 0, 64);
Rajesh Babu Prathipatiddbe2892014-07-01 18:57:16 +0530273 vos_mem_copy(hash_buff, plaintext, psize);
Jeff Johnson295189b2012-06-20 16:38:30 -0700274 sg_init_one(&sg, hash_buff, psize);
275
276 if (ksize) {
277 crypto_ahash_clear_flags(tfm, ~0);
278 ret = wcnss_wlan_crypto_ahash_setkey(tfm, key, ksize);
279
280 if (ret) {
281 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_ahash_setkey failed");
282 goto err_setkey;
283 }
284 }
285
286 ahash_request_set_crypt(req, &sg, hash_result, psize);
287 ret = wcnss_wlan_crypto_ahash_digest(req);
288
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +0530289 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "ret 0x%x", ret);
Jeff Johnson295189b2012-06-20 16:38:30 -0700290
291 switch (ret) {
292 case 0:
293 for (i=0; i< outlen; i++)
294 output[i] = hash_result[i];
295 break;
296 case -EINPROGRESS:
297 case -EBUSY:
298 ret = wait_for_completion_interruptible(&tresult.completion);
299 if (!ret && !tresult.err) {
Sachin Ahuja4f06a792014-12-04 18:14:32 +0530300 for (i=0; i< outlen; i++)
301 output[i] = hash_result[i];
Jeff Johnson295189b2012-06-20 16:38:30 -0700302 INIT_COMPLETION(tresult.completion);
303 break;
304 } else {
305 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "wait_for_completion_interruptible failed");
306 if (!ret)
307 ret = tresult.err;
308 goto out;
309 }
310 default:
311 goto out;
312 }
313
314out:
315err_setkey:
316 kfree(hash_buff);
317err_hash_buf:
318 ahash_request_free(req);
319err_req:
320 wcnss_wlan_crypto_free_ahash(tfm);
321err_tfm:
322 return ret;
323}
324
325VOS_STATUS vos_sha1_hmac_str(v_U32_t cryptHandle, /* Handle */
326 v_U8_t *pText, /* pointer to data stream */
327 v_U32_t textLen, /* length of data stream */
328 v_U8_t *pKey, /* pointer to authentication key */
329 v_U32_t keyLen, /* length of authentication key */
330 v_U8_t digest[VOS_DIGEST_SHA1_SIZE])/* caller digest to be filled in */
331{
332 int ret = 0;
333
334 ret = hmac_sha1(
335 pKey, //v_U8_t *key,
336 (v_U8_t) keyLen, //v_U8_t ksize,
337 (char *)pText, //char *plaintext,
338 (v_U8_t) textLen, //v_U8_t psize,
339 digest, //v_U8_t *output,
340 VOS_DIGEST_SHA1_SIZE //v_U8_t outlen
341 );
342
343 if (ret != 0) {
344 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR,"hmac_sha1() call failed");
345 return VOS_STATUS_E_FAULT;
346 }
347
348 return VOS_STATUS_SUCCESS;
349}
350
351/**
352 * vos_md5_hmac_str
353 *
354 * FUNCTION:
355 * Generate the HMAC-MD5 of a string given a key.
356 *
357 * LOGIC:
358 * Standard HMAC processing from RFC 2104. The code is provided in the
359 * appendix of the RFC.
360 *
361 * ASSUMPTIONS:
362 * The RFC is correct.
363 *
364 * @param text text to be hashed
365 * @param textLen length of text
366 * @param key key to use for HMAC
367 * @param keyLen length of key
368 * @param digest holds resultant MD5 HMAC (20B)
369 *
370 * @return VOS_STATUS_SUCCSS if the operation succeeds
371 *
372 */
373struct hmac_md5_result {
374 struct completion completion;
375 int err;
376};
377
378static void hmac_md5_complete(struct crypto_async_request *req, int err)
379{
380 struct hmac_md5_result *r = req->data;
381 if (err == -EINPROGRESS)
382 return;
383 r->err = err;
384 complete(&r->completion);
385}
386
387int hmac_md5(v_U8_t *key, v_U8_t ksize, char *plaintext, v_U8_t psize,
388 v_U8_t *output, v_U8_t outlen)
389{
390 int ret = 0;
391 struct crypto_ahash *tfm;
392 struct scatterlist sg;
393 struct ahash_request *req;
Yue Mad8cac142013-03-28 11:33:46 -0700394 struct hmac_md5_result tresult = {.err = 0};
Jeff Johnson295189b2012-06-20 16:38:30 -0700395 void *hash_buff = NULL;
396
397 unsigned char hash_result[64];
398 int i;
399
400 memset(output, 0, outlen);
401
402 init_completion(&tresult.completion);
403
404 tfm = wcnss_wlan_crypto_alloc_ahash("hmac(md5)", CRYPTO_ALG_TYPE_AHASH,
405 CRYPTO_ALG_TYPE_AHASH_MASK);
406 if (IS_ERR(tfm)) {
407 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_alloc_ahash failed");
408 ret = PTR_ERR(tfm);
409 goto err_tfm;
410 }
411
412 req = ahash_request_alloc(tfm, GFP_KERNEL);
413 if (!req) {
414 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "failed to allocate request for hmac(md5)");
415 ret = -ENOMEM;
416 goto err_req;
417 }
418
419 ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
420 hmac_md5_complete, &tresult);
421
422 hash_buff = kzalloc(psize, GFP_KERNEL);
423 if (!hash_buff) {
424 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "failed to kzalloc hash_buff");
425 ret = -ENOMEM;
426 goto err_hash_buf;
427 }
428
429 memset(hash_result, 0, 64);
Rajesh Babu Prathipatiddbe2892014-07-01 18:57:16 +0530430 vos_mem_copy(hash_buff, plaintext, psize);
Jeff Johnson295189b2012-06-20 16:38:30 -0700431 sg_init_one(&sg, hash_buff, psize);
432
433 if (ksize) {
434 crypto_ahash_clear_flags(tfm, ~0);
435 ret = wcnss_wlan_crypto_ahash_setkey(tfm, key, ksize);
436
437 if (ret) {
438 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_ahash_setkey failed");
439 goto err_setkey;
440 }
441 }
442
443 ahash_request_set_crypt(req, &sg, hash_result, psize);
444 ret = wcnss_wlan_crypto_ahash_digest(req);
445
Gopichand Nakkala66c0bd02013-04-10 11:36:29 +0530446 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "ret 0x%x", ret);
Jeff Johnson295189b2012-06-20 16:38:30 -0700447
448 switch (ret) {
449 case 0:
450 for (i=0; i< outlen; i++)
451 output[i] = hash_result[i];
452 break;
453 case -EINPROGRESS:
454 case -EBUSY:
455 ret = wait_for_completion_interruptible(&tresult.completion);
456 if (!ret && !tresult.err) {
Sachin Ahuja4f06a792014-12-04 18:14:32 +0530457 for (i=0; i< outlen; i++)
458 output[i] = hash_result[i];
459 INIT_COMPLETION(tresult.completion);
460 break;
Jeff Johnson295189b2012-06-20 16:38:30 -0700461 } else {
462 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "wait_for_completion_interruptible failed");
463 if (!ret)
464 ret = tresult.err;
465 goto out;
466 }
467 default:
468 goto out;
469 }
470
471out:
472err_setkey:
473 kfree(hash_buff);
474err_hash_buf:
475 ahash_request_free(req);
476err_req:
477 wcnss_wlan_crypto_free_ahash(tfm);
478err_tfm:
479 return ret;
480}
481
482VOS_STATUS vos_md5_hmac_str(v_U32_t cryptHandle, /* Handle */
483 v_U8_t *pText, /* pointer to data stream */
484 v_U32_t textLen, /* length of data stream */
485 v_U8_t *pKey, /* pointer to authentication key */
486 v_U32_t keyLen, /* length of authentication key */
487 v_U8_t digest[VOS_DIGEST_MD5_SIZE])/* caller digest to be filled in */
488{
489 int ret = 0;
490
491 ret = hmac_md5(
492 pKey, //v_U8_t *key,
493 (v_U8_t) keyLen, //v_U8_t ksize,
494 (char *)pText, //char *plaintext,
495 (v_U8_t) textLen, //v_U8_t psize,
496 digest, //v_U8_t *output,
497 VOS_DIGEST_MD5_SIZE //v_U8_t outlen
498 );
499
500 if (ret != 0) {
501 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR,"hmac_md5() call failed");
502 return VOS_STATUS_E_FAULT;
503 }
504
505 return VOS_STATUS_SUCCESS;
506}
507
508
509struct ecb_aes_result {
510 struct completion completion;
511 int err;
512};
513
514static void ecb_aes_complete(struct crypto_async_request *req, int err)
515{
516 struct ecb_aes_result *r = req->data;
517 if (err == -EINPROGRESS)
518 return;
519 r->err = err;
520 complete(&r->completion);
521}
522
523
524/*--------------------------------------------------------------------------
525
526 \brief vos_encrypt_AES() - Generate AES Encrypted byte stream
527
528 The vos_encrypt_AES() function generates the encrypted byte stream for given text.
529
530 Buffer should be allocated before calling vos_rand_get_bytes().
531
532 Attempting to initialize an already initialized lock results in
533 a failure.
534
535 \param lock - pointer to the opaque lock object to initialize
536
537 \return VOS_STATUS_SUCCESS - Successfully generated random memory.
538
539 VOS_STATUS_E_FAULT - pbBuf is an invalid pointer.
540
541 VOS_STATUS_E_FAILURE - default return value if it fails due to
542 unknown reasons
543
544 ***VOS_STATUS_E_RESOURCES - System resources (other than memory)
545 are unavailable
546 \sa
547
548 ( *** return value not considered yet )
549 --------------------------------------------------------------------------*/
550
551#define IV_SIZE_AES_128 16
552#define KEY_SIZE_AES_128 16
553#define AES_BLOCK_SIZE 16
554
555VOS_STATUS vos_encrypt_AES(v_U32_t cryptHandle, /* Handle */
556 v_U8_t *pPlainText, /* pointer to data stream */
557 v_U8_t *pCiphertext,
558 v_U8_t *pKey) /* pointer to authentication key */
559{
560// VOS_STATUS uResult = VOS_STATUS_E_FAILURE;
561 struct ecb_aes_result result;
562 struct ablkcipher_request *req;
563 struct crypto_ablkcipher *tfm;
564 int ret = 0;
565 char iv[IV_SIZE_AES_128];
566 struct scatterlist sg_in;
567 struct scatterlist sg_out;
568
569 init_completion(&result.completion);
570
571 tfm = wcnss_wlan_crypto_alloc_ablkcipher( "cbc(aes)", 0, 0);
572 if (IS_ERR(tfm)) {
573 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_alloc_ablkcipher failed");
574 ret = PTR_ERR(tfm);
575 goto err_tfm;
576 }
577
578 req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
579 if (!req) {
580 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "Failed to allocate request for cbc(aes)");
581 ret = -ENOMEM;
582 goto err_req;
583 }
584
585 ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
586 ecb_aes_complete, &result);
587
588
589 crypto_ablkcipher_clear_flags(tfm, ~0);
590
591 ret = crypto_ablkcipher_setkey(tfm, pKey, KEY_SIZE_AES_128);
592 if (ret) {
593 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_cipher_setkey failed");
594 goto err_setkey;
595 }
596
597 memset(iv, 0, IV_SIZE_AES_128);
598
599 sg_init_one(&sg_in, pPlainText, AES_BLOCK_SIZE);
600
601 sg_init_one(&sg_out, pCiphertext, AES_BLOCK_SIZE);
602
603 ablkcipher_request_set_crypt(req, &sg_in, &sg_out, AES_BLOCK_SIZE, iv);
604
605 crypto_ablkcipher_encrypt(req);
606
607
608
609// -------------------------------------
610err_setkey:
611 wcnss_wlan_ablkcipher_request_free(req);
612err_req:
613 wcnss_wlan_crypto_free_ablkcipher(tfm);
614err_tfm:
615 //return ret;
616 if (ret != 0) {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700617 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR,"%s() call failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700618 return VOS_STATUS_E_FAULT;
619 }
620
621 return VOS_STATUS_SUCCESS;
622}
623
624/*--------------------------------------------------------------------------
625
626 \brief vos_decrypt_AES() - Decrypts an AES Encrypted byte stream
627
628 The vos_decrypt_AES() function decrypts the encrypted byte stream.
629
630 Buffer should be allocated before calling vos_rand_get_bytes().
631
632 Attempting to initialize an already initialized lock results in
633 a failure.
634
635 \param lock - pointer to the opaque lock object to initialize
636
637 \return VOS_STATUS_SUCCESS - Successfully generated random memory.
638
639 VOS_STATUS_E_FAULT - pbBuf is an invalid pointer.
640
641 VOS_STATUS_E_FAILURE - default return value if it fails due to
642 unknown reasons
643
644 ***VOS_STATUS_E_RESOURCES - System resources (other than memory)
645 are unavailable
646 \sa
647
648 ( *** return value not considered yet )
649 --------------------------------------------------------------------------*/
650
651VOS_STATUS vos_decrypt_AES(v_U32_t cryptHandle, /* Handle */
652 v_U8_t *pText, /* pointer to data stream */
653 v_U8_t *pDecrypted,
654 v_U8_t *pKey) /* pointer to authentication key */
655{
656// VOS_STATUS uResult = VOS_STATUS_E_FAILURE;
657 struct ecb_aes_result result;
658 struct ablkcipher_request *req;
659 struct crypto_ablkcipher *tfm;
660 int ret = 0;
661 char iv[IV_SIZE_AES_128];
662 struct scatterlist sg_in;
663 struct scatterlist sg_out;
664
665 init_completion(&result.completion);
666
667 tfm = wcnss_wlan_crypto_alloc_ablkcipher( "cbc(aes)", 0, 0);
668 if (IS_ERR(tfm)) {
669 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_alloc_ablkcipher failed");
670 ret = PTR_ERR(tfm);
671 goto err_tfm;
672 }
673
674 req = ablkcipher_request_alloc(tfm, GFP_KERNEL);
675 if (!req) {
676 VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "Failed to allocate request for cbc(aes)");
677 ret = -ENOMEM;
678 goto err_req;
679 }
680
681 ablkcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
682 ecb_aes_complete, &result);
683
684
685 crypto_ablkcipher_clear_flags(tfm, ~0);
686
687 ret = crypto_ablkcipher_setkey(tfm, pKey, KEY_SIZE_AES_128);
688 if (ret) {
689 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR, "crypto_cipher_setkey failed");
690 goto err_setkey;
691 }
692
693 memset(iv, 0, IV_SIZE_AES_128);
694
695 sg_init_one(&sg_in, pText, AES_BLOCK_SIZE);
696
697 sg_init_one(&sg_out, pDecrypted, AES_BLOCK_SIZE);
698
699 ablkcipher_request_set_crypt(req, &sg_in, &sg_out, AES_BLOCK_SIZE, iv);
700
701 crypto_ablkcipher_decrypt(req);
702
703
704
705// -------------------------------------
706err_setkey:
707 wcnss_wlan_ablkcipher_request_free(req);
708err_req:
709 wcnss_wlan_crypto_free_ablkcipher(tfm);
710err_tfm:
711 //return ret;
712 if (ret != 0) {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700713 VOS_TRACE(VOS_MODULE_ID_VOSS,VOS_TRACE_LEVEL_ERROR,"%s() call failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700714 return VOS_STATUS_E_FAULT;
715 }
716
717 return VOS_STATUS_SUCCESS;
718}
Abhishek Singhe3fa11f2014-05-13 11:11:10 +0530719
Abhishek Singhe3fa11f2014-05-13 11:11:10 +0530720v_U8_t vos_chan_to_band(v_U32_t chan)
721{
722 if (chan <= VOS_24_GHZ_CHANNEL_14)
723 return VOS_BAND_2GHZ;
724
725 return VOS_BAND_5GHZ;
726}
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530727
Hardik Kantilal Patel8c2d5232015-01-08 00:31:38 +0530728void vos_get_wlan_unsafe_channel(v_U16_t *unsafeChannelList,
729 v_U16_t buffer_size, v_U16_t *unsafeChannelCount)
730{
731 /* Get unsafe channel list from cached location */
732 wcnss_get_wlan_unsafe_channel(unsafeChannelList, buffer_size,
733 unsafeChannelCount);
734}
735
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530736
737#include <linux/skbuff.h>
738#include "vos_timer.h"
739#include "i_vos_packet.h"
740
741#define MAC_ADDR_ARRAY(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
742#define MAC_ADDRESS_STR "%02x:%02x:%02x:%02x:%02x:%02x"
743#define DXE_DATA_MAGIC_NO 0x010
744#define DXE_MGMT_MAGIC_NO 0x011
745
746//Define gRoamDelayMetaInfo
747tRoamDelayMetaInfo gRoamDelayMetaInfo = {0};
Girish Gowlifb0bfd32015-01-13 11:42:11 +0530748tRoamDelayMetaInfo *gpRoamDelayTable = NULL;
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530749v_BOOL_t gRoamDelayCurrentIndex = 0;
750
751#define VOS_ETHERTYPE_802_1_X ( 0x888E )
752#define VOS_ETHERTYPE_802_1_X_SIZE ( 2 )
753//802.3 frame header have SRC MAC (6), DST(6),next will PROTOCOL type
754#define VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_3_PKT ( 12 )
755
756//802.11 header wil have 26 byte (Inculding QoS Info)
757//8Byte LLC / SNAP header in which last two byte will be PROTOCOL type
758//So offset will 32 if it is QoS data pkt else it will be 30
759#define VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_11_PKT ( 32 )
760#define VOS_QOS_DATA_VALUE ( 0x88 )
761#define VOS_NON_QOS_DATA_VALUE ( 0x80 )
762
Sushant Kaushik33200572015-08-05 16:46:20 +0530763//802.11 header wil have 24 byte excluding qos
764#define VOS_802_11_HEADER_SIZE ( 24 )
765#define VOS_QOS_SIZE ( 2 )
766#define VOS_LLC_HEADER_SIZE (8)
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +0530767#define VOS_IP_HEADER_SIZE (20)
768#define VOS_TCP_MIN_HEADER_SIZE (20)
769#define VOS_DEF_PKT_STATS_LEN_TO_COPY \
770 (VOS_802_11_HEADER_SIZE + VOS_LLC_HEADER_SIZE \
771 + VOS_IP_HEADER_SIZE + VOS_TCP_MIN_HEADER_SIZE)
772// DHCP Port number
773#define VOS_DHCP_SOURCE_PORT 0x4400
774#define VOS_DHCP_DESTINATION_PORT 0x4300
775
776
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530777
778// Frame Type definitions
779#define VOS_MAC_MGMT_FRAME 0x0
780#define VOS_MAC_CTRL_FRAME 0x1
781#define VOS_MAC_DATA_FRAME 0x2
782
783#define MONITOR_STOP 0x0
784#define MONITOR_START 0x1
785#define MONITOR_EAPOL_DONE 0x2
786#define MONITOR_FIRST_DATA_DONE 0x4
787
788v_BOOL_t vos_skb_is_eapol(struct sk_buff *skb,
789 v_SIZE_t pktOffset,
790 v_SIZE_t numBytes)
791{
792 void *pBuffer = NULL;
793 v_BOOL_t fEAPOL = VOS_FALSE;
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +0530794
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530795 // Validate the skb
796 if (unlikely(NULL == skb))
797 {
798 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
799 "vos_skb_is_eapol [%d]: NULL skb", __LINE__);
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +0530800 return VOS_FALSE;
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530801 }
802 // check for overflow
803 if (unlikely((pktOffset + numBytes) > skb->len))
804 {
805 VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
806 "vos_skb_is_eapol [%d]: Packet overflow, offset %d size %d len %d",
807 __LINE__, pktOffset, numBytes, skb->len);
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +0530808 return VOS_FALSE;
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530809 }
810 //check for the Qos Data, if Offset length is more 12.
811 //it means it will 802.11 header skb
812 if((pktOffset > VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_3_PKT)
813 && (skb->data[0] == VOS_NON_QOS_DATA_VALUE))
814 {
815 // reduced 2 byte of Qos ctrl field in DOT11 header
816 pktOffset = pktOffset - 2;
817 }
818 pBuffer = &skb->data[pktOffset];
819 if (pBuffer && vos_be16_to_cpu( *(unsigned short*)pBuffer ) == VOS_ETHERTYPE_802_1_X )
820 {
821 fEAPOL = VOS_TRUE;
822 }
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530823 return fEAPOL;
824}
825
Girish Gowlifb0bfd32015-01-13 11:42:11 +0530826v_BOOL_t vos_roam_delay_stats_init(void)
827{
828 if (gpRoamDelayTable == NULL)
829 {
830 gpRoamDelayTable = vmalloc(sizeof(tRoamDelayMetaInfo) * ROAM_DELAY_TABLE_SIZE);
831 if (gpRoamDelayTable == NULL)
832 {
833 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "Memory allocation failed");
834 return VOS_FALSE;
835 }
836 }
837 else
838 {
839 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO, "Memory is already allocated");
840 return VOS_FALSE;
841 }
842
843 return VOS_TRUE;
844}
845
846
847v_BOOL_t vos_roam_delay_stats_deinit(void)
848{
849 if (gpRoamDelayTable != NULL)
850 {
851 vfree(gpRoamDelayTable);
852 gpRoamDelayTable = NULL;
853 }
854 else
855 {
856 VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO, "Memory is already freed");
857 return VOS_FALSE;
858 }
859
860 return VOS_TRUE;
861}
862
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530863void vos_record_roam_event(enum e_roaming_event roam_event, void *pBuff, v_ULONG_t buff_len)
864{
Girish Gowlifb0bfd32015-01-13 11:42:11 +0530865 if (gpRoamDelayTable == NULL)
866 {
867 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
868 "Roam delay table is not initialized\n");
869 return;
870 }
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530871 switch(roam_event)
872 {
873 case e_HDD_DISABLE_TX_QUEUE:
874 gRoamDelayMetaInfo.hdd_monitor_tx = MONITOR_STOP;
875 gRoamDelayMetaInfo.disable_tx_queues_time = vos_timer_get_system_time();
876 break;
877 case e_SME_PREAUTH_REASSOC_START:
878 gRoamDelayMetaInfo.preauth_reassoc_start_time = vos_timer_get_system_time();
879 break;
880 case e_SME_PREAUTH_CALLBACK_HIT:
881 gRoamDelayMetaInfo.preauth_cb_time = vos_timer_get_system_time();
882 break;
883 case e_SME_ISSUE_REASSOC_REQ:
884 gRoamDelayMetaInfo.issue_reassoc_req_time = vos_timer_get_system_time();
885 //HACK buff len will carry the AuthType
886 gRoamDelayMetaInfo.hdd_auth_type = buff_len;
887 break;
888 case e_LIM_SEND_REASSOC_REQ:
889 gRoamDelayMetaInfo.send_reassoc_req_time = vos_timer_get_system_time();
890 //we can enable the rx eapol monitoring ASAP we send the REASSOC REQ Because
891 //there is very less delay in between REASSOC RSP and M1 Sent by the AP
892 gRoamDelayMetaInfo.hdd_monitor_rx = MONITOR_START;
893 gRoamDelayMetaInfo.dxe_monitor_rx = MONITOR_START;
894 break;
895 case e_CACHE_ROAM_PEER_MAC:
896 vos_mem_copy(&gRoamDelayMetaInfo.peer_mac_addr, pBuff, buff_len);
897 break;
898 case e_HDD_SEND_REASSOC_RSP:
899 gRoamDelayMetaInfo.hdd_sendassoc_rsp_time = vos_timer_get_system_time();
900 break;
901 case e_SME_DISASSOC_ISSUE:
902 gRoamDelayMetaInfo.disassoc_issue_time = vos_timer_get_system_time();
903 break;
904 case e_SME_DISASSOC_COMPLETE:
905 gRoamDelayMetaInfo.disassoc_comp_time = vos_timer_get_system_time();
906 break;
907 case e_LIM_ADD_BS_REQ:
908 gRoamDelayMetaInfo.lim_add_bss_req_time = vos_timer_get_system_time();
909 break;
910 case e_LIM_ADD_BS_RSP:
911 gRoamDelayMetaInfo.lim_add_bss_rsp_time = vos_timer_get_system_time();
912 break;
913 case e_HDD_ENABLE_TX_QUEUE:
914 gRoamDelayMetaInfo.hdd_monitor_tx = MONITOR_START;
915 gRoamDelayMetaInfo.enable_tx_queues_reassoc_time = vos_timer_get_system_time();
916 break;
917 case e_HDD_SET_PTK_REQ:
918 gRoamDelayMetaInfo.set_ptk_roam_key_time = vos_timer_get_system_time();
919 break;
920 case e_HDD_SET_GTK_REQ:
921 gRoamDelayMetaInfo.set_gtk_roam_key_time = vos_timer_get_system_time();
922 break;
923 case e_HDD_SET_PTK_RSP:
924 gRoamDelayMetaInfo.complete_ptk_roam_key_time = vos_timer_get_system_time();
925 //vos_mem_copy(&gRoamDelayMetaInfo.peer_mac_addr, pBuff, buff_len);
926 break;
927 case e_HDD_SET_GTK_RSP:
928 gRoamDelayMetaInfo.complete_gtk_roam_key_time = vos_timer_get_system_time();
929 break;
930 case e_TL_FIRST_XMIT_TIME:
931 if(gRoamDelayMetaInfo.log_tl)
932 {
933 gRoamDelayMetaInfo.tl_fetch_pkt_time = vos_timer_get_system_time();
934 gRoamDelayMetaInfo.log_tl = VOS_FALSE;
935 }
936 break;
937 case e_HDD_FIRST_XMIT_TIME:
938 if(gRoamDelayMetaInfo.hdd_monitor_tx != MONITOR_STOP)
939 {
940 struct sk_buff *skb = (struct sk_buff *)pBuff;
941 if(!skb)
942 {
943 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
944 "event e_HDD_FIRST_XMIT_TIME skb is null");
945 return;
946 }
947 if((gRoamDelayMetaInfo.hdd_auth_type == eVOS_AUTH_TYPE_RSN_PSK) ||
948 (gRoamDelayMetaInfo.hdd_auth_type == eVOS_AUTH_TYPE_WPA_PSK))
949 {
950 //Hdd xmit will have only 802.3 pkt so offset will pass as accordingly
951 if(vos_skb_is_eapol(skb, VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_3_PKT,
952 VOS_ETHERTYPE_802_1_X_SIZE) == VOS_TRUE)
953 {
954 if(gRoamDelayMetaInfo.hdd_eapol_m2 == 0)
955 {
Girish Gowli1702d212014-12-24 15:31:07 +0530956 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"HDD XMIT m2");
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530957 gRoamDelayMetaInfo.hdd_eapol_m2 = vos_timer_get_system_time();
958 gRoamDelayMetaInfo.dxe_monitor_tx = MONITOR_START;
959 }
960 else if((gRoamDelayMetaInfo.hdd_eapol_m2) && (gRoamDelayMetaInfo.hdd_eapol_m4 == 0))
961 {
962 gRoamDelayMetaInfo.hdd_eapol_m4 = vos_timer_get_system_time();
Girish Gowli1702d212014-12-24 15:31:07 +0530963 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"HDD XMIT m4");
Mukul Sharmad96e5e32014-06-25 17:45:39 +0530964 gRoamDelayMetaInfo.hdd_monitor_tx = MONITOR_EAPOL_DONE;
965 //We should return from here so can cache the time for first data pkt
966 return;
967 }
968 }
969 }
970 else
971 {
972 gRoamDelayMetaInfo.hdd_monitor_tx = MONITOR_EAPOL_DONE;
973 gRoamDelayMetaInfo.dxe_monitor_tx = MONITOR_START;
974 }
975 //Eapol is done it must be first data frame capture it
976 if(gRoamDelayMetaInfo.hdd_monitor_tx == MONITOR_EAPOL_DONE)
977 {
978 gRoamDelayMetaInfo.hdd_first_pkt_len = 50;
979 gRoamDelayMetaInfo.hdd_first_xmit_time = vos_timer_get_system_time();
980 gRoamDelayMetaInfo.log_tl = VOS_TRUE;
981 gRoamDelayMetaInfo.hdd_monitor_tx = MONITOR_STOP;
982 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
983 "HDD %s XMIT first data frame after roaming", __func__);
984 if(skb->len < gRoamDelayMetaInfo.hdd_first_pkt_len)
985 gRoamDelayMetaInfo.hdd_first_pkt_len = skb->len;
986 vos_mem_copy(&gRoamDelayMetaInfo.hdd_first_pkt_data,
987 skb->data,gRoamDelayMetaInfo.hdd_first_pkt_len);
988 }
989 }
990 break;
991 case e_HDD_RX_PKT_CBK_TIME:
992 if(gRoamDelayMetaInfo.hdd_monitor_rx != MONITOR_STOP)
993 {
994 struct sk_buff *skb = (struct sk_buff *)pBuff;
995 if(!skb)
996 {
997 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
998 "event e_HDD_RX_PKT_CBK_TIME skb is null");
999 return;
1000 }
1001 if((gRoamDelayMetaInfo.hdd_auth_type == eVOS_AUTH_TYPE_RSN_PSK) ||
1002 (gRoamDelayMetaInfo.hdd_auth_type == eVOS_AUTH_TYPE_WPA_PSK))
1003 {
1004 if(vos_skb_is_eapol(skb, VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_3_PKT,
1005 VOS_ETHERTYPE_802_1_X_SIZE) == VOS_TRUE)
1006 {
1007 if(gRoamDelayMetaInfo.hdd_eapol_m1 == 0)
1008 {
Girish Gowli1702d212014-12-24 15:31:07 +05301009 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"HDD recv m1");
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301010 gRoamDelayMetaInfo.hdd_eapol_m1 = vos_timer_get_system_time();
1011 }
1012 else if((gRoamDelayMetaInfo.hdd_eapol_m1) && (gRoamDelayMetaInfo.hdd_eapol_m3 == 0))
1013 {
1014 gRoamDelayMetaInfo.hdd_eapol_m3 = vos_timer_get_system_time();
Girish Gowli1702d212014-12-24 15:31:07 +05301015 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"HDD recv m3");
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301016 gRoamDelayMetaInfo.hdd_monitor_rx = MONITOR_EAPOL_DONE;
1017 }
1018 }
1019 }
1020 else
1021 {
1022 gRoamDelayMetaInfo.hdd_monitor_rx = MONITOR_EAPOL_DONE;
1023 }
1024 if(gRoamDelayMetaInfo.hdd_monitor_rx == MONITOR_EAPOL_DONE)
1025 {
1026 gRoamDelayMetaInfo.hdd_monitor_rx = MONITOR_STOP;
1027 }
1028 }
1029 break;
1030 case e_DXE_RX_PKT_TIME:
1031 if(gRoamDelayMetaInfo.dxe_monitor_rx != MONITOR_STOP)
1032 {
1033 vos_pkt_t *vos_pkt = NULL;
1034 struct sk_buff *skb = NULL;
1035 vos_pkt = (vos_pkt_t *)pBuff;
1036 if(!vos_pkt)
1037 {
1038 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1039 "event e_DXE_RX_PKT_TIME vos_pkt is null");
1040 return;
1041 }
1042 skb = vos_pkt->pSkb;
1043 if(!skb)
1044 {
1045 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1046 "event e_DXE_RX_PKT_TIME skb is null");
1047 return;
1048 }
1049 //DXE can RECV MGMT and DATA frame, we are interetsed in only DATA frame
1050 if(buff_len & VOS_MAC_DATA_FRAME)
1051 {
1052 if((gRoamDelayMetaInfo.hdd_auth_type == eVOS_AUTH_TYPE_RSN_PSK) ||
1053 (gRoamDelayMetaInfo.hdd_auth_type == eVOS_AUTH_TYPE_WPA_PSK))
1054 {
1055 if(vos_skb_is_eapol(skb, VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_11_PKT,
1056 VOS_ETHERTYPE_802_1_X_SIZE) == VOS_TRUE)
1057 {
1058 if(gRoamDelayMetaInfo.dxe_eapol_m1 == 0)
1059 {
Girish Gowli1702d212014-12-24 15:31:07 +05301060 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"DXE recv m1");
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301061 gRoamDelayMetaInfo.dxe_eapol_m1 = vos_timer_get_system_time();
1062 }
1063 else if((gRoamDelayMetaInfo.dxe_eapol_m1) && (gRoamDelayMetaInfo.dxe_eapol_m3 == 0))
1064 {
1065 gRoamDelayMetaInfo.dxe_eapol_m3 = vos_timer_get_system_time();
Girish Gowli1702d212014-12-24 15:31:07 +05301066 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"DXE recv m3");
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301067 gRoamDelayMetaInfo.dxe_monitor_rx = MONITOR_EAPOL_DONE;
1068 }
1069 }
1070 }
1071 else
1072 {
1073 gRoamDelayMetaInfo.dxe_monitor_rx = MONITOR_EAPOL_DONE;
1074 }
1075 if(gRoamDelayMetaInfo.dxe_monitor_rx == MONITOR_EAPOL_DONE)
1076 {
1077 gRoamDelayMetaInfo.dxe_monitor_rx = MONITOR_STOP;
1078 }
1079 }
1080 /*
1081 else
1082 {
1083 printk("e_DXE_RX_PKT_TIME dump mgmt frames");
1084 vos_trace_hex_dump( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, &skb->data[0], skb->len);
1085 }
1086 */
1087 }
1088 break;
1089 case e_DXE_FIRST_XMIT_TIME:
1090 if(gRoamDelayMetaInfo.dxe_monitor_tx != MONITOR_STOP)
1091 {
1092 vos_pkt_t *vos_pkt = NULL;
1093 struct sk_buff *skb = NULL;
1094 vos_pkt = (vos_pkt_t *)pBuff;
1095 if(!vos_pkt)
1096 {
1097 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1098 "event e_DXE_FIRST_XMIT_TIME vos_pkt is null");
1099 return;
1100 }
1101 skb = vos_pkt->pSkb;
1102 if(!skb)
1103 {
1104 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1105 "event e_DXE_FIRST_XMIT_TIME skb is null");
1106 return;
1107 }
1108 //DXE can Txmit MGMT and DATA frame, we are interetsed in only DATA frame
1109 if(buff_len & VOS_MAC_DATA_FRAME)
1110 {
1111 if((gRoamDelayMetaInfo.hdd_auth_type == eVOS_AUTH_TYPE_RSN_PSK) ||
1112 (gRoamDelayMetaInfo.hdd_auth_type == eVOS_AUTH_TYPE_WPA_PSK))
1113 {
1114 if(vos_skb_is_eapol(skb, VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_11_PKT,
1115 VOS_ETHERTYPE_802_1_X_SIZE) == VOS_TRUE)
1116 {
1117 if(gRoamDelayMetaInfo.dxe_eapol_m2 == 0)
1118 {
Girish Gowli1702d212014-12-24 15:31:07 +05301119 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"DXE XMIT m2");
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301120 gRoamDelayMetaInfo.dxe_eapol_m2 = vos_timer_get_system_time();
1121 }
1122 else if((gRoamDelayMetaInfo.dxe_eapol_m2) && (gRoamDelayMetaInfo.dxe_eapol_m4 == 0))
1123 {
1124 gRoamDelayMetaInfo.dxe_eapol_m4 = vos_timer_get_system_time();
Girish Gowli1702d212014-12-24 15:31:07 +05301125 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,"DXE XMIT m4");
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301126 gRoamDelayMetaInfo.dxe_monitor_tx = MONITOR_EAPOL_DONE;
1127 //We should return from here so can cache the time for first data pkt
1128 return;
1129 }
1130 }
1131 }
1132 else
1133 {
1134 gRoamDelayMetaInfo.dxe_monitor_tx = MONITOR_EAPOL_DONE;
1135 }
1136 //HACK buff len is getting used as FRAME TYPE
1137 if(gRoamDelayMetaInfo.dxe_monitor_tx == MONITOR_EAPOL_DONE)
1138 {
1139 gRoamDelayMetaInfo.dxe_first_tx_time = vos_timer_get_system_time();
1140 gRoamDelayMetaInfo.dxe_monitor_tx = MONITOR_STOP;
1141 gRoamDelayMetaInfo.dxe_first_pkt_len = 75;
1142 if(skb->len < gRoamDelayMetaInfo.dxe_first_pkt_len)
1143 gRoamDelayMetaInfo.dxe_first_pkt_len = skb->len;
1144 vos_mem_copy(&gRoamDelayMetaInfo.dxe_first_pkt_data, skb->data,
1145 gRoamDelayMetaInfo.dxe_first_pkt_len);
1146 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1147 "DXE %s XMIT first data frame after roaming", __func__);
1148 }
1149 }
1150 }
1151 break;
1152 case e_SME_VO_ADDTS_REQ:
1153 gRoamDelayMetaInfo.hdd_addts_vo_req_time = vos_timer_get_system_time();
1154 break;
1155 case e_SME_VO_ADDTS_RSP:
1156 gRoamDelayMetaInfo.hdd_addts_vo_rsp_time = vos_timer_get_system_time();
1157 break;
1158 case e_SME_VI_ADDTS_REQ:
1159 gRoamDelayMetaInfo.hdd_addts_vi_req_time = vos_timer_get_system_time();
1160 break;
1161 case e_SME_VI_ADDTS_RSP:
1162 gRoamDelayMetaInfo.hdd_addts_vi_rsp_time = vos_timer_get_system_time();
1163 break;
1164 case e_CACHE_ROAM_DELAY_DATA:
1165 //Let us copy roam meta info
1166 if(gRoamDelayCurrentIndex > ROAM_DELAY_TABLE_SIZE)
1167 gRoamDelayCurrentIndex = 0;
Girish Gowlifb0bfd32015-01-13 11:42:11 +05301168 vos_mem_copy(&gpRoamDelayTable[gRoamDelayCurrentIndex++],
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301169 &gRoamDelayMetaInfo, sizeof(gRoamDelayMetaInfo));
1170 vos_mem_set(&gRoamDelayMetaInfo, sizeof(gRoamDelayMetaInfo), 0);
1171 break;
1172 default:
1173 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
1174 "%s Invalid roam_event = %d received ", __func__, roam_event);
1175 break;
1176 }
1177}
1178
1179void vos_reset_roam_timer_log(void)
1180{
Girish Gowlifb0bfd32015-01-13 11:42:11 +05301181 if (gpRoamDelayTable != NULL)
1182 {
1183 //Set zero to whole gpRoamDelayTable
1184 vos_mem_set(gpRoamDelayTable, (sizeof(tRoamDelayMetaInfo) * ROAM_DELAY_TABLE_SIZE), 0);
1185 }
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301186}
1187
1188void vos_dump_roam_time_log_service(void)
1189{
Girish Gowlid5634b42014-09-04 23:59:06 +05301190 v_SLONG_t slA, slB, slC, slD, slE, slF, slG, slH, slI, slJ, slK, slL, slM, slRoamDelay;
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301191 tRoamDelayMetaInfo currentRoamDelayInfo;
Girish Gowli1702d212014-12-24 15:31:07 +05301192 v_ULONG_t index = 0,i=0;
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301193
Girish Gowlifb0bfd32015-01-13 11:42:11 +05301194 if (gpRoamDelayTable == NULL)
1195 {
1196 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1197 "Roam delay table is not initialized\n");
1198 return;
1199 }
1200 //Let us first copy the current gRoamDelayMetaInfo into gpRoamDelayTable
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301201 if(gRoamDelayCurrentIndex > ROAM_DELAY_TABLE_SIZE)
1202 gRoamDelayCurrentIndex = 0;
Girish Gowlifb0bfd32015-01-13 11:42:11 +05301203 vos_mem_copy(&gpRoamDelayTable[gRoamDelayCurrentIndex++], &gRoamDelayMetaInfo, sizeof(gRoamDelayMetaInfo));
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301204
Girish Gowli1702d212014-12-24 15:31:07 +05301205 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1206 "** RoamDelay = ( dxe_first_tx_time - disable_tx_queues_time)\n");
Girish Gowlid5634b42014-09-04 23:59:06 +05301207
Girish Gowli1702d212014-12-24 15:31:07 +05301208 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Girish Gowlid5634b42014-09-04 23:59:06 +05301209 "||========================"
1210 "===============|====== A ======|====== B ======|====== C ======|"
1211 "====== D ======|====== E ======|====== F ======|====== G ======|"
1212 "====== H ======|====== I ======|====== J ======|====== K ======|"
1213 "====== L ======|====== M ======||\n");
1214
Girish Gowli1702d212014-12-24 15:31:07 +05301215 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Girish Gowlid5634b42014-09-04 23:59:06 +05301216 "||Sl | Peer MAC address |"
1217 " **RoamDelay** | PreAuth Timer | Disassoc Issue| Add BSS Req |"
1218 " AddBssRsp to | ReassocReq to | ReassocRsp to | Disable to |"
1219 " M1-M2 DXE SW | M1-M2 HDD SW | M3-M4 DXE SW | M3-M4 HDD SW |"
1220 " ReassocRsp to | HDD to DXE ||\n");
1221
Girish Gowli1702d212014-12-24 15:31:07 +05301222 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Girish Gowlid5634b42014-09-04 23:59:06 +05301223 "||No.| |"
1224 " ************* | to Roam Start | to Complete | to Rsp time |"
1225 " Reassoc Req | ReassocRsp | Enable Tx Que | Enable Tx Que |"
1226 " | | | |"
1227 " Set GTK | 1st data frame||\n");
1228
Girish Gowli1702d212014-12-24 15:31:07 +05301229 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Girish Gowlid5634b42014-09-04 23:59:06 +05301230 "||========================"
1231 "================================================================"
1232 "================================================================"
1233 "================================================================"
1234 "===============================||\n");
1235
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301236 for (index = 0; index < gRoamDelayCurrentIndex; index++)
1237 {
Girish Gowlifb0bfd32015-01-13 11:42:11 +05301238 currentRoamDelayInfo = gpRoamDelayTable[index];
Girish Gowlid5634b42014-09-04 23:59:06 +05301239 /* PreAuth Timer to Roam Start */
1240 slA = (currentRoamDelayInfo.preauth_cb_time -
1241 currentRoamDelayInfo.preauth_reassoc_start_time);
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301242
Girish Gowlid5634b42014-09-04 23:59:06 +05301243 /* Disassoc Issue to Complete */
1244 slB = (currentRoamDelayInfo.disassoc_comp_time -
1245 currentRoamDelayInfo.disassoc_issue_time);
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301246
Girish Gowlid5634b42014-09-04 23:59:06 +05301247 /* Add BSS Req to Rsp time */
1248 slC = (currentRoamDelayInfo.lim_add_bss_rsp_time -
1249 currentRoamDelayInfo.lim_add_bss_req_time);
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301250
Girish Gowlid5634b42014-09-04 23:59:06 +05301251 /* AddBssRsp to Reassoc Req */
1252 slD = (currentRoamDelayInfo.send_reassoc_req_time -
1253 currentRoamDelayInfo.lim_add_bss_rsp_time);
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301254
Girish Gowlid5634b42014-09-04 23:59:06 +05301255 /* ReassocReq to ReassocRsp */
1256 slE = (currentRoamDelayInfo.hdd_sendassoc_rsp_time -
1257 currentRoamDelayInfo.send_reassoc_req_time);
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301258
Girish Gowlid5634b42014-09-04 23:59:06 +05301259 /* ReassocRsp to Enable Tx Que */
1260 slF = (currentRoamDelayInfo.enable_tx_queues_reassoc_time -
1261 currentRoamDelayInfo.hdd_sendassoc_rsp_time);
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301262
Girish Gowlid5634b42014-09-04 23:59:06 +05301263 /* Disable to Enable Tx Que */
1264 slG = (currentRoamDelayInfo.enable_tx_queues_reassoc_time -
1265 currentRoamDelayInfo.disable_tx_queues_time);
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301266
Girish Gowlid5634b42014-09-04 23:59:06 +05301267 /* M1-M2 DXE SW */
1268 slH = (currentRoamDelayInfo.dxe_eapol_m2 -
1269 currentRoamDelayInfo.dxe_eapol_m1);
1270
1271 /* M1-M2 HDD SW */
1272 slI = (currentRoamDelayInfo.hdd_eapol_m2 -
1273 currentRoamDelayInfo.hdd_eapol_m1);
1274
1275 /* M3-M4 DXE SW */
1276 slJ = (currentRoamDelayInfo.dxe_eapol_m4 -
1277 currentRoamDelayInfo.dxe_eapol_m3);
1278
1279 /* M3-M4 HDD SW */
1280 slK = (currentRoamDelayInfo.hdd_eapol_m4 -
1281 currentRoamDelayInfo.hdd_eapol_m3);
1282
1283 /* ReassocRsp to Set GTK */
1284 slL = (currentRoamDelayInfo.set_gtk_roam_key_time -
1285 currentRoamDelayInfo.hdd_sendassoc_rsp_time);
1286
1287 /* HDD to DXE 1st data frame */
1288 slM = (currentRoamDelayInfo.dxe_first_tx_time -
1289 currentRoamDelayInfo.hdd_first_xmit_time);
1290
1291 /* Calculate roam delay */
Girish Gowli1702d212014-12-24 15:31:07 +05301292 slRoamDelay = (currentRoamDelayInfo.dxe_first_tx_time -
1293 currentRoamDelayInfo.disable_tx_queues_time);
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301294
Girish Gowli1702d212014-12-24 15:31:07 +05301295 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Girish Gowlid5634b42014-09-04 23:59:06 +05301296 "||%2ld:|<"MAC_ADDRESS_STR">|"
1297 "%14ld |%14ld |%14ld |%14ld |"
1298 "%14ld |%14ld |%14ld |%14ld |"
1299 "%14ld |%14ld |%14ld |%14ld |"
1300 "%14ld |%14ld ||\n",
1301 (index+1), MAC_ADDR_ARRAY(currentRoamDelayInfo.peer_mac_addr),
1302 slRoamDelay, slA, slB, slC,
1303 slD, slE, slF, slG,
1304 slH, slI, slJ, slK,
1305 slL, slM );
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301306 }
Girish Gowlid5634b42014-09-04 23:59:06 +05301307
Girish Gowli1702d212014-12-24 15:31:07 +05301308 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
Girish Gowlid5634b42014-09-04 23:59:06 +05301309 "||========================"
1310 "================================================================"
1311 "================================================================"
1312 "================================================================"
1313 "===============================||\n");
1314
Girish Gowli1702d212014-12-24 15:31:07 +05301315 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1316 "||== More Details ====================="
1317 "===============================||\n");
1318
1319 for (index = 0; index < gRoamDelayCurrentIndex; index++)
1320 {
1321
Girish Gowlifb0bfd32015-01-13 11:42:11 +05301322 currentRoamDelayInfo = gpRoamDelayTable[index];
Girish Gowli1702d212014-12-24 15:31:07 +05301323 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1324 "||%2ld: Peer Mac: <"MAC_ADDRESS_STR">\n",
1325 (index+1), MAC_ADDR_ARRAY(currentRoamDelayInfo.peer_mac_addr)
1326 );
1327
1328 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1329 "||preauth_reassoc_start_time : %14ld\n",
1330 currentRoamDelayInfo.preauth_reassoc_start_time
1331 );
1332
1333 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1334 "||preauth_cb_time : %14ld\n",
1335 currentRoamDelayInfo.preauth_cb_time
1336 );
1337
1338 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1339 "||disable_tx_queues_time : %14ld\n",
1340 currentRoamDelayInfo.disable_tx_queues_time
1341 );
1342
1343 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1344 "||disassoc_issue_time : %14ld\n",
1345 currentRoamDelayInfo.disassoc_issue_time
1346 );
1347
1348 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1349 "||lim_add_bss_req_time : %14ld\n",
1350 currentRoamDelayInfo.lim_add_bss_req_time
1351 );
1352
1353 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1354 "||lim_add_bss_rsp_time : %14ld\n",
1355 currentRoamDelayInfo.lim_add_bss_rsp_time
1356 );
1357
1358 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1359 "||disassoc_comp_time : %14ld\n",
1360 currentRoamDelayInfo.disassoc_comp_time
1361 );
1362
1363 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1364 "||send_reassoc_req_time : %14ld\n",
1365 currentRoamDelayInfo.send_reassoc_req_time
1366 );
1367
1368 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1369 "||hdd_sendassoc_rsp_time : %14ld\n",
1370 currentRoamDelayInfo.hdd_sendassoc_rsp_time
1371 );
1372
1373 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1374 "||enable_tx_queues_time : %14ld\n",
1375 currentRoamDelayInfo.enable_tx_queues_reassoc_time
1376 );
1377
1378 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1379 "||hdd_eapol_m1 : %14ld\n",
1380 currentRoamDelayInfo.hdd_eapol_m1
1381 );
1382
1383 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1384 "||hdd_eapol_m2 : %14ld\n",
1385 currentRoamDelayInfo.hdd_eapol_m2
1386 );
1387
1388 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1389 "||hdd_eapol_m3 : %14ld\n",
1390 currentRoamDelayInfo.hdd_eapol_m3
1391 );
1392
1393 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1394 "||hdd_eapol_m4 : %14ld\n",
1395 currentRoamDelayInfo.hdd_eapol_m4
1396 );
1397
1398 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1399 "||dxe_eapol_m1 : %14ld\n",
1400 currentRoamDelayInfo.dxe_eapol_m1
1401 );
1402
1403 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1404 "||dxe_eapol_m2 : %14ld\n",
1405 currentRoamDelayInfo.dxe_eapol_m2
1406 );
1407
1408 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1409 "||dxe_eapol_m3 : %14ld\n",
1410 currentRoamDelayInfo.dxe_eapol_m3
1411 );
1412
1413 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1414 "||dxe_eapol_m4 : %14ld\n",
1415 currentRoamDelayInfo.dxe_eapol_m4
1416 );
1417
1418 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1419 "||set_ptk_roam_key_time : %14ld\n",
1420 currentRoamDelayInfo.set_ptk_roam_key_time
1421 );
1422
1423 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1424 "||set_gtk_roam_key_time : %14ld\n",
1425 currentRoamDelayInfo.set_gtk_roam_key_time
1426 );
1427
1428 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1429 "||tl_fetch_pkt_time : %14ld\n",
1430 currentRoamDelayInfo.tl_fetch_pkt_time
1431 );
1432
1433 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1434 "||hdd_first_xmit_time : %14ld\n",
1435 currentRoamDelayInfo.hdd_first_xmit_time
1436 );
1437
1438 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1439 "||dxe_first_tx_time : %14ld\n",
1440 currentRoamDelayInfo.dxe_first_tx_time
1441 );
1442
1443 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1444 "||hdd_first_pkt_data : \n"
1445 );
1446
1447
1448 for (i=0; i<currentRoamDelayInfo.hdd_first_pkt_len && i< (50-8); i+=8)
1449 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1450 "||%2X, %2X, %2X, %2X, %2X, %2X, %2X, %2X, ",
1451 currentRoamDelayInfo.hdd_first_pkt_data[i],
1452 currentRoamDelayInfo.hdd_first_pkt_data[i+1],
1453 currentRoamDelayInfo.hdd_first_pkt_data[i+2],
1454 currentRoamDelayInfo.hdd_first_pkt_data[i+3],
1455 currentRoamDelayInfo.hdd_first_pkt_data[i+4],
1456 currentRoamDelayInfo.hdd_first_pkt_data[i+5],
1457 currentRoamDelayInfo.hdd_first_pkt_data[i+6],
1458 currentRoamDelayInfo.hdd_first_pkt_data[i+7]
1459 );
1460
1461 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1462 "||dxe_first_pkt_data : \n"
1463 );
1464
1465 for (i=0; i<currentRoamDelayInfo.dxe_first_pkt_len && i < (75-8); i+=8)
1466 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1467 "||%2X, %2X, %2X, %2X, %2X, %2X, %2X, %2X, ",
1468 currentRoamDelayInfo.dxe_first_pkt_data[i],
1469 currentRoamDelayInfo.dxe_first_pkt_data[i+1],
1470 currentRoamDelayInfo.dxe_first_pkt_data[i+2],
1471 currentRoamDelayInfo.dxe_first_pkt_data[i+3],
1472 currentRoamDelayInfo.dxe_first_pkt_data[i+4],
1473 currentRoamDelayInfo.dxe_first_pkt_data[i+5],
1474 currentRoamDelayInfo.dxe_first_pkt_data[i+6],
1475 currentRoamDelayInfo.dxe_first_pkt_data[i+7]
1476 );
1477 }
1478 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
1479 "||== END ====================="
1480 "===============================||\n");
Mukul Sharmad96e5e32014-06-25 17:45:39 +05301481}
Sushant Kaushik33200572015-08-05 16:46:20 +05301482
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +05301483v_U32_t vos_copy_80211_data(void *pBuff, v_U8_t *dst, v_U8_t frametype)
Sushant Kaushik33200572015-08-05 16:46:20 +05301484{
1485 vos_pkt_t *vos_pkt = NULL;
1486 struct sk_buff *skb = NULL;
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +05301487 v_U32_t length_to_copy;
Sushant Kaushik33200572015-08-05 16:46:20 +05301488
1489 vos_pkt = (vos_pkt_t *)pBuff;
1490
1491 if(!vos_pkt || !dst)
1492 {
1493 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1494 "vos_pkt/dst is null");
1495 return 0;
1496 }
1497 skb = vos_pkt->pSkb;
1498 if(!skb)
1499 {
1500 VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
1501 " skb is null");
1502 return 0;
1503 }
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +05301504 if (VOS_MAC_MGMT_FRAME == frametype)
Sushant Kaushik33200572015-08-05 16:46:20 +05301505 {
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +05301506 length_to_copy = skb->len;
1507 }
1508 else
1509 {
1510 length_to_copy = VOS_DEF_PKT_STATS_LEN_TO_COPY;
1511 if(skb->data[0] == VOS_QOS_DATA_VALUE)
1512 length_to_copy += VOS_QOS_SIZE;
1513
1514 /* Copy whole skb data if DHCP or EAPOL pkt.Here length_to_copy
1515 * will give the pointer to IP header and adding VOS_IP_HEADER_SIZE
1516 * to it will give the DHCP port number.
1517 */
1518 if (((skb->len > (length_to_copy + VOS_IP_HEADER_SIZE)) &&
1519 ((*((u16*)((u8*)skb->data + length_to_copy + VOS_IP_HEADER_SIZE))
1520 == VOS_DHCP_SOURCE_PORT) ||
1521 (*((u16*)((u8*)skb->data + length_to_copy + VOS_IP_HEADER_SIZE))
1522 == VOS_DHCP_DESTINATION_PORT))) ||
1523 vos_skb_is_eapol(skb,
1524 VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_11_PKT,
1525 VOS_ETHERTYPE_802_1_X_SIZE))
1526 {
1527 length_to_copy = skb->len;
1528 }
Sushant Kaushik33200572015-08-05 16:46:20 +05301529 }
1530
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +05301531 if (length_to_copy > skb->len)
Sushant Kaushik33200572015-08-05 16:46:20 +05301532 {
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +05301533 length_to_copy = skb->len;
1534 }
1535 if (length_to_copy > MAX_PKT_STAT_DATA_LEN)
1536 {
1537 length_to_copy = MAX_PKT_STAT_DATA_LEN;
Sushant Kaushik33200572015-08-05 16:46:20 +05301538 }
1539
Abhishek Singhb3e1e7b2015-10-12 16:23:33 +05301540 vos_mem_copy(dst, skb->data, length_to_copy);
Sushant Kaushik33200572015-08-05 16:46:20 +05301541 return length_to_copy;
1542}