[edk2-devel] [PATCH] NetworkPkg: Add WiFi profile sync protocol support

Heng Luo heng.luo at intel.com
Mon Sep 26 07:37:01 UTC 2022


Hi Zachary,
> @@ -420,22 +422,34 @@ WifiMgrConfigPassword (
>    //
>    // Set password to supplicant
>    //
> +  if (Profile->Password[StrLen (Profile->Password)] != '\0') {
> +    Profile->Password[StrLen (Profile->Password)] = L'\0';  }
> +
I don't understand this change, StrLen returns the length of a Null-terminated Unicode string, it means "Profile->Password[StrLen (Profile->Password)]" should always be 0. Did you see exceptional case?

Thanks,
Heng

> -----Original Message-----
> From: devel at edk2.groups.io <devel at edk2.groups.io> On Behalf Of Clark-
> williams, Zachary
> Sent: Thursday, September 15, 2022 3:43 AM
> To: devel at edk2.groups.io
> Cc: Zachary Clark-Williams <zclarkw112 at gmail.com>; Clark-williams, Zachary
> <zachary.clark-williams at intel.com>
> Subject: [edk2-devel] [PATCH] NetworkPkg: Add WiFi profile sync protocol
> support
> 
> From: Zachary Clark-Williams <zclarkw112 at gmail.com>
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3845
> 
> Enables KVM and One Click Recovery WLAN capability with WiFi Profile Sync
> feature and protocol. Adding WiFiProfileSyncProtocol, which supports the
> profilesync driver operations for transferring WiFi profiles from AMT to the
> Supplicant. WiFiConnectionManager will check for the
> WifiProfileSyncProtocol and if found will operate on the premise of a One
> Click Recovery, or KVM flow with a Wifi profile provided by AMT.
> 
> Signed-off-by: Zachary Clark-Williams <zachary.clark-williams at intel.com>
> ---
>  .../Protocol/WiFiProfileSyncProtocol.h        |  83 ++++++++
>  NetworkPkg/NetworkPkg.dec                     |   3 +
>  .../WifiConnectionManagerDxe.inf              |   3 +-
>  .../WifiConnectionMgrDriver.c                 | 126 +++++++----
>  .../WifiConnectionMgrDxe.h                    |   4 +-
>  .../WifiConnectionMgrImpl.c                   | 197 ++++++++++++++++--
>  .../WifiConnectionMgrMisc.c                   |  13 ++
>  7 files changed, 370 insertions(+), 59 deletions(-)  create mode 100644
> NetworkPkg/Include/Protocol/WiFiProfileSyncProtocol.h
> 
> diff --git a/NetworkPkg/Include/Protocol/WiFiProfileSyncProtocol.h
> b/NetworkPkg/Include/Protocol/WiFiProfileSyncProtocol.h
> new file mode 100644
> index 0000000000..e36daceabf
> --- /dev/null
> +++ b/NetworkPkg/Include/Protocol/WiFiProfileSyncProtocol.h
> @@ -0,0 +1,83 @@
> +/** @file
> +  WiFi profile sync protocol. Supports One Click Recovery or KVM OS
> +recovery
> +  boot flow over WiFi.
> +
> +  Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent **/
> +
> +#ifndef WIFI_PROFILE_SYNC_PROTOCOL_H_
> +#define WIFI_PROFILE_SYNC_PROTOCOL_H_
> +
> +#include <WifiConnectionManagerDxe/WifiConnectionMgrConfig.h>
> +
> +//
> +//  WiFi Profile Sync Protocol GUID variable.
> +//
> +extern EFI_GUID  gEfiWiFiProfileSyncProtocolGuid;
> +
> +/**
> +  Used by the WiFi connection manager to get the WiFi profile that AMT
> +shared
> +  and was stored in WiFi profile protocol. Aligns the AMT WiFi profile
> +data to
> +  the WiFi connection manager profile structure fo connection use.
> +
> +  @param[in, out]  WcmProfile       WiFi Connection Manager profile
> structure
> +  @param[in, out]  MacAddress       MAC address from AMT saved to NiC
> MAC address
> +
> +  @retval EFI_SUCCESS               Stored WiFi profile converted and returned
> succefully
> +  @retval EFI_UNSUPPORTED           Profile protocol sharing not supported or
> enabled
> +  @retval EFI_NOT_FOUND             No profiles to returned
> +  @retval Others                    Error Occurred
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *WIFI_PROFILE_GET)(
> +  IN OUT  WIFI_MGR_NETWORK_PROFILE  *Profile,
> +  IN OUT  EFI_80211_MAC_ADDRESS     MacAddress
> +  );
> +
> +/**
> +  Saves the WiFi connection status recieved by the
> +WiFiConnectionManager when
> +  in a KVM OR One Click Recovery WLAN recovery flow. Input as
> +  EFI_80211_CONNECT_NETWORK_RESULT_CODE then converted and
> stored as EFI_STATUS type.
> +
> +  @param[in] ConnectionStatus     WiFi connection attempt results
> +**/
> +typedef
> +VOID
> +(EFIAPI *WIFI_SET_CONNECT_STATE)(
> +  IN  EFI_80211_CONNECT_NETWORK_RESULT_CODE ConnectionStatus
> +  );
> +
> +/**
> +  Retrieves the stored WiFi connection status when in either KVM OR One
> +Click
> +  Recovery WLAN recovery flow.
> +
> +  @retval EFI_SUCCESS               WiFi connection completed succesfully
> +  @retval Others                    Connection failure occurred
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *WIFI_GET_CONNECT_STATE)(
> +  VOID
> +  );
> +
> +//
> +//  WiFi Profile Sync Protocol structure.
> +//
> +typedef struct {
> +  UINT32                    Revision;
> +  WIFI_SET_CONNECT_STATE    WifiProfileSyncSetConnectState;
> +  WIFI_GET_CONNECT_STATE    WifiProfileSyncGetConnectState;
> +  WIFI_PROFILE_GET          WifiProfileSyncGetProfile;
> +} EFI_WIFI_PROFILE_SYNC_PROTOCOL;
> +
> +/**
> +  WiFi Profile Protocol revision number.
> +
> +  Revision 1:   Initial version
> +**/
> +#define EFI_WIFI_PROFILE_SYNC_PROTOCOL_REVISION  1
> +
> +#endif //  WIFI_PROFILE_SYNC_PROTOCOL_H_
> diff --git a/NetworkPkg/NetworkPkg.dec b/NetworkPkg/NetworkPkg.dec
> index 5e43ebf8c5..53fb34c4a0 100644
> --- a/NetworkPkg/NetworkPkg.dec
> +++ b/NetworkPkg/NetworkPkg.dec
> @@ -91,6 +91,9 @@
>    ## Include/Protocol/HttpCallback.h
>    gEdkiiHttpCallbackProtocolGuid  = {0x611114f1, 0xa37b, 0x4468, {0xa4,
> 0x36, 0x5b, 0xdd, 0xa1, 0x6a, 0xa2, 0x40}}
> 
> +  ## Include/Protocol/WiFiProfileSyncProtocol.h
> +  gEfiWiFiProfileSyncProtocolGuid = {0x399a2b8a, 0xc267, 0x44aa, {0x9a,
> + 0xb4, 0x30, 0x58, 0x8c, 0xd2, 0x2d, 0xcc}}
> +
>  [PcdsFixedAtBuild]
>    ## The max attempt number will be created by iSCSI driver.
>    # @Prompt Max attempt number.
> diff --git
> a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionManagerDxe.inf
> b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionManagerDxe.inf
> index 4394b6f4bb..7e36016cf8 100644
> ---
> a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionManagerDxe.inf
> +++
> b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionManagerDxe.inf
> @@ -9,7 +9,7 @@
>  #  2). WPA2 Personal Network
>  #  3). EAP Networks (EAP-TLS, EAP-TTLS/MSCHAPv2 and PEAPv0/MSCHAPv2)
> # -#  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +#  Copyright (c) 2019 - 2022, Intel Corporation. All rights
> +reserved.<BR>
>  #
>  #  SPDX-License-Identifier: BSD-2-Clause-Patent  # @@ -71,6 +71,7 @@
>    gEfiAdapterInformationProtocolGuid            ## SOMETIMES_CONSUMES
>    gEfiSupplicantProtocolGuid                    ## SOMETIMES_CONSUMES
>    gEfiEapConfigurationProtocolGuid              ## SOMETIMES_CONSUMES
> +  gEfiWiFiProfileSyncProtocolGuid               ## SOMETIMES_CONSUMES
> 
>  [Guids]
>    gWifiConfigGuid                               ## PRODUCES  ## GUID
> diff --git
> a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrDriver.c
> b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrDriver.c
> index 67a01ca058..65df5b2c8a 100644
> --- a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrDriver.c
> +++ b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrDriver.c
> @@ -1,7 +1,7 @@
>  /** @file
>    The driver binding protocol for the WiFi Connection Manager.
> 
> -  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2019 - 2022, Intel Corporation. All rights
> + reserved.<BR>
> 
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
> @@ -39,6 +39,11 @@ EFI_GUID  mWifiConfigNetworkListRefreshGuid =
> WIFI_CONFIG_NETWORK_LIST_REFRESH_G
>  EFI_GUID  mWifiConfigConnectFormRefreshGuid =
> WIFI_CONFIG_CONNECT_FORM_REFRESH_GUID;
>  EFI_GUID  mWifiConfigMainFormRefreshGuid    =
> WIFI_CONFIG_MAIN_FORM_REFRESH_GUID;
> 
> +//
> +// Wifi connection attempt counter for retries // extern UINT8
> +WifiConnectionCount;
> +
>  /**
>    Tests to see if this driver supports a given controller. If a child device is
> provided,
>    it further tests to see if this driver supports creating a handle for the
> specified child device.
> @@ -167,8 +172,10 @@ WifiMgrDxeDriverBindingStart (
>    EFI_WIRELESS_MAC_CONNECTION_II_PROTOCOL  *Wmp;
>    EFI_SUPPLICANT_PROTOCOL                  *Supplicant;
>    EFI_EAP_CONFIGURATION_PROTOCOL           *EapConfig;
> +  EFI_WIFI_PROFILE_SYNC_PROTOCOL           *WiFiProfileSyncProtocol;
> 
> -  Nic = NULL;
> +  WifiConnectionCount = 0;
> +  Nic                 = NULL;
> 
>    //
>    // Open Protocols
> @@ -236,47 +243,73 @@ WifiMgrDxeDriverBindingStart (
>    InitializeListHead (&Nic->ProfileList);
> 
>    //
> -  // Record the MAC address of the incoming NIC.
> +  // WiFi profile sync protocol installation check for OS recovery flow.
>    //
> -  Status = NetLibGetMacAddress (
> -             ControllerHandle,
> -             (EFI_MAC_ADDRESS *)&Nic->MacAddress,
> -             &AddressSize
> -             );
> -  if (EFI_ERROR (Status)) {
> -    goto ERROR2;
> -  }
> -
> -  //
> -  // Create and start the timer for the status check
> -  //
> -  Status = gBS->CreateEvent (
> -                  EVT_NOTIFY_SIGNAL | EVT_TIMER,
> -                  TPL_CALLBACK,
> -                  WifiMgrOnTimerTick,
> -                  Nic,
> -                  &Nic->TickTimer
> +  Status = gBS->LocateProtocol (
> +                  &gEfiWiFiProfileSyncProtocolGuid,
> +                  NULL,
> +                  (VOID **)&WiFiProfileSyncProtocol
>                    );
> -  if (EFI_ERROR (Status)) {
> -    goto ERROR2;
> -  }
> +  if (!EFI_ERROR (Status)) {
> +    Nic->ConnectPendingNetwork = (WIFI_MGR_NETWORK_PROFILE
> *)AllocateZeroPool (sizeof (WIFI_MGR_NETWORK_PROFILE));
> +    if (Nic->ConnectPendingNetwork == NULL) {
> +      Status = EFI_OUT_OF_RESOURCES;
> +      goto ERROR1;
> +    }
> 
> -  Status = gBS->SetTimer (Nic->TickTimer, TimerPeriodic,
> EFI_TIMER_PERIOD_MILLISECONDS (500));
> -  if (EFI_ERROR (Status)) {
> -    goto ERROR3;
> -  }
> +    WiFiProfileSyncProtocol->WifiProfileSyncGetProfile (Nic-
> >ConnectPendingNetwork, Nic->MacAddress);
> +    if (Nic->ConnectPendingNetwork != NULL) {
> +      Status = WifiMgrConnectToNetwork (Nic, Nic->ConnectPendingNetwork);
> +      if (EFI_ERROR (Status)) {
> +        WiFiProfileSyncProtocol->WifiProfileSyncSetConnectState (Status);
> +      }
> +    } else {
> +      goto ERROR1;
> +    }
> +  } else {
> +    //
> +    // Record the MAC address of the incoming NIC.
> +    //
> +    Status = NetLibGetMacAddress (
> +               ControllerHandle,
> +               (EFI_MAC_ADDRESS *)&Nic->MacAddress,
> +               &AddressSize
> +               );
> +    if (EFI_ERROR (Status)) {
> +      goto ERROR2;
> +    }
> 
> -  Nic->ConnectState = WifiMgrDisconnected;
> -  Nic->ScanState    = WifiMgrScanFinished;
> +    //
> +    // Create and start the timer for the status check
> +    //
> +    Status = gBS->CreateEvent (
> +                    EVT_NOTIFY_SIGNAL | EVT_TIMER,
> +                    TPL_CALLBACK,
> +                    WifiMgrOnTimerTick,
> +                    Nic,
> +                    &Nic->TickTimer
> +                    );
> +    if (EFI_ERROR (Status)) {
> +      goto ERROR2;
> +    }
> 
> -  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
> -  InsertTailList (&mPrivate->NicList, &Nic->Link);
> -  Nic->NicIndex = mPrivate->NicCount++;
> -  if (mPrivate->CurrentNic == NULL) {
> -    mPrivate->CurrentNic = Nic;
> -  }
> +    Status = gBS->SetTimer (Nic->TickTimer, TimerPeriodic,
> EFI_TIMER_PERIOD_MILLISECONDS (500));
> +    if (EFI_ERROR (Status)) {
> +      goto ERROR3;
> +    }
> 
> -  gBS->RestoreTPL (OldTpl);
> +    Nic->ConnectState = WifiMgrDisconnected;
> +    Nic->ScanState    = WifiMgrScanFinished;
> +
> +    OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
> +    InsertTailList (&mPrivate->NicList, &Nic->Link);
> +    Nic->NicIndex = mPrivate->NicCount++;
> +    if (mPrivate->CurrentNic == NULL) {
> +      mPrivate->CurrentNic = Nic;
> +    }
> +
> +    gBS->RestoreTPL (OldTpl);
> +  }
> 
>    Status = gBS->InstallProtocolInterface (
>                    &ControllerHandle,
> @@ -385,10 +418,11 @@ WifiMgrDxeDriverBindingStop (
>    IN EFI_HANDLE                   *ChildHandleBuffer OPTIONAL
>    )
>  {
> -  EFI_STATUS                 Status;
> -  EFI_TPL                    OldTpl;
> -  WIFI_MGR_PRIVATE_PROTOCOL  *WifiMgrIdentifier;
> -  WIFI_MGR_DEVICE_DATA       *Nic;
> +  EFI_STATUS                      Status;
> +  EFI_TPL                         OldTpl;
> +  WIFI_MGR_PRIVATE_PROTOCOL       *WifiMgrIdentifier;
> +  WIFI_MGR_DEVICE_DATA            *Nic;
> +  EFI_WIFI_PROFILE_SYNC_PROTOCOL  *WiFiProfileSyncProtocol;
> 
>    Status = gBS->OpenProtocol (
>                    ControllerHandle,
> @@ -481,7 +515,15 @@ WifiMgrDxeDriverBindingStop (
>    //
>    OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
> 
> -  RemoveEntryList (&Nic->Link);
> +  Status = gBS->LocateProtocol (
> +                  &gEfiWiFiProfileSyncProtocolGuid,
> +                  NULL,
> +                  (VOID **)&WiFiProfileSyncProtocol
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    RemoveEntryList (&Nic->Link);
> +  }
> +
>    mPrivate->NicCount--;
>    if (mPrivate->CurrentNic == Nic) {
>      mPrivate->CurrentNic = NULL;
> diff --git
> a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrDxe.h
> b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrDxe.h
> index 7b2e41e155..047f85dbc2 100644
> --- a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrDxe.h
> +++ b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrDxe.h
> @@ -47,6 +47,7 @@
>  #include <Protocol/SimpleNetwork.h>
>  #include <Protocol/SimpleFileSystem.h>
>  #include <Protocol/EapConfiguration.h>
> +#include <Protocol/WiFiProfileSyncProtocol.h>
> 
>  //
>  // Produced Protocols
> @@ -73,7 +74,8 @@
>  //
>  #define WIFI_MGR_DXE_VERSION  0xb
> 
> -#define OUI_IEEE_80211I  0xAC0F00
> +#define OUI_IEEE_80211I              0xAC0F00
> +#define MAX_WIFI_CONNETION_ATTEMPTS  3
> 
>  typedef enum {
>    Ieee80211PairwiseCipherSuiteUseGroupCipherSuite = 0, diff --git
> a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrImpl.c
> b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrImpl.c
> index 59bac48c42..3a04b4ddb1 100644
> --- a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrImpl.c
> +++ b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrImpl.c
> @@ -19,6 +19,8 @@ EFI_EAP_TYPE  mEapSecondAuthMethod[] = {
>    EFI_EAP_TYPE_MSCHAPV2
>  };
> 
> +UINT8  WifiConnectionCount = 0;
> +
>  /**
>    The callback function for scan operation. This function updates networks
>    according to the latest scan result, and trigger UI refresh.
> @@ -420,22 +422,34 @@ WifiMgrConfigPassword (
>    //
>    // Set password to supplicant
>    //
> +  if (Profile->Password[StrLen (Profile->Password)] != '\0') {
> +    Profile->Password[StrLen (Profile->Password)] = L'\0';  }
> +
>    if (StrLen (Profile->Password) < PASSWORD_MIN_LEN) {
>      return EFI_NOT_FOUND;
>    }
> 
> -  AsciiPassword = AllocateZeroPool ((StrLen (Profile->Password) + 1) * sizeof
> (UINT8));
> +  if (StrLen (Profile->Password) > PASSWORD_STORAGE_SIZE) {
> +    ASSERT (EFI_INVALID_PARAMETER);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  AsciiPassword = AllocateZeroPool ((StrLen (Profile->Password) + 1) *
> + sizeof (CHAR8));
>    if (AsciiPassword == NULL) {
>      return EFI_OUT_OF_RESOURCES;
>    }
> 
> -  UnicodeStrToAsciiStrS (Profile->Password, (CHAR8 *)AsciiPassword,
> PASSWORD_STORAGE_SIZE);
> -  Status = Supplicant->SetData (
> -                         Supplicant,
> -                         EfiSupplicant80211PskPassword,
> -                         AsciiPassword,
> -                         (StrLen (Profile->Password) + 1) * sizeof (UINT8)
> -                         );
> +  Status = UnicodeStrToAsciiStrS (Profile->Password, (CHAR8
> + *)AsciiPassword, ((StrLen (Profile->Password) + 1) * sizeof (CHAR8)));  if
> (!EFI_ERROR (Status)) {
> +    Status = Supplicant->SetData (
> +                           Supplicant,
> +                           EfiSupplicant80211PskPassword,
> +                           AsciiPassword,
> +                           (StrLen (Profile->Password) + 1) * sizeof (CHAR8)
> +                           );
> +  }
> +
>    ZeroMem (AsciiPassword, AsciiStrLen ((CHAR8 *)AsciiPassword) + 1);
>    FreePool (AsciiPassword);
> 
> @@ -466,6 +480,7 @@ WifiMgrConfigEap (
>    )
>  {
>    EFI_STATUS                      Status;
> +  EFI_WIFI_PROFILE_SYNC_PROTOCOL  *WiFiProfileSyncProtocol;
>    EFI_EAP_CONFIGURATION_PROTOCOL  *EapConfig;
>    EFI_EAP_TYPE                    EapAuthMethod;
>    EFI_EAP_TYPE                    EapSecondAuthMethod;
> @@ -567,7 +582,13 @@ WifiMgrConfigEap (
>        return EFI_OUT_OF_RESOURCES;
>      }
> 
> -    UnicodeStrToAsciiStrS (Profile->EapIdentity, Identity, IdentitySize);
> +    Status = gBS->LocateProtocol (&gEfiWiFiProfileSyncProtocolGuid, NULL,
> (VOID **)&WiFiProfileSyncProtocol);
> +    if (!EFI_ERROR (Status)) {
> +      CopyMem (Identity, &Profile->EapIdentity, IdentitySize);
> +    } else {
> +      UnicodeStrToAsciiStrS (Profile->EapIdentity, Identity, IdentitySize);
> +    }
> +
>      Status = EapConfig->SetData (
>                            EapConfig,
>                            EFI_EAP_TYPE_IDENTITY, @@ -892,6 +913,133 @@
> WifiMgrPrepareConnection (
>    return EFI_SUCCESS;
>  }
> 
> +/**
> +  Will reset NiC data, get profile from profile sync driver, and send
> +for
> +  another connection attempt.This function should not be called more
> +than
> +  3 times.
> +
> +  @param[in]  WiFiProfileSyncProtocol  The target network profile to
> connect.
> +
> +  @retval EFI_SUCCESS                  The operation is completed.
> +  @retval other                        Operation failure.
> +
> +**/
> +EFI_STATUS
> +ConnectionRetry (
> +  IN   EFI_WIFI_PROFILE_SYNC_PROTOCOL  *WiFiProfileSyncProtocol
> +  )
> +{
> +  EFI_STATUS                               Status;
> +  WIFI_MGR_DEVICE_DATA                     *Nic;
> +  EFI_WIRELESS_MAC_CONNECTION_II_PROTOCOL  *Wmp;
> +  EFI_SUPPLICANT_PROTOCOL                  *Supplicant;
> +  EFI_EAP_CONFIGURATION_PROTOCOL           *EapConfig;
> +
> +  Nic = NULL;
> +
> +  Status = gBS->LocateProtocol (
> +                  &gEfiWiFi2ProtocolGuid,
> +                  NULL,
> +                  (VOID **)&Wmp
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +
> +  Status = gBS->LocateProtocol (
> +                  &gEfiSupplicantProtocolGuid,
> +                  NULL,
> +                  (VOID **)&Supplicant
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    Supplicant = NULL;
> +  }
> +
> +  Status = gBS->LocateProtocol (
> +                  &gEfiEapConfigurationProtocolGuid,
> +                  NULL,
> +                  (VOID **)&EapConfig
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    EapConfig = NULL;
> +  }
> +
> +  //
> +  // Initialize Nic device data
> +  //
> +  Nic = AllocateZeroPool (sizeof (WIFI_MGR_DEVICE_DATA));  if (Nic ==
> + NULL) {
> +    Status = EFI_OUT_OF_RESOURCES;
> +    return Status;
> +  }
> +
> +  Nic->Signature           = WIFI_MGR_DEVICE_DATA_SIGNATURE;
> +  Nic->Private             = mPrivate;
> +  Nic->Wmp                 = Wmp;
> +  Nic->Supplicant          = Supplicant;
> +  Nic->EapConfig           = EapConfig;
> +  Nic->UserSelectedProfile = NULL;
> +  Nic->OneTimeScanRequest  = FALSE;
> +
> +  if (Nic->Supplicant != NULL) {
> +    Status = WifiMgrGetSupportedSuites (Nic);  }
> +
> +  if (!EFI_ERROR (Status)) {
> +    InitializeListHead (&Nic->ProfileList);
> +
> +    Nic->ConnectPendingNetwork = (WIFI_MGR_NETWORK_PROFILE
> *)AllocateZeroPool (sizeof (WIFI_MGR_NETWORK_PROFILE));
> +    if (Nic->ConnectPendingNetwork == NULL) {
> +      Status = EFI_OUT_OF_RESOURCES;
> +      DEBUG ((DEBUG_ERROR, "[WiFi Connection Manager] Failed to allocate
> memory for ConnectPendingNetwork\n"));
> +      goto ERROR;
> +    }
> +
> +    Status = WiFiProfileSyncProtocol->WifiProfileSyncGetProfile (Nic-
> >ConnectPendingNetwork, Nic->MacAddress);
> +    if (!EFI_ERROR (Status) && (Nic->ConnectPendingNetwork != NULL)) {
> +      Status = WifiMgrConnectToNetwork (Nic, Nic->ConnectPendingNetwork);
> +      if (!EFI_ERROR (Status)) {
> +        return Status;
> +      }
> +    } else {
> +      DEBUG ((DEBUG_ERROR, "[WiFi Connection Manager] Failed to get WiFi
> profile with status %r\n", Status));
> +    }
> +  } else {
> +    DEBUG ((DEBUG_ERROR, "[WiFi Connection Manager] Failed to get
> + Supported suites with status %r\n", Status));  }
> +
> +  if (Nic->ConnectPendingNetwork != NULL) {
> +    if (Nic->ConnectPendingNetwork->Network.AKMSuite != NULL) {
> +      FreePool (Nic->ConnectPendingNetwork->Network.AKMSuite);
> +    }
> +
> +    if (Nic->ConnectPendingNetwork->Network.CipherSuite != NULL) {
> +      FreePool (Nic->ConnectPendingNetwork->Network.CipherSuite);
> +    }
> +
> +    FreePool (Nic->ConnectPendingNetwork);  }
> +
> +ERROR:
> +  if (Nic->Supplicant != NULL) {
> +    if (Nic->SupportedSuites.SupportedAKMSuites != NULL) {
> +      FreePool (Nic->SupportedSuites.SupportedAKMSuites);
> +    }
> +
> +    if (Nic->SupportedSuites.SupportedSwCipherSuites != NULL) {
> +      FreePool (Nic->SupportedSuites.SupportedSwCipherSuites);
> +    }
> +
> +    if (Nic->SupportedSuites.SupportedHwCipherSuites != NULL) {
> +      FreePool (Nic->SupportedSuites.SupportedHwCipherSuites);
> +    }
> +  }
> +
> +  FreePool (Nic);
> +
> +  return Status;
> +}
> +
>  /**
>    The callback function for connect operation.
> 
> @@ -908,12 +1056,13 @@ WifiMgrOnConnectFinished (
>    IN  VOID       *Context
>    )
>  {
> -  EFI_STATUS                 Status;
> -  WIFI_MGR_MAC_CONFIG_TOKEN  *ConfigToken;
> -  WIFI_MGR_NETWORK_PROFILE   *ConnectedProfile;
> -  UINT8                      SecurityType;
> -  UINT8                      SSIdLen;
> -  CHAR8                      *AsciiSSId;
> +  EFI_STATUS                      Status;
> +  WIFI_MGR_MAC_CONFIG_TOKEN       *ConfigToken;
> +  WIFI_MGR_NETWORK_PROFILE        *ConnectedProfile;
> +  UINT8                           SecurityType;
> +  UINT8                           SSIdLen;
> +  CHAR8                           *AsciiSSId;
> +  EFI_WIFI_PROFILE_SYNC_PROTOCOL  *WiFiProfileSyncProtocol;
> 
>    ASSERT (Context != NULL);
> 
> @@ -925,6 +1074,24 @@ WifiMgrOnConnectFinished (
>    ASSERT (ConfigToken->Type == TokenTypeConnectNetworkToken);
> 
>    ASSERT (ConfigToken->Token.ConnectNetworkToken != NULL);
> +
> +  Status = gBS->LocateProtocol (&gEfiWiFiProfileSyncProtocolGuid, NULL,
> + (VOID **)&WiFiProfileSyncProtocol);  if (!EFI_ERROR (Status)) {
> +    WiFiProfileSyncProtocol->WifiProfileSyncSetConnectState (ConfigToken-
> >Token.ConnectNetworkToken->ResultCode);
> +    if ((WifiConnectionCount < MAX_WIFI_CONNETION_ATTEMPTS) &&
> +        (ConfigToken->Token.ConnectNetworkToken->ResultCode !=
> ConnectSuccess))
> +    {
> +      WifiConnectionCount++;
> +      gBS->CloseEvent (Event);
> +      Status = ConnectionRetry (WiFiProfileSyncProtocol);
> +      if (!EFI_ERROR (Status)) {
> +        return;
> +      }
> +
> +      WiFiProfileSyncProtocol->WifiProfileSyncSetConnectState (Status);
> +    }
> +  }
> +
>    if (ConfigToken->Token.ConnectNetworkToken->Status != EFI_SUCCESS) {
>      if (ConfigToken->Nic->OneTimeConnectRequest) {
>        //
> diff --git
> a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrMisc.c
> b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrMisc.c
> index 4ad5643c24..87adfc5033 100644
> --- a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrMisc.c
> +++ b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrMisc.c
> @@ -672,10 +672,23 @@ WifiMgrCleanProfileSecrets (
>    IN  WIFI_MGR_NETWORK_PROFILE  *Profile
>    )
>  {
> +  EFI_STATUS                      Status;
> +  EFI_WIFI_PROFILE_SYNC_PROTOCOL  *WiFiProfileSyncProtocol;
> +
>    ZeroMem (Profile->Password, sizeof (CHAR16) *
> PASSWORD_STORAGE_SIZE);
>    ZeroMem (Profile->EapPassword, sizeof (CHAR16) *
> PASSWORD_STORAGE_SIZE);
>    ZeroMem (Profile->PrivateKeyPassword, sizeof (CHAR16) *
> PASSWORD_STORAGE_SIZE);
> 
> +  //
> +  //  When EFI WiFi profile sync protocol is found the system is
> + performing a recovery boot in secure  //  boot mode. The profile sync
> + driver will manage the CA certificate, client certificate, and key  //  data,
> cleaning them at exit boot services.
> +  //
> +  Status = gBS->LocateProtocol (&gEfiWiFiProfileSyncProtocolGuid, NULL,
> + (VOID **)&WiFiProfileSyncProtocol);  if (!EFI_ERROR (Status)) {
> +    return;
> +  }
> +
>    if (Profile->CACertData != NULL) {
>      ZeroMem (Profile->CACertData, Profile->CACertSize);
>      FreePool (Profile->CACertData);
> --
> 2.26.2.windows.1
> 
> 
> 
> 
> 



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#94317): https://edk2.groups.io/g/devel/message/94317
Mute This Topic: https://groups.io/mt/93685737/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-




More information about the edk2-devel-archive mailing list