]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrImpl.c
NetworkPkg: Add WiFi profile sync protocol support
[mirror_edk2.git] / NetworkPkg / WifiConnectionManagerDxe / WifiConnectionMgrImpl.c
index 59bac48c42401cf1508f19f057721d38ea7d85a6..2e596c1981f56bb6c2cdfc2a78d7d1c67a7914a8 100644 (file)
@@ -19,6 +19,8 @@ EFI_EAP_TYPE  mEapSecondAuthMethod[] = {
   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
@@ -424,18 +426,26 @@ WifiMgrConfigPassword (
     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
@@ -465,19 +475,20 @@ WifiMgrConfigEap (
   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
@@ -567,7 +578,13 @@ WifiMgrConfigEap (
       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
@@ -892,6 +909,133 @@ WifiMgrPrepareConnection (
   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
@@ -908,12 +1052,13 @@ WifiMgrOnConnectFinished (
   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
@@ -925,6 +1070,24 @@ WifiMgrOnConnectFinished (
   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