From: "Michael D Kinney" <michael.d.kinney@intel.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
"Wu, Jiaxin" <jiaxin.wu@intel.com>,
"Clark-williams, Zachary" <zachary.clark-williams@intel.com>,
"Kinney, Michael D" <michael.d.kinney@intel.com>
Cc: Zachary Clark-Williams <zclarkw112@gmail.com>,
Maciej Rabeda <maciej.rabeda@linux.intel.com>,
"Otcheretianski, Andrei" <andrei.otcheretianski@intel.com>,
"Kinney, Michael D" <michael.d.kinney@intel.com>
Subject: Re: [edk2-devel] [PATCH] NetworkPkg: Add WiFi profile sync protocol support
Date: Tue, 10 Jan 2023 05:27:09 +0000 [thread overview]
Message-ID: <CO1PR11MB49290FF25FEF8F0EB95AB236D2FF9@CO1PR11MB4929.namprd11.prod.outlook.com> (raw)
In-Reply-To: <MN0PR11MB6158F1159B60EA08DD69CF4FFEFF9@MN0PR11MB6158.namprd11.prod.outlook.com>
Acked-by: Michael D Kinney <michael.d.kinney@intel.com>
Mike
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Wu, Jiaxin
> Sent: Monday, January 9, 2023 7:03 PM
> To: Clark-williams, Zachary <zachary.clark-williams@intel.com>; devel@edk2.groups.io
> Cc: Zachary Clark-Williams <zclarkw112@gmail.com>; Maciej Rabeda <maciej.rabeda@linux.intel.com>; Otcheretianski, Andrei
> <andrei.otcheretianski@intel.com>
> Subject: Re: [edk2-devel] [PATCH] NetworkPkg: Add WiFi profile sync protocol support
>
> One comment as below, Others good to me.
>
> Reviewed-by: Wu Jiaxin <jiaxin.wu@intel.com>
>
>
> > + @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
> > + );
>
> Does it make sense remove the OUT declaring since this is just to get the corresponding MacAddress Profile? For OUT, we expect
> there will be changed when return but here it's not.
>
> Thanks,
> Jiaxin
>
> > -----Original Message-----
> > From: Clark-williams, Zachary <zachary.clark-williams@intel.com>
> > Sent: Saturday, January 7, 2023 9:31 AM
> > To: devel@edk2.groups.io
> > Cc: Zachary Clark-Williams <zclarkw112@gmail.com>; Maciej Rabeda
> > <maciej.rabeda@linux.intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>;
> > Otcheretianski, Andrei <andrei.otcheretianski@intel.com>; Clark-williams,
> > Zachary <zachary.clark-williams@intel.com>
> > Subject: [PATCH] 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.
> >
> > Cc: Maciej Rabeda <maciej.rabeda@linux.intel.com>
> > Cc: Wu Jiaxin <jiaxin.wu@intel.com>
> > Cc: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
> >
> > Signed-off-by: Zachary Clark-Williams <zachary.clark-williams@intel.com>
> > ---
> > .../Protocol/WiFiProfileSyncProtocol.h | 90 +++++++
> > NetworkPkg/NetworkPkg.dec | 3 +
> > .../WifiConnectionManagerDxe.inf | 3 +-
> > .../WifiConnectionMgrConfigNVDataStruct.h | 2 +-
> > .../WifiConnectionMgrDriver.c | 125 ++++++----
> > .../WifiConnectionMgrDxe.h | 4 +-
> > .../WifiConnectionMgrImpl.c | 219 +++++++++++++++---
> > .../WifiConnectionMgrMisc.c | 13 ++
> > 8 files changed, 386 insertions(+), 73 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..90523e30fa
> > --- /dev/null
> > +++ b/NetworkPkg/Include/Protocol/WiFiProfileSyncProtocol.h
> > @@ -0,0 +1,90 @@
> > +/** @file
> > + WiFi profile sync protocol. Supports One Click Recovery or KVM OS
> > recovery
> > + boot flow over WiFi. This protocol will hold the WiFi profile provided by
> > AMT
> > + in its original structure, then convert the profile when the
> > WifiConnectionManager
> > + is attempting a connection during a system recovery reboot, OCR or KVM.
> > These
> > + converstion and operations are found in the WifiProfileSync driver and in
> > + the link provided below.
> > +
> > + Pulbic links to speficiation document for KVM and One Click Recovery
> > feature.
> > +
> > https://software.intel.com/sites/manageability/AMT_Implementation_and_
> > Reference_Guide/default.htm?turl=WordDocuments%2Foneclickrecovery.h
> > tm
> > +
> > + 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 SetConnectState;
> > + WIFI_GET_CONNECT_STATE GetConnectState;
> > + WIFI_PROFILE_GET GetProfile;
> > +} EDKII_WIFI_PROFILE_SYNC_PROTOCOL;
> > +
> > +/**
> > + WiFi Profile Protocol revision number.
> > +
> > + Revision 1: Initial version
> > +**/
> > +#define EDKII_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/WifiConnectionMgrConfigNVDa
> > taStruct.h
> > b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrConfigNVDa
> > taStruct.h
> > index b5518a74d8..dcc4bf7e27 100644
> > ---
> > a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrConfigNVDa
> > taStruct.h
> > +++
> > b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrConfigNVDa
> > taStruct.h
> > @@ -25,7 +25,7 @@
> >
> > #define PASSWORD_MIN_LEN 8
> > #define PASSWORD_MAX_LEN 63
> > -#define PASSWORD_STORAGE_SIZE 64
> > +#define PASSWORD_STORAGE_SIZE 65
> >
> > #define EAP_IDENTITY_LEN 63
> > #define EAP_IDENTITY_SIZE 64
> > diff --git
> > a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrDriver.c
> > b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrDriver.c
> > index 67a01ca058..0af55db599 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 mWifiConnectionCount;
> > +
> > /**
> > 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;
> > + EDKII_WIFI_PROFILE_SYNC_PROTOCOL *WiFiProfileSyncProtocol;
> >
> > - Nic = NULL;
> > + mWifiConnectionCount = 0;
> > + Nic = NULL;
> >
> > //
> > // Open Protocols
> > @@ -236,47 +243,72 @@ 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->GetProfile (Nic->ConnectPendingNetwork, Nic-
> > >MacAddress);
> > + if (Nic->ConnectPendingNetwork != NULL) {
> > + Status = WifiMgrConnectToNetwork (Nic, Nic-
> > >ConnectPendingNetwork);
> > + if (!EFI_ERROR (Status)) {
> > + goto ERROR1;
> > + }
> > + WiFiProfileSyncProtocol->SetConnectState (Status);
> > + }
> > + } 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 +417,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;
> > + EDKII_WIFI_PROFILE_SYNC_PROTOCOL *WiFiProfileSyncProtocol;
> >
> > Status = gBS->OpenProtocol (
> > ControllerHandle,
> > @@ -481,7 +514,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..7d471e7591 100644
> > --- a/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrImpl.c
> > +++ b/NetworkPkg/WifiConnectionManagerDxe/WifiConnectionMgrImpl.c
> > @@ -19,6 +19,8 @@ EFI_EAP_TYPE mEapSecondAuthMethod[] = {
> > EFI_EAP_TYPE_MSCHAPV2
> > };
> >
> > +UINT8 mWifiConnectionCount = 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));
> > + if (!EFI_ERROR (Status)) {
> > + Status = Supplicant->SetData (
> > + Supplicant,
> > + EfiSupplicant80211PskPassword,
> > + AsciiPassword,
> > + (StrLen (Profile->Password) + 1) * sizeof (CHAR8)
> > + );
> > + }
> > +
> > ZeroMem (AsciiPassword, AsciiStrLen ((CHAR8 *)AsciiPassword) + 1);
> > FreePool (AsciiPassword);
> >
> > @@ -465,19 +475,20 @@ WifiMgrConfigEap (
> > IN WIFI_MGR_NETWORK_PROFILE *Profile
> > )
> > {
> > - EFI_STATUS Status;
> > - EFI_EAP_CONFIGURATION_PROTOCOL *EapConfig;
> > - EFI_EAP_TYPE EapAuthMethod;
> > - EFI_EAP_TYPE EapSecondAuthMethod;
> > - EFI_EAP_TYPE *AuthMethodList;
> > - CHAR8 *Identity;
> > - UINTN IdentitySize;
> > - CHAR16 *Password;
> > - UINTN PasswordSize;
> > - UINTN EncryptPasswordLen;
> > - CHAR8 *AsciiEncryptPassword;
> > - UINTN AuthMethodListSize;
> > - UINTN Index;
> > + EFI_STATUS Status;
> > + EDKII_WIFI_PROFILE_SYNC_PROTOCOL *WiFiProfileSyncProtocol;
> > + EFI_EAP_CONFIGURATION_PROTOCOL *EapConfig;
> > + EFI_EAP_TYPE EapAuthMethod;
> > + EFI_EAP_TYPE EapSecondAuthMethod;
> > + EFI_EAP_TYPE *AuthMethodList;
> > + CHAR8 *Identity;
> > + UINTN IdentitySize;
> > + CHAR16 *Password;
> > + UINTN PasswordSize;
> > + UINTN EncryptPasswordLen;
> > + CHAR8 *AsciiEncryptPassword;
> > + UINTN AuthMethodListSize;
> > + UINTN Index;
> >
> > if ((Nic == NULL) || (Nic->EapConfig == NULL) || (Profile == NULL)) {
> > return EFI_INVALID_PARAMETER;
> > @@ -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 EDKII_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->GetProfile (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;
> > + EDKII_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->SetConnectState (ConfigToken-
> > >Token.ConnectNetworkToken->ResultCode);
> > + if ((mWifiConnectionCount < MAX_WIFI_CONNETION_ATTEMPTS) &&
> > + (ConfigToken->Token.ConnectNetworkToken->ResultCode !=
> > ConnectSuccess))
> > + {
> > + mWifiConnectionCount++;
> > + gBS->CloseEvent (Event);
> > + Status = ConnectionRetry (WiFiProfileSyncProtocol);
> > + if (!EFI_ERROR (Status)) {
> > + return;
> > + }
> > +
> > + WiFiProfileSyncProtocol->SetConnectState (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..518572922f 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;
> > + EDKII_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:[~2023-01-10 5:27 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-07 1:31 [PATCH] NetworkPkg: Add WiFi profile sync protocol support Clark-williams, Zachary
2023-01-09 17:43 ` Clark-williams, Zachary
2023-01-10 3:02 ` Wu, Jiaxin
2023-01-10 5:27 ` Michael D Kinney [this message]
-- strict thread matches above, loose matches on Subject: below --
2022-09-14 19:42 Clark-williams, Zachary
2022-09-26 7:37 ` [edk2-devel] " Heng Luo
2022-09-26 15:39 ` Clark-williams, Zachary
2022-09-26 16:27 ` Michael Brown
2022-09-26 17:39 ` 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=CO1PR11MB49290FF25FEF8F0EB95AB236D2FF9@CO1PR11MB4929.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