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 /*******************/
WpaCore_InitWpaParams(TWpaCore * pWpaCore)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 /*************/
WpaCore_Create(PS32 pRes,PS8 pSupplIfFile)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
WpaCore_Destroy(THandle hWpaCore)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
WpaCore_SetXCC(THandle hWpaCore,U16 XCCConfig)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
WpaCore_SetAuthMode(THandle hWpaCore,OS_802_11_AUTHENTICATION_MODE AuthMode)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
WpaCore_GetAuthMode(THandle hWpaCore,PU32 pAuthMode)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
WpaCore_SetEncryptionPairWise(THandle hWpaCore,OS_802_11_ENCRYPTION_TYPES EncryptionType)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
WpaCore_SetPrivacyEap(THandle hWpaCore,OS_802_11_EAP_TYPES EapType)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
WpaCore_GetEncryptionPairWise(THandle hWpaCore,OS_802_11_ENCRYPTION_TYPES * pEncryptionType)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
WpaCore_SetEncryptionGroup(THandle hWpaCore,OS_802_11_ENCRYPTION_TYPES EncryptionType)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
WpaCore_GetEncryptionGroup(THandle hWpaCore,OS_802_11_ENCRYPTION_TYPES * pEncryptionType)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
WpaCore_SetCredentials(THandle hWpaCore,PU8 Identity,PU8 Passward)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
WpaCore_SetCertificate(THandle hWpaCore,PU8 Filepath)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
WpaCore_SetPskPassPhrase(THandle hWpaCore,PU8 pPassPhrase)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
WpaCore_StopSuppl(THandle hWpaCore)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
WpaCore_ChangeSupplDebugLevels(THandle hWpaCore,S32 Level1,S32 Level2,S32 Level3)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
WpaCore_AddKey(THandle hWpaCore,OS_802_11_WEP * pKey)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
WpaCore_GetDefaultKey(THandle hWpaCore,U32 * pDefaultKeyIndex)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
WpaCore_StartWpsPIN(THandle hWpaCore)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
WpaCore_StartWpsPBC(THandle hWpaCore)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
WpaCore_StopWps(THandle hWpaCore)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
WpaCore_SetPin(THandle hWpaCore,PS8 pPinStr)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
WpaCore_SetAnyWpaMode(THandle hWpaCore,U8 anyWpaMode)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
WpaCore_GetAnyWpaMode(THandle hWpaCore,PU8 pAnyWpaMode)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
WpaCore_SetBssType(THandle hWpaCore,U32 BssType)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
WpaCore_GetBssType(THandle hWpaCore,PU32 pBssType)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
WpaCore_SetSsid(THandle hWpaCore,OS_802_11_SSID * ssid,TMacAddr bssid)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
WpaCore_Disassociate(THandle hWpaCore)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