Home | History | Annotate | Download | only in src
      1 /*
      2  * wpa_core.c
      3  *
      4  * Copyright 2001-2010 Texas Instruments, Inc. - http://www.ti.com/
      5  *
      6  * Licensed under the Apache License, Version 2.0 (the "License");
      7  * you may not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  *     http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing, software
     13  * distributed under the License is distributed on an "AS IS" BASIS,
     14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  * See the License for the specific language governing permissions and
     16  * limitations under the License.
     17  */
     18 
     19 /****************************************************************************
     20 *
     21 *   MODULE:  Wpa_Core.c
     22 *
     23 *   PURPOSE:
     24 *
     25 *   DESCRIPTION:
     26 *   ============
     27 *
     28 *
     29 ****************************************************************************/
     30 
     31 /* includes */
     32 /************/
     33 
     34 #ifdef ANDROID
     35 #include <unistd.h>
     36 #endif
     37 
     38 #include <netinet/if_ether.h>
     39 
     40 #include "cu_osapi.h"
     41 #include "TWDriver.h"
     42 #include "config_ssid.h"
     43 #include "driver.h"
     44 #include "ipc_wpa.h"
     45 #include "wpa_core.h"
     46 #include "oserr.h"
     47 
     48 /* defines */
     49 /***********/
     50 #ifdef CONFIG_WPS
     51 #define WSC_MODE_OFF	0
     52 #define WSC_MODE_PIN	1
     53 #define WSC_MODE_PBC	2
     54 #endif
     55 
     56 /* local types */
     57 /***************/
     58 /* Network configuration block - holds candidate connection parameters */
     59 typedef struct
     60 {
     61 	S32 mode;
     62 	S32 proto;
     63 	S32 key_mgmt;
     64 	S32 auth_alg;
     65 	S32 pair_wise;
     66 	S32 group;
     67 	U8 pass_phrase[WPACORE_MAX_PSK_STRING_LENGTH];
     68 	U8 wep_key[4][32];
     69 	U8 default_wep_key;
     70 	U8 wep_key_length;
     71 #ifdef CONFIG_WPS
     72 	U8	WscMode;
     73 	PS8 pWscPin;
     74 #endif
     75     S32 eap;
     76     U8 Identity[WPACORE_MAX_CERT_PASSWORD_LENGTH];
     77     U8 private_key_passwd[WPACORE_MAX_CERT_PASSWORD_LENGTH];
     78     U8 private_key[WPACORE_MAX_CERT_PASSWORD_LENGTH];
     79     U8 client_cert[WPACORE_MAX_CERT_FILE_NAME_LENGTH];
     80     U8 password[WPACORE_MAX_CERT_PASSWORD_LENGTH];
     81     U8 anyWpaMode;
     82 #ifdef XCC_MODULE_INCLUDED
     83     U16 XCC;
     84 #endif
     85 } TWpaCore_WpaSupplParams;
     86 
     87 typedef struct
     88 {
     89 	OS_802_11_AUTHENTICATION_MODE AuthMode;
     90 	OS_802_11_ENCRYPTION_TYPES EncryptionTypePairWise;
     91 	OS_802_11_ENCRYPTION_TYPES EncryptionTypeGroup;
     92 } TWpaCore_WpaParams;
     93 
     94 /* Module control block */
     95 typedef struct TWpaCore
     96 {
     97     THandle hIpcWpa;
     98 
     99     S32 CurrentNetwork;
    100 
    101 	TWpaCore_WpaSupplParams WpaSupplParams;
    102 	TWpaCore_WpaParams WpaParams;
    103 } TWpaCore;
    104 
    105 /* local variables */
    106 /*******************/
    107 
    108 /* local fucntions */
    109 /*******************/
    110 static VOID WpaCore_InitWpaParams(TWpaCore* pWpaCore)
    111 {
    112       os_memset( &pWpaCore->WpaSupplParams, 0, sizeof(TWpaCore_WpaSupplParams));
    113 	  pWpaCore->WpaSupplParams.mode = IEEE80211_MODE_INFRA;         /* Default is Infrastructure mode */
    114 	  pWpaCore->WpaSupplParams.proto = 0;                           /* key negotiation protocol - WPA is ok even though no security is used */
    115 	  pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_NONE;        /* No key management suite */
    116 	  pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN;        /* Open authentication */
    117 	  pWpaCore->WpaSupplParams.pair_wise = WPA_CIPHER_NONE;
    118 	  pWpaCore->WpaSupplParams.group = WPA_CIPHER_NONE;
    119       pWpaCore->WpaSupplParams.anyWpaMode = 0;
    120 #ifdef CONFIG_WPS
    121 	pWpaCore->WpaSupplParams.pWscPin = NULL;
    122 	pWpaCore->WpaSupplParams.WscMode = WSC_MODE_OFF;
    123 #endif
    124 
    125 	pWpaCore->WpaParams.AuthMode = os802_11AuthModeOpen;
    126 	pWpaCore->WpaParams.EncryptionTypeGroup = OS_ENCRYPTION_TYPE_NONE;
    127 	pWpaCore->WpaParams.EncryptionTypePairWise = OS_ENCRYPTION_TYPE_NONE;
    128 }
    129 
    130 /* functions */
    131 /*************/
    132 THandle WpaCore_Create(PS32 pRes, PS8 pSupplIfFile)
    133 {
    134 	TWpaCore* pWpaCore = (TWpaCore*)os_MemoryCAlloc(sizeof(TWpaCore), sizeof(U8));
    135 	if(pWpaCore == NULL)
    136 	{
    137 		*pRes = OK;
    138 		os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - WpaCore_Create - cant allocate control block\n");
    139 		return NULL;
    140 	}
    141 
    142     pWpaCore->hIpcWpa = IpcWpa_Create(pRes, pSupplIfFile);
    143 	if(pWpaCore->hIpcWpa == NULL)
    144 	{
    145 		WpaCore_Destroy(pWpaCore);
    146 		return NULL;
    147 	}
    148 
    149 	WpaCore_InitWpaParams(pWpaCore);
    150 
    151 	pWpaCore->CurrentNetwork = -1;
    152 
    153 	/* send default configuration to the supplicant */
    154 	IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"AP_SCAN 2", FALSE);
    155 
    156 	return pWpaCore;
    157 }
    158 
    159 VOID WpaCore_Destroy(THandle hWpaCore)
    160 {
    161 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    162 
    163 	if(pWpaCore->hIpcWpa)
    164 		IpcWpa_Destroy(pWpaCore->hIpcWpa);
    165 #ifdef CONFIG_WPS
    166 	if(pWpaCore->WpaSupplParams.pWscPin)
    167 		os_MemoryFree(pWpaCore->WpaSupplParams.pWscPin);
    168 #endif
    169 
    170 	os_MemoryFree(pWpaCore);
    171 }
    172 
    173 #ifdef XCC_MODULE_INCLUDED
    174 S32 WpaCore_SetXCC(THandle hWpaCore, U16 XCCConfig)
    175 {
    176     TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    177 
    178     pWpaCore->WpaSupplParams.XCC = XCCConfig;
    179 
    180     return TI_OK;
    181 }
    182 #endif
    183 
    184 S32 WpaCore_SetAuthMode(THandle hWpaCore, OS_802_11_AUTHENTICATION_MODE AuthMode)
    185 {
    186 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    187 
    188 	pWpaCore->WpaParams.AuthMode = AuthMode;
    189 
    190 	switch (AuthMode)
    191 	{
    192 		case os802_11AuthModeOpen:
    193 			pWpaCore->WpaSupplParams.proto = 0;
    194             pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_NONE;
    195             pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN;
    196             break;
    197 		case os802_11AuthModeShared:
    198 			pWpaCore->WpaSupplParams.proto = 0;
    199             pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_NONE;
    200             pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_SHARED;
    201             break;
    202 		case os802_11AuthModeWPANone:
    203 			pWpaCore->WpaSupplParams.proto = WPA_PROTO_WPA;
    204 			pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_WPA_NONE;
    205 			pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN;
    206 			break;
    207 		case os802_11AuthModeWPAPSK:
    208 			pWpaCore->WpaSupplParams.proto = WPA_PROTO_WPA;
    209 			pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_PSK;
    210 			pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN;
    211 			break;
    212 		case os802_11AuthModeWPA2PSK:
    213 			pWpaCore->WpaSupplParams.proto = WPA_PROTO_RSN;
    214 			pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_PSK;
    215 			pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN;
    216 			break;
    217         case os802_11AuthModeWPA:
    218             pWpaCore->WpaSupplParams.proto = WPA_PROTO_WPA;
    219             pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_IEEE8021X;
    220             pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN;
    221             break;
    222        case os802_11AuthModeWPA2:
    223             pWpaCore->WpaSupplParams.proto = WPA_PROTO_RSN;
    224             pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_IEEE8021X;
    225             pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN;
    226             break;
    227 
    228         default:
    229 			os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - WpaCore_SetAuthMode - unknown authentication mode (%d)!!!\n", AuthMode);
    230             return ECUERR_WPA_CORE_ERROR_UNKNOWN_AUTH_MODE;
    231 	}
    232 
    233 	return OK;
    234 }
    235 
    236 
    237 S32 WpaCore_GetAuthMode(THandle hWpaCore, PU32 pAuthMode)
    238 {
    239 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    240 
    241 	*pAuthMode = pWpaCore->WpaParams.AuthMode;
    242 
    243 	return OK;
    244 }
    245 
    246 S32 WpaCore_SetEncryptionPairWise(THandle hWpaCore, OS_802_11_ENCRYPTION_TYPES EncryptionType)
    247 {
    248 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    249 
    250 	pWpaCore->WpaParams.EncryptionTypePairWise = EncryptionType;
    251 
    252 	switch (EncryptionType)
    253     {
    254 		case OS_ENCRYPTION_TYPE_NONE:
    255 			pWpaCore->WpaSupplParams.pair_wise = WPA_CIPHER_NONE;
    256 			break;
    257 		case OS_ENCRYPTION_TYPE_WEP:
    258 			pWpaCore->WpaSupplParams.pair_wise = WPA_CIPHER_WEP40;
    259 			break;
    260         case OS_ENCRYPTION_TYPE_TKIP:
    261             pWpaCore->WpaSupplParams.pair_wise = WPA_CIPHER_TKIP;
    262             break;
    263         case OS_ENCRYPTION_TYPE_AES:
    264 			pWpaCore->WpaSupplParams.pair_wise = WPA_CIPHER_CCMP;
    265             break;
    266     }
    267 
    268 	return OK;
    269 }
    270 
    271 S32 WpaCore_SetPrivacyEap(THandle hWpaCore, OS_802_11_EAP_TYPES EapType)
    272 {
    273    TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    274 
    275    pWpaCore->WpaSupplParams.eap = EapType;
    276 
    277    return OK;
    278 }
    279 
    280 S32 WpaCore_GetEncryptionPairWise(THandle hWpaCore, OS_802_11_ENCRYPTION_TYPES* pEncryptionType)
    281 {
    282 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    283 
    284 	*pEncryptionType = pWpaCore->WpaParams.EncryptionTypePairWise;
    285 
    286 	return OK;
    287 }
    288 
    289 S32 WpaCore_SetEncryptionGroup(THandle hWpaCore, OS_802_11_ENCRYPTION_TYPES EncryptionType)
    290 {
    291 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    292 
    293 	pWpaCore->WpaParams.EncryptionTypeGroup = EncryptionType;
    294 
    295 	switch (EncryptionType)
    296     {
    297     	case OS_ENCRYPTION_TYPE_NONE:
    298 			os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - WpaCore_SetEncryptionGroup - group encryption cant be NONE\n");
    299 			break;
    300 		case OS_ENCRYPTION_TYPE_WEP:
    301 			pWpaCore->WpaSupplParams.group = WPA_CIPHER_WEP40;
    302 			break;
    303 
    304         case OS_ENCRYPTION_TYPE_TKIP:
    305             pWpaCore->WpaSupplParams.group = WPA_CIPHER_TKIP;
    306             break;
    307         case OS_ENCRYPTION_TYPE_AES:
    308 			pWpaCore->WpaSupplParams.group = WPA_CIPHER_CCMP;
    309             break;
    310     }
    311 
    312 	return OK;
    313 }
    314 
    315 S32 WpaCore_GetEncryptionGroup(THandle hWpaCore, OS_802_11_ENCRYPTION_TYPES* pEncryptionType)
    316 {
    317 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    318 
    319 	*pEncryptionType = pWpaCore->WpaParams.EncryptionTypeGroup;
    320 
    321 	return OK;
    322 }
    323 
    324 S32 WpaCore_SetCredentials(THandle hWpaCore, PU8 Identity, PU8 Passward)
    325 {
    326   TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    327 
    328   os_memcpy((PVOID)pWpaCore->WpaSupplParams.Identity, (PVOID)Identity, os_strlen((PS8)Identity));
    329 
    330   if (Passward !=NULL)
    331   {
    332     os_memcpy((PVOID)pWpaCore->WpaSupplParams.password, (PVOID)Passward, os_strlen((PS8)Passward));
    333     os_memcpy((PVOID)pWpaCore->WpaSupplParams.private_key_passwd, (PVOID)Passward, os_strlen((PS8)Passward));
    334   }
    335 
    336   return OK;
    337 }
    338 
    339 S32 WpaCore_SetCertificate(THandle hWpaCore, PU8 Filepath)
    340 {
    341   TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    342 
    343   os_memcpy((PVOID)pWpaCore->WpaSupplParams.client_cert, (PVOID)Filepath, os_strlen((PS8)Filepath));
    344 
    345   return OK;
    346 
    347 }
    348 
    349 S32 WpaCore_SetPskPassPhrase(THandle hWpaCore, PU8 pPassPhrase)
    350 {
    351 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    352 
    353     os_memcpy((PVOID)pWpaCore->WpaSupplParams.pass_phrase, (PVOID)pPassPhrase, os_strlen((PS8)pPassPhrase));
    354 
    355 	return OK;
    356 }
    357 
    358 S32 WpaCore_StopSuppl(THandle hWpaCore)
    359 {
    360 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    361 
    362 	IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"TERMINATE", TRUE);
    363 
    364 	return OK;
    365 }
    366 
    367 S32 WpaCore_ChangeSupplDebugLevels(THandle hWpaCore, S32 Level1, S32 Level2, S32 Level3)
    368 {
    369 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    370     S8 cmd[100];
    371 
    372 	os_sprintf(cmd, (PS8)"CHANGE_SUPPLICANT_DEBUG %ld %ld %ld", Level1, Level2, Level3);
    373 	IpcWpa_Command(pWpaCore->hIpcWpa, cmd, TRUE);
    374 
    375 	return OK;
    376 }
    377 
    378 S32 WpaCore_AddKey(THandle hWpaCore, OS_802_11_WEP* pKey)
    379 {
    380 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    381 	U32 WepKeyIndx;
    382 
    383 	WepKeyIndx = pKey->KeyIndex & 0x7FFFFFFF;
    384 
    385 	if ((pKey->KeyIndex & 0x80000000) == 0x80000000)
    386 	{
    387 		/* Add "1" to the default wep key index - since "0" is used to indicate no default wep key */
    388 		pWpaCore->WpaSupplParams.default_wep_key = WepKeyIndx + 1;
    389 	}
    390 
    391 	/* If key length wasn't set so far - set it according to current key */
    392 	if (pWpaCore->WpaSupplParams.wep_key_length == 0)
    393 	{
    394 		pWpaCore->WpaSupplParams.wep_key_length = pKey->KeyLength;
    395 	}
    396 	else
    397 	{
    398         if (pWpaCore->WpaSupplParams.wep_key_length != pKey->KeyLength) return ECUERR_WPA_CORE_ERROR_KEY_LEN_MUST_BE_SAME;
    399 	}
    400 
    401 	os_memcpy(&pWpaCore->WpaSupplParams.wep_key[WepKeyIndx][0], pKey->KeyMaterial, pKey->KeyLength);
    402 
    403 	return OK;
    404 }
    405 
    406 S32 WpaCore_GetDefaultKey(THandle hWpaCore, U32* pDefaultKeyIndex)
    407 {
    408 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    409 
    410 	*pDefaultKeyIndex = pWpaCore->WpaSupplParams.default_wep_key;
    411 
    412 	return OK;
    413 }
    414 
    415 #ifdef CONFIG_WPS
    416 S32 WpaCore_StartWpsPIN(THandle hWpaCore)
    417 {
    418 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    419 #ifdef SUPPL_WPS_SUPPORT
    420 	S8 cmd[100];
    421 #endif
    422 
    423 	pWpaCore->WpaSupplParams.WscMode = WSC_MODE_PIN;
    424 
    425 #ifdef SUPPL_WPS_SUPPORT
    426 	os_sprintf(cmd, "WPS_PIN any");
    427 	IpcWpa_Command(pWpaCore->hIpcWpa, cmd, TRUE);
    428 #endif
    429 
    430 	return OK;
    431 }
    432 
    433 S32 WpaCore_StartWpsPBC(THandle hWpaCore)
    434 {
    435 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    436 #ifdef SUPPL_WPS_SUPPORT
    437 	S8 cmd[100];
    438 #endif
    439 
    440 	pWpaCore->WpaSupplParams.WscMode = WSC_MODE_PBC;
    441 
    442 #ifdef SUPPL_WPS_SUPPORT
    443 	os_sprintf(cmd, "WPS_PBC");
    444 	IpcWpa_Command(pWpaCore->hIpcWpa, cmd, TRUE);
    445 #endif
    446 
    447 	return OK;
    448 }
    449 
    450 S32 WpaCore_StopWps(THandle hWpaCore)
    451 {
    452 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    453 
    454 	pWpaCore->WpaSupplParams.WscMode = WSC_MODE_OFF;
    455 
    456 	return OK;
    457 }
    458 
    459 S32 WpaCore_SetPin(THandle hWpaCore, PS8 pPinStr)
    460 {
    461 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    462 	int len = os_strlen(pPinStr);
    463 
    464 	if (len == 0)
    465 		return ECUERR_WPA_CORE_ERROR_IVALID_PIN;
    466 
    467 	pWpaCore->WpaSupplParams.pWscPin = (PS8)os_MemoryCAlloc(len, sizeof(char));
    468 	if(!pWpaCore->WpaSupplParams.pWscPin)
    469 		return ECUERR_WPA_CORE_ERROR_CANT_ALLOC_PIN;
    470 
    471 	os_strcpy(pWpaCore->WpaSupplParams.pWscPin, pPinStr);
    472 
    473 	return OK;
    474 }
    475 #endif /* CONFIG_WPS */
    476 
    477 S32 WpaCore_SetAnyWpaMode(THandle hWpaCore, U8 anyWpaMode)
    478 {
    479 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    480 
    481 	pWpaCore->WpaSupplParams.anyWpaMode = anyWpaMode;
    482 
    483 	return OK;
    484 }
    485 
    486 S32 WpaCore_GetAnyWpaMode(THandle hWpaCore, PU8 pAnyWpaMode)
    487 {
    488 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    489 
    490 	*pAnyWpaMode = pWpaCore->WpaSupplParams.anyWpaMode;
    491 
    492 	return OK;
    493 }
    494 
    495 
    496 S32 WpaCore_SetBssType(THandle hWpaCore, U32 BssType)
    497 {
    498 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    499 
    500 	switch(BssType)
    501 	{
    502 		case os802_11IBSS:
    503 			pWpaCore->WpaSupplParams.mode = IEEE80211_MODE_IBSS;
    504 			break;
    505 		case os802_11Infrastructure:
    506 			pWpaCore->WpaSupplParams.mode = IEEE80211_MODE_INFRA;
    507 			break;
    508 		default:
    509 			pWpaCore->WpaSupplParams.mode = IEEE80211_MODE_INFRA;
    510 			break;
    511 	}
    512 
    513 	return OK;
    514 }
    515 
    516 S32 WpaCore_GetBssType(THandle hWpaCore, PU32 pBssType)
    517 {
    518 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    519 
    520 	switch(pWpaCore->WpaSupplParams.mode)
    521 	{
    522 		case IEEE80211_MODE_IBSS:
    523 			*pBssType = os802_11IBSS;
    524 			break;
    525 		case IEEE80211_MODE_INFRA:
    526 			*pBssType = os802_11Infrastructure;
    527 			break;
    528 	}
    529 
    530 	return OK;
    531 }
    532 
    533 S32 WpaCore_SetSsid(THandle hWpaCore, OS_802_11_SSID* ssid, TMacAddr bssid)
    534 {
    535 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    536     S8  cmd[256];
    537     S8  Resp[IPC_WPA_RESP_MAX_LEN];
    538     PS8 pRespTemp;
    539 	U32 RespLen;
    540 	U32 NetworkID;
    541 	U32 SendCommand;
    542     U8  Len;
    543 
    544 #define WPACORE_SETSSID_FAIL \
    545 	os_error_printf(CU_MSG_ERROR, (PS8)"Failed to connect to %s\n", ssid->Ssid); \
    546     return ECUERR_WPA_CORE_ERROR_FAILED_CONNECT_SSID;
    547 
    548     /* First Add a new network block*/
    549 	os_sprintf(cmd, (PS8)"ADD_NETWORK");
    550 	if (IpcWpa_CommandWithResp(pWpaCore->hIpcWpa, cmd, TRUE, Resp, &RespLen))
    551 	{
    552 		WPACORE_SETSSID_FAIL;
    553 	}
    554 	NetworkID = os_strtoul(Resp, &pRespTemp, 0);
    555 
    556 	/* Set the parameters in the new new network block*/
    557 
    558 	/* Set the BSSID */
    559 	if(!((bssid[0] == 0xFF) &&
    560 		(bssid[1] == 0xFF) &&
    561 		(bssid[2] == 0xFF) &&
    562 		(bssid[3] == 0xFF) &&
    563 		(bssid[4] == 0xFF) &&
    564 		(bssid[5] == 0xFF)))
    565 	{
    566 		/* set th ebssid only if the bssid doesn't mean any bssid */
    567         S8 temp[20];
    568 		os_sprintf(temp, (PS8)"%02x", bssid[0]);
    569 		os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[1]);
    570 		os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[2]);
    571 		os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[3]);
    572 		os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[4]);
    573 		os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[5]);
    574 		os_sprintf(cmd, (PS8)"SET_NETWORK %d bssid %s", NetworkID, temp);
    575 
    576 		if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, FALSE))
    577 		{
    578 			WPACORE_SETSSID_FAIL;
    579 		}
    580 	}
    581 
    582    /* Set the SSID */
    583 	os_sprintf(cmd, (PS8)"SET_NETWORK %d ssid \"%s\"", NetworkID, ssid->Ssid);
    584 	if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    585 	{
    586 		WPACORE_SETSSID_FAIL;
    587 	}
    588 
    589 	/* set mode of the new network block */
    590 	os_sprintf(cmd, (PS8)"SET_NETWORK %d mode %d", NetworkID, pWpaCore->WpaSupplParams.mode);
    591 	if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    592 	{
    593 		WPACORE_SETSSID_FAIL;
    594 	}
    595 
    596     /* set proto of the new network block */
    597 	SendCommand = TRUE;
    598 	if (pWpaCore->WpaSupplParams.proto == WPA_PROTO_WPA)
    599 	{
    600 		os_sprintf(cmd, (PS8)"SET_NETWORK %d proto WPA", NetworkID);
    601 	}
    602 	else if (pWpaCore->WpaSupplParams.proto == WPA_PROTO_RSN)
    603 	{
    604 		os_sprintf(cmd, (PS8)"SET_NETWORK %d proto RSN", NetworkID);
    605 	}
    606 	else
    607 	{
    608 		SendCommand = FALSE;
    609 	}
    610 
    611 	if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    612 	{
    613 		WPACORE_SETSSID_FAIL;
    614 	}
    615 
    616 	/* set key management of the new network block */
    617 	SendCommand = TRUE;
    618 	if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_NONE)
    619 	{
    620 		if ((pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_LEAP) ||
    621 			(pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_PEAP) ||
    622 			(pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_FAST))
    623         {
    624          os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt IEEE8021X", NetworkID);
    625         }
    626 		else
    627 			os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt NONE", NetworkID);
    628 	}
    629 	else if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_PSK)
    630 		os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt WPA-PSK", NetworkID);
    631 	else if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_IEEE8021X)
    632 #ifdef XCC_MODULE_INCLUDED
    633        if((pWpaCore->WpaSupplParams.XCC == OS_XCC_CONFIGURATION_ENABLE_CCKM)||(pWpaCore->WpaSupplParams.XCC == OS_XCC_CONFIGURATION_ENABLE_ALL))
    634        {
    635         os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt WPA-EAP CCKM", NetworkID);
    636        }
    637        else
    638 #endif
    639        os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt WPA-EAP", NetworkID);
    640    else if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_WPA_NONE)
    641 		os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt WPA-NONE", NetworkID);
    642 	else
    643 	{
    644 		SendCommand = FALSE;
    645 	}
    646 
    647 	if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    648 	{
    649 		WPACORE_SETSSID_FAIL;
    650 	}
    651 
    652 
    653 	/* set authentication alog of the new network block */
    654 	SendCommand = TRUE;
    655 	if (pWpaCore->WpaSupplParams.auth_alg == WPA_AUTH_ALG_OPEN)
    656 		os_sprintf(cmd, (PS8)"SET_NETWORK %d auth_alg OPEN", NetworkID);
    657 	else if (pWpaCore->WpaSupplParams.auth_alg == WPA_AUTH_ALG_SHARED)
    658 		os_sprintf(cmd, (PS8)"SET_NETWORK %d auth_alg SHARED", NetworkID);
    659 	else if (pWpaCore->WpaSupplParams.auth_alg == WPA_AUTH_ALG_LEAP)
    660 		os_sprintf(cmd, (PS8)"SET_NETWORK %d auth_alg LEAP", NetworkID);
    661 	else
    662 	{
    663 		SendCommand = FALSE;
    664 	}
    665 
    666 	if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    667 	{
    668 		WPACORE_SETSSID_FAIL;
    669 	}
    670 
    671 
    672     /* set pairwise encryption of the new network block */
    673 	SendCommand = TRUE;
    674 	if (pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_NONE)
    675 		os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise NONE", NetworkID);
    676 	else if (pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_WEP40)
    677 		os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise NONE", NetworkID);
    678 	else if (pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_TKIP)
    679 		os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise TKIP", NetworkID);
    680 	else if ((pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_CCMP)&& (pWpaCore->WpaSupplParams.anyWpaMode == 0))
    681 		os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise CCMP", NetworkID);
    682     else if ((pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_CCMP)&& (pWpaCore->WpaSupplParams.anyWpaMode == 1))
    683 		os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise CCMP TKIP", NetworkID);
    684 	else
    685 	{
    686 		SendCommand = FALSE;
    687 	}
    688 
    689 	if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    690 	{
    691 		WPACORE_SETSSID_FAIL;
    692 	}
    693 
    694    /* set group encryption of the new network block */
    695 	SendCommand = TRUE;
    696 	if (pWpaCore->WpaSupplParams.group == WPA_CIPHER_WEP40)
    697 		os_sprintf(cmd, (PS8)"SET_NETWORK %d group WEP40", NetworkID);
    698 	else if (pWpaCore->WpaSupplParams.group == WPA_CIPHER_TKIP)
    699 		os_sprintf(cmd, (PS8)"SET_NETWORK %d group TKIP", NetworkID);
    700 	else if ((pWpaCore->WpaSupplParams.group == WPA_CIPHER_CCMP)&& (pWpaCore->WpaSupplParams.anyWpaMode == 0))
    701 		os_sprintf(cmd, (PS8)"SET_NETWORK %d group CCMP", NetworkID);
    702     else if ((pWpaCore->WpaSupplParams.group == WPA_CIPHER_CCMP)&& (pWpaCore->WpaSupplParams.anyWpaMode == 1))
    703 		os_sprintf(cmd, (PS8)"SET_NETWORK %d group CCMP TKIP", NetworkID);
    704 	else
    705 	{
    706 		SendCommand = FALSE;
    707 	}
    708 
    709 	if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    710 	{
    711 		WPACORE_SETSSID_FAIL;
    712 	}
    713 
    714 
    715    /* set eap of the new network block */
    716     if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_NONE)
    717         SendCommand = FALSE;
    718     else
    719     {
    720       SendCommand = TRUE;
    721       if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_MD5_CHALLENGE)
    722         os_sprintf(cmd, (PS8)"SET_NETWORK %d eap MD5", NetworkID);
    723       else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_GENERIC_TOKEN_CARD)
    724         os_sprintf(cmd, (PS8)"SET_NETWORK %d eap GTC", NetworkID);
    725       else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_TLS)
    726         os_sprintf(cmd, (PS8)"SET_NETWORK %d eap TLS", NetworkID);
    727       else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_TTLS)
    728         os_sprintf(cmd, (PS8)"SET_NETWORK %d eap TTLS", NetworkID);
    729       else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_PEAP)
    730         os_sprintf(cmd, (PS8)"SET_NETWORK %d eap PEAP", NetworkID);
    731       else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_MS_CHAP_V2)
    732         os_sprintf(cmd, (PS8)"SET_NETWORK %d eap MSCHAPV2", NetworkID);
    733 #ifdef XCC_MODULE_INCLUDED
    734       else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_LEAP)
    735         os_sprintf(cmd, (PS8)"SET_NETWORK %d eap LEAP", NetworkID);
    736       else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_FAST)
    737         os_sprintf(cmd, (PS8)"SET_NETWORK %d eap FAST", NetworkID);
    738 #endif
    739       else
    740        SendCommand = FALSE;
    741     }
    742 
    743 
    744     if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    745     {
    746         WPACORE_SETSSID_FAIL;
    747     }
    748 
    749      if (pWpaCore->WpaSupplParams.Identity[0])
    750 	 {
    751        os_sprintf(cmd, (PS8)"SET_NETWORK %d identity \"%s\"", NetworkID,pWpaCore->WpaSupplParams.Identity);
    752        if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    753 	   {
    754           WPACORE_SETSSID_FAIL;
    755 	   }
    756      }
    757 
    758      if (pWpaCore->WpaSupplParams.client_cert[0])
    759 	 {
    760        os_sprintf(cmd, (PS8)"SET_NETWORK %d client_cert \"%s\"", NetworkID,pWpaCore->WpaSupplParams.client_cert);
    761 
    762       if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    763       {
    764        WPACORE_SETSSID_FAIL;
    765       }
    766 
    767 	 }
    768 
    769 
    770 	 if (pWpaCore->WpaSupplParams.client_cert[0])
    771 	 {
    772 
    773       Len = os_strlen ((PS8)pWpaCore->WpaSupplParams.client_cert);
    774       os_memcpy(pWpaCore->WpaSupplParams.private_key,pWpaCore->WpaSupplParams.client_cert,Len);
    775       os_memcpy(&pWpaCore->WpaSupplParams.private_key[Len-3],"pem",3);
    776 
    777       os_sprintf(cmd, (PS8)"SET_NETWORK %d private_key \"%s\"", NetworkID,pWpaCore->WpaSupplParams.private_key);
    778       if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    779       {
    780         WPACORE_SETSSID_FAIL;
    781       }
    782 	 }
    783 
    784     if (pWpaCore->WpaSupplParams.private_key_passwd[0] )
    785 	{
    786       os_sprintf(cmd, (PS8)"SET_NETWORK %d private_key_passwd \"%s\"", NetworkID,pWpaCore->WpaSupplParams.private_key_passwd);
    787        if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    788         {
    789          WPACORE_SETSSID_FAIL;
    790         }
    791 	}
    792 
    793     if (pWpaCore->WpaSupplParams.password[0] )
    794     {
    795       os_sprintf(cmd, (PS8)"SET_NETWORK %d password \"%s\"", NetworkID,pWpaCore->WpaSupplParams.password);
    796        if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    797         {
    798          WPACORE_SETSSID_FAIL;
    799         }
    800 
    801     }
    802 
    803 
    804     if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_FAST)
    805     {
    806       os_sprintf(cmd, (PS8)"SET_NETWORK %d phase1 \"fast_provisioning=3\"", NetworkID);
    807        if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    808           {
    809            WPACORE_SETSSID_FAIL;
    810           }
    811 
    812      os_sprintf(cmd, (PS8)"SET_NETWORK %d pac_file \"/etc/wpa_supplicant.eap-fast-pac\"", NetworkID);
    813        if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    814           {
    815            WPACORE_SETSSID_FAIL;
    816           }
    817 
    818      os_sprintf(cmd, (PS8)"SET_NETWORK %d anonymous_identity \"anonymous\"", NetworkID);
    819        if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    820           {
    821            WPACORE_SETSSID_FAIL;
    822           }
    823 
    824     }
    825 
    826     if (pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_WEP40)
    827 	{
    828         S32 idx, idx2;
    829 
    830 		for (idx=0; idx<4; idx++)
    831 		{
    832             S8 TempBuf[3];
    833 			os_sprintf(cmd, (PS8)"SET_NETWORK %d wep_key%d ", NetworkID, idx);
    834 			for (idx2=0; idx2 < pWpaCore->WpaSupplParams.wep_key_length; idx2++)
    835 			{
    836 				os_sprintf(TempBuf, (PS8)"%02x", pWpaCore->WpaSupplParams.wep_key[idx][idx2]);
    837 				os_strcat (cmd, TempBuf);
    838 			}
    839 			if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    840 			{
    841 				WPACORE_SETSSID_FAIL;
    842 			}
    843 		}
    844 		os_sprintf(cmd, (PS8)"SET_NETWORK %d wep_tx_keyidx %d", NetworkID, pWpaCore->WpaSupplParams.default_wep_key-1);
    845 		if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    846 		{
    847 			WPACORE_SETSSID_FAIL;
    848 		}
    849 	}
    850 
    851 	if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_PSK)
    852 	{
    853 		os_sprintf(cmd, (PS8)"SET_NETWORK %d psk \"%s\"", NetworkID, pWpaCore->WpaSupplParams.pass_phrase);
    854 		if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    855 		{
    856 			WPACORE_SETSSID_FAIL;
    857 		}
    858 	}
    859 
    860 
    861 #ifdef CONFIG_WPS
    862 	if (pWpaCore->WpaSupplParams.WscMode)
    863 	{
    864 		os_sprintf(cmd, (PS8)"SET_NETWORK %d wsc_mode %d", NetworkID, pWpaCore->WpaSupplParams.WscMode);
    865 		if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    866 		{
    867 			WPACORE_SETSSID_FAIL;
    868 		}
    869 	}
    870 	if (pWpaCore->WpaSupplParams.pWscPin)
    871 	{
    872 		os_sprintf(cmd, (PS8)"SET_NETWORK %d wsc_pin \"%s\"", NetworkID, pWpaCore->WpaSupplParams.pWscPin);
    873 		if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    874 		{
    875 			WPACORE_SETSSID_FAIL;
    876 		}
    877 	}
    878 #endif
    879 
    880 	/* Finaly Connect to the new network block */
    881 	os_sprintf(cmd, (PS8)"SELECT_NETWORK %d", NetworkID);
    882 	if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    883 	{
    884 		WPACORE_SETSSID_FAIL;
    885 	}
    886 
    887 	pWpaCore->CurrentNetwork = NetworkID;
    888 	IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"SAVE_CONFIG", 1);
    889 
    890    /*
    891 	init the connection params thus the next time we connect we will by default
    892 	connect to an open
    893 	*/
    894 	WpaCore_InitWpaParams(pWpaCore);
    895 
    896 	return OK;
    897 }
    898 
    899 S32 WpaCore_Disassociate(THandle hWpaCore)
    900 {
    901 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    902     S8 cmd[256];
    903 
    904     os_sprintf(cmd, (PS8)"DISABLE_NETWORK %d", pWpaCore->CurrentNetwork);
    905     if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 1))
    906     {
    907         os_error_printf(CU_MSG_ERROR, (PS8)"Failed to disconnect from current ssid\n");
    908         return ECUERR_WPA_CORE_ERROR_FAILED_DISCONNECT_SSID;
    909     }
    910 
    911     pWpaCore->CurrentNetwork = -1;
    912     IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"SAVE_CONFIG", 0);
    913 
    914 #if 0 /* for futur WPS work */
    915     if(pWpaCore->CurrentNetwork == -1)
    916     {
    917 		os_sprintf(cmd, (PS8)"LIST_NETWORKS");
    918         if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 1))
    919         {
    920             os_error_printf(CU_MSG_ERROR, (PS8)"Failed to disconnect from current ssid\n");
    921             return ECUERR_WPA_CORE_ERROR_FAILED_DISCONNECT_SSID;
    922         }
    923     }
    924     else
    925     {
    926         os_sprintf(cmd, (PS8)"DISABLE_NETWORK %d", pWpaCore->CurrentNetwork);
    927         if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 1))
    928         {
    929             os_error_printf(CU_MSG_ERROR, (PS8)"Failed to disconnect from current ssid\n");
    930             return ECUERR_WPA_CORE_ERROR_FAILED_DISCONNECT_SSID;
    931         }
    932 
    933         pWpaCore->CurrentNetwork = -1;
    934         IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"SAVE_CONFIG", 0);
    935     }
    936 #endif /* #if 0 for futur WPS work */
    937 
    938     return OK;
    939 }
    940 
    941