Home | History | Annotate | Download | only in src
      1 /*
      2  * wpa_core.c
      3  *
      4  * Copyright 2001-2009 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 <string.h>
     39 #include "cu_osapi.h"
     40 #include "TWDriver.h"
     41 #include "common.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_EAP_WSC
     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_EAP_WSC
     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_EAP_WSC
    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_EAP_WSC
    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_EAP_WSC
    416 S32 WpaCore_StartWpsPIN(THandle hWpaCore)
    417 {
    418 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    419 
    420 	pWpaCore->WpaSupplParams.WscMode = WSC_MODE_PIN;
    421 
    422 	return OK;
    423 }
    424 
    425 S32 WpaCore_StartWpsPBC(THandle hWpaCore)
    426 {
    427 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    428 
    429 	pWpaCore->WpaSupplParams.WscMode = WSC_MODE_PBC;
    430 
    431 	return OK;
    432 }
    433 
    434 S32 WpaCore_StopWps(THandle hWpaCore)
    435 {
    436 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    437 
    438 	pWpaCore->WpaSupplParams.WscMode = WSC_MODE_OFF;
    439 
    440 	return OK;
    441 }
    442 
    443 S32 WpaCore_SetPin(THandle hWpaCore, PS8 pPinStr)
    444 {
    445 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    446 	int len = os_strlen(pPinStr);
    447 
    448 	if (len == 0)
    449 		return ECUERR_WPA_CORE_ERROR_IVALID_PIN;
    450 
    451 	pWpaCore->WpaSupplParams.pWscPin = (PS8)os_MemoryCAlloc(len, sizeof(char));
    452 	if(!pWpaCore->WpaSupplParams.pWscPin)
    453 		return ECUERR_WPA_CORE_ERROR_CANT_ALLOC_PIN;
    454 
    455 	os_strcpy(pWpaCore->WpaSupplParams.pWscPin, pPinStr);
    456 
    457 	return OK;
    458 }
    459 #endif /* CONFIG_EAP_WSC */
    460 
    461 S32 WpaCore_SetAnyWpaMode(THandle hWpaCore, U8 anyWpaMode)
    462 {
    463 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    464 
    465 	pWpaCore->WpaSupplParams.anyWpaMode = anyWpaMode;
    466 
    467 	return OK;
    468 }
    469 
    470 S32 WpaCore_GetAnyWpaMode(THandle hWpaCore, PU8 pAnyWpaMode)
    471 {
    472 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    473 
    474 	*pAnyWpaMode = pWpaCore->WpaSupplParams.anyWpaMode;
    475 
    476 	return OK;
    477 }
    478 
    479 
    480 S32 WpaCore_SetBssType(THandle hWpaCore, U32 BssType)
    481 {
    482 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    483 
    484 	switch(BssType)
    485 	{
    486 		case os802_11IBSS:
    487 			pWpaCore->WpaSupplParams.mode = IEEE80211_MODE_IBSS;
    488 			break;
    489 		case os802_11Infrastructure:
    490 			pWpaCore->WpaSupplParams.mode = IEEE80211_MODE_INFRA;
    491 			break;
    492 		default:
    493 			pWpaCore->WpaSupplParams.mode = IEEE80211_MODE_INFRA;
    494 			break;
    495 	}
    496 
    497 	return OK;
    498 }
    499 
    500 S32 WpaCore_GetBssType(THandle hWpaCore, PU32 pBssType)
    501 {
    502 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    503 
    504 	switch(pWpaCore->WpaSupplParams.mode)
    505 	{
    506 		case IEEE80211_MODE_IBSS:
    507 			*pBssType = os802_11IBSS;
    508 			break;
    509 		case IEEE80211_MODE_INFRA:
    510 			*pBssType = os802_11Infrastructure;
    511 			break;
    512 	}
    513 
    514 	return OK;
    515 }
    516 
    517 S32 WpaCore_SetSsid(THandle hWpaCore, OS_802_11_SSID* ssid, TMacAddr bssid)
    518 {
    519 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    520     S8  cmd[256];
    521     S8  Resp[IPC_WPA_RESP_MAX_LEN];
    522     PS8 pRespTemp;
    523 	U32 RespLen;
    524 	U32 NetworkID;
    525 	U32 SendCommand;
    526     U8  Len;
    527 
    528 #define WPACORE_SETSSID_FAIL \
    529 	os_error_printf(CU_MSG_ERROR, (PS8)"Failed to connect to %s\n", ssid->Ssid); \
    530     return ECUERR_WPA_CORE_ERROR_FAILED_CONNECT_SSID;
    531 
    532     /* First Add a new network block*/
    533 	os_sprintf(cmd, (PS8)"ADD_NETWORK");
    534 	if (IpcWpa_CommandWithResp(pWpaCore->hIpcWpa, cmd, TRUE, Resp, &RespLen))
    535 	{
    536 		WPACORE_SETSSID_FAIL;
    537 	}
    538 	NetworkID = os_strtoul(Resp, &pRespTemp, 0);
    539 
    540 	/* Set the parameters in the new new network block*/
    541 
    542 	/* Set the BSSID */
    543 	if(!((bssid[0] == 0xFF) &&
    544 		(bssid[1] == 0xFF) &&
    545 		(bssid[2] == 0xFF) &&
    546 		(bssid[3] == 0xFF) &&
    547 		(bssid[4] == 0xFF) &&
    548 		(bssid[5] == 0xFF)))
    549 	{
    550 		/* set th ebssid only if the bssid doesn't mean any bssid */
    551         S8 temp[20];
    552 		os_sprintf(temp, (PS8)"%02x", bssid[0]);
    553 		os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[1]);
    554 		os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[2]);
    555 		os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[3]);
    556 		os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[4]);
    557 		os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[5]);
    558 		os_sprintf(cmd, (PS8)"SET_NETWORK %d bssid %s", NetworkID, temp);
    559 
    560 		if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, FALSE))
    561 		{
    562 			WPACORE_SETSSID_FAIL;
    563 		}
    564 	}
    565 
    566    /* Set the SSID */
    567 	os_sprintf(cmd, (PS8)"SET_NETWORK %d ssid \"%s\"", NetworkID, ssid->Ssid);
    568 	if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    569 	{
    570 		WPACORE_SETSSID_FAIL;
    571 	}
    572 
    573 	/* set mode of the new network block */
    574 	os_sprintf(cmd, (PS8)"SET_NETWORK %d mode %d", NetworkID, pWpaCore->WpaSupplParams.mode);
    575 	if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    576 	{
    577 		WPACORE_SETSSID_FAIL;
    578 	}
    579 
    580     /* set proto of the new network block */
    581 	SendCommand = TRUE;
    582 	if (pWpaCore->WpaSupplParams.proto == WPA_PROTO_WPA)
    583 	{
    584 		os_sprintf(cmd, (PS8)"SET_NETWORK %d proto WPA", NetworkID);
    585 	}
    586 	else if (pWpaCore->WpaSupplParams.proto == WPA_PROTO_RSN)
    587 	{
    588 		os_sprintf(cmd, (PS8)"SET_NETWORK %d proto RSN", NetworkID);
    589 	}
    590 	else
    591 	{
    592 		SendCommand = FALSE;
    593 	}
    594 
    595 	if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    596 	{
    597 		WPACORE_SETSSID_FAIL;
    598 	}
    599 
    600 	/* set key management of the new network block */
    601 	SendCommand = TRUE;
    602 	if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_NONE)
    603 	{
    604 		if ((pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_LEAP) ||
    605 			(pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_PEAP) ||
    606 			(pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_FAST))
    607         {
    608          os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt IEEE8021X", NetworkID);
    609         }
    610 		else
    611 			os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt NONE", NetworkID);
    612 	}
    613 	else if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_PSK)
    614 		os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt WPA-PSK", NetworkID);
    615 	else if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_IEEE8021X)
    616 #ifdef XCC_MODULE_INCLUDED
    617        if((pWpaCore->WpaSupplParams.XCC == OS_XCC_CONFIGURATION_ENABLE_CCKM)||(pWpaCore->WpaSupplParams.XCC == OS_XCC_CONFIGURATION_ENABLE_ALL))
    618        {
    619         os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt WPA-EAP CCKM", NetworkID);
    620        }
    621        else
    622 #endif
    623        os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt WPA-EAP", NetworkID);
    624    else if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_WPA_NONE)
    625 		os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt WPA-NONE", NetworkID);
    626 	else
    627 	{
    628 		SendCommand = FALSE;
    629 	}
    630 
    631 	if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    632 	{
    633 		WPACORE_SETSSID_FAIL;
    634 	}
    635 
    636 
    637 	/* set authentication alog of the new network block */
    638 	SendCommand = TRUE;
    639 	if (pWpaCore->WpaSupplParams.auth_alg == WPA_AUTH_ALG_OPEN)
    640 		os_sprintf(cmd, (PS8)"SET_NETWORK %d auth_alg OPEN", NetworkID);
    641 	else if (pWpaCore->WpaSupplParams.auth_alg == WPA_AUTH_ALG_SHARED)
    642 		os_sprintf(cmd, (PS8)"SET_NETWORK %d auth_alg SHARED", NetworkID);
    643 	else if (pWpaCore->WpaSupplParams.auth_alg == WPA_AUTH_ALG_LEAP)
    644 		os_sprintf(cmd, (PS8)"SET_NETWORK %d auth_alg LEAP", NetworkID);
    645 	else
    646 	{
    647 		SendCommand = FALSE;
    648 	}
    649 
    650 	if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    651 	{
    652 		WPACORE_SETSSID_FAIL;
    653 	}
    654 
    655 
    656     /* set pairwise encryption of the new network block */
    657 	SendCommand = TRUE;
    658 	if (pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_NONE)
    659 		os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise NONE", NetworkID);
    660 	else if (pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_WEP40)
    661 		os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise NONE", NetworkID);
    662 	else if (pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_TKIP)
    663 		os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise TKIP", NetworkID);
    664 	else if ((pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_CCMP)&& (pWpaCore->WpaSupplParams.anyWpaMode == 0))
    665 		os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise CCMP", NetworkID);
    666     else if ((pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_CCMP)&& (pWpaCore->WpaSupplParams.anyWpaMode == 1))
    667 		os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise CCMP TKIP", NetworkID);
    668 	else
    669 	{
    670 		SendCommand = FALSE;
    671 	}
    672 
    673 	if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    674 	{
    675 		WPACORE_SETSSID_FAIL;
    676 	}
    677 
    678    /* set group encryption of the new network block */
    679 	SendCommand = TRUE;
    680 	if (pWpaCore->WpaSupplParams.group == WPA_CIPHER_WEP40)
    681 		os_sprintf(cmd, (PS8)"SET_NETWORK %d group WEP40", NetworkID);
    682 	else if (pWpaCore->WpaSupplParams.group == WPA_CIPHER_TKIP)
    683 		os_sprintf(cmd, (PS8)"SET_NETWORK %d group TKIP", NetworkID);
    684 	else if ((pWpaCore->WpaSupplParams.group == WPA_CIPHER_CCMP)&& (pWpaCore->WpaSupplParams.anyWpaMode == 0))
    685 		os_sprintf(cmd, (PS8)"SET_NETWORK %d group CCMP", NetworkID);
    686     else if ((pWpaCore->WpaSupplParams.group == WPA_CIPHER_CCMP)&& (pWpaCore->WpaSupplParams.anyWpaMode == 1))
    687 		os_sprintf(cmd, (PS8)"SET_NETWORK %d group CCMP TKIP", NetworkID);
    688 	else
    689 	{
    690 		SendCommand = FALSE;
    691 	}
    692 
    693 	if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    694 	{
    695 		WPACORE_SETSSID_FAIL;
    696 	}
    697 
    698 
    699    /* set eap of the new network block */
    700     if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_NONE)
    701         SendCommand = FALSE;
    702     else
    703     {
    704       SendCommand = TRUE;
    705       if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_MD5_CHALLENGE)
    706         os_sprintf(cmd, (PS8)"SET_NETWORK %d eap MD5", NetworkID);
    707       else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_GENERIC_TOKEN_CARD)
    708         os_sprintf(cmd, (PS8)"SET_NETWORK %d eap GTC", NetworkID);
    709       else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_TLS)
    710         os_sprintf(cmd, (PS8)"SET_NETWORK %d eap TLS", NetworkID);
    711       else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_TTLS)
    712         os_sprintf(cmd, (PS8)"SET_NETWORK %d eap TTLS", NetworkID);
    713       else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_PEAP)
    714         os_sprintf(cmd, (PS8)"SET_NETWORK %d eap PEAP", NetworkID);
    715       else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_MS_CHAP_V2)
    716         os_sprintf(cmd, (PS8)"SET_NETWORK %d eap MSCHAPV2", NetworkID);
    717 #ifdef XCC_MODULE_INCLUDED
    718       else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_LEAP)
    719         os_sprintf(cmd, (PS8)"SET_NETWORK %d eap LEAP", NetworkID);
    720       else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_FAST)
    721         os_sprintf(cmd, (PS8)"SET_NETWORK %d eap FAST", NetworkID);
    722 #endif
    723       else
    724        SendCommand = FALSE;
    725     }
    726 
    727 
    728     if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    729     {
    730         WPACORE_SETSSID_FAIL;
    731     }
    732 
    733      if (pWpaCore->WpaSupplParams.Identity[0])
    734 	 {
    735        os_sprintf(cmd, (PS8)"SET_NETWORK %d identity \"%s\"", NetworkID,pWpaCore->WpaSupplParams.Identity);
    736        if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    737 	   {
    738           WPACORE_SETSSID_FAIL;
    739 	   }
    740      }
    741 
    742      if (pWpaCore->WpaSupplParams.client_cert[0])
    743 	 {
    744        os_sprintf(cmd, (PS8)"SET_NETWORK %d client_cert \"%s\"", NetworkID,pWpaCore->WpaSupplParams.client_cert);
    745 
    746       if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    747       {
    748        WPACORE_SETSSID_FAIL;
    749       }
    750 
    751 	 }
    752 
    753 
    754 	 if (pWpaCore->WpaSupplParams.client_cert[0])
    755 	 {
    756 
    757       Len = os_strlen ((PS8)pWpaCore->WpaSupplParams.client_cert);
    758       os_memcpy(pWpaCore->WpaSupplParams.private_key,pWpaCore->WpaSupplParams.client_cert,Len);
    759       os_memcpy(&pWpaCore->WpaSupplParams.private_key[Len-3],"pem",3);
    760 
    761       os_sprintf(cmd, (PS8)"SET_NETWORK %d private_key \"%s\"", NetworkID,pWpaCore->WpaSupplParams.private_key);
    762       if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    763       {
    764         WPACORE_SETSSID_FAIL;
    765       }
    766 	 }
    767 
    768     if (pWpaCore->WpaSupplParams.private_key_passwd[0] )
    769 	{
    770       os_sprintf(cmd, (PS8)"SET_NETWORK %d private_key_passwd \"%s\"", NetworkID,pWpaCore->WpaSupplParams.private_key_passwd);
    771        if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    772         {
    773          WPACORE_SETSSID_FAIL;
    774         }
    775 	}
    776 
    777     if (pWpaCore->WpaSupplParams.password[0] )
    778     {
    779       os_sprintf(cmd, (PS8)"SET_NETWORK %d password \"%s\"", NetworkID,pWpaCore->WpaSupplParams.password);
    780        if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    781         {
    782          WPACORE_SETSSID_FAIL;
    783         }
    784 
    785     }
    786 
    787 
    788     if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_FAST)
    789     {
    790       os_sprintf(cmd, (PS8)"SET_NETWORK %d phase1 \"fast_provisioning=3\"", NetworkID);
    791        if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    792           {
    793            WPACORE_SETSSID_FAIL;
    794           }
    795 
    796      os_sprintf(cmd, (PS8)"SET_NETWORK %d pac_file \"/etc/wpa_supplicant.eap-fast-pac\"", NetworkID);
    797        if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    798           {
    799            WPACORE_SETSSID_FAIL;
    800           }
    801 
    802      os_sprintf(cmd, (PS8)"SET_NETWORK %d anonymous_identity \"anonymous\"", NetworkID);
    803        if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    804           {
    805            WPACORE_SETSSID_FAIL;
    806           }
    807 
    808     }
    809 
    810     if (pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_WEP40)
    811 	{
    812         S32 idx, idx2;
    813 
    814 		for (idx=0; idx<4; idx++)
    815 		{
    816             S8 TempBuf[3];
    817 			os_sprintf(cmd, (PS8)"SET_NETWORK %d wep_key%d ", NetworkID, idx);
    818 			for (idx2=0; idx2 < pWpaCore->WpaSupplParams.wep_key_length; idx2++)
    819 			{
    820 				os_sprintf(TempBuf, (PS8)"%02x", pWpaCore->WpaSupplParams.wep_key[idx][idx2]);
    821 				os_strcat (cmd, TempBuf);
    822 			}
    823 			if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    824 			{
    825 				WPACORE_SETSSID_FAIL;
    826 			}
    827 		}
    828 		os_sprintf(cmd, (PS8)"SET_NETWORK %d wep_tx_keyidx %d", NetworkID, pWpaCore->WpaSupplParams.default_wep_key-1);
    829 		if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    830 		{
    831 			WPACORE_SETSSID_FAIL;
    832 		}
    833 	}
    834 
    835 	if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_PSK)
    836 	{
    837 		os_sprintf(cmd, (PS8)"SET_NETWORK %d psk \"%s\"", NetworkID, pWpaCore->WpaSupplParams.pass_phrase);
    838 		if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    839 		{
    840 			WPACORE_SETSSID_FAIL;
    841 		}
    842 	}
    843 
    844 
    845 #ifdef CONFIG_EAP_WSC
    846 	if (pWpaCore->WpaSupplParams.WscMode)
    847 	{
    848 		os_sprintf(cmd, (PS8)"SET_NETWORK %d wsc_mode %d", NetworkID, pWpaCore->WpaSupplParams.WscMode);
    849 		if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    850 		{
    851 			WPACORE_SETSSID_FAIL;
    852 		}
    853 	}
    854 	if (pWpaCore->WpaSupplParams.pWscPin)
    855 	{
    856 		os_sprintf(cmd, (PS8)"SET_NETWORK %d wsc_pin \"%s\"", NetworkID, pWpaCore->WpaSupplParams.pWscPin);
    857 		if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    858 		{
    859 			WPACORE_SETSSID_FAIL;
    860 		}
    861 	}
    862 #endif
    863 
    864 	/* Finaly Connect to the new network block */
    865 	os_sprintf(cmd, (PS8)"SELECT_NETWORK %d", NetworkID);
    866 	if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
    867 	{
    868 		WPACORE_SETSSID_FAIL;
    869 	}
    870 
    871 	pWpaCore->CurrentNetwork = NetworkID;
    872 	IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"SAVE_CONFIG", 1);
    873 
    874    /*
    875 	init the connection params thus the next time we connect we will by default
    876 	connect to an open
    877 	*/
    878 	WpaCore_InitWpaParams(pWpaCore);
    879 
    880 	return OK;
    881 }
    882 
    883 S32 WpaCore_Disassociate(THandle hWpaCore)
    884 {
    885 	TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
    886     S8 cmd[256];
    887 
    888     os_sprintf(cmd, (PS8)"DISABLE_NETWORK %d", pWpaCore->CurrentNetwork);
    889     if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 1))
    890     {
    891         os_error_printf(CU_MSG_ERROR, (PS8)"Failed to disconnect from current ssid\n");
    892         return ECUERR_WPA_CORE_ERROR_FAILED_DISCONNECT_SSID;
    893     }
    894 
    895     pWpaCore->CurrentNetwork = -1;
    896     IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"SAVE_CONFIG", 0);
    897 
    898 #if 0 /* for futur WPS work */
    899     if(pWpaCore->CurrentNetwork == -1)
    900     {
    901 		os_sprintf(cmd, (PS8)"LIST_NETWORKS");
    902         if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 1))
    903         {
    904             os_error_printf(CU_MSG_ERROR, (PS8)"Failed to disconnect from current ssid\n");
    905             return ECUERR_WPA_CORE_ERROR_FAILED_DISCONNECT_SSID;
    906         }
    907     }
    908     else
    909     {
    910         os_sprintf(cmd, (PS8)"DISABLE_NETWORK %d", pWpaCore->CurrentNetwork);
    911         if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 1))
    912         {
    913             os_error_printf(CU_MSG_ERROR, (PS8)"Failed to disconnect from current ssid\n");
    914             return ECUERR_WPA_CORE_ERROR_FAILED_DISCONNECT_SSID;
    915         }
    916 
    917         pWpaCore->CurrentNetwork = -1;
    918         IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"SAVE_CONFIG", 0);
    919     }
    920 #endif /* #if 0 for futur WPS work */
    921 
    922     return OK;
    923 }
    924 
    925