blob: f771625c7481f8e4c411cf9c2456a0907d9a89a3 [file] [log] [blame]
/*
* wpa_core.c
*
* Copyright 2001-2010 Texas Instruments, Inc. - http://www.ti.com/
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/****************************************************************************
*
* MODULE: Wpa_Core.c
*
* PURPOSE:
*
* DESCRIPTION:
* ============
*
*
****************************************************************************/
/* includes */
/************/
#ifdef ANDROID
#include <unistd.h>
#endif
#include <netinet/if_ether.h>
#include "cu_osapi.h"
#include "TWDriver.h"
#include "config_ssid.h"
#include "driver.h"
#include "ipc_wpa.h"
#include "wpa_core.h"
#include "oserr.h"
/* defines */
/***********/
#ifdef CONFIG_WPS
#define WSC_MODE_OFF 0
#define WSC_MODE_PIN 1
#define WSC_MODE_PBC 2
#endif
/* local types */
/***************/
/* Network configuration block - holds candidate connection parameters */
typedef struct
{
S32 mode;
S32 proto;
S32 key_mgmt;
S32 auth_alg;
S32 pair_wise;
S32 group;
U8 pass_phrase[WPACORE_MAX_PSK_STRING_LENGTH];
U8 wep_key[4][32];
U8 default_wep_key;
U8 wep_key_length;
#ifdef CONFIG_WPS
U8 WscMode;
PS8 pWscPin;
#endif
S32 eap;
U8 Identity[WPACORE_MAX_CERT_PASSWORD_LENGTH];
U8 private_key_passwd[WPACORE_MAX_CERT_PASSWORD_LENGTH];
U8 private_key[WPACORE_MAX_CERT_PASSWORD_LENGTH];
U8 client_cert[WPACORE_MAX_CERT_FILE_NAME_LENGTH];
U8 password[WPACORE_MAX_CERT_PASSWORD_LENGTH];
U8 anyWpaMode;
#ifdef XCC_MODULE_INCLUDED
U16 XCC;
#endif
} TWpaCore_WpaSupplParams;
typedef struct
{
OS_802_11_AUTHENTICATION_MODE AuthMode;
OS_802_11_ENCRYPTION_TYPES EncryptionTypePairWise;
OS_802_11_ENCRYPTION_TYPES EncryptionTypeGroup;
} TWpaCore_WpaParams;
/* Module control block */
typedef struct TWpaCore
{
THandle hIpcWpa;
S32 CurrentNetwork;
TWpaCore_WpaSupplParams WpaSupplParams;
TWpaCore_WpaParams WpaParams;
} TWpaCore;
/* local variables */
/*******************/
/* local fucntions */
/*******************/
static VOID WpaCore_InitWpaParams(TWpaCore* pWpaCore)
{
os_memset( &pWpaCore->WpaSupplParams, 0, sizeof(TWpaCore_WpaSupplParams));
pWpaCore->WpaSupplParams.mode = IEEE80211_MODE_INFRA; /* Default is Infrastructure mode */
pWpaCore->WpaSupplParams.proto = 0; /* key negotiation protocol - WPA is ok even though no security is used */
pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_NONE; /* No key management suite */
pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN; /* Open authentication */
pWpaCore->WpaSupplParams.pair_wise = WPA_CIPHER_NONE;
pWpaCore->WpaSupplParams.group = WPA_CIPHER_NONE;
pWpaCore->WpaSupplParams.anyWpaMode = 0;
#ifdef CONFIG_WPS
pWpaCore->WpaSupplParams.pWscPin = NULL;
pWpaCore->WpaSupplParams.WscMode = WSC_MODE_OFF;
#endif
pWpaCore->WpaParams.AuthMode = os802_11AuthModeOpen;
pWpaCore->WpaParams.EncryptionTypeGroup = OS_ENCRYPTION_TYPE_NONE;
pWpaCore->WpaParams.EncryptionTypePairWise = OS_ENCRYPTION_TYPE_NONE;
}
/* functions */
/*************/
THandle WpaCore_Create(PS32 pRes, PS8 pSupplIfFile)
{
TWpaCore* pWpaCore = (TWpaCore*)os_MemoryCAlloc(sizeof(TWpaCore), sizeof(U8));
if(pWpaCore == NULL)
{
*pRes = OK;
os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - WpaCore_Create - cant allocate control block\n");
return NULL;
}
pWpaCore->hIpcWpa = IpcWpa_Create(pRes, pSupplIfFile);
if(pWpaCore->hIpcWpa == NULL)
{
WpaCore_Destroy(pWpaCore);
return NULL;
}
WpaCore_InitWpaParams(pWpaCore);
pWpaCore->CurrentNetwork = -1;
/* send default configuration to the supplicant */
IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"AP_SCAN 2", FALSE);
return pWpaCore;
}
VOID WpaCore_Destroy(THandle hWpaCore)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
if(pWpaCore->hIpcWpa)
IpcWpa_Destroy(pWpaCore->hIpcWpa);
#ifdef CONFIG_WPS
if(pWpaCore->WpaSupplParams.pWscPin)
os_MemoryFree(pWpaCore->WpaSupplParams.pWscPin);
#endif
os_MemoryFree(pWpaCore);
}
#ifdef XCC_MODULE_INCLUDED
S32 WpaCore_SetXCC(THandle hWpaCore, U16 XCCConfig)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
pWpaCore->WpaSupplParams.XCC = XCCConfig;
return TI_OK;
}
#endif
S32 WpaCore_SetAuthMode(THandle hWpaCore, OS_802_11_AUTHENTICATION_MODE AuthMode)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
pWpaCore->WpaParams.AuthMode = AuthMode;
switch (AuthMode)
{
case os802_11AuthModeOpen:
pWpaCore->WpaSupplParams.proto = 0;
pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_NONE;
pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN;
break;
case os802_11AuthModeShared:
pWpaCore->WpaSupplParams.proto = 0;
pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_NONE;
pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_SHARED;
break;
case os802_11AuthModeWPANone:
pWpaCore->WpaSupplParams.proto = WPA_PROTO_WPA;
pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_WPA_NONE;
pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN;
break;
case os802_11AuthModeWPAPSK:
pWpaCore->WpaSupplParams.proto = WPA_PROTO_WPA;
pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_PSK;
pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN;
break;
case os802_11AuthModeWPA2PSK:
pWpaCore->WpaSupplParams.proto = WPA_PROTO_RSN;
pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_PSK;
pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN;
break;
case os802_11AuthModeWPA:
pWpaCore->WpaSupplParams.proto = WPA_PROTO_WPA;
pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_IEEE8021X;
pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN;
break;
case os802_11AuthModeWPA2:
pWpaCore->WpaSupplParams.proto = WPA_PROTO_RSN;
pWpaCore->WpaSupplParams.key_mgmt = WPA_KEY_MGMT_IEEE8021X;
pWpaCore->WpaSupplParams.auth_alg = WPA_AUTH_ALG_OPEN;
break;
default:
os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - WpaCore_SetAuthMode - unknown authentication mode (%d)!!!\n", AuthMode);
return ECUERR_WPA_CORE_ERROR_UNKNOWN_AUTH_MODE;
}
return OK;
}
S32 WpaCore_GetAuthMode(THandle hWpaCore, PU32 pAuthMode)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
*pAuthMode = pWpaCore->WpaParams.AuthMode;
return OK;
}
S32 WpaCore_SetEncryptionPairWise(THandle hWpaCore, OS_802_11_ENCRYPTION_TYPES EncryptionType)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
pWpaCore->WpaParams.EncryptionTypePairWise = EncryptionType;
switch (EncryptionType)
{
case OS_ENCRYPTION_TYPE_NONE:
pWpaCore->WpaSupplParams.pair_wise = WPA_CIPHER_NONE;
break;
case OS_ENCRYPTION_TYPE_WEP:
pWpaCore->WpaSupplParams.pair_wise = WPA_CIPHER_WEP40;
break;
case OS_ENCRYPTION_TYPE_TKIP:
pWpaCore->WpaSupplParams.pair_wise = WPA_CIPHER_TKIP;
break;
case OS_ENCRYPTION_TYPE_AES:
pWpaCore->WpaSupplParams.pair_wise = WPA_CIPHER_CCMP;
break;
}
return OK;
}
S32 WpaCore_SetPrivacyEap(THandle hWpaCore, OS_802_11_EAP_TYPES EapType)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
pWpaCore->WpaSupplParams.eap = EapType;
return OK;
}
S32 WpaCore_GetEncryptionPairWise(THandle hWpaCore, OS_802_11_ENCRYPTION_TYPES* pEncryptionType)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
*pEncryptionType = pWpaCore->WpaParams.EncryptionTypePairWise;
return OK;
}
S32 WpaCore_SetEncryptionGroup(THandle hWpaCore, OS_802_11_ENCRYPTION_TYPES EncryptionType)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
pWpaCore->WpaParams.EncryptionTypeGroup = EncryptionType;
switch (EncryptionType)
{
case OS_ENCRYPTION_TYPE_NONE:
os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - WpaCore_SetEncryptionGroup - group encryption cant be NONE\n");
break;
case OS_ENCRYPTION_TYPE_WEP:
pWpaCore->WpaSupplParams.group = WPA_CIPHER_WEP40;
break;
case OS_ENCRYPTION_TYPE_TKIP:
pWpaCore->WpaSupplParams.group = WPA_CIPHER_TKIP;
break;
case OS_ENCRYPTION_TYPE_AES:
pWpaCore->WpaSupplParams.group = WPA_CIPHER_CCMP;
break;
}
return OK;
}
S32 WpaCore_GetEncryptionGroup(THandle hWpaCore, OS_802_11_ENCRYPTION_TYPES* pEncryptionType)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
*pEncryptionType = pWpaCore->WpaParams.EncryptionTypeGroup;
return OK;
}
S32 WpaCore_SetCredentials(THandle hWpaCore, PU8 Identity, PU8 Passward)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
os_memcpy((PVOID)pWpaCore->WpaSupplParams.Identity, (PVOID)Identity, os_strlen((PS8)Identity));
if (Passward !=NULL)
{
os_memcpy((PVOID)pWpaCore->WpaSupplParams.password, (PVOID)Passward, os_strlen((PS8)Passward));
os_memcpy((PVOID)pWpaCore->WpaSupplParams.private_key_passwd, (PVOID)Passward, os_strlen((PS8)Passward));
}
return OK;
}
S32 WpaCore_SetCertificate(THandle hWpaCore, PU8 Filepath)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
os_memcpy((PVOID)pWpaCore->WpaSupplParams.client_cert, (PVOID)Filepath, os_strlen((PS8)Filepath));
return OK;
}
S32 WpaCore_SetPskPassPhrase(THandle hWpaCore, PU8 pPassPhrase)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
os_memcpy((PVOID)pWpaCore->WpaSupplParams.pass_phrase, (PVOID)pPassPhrase, os_strlen((PS8)pPassPhrase));
return OK;
}
S32 WpaCore_StopSuppl(THandle hWpaCore)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"TERMINATE", TRUE);
return OK;
}
S32 WpaCore_ChangeSupplDebugLevels(THandle hWpaCore, S32 Level1, S32 Level2, S32 Level3)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
S8 cmd[100];
os_sprintf(cmd, (PS8)"CHANGE_SUPPLICANT_DEBUG %ld %ld %ld", Level1, Level2, Level3);
IpcWpa_Command(pWpaCore->hIpcWpa, cmd, TRUE);
return OK;
}
S32 WpaCore_AddKey(THandle hWpaCore, OS_802_11_WEP* pKey)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
U32 WepKeyIndx;
WepKeyIndx = pKey->KeyIndex & 0x7FFFFFFF;
if ((pKey->KeyIndex & 0x80000000) == 0x80000000)
{
/* Add "1" to the default wep key index - since "0" is used to indicate no default wep key */
pWpaCore->WpaSupplParams.default_wep_key = WepKeyIndx + 1;
}
/* If key length wasn't set so far - set it according to current key */
if (pWpaCore->WpaSupplParams.wep_key_length == 0)
{
pWpaCore->WpaSupplParams.wep_key_length = pKey->KeyLength;
}
else
{
if (pWpaCore->WpaSupplParams.wep_key_length != pKey->KeyLength) return ECUERR_WPA_CORE_ERROR_KEY_LEN_MUST_BE_SAME;
}
os_memcpy(&pWpaCore->WpaSupplParams.wep_key[WepKeyIndx][0], pKey->KeyMaterial, pKey->KeyLength);
return OK;
}
S32 WpaCore_GetDefaultKey(THandle hWpaCore, U32* pDefaultKeyIndex)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
*pDefaultKeyIndex = pWpaCore->WpaSupplParams.default_wep_key;
return OK;
}
#ifdef CONFIG_WPS
S32 WpaCore_StartWpsPIN(THandle hWpaCore)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
#ifdef SUPPL_WPS_SUPPORT
S8 cmd[100];
#endif
pWpaCore->WpaSupplParams.WscMode = WSC_MODE_PIN;
#ifdef SUPPL_WPS_SUPPORT
os_sprintf(cmd, "WPS_PIN any");
IpcWpa_Command(pWpaCore->hIpcWpa, cmd, TRUE);
#endif
return OK;
}
S32 WpaCore_StartWpsPBC(THandle hWpaCore)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
#ifdef SUPPL_WPS_SUPPORT
S8 cmd[100];
#endif
pWpaCore->WpaSupplParams.WscMode = WSC_MODE_PBC;
#ifdef SUPPL_WPS_SUPPORT
os_sprintf(cmd, "WPS_PBC");
IpcWpa_Command(pWpaCore->hIpcWpa, cmd, TRUE);
#endif
return OK;
}
S32 WpaCore_StopWps(THandle hWpaCore)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
pWpaCore->WpaSupplParams.WscMode = WSC_MODE_OFF;
return OK;
}
S32 WpaCore_SetPin(THandle hWpaCore, PS8 pPinStr)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
int len = os_strlen(pPinStr);
if (len == 0)
return ECUERR_WPA_CORE_ERROR_IVALID_PIN;
pWpaCore->WpaSupplParams.pWscPin = (PS8)os_MemoryCAlloc(len, sizeof(char));
if(!pWpaCore->WpaSupplParams.pWscPin)
return ECUERR_WPA_CORE_ERROR_CANT_ALLOC_PIN;
os_strcpy(pWpaCore->WpaSupplParams.pWscPin, pPinStr);
return OK;
}
#endif /* CONFIG_WPS */
S32 WpaCore_SetAnyWpaMode(THandle hWpaCore, U8 anyWpaMode)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
pWpaCore->WpaSupplParams.anyWpaMode = anyWpaMode;
return OK;
}
S32 WpaCore_GetAnyWpaMode(THandle hWpaCore, PU8 pAnyWpaMode)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
*pAnyWpaMode = pWpaCore->WpaSupplParams.anyWpaMode;
return OK;
}
S32 WpaCore_SetBssType(THandle hWpaCore, U32 BssType)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
switch(BssType)
{
case os802_11IBSS:
pWpaCore->WpaSupplParams.mode = IEEE80211_MODE_IBSS;
break;
case os802_11Infrastructure:
pWpaCore->WpaSupplParams.mode = IEEE80211_MODE_INFRA;
break;
default:
pWpaCore->WpaSupplParams.mode = IEEE80211_MODE_INFRA;
break;
}
return OK;
}
S32 WpaCore_GetBssType(THandle hWpaCore, PU32 pBssType)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
switch(pWpaCore->WpaSupplParams.mode)
{
case IEEE80211_MODE_IBSS:
*pBssType = os802_11IBSS;
break;
case IEEE80211_MODE_INFRA:
*pBssType = os802_11Infrastructure;
break;
}
return OK;
}
S32 WpaCore_SetSsid(THandle hWpaCore, OS_802_11_SSID* ssid, TMacAddr bssid)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
S8 cmd[256];
S8 Resp[IPC_WPA_RESP_MAX_LEN];
PS8 pRespTemp;
U32 RespLen;
U32 NetworkID;
U32 SendCommand;
U8 Len;
#define WPACORE_SETSSID_FAIL \
os_error_printf(CU_MSG_ERROR, (PS8)"Failed to connect to %s\n", ssid->Ssid); \
return ECUERR_WPA_CORE_ERROR_FAILED_CONNECT_SSID;
/* First Add a new network block*/
os_sprintf(cmd, (PS8)"ADD_NETWORK");
if (IpcWpa_CommandWithResp(pWpaCore->hIpcWpa, cmd, TRUE, Resp, &RespLen))
{
WPACORE_SETSSID_FAIL;
}
NetworkID = os_strtoul(Resp, &pRespTemp, 0);
/* Set the parameters in the new new network block*/
/* Set the BSSID */
if(!((bssid[0] == 0xFF) &&
(bssid[1] == 0xFF) &&
(bssid[2] == 0xFF) &&
(bssid[3] == 0xFF) &&
(bssid[4] == 0xFF) &&
(bssid[5] == 0xFF)))
{
/* set th ebssid only if the bssid doesn't mean any bssid */
S8 temp[20];
os_sprintf(temp, (PS8)"%02x", bssid[0]);
os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[1]);
os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[2]);
os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[3]);
os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[4]);
os_sprintf(temp, (PS8)"%s:%02x", temp, bssid[5]);
os_sprintf(cmd, (PS8)"SET_NETWORK %d bssid %s", NetworkID, temp);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, FALSE))
{
WPACORE_SETSSID_FAIL;
}
}
/* Set the SSID */
os_sprintf(cmd, (PS8)"SET_NETWORK %d ssid \"%s\"", NetworkID, ssid->Ssid);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
/* set mode of the new network block */
os_sprintf(cmd, (PS8)"SET_NETWORK %d mode %d", NetworkID, pWpaCore->WpaSupplParams.mode);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
/* set proto of the new network block */
SendCommand = TRUE;
if (pWpaCore->WpaSupplParams.proto == WPA_PROTO_WPA)
{
os_sprintf(cmd, (PS8)"SET_NETWORK %d proto WPA", NetworkID);
}
else if (pWpaCore->WpaSupplParams.proto == WPA_PROTO_RSN)
{
os_sprintf(cmd, (PS8)"SET_NETWORK %d proto RSN", NetworkID);
}
else
{
SendCommand = FALSE;
}
if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
/* set key management of the new network block */
SendCommand = TRUE;
if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_NONE)
{
if ((pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_LEAP) ||
(pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_PEAP) ||
(pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_FAST))
{
os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt IEEE8021X", NetworkID);
}
else
os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt NONE", NetworkID);
}
else if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_PSK)
os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt WPA-PSK", NetworkID);
else if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_IEEE8021X)
#ifdef XCC_MODULE_INCLUDED
if((pWpaCore->WpaSupplParams.XCC == OS_XCC_CONFIGURATION_ENABLE_CCKM)||(pWpaCore->WpaSupplParams.XCC == OS_XCC_CONFIGURATION_ENABLE_ALL))
{
os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt WPA-EAP CCKM", NetworkID);
}
else
#endif
os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt WPA-EAP", NetworkID);
else if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_WPA_NONE)
os_sprintf(cmd, (PS8)"SET_NETWORK %d key_mgmt WPA-NONE", NetworkID);
else
{
SendCommand = FALSE;
}
if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
/* set authentication alog of the new network block */
SendCommand = TRUE;
if (pWpaCore->WpaSupplParams.auth_alg == WPA_AUTH_ALG_OPEN)
os_sprintf(cmd, (PS8)"SET_NETWORK %d auth_alg OPEN", NetworkID);
else if (pWpaCore->WpaSupplParams.auth_alg == WPA_AUTH_ALG_SHARED)
os_sprintf(cmd, (PS8)"SET_NETWORK %d auth_alg SHARED", NetworkID);
else if (pWpaCore->WpaSupplParams.auth_alg == WPA_AUTH_ALG_LEAP)
os_sprintf(cmd, (PS8)"SET_NETWORK %d auth_alg LEAP", NetworkID);
else
{
SendCommand = FALSE;
}
if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
/* set pairwise encryption of the new network block */
SendCommand = TRUE;
if (pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_NONE)
os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise NONE", NetworkID);
else if (pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_WEP40)
os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise NONE", NetworkID);
else if (pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_TKIP)
os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise TKIP", NetworkID);
else if ((pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_CCMP)&& (pWpaCore->WpaSupplParams.anyWpaMode == 0))
os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise CCMP", NetworkID);
else if ((pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_CCMP)&& (pWpaCore->WpaSupplParams.anyWpaMode == 1))
os_sprintf(cmd, (PS8)"SET_NETWORK %d pairwise CCMP TKIP", NetworkID);
else
{
SendCommand = FALSE;
}
if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
/* set group encryption of the new network block */
SendCommand = TRUE;
if (pWpaCore->WpaSupplParams.group == WPA_CIPHER_WEP40)
os_sprintf(cmd, (PS8)"SET_NETWORK %d group WEP40", NetworkID);
else if (pWpaCore->WpaSupplParams.group == WPA_CIPHER_TKIP)
os_sprintf(cmd, (PS8)"SET_NETWORK %d group TKIP", NetworkID);
else if ((pWpaCore->WpaSupplParams.group == WPA_CIPHER_CCMP)&& (pWpaCore->WpaSupplParams.anyWpaMode == 0))
os_sprintf(cmd, (PS8)"SET_NETWORK %d group CCMP", NetworkID);
else if ((pWpaCore->WpaSupplParams.group == WPA_CIPHER_CCMP)&& (pWpaCore->WpaSupplParams.anyWpaMode == 1))
os_sprintf(cmd, (PS8)"SET_NETWORK %d group CCMP TKIP", NetworkID);
else
{
SendCommand = FALSE;
}
if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
/* set eap of the new network block */
if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_NONE)
SendCommand = FALSE;
else
{
SendCommand = TRUE;
if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_MD5_CHALLENGE)
os_sprintf(cmd, (PS8)"SET_NETWORK %d eap MD5", NetworkID);
else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_GENERIC_TOKEN_CARD)
os_sprintf(cmd, (PS8)"SET_NETWORK %d eap GTC", NetworkID);
else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_TLS)
os_sprintf(cmd, (PS8)"SET_NETWORK %d eap TLS", NetworkID);
else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_TTLS)
os_sprintf(cmd, (PS8)"SET_NETWORK %d eap TTLS", NetworkID);
else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_PEAP)
os_sprintf(cmd, (PS8)"SET_NETWORK %d eap PEAP", NetworkID);
else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_MS_CHAP_V2)
os_sprintf(cmd, (PS8)"SET_NETWORK %d eap MSCHAPV2", NetworkID);
#ifdef XCC_MODULE_INCLUDED
else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_LEAP)
os_sprintf(cmd, (PS8)"SET_NETWORK %d eap LEAP", NetworkID);
else if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_FAST)
os_sprintf(cmd, (PS8)"SET_NETWORK %d eap FAST", NetworkID);
#endif
else
SendCommand = FALSE;
}
if (SendCommand && IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
if (pWpaCore->WpaSupplParams.Identity[0])
{
os_sprintf(cmd, (PS8)"SET_NETWORK %d identity \"%s\"", NetworkID,pWpaCore->WpaSupplParams.Identity);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
}
if (pWpaCore->WpaSupplParams.client_cert[0])
{
os_sprintf(cmd, (PS8)"SET_NETWORK %d client_cert \"%s\"", NetworkID,pWpaCore->WpaSupplParams.client_cert);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
}
if (pWpaCore->WpaSupplParams.client_cert[0])
{
Len = os_strlen ((PS8)pWpaCore->WpaSupplParams.client_cert);
os_memcpy(pWpaCore->WpaSupplParams.private_key,pWpaCore->WpaSupplParams.client_cert,Len);
os_memcpy(&pWpaCore->WpaSupplParams.private_key[Len-3],"pem",3);
os_sprintf(cmd, (PS8)"SET_NETWORK %d private_key \"%s\"", NetworkID,pWpaCore->WpaSupplParams.private_key);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
}
if (pWpaCore->WpaSupplParams.private_key_passwd[0] )
{
os_sprintf(cmd, (PS8)"SET_NETWORK %d private_key_passwd \"%s\"", NetworkID,pWpaCore->WpaSupplParams.private_key_passwd);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
}
if (pWpaCore->WpaSupplParams.password[0] )
{
os_sprintf(cmd, (PS8)"SET_NETWORK %d password \"%s\"", NetworkID,pWpaCore->WpaSupplParams.password);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
}
if (pWpaCore->WpaSupplParams.eap == OS_EAP_TYPE_FAST)
{
os_sprintf(cmd, (PS8)"SET_NETWORK %d phase1 \"fast_provisioning=3\"", NetworkID);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
os_sprintf(cmd, (PS8)"SET_NETWORK %d pac_file \"/etc/wpa_supplicant.eap-fast-pac\"", NetworkID);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
os_sprintf(cmd, (PS8)"SET_NETWORK %d anonymous_identity \"anonymous\"", NetworkID);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
}
if (pWpaCore->WpaSupplParams.pair_wise == WPA_CIPHER_WEP40)
{
S32 idx, idx2;
for (idx=0; idx<4; idx++)
{
S8 TempBuf[3];
os_sprintf(cmd, (PS8)"SET_NETWORK %d wep_key%d ", NetworkID, idx);
for (idx2=0; idx2 < pWpaCore->WpaSupplParams.wep_key_length; idx2++)
{
os_sprintf(TempBuf, (PS8)"%02x", pWpaCore->WpaSupplParams.wep_key[idx][idx2]);
os_strcat (cmd, TempBuf);
}
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
}
os_sprintf(cmd, (PS8)"SET_NETWORK %d wep_tx_keyidx %d", NetworkID, pWpaCore->WpaSupplParams.default_wep_key-1);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
}
if (pWpaCore->WpaSupplParams.key_mgmt == WPA_KEY_MGMT_PSK)
{
os_sprintf(cmd, (PS8)"SET_NETWORK %d psk \"%s\"", NetworkID, pWpaCore->WpaSupplParams.pass_phrase);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
}
#ifdef CONFIG_WPS
if (pWpaCore->WpaSupplParams.WscMode)
{
os_sprintf(cmd, (PS8)"SET_NETWORK %d wsc_mode %d", NetworkID, pWpaCore->WpaSupplParams.WscMode);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
}
if (pWpaCore->WpaSupplParams.pWscPin)
{
os_sprintf(cmd, (PS8)"SET_NETWORK %d wsc_pin \"%s\"", NetworkID, pWpaCore->WpaSupplParams.pWscPin);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
}
#endif
/* Finaly Connect to the new network block */
os_sprintf(cmd, (PS8)"SELECT_NETWORK %d", NetworkID);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 0))
{
WPACORE_SETSSID_FAIL;
}
pWpaCore->CurrentNetwork = NetworkID;
IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"SAVE_CONFIG", 1);
/*
init the connection params thus the next time we connect we will by default
connect to an open
*/
WpaCore_InitWpaParams(pWpaCore);
return OK;
}
S32 WpaCore_Disassociate(THandle hWpaCore)
{
TWpaCore* pWpaCore = (TWpaCore*)hWpaCore;
S8 cmd[256];
os_sprintf(cmd, (PS8)"DISABLE_NETWORK %d", pWpaCore->CurrentNetwork);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 1))
{
os_error_printf(CU_MSG_ERROR, (PS8)"Failed to disconnect from current ssid\n");
return ECUERR_WPA_CORE_ERROR_FAILED_DISCONNECT_SSID;
}
pWpaCore->CurrentNetwork = -1;
IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"SAVE_CONFIG", 0);
#if 0 /* for futur WPS work */
if(pWpaCore->CurrentNetwork == -1)
{
os_sprintf(cmd, (PS8)"LIST_NETWORKS");
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 1))
{
os_error_printf(CU_MSG_ERROR, (PS8)"Failed to disconnect from current ssid\n");
return ECUERR_WPA_CORE_ERROR_FAILED_DISCONNECT_SSID;
}
}
else
{
os_sprintf(cmd, (PS8)"DISABLE_NETWORK %d", pWpaCore->CurrentNetwork);
if (IpcWpa_Command(pWpaCore->hIpcWpa, cmd, 1))
{
os_error_printf(CU_MSG_ERROR, (PS8)"Failed to disconnect from current ssid\n");
return ECUERR_WPA_CORE_ERROR_FAILED_DISCONNECT_SSID;
}
pWpaCore->CurrentNetwork = -1;
IpcWpa_Command(pWpaCore->hIpcWpa, (PS8)"SAVE_CONFIG", 0);
}
#endif /* #if 0 for futur WPS work */
return OK;
}