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
>
>
>
>
>
next prev parent 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