public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Heng Luo" <heng.luo@intel.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
	"Clark-williams, Zachary" <zachary.clark-williams@intel.com>
Cc: Zachary Clark-Williams <zclarkw112@gmail.com>
Subject: Re: [edk2-devel] [PATCH V2 2/2] NetworkPkg: Add WiFi profile sync protocol support
Date: Tue, 27 Sep 2022 07:30:58 +0000	[thread overview]
Message-ID: <SN6PR11MB275219DE9EB4E57A02EC173993559@SN6PR11MB2752.namprd11.prod.outlook.com> (raw)
In-Reply-To: <ecb1926136307b52a80ba3b8aab71276e4a2ac8a.1664216197.git.zachary.clark-williams@intel.com>

Hi Zack,

1.
> +  Status = UnicodeStrToAsciiStrS (Profile->Password, (CHAR8
> + *)AsciiPassword, ((StrLen (Profile->Password) + 1) * sizeof (CHAR8)));  

I think we should remove '* sizeof (CHAR8)' because the third parameter is the length of string but not size of the memory:
	Status = UnicodeStrToAsciiStrS (Profile->Password, (CHAR8 *)AsciiPassword, ((StrLen (Profile->Password) + 1)));  

2. 
> +  if (StrLen (Profile->Password) > PASSWORD_STORAGE_SIZE) {
> +    ASSERT (EFI_INVALID_PARAMETER);
> +    return EFI_INVALID_PARAMETER;
> +  }

Need null terminator at end of password, so I think the conditional should be:
	if (StrLen (Profile->Password) >= PASSWORD_STORAGE_SIZE)
in order to support 32 bytes PSK passwords with null terminator. Maybe need to change PASSWORD_STORAGE_SIZE  to 65? But PASSWORD_MAX_LEN should still be 63, because according to the 802.11i specification:
A pass-phrase is a sequence of between 8 and 63 ASCII-encoded characters. The limit of 63 comes from the desire to distinguish between a pass-phrase and a PSK displayed as 64 hexadecimal characters.

3. 
Suggest to add maintainers in Cc of the commit msg to speed up review.
Fox example:
  WifiProfileSyncProtocol and if found will operate on the premise of a One
  Click Recovery, or KVM flow with a Wifi profile provided by AMT.
 
  Cc: Maciej Rabeda <maciej.rabeda@linux.intel.com>
  Cc: Fu Siyuan <siyuan.fu@intel.com>
  Cc: Wu Jiaxin <jiaxin.wu@intel.com>
 Signed-off-by: Zachary Clark-Williams <zachary.clark-williams@intel.com>


Thanks,
Heng

> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Clark-
> williams, Zachary
> Sent: Tuesday, September 27, 2022 2:20 AM
> To: devel@edk2.groups.io
> Cc: Zachary Clark-Williams <zclarkw112@gmail.com>; Clark-williams, Zachary
> <zachary.clark-williams@intel.com>
> Subject: [edk2-devel] [PATCH V2 2/2] NetworkPkg: Add WiFi profile sync
> protocol support
> 
> From: Zachary Clark-Williams <zclarkw112@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@intel.com>
> ---
>  .../Protocol/WiFiProfileSyncProtocol.h        |  83 ++++++++
>  NetworkPkg/NetworkPkg.dec                     |   3 +
>  .../WifiConnectionManagerDxe.inf              |   3 +-
>  .../WifiConnectionMgrDriver.c                 | 126 ++++++++----
>  .../WifiConnectionMgrDxe.h                    |   4 +-
>  .../WifiConnectionMgrImpl.c                   | 193 ++++++++++++++++--
>  .../WifiConnectionMgrMisc.c                   |  13 ++
>  7 files changed, 366 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..936fe3e721 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.
> @@ -424,18 +426,26 @@ WifiMgrConfigPassword (
>      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 +476,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 +578,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 +909,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 +1052,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 +1070,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.37.3.windows.1
> 
> 
> 
> 
> 


  reply	other threads:[~2022-09-27  7:31 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <8fdb4de628120a8736ee47522d1941e3ad3bdf8a.1664216197.git.zachary.clark-williams@intel.com>
2022-09-26 18:20 ` [PATCH V2 2/2] NetworkPkg: Add WiFi profile sync protocol support Clark-williams, Zachary
2022-09-27  7:30   ` Heng Luo [this message]
2022-09-28 17:07     ` [edk2-devel] " Clark-williams, Zachary

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=SN6PR11MB275219DE9EB4E57A02EC173993559@SN6PR11MB2752.namprd11.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox