EFI_EAP_TYPE_MSCHAPV2\r
};\r
\r
+UINT8 mWifiConnectionCount = 0;\r
+\r
/**\r
The callback function for scan operation. This function updates networks\r
according to the latest scan result, and trigger UI refresh.\r
return EFI_NOT_FOUND;\r
}\r
\r
- AsciiPassword = AllocateZeroPool ((StrLen (Profile->Password) + 1) * sizeof (UINT8));\r
+ if (StrLen (Profile->Password) >= PASSWORD_STORAGE_SIZE) {\r
+ ASSERT (EFI_INVALID_PARAMETER);\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ AsciiPassword = AllocateZeroPool ((StrLen (Profile->Password) + 1) * sizeof (CHAR8));\r
if (AsciiPassword == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- UnicodeStrToAsciiStrS (Profile->Password, (CHAR8 *)AsciiPassword, PASSWORD_STORAGE_SIZE);\r
- Status = Supplicant->SetData (\r
- Supplicant,\r
- EfiSupplicant80211PskPassword,\r
- AsciiPassword,\r
- (StrLen (Profile->Password) + 1) * sizeof (UINT8)\r
- );\r
+ Status = UnicodeStrToAsciiStrS (Profile->Password, (CHAR8 *)AsciiPassword, (StrLen (Profile->Password) + 1));\r
+ if (!EFI_ERROR (Status)) {\r
+ Status = Supplicant->SetData (\r
+ Supplicant,\r
+ EfiSupplicant80211PskPassword,\r
+ AsciiPassword,\r
+ (StrLen (Profile->Password) + 1) * sizeof (CHAR8)\r
+ );\r
+ }\r
+\r
ZeroMem (AsciiPassword, AsciiStrLen ((CHAR8 *)AsciiPassword) + 1);\r
FreePool (AsciiPassword);\r
\r
IN WIFI_MGR_NETWORK_PROFILE *Profile\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_EAP_CONFIGURATION_PROTOCOL *EapConfig;\r
- EFI_EAP_TYPE EapAuthMethod;\r
- EFI_EAP_TYPE EapSecondAuthMethod;\r
- EFI_EAP_TYPE *AuthMethodList;\r
- CHAR8 *Identity;\r
- UINTN IdentitySize;\r
- CHAR16 *Password;\r
- UINTN PasswordSize;\r
- UINTN EncryptPasswordLen;\r
- CHAR8 *AsciiEncryptPassword;\r
- UINTN AuthMethodListSize;\r
- UINTN Index;\r
+ EFI_STATUS Status;\r
+ EDKII_WIFI_PROFILE_SYNC_PROTOCOL *WiFiProfileSyncProtocol;\r
+ EFI_EAP_CONFIGURATION_PROTOCOL *EapConfig;\r
+ EFI_EAP_TYPE EapAuthMethod;\r
+ EFI_EAP_TYPE EapSecondAuthMethod;\r
+ EFI_EAP_TYPE *AuthMethodList;\r
+ CHAR8 *Identity;\r
+ UINTN IdentitySize;\r
+ CHAR16 *Password;\r
+ UINTN PasswordSize;\r
+ UINTN EncryptPasswordLen;\r
+ CHAR8 *AsciiEncryptPassword;\r
+ UINTN AuthMethodListSize;\r
+ UINTN Index;\r
\r
if ((Nic == NULL) || (Nic->EapConfig == NULL) || (Profile == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- UnicodeStrToAsciiStrS (Profile->EapIdentity, Identity, IdentitySize);\r
+ Status = gBS->LocateProtocol (&gEdkiiWiFiProfileSyncProtocolGuid, NULL, (VOID **)&WiFiProfileSyncProtocol);\r
+ if (!EFI_ERROR (Status)) {\r
+ CopyMem (Identity, &Profile->EapIdentity, IdentitySize);\r
+ } else {\r
+ UnicodeStrToAsciiStrS (Profile->EapIdentity, Identity, IdentitySize);\r
+ }\r
+\r
Status = EapConfig->SetData (\r
EapConfig,\r
EFI_EAP_TYPE_IDENTITY,\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Will reset NiC data, get profile from profile sync driver, and send for\r
+ another connection attempt.This function should not be called more than\r
+ 3 times.\r
+\r
+ @param[in] WiFiProfileSyncProtocol The target network profile to connect.\r
+\r
+ @retval EFI_SUCCESS The operation is completed.\r
+ @retval other Operation failure.\r
+\r
+**/\r
+EFI_STATUS\r
+ConnectionRetry (\r
+ IN EDKII_WIFI_PROFILE_SYNC_PROTOCOL *WiFiProfileSyncProtocol\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ WIFI_MGR_DEVICE_DATA *Nic;\r
+ EFI_WIRELESS_MAC_CONNECTION_II_PROTOCOL *Wmp;\r
+ EFI_SUPPLICANT_PROTOCOL *Supplicant;\r
+ EFI_EAP_CONFIGURATION_PROTOCOL *EapConfig;\r
+\r
+ Nic = NULL;\r
+\r
+ Status = gBS->LocateProtocol (\r
+ &gEfiWiFi2ProtocolGuid,\r
+ NULL,\r
+ (VOID **)&Wmp\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ Status = gBS->LocateProtocol (\r
+ &gEfiSupplicantProtocolGuid,\r
+ NULL,\r
+ (VOID **)&Supplicant\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ Supplicant = NULL;\r
+ }\r
+\r
+ Status = gBS->LocateProtocol (\r
+ &gEfiEapConfigurationProtocolGuid,\r
+ NULL,\r
+ (VOID **)&EapConfig\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ EapConfig = NULL;\r
+ }\r
+\r
+ //\r
+ // Initialize Nic device data\r
+ //\r
+ Nic = AllocateZeroPool (sizeof (WIFI_MGR_DEVICE_DATA));\r
+ if (Nic == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ return Status;\r
+ }\r
+\r
+ Nic->Signature = WIFI_MGR_DEVICE_DATA_SIGNATURE;\r
+ Nic->Private = mPrivate;\r
+ Nic->Wmp = Wmp;\r
+ Nic->Supplicant = Supplicant;\r
+ Nic->EapConfig = EapConfig;\r
+ Nic->UserSelectedProfile = NULL;\r
+ Nic->OneTimeScanRequest = FALSE;\r
+\r
+ if (Nic->Supplicant != NULL) {\r
+ Status = WifiMgrGetSupportedSuites (Nic);\r
+ }\r
+\r
+ if (!EFI_ERROR (Status)) {\r
+ InitializeListHead (&Nic->ProfileList);\r
+\r
+ Nic->ConnectPendingNetwork = (WIFI_MGR_NETWORK_PROFILE *)AllocateZeroPool (sizeof (WIFI_MGR_NETWORK_PROFILE));\r
+ if (Nic->ConnectPendingNetwork == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ DEBUG ((DEBUG_ERROR, "[WiFi Connection Manager] Failed to allocate memory for ConnectPendingNetwork\n"));\r
+ goto ERROR;\r
+ }\r
+\r
+ Status = WiFiProfileSyncProtocol->GetProfile (Nic->ConnectPendingNetwork, Nic->MacAddress);\r
+ if (!EFI_ERROR (Status) && (Nic->ConnectPendingNetwork != NULL)) {\r
+ Status = WifiMgrConnectToNetwork (Nic, Nic->ConnectPendingNetwork);\r
+ if (!EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ } else {\r
+ DEBUG ((DEBUG_ERROR, "[WiFi Connection Manager] Failed to get WiFi profile with status %r\n", Status));\r
+ }\r
+ } else {\r
+ DEBUG ((DEBUG_ERROR, "[WiFi Connection Manager] Failed to get Supported suites with status %r\n", Status));\r
+ }\r
+\r
+ if (Nic->ConnectPendingNetwork != NULL) {\r
+ if (Nic->ConnectPendingNetwork->Network.AKMSuite != NULL) {\r
+ FreePool (Nic->ConnectPendingNetwork->Network.AKMSuite);\r
+ }\r
+\r
+ if (Nic->ConnectPendingNetwork->Network.CipherSuite != NULL) {\r
+ FreePool (Nic->ConnectPendingNetwork->Network.CipherSuite);\r
+ }\r
+\r
+ FreePool (Nic->ConnectPendingNetwork);\r
+ }\r
+\r
+ERROR:\r
+ if (Nic->Supplicant != NULL) {\r
+ if (Nic->SupportedSuites.SupportedAKMSuites != NULL) {\r
+ FreePool (Nic->SupportedSuites.SupportedAKMSuites);\r
+ }\r
+\r
+ if (Nic->SupportedSuites.SupportedSwCipherSuites != NULL) {\r
+ FreePool (Nic->SupportedSuites.SupportedSwCipherSuites);\r
+ }\r
+\r
+ if (Nic->SupportedSuites.SupportedHwCipherSuites != NULL) {\r
+ FreePool (Nic->SupportedSuites.SupportedHwCipherSuites);\r
+ }\r
+ }\r
+\r
+ FreePool (Nic);\r
+\r
+ return Status;\r
+}\r
+\r
/**\r
The callback function for connect operation.\r
\r
IN VOID *Context\r
)\r
{\r
- EFI_STATUS Status;\r
- WIFI_MGR_MAC_CONFIG_TOKEN *ConfigToken;\r
- WIFI_MGR_NETWORK_PROFILE *ConnectedProfile;\r
- UINT8 SecurityType;\r
- UINT8 SSIdLen;\r
- CHAR8 *AsciiSSId;\r
+ EFI_STATUS Status;\r
+ WIFI_MGR_MAC_CONFIG_TOKEN *ConfigToken;\r
+ WIFI_MGR_NETWORK_PROFILE *ConnectedProfile;\r
+ UINT8 SecurityType;\r
+ UINT8 SSIdLen;\r
+ CHAR8 *AsciiSSId;\r
+ EDKII_WIFI_PROFILE_SYNC_PROTOCOL *WiFiProfileSyncProtocol;\r
\r
ASSERT (Context != NULL);\r
\r
ASSERT (ConfigToken->Type == TokenTypeConnectNetworkToken);\r
\r
ASSERT (ConfigToken->Token.ConnectNetworkToken != NULL);\r
+\r
+ Status = gBS->LocateProtocol (&gEdkiiWiFiProfileSyncProtocolGuid, NULL, (VOID **)&WiFiProfileSyncProtocol);\r
+ if (!EFI_ERROR (Status)) {\r
+ WiFiProfileSyncProtocol->SetConnectState (ConfigToken->Token.ConnectNetworkToken->ResultCode);\r
+ if ((mWifiConnectionCount < MAX_WIFI_CONNETION_ATTEMPTS) &&\r
+ (ConfigToken->Token.ConnectNetworkToken->ResultCode != ConnectSuccess))\r
+ {\r
+ mWifiConnectionCount++;\r
+ gBS->CloseEvent (Event);\r
+ Status = ConnectionRetry (WiFiProfileSyncProtocol);\r
+ if (!EFI_ERROR (Status)) {\r
+ return;\r
+ }\r
+\r
+ WiFiProfileSyncProtocol->SetConnectState (Status);\r
+ }\r
+ }\r
+\r
if (ConfigToken->Token.ConnectNetworkToken->Status != EFI_SUCCESS) {\r
if (ConfigToken->Nic->OneTimeConnectRequest) {\r
//\r