123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076 |
- /** @file
- The Hii functions for WiFi Connection Manager.
- Copyright (c) 2019 - 2022, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include "WifiConnectionMgrDxe.h"
- CHAR16 mVendorStorageName[] = L"WIFI_MANAGER_IFR_NVDATA";
- HII_VENDOR_DEVICE_PATH mWifiMgrDxeHiiVendorDevicePath = {
- {
- {
- HARDWARE_DEVICE_PATH,
- HW_VENDOR_DP,
- {
- (UINT8)(sizeof (VENDOR_DEVICE_PATH)),
- (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
- }
- },
- WIFI_CONNECTION_MANAGER_CONFIG_GUID
- },
- {
- END_DEVICE_PATH_TYPE,
- END_ENTIRE_DEVICE_PATH_SUBTYPE,
- {
- (UINT8)(END_DEVICE_PATH_LENGTH),
- (UINT8)((END_DEVICE_PATH_LENGTH) >> 8)
- }
- }
- };
- //
- // HII Config Access Protocol instance
- //
- GLOBAL_REMOVE_IF_UNREFERENCED
- EFI_HII_CONFIG_ACCESS_PROTOCOL gWifiMgrDxeHiiConfigAccess = {
- WifiMgrDxeHiiConfigAccessExtractConfig,
- WifiMgrDxeHiiConfigAccessRouteConfig,
- WifiMgrDxeHiiConfigAccessCallback
- };
- CHAR16 *mSecurityType[] = {
- L"OPEN ",
- L"WPA-Enterprise ",
- L"WPA2-Enterprise",
- L"WPA-Personal ",
- L"WPA2-Personal ",
- L"WEP ",
- L"WPA3-Personal ",
- L"WPA3-Enterprise",
- L"UnKnown "
- };
- CHAR16 *mSignalStrengthBar[] = {
- L"[-----]",
- L"[*----]",
- L"[**---]",
- L"[***--]",
- L"[****-]",
- L"[*****]"
- };
- #define RSSI_TO_SIGNAL_STRENGTH_BAR(Rssi) mSignalStrengthBar[((Rssi + 19)/20)]
- #define NET_LIST_FOR_EACH_FROM_NODE(Entry, Node, ListHead) \
- for(Entry = Node->ForwardLink; Entry != (ListHead); Entry = Entry->ForwardLink)
- extern EFI_GUID gWifiConfigFormSetGuid;
- /**
- Create Hii Extend Label OpCode as the start opcode and end opcode.
- The caller is responsible for freeing the OpCode with HiiFreeOpCodeHandle().
- @param[in] StartLabelNumber The number of start label.
- @param[out] StartOpCodeHandle Points to the start opcode handle.
- @param[out] EndOpCodeHandle Points to the end opcode handle.
- @retval EFI_OUT_OF_RESOURCES Do not have sufficient resource to finish this
- operation.
- @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
- @retval EFI_SUCCESS The operation is completed successfully.
- @retval Other Errors Returned errors when updating the HII form.
- **/
- EFI_STATUS
- WifiMgrCreateOpCode (
- IN UINT16 StartLabelNumber,
- OUT VOID **StartOpCodeHandle,
- OUT VOID **EndOpCodeHandle
- )
- {
- EFI_STATUS Status;
- EFI_IFR_GUID_LABEL *InternalStartLabel;
- EFI_IFR_GUID_LABEL *InternalEndLabel;
- if ((StartOpCodeHandle == NULL) || (EndOpCodeHandle == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
- Status = EFI_OUT_OF_RESOURCES;
- *StartOpCodeHandle = NULL;
- *EndOpCodeHandle = NULL;
- //
- // Initialize the container for dynamic opcodes.
- //
- *StartOpCodeHandle = HiiAllocateOpCodeHandle ();
- if (*StartOpCodeHandle == NULL) {
- goto Exit;
- }
- *EndOpCodeHandle = HiiAllocateOpCodeHandle ();
- if (*EndOpCodeHandle == NULL) {
- goto Exit;
- }
- //
- // Create Hii Extend Label OpCode as the start opcode.
- //
- InternalStartLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (
- *StartOpCodeHandle,
- &gEfiIfrTianoGuid,
- NULL,
- sizeof (EFI_IFR_GUID_LABEL)
- );
- if (InternalStartLabel == NULL) {
- goto Exit;
- }
- InternalStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
- InternalStartLabel->Number = StartLabelNumber;
- //
- // Create Hii Extend Label OpCode as the end opcode.
- //
- InternalEndLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (
- *EndOpCodeHandle,
- &gEfiIfrTianoGuid,
- NULL,
- sizeof (EFI_IFR_GUID_LABEL)
- );
- if (InternalEndLabel == NULL) {
- goto Exit;
- }
- InternalEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
- InternalEndLabel->Number = LABEL_END;
- return EFI_SUCCESS;
- Exit:
- if (*StartOpCodeHandle != NULL) {
- HiiFreeOpCodeHandle (*StartOpCodeHandle);
- }
- if (*EndOpCodeHandle != NULL) {
- HiiFreeOpCodeHandle (*EndOpCodeHandle);
- }
- return Status;
- }
- /**
- Display the Nic list contains all available Nics.
- @param[in] Private The pointer to the global private data structure.
- @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
- @retval EFI_SUCCESS The operation is completed successfully.
- **/
- EFI_STATUS
- WifiMgrShowNicList (
- IN WIFI_MGR_PRIVATE_DATA *Private
- )
- {
- EFI_STATUS Status;
- CHAR16 MacString[WIFI_MGR_MAX_MAC_STRING_LEN];
- CHAR16 PortString[WIFI_STR_MAX_SIZE];
- EFI_STRING_ID PortTitleToken;
- EFI_STRING_ID PortTitleHelpToken;
- WIFI_MGR_DEVICE_DATA *Nic;
- LIST_ENTRY *Entry;
- VOID *StartOpCodeHandle;
- VOID *EndOpCodeHandle;
- if (Private == NULL) {
- return EFI_INVALID_PARAMETER;
- }
- Status = WifiMgrCreateOpCode (
- LABEL_MAC_ENTRY,
- &StartOpCodeHandle,
- &EndOpCodeHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- NET_LIST_FOR_EACH (Entry, &Private->NicList) {
- Nic = NET_LIST_USER_STRUCT_S (Entry, WIFI_MGR_DEVICE_DATA, Link, WIFI_MGR_DEVICE_DATA_SIGNATURE);
- WifiMgrMacAddrToStr (&Nic->MacAddress, sizeof (MacString), MacString);
- UnicodeSPrint (PortString, sizeof (PortString), L"MAC %s", MacString);
- PortTitleToken = HiiSetString (
- Private->RegisteredHandle,
- 0,
- PortString,
- NULL
- );
- if (PortTitleToken == 0) {
- Status = EFI_INVALID_PARAMETER;
- goto Exit;
- }
- UnicodeSPrint (PortString, sizeof (PortString), L"MAC Address");
- PortTitleHelpToken = HiiSetString (
- Private->RegisteredHandle,
- 0,
- PortString,
- NULL
- );
- if (PortTitleHelpToken == 0) {
- Status = EFI_INVALID_PARAMETER;
- goto Exit;
- }
- HiiCreateGotoOpCode (
- StartOpCodeHandle,
- FORMID_WIFI_MAINPAGE,
- PortTitleToken,
- PortTitleHelpToken,
- EFI_IFR_FLAG_CALLBACK,
- (UINT16)(KEY_MAC_ENTRY_BASE + Nic->NicIndex)
- );
- }
- Status = HiiUpdateForm (
- Private->RegisteredHandle, // HII handle
- &gWifiConfigFormSetGuid, // Formset GUID
- FORMID_MAC_SELECTION, // Form ID
- StartOpCodeHandle, // Label for where to insert opcodes
- EndOpCodeHandle // Replace data
- );
- Exit:
- HiiFreeOpCodeHandle (StartOpCodeHandle);
- HiiFreeOpCodeHandle (EndOpCodeHandle);
- return Status;
- }
- /**
- Retreive the unicode string of the AKM Suite list of a profile.
- The caller is responsible for freeing the string with FreePool().
- @param[in] Profile The network profile contains a AKM suite list.
- @return the unicode string of AKM suite list or "None".
- **/
- CHAR16 *
- WifiMgrGetStrAKMList (
- IN WIFI_MGR_NETWORK_PROFILE *Profile
- )
- {
- UINT8 Index;
- UINT16 AKMSuiteCount;
- CHAR16 *AKMListDisplay;
- UINTN Length;
- AKMListDisplay = NULL;
- if ((Profile == NULL) || (Profile->Network.AKMSuite == NULL)) {
- goto Exit;
- }
- AKMSuiteCount = Profile->Network.AKMSuite->AKMSuiteCount;
- if (AKMSuiteCount != 0) {
- //
- // Current AKM Suite is between 1-18
- //
- AKMListDisplay = (CHAR16 *)AllocateZeroPool (sizeof (CHAR16) * (AKMSuiteCount * 3 + 1));
- Length = 0;
- if (AKMListDisplay != NULL) {
- for (Index = 0; Index < AKMSuiteCount; Index++) {
- //
- // The size of buffer should be 4 CHAR16 for Null-terminated Unicode string.
- //
- UnicodeSPrint (
- AKMListDisplay + Length,
- sizeof (CHAR16) * 4,
- L"%d ",
- Profile->Network.AKMSuite->AKMSuiteList[Index].SuiteType
- );
- Length = StrLen (AKMListDisplay + Length) + Length;
- if (Index == AKMSuiteCount - 1) {
- *(AKMListDisplay + (Length - 1)) = L'\0';
- }
- }
- }
- }
- Exit:
- if (AKMListDisplay == NULL) {
- AKMListDisplay = AllocateCopyPool (sizeof (L"None"), L"None");
- }
- return AKMListDisplay;
- }
- /**
- Retreive the unicode string of the Cipher Suite list of a profile.
- The caller is responsible for freeing the string with FreePool().
- @param[in] Profile The network profile contains a Cipher suite list.
- @return the unicode string of Cipher suite list or "None".
- **/
- CHAR16 *
- WifiMgrGetStrCipherList (
- IN WIFI_MGR_NETWORK_PROFILE *Profile
- )
- {
- UINT8 Index;
- UINT16 CipherSuiteCount;
- CHAR16 *CipherListDisplay;
- CipherListDisplay = NULL;
- if ((Profile == NULL) || (Profile->Network.CipherSuite == NULL)) {
- goto Exit;
- }
- CipherSuiteCount = Profile->Network.CipherSuite->CipherSuiteCount;
- if (CipherSuiteCount != 0) {
- //
- // Current Cipher Suite is between 1-9
- //
- CipherListDisplay = (CHAR16 *)AllocateZeroPool (sizeof (CHAR16) * (CipherSuiteCount * 2 + 1));
- if (CipherListDisplay != NULL) {
- for (Index = 0; Index < CipherSuiteCount; Index++) {
- //
- // The size of buffer should be 3 CHAR16 for Null-terminated Unicode string.
- // The first char is the Cipher Suite number, the second char is ' ', the third char is '\0'.
- //
- UnicodeSPrint (
- CipherListDisplay + (Index * 2),
- sizeof (CHAR16) * 3,
- L"%d ",
- Profile->Network.CipherSuite->CipherSuiteList[Index].SuiteType
- );
- if (Index == CipherSuiteCount - 1) {
- *(CipherListDisplay + (Index * 2 + 1)) = L'\0';
- }
- }
- }
- }
- Exit:
- if (CipherListDisplay == NULL) {
- CipherListDisplay = AllocateCopyPool (sizeof (L"None"), L"None");
- }
- return CipherListDisplay;
- }
- /**
- Refresh the network list display of the current Nic.
- @param[in] Private The pointer to the global private data structure.
- @param[out] IfrNvData The IFR NV data.
- @retval EFI_SUCCESS The operation is completed successfully.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval Other Errors Returned errors when creating Opcodes or updating the
- Hii form.
- **/
- EFI_STATUS
- WifiMgrRefreshNetworkList (
- IN WIFI_MGR_PRIVATE_DATA *Private,
- OUT WIFI_MANAGER_IFR_NVDATA *IfrNvData
- )
- {
- EFI_STATUS Status;
- EFI_TPL OldTpl;
- UINT32 AvailableCount;
- EFI_STRING_ID PortPromptToken;
- EFI_STRING_ID PortTextToken;
- EFI_STRING_ID PortHelpToken;
- WIFI_MGR_NETWORK_PROFILE *Profile;
- LIST_ENTRY *Entry;
- VOID *StartOpCodeHandle;
- VOID *EndOpCodeHandle;
- CHAR16 *AKMListDisplay;
- CHAR16 *CipherListDisplay;
- CHAR16 PortString[WIFI_STR_MAX_SIZE];
- UINTN PortStringSize;
- WIFI_MGR_NETWORK_PROFILE *ConnectedProfile;
- if (Private->CurrentNic == NULL) {
- return EFI_SUCCESS;
- }
- Status = WifiMgrCreateOpCode (
- LABEL_NETWORK_LIST_ENTRY,
- &StartOpCodeHandle,
- &EndOpCodeHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
- AvailableCount = 0;
- PortStringSize = sizeof (PortString);
- ConnectedProfile = NULL;
- AKMListDisplay = NULL;
- CipherListDisplay = NULL;
- if (Private->CurrentNic->ConnectState == WifiMgrConnectedToAp) {
- //
- // Display the current connected network.
- // Find the current operate network under connected status.
- //
- if ((Private->CurrentNic->CurrentOperateNetwork != NULL) &&
- Private->CurrentNic->CurrentOperateNetwork->IsAvailable)
- {
- Profile = Private->CurrentNic->CurrentOperateNetwork;
- AvailableCount++;
- AKMListDisplay = WifiMgrGetStrAKMList (Profile);
- if (AKMListDisplay == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Exit;
- }
- CipherListDisplay = WifiMgrGetStrCipherList (Profile);
- if (CipherListDisplay == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Exit;
- }
- UnicodeSPrint (PortString, PortStringSize, L"%s (Connected)", Profile->SSId);
- PortPromptToken = HiiSetString (Private->RegisteredHandle, 0, PortString, NULL);
- if (Profile->SecurityType == SECURITY_TYPE_NONE) {
- PortHelpToken = 0;
- } else {
- UnicodeSPrint (PortString, PortStringSize, L"AKMSuite: %s CipherSuite: %s", AKMListDisplay, CipherListDisplay);
- PortHelpToken = HiiSetString (Private->RegisteredHandle, 0, PortString, NULL);
- }
- FreePool (AKMListDisplay);
- FreePool (CipherListDisplay);
- AKMListDisplay = NULL;
- CipherListDisplay = NULL;
- HiiCreateGotoOpCode (
- StartOpCodeHandle,
- FORMID_CONNECT_NETWORK,
- PortPromptToken,
- PortHelpToken,
- EFI_IFR_FLAG_CALLBACK,
- (UINT16)(KEY_AVAILABLE_NETWORK_ENTRY_BASE + Profile->ProfileIndex)
- );
- UnicodeSPrint (
- PortString,
- PortStringSize,
- L"%s %s %s",
- (Profile->SecurityType != SECURITY_TYPE_NONE ? L"Secured" : L"Open "),
- mSecurityType[Profile->SecurityType],
- RSSI_TO_SIGNAL_STRENGTH_BAR (Profile->NetworkQuality)
- );
- PortTextToken = HiiSetString (Private->RegisteredHandle, 0, PortString, NULL);
- HiiCreateTextOpCode (
- StartOpCodeHandle,
- PortTextToken,
- 0,
- 0
- );
- ConnectedProfile = Profile;
- } else {
- Private->CurrentNic->HasDisconnectPendingNetwork = TRUE;
- }
- }
- //
- // Display all supported available networks.
- //
- NET_LIST_FOR_EACH (Entry, &Private->CurrentNic->ProfileList) {
- Profile = NET_LIST_USER_STRUCT_S (
- Entry,
- WIFI_MGR_NETWORK_PROFILE,
- Link,
- WIFI_MGR_PROFILE_SIGNATURE
- );
- if (ConnectedProfile == Profile) {
- continue;
- }
- if (Profile->IsAvailable && Profile->CipherSuiteSupported) {
- AvailableCount++;
- AKMListDisplay = WifiMgrGetStrAKMList (Profile);
- if (AKMListDisplay == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Exit;
- }
- CipherListDisplay = WifiMgrGetStrCipherList (Profile);
- if (CipherListDisplay == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Exit;
- }
- PortPromptToken = HiiSetString (Private->RegisteredHandle, 0, Profile->SSId, NULL);
- if (PortPromptToken == 0) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Exit;
- }
- if (Profile->SecurityType == SECURITY_TYPE_NONE) {
- PortHelpToken = 0;
- } else {
- UnicodeSPrint (
- PortString,
- PortStringSize,
- L"AKMSuite: %s CipherSuite: %s",
- AKMListDisplay,
- CipherListDisplay
- );
- PortHelpToken = HiiSetString (Private->RegisteredHandle, 0, PortString, NULL);
- if (PortHelpToken == 0) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Exit;
- }
- }
- FreePool (AKMListDisplay);
- FreePool (CipherListDisplay);
- AKMListDisplay = NULL;
- CipherListDisplay = NULL;
- HiiCreateGotoOpCode (
- StartOpCodeHandle,
- FORMID_CONNECT_NETWORK,
- PortPromptToken,
- PortHelpToken,
- EFI_IFR_FLAG_CALLBACK,
- (UINT16)(KEY_AVAILABLE_NETWORK_ENTRY_BASE + Profile->ProfileIndex)
- );
- UnicodeSPrint (
- PortString,
- PortStringSize,
- L"%s %s %s",
- (Profile->SecurityType != SECURITY_TYPE_NONE ? L"Secured" : L"Open "),
- mSecurityType[Profile->SecurityType],
- RSSI_TO_SIGNAL_STRENGTH_BAR (Profile->NetworkQuality)
- );
- PortTextToken = HiiSetString (Private->RegisteredHandle, 0, PortString, NULL);
- if (PortTextToken == 0) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Exit;
- }
- HiiCreateTextOpCode (
- StartOpCodeHandle,
- PortTextToken,
- 0,
- 0
- );
- }
- }
- //
- // Display all Unsupported available networks.
- //
- NET_LIST_FOR_EACH (Entry, &Private->CurrentNic->ProfileList) {
- Profile = NET_LIST_USER_STRUCT_S (
- Entry,
- WIFI_MGR_NETWORK_PROFILE,
- Link,
- WIFI_MGR_PROFILE_SIGNATURE
- );
- if (ConnectedProfile == Profile) {
- continue;
- }
- if (Profile->IsAvailable && !Profile->CipherSuiteSupported) {
- AvailableCount++;
- AKMListDisplay = WifiMgrGetStrAKMList (Profile);
- if (AKMListDisplay == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Exit;
- }
- CipherListDisplay = WifiMgrGetStrCipherList (Profile);
- if (CipherListDisplay == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Exit;
- }
- PortPromptToken = HiiSetString (Private->RegisteredHandle, 0, Profile->SSId, NULL);
- if (Profile->AKMSuiteSupported) {
- UnicodeSPrint (
- PortString,
- PortStringSize,
- L"AKMSuite: %s CipherSuite(UnSupported): %s",
- AKMListDisplay,
- CipherListDisplay
- );
- } else {
- UnicodeSPrint (
- PortString,
- PortStringSize,
- L"AKMSuite(UnSupported): %s CipherSuite(UnSupported): %s",
- AKMListDisplay,
- CipherListDisplay
- );
- }
- FreePool (AKMListDisplay);
- FreePool (CipherListDisplay);
- AKMListDisplay = NULL;
- CipherListDisplay = NULL;
- PortHelpToken = HiiSetString (Private->RegisteredHandle, 0, PortString, NULL);
- HiiCreateGotoOpCode (
- StartOpCodeHandle,
- FORMID_CONNECT_NETWORK,
- PortPromptToken,
- PortHelpToken,
- EFI_IFR_FLAG_CALLBACK,
- (UINT16)(KEY_AVAILABLE_NETWORK_ENTRY_BASE + Profile->ProfileIndex)
- );
- UnicodeSPrint (
- PortString,
- PortStringSize,
- L"%s %s %s",
- L"UnSupported",
- mSecurityType[Profile->SecurityType],
- RSSI_TO_SIGNAL_STRENGTH_BAR (Profile->NetworkQuality)
- );
- PortTextToken = HiiSetString (Private->RegisteredHandle, 0, PortString, NULL);
- HiiCreateTextOpCode (
- StartOpCodeHandle,
- PortTextToken,
- 0,
- 0
- );
- }
- }
- Status = HiiUpdateForm (
- Private->RegisteredHandle, // HII handle
- &gWifiConfigFormSetGuid, // Formset GUID
- FORMID_NETWORK_LIST, // Form ID
- StartOpCodeHandle, // Label for where to insert opcodes
- EndOpCodeHandle // Replace data
- );
- Exit:
- gBS->RestoreTPL (OldTpl);
- if (AKMListDisplay != NULL) {
- FreePool (AKMListDisplay);
- }
- if (CipherListDisplay != NULL) {
- FreePool (CipherListDisplay);
- }
- HiiFreeOpCodeHandle (StartOpCodeHandle);
- HiiFreeOpCodeHandle (EndOpCodeHandle);
- DEBUG ((DEBUG_INFO, "[WiFi Connection Manager] Network List is Refreshed!\n"));
- return Status;
- }
- /**
- Refresh the hidden network list configured by user.
- @param[in] Private The pointer to the global private data structure.
- @retval EFI_SUCCESS The operation is completed successfully.
- @retval Other Errors Returned errors when creating Opcodes or updating the
- Hii form.
- **/
- EFI_STATUS
- WifiMgrRefreshHiddenList (
- IN WIFI_MGR_PRIVATE_DATA *Private
- )
- {
- EFI_STATUS Status;
- EFI_TPL OldTpl;
- UINTN Index;
- EFI_STRING_ID StringId;
- VOID *StartOpCodeHandle;
- VOID *EndOpCodeHandle;
- WIFI_HIDDEN_NETWORK_DATA *HiddenNetwork;
- LIST_ENTRY *Entry;
- if (Private == NULL) {
- return EFI_SUCCESS;
- }
- Status = WifiMgrCreateOpCode (
- LABEL_HIDDEN_NETWORK_ENTRY,
- &StartOpCodeHandle,
- &EndOpCodeHandle
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
- Index = 0;
- NET_LIST_FOR_EACH (Entry, &Private->HiddenNetworkList) {
- HiddenNetwork = NET_LIST_USER_STRUCT_S (
- Entry,
- WIFI_HIDDEN_NETWORK_DATA,
- Link,
- WIFI_MGR_HIDDEN_NETWORK_SIGNATURE
- );
- StringId = HiiSetString (Private->RegisteredHandle, 0, HiddenNetwork->SSId, NULL);
- HiiCreateCheckBoxOpCode (
- StartOpCodeHandle,
- (EFI_QUESTION_ID)(KEY_HIDDEN_NETWORK_ENTRY_BASE + Index),
- MANAGER_VARSTORE_ID,
- (UINT16)(HIDDEN_NETWORK_LIST_VAR_OFFSET + Index),
- StringId,
- 0,
- 0,
- 0,
- NULL
- );
- Index++;
- }
- Status = HiiUpdateForm (
- Private->RegisteredHandle, // HII handle
- &gWifiConfigFormSetGuid, // Formset GUID
- FORMID_HIDDEN_NETWORK_LIST, // Form ID
- StartOpCodeHandle, // Label for where to insert opcodes
- EndOpCodeHandle // Replace data
- );
- gBS->RestoreTPL (OldTpl);
- HiiFreeOpCodeHandle (StartOpCodeHandle);
- HiiFreeOpCodeHandle (EndOpCodeHandle);
- return Status;
- }
- /**
- Callback function for user to select a Nic.
- @param[in] Private The pointer to the global private data structure.
- @param[in] KeyValue The key value received from HII input.
- @retval EFI_NOT_FOUND The corresponding Nic is not found.
- @retval EFI_SUCCESS The operation is completed successfully.
- **/
- EFI_STATUS
- WifiMgrSelectNic (
- IN WIFI_MGR_PRIVATE_DATA *Private,
- IN EFI_QUESTION_ID KeyValue
- )
- {
- WIFI_MGR_DEVICE_DATA *Nic;
- UINT32 NicIndex;
- CHAR16 MacString[WIFI_MGR_MAX_MAC_STRING_LEN];
- NicIndex = KeyValue - KEY_MAC_ENTRY_BASE;
- Nic = WifiMgrGetNicByIndex (Private, NicIndex);
- if (Nic == NULL) {
- return EFI_NOT_FOUND;
- }
- Private->CurrentNic = Nic;
- WifiMgrMacAddrToStr (&Nic->MacAddress, sizeof (MacString), MacString);
- HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_MAC_ADDRESS), MacString, NULL);
- return EFI_SUCCESS;
- }
- /**
- Restore the NV data to be default.
- @param[in] Private The pointer to the global private data structure.
- @param[out] IfrNvData The IFR NV data.
- **/
- VOID
- WifiMgrCleanUserInput (
- IN WIFI_MGR_PRIVATE_DATA *Private
- )
- {
- Private->SecurityType = SECURITY_TYPE_NONE;
- Private->EapAuthMethod = EAP_AUTH_METHOD_TTLS;
- Private->EapSecondAuthMethod = EAP_SEAUTH_METHOD_MSCHAPV2;
- Private->FileType = FileTypeMax;
- }
- /**
- UI handle function when user select a network to connect.
- @param[in] Private The pointer to the global private data structure.
- @param[in] ProfileIndex The profile index user selected to connect.
- @retval EFI_INVALID_PARAMETER Nic is null.
- @retval EFI_NOT_FOUND Profile could not be found.
- @retval EFI_SUCCESS The operation is completed successfully.
- **/
- EFI_STATUS
- WifiMgrUserSelectProfileToConnect (
- IN WIFI_MGR_PRIVATE_DATA *Private,
- IN UINT32 ProfileIndex
- )
- {
- WIFI_MGR_NETWORK_PROFILE *Profile;
- WIFI_MGR_DEVICE_DATA *Nic;
- Nic = Private->CurrentNic;
- if (Nic == NULL) {
- return EFI_INVALID_PARAMETER;
- }
- //
- // Initialize the connection page
- //
- WifiMgrCleanUserInput (Private);
- Profile = WifiMgrGetProfileByProfileIndex (ProfileIndex, &Nic->ProfileList);
- if (Profile == NULL) {
- return EFI_NOT_FOUND;
- }
- Private->CurrentNic->UserSelectedProfile = Profile;
- return EFI_SUCCESS;
- }
- /**
- Record password from a HII input string.
- @param[in] Private The pointer to the global private data structure.
- @param[in] StringId The QuestionId received from HII input.
- @param[in] StringBuffer The unicode string buffer to store password.
- @param[in] StringBufferLen The len of unicode string buffer.
- @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
- @retval EFI_NOT_FOUND The password string is not found or invalid.
- @retval EFI_SUCCESS The operation is completed successfully.
- **/
- EFI_STATUS
- WifiMgrRecordPassword (
- IN WIFI_MGR_PRIVATE_DATA *Private,
- IN EFI_STRING_ID StringId,
- IN CHAR16 *StringBuffer,
- IN UINTN StringBufferLen
- )
- {
- CHAR16 *Password;
- if ((StringId == 0) || (StringBuffer == NULL) || (StringBufferLen <= 0)) {
- return EFI_INVALID_PARAMETER;
- }
- Password = HiiGetString (Private->RegisteredHandle, StringId, NULL);
- if (Password == NULL) {
- return EFI_NOT_FOUND;
- }
- if (StrLen (Password) > StringBufferLen) {
- FreePool (Password);
- return EFI_NOT_FOUND;
- }
- StrnCpyS (StringBuffer, StringBufferLen, Password, StrLen (Password));
- ZeroMem (Password, (StrLen (Password) + 1) * sizeof (CHAR16));
- FreePool (Password);
- //
- // Clean password in string package
- //
- HiiSetString (Private->RegisteredHandle, StringId, L"", NULL);
- return EFI_SUCCESS;
- }
- /**
- Update connection message on connect configuration page, and trigger related form refresh.
- @param[in] Nic The related Nic for updating message.
- @param[in] ConnectStateChanged The tag to tell if the connection state has been changed, only
- when the connection changes from "Connected" or "Disconnecting"
- to "Disconnected", or from "Disconnected" or "Connecting" to
- "Connected", this tag can be set as TRUE.
- @param[in] ConnectStatusMessage The message to show on connected status bar, if NULL, will
- use default message.
- **/
- VOID
- WifiMgrUpdateConnectMessage (
- IN WIFI_MGR_DEVICE_DATA *Nic,
- IN BOOLEAN ConnectStateChanged,
- IN EFI_STRING ConnectStatusMessage
- )
- {
- CHAR16 ConnectStatusStr[WIFI_STR_MAX_SIZE];
- WIFI_MGR_PRIVATE_DATA *Private;
- Private = Nic->Private;
- if ((Private == NULL) || (Private->CurrentNic != Nic)) {
- return;
- }
- //
- // Update Connection Status Bar
- //
- if (ConnectStatusMessage != NULL) {
- HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECT_STATUS), ConnectStatusMessage, NULL);
- } else {
- if (Nic->ConnectState == WifiMgrConnectedToAp) {
- UnicodeSPrint (
- ConnectStatusStr,
- sizeof (ConnectStatusStr),
- L"Connected to %s",
- Nic->CurrentOperateNetwork->SSId
- );
- HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECT_STATUS), ConnectStatusStr, NULL);
- } else if (Nic->ConnectState == WifiMgrDisconnected) {
- HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECT_STATUS), L"Disconnected", NULL);
- } else if (Nic->ConnectState == WifiMgrConnectingToAp) {
- UnicodeSPrint (
- ConnectStatusStr,
- sizeof (ConnectStatusStr),
- L"Connecting to %s ...",
- Nic->CurrentOperateNetwork->SSId
- );
- HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECT_STATUS), ConnectStatusStr, NULL);
- } else if (Nic->ConnectState == WifiMgrDisconnectingToAp) {
- UnicodeSPrint (
- ConnectStatusStr,
- sizeof (ConnectStatusStr),
- L"Disconnecting from %s ...",
- Nic->CurrentOperateNetwork->SSId
- );
- HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECT_STATUS), ConnectStatusStr, NULL);
- } else {
- return;
- }
- }
- //
- // Update Connect Button
- //
- if ((Nic->ConnectState == WifiMgrConnectedToAp) && (Nic->UserSelectedProfile == Nic->CurrentOperateNetwork)) {
- HiiSetString (
- Private->RegisteredHandle,
- STRING_TOKEN (STR_CONNECT_NOW),
- L"Disconnect from this Network",
- NULL
- );
- } else {
- HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECT_NOW), L"Connect to this Network", NULL);
- }
- gBS->SignalEvent (Private->ConnectFormRefreshEvent);
- //
- // Update Main Page and Network List
- //
- if (ConnectStateChanged) {
- if (Nic->ConnectState == WifiMgrConnectedToAp) {
- HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECTION_INFO), L"Connected to", NULL);
- HiiSetString (
- Private->RegisteredHandle,
- STRING_TOKEN (STR_CONNECTED_SSID),
- Nic->CurrentOperateNetwork->SSId,
- NULL
- );
- } else {
- HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECTION_INFO), L"Disconnected", NULL);
- HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECTED_SSID), L"", NULL);
- }
- gBS->SignalEvent (Private->NetworkListRefreshEvent);
- gBS->SignalEvent (Private->MainPageRefreshEvent);
- }
- }
- /**
- Convert the driver configuration data into the IFR data.
- @param[in] Private The pointer to the global private data structure.
- @param[out] IfrNvData The IFR NV data.
- @retval EFI_SUCCESS The operation is completed successfully.
- **/
- EFI_STATUS
- WifiMgrConvertConfigDataToIfrNvData (
- IN WIFI_MGR_PRIVATE_DATA *Private,
- OUT WIFI_MANAGER_IFR_NVDATA *IfrNvData
- )
- {
- //
- // Private shouldn't be NULL here, assert if Private is NULL.
- //
- ASSERT (Private != NULL);
- if (Private->CurrentNic != NULL) {
- IfrNvData->ProfileCount = Private->CurrentNic->AvailableCount;
- } else {
- IfrNvData->ProfileCount = 0;
- }
- return EFI_SUCCESS;
- }
- /**
- Convert the IFR data into the driver configuration data.
- @param[in] Private The pointer to the global private data structure.
- @param[in, out] IfrNvData The IFR NV data.
- @retval EFI_SUCCESS The operation is completed successfully.
- **/
- EFI_STATUS
- WifiMgrConvertIfrNvDataToConfigData (
- IN WIFI_MGR_PRIVATE_DATA *Private,
- IN OUT WIFI_MANAGER_IFR_NVDATA *IfrNvData
- )
- {
- return EFI_SUCCESS;
- }
- /**
- This function allows the caller to request the current
- configuration for one or more named elements. The resulting
- string is in <ConfigAltResp> format. Any and all alternative
- configuration strings shall also be appended to the end of the
- current configuration string. If they are, they must appear
- after the current configuration. They must contain the same
- routing (GUID, NAME, PATH) as the current configuration string.
- They must have an additional description indicating the type of
- alternative configuration the string represents,
- "ALTCFG=<StringToken>". That <StringToken> (when
- converted from Hex UNICODE to binary) is a reference to a
- string in the associated string pack.
- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
- @param Request A null-terminated Unicode string in
- <ConfigRequest> format. Note that this
- includes the routing information as well as
- the configurable name / value pairs. It is
- invalid for this string to be in
- <MultiConfigRequest> format.
- If a NULL is passed in for the Request field,
- all of the settings being abstracted by this function
- will be returned in the Results field. In addition,
- if a ConfigHdr is passed in with no request elements,
- all of the settings being abstracted for that particular
- ConfigHdr reference will be returned in the Results Field.
- @param Progress On return, points to a character in the
- Request string. Points to the string's null
- terminator if request was successful. Points
- to the most recent "&" before the first
- failing name / value pair (or the beginning
- of the string if the failure is in the first
- name / value pair) if the request was not
- successful.
- @param Results A null-terminated Unicode string in
- <MultiConfigAltResp> format which has all values
- filled in for the names in the Request string.
- String to be allocated by the called function.
- @retval EFI_SUCCESS The Results string is filled with the
- values corresponding to all requested
- names.
- @retval EFI_OUT_OF_RESOURCES Not enough memory to store the
- parts of the results that must be
- stored awaiting possible future
- protocols.
- @retval EFI_NOT_FOUND Routing data doesn't match any
- known driver. Progress set to the
- first character in the routing header.
- Note: There is no requirement that the
- driver validate the routing data. It
- must skip the <ConfigHdr> in order to
- process the names.
- @retval EFI_INVALID_PARAMETER Illegal syntax. Progress set
- to most recent "&" before the
- error or the beginning of the
- string.
- @retval EFI_INVALID_PARAMETER Unknown name. Progress points
- to the & before the name in
- question.
- **/
- EFI_STATUS
- EFIAPI
- WifiMgrDxeHiiConfigAccessExtractConfig (
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
- IN CONST EFI_STRING Request,
- OUT EFI_STRING *Progress,
- OUT EFI_STRING *Results
- )
- {
- WIFI_MGR_PRIVATE_DATA *Private;
- WIFI_MANAGER_IFR_NVDATA *IfrNvData;
- EFI_STRING ConfigRequestHdr;
- EFI_STRING ConfigRequest;
- UINTN Size;
- BOOLEAN AllocatedRequest;
- UINTN BufferSize;
- EFI_STATUS Status;
- if ((This == NULL) || (Progress == NULL) || (Results == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
- *Progress = Request;
- if ((Request != NULL) &&
- !HiiIsConfigHdrMatch (Request, &gWifiConfigFormSetGuid, mVendorStorageName))
- {
- return EFI_NOT_FOUND;
- }
- ConfigRequestHdr = NULL;
- ConfigRequest = NULL;
- AllocatedRequest = FALSE;
- Size = 0;
- Private = WIFI_MGR_PRIVATE_DATA_FROM_CONFIG_ACCESS (This);
- BufferSize = sizeof (WIFI_MANAGER_IFR_NVDATA);
- IfrNvData = AllocateZeroPool (BufferSize);
- if (IfrNvData == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- WifiMgrConvertConfigDataToIfrNvData (Private, IfrNvData);
- ConfigRequest = Request;
- if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {
- //
- // Request has no request element, construct full request string.
- // Allocate and fill a buffer large enough to hold the <ConfigHdr> template
- // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator.
- //
- ConfigRequestHdr = HiiConstructConfigHdr (
- &gWifiConfigFormSetGuid,
- mVendorStorageName,
- Private->DriverHandle
- );
- if (ConfigRequestHdr == NULL) {
- FreePool (IfrNvData);
- return EFI_OUT_OF_RESOURCES;
- }
- Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
- ConfigRequest = AllocateZeroPool (Size);
- if (ConfigRequest == NULL) {
- FreePool (IfrNvData);
- FreePool (ConfigRequestHdr);
- return EFI_OUT_OF_RESOURCES;
- }
- AllocatedRequest = TRUE;
- UnicodeSPrint (
- ConfigRequest,
- Size,
- L"%s&OFFSET=0&WIDTH=%016LX",
- ConfigRequestHdr,
- (UINT64)BufferSize
- );
- FreePool (ConfigRequestHdr);
- }
- //
- // Convert buffer data to <ConfigResp> by helper function BlockToConfig()
- //
- Status = gHiiConfigRouting->BlockToConfig (
- gHiiConfigRouting,
- ConfigRequest,
- (UINT8 *)IfrNvData,
- BufferSize,
- Results,
- Progress
- );
- FreePool (IfrNvData);
- //
- // Free the allocated config request string.
- //
- if (AllocatedRequest) {
- FreePool (ConfigRequest);
- ConfigRequest = NULL;
- }
- //
- // Set Progress string to the original request string.
- //
- if (Request == NULL) {
- *Progress = NULL;
- } else if (StrStr (Request, L"OFFSET") == NULL) {
- *Progress = Request + StrLen (Request);
- }
- return Status;
- }
- /**
- This function applies changes in a driver's configuration.
- Input is a Configuration, which has the routing data for this
- driver followed by name / value configuration pairs. The driver
- must apply those pairs to its configurable storage. If the
- driver's configuration is stored in a linear block of data
- and the driver's name / value pairs are in <BlockConfig>
- format, it may use the ConfigToBlock helper function (above) to
- simplify the job.
- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
- @param Configuration A null-terminated Unicode string in
- <ConfigString> format.
- @param Progress A pointer to a string filled in with the
- offset of the most recent '&' before the
- first failing name / value pair (or the
- beginn ing of the string if the failure
- is in the first name / value pair) or
- the terminating NULL if all was
- successful.
- @retval EFI_SUCCESS The results have been distributed or are
- awaiting distribution.
- @retval EFI_OUT_OF_RESOURCES Not enough memory to store the
- parts of the results that must be
- stored awaiting possible future
- protocols.
- @retval EFI_INVALID_PARAMETERS Passing in a NULL for the
- Results parameter would result
- in this type of error.
- @retval EFI_NOT_FOUND Target for the specified routing data
- was not found
- **/
- EFI_STATUS
- EFIAPI
- WifiMgrDxeHiiConfigAccessRouteConfig (
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
- IN CONST EFI_STRING Configuration,
- OUT EFI_STRING *Progress
- )
- {
- EFI_STATUS Status;
- UINTN BufferSize;
- WIFI_MGR_PRIVATE_DATA *Private;
- WIFI_MANAGER_IFR_NVDATA *IfrNvData;
- if ((Configuration == NULL) || (Progress == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
- IfrNvData = NULL;
- *Progress = Configuration;
- BufferSize = sizeof (WIFI_MANAGER_IFR_NVDATA);
- Private = WIFI_MGR_PRIVATE_DATA_FROM_CONFIG_ACCESS (This);
- if (!HiiIsConfigHdrMatch (Configuration, &gWifiConfigFormSetGuid, mVendorStorageName)) {
- return EFI_NOT_FOUND;
- }
- IfrNvData = AllocateZeroPool (BufferSize);
- if (IfrNvData == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- WifiMgrConvertConfigDataToIfrNvData (Private, IfrNvData);
- Status = gHiiConfigRouting->ConfigToBlock (
- gHiiConfigRouting,
- Configuration,
- (UINT8 *)IfrNvData,
- &BufferSize,
- Progress
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- Status = WifiMgrConvertIfrNvDataToConfigData (Private, IfrNvData);
- ZeroMem (IfrNvData, sizeof (WIFI_MANAGER_IFR_NVDATA));
- FreePool (IfrNvData);
- return Status;
- }
- /**
- This function is called to provide results data to the driver.
- This data consists of a unique key that is used to identify
- which data is either being passed back or being asked for.
- @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
- @param Action Specifies the type of action taken by the browser.
- @param QuestionId A unique value which is sent to the original
- exporting driver so that it can identify the type
- of data to expect. The format of the data tends to
- vary based on the opcode that generated the callback.
- @param Type The type of value for the question.
- @param Value A pointer to the data being sent to the original
- exporting driver.
- @param ActionRequest On return, points to the action requested by the
- callback function.
- @retval EFI_SUCCESS The callback successfully handled the action.
- @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the
- variable and its data.
- @retval EFI_DEVICE_ERROR The variable could not be saved.
- @retval EFI_UNSUPPORTED The specified Action is not supported by the
- callback.
- **/
- EFI_STATUS
- EFIAPI
- WifiMgrDxeHiiConfigAccessCallback (
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
- IN EFI_BROWSER_ACTION Action,
- IN EFI_QUESTION_ID QuestionId,
- IN UINT8 Type,
- IN OUT EFI_IFR_TYPE_VALUE *Value,
- OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
- )
- {
- EFI_STATUS Status;
- EFI_INPUT_KEY Key;
- UINTN BufferSize;
- WIFI_MGR_PRIVATE_DATA *Private;
- WIFI_MANAGER_IFR_NVDATA *IfrNvData;
- EFI_DEVICE_PATH_PROTOCOL *FilePath;
- WIFI_MGR_NETWORK_PROFILE *Profile;
- WIFI_MGR_NETWORK_PROFILE *ProfileToConnect;
- WIFI_HIDDEN_NETWORK_DATA *HiddenNetwork;
- UINTN TempDataSize;
- VOID *TempData;
- LIST_ENTRY *Entry;
- UINT32 Index;
- UINT32 RemoveCount;
- CHAR16 *TempPassword;
- CHAR16 *ErrorMessage;
- if ((Action != EFI_BROWSER_ACTION_FORM_OPEN) &&
- (Action != EFI_BROWSER_ACTION_FORM_CLOSE) &&
- (Action != EFI_BROWSER_ACTION_CHANGING) &&
- (Action != EFI_BROWSER_ACTION_CHANGED) &&
- (Action != EFI_BROWSER_ACTION_RETRIEVE))
- {
- return EFI_UNSUPPORTED;
- }
- if ((Value == NULL) || (ActionRequest == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
- Status = EFI_SUCCESS;
- Private = WIFI_MGR_PRIVATE_DATA_FROM_CONFIG_ACCESS (This);
- if (Private->CurrentNic == NULL) {
- return EFI_DEVICE_ERROR;
- }
- //
- // Retrieve uncommitted data from Browser
- //
- BufferSize = sizeof (WIFI_MANAGER_IFR_NVDATA);
- IfrNvData = AllocateZeroPool (BufferSize);
- if (IfrNvData == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- HiiGetBrowserData (&gWifiConfigFormSetGuid, mVendorStorageName, BufferSize, (UINT8 *)IfrNvData);
- if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {
- switch (QuestionId) {
- case KEY_MAC_LIST:
- Status = WifiMgrShowNicList (Private);
- break;
- case KEY_REFRESH_NETWORK_LIST:
- if (Private->CurrentNic->UserSelectedProfile != NULL) {
- Profile = Private->CurrentNic->UserSelectedProfile;
- //
- // Erase secrets since user has left Connection Page
- // Connection Page may direct to Network List Page or Eap Configuration Page,
- // secrets only need to be erased when head to Network List Page
- //
- WifiMgrCleanProfileSecrets (Profile);
- Private->CurrentNic->UserSelectedProfile = NULL;
- }
- break;
- case KEY_CONNECT_ACTION:
- if (Private->CurrentNic->UserSelectedProfile == NULL) {
- break;
- }
- Profile = Private->CurrentNic->UserSelectedProfile;
- //
- // Enter the network connection configuration page
- // Recovery from restored data
- //
- if (HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_SSID), Profile->SSId, NULL) == 0) {
- return EFI_OUT_OF_RESOURCES;
- }
- IfrNvData->SecurityType = Profile->SecurityType;
- if (HiiSetString (
- Private->RegisteredHandle,
- STRING_TOKEN (STR_SECURITY_TYPE),
- mSecurityType[IfrNvData->SecurityType],
- NULL
- ) == 0)
- {
- return EFI_OUT_OF_RESOURCES;
- }
- if ((IfrNvData->SecurityType == SECURITY_TYPE_WPA2_ENTERPRISE) ||
- (IfrNvData->SecurityType == SECURITY_TYPE_WPA3_ENTERPRISE))
- {
- IfrNvData->EapAuthMethod = Profile->EapAuthMethod;
- IfrNvData->EapSecondAuthMethod = Profile->EapSecondAuthMethod;
- StrCpyS (IfrNvData->EapIdentity, EAP_IDENTITY_SIZE, Profile->EapIdentity);
- }
- break;
- case KEY_ENROLLED_CERT_NAME:
- if (Private->CurrentNic->UserSelectedProfile == NULL) {
- break;
- }
- Profile = Private->CurrentNic->UserSelectedProfile;
- //
- // Enter the key enrollment page
- // For TTLS and PEAP, only CA cert needs to be cared
- //
- if (Private->FileType == FileTypeCACert) {
- if (Profile->CACertData != NULL) {
- HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_EAP_ENROLLED_CERT_NAME), Profile->CACertName, NULL);
- } else {
- HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_EAP_ENROLLED_CERT_NAME), L"", NULL);
- }
- } else if (Private->FileType == FileTypeClientCert) {
- if (Profile->ClientCertData != NULL) {
- HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_EAP_ENROLLED_CERT_NAME), Profile->ClientCertName, NULL);
- } else {
- HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_EAP_ENROLLED_CERT_NAME), L"", NULL);
- }
- }
- break;
- case KEY_ENROLLED_PRIVATE_KEY_NAME:
- if (Private->CurrentNic->UserSelectedProfile == NULL) {
- break;
- }
- Profile = Private->CurrentNic->UserSelectedProfile;
- if (Profile->PrivateKeyData != NULL) {
- HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_EAP_ENROLLED_PRIVATE_KEY_NAME), Profile->PrivateKeyName, NULL);
- } else {
- HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_EAP_ENROLLED_PRIVATE_KEY_NAME), L"", NULL);
- }
- break;
- default:
- break;
- }
- } else if (Action == EFI_BROWSER_ACTION_FORM_CLOSE) {
- switch (QuestionId) {
- case KEY_CONNECT_ACTION:
- if (Private->CurrentNic->UserSelectedProfile == NULL) {
- break;
- }
- Profile = Private->CurrentNic->UserSelectedProfile;
- //
- // Restore User Config Data for Page recovery
- //
- if ((IfrNvData->SecurityType == SECURITY_TYPE_WPA2_ENTERPRISE) ||
- (IfrNvData->SecurityType == SECURITY_TYPE_WPA3_ENTERPRISE))
- {
- Profile->EapAuthMethod = IfrNvData->EapAuthMethod;
- Profile->EapSecondAuthMethod = IfrNvData->EapSecondAuthMethod;
- StrCpyS (Profile->EapIdentity, EAP_IDENTITY_SIZE, IfrNvData->EapIdentity);
- }
- break;
- default:
- break;
- }
- } else if (Action == EFI_BROWSER_ACTION_CHANGING) {
- switch (QuestionId) {
- case KEY_NETWORK_LIST:
- //
- // User triggered a scan process.
- //
- Private->CurrentNic->OneTimeScanRequest = TRUE;
- break;
- case KEY_PASSWORD_CONNECT_NETWORK:
- case KEY_EAP_PASSWORD_CONNECT_NETWORK:
- case KEY_PRIVATE_KEY_PASSWORD:
- if (Private->CurrentNic->UserSelectedProfile == NULL) {
- break;
- }
- Profile = Private->CurrentNic->UserSelectedProfile;
- if (QuestionId == KEY_PASSWORD_CONNECT_NETWORK) {
- TempPassword = Profile->Password;
- } else if (QuestionId == KEY_EAP_PASSWORD_CONNECT_NETWORK) {
- TempPassword = Profile->EapPassword;
- } else {
- TempPassword = Profile->PrivateKeyPassword;
- }
- Status = WifiMgrRecordPassword (Private, Value->string, TempPassword, PASSWORD_STORAGE_SIZE);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "[WiFi Connection Manager] Error: Failed to input password!"));
- break;
- }
- //
- // This password is not a new created password, so no need to confirm.
- //
- Status = EFI_NOT_FOUND;
- break;
- case KEY_CONNECT_ACTION:
- ErrorMessage = NULL;
- ProfileToConnect = NULL;
- if (Private->CurrentNic->UserSelectedProfile == NULL) {
- break;
- }
- Profile = Private->CurrentNic->UserSelectedProfile;
- if ((Private->CurrentNic->ConnectState == WifiMgrDisconnected) ||
- (Profile != Private->CurrentNic->CurrentOperateNetwork))
- {
- //
- // When this network is not currently connected, pend it to connect.
- //
- if (Profile->AKMSuiteSupported && Profile->CipherSuiteSupported) {
- if ((Profile->SecurityType == SECURITY_TYPE_NONE) ||
- (Profile->SecurityType == SECURITY_TYPE_WPA2_PERSONAL) ||
- (Profile->SecurityType == SECURITY_TYPE_WPA3_PERSONAL))
- {
- //
- // For Open network, connect directly.
- //
- ProfileToConnect = Profile;
- } else if ((Profile->SecurityType == SECURITY_TYPE_WPA2_ENTERPRISE) ||
- (Profile->SecurityType == SECURITY_TYPE_WPA3_ENTERPRISE))
- {
- //
- // For WPA/WPA2-Enterprise network, conduct eap configuration first.
- // Only EAP-TLS, TTLS and PEAP is supported now!
- //
- Profile->EapAuthMethod = IfrNvData->EapAuthMethod;
- StrCpyS (Profile->EapIdentity, EAP_IDENTITY_SIZE, IfrNvData->EapIdentity);
- if ((IfrNvData->EapAuthMethod == EAP_AUTH_METHOD_TTLS) || (IfrNvData->EapAuthMethod == EAP_AUTH_METHOD_PEAP)) {
- Profile->EapSecondAuthMethod = IfrNvData->EapSecondAuthMethod;
- ProfileToConnect = Profile;
- } else if (IfrNvData->EapAuthMethod == EAP_AUTH_METHOD_TLS) {
- ProfileToConnect = Profile;
- } else {
- ErrorMessage = L"ERROR: Only EAP-TLS, TTLS or PEAP is supported now!";
- }
- } else {
- ErrorMessage = L"ERROR: Can't connect to this network!";
- }
- } else {
- ErrorMessage = L"ERROR: This network is not supported!";
- }
- if (ErrorMessage != NULL) {
- CreatePopUp (
- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
- &Key,
- ErrorMessage,
- NULL
- );
- }
- if (ProfileToConnect != NULL) {
- Private->CurrentNic->OneTimeConnectRequest = TRUE;
- Private->CurrentNic->ConnectPendingNetwork = ProfileToConnect;
- }
- } else if (Private->CurrentNic->ConnectState == WifiMgrConnectedToAp) {
- //
- // This network is currently connected, just disconnect from it.
- //
- Private->CurrentNic->OneTimeDisconnectRequest = TRUE;
- Private->CurrentNic->HasDisconnectPendingNetwork = TRUE;
- }
- break;
- case KEY_ENROLL_CA_CERT_CONNECT_NETWORK:
- Private->FileType = FileTypeCACert;
- break;
- case KEY_ENROLL_CLIENT_CERT_CONNECT_NETWORK:
- Private->FileType = FileTypeClientCert;
- break;
- case KEY_EAP_ENROLL_PRIVATE_KEY_FROM_FILE:
- FilePath = NULL;
- ChooseFile (NULL, NULL, NULL, &FilePath);
- if (FilePath != NULL) {
- UpdatePrivateKeyFromFile (Private, FilePath);
- FreePool (FilePath);
- }
- break;
- case KEY_EAP_ENROLL_CERT_FROM_FILE:
- //
- // User will select a cert file from File Explore
- //
- FilePath = NULL;
- ChooseFile (NULL, NULL, NULL, &FilePath);
- if (FilePath != NULL) {
- UpdateCAFromFile (Private, FilePath);
- FreePool (FilePath);
- }
- break;
- case KEY_SAVE_PRIVATE_KEY_TO_MEM:
- if ((Private->FileContext != NULL) && (Private->FileContext->FHandle != NULL) &&
- (Private->CurrentNic->UserSelectedProfile != NULL))
- {
- //
- // Read Private Key file to Buffer
- //
- Profile = Private->CurrentNic->UserSelectedProfile;
- if (Profile->PrivateKeyData != NULL) {
- ZeroMem (Profile->PrivateKeyData, Profile->PrivateKeyDataSize);
- FreePool (Profile->PrivateKeyData);
- Profile->PrivateKeyData = NULL;
- }
- Status = WifiMgrReadFileToBuffer (
- Private->FileContext,
- &TempData,
- &TempDataSize
- );
- if (EFI_ERROR (Status)) {
- CreatePopUp (
- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
- &Key,
- L"ERROR: Can't read this private key file!",
- NULL
- );
- } else {
- ASSERT (Private->FileContext->FileName != NULL);
- Profile->PrivateKeyData = TempData;
- Profile->PrivateKeyDataSize = TempDataSize;
- StrCpyS (Profile->PrivateKeyName, WIFI_FILENAME_STR_MAX_SIZE, Private->FileContext->FileName);
- DEBUG ((
- DEBUG_INFO,
- "[WiFi Connection Manager] Private Key: %s has been enrolled! Size: %d\n",
- Profile->PrivateKeyName,
- Profile->PrivateKeyDataSize
- ));
- }
- }
- break;
- case KEY_SAVE_CERT_TO_MEM:
- if ((Private->FileContext != NULL) && (Private->FileContext->FHandle != NULL) &&
- (Private->CurrentNic->UserSelectedProfile != NULL))
- {
- //
- // Read Cert file to Buffer
- //
- Profile = Private->CurrentNic->UserSelectedProfile;
- if (Private->FileType == FileTypeCACert) {
- if (Profile->CACertData != NULL) {
- ZeroMem (Profile->CACertData, Profile->CACertSize);
- FreePool (Profile->CACertData);
- Profile->CACertData = NULL;
- }
- } else if (Private->FileType == FileTypeClientCert) {
- if (Profile->ClientCertData != NULL) {
- ZeroMem (Profile->ClientCertData, Profile->ClientCertSize);
- FreePool (Profile->ClientCertData);
- Profile->ClientCertData = NULL;
- }
- } else {
- break;
- }
- Status = WifiMgrReadFileToBuffer (
- Private->FileContext,
- &TempData,
- &TempDataSize
- );
- if (EFI_ERROR (Status)) {
- CreatePopUp (
- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
- &Key,
- L"ERROR: Can't read this certificate file!",
- NULL
- );
- } else {
- ASSERT (Private->FileContext->FileName != NULL);
- if (Private->FileType == FileTypeCACert) {
- Profile->CACertData = TempData;
- Profile->CACertSize = TempDataSize;
- StrCpyS (Profile->CACertName, WIFI_FILENAME_STR_MAX_SIZE, Private->FileContext->FileName);
- DEBUG ((
- DEBUG_INFO,
- "[WiFi Connection Manager] CA Cert: %s has been enrolled! Size: %d\n",
- Profile->CACertName,
- Profile->CACertSize
- ));
- } else {
- Profile->ClientCertData = TempData;
- Profile->ClientCertSize = TempDataSize;
- StrCpyS (Profile->ClientCertName, WIFI_FILENAME_STR_MAX_SIZE, Private->FileContext->FileName);
- DEBUG ((
- DEBUG_INFO,
- "[WiFi Connection Manager] Client Cert: %s has been enrolled! Size: %d\n",
- Profile->ClientCertName,
- Profile->ClientCertSize
- ));
- }
- }
- }
- break;
- case KEY_ADD_HIDDEN_NETWORK:
- //
- // Add a Hidden Network
- //
- if ((StrLen (IfrNvData->SSId) < SSID_MIN_LEN) ||
- (Private->HiddenNetworkCount >= HIDDEN_NETWORK_LIST_COUNT_MAX))
- {
- Status = EFI_ABORTED;
- break;
- } else {
- //
- // Check if this SSId is already in Hidden Network List
- //
- NET_LIST_FOR_EACH (Entry, &Private->HiddenNetworkList) {
- HiddenNetwork = NET_LIST_USER_STRUCT_S (
- Entry,
- WIFI_HIDDEN_NETWORK_DATA,
- Link,
- WIFI_MGR_HIDDEN_NETWORK_SIGNATURE
- );
- if (StrCmp (HiddenNetwork->SSId, IfrNvData->SSId) == 0) {
- Status = EFI_ABORTED;
- break;
- }
- }
- }
- HiddenNetwork = (WIFI_HIDDEN_NETWORK_DATA *)AllocateZeroPool (sizeof (WIFI_HIDDEN_NETWORK_DATA));
- if (HiddenNetwork == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- break;
- }
- HiddenNetwork->Signature = WIFI_MGR_HIDDEN_NETWORK_SIGNATURE;
- StrCpyS (HiddenNetwork->SSId, SSID_STORAGE_SIZE, IfrNvData->SSId);
- InsertTailList (&Private->HiddenNetworkList, &HiddenNetwork->Link);
- Private->HiddenNetworkCount++;
- WifiMgrRefreshHiddenList (Private);
- break;
- case KEY_REMOVE_HIDDEN_NETWORK:
- //
- // Remove Hidden Networks
- //
- Entry = GetFirstNode (&Private->HiddenNetworkList);
- RemoveCount = 0;
- for (Index = 0; Index < Private->HiddenNetworkCount; Index++) {
- if (IfrNvData->HiddenNetworkList[Index] != 0) {
- HiddenNetwork = NET_LIST_USER_STRUCT_S (Entry, WIFI_HIDDEN_NETWORK_DATA, Link, WIFI_MGR_HIDDEN_NETWORK_SIGNATURE);
- Entry = RemoveEntryList (Entry);
- RemoveCount++;
- FreePool (HiddenNetwork);
- } else {
- Entry = GetNextNode (&Private->HiddenNetworkList, Entry);
- }
- }
- Private->HiddenNetworkCount -= RemoveCount;
- WifiMgrRefreshHiddenList (Private);
- break;
- default:
- if ((QuestionId >= KEY_MAC_ENTRY_BASE) && (QuestionId < KEY_MAC_ENTRY_BASE + Private->NicCount)) {
- //
- // User selects a wireless NIC.
- //
- Status = WifiMgrSelectNic (Private, QuestionId);
- if (EFI_ERROR (Status)) {
- CreatePopUp (
- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
- &Key,
- L"ERROR: Fail to operate the wireless NIC!",
- NULL
- );
- }
- } else if (Private->CurrentNic != NULL) {
- if ((QuestionId >= KEY_AVAILABLE_NETWORK_ENTRY_BASE) &&
- (QuestionId <= KEY_AVAILABLE_NETWORK_ENTRY_BASE + Private->CurrentNic->MaxProfileIndex))
- {
- Status = WifiMgrUserSelectProfileToConnect (Private, QuestionId - KEY_AVAILABLE_NETWORK_ENTRY_BASE);
- if (!EFI_ERROR (Status)) {
- WifiMgrUpdateConnectMessage (Private->CurrentNic, FALSE, NULL);
- }
- }
- if (EFI_ERROR (Status)) {
- CreatePopUp (
- EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
- &Key,
- L"ERROR: Fail to operate this profile!",
- NULL
- );
- }
- }
- break;
- }
- } else if (Action == EFI_BROWSER_ACTION_CHANGED) {
- switch (QuestionId) {
- case KEY_SAVE_CERT_TO_MEM:
- case KEY_SAVE_PRIVATE_KEY_TO_MEM:
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;
- break;
- case KEY_NO_SAVE_CERT_TO_MEM:
- case KEY_NO_SAVE_PRIVATE_KEY_TO_MEM:
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;
- break;
- default:
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;
- break;
- }
- } else if (Action == EFI_BROWSER_ACTION_RETRIEVE) {
- switch (QuestionId) {
- case KEY_REFRESH_NETWORK_LIST:
- WifiMgrRefreshNetworkList (Private, IfrNvData);
- break;
- default:
- break;
- }
- }
- if (!EFI_ERROR (Status)) {
- //
- // Pass changed uncommitted data back to Form Browser.
- //
- BufferSize = sizeof (WIFI_MANAGER_IFR_NVDATA);
- HiiSetBrowserData (&gWifiConfigFormSetGuid, mVendorStorageName, BufferSize, (UINT8 *)IfrNvData, NULL);
- }
- ZeroMem (IfrNvData, sizeof (WIFI_MANAGER_IFR_NVDATA));
- FreePool (IfrNvData);
- return Status;
- }
- /**
- Initialize the WiFi configuration form.
- @param[in] Private The pointer to the global private data structure.
- @retval EFI_SUCCESS The configuration form is initialized.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
- @retval Other Erros Returned Errors when installing protocols.
- **/
- EFI_STATUS
- WifiMgrDxeConfigFormInit (
- WIFI_MGR_PRIVATE_DATA *Private
- )
- {
- EFI_STATUS Status;
- if (Private == NULL) {
- return EFI_INVALID_PARAMETER;
- }
- Private->ConfigAccess.ExtractConfig = WifiMgrDxeHiiConfigAccessExtractConfig;
- Private->ConfigAccess.RouteConfig = WifiMgrDxeHiiConfigAccessRouteConfig;
- Private->ConfigAccess.Callback = WifiMgrDxeHiiConfigAccessCallback;
- //
- // Install Device Path Protocol and Config Access protocol to driver handle.
- //
- Status = gBS->InstallMultipleProtocolInterfaces (
- &Private->DriverHandle,
- &gEfiDevicePathProtocolGuid,
- &mWifiMgrDxeHiiVendorDevicePath,
- &gEfiHiiConfigAccessProtocolGuid,
- &Private->ConfigAccess,
- NULL
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Publish our HII data.
- //
- Private->RegisteredHandle = HiiAddPackages (
- &gWifiConfigFormSetGuid,
- Private->DriverHandle,
- WifiConnectionManagerDxeStrings,
- WifiConnectionManagerDxeBin,
- NULL
- );
- if (Private->RegisteredHandle == NULL) {
- gBS->UninstallMultipleProtocolInterfaces (
- Private->DriverHandle,
- &gEfiDevicePathProtocolGuid,
- &mWifiMgrDxeHiiVendorDevicePath,
- &gEfiHiiConfigAccessProtocolGuid,
- &Private->ConfigAccess,
- NULL
- );
- return EFI_OUT_OF_RESOURCES;
- }
- Private->FileContext = AllocateZeroPool (sizeof (WIFI_MGR_FILE_CONTEXT));
- if (Private->FileContext == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- return EFI_SUCCESS;
- }
- /**
- Unload the WiFi configuration form.
- @param[in] Private The pointer to the global private data structure.
- @retval EFI_SUCCESS The configuration form is unloaded successfully.
- @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
- @retval Other Errors Returned Erros when uninstalling protocols.
- **/
- EFI_STATUS
- WifiMgrDxeConfigFormUnload (
- WIFI_MGR_PRIVATE_DATA *Private
- )
- {
- EFI_STATUS Status;
- if (Private == NULL) {
- return EFI_INVALID_PARAMETER;
- }
- if (Private->FileContext != NULL) {
- if (Private->FileContext->FHandle != NULL) {
- Private->FileContext->FHandle->Close (Private->FileContext->FHandle);
- }
- if (Private->FileContext->FileName != NULL) {
- FreePool (Private->FileContext->FileName);
- }
- FreePool (Private->FileContext);
- }
- HiiRemovePackages (Private->RegisteredHandle);
- Status = gBS->UninstallMultipleProtocolInterfaces (
- Private->DriverHandle,
- &gEfiDevicePathProtocolGuid,
- &mWifiMgrDxeHiiVendorDevicePath,
- &gEfiHiiConfigAccessProtocolGuid,
- &Private->ConfigAccess,
- NULL
- );
- return Status;
- }
|