Home | History | Annotate | Download | only in security
      1 /****************************************************************************
      2 **+-----------------------------------------------------------------------+**
      3 **|                                                                       |**
      4 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved.      |**
      5 **| All rights reserved.                                                  |**
      6 **|                                                                       |**
      7 **| Redistribution and use in source and binary forms, with or without    |**
      8 **| modification, are permitted provided that the following conditions    |**
      9 **| are met:                                                              |**
     10 **|                                                                       |**
     11 **|  * Redistributions of source code must retain the above copyright     |**
     12 **|    notice, this list of conditions and the following disclaimer.      |**
     13 **|  * Redistributions in binary form must reproduce the above copyright  |**
     14 **|    notice, this list of conditions and the following disclaimer in    |**
     15 **|    the documentation and/or other materials provided with the         |**
     16 **|    distribution.                                                      |**
     17 **|  * Neither the name Texas Instruments nor the names of its            |**
     18 **|    contributors may be used to endorse or promote products derived    |**
     19 **|    from this software without specific prior written permission.      |**
     20 **|                                                                       |**
     21 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |**
     22 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |**
     23 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
     24 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |**
     25 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
     26 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |**
     27 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
     28 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
     29 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |**
     30 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
     31 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |**
     32 **|                                                                       |**
     33 **+-----------------------------------------------------------------------+**
     34 ****************************************************************************/
     35 
     36 #include "whalCommon.h"
     37 #include "whalCtrl_api.h"
     38 #include "whalCtrl.h"
     39 #include "whalSecurity.h"
     40 
     41 
     42 /*
     43  * ----------------------------------------------------------------------------
     44  * Function : whalSecur_Create
     45  *
     46  * Input    :
     47  * Output   :
     48  * Process  :
     49  * Note(s)  :
     50  * -----------------------------------------------------------------------------
     51  */
     52 TI_HANDLE whalSecur_Create (TI_HANDLE hOs, TI_HANDLE hWhalCtrl, UINT16 numOfStations)
     53 {
     54 	WHAL_SECURITY* pWhalSecur;
     55 
     56 	pWhalSecur = (WHAL_SECURITY *)os_memoryAlloc (hOs, sizeof(WHAL_SECURITY));
     57 	if (pWhalSecur == NULL)
     58 		return NULL;
     59 
     60 	os_memoryZero (hOs, (void *)pWhalSecur, sizeof(WHAL_SECURITY));
     61 
     62 	pWhalSecur->pWhalCtrl = (WHAL_CTRL*)hWhalCtrl;
     63 	pWhalSecur->hOs = hOs;
     64 	pWhalSecur->securityMode = RSN_CIPHER_NONE;
     65 
     66 	pWhalSecur->pWhalWep = (WHAL_WEP*)whalWep_Create (hOs, hWhalCtrl);
     67 	if (pWhalSecur->pWhalWep == NULL)
     68 	{
     69 		whalSecur_Destroy(pWhalSecur, numOfStations);
     70 		return NULL;
     71 	}
     72 	pWhalSecur->pWhalWpa = (WHAL_WPA*)whalWpa_Create (hOs, hWhalCtrl);
     73 	if (pWhalSecur->pWhalWpa == NULL)
     74 	{
     75 		whalSecur_Destroy(pWhalSecur, numOfStations);
     76 		return NULL;
     77 	}
     78 #ifdef CKIP_ENABLED
     79 	pWhalSecur->pWhalPrivacy = (privacy_t*)privacy_create (hOs);
     80 	pWhalSecur->pWhalExc = (WHAL_EXC*)whalExc_Create(hOs, hWhalCtrl);
     81 	if (pWhalSecur->pWhalExc == NULL)
     82 	{
     83 		whalSecur_Destroy(pWhalSecur, numOfStations);
     84 		return NULL;
     85 	}
     86 #endif /* CKIP_ENABLED */
     87 	pWhalSecur->numOfStations = numOfStations;
     88 	pWhalSecur->reconfData.reconfKeys = (securityKeys_t*)os_memoryAlloc (hOs,
     89 										(sizeof(securityKeys_t))*(numOfStations*NO_OF_RECONF_SECUR_KEYS_PER_STATION+NO_OF_EXTRA_RECONF_SECUR_KEYS));
     90 	os_memoryZero (hOs, (void *)pWhalSecur->reconfData.reconfKeys,
     91 										(sizeof(securityKeys_t))*(numOfStations*NO_OF_RECONF_SECUR_KEYS_PER_STATION+NO_OF_EXTRA_RECONF_SECUR_KEYS));
     92 
     93 	return ((TI_HANDLE)pWhalSecur);
     94 }
     95 
     96 /*
     97  * ----------------------------------------------------------------------------
     98  * Function : whalSecur_Config
     99  *
    100  * Input    :
    101  * Output   :
    102  * Process  :
    103  * Note(s)  :
    104  * -----------------------------------------------------------------------------
    105  */
    106 int whalSecur_Config (TI_HANDLE hWhalSecur, whalSecur_config_t* pWhalSecurCfg)
    107 {
    108 	UINT32 index;
    109 	whalWep_config_t wepCfg;
    110 	whalWpa_config_t wpaCfg;
    111 #ifdef CKIP_ENABLED
    112 	whalExc_config_t excCfg;
    113 #endif /* CKIP_ENABLED*/
    114 
    115 	WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
    116 
    117 	/* Reset all reconfig valid fields*/
    118 	pWhalSecur->reconfData.isHwEncDecrEnableValid = FALSE;
    119 	pWhalSecur->reconfData.isDefaultKeyIdValid = FALSE;
    120 	for (index=0; index < ((pWhalSecur->numOfStations)*NO_OF_RECONF_SECUR_KEYS_PER_STATION+NO_OF_EXTRA_RECONF_SECUR_KEYS); index++)
    121 			(pWhalSecur->reconfData.reconfKeys+index)->keyType = NULL_KEY;
    122 
    123 	/* Save configuration parameters */
    124 	pWhalSecur->hMemMgr = pWhalSecurCfg->hMemMgr;
    125 	pWhalSecur->hReport = pWhalSecurCfg->hReport;
    126 
    127 
    128 	/* Config the wep sub-module*/
    129 	wepCfg.hMemMgr = pWhalSecur->hMemMgr;
    130 	wepCfg.hReport = pWhalSecur->hReport;
    131 	if (whalWep_Config (pWhalSecur->pWhalWep, &wepCfg) != OK)
    132 		return (NOK);
    133 
    134 	/* Config the wpa sub-module*/
    135 	wpaCfg.hMemMgr = pWhalSecur->hMemMgr;
    136 	wpaCfg.hReport = pWhalSecur->hReport;
    137 	if (whalWpa_Config (pWhalSecur->pWhalWpa, &wpaCfg) != OK)
    138 		return (NOK);
    139 
    140 #ifdef CKIP_ENABLED
    141     wpaCfg.pWhalPrivacy = pWhalSecur->pWhalPrivacy;
    142 	/* Config the privacy sub-module*/
    143 	if (privacy_config (pWhalSecur->pWhalPrivacy,
    144 						pWhalSecur->hReport, pWhalSecur->hOs) != OK)
    145 		return (NOK);
    146 	excCfg.hMemMgr = pWhalSecur->hMemMgr;
    147 	excCfg.hReport = pWhalSecur->hReport;
    148 	excCfg.pWhalPrivacy = pWhalSecur->pWhalPrivacy;
    149 	if (whalExc_Config (pWhalSecur->pWhalExc, &excCfg) != OK)
    150 		return (NOK);
    151 #endif /*CKIP_ENABLED */
    152 
    153 	return (OK);
    154 }
    155 
    156 
    157 /*
    158  * ----------------------------------------------------------------------------
    159  * Function : whalSecur_KeyAdd
    160  *
    161  * Input    :
    162  * Output   :
    163  * Process  :
    164  * Note(s)  :
    165  * -----------------------------------------------------------------------------
    166  */
    167 int whalSecur_KeyAdd (TI_HANDLE hWhalSecur, securityKeys_t* pKey, BOOL reconfFlag, void *CB_Func, TI_HANDLE CB_handle)
    168 {
    169 	WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
    170 	UINT8          keyIdx     = (UINT8)pKey->keyIndex;
    171 
    172 	/* store the security key for reconfigure time (FW reload)*/
    173 	if (reconfFlag != TRUE)
    174 	{
    175 	  	if (keyIdx >= ((pWhalSecur->numOfStations)*NO_OF_RECONF_SECUR_KEYS_PER_STATION+NO_OF_EXTRA_RECONF_SECUR_KEYS))
    176 		{
    177 			WLAN_REPORT_ERROR(pWhalSecur->hReport, HAL_SECURITY_MODULE_LOG,
    178 				("whalSecur_KeyAdd: ERROR Key keyIndex field out of range =%d, range is (0 to %d)\n",
    179 				 pKey->keyIndex, (pWhalSecur->numOfStations)*NO_OF_RECONF_SECUR_KEYS_PER_STATION+NO_OF_EXTRA_RECONF_SECUR_KEYS-1));
    180 
    181 			return (NOK);
    182 		}
    183 
    184 		if (pKey->keyType == NULL_KEY)
    185 		{
    186 			WLAN_REPORT_ERROR(pWhalSecur->hReport, HAL_SECURITY_MODULE_LOG,
    187 								("whalSecur_KeyAdd: ERROR KeyType is NULL_KEY\n"));
    188 
    189 			return (NOK);
    190 		}
    191 
    192 		os_memoryCopy (pWhalSecur->hOs,
    193 				(void *)(pWhalSecur->reconfData.reconfKeys + keyIdx),
    194 				(void *)pKey, sizeof(securityKeys_t));
    195 	}
    196 
    197 	switch (pWhalSecur->securityMode)
    198 	{
    199 		case RSN_CIPHER_WEP:
    200 		case RSN_CIPHER_WEP104:
    201 			return (whalWep_KeyAdd (pWhalSecur->pWhalWep, pKey, CB_Func, CB_handle));
    202 
    203 		case RSN_CIPHER_TKIP:
    204 		case RSN_CIPHER_AES_CCMP:
    205 			return (whalWpa_KeyAdd (pWhalSecur->pWhalWpa, pKey, CB_Func, CB_handle));
    206 
    207 		default:
    208 			return (NOK);
    209 	}
    210 
    211 }
    212 
    213 /*
    214  * ----------------------------------------------------------------------------
    215  * Function : whalSecur_KeyRemove
    216  *
    217  * Input    :
    218  * Output   :
    219  * Process  :
    220  * Note(s)  :
    221  * -----------------------------------------------------------------------------
    222  */
    223 int whalSecur_KeyRemove (TI_HANDLE hWhalSecur, securityKeys_t* pKey, BOOL reconfFlag, void *CB_Func, TI_HANDLE CB_handle)
    224 {
    225 	WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
    226 
    227 	switch (pWhalSecur->securityMode)
    228 	{
    229 		case RSN_CIPHER_WEP:
    230 		case RSN_CIPHER_WEP104:
    231 			return (whalWep_KeyRemove (pWhalSecur->pWhalWep, pKey, CB_Func, CB_handle));
    232 
    233 		case RSN_CIPHER_TKIP:
    234 		case RSN_CIPHER_AES_CCMP:
    235 			return (whalWpa_KeyRemove (pWhalSecur->pWhalWpa, pKey, CB_Func, CB_handle));
    236 
    237 		default:
    238 			return (NOK);
    239 	}
    240 
    241 }
    242 
    243 /*
    244  * ----------------------------------------------------------------------------
    245  * Function : whalSecur_DefaultKeyIdSet
    246  *
    247  * Input    :
    248  * Output   :
    249  * Process  :
    250  * Note(s)  :
    251  * -----------------------------------------------------------------------------
    252  */
    253 int whalSecur_DefaultKeyIdSet (TI_HANDLE hWhalSecur, UINT8 aKeyId, void *CB_Func, TI_HANDLE CB_handle)
    254 {
    255 	WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
    256 
    257 	/* store the default key ID value for reconfigure time (FW reload)*/
    258 	pWhalSecur->reconfData.reconfDefaultKeyId = aKeyId;
    259 
    260 	switch (pWhalSecur->securityMode)
    261 	{
    262 		case RSN_CIPHER_WEP:
    263 		case RSN_CIPHER_WEP104:
    264 			pWhalSecur->reconfData.isDefaultKeyIdValid = TRUE;
    265 			return (whalWep_DefaultKeyIdSet (pWhalSecur->pWhalWep, aKeyId, CB_Func, CB_handle));
    266 
    267 		case RSN_CIPHER_TKIP:
    268 		case RSN_CIPHER_AES_CCMP:
    269 			pWhalSecur->reconfData.isDefaultKeyIdValid = TRUE;
    270 			return (whalWpa_DefaultKeyIdSet (pWhalSecur->pWhalWpa, aKeyId, CB_Func, CB_handle));
    271 
    272 		default:
    273 			return (NOK);
    274 	}
    275 
    276 }
    277 
    278 /*
    279  * ----------------------------------------------------------------------------
    280  * Function : whalSecur_HwEncDecrEnable
    281  *
    282  * Input    :
    283  * Output   :
    284  * Process  :
    285  * Note(s)  :
    286  * -----------------------------------------------------------------------------
    287  */
    288 int whalSecur_HwEncDecrEnable (TI_HANDLE hWhalSecur, BOOL aHwEncEnable)
    289 {
    290 	WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
    291 
    292 	/* store the HW encryption Enable flag for reconfigure time (FW reload)*/
    293 	pWhalSecur->reconfData.reconfHwEncEnable = aHwEncEnable;
    294 
    295 	pWhalSecur->reconfData.isHwEncDecrEnableValid = TRUE;
    296 
    297     return (whal_hwCtrl_EncDecrSet (pWhalSecur->pWhalCtrl->pHwCtrl, aHwEncEnable, aHwEncEnable));
    298 }
    299 
    300 #ifdef CKIP_ENABLED
    301 /*
    302  * ----------------------------------------------------------------------------
    303  * Function : whalSecur_SwEncEnable
    304  *
    305  * Input    :
    306  * Output   :
    307  * Process  :
    308  * Note(s)  :
    309  * -----------------------------------------------------------------------------
    310  */
    311 int whalSecur_SwEncEnable (TI_HANDLE hWhalSecur, BOOL aSwEncEnable)
    312 {
    313 	WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
    314 
    315 	return (whalExc_swEncEnable (pWhalSecur->pWhalExc, aSwEncEnable));
    316 }
    317 
    318 /*
    319  * ----------------------------------------------------------------------------
    320  * Function : whalSecur_MicFieldEnable
    321  *
    322  * Input    :
    323  * Output   :
    324  * Process  :
    325  * Note(s)  :
    326  * -----------------------------------------------------------------------------
    327  */
    328 int whalSecur_MicFieldEnable (TI_HANDLE hWhalSecur, BOOL aMicFieldEnable)
    329 {
    330 	WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
    331 
    332 	return (whalExc_micFieldEnable (pWhalSecur->pWhalExc, aMicFieldEnable));
    333 }
    334 #endif /*CKIP_ENABLED*/
    335 
    336 /*
    337  * ----------------------------------------------------------------------------
    338  * Function : whalSecur_SecurModeSet
    339  *
    340  * Input    :
    341  * Output   :
    342  * Process  :
    343  * Note(s)  :
    344  * -----------------------------------------------------------------------------
    345  */
    346 int whalSecur_SecurModeSet (TI_HANDLE hWhalSecur, cipherSuite_e aSecurMode)
    347 {
    348 	UINT32 index;
    349 	WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
    350 	if (aSecurMode<=RSN_CIPHER_CKIP)
    351 	{
    352 		WLAN_REPORT_INFORMATION (pWhalSecur->hReport, HAL_SECURITY_MODULE_LOG,
    353 								("whalSecur_SecurModeSet: change security mode from %d --> %d\n",
    354 							     pWhalSecur->securityMode, aSecurMode));
    355 		/* check if security mode is equal to previous one*/
    356 		if (pWhalSecur->securityMode == aSecurMode)
    357 			return (OK);
    358 
    359 		/* Reset all reconfig valid fields*/
    360 		pWhalSecur->reconfData.isHwEncDecrEnableValid = FALSE;
    361 		pWhalSecur->reconfData.isDefaultKeyIdValid = FALSE;
    362 		for (index=0; index < ((pWhalSecur->numOfStations)*NO_OF_RECONF_SECUR_KEYS_PER_STATION+NO_OF_EXTRA_RECONF_SECUR_KEYS); index++)
    363 				(pWhalSecur->reconfData.reconfKeys+index)->keyType = NULL_KEY;
    364 
    365         /* set the new security mode*/
    366 		pWhalSecur->securityMode = aSecurMode;
    367 
    368 #ifdef CKIP_ENABLED
    369 		/* Upon entering to RSN_PRIVACY_EXC mode, disable the excSwEnc and excMicField flags,
    370 		   reset the privacy Enc sub-module */
    371 		if (aSecurMode == RSN_CIPHER_CKIP)
    372 		{
    373 			if (whalExc_swEncEnable (pWhalSecur->pWhalExc, FALSE) != OK)
    374 				return (NOK);
    375 
    376 			if (whalExc_micFieldEnable (pWhalSecur->pWhalExc, FALSE) != OK)
    377 				return (NOK);
    378 
    379 			if (privacy_resetEnc (pWhalSecur->pWhalPrivacy) != OK)
    380 				return (NOK);
    381 		}
    382 
    383 		privacy_setPrivacyMode(pWhalSecur->pWhalPrivacy, aSecurMode);
    384 #endif /* CKIP_ENABLED*/
    385 
    386 		/* disable defrag, duplicate detection on TNETW+EXC on chip level*/
    387 		if (pWhalSecur->securityMode==RSN_CIPHER_CKIP)
    388 			/* YV- to add fragmentation control (if there is- artur ?)*/
    389 			return (whal_hwCtrl_RxMsduFormatSet (pWhalSecur->pWhalCtrl->pHwCtrl, FALSE));
    390 		else
    391 			/* YV- to add fragmentation control (if there is- artur ?)*/
    392 			return (whal_hwCtrl_RxMsduFormatSet (pWhalSecur->pWhalCtrl->pHwCtrl, TRUE));
    393 
    394 
    395 	}
    396 	else
    397 		return (NOK);
    398 }
    399 
    400 /*
    401  * ----------------------------------------------------------------------------
    402  * Function : whalSecur_SecurModeGet
    403  *
    404  * Input    :
    405  * Output   :	security mode
    406  * Process  :
    407  * Note(s)  :
    408  * -----------------------------------------------------------------------------
    409  */
    410 cipherSuite_e whalSecur_SecurModeGet (TI_HANDLE hWhalSecur)
    411 {
    412 	WHAL_SECURITY* pWhalSecur = (TI_HANDLE)hWhalSecur;
    413 
    414 	return pWhalSecur->securityMode;
    415 }
    416 
    417 
    418 /*
    419  * ----------------------------------------------------------------------------
    420  * Function : whalSecur_KeysReconfig
    421  *
    422  * Input    :
    423  * Output   :
    424  * Process  : Reconfig security keys, default key Id and encryption/decryption
    425  *			  control to the FW
    426  * Note(s)  :
    427  * -----------------------------------------------------------------------------
    428  */
    429 int whalSecur_KeysReconfig (TI_HANDLE hWhalSecur)
    430 {
    431 	UINT32 index;
    432 	WHAL_SECURITY* pWhalSecur = (WHAL_SECURITY *)hWhalSecur;
    433 
    434 
    435 	if (pWhalSecur->securityMode != RSN_CIPHER_NONE)
    436 	{
    437 
    438 		/* set the keys to the HW*/
    439 		for (index=0; index < ((pWhalSecur->numOfStations)*NO_OF_RECONF_SECUR_KEYS_PER_STATION+NO_OF_EXTRA_RECONF_SECUR_KEYS); index++)
    440 		{
    441 			if ((pWhalSecur->reconfData.reconfKeys+index)->keyType != NULL_KEY)
    442 			{
    443 				if (whalSecur_KeyAdd (pWhalSecur, pWhalSecur->reconfData.reconfKeys+index, TRUE, NULL, NULL) != OK)
    444 				{
    445 					WLAN_REPORT_ERROR(pWhalSecur->hReport, HAL_SECURITY_MODULE_LOG,
    446 						("whalSecur_KeysReconfig: ERROR whalSecur_KeyAdd failure index=%d\n", index));
    447 					return (NOK);
    448 				}
    449 			}
    450 		}
    451 
    452 		if (pWhalSecur->reconfData.isDefaultKeyIdValid == TRUE)
    453 		{
    454 			/* set the deafult key ID to the HW*/
    455 			if (whalSecur_DefaultKeyIdSet (pWhalSecur, pWhalSecur->reconfData.reconfDefaultKeyId, NULL, NULL) != OK)
    456 			{
    457 				WLAN_REPORT_ERROR(pWhalSecur->hReport, HAL_SECURITY_MODULE_LOG,
    458 					("whalSecur_KeysReconfig: ERROR whalSecur_DefaultKeyIdSet failure \n"));
    459 				return (NOK);
    460 			}
    461 		}
    462 	} /* pWhalSecur->securityMode != RSN_CIPHER_NONE */
    463 
    464 
    465 	/* set the encryption/decryption control on the HW*/
    466 	if (whalSecur_HwEncDecrEnable (pWhalSecur, pWhalSecur->reconfData.reconfHwEncEnable) != OK)
    467 	{
    468 		WLAN_REPORT_ERROR(pWhalSecur->hReport, HAL_SECURITY_MODULE_LOG,
    469 			("whalSecur_KeysReconfig: ERROR whalSecur_HwEncDecrEnable failure \n"));
    470 		return (NOK);
    471 	}
    472 
    473 	return (OK);
    474 }
    475 
    476 /*
    477  * ----------------------------------------------------------------------------
    478  * Function : whalSecur_Destroy
    479  *
    480  * Input    :
    481  * Output   :
    482  * Process  : Unload the HAL security module
    483  * Note(s)  :
    484  * -----------------------------------------------------------------------------
    485  */
    486 int whalSecur_Destroy (TI_HANDLE hWhalSecur, UINT16 numOfStations)
    487 {
    488 	WHAL_SECURITY* pWhalSecur = (WHAL_SECURITY *)hWhalSecur;
    489 
    490 	if (!pWhalSecur)
    491 		return OK;
    492 #ifdef CKIP_ENABLED
    493 	whalExc_Destroy (pWhalSecur->pWhalExc);
    494 	if (privacy_unload(pWhalSecur->pWhalPrivacy) != OK)
    495 		WLAN_REPORT_ERROR(pWhalSecur->hReport, HAL_CTRL_MODULE_LOG,  (" whalSecur_Destroy: privacy_unload failure \n"));
    496 #endif /* CKIP_ENABLED*/
    497 
    498 	if (whalWpa_Destroy (pWhalSecur->pWhalWpa) != OK)
    499 		WLAN_REPORT_ERROR(pWhalSecur->hReport, HAL_CTRL_MODULE_LOG,  (" whalSecur_Destroy: whalWpa_Destroy failure \n"));
    500 	if (whalWep_Destroy (pWhalSecur->pWhalWep) != OK)
    501 		WLAN_REPORT_ERROR(pWhalSecur->hReport, HAL_CTRL_MODULE_LOG,  (" whalSecur_Destroy: whalWep_Destroy failure \n"));
    502 
    503 	if (pWhalSecur->reconfData.reconfKeys)
    504 		os_memoryFree (pWhalSecur->hOs, pWhalSecur->reconfData.reconfKeys,
    505 				   (sizeof(securityKeys_t))*(numOfStations*NO_OF_RECONF_SECUR_KEYS_PER_STATION+NO_OF_EXTRA_RECONF_SECUR_KEYS));
    506 
    507 	os_memoryFree (pWhalSecur->hOs, pWhalSecur, sizeof(WHAL_SECURITY));
    508 
    509 	return (OK);
    510 }
    511 
    512