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