• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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