WifiConnectionMgrHiiConfigAccess.c 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076
  1. /** @file
  2. The Hii functions for WiFi Connection Manager.
  3. Copyright (c) 2019 - 2022, Intel Corporation. All rights reserved.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #include "WifiConnectionMgrDxe.h"
  7. CHAR16 mVendorStorageName[] = L"WIFI_MANAGER_IFR_NVDATA";
  8. HII_VENDOR_DEVICE_PATH mWifiMgrDxeHiiVendorDevicePath = {
  9. {
  10. {
  11. HARDWARE_DEVICE_PATH,
  12. HW_VENDOR_DP,
  13. {
  14. (UINT8)(sizeof (VENDOR_DEVICE_PATH)),
  15. (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
  16. }
  17. },
  18. WIFI_CONNECTION_MANAGER_CONFIG_GUID
  19. },
  20. {
  21. END_DEVICE_PATH_TYPE,
  22. END_ENTIRE_DEVICE_PATH_SUBTYPE,
  23. {
  24. (UINT8)(END_DEVICE_PATH_LENGTH),
  25. (UINT8)((END_DEVICE_PATH_LENGTH) >> 8)
  26. }
  27. }
  28. };
  29. //
  30. // HII Config Access Protocol instance
  31. //
  32. GLOBAL_REMOVE_IF_UNREFERENCED
  33. EFI_HII_CONFIG_ACCESS_PROTOCOL gWifiMgrDxeHiiConfigAccess = {
  34. WifiMgrDxeHiiConfigAccessExtractConfig,
  35. WifiMgrDxeHiiConfigAccessRouteConfig,
  36. WifiMgrDxeHiiConfigAccessCallback
  37. };
  38. CHAR16 *mSecurityType[] = {
  39. L"OPEN ",
  40. L"WPA-Enterprise ",
  41. L"WPA2-Enterprise",
  42. L"WPA-Personal ",
  43. L"WPA2-Personal ",
  44. L"WEP ",
  45. L"WPA3-Personal ",
  46. L"WPA3-Enterprise",
  47. L"UnKnown "
  48. };
  49. CHAR16 *mSignalStrengthBar[] = {
  50. L"[-----]",
  51. L"[*----]",
  52. L"[**---]",
  53. L"[***--]",
  54. L"[****-]",
  55. L"[*****]"
  56. };
  57. #define RSSI_TO_SIGNAL_STRENGTH_BAR(Rssi) mSignalStrengthBar[((Rssi + 19)/20)]
  58. #define NET_LIST_FOR_EACH_FROM_NODE(Entry, Node, ListHead) \
  59. for(Entry = Node->ForwardLink; Entry != (ListHead); Entry = Entry->ForwardLink)
  60. extern EFI_GUID gWifiConfigFormSetGuid;
  61. /**
  62. Create Hii Extend Label OpCode as the start opcode and end opcode.
  63. The caller is responsible for freeing the OpCode with HiiFreeOpCodeHandle().
  64. @param[in] StartLabelNumber The number of start label.
  65. @param[out] StartOpCodeHandle Points to the start opcode handle.
  66. @param[out] EndOpCodeHandle Points to the end opcode handle.
  67. @retval EFI_OUT_OF_RESOURCES Do not have sufficient resource to finish this
  68. operation.
  69. @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
  70. @retval EFI_SUCCESS The operation is completed successfully.
  71. @retval Other Errors Returned errors when updating the HII form.
  72. **/
  73. EFI_STATUS
  74. WifiMgrCreateOpCode (
  75. IN UINT16 StartLabelNumber,
  76. OUT VOID **StartOpCodeHandle,
  77. OUT VOID **EndOpCodeHandle
  78. )
  79. {
  80. EFI_STATUS Status;
  81. EFI_IFR_GUID_LABEL *InternalStartLabel;
  82. EFI_IFR_GUID_LABEL *InternalEndLabel;
  83. if ((StartOpCodeHandle == NULL) || (EndOpCodeHandle == NULL)) {
  84. return EFI_INVALID_PARAMETER;
  85. }
  86. Status = EFI_OUT_OF_RESOURCES;
  87. *StartOpCodeHandle = NULL;
  88. *EndOpCodeHandle = NULL;
  89. //
  90. // Initialize the container for dynamic opcodes.
  91. //
  92. *StartOpCodeHandle = HiiAllocateOpCodeHandle ();
  93. if (*StartOpCodeHandle == NULL) {
  94. goto Exit;
  95. }
  96. *EndOpCodeHandle = HiiAllocateOpCodeHandle ();
  97. if (*EndOpCodeHandle == NULL) {
  98. goto Exit;
  99. }
  100. //
  101. // Create Hii Extend Label OpCode as the start opcode.
  102. //
  103. InternalStartLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (
  104. *StartOpCodeHandle,
  105. &gEfiIfrTianoGuid,
  106. NULL,
  107. sizeof (EFI_IFR_GUID_LABEL)
  108. );
  109. if (InternalStartLabel == NULL) {
  110. goto Exit;
  111. }
  112. InternalStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
  113. InternalStartLabel->Number = StartLabelNumber;
  114. //
  115. // Create Hii Extend Label OpCode as the end opcode.
  116. //
  117. InternalEndLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (
  118. *EndOpCodeHandle,
  119. &gEfiIfrTianoGuid,
  120. NULL,
  121. sizeof (EFI_IFR_GUID_LABEL)
  122. );
  123. if (InternalEndLabel == NULL) {
  124. goto Exit;
  125. }
  126. InternalEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
  127. InternalEndLabel->Number = LABEL_END;
  128. return EFI_SUCCESS;
  129. Exit:
  130. if (*StartOpCodeHandle != NULL) {
  131. HiiFreeOpCodeHandle (*StartOpCodeHandle);
  132. }
  133. if (*EndOpCodeHandle != NULL) {
  134. HiiFreeOpCodeHandle (*EndOpCodeHandle);
  135. }
  136. return Status;
  137. }
  138. /**
  139. Display the Nic list contains all available Nics.
  140. @param[in] Private The pointer to the global private data structure.
  141. @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
  142. @retval EFI_SUCCESS The operation is completed successfully.
  143. **/
  144. EFI_STATUS
  145. WifiMgrShowNicList (
  146. IN WIFI_MGR_PRIVATE_DATA *Private
  147. )
  148. {
  149. EFI_STATUS Status;
  150. CHAR16 MacString[WIFI_MGR_MAX_MAC_STRING_LEN];
  151. CHAR16 PortString[WIFI_STR_MAX_SIZE];
  152. EFI_STRING_ID PortTitleToken;
  153. EFI_STRING_ID PortTitleHelpToken;
  154. WIFI_MGR_DEVICE_DATA *Nic;
  155. LIST_ENTRY *Entry;
  156. VOID *StartOpCodeHandle;
  157. VOID *EndOpCodeHandle;
  158. if (Private == NULL) {
  159. return EFI_INVALID_PARAMETER;
  160. }
  161. Status = WifiMgrCreateOpCode (
  162. LABEL_MAC_ENTRY,
  163. &StartOpCodeHandle,
  164. &EndOpCodeHandle
  165. );
  166. if (EFI_ERROR (Status)) {
  167. return Status;
  168. }
  169. NET_LIST_FOR_EACH (Entry, &Private->NicList) {
  170. Nic = NET_LIST_USER_STRUCT_S (Entry, WIFI_MGR_DEVICE_DATA, Link, WIFI_MGR_DEVICE_DATA_SIGNATURE);
  171. WifiMgrMacAddrToStr (&Nic->MacAddress, sizeof (MacString), MacString);
  172. UnicodeSPrint (PortString, sizeof (PortString), L"MAC %s", MacString);
  173. PortTitleToken = HiiSetString (
  174. Private->RegisteredHandle,
  175. 0,
  176. PortString,
  177. NULL
  178. );
  179. if (PortTitleToken == 0) {
  180. Status = EFI_INVALID_PARAMETER;
  181. goto Exit;
  182. }
  183. UnicodeSPrint (PortString, sizeof (PortString), L"MAC Address");
  184. PortTitleHelpToken = HiiSetString (
  185. Private->RegisteredHandle,
  186. 0,
  187. PortString,
  188. NULL
  189. );
  190. if (PortTitleHelpToken == 0) {
  191. Status = EFI_INVALID_PARAMETER;
  192. goto Exit;
  193. }
  194. HiiCreateGotoOpCode (
  195. StartOpCodeHandle,
  196. FORMID_WIFI_MAINPAGE,
  197. PortTitleToken,
  198. PortTitleHelpToken,
  199. EFI_IFR_FLAG_CALLBACK,
  200. (UINT16)(KEY_MAC_ENTRY_BASE + Nic->NicIndex)
  201. );
  202. }
  203. Status = HiiUpdateForm (
  204. Private->RegisteredHandle, // HII handle
  205. &gWifiConfigFormSetGuid, // Formset GUID
  206. FORMID_MAC_SELECTION, // Form ID
  207. StartOpCodeHandle, // Label for where to insert opcodes
  208. EndOpCodeHandle // Replace data
  209. );
  210. Exit:
  211. HiiFreeOpCodeHandle (StartOpCodeHandle);
  212. HiiFreeOpCodeHandle (EndOpCodeHandle);
  213. return Status;
  214. }
  215. /**
  216. Retreive the unicode string of the AKM Suite list of a profile.
  217. The caller is responsible for freeing the string with FreePool().
  218. @param[in] Profile The network profile contains a AKM suite list.
  219. @return the unicode string of AKM suite list or "None".
  220. **/
  221. CHAR16 *
  222. WifiMgrGetStrAKMList (
  223. IN WIFI_MGR_NETWORK_PROFILE *Profile
  224. )
  225. {
  226. UINT8 Index;
  227. UINT16 AKMSuiteCount;
  228. CHAR16 *AKMListDisplay;
  229. UINTN Length;
  230. AKMListDisplay = NULL;
  231. if ((Profile == NULL) || (Profile->Network.AKMSuite == NULL)) {
  232. goto Exit;
  233. }
  234. AKMSuiteCount = Profile->Network.AKMSuite->AKMSuiteCount;
  235. if (AKMSuiteCount != 0) {
  236. //
  237. // Current AKM Suite is between 1-18
  238. //
  239. AKMListDisplay = (CHAR16 *)AllocateZeroPool (sizeof (CHAR16) * (AKMSuiteCount * 3 + 1));
  240. Length = 0;
  241. if (AKMListDisplay != NULL) {
  242. for (Index = 0; Index < AKMSuiteCount; Index++) {
  243. //
  244. // The size of buffer should be 4 CHAR16 for Null-terminated Unicode string.
  245. //
  246. UnicodeSPrint (
  247. AKMListDisplay + Length,
  248. sizeof (CHAR16) * 4,
  249. L"%d ",
  250. Profile->Network.AKMSuite->AKMSuiteList[Index].SuiteType
  251. );
  252. Length = StrLen (AKMListDisplay + Length) + Length;
  253. if (Index == AKMSuiteCount - 1) {
  254. *(AKMListDisplay + (Length - 1)) = L'\0';
  255. }
  256. }
  257. }
  258. }
  259. Exit:
  260. if (AKMListDisplay == NULL) {
  261. AKMListDisplay = AllocateCopyPool (sizeof (L"None"), L"None");
  262. }
  263. return AKMListDisplay;
  264. }
  265. /**
  266. Retreive the unicode string of the Cipher Suite list of a profile.
  267. The caller is responsible for freeing the string with FreePool().
  268. @param[in] Profile The network profile contains a Cipher suite list.
  269. @return the unicode string of Cipher suite list or "None".
  270. **/
  271. CHAR16 *
  272. WifiMgrGetStrCipherList (
  273. IN WIFI_MGR_NETWORK_PROFILE *Profile
  274. )
  275. {
  276. UINT8 Index;
  277. UINT16 CipherSuiteCount;
  278. CHAR16 *CipherListDisplay;
  279. CipherListDisplay = NULL;
  280. if ((Profile == NULL) || (Profile->Network.CipherSuite == NULL)) {
  281. goto Exit;
  282. }
  283. CipherSuiteCount = Profile->Network.CipherSuite->CipherSuiteCount;
  284. if (CipherSuiteCount != 0) {
  285. //
  286. // Current Cipher Suite is between 1-9
  287. //
  288. CipherListDisplay = (CHAR16 *)AllocateZeroPool (sizeof (CHAR16) * (CipherSuiteCount * 2 + 1));
  289. if (CipherListDisplay != NULL) {
  290. for (Index = 0; Index < CipherSuiteCount; Index++) {
  291. //
  292. // The size of buffer should be 3 CHAR16 for Null-terminated Unicode string.
  293. // The first char is the Cipher Suite number, the second char is ' ', the third char is '\0'.
  294. //
  295. UnicodeSPrint (
  296. CipherListDisplay + (Index * 2),
  297. sizeof (CHAR16) * 3,
  298. L"%d ",
  299. Profile->Network.CipherSuite->CipherSuiteList[Index].SuiteType
  300. );
  301. if (Index == CipherSuiteCount - 1) {
  302. *(CipherListDisplay + (Index * 2 + 1)) = L'\0';
  303. }
  304. }
  305. }
  306. }
  307. Exit:
  308. if (CipherListDisplay == NULL) {
  309. CipherListDisplay = AllocateCopyPool (sizeof (L"None"), L"None");
  310. }
  311. return CipherListDisplay;
  312. }
  313. /**
  314. Refresh the network list display of the current Nic.
  315. @param[in] Private The pointer to the global private data structure.
  316. @param[out] IfrNvData The IFR NV data.
  317. @retval EFI_SUCCESS The operation is completed successfully.
  318. @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
  319. @retval Other Errors Returned errors when creating Opcodes or updating the
  320. Hii form.
  321. **/
  322. EFI_STATUS
  323. WifiMgrRefreshNetworkList (
  324. IN WIFI_MGR_PRIVATE_DATA *Private,
  325. OUT WIFI_MANAGER_IFR_NVDATA *IfrNvData
  326. )
  327. {
  328. EFI_STATUS Status;
  329. EFI_TPL OldTpl;
  330. UINT32 AvailableCount;
  331. EFI_STRING_ID PortPromptToken;
  332. EFI_STRING_ID PortTextToken;
  333. EFI_STRING_ID PortHelpToken;
  334. WIFI_MGR_NETWORK_PROFILE *Profile;
  335. LIST_ENTRY *Entry;
  336. VOID *StartOpCodeHandle;
  337. VOID *EndOpCodeHandle;
  338. CHAR16 *AKMListDisplay;
  339. CHAR16 *CipherListDisplay;
  340. CHAR16 PortString[WIFI_STR_MAX_SIZE];
  341. UINTN PortStringSize;
  342. WIFI_MGR_NETWORK_PROFILE *ConnectedProfile;
  343. if (Private->CurrentNic == NULL) {
  344. return EFI_SUCCESS;
  345. }
  346. Status = WifiMgrCreateOpCode (
  347. LABEL_NETWORK_LIST_ENTRY,
  348. &StartOpCodeHandle,
  349. &EndOpCodeHandle
  350. );
  351. if (EFI_ERROR (Status)) {
  352. return Status;
  353. }
  354. OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
  355. AvailableCount = 0;
  356. PortStringSize = sizeof (PortString);
  357. ConnectedProfile = NULL;
  358. AKMListDisplay = NULL;
  359. CipherListDisplay = NULL;
  360. if (Private->CurrentNic->ConnectState == WifiMgrConnectedToAp) {
  361. //
  362. // Display the current connected network.
  363. // Find the current operate network under connected status.
  364. //
  365. if ((Private->CurrentNic->CurrentOperateNetwork != NULL) &&
  366. Private->CurrentNic->CurrentOperateNetwork->IsAvailable)
  367. {
  368. Profile = Private->CurrentNic->CurrentOperateNetwork;
  369. AvailableCount++;
  370. AKMListDisplay = WifiMgrGetStrAKMList (Profile);
  371. if (AKMListDisplay == NULL) {
  372. Status = EFI_OUT_OF_RESOURCES;
  373. goto Exit;
  374. }
  375. CipherListDisplay = WifiMgrGetStrCipherList (Profile);
  376. if (CipherListDisplay == NULL) {
  377. Status = EFI_OUT_OF_RESOURCES;
  378. goto Exit;
  379. }
  380. UnicodeSPrint (PortString, PortStringSize, L"%s (Connected)", Profile->SSId);
  381. PortPromptToken = HiiSetString (Private->RegisteredHandle, 0, PortString, NULL);
  382. if (Profile->SecurityType == SECURITY_TYPE_NONE) {
  383. PortHelpToken = 0;
  384. } else {
  385. UnicodeSPrint (PortString, PortStringSize, L"AKMSuite: %s CipherSuite: %s", AKMListDisplay, CipherListDisplay);
  386. PortHelpToken = HiiSetString (Private->RegisteredHandle, 0, PortString, NULL);
  387. }
  388. FreePool (AKMListDisplay);
  389. FreePool (CipherListDisplay);
  390. AKMListDisplay = NULL;
  391. CipherListDisplay = NULL;
  392. HiiCreateGotoOpCode (
  393. StartOpCodeHandle,
  394. FORMID_CONNECT_NETWORK,
  395. PortPromptToken,
  396. PortHelpToken,
  397. EFI_IFR_FLAG_CALLBACK,
  398. (UINT16)(KEY_AVAILABLE_NETWORK_ENTRY_BASE + Profile->ProfileIndex)
  399. );
  400. UnicodeSPrint (
  401. PortString,
  402. PortStringSize,
  403. L"%s %s %s",
  404. (Profile->SecurityType != SECURITY_TYPE_NONE ? L"Secured" : L"Open "),
  405. mSecurityType[Profile->SecurityType],
  406. RSSI_TO_SIGNAL_STRENGTH_BAR (Profile->NetworkQuality)
  407. );
  408. PortTextToken = HiiSetString (Private->RegisteredHandle, 0, PortString, NULL);
  409. HiiCreateTextOpCode (
  410. StartOpCodeHandle,
  411. PortTextToken,
  412. 0,
  413. 0
  414. );
  415. ConnectedProfile = Profile;
  416. } else {
  417. Private->CurrentNic->HasDisconnectPendingNetwork = TRUE;
  418. }
  419. }
  420. //
  421. // Display all supported available networks.
  422. //
  423. NET_LIST_FOR_EACH (Entry, &Private->CurrentNic->ProfileList) {
  424. Profile = NET_LIST_USER_STRUCT_S (
  425. Entry,
  426. WIFI_MGR_NETWORK_PROFILE,
  427. Link,
  428. WIFI_MGR_PROFILE_SIGNATURE
  429. );
  430. if (ConnectedProfile == Profile) {
  431. continue;
  432. }
  433. if (Profile->IsAvailable && Profile->CipherSuiteSupported) {
  434. AvailableCount++;
  435. AKMListDisplay = WifiMgrGetStrAKMList (Profile);
  436. if (AKMListDisplay == NULL) {
  437. Status = EFI_OUT_OF_RESOURCES;
  438. goto Exit;
  439. }
  440. CipherListDisplay = WifiMgrGetStrCipherList (Profile);
  441. if (CipherListDisplay == NULL) {
  442. Status = EFI_OUT_OF_RESOURCES;
  443. goto Exit;
  444. }
  445. PortPromptToken = HiiSetString (Private->RegisteredHandle, 0, Profile->SSId, NULL);
  446. if (PortPromptToken == 0) {
  447. Status = EFI_OUT_OF_RESOURCES;
  448. goto Exit;
  449. }
  450. if (Profile->SecurityType == SECURITY_TYPE_NONE) {
  451. PortHelpToken = 0;
  452. } else {
  453. UnicodeSPrint (
  454. PortString,
  455. PortStringSize,
  456. L"AKMSuite: %s CipherSuite: %s",
  457. AKMListDisplay,
  458. CipherListDisplay
  459. );
  460. PortHelpToken = HiiSetString (Private->RegisteredHandle, 0, PortString, NULL);
  461. if (PortHelpToken == 0) {
  462. Status = EFI_OUT_OF_RESOURCES;
  463. goto Exit;
  464. }
  465. }
  466. FreePool (AKMListDisplay);
  467. FreePool (CipherListDisplay);
  468. AKMListDisplay = NULL;
  469. CipherListDisplay = NULL;
  470. HiiCreateGotoOpCode (
  471. StartOpCodeHandle,
  472. FORMID_CONNECT_NETWORK,
  473. PortPromptToken,
  474. PortHelpToken,
  475. EFI_IFR_FLAG_CALLBACK,
  476. (UINT16)(KEY_AVAILABLE_NETWORK_ENTRY_BASE + Profile->ProfileIndex)
  477. );
  478. UnicodeSPrint (
  479. PortString,
  480. PortStringSize,
  481. L"%s %s %s",
  482. (Profile->SecurityType != SECURITY_TYPE_NONE ? L"Secured" : L"Open "),
  483. mSecurityType[Profile->SecurityType],
  484. RSSI_TO_SIGNAL_STRENGTH_BAR (Profile->NetworkQuality)
  485. );
  486. PortTextToken = HiiSetString (Private->RegisteredHandle, 0, PortString, NULL);
  487. if (PortTextToken == 0) {
  488. Status = EFI_OUT_OF_RESOURCES;
  489. goto Exit;
  490. }
  491. HiiCreateTextOpCode (
  492. StartOpCodeHandle,
  493. PortTextToken,
  494. 0,
  495. 0
  496. );
  497. }
  498. }
  499. //
  500. // Display all Unsupported available networks.
  501. //
  502. NET_LIST_FOR_EACH (Entry, &Private->CurrentNic->ProfileList) {
  503. Profile = NET_LIST_USER_STRUCT_S (
  504. Entry,
  505. WIFI_MGR_NETWORK_PROFILE,
  506. Link,
  507. WIFI_MGR_PROFILE_SIGNATURE
  508. );
  509. if (ConnectedProfile == Profile) {
  510. continue;
  511. }
  512. if (Profile->IsAvailable && !Profile->CipherSuiteSupported) {
  513. AvailableCount++;
  514. AKMListDisplay = WifiMgrGetStrAKMList (Profile);
  515. if (AKMListDisplay == NULL) {
  516. Status = EFI_OUT_OF_RESOURCES;
  517. goto Exit;
  518. }
  519. CipherListDisplay = WifiMgrGetStrCipherList (Profile);
  520. if (CipherListDisplay == NULL) {
  521. Status = EFI_OUT_OF_RESOURCES;
  522. goto Exit;
  523. }
  524. PortPromptToken = HiiSetString (Private->RegisteredHandle, 0, Profile->SSId, NULL);
  525. if (Profile->AKMSuiteSupported) {
  526. UnicodeSPrint (
  527. PortString,
  528. PortStringSize,
  529. L"AKMSuite: %s CipherSuite(UnSupported): %s",
  530. AKMListDisplay,
  531. CipherListDisplay
  532. );
  533. } else {
  534. UnicodeSPrint (
  535. PortString,
  536. PortStringSize,
  537. L"AKMSuite(UnSupported): %s CipherSuite(UnSupported): %s",
  538. AKMListDisplay,
  539. CipherListDisplay
  540. );
  541. }
  542. FreePool (AKMListDisplay);
  543. FreePool (CipherListDisplay);
  544. AKMListDisplay = NULL;
  545. CipherListDisplay = NULL;
  546. PortHelpToken = HiiSetString (Private->RegisteredHandle, 0, PortString, NULL);
  547. HiiCreateGotoOpCode (
  548. StartOpCodeHandle,
  549. FORMID_CONNECT_NETWORK,
  550. PortPromptToken,
  551. PortHelpToken,
  552. EFI_IFR_FLAG_CALLBACK,
  553. (UINT16)(KEY_AVAILABLE_NETWORK_ENTRY_BASE + Profile->ProfileIndex)
  554. );
  555. UnicodeSPrint (
  556. PortString,
  557. PortStringSize,
  558. L"%s %s %s",
  559. L"UnSupported",
  560. mSecurityType[Profile->SecurityType],
  561. RSSI_TO_SIGNAL_STRENGTH_BAR (Profile->NetworkQuality)
  562. );
  563. PortTextToken = HiiSetString (Private->RegisteredHandle, 0, PortString, NULL);
  564. HiiCreateTextOpCode (
  565. StartOpCodeHandle,
  566. PortTextToken,
  567. 0,
  568. 0
  569. );
  570. }
  571. }
  572. Status = HiiUpdateForm (
  573. Private->RegisteredHandle, // HII handle
  574. &gWifiConfigFormSetGuid, // Formset GUID
  575. FORMID_NETWORK_LIST, // Form ID
  576. StartOpCodeHandle, // Label for where to insert opcodes
  577. EndOpCodeHandle // Replace data
  578. );
  579. Exit:
  580. gBS->RestoreTPL (OldTpl);
  581. if (AKMListDisplay != NULL) {
  582. FreePool (AKMListDisplay);
  583. }
  584. if (CipherListDisplay != NULL) {
  585. FreePool (CipherListDisplay);
  586. }
  587. HiiFreeOpCodeHandle (StartOpCodeHandle);
  588. HiiFreeOpCodeHandle (EndOpCodeHandle);
  589. DEBUG ((DEBUG_INFO, "[WiFi Connection Manager] Network List is Refreshed!\n"));
  590. return Status;
  591. }
  592. /**
  593. Refresh the hidden network list configured by user.
  594. @param[in] Private The pointer to the global private data structure.
  595. @retval EFI_SUCCESS The operation is completed successfully.
  596. @retval Other Errors Returned errors when creating Opcodes or updating the
  597. Hii form.
  598. **/
  599. EFI_STATUS
  600. WifiMgrRefreshHiddenList (
  601. IN WIFI_MGR_PRIVATE_DATA *Private
  602. )
  603. {
  604. EFI_STATUS Status;
  605. EFI_TPL OldTpl;
  606. UINTN Index;
  607. EFI_STRING_ID StringId;
  608. VOID *StartOpCodeHandle;
  609. VOID *EndOpCodeHandle;
  610. WIFI_HIDDEN_NETWORK_DATA *HiddenNetwork;
  611. LIST_ENTRY *Entry;
  612. if (Private == NULL) {
  613. return EFI_SUCCESS;
  614. }
  615. Status = WifiMgrCreateOpCode (
  616. LABEL_HIDDEN_NETWORK_ENTRY,
  617. &StartOpCodeHandle,
  618. &EndOpCodeHandle
  619. );
  620. if (EFI_ERROR (Status)) {
  621. return Status;
  622. }
  623. OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
  624. Index = 0;
  625. NET_LIST_FOR_EACH (Entry, &Private->HiddenNetworkList) {
  626. HiddenNetwork = NET_LIST_USER_STRUCT_S (
  627. Entry,
  628. WIFI_HIDDEN_NETWORK_DATA,
  629. Link,
  630. WIFI_MGR_HIDDEN_NETWORK_SIGNATURE
  631. );
  632. StringId = HiiSetString (Private->RegisteredHandle, 0, HiddenNetwork->SSId, NULL);
  633. HiiCreateCheckBoxOpCode (
  634. StartOpCodeHandle,
  635. (EFI_QUESTION_ID)(KEY_HIDDEN_NETWORK_ENTRY_BASE + Index),
  636. MANAGER_VARSTORE_ID,
  637. (UINT16)(HIDDEN_NETWORK_LIST_VAR_OFFSET + Index),
  638. StringId,
  639. 0,
  640. 0,
  641. 0,
  642. NULL
  643. );
  644. Index++;
  645. }
  646. Status = HiiUpdateForm (
  647. Private->RegisteredHandle, // HII handle
  648. &gWifiConfigFormSetGuid, // Formset GUID
  649. FORMID_HIDDEN_NETWORK_LIST, // Form ID
  650. StartOpCodeHandle, // Label for where to insert opcodes
  651. EndOpCodeHandle // Replace data
  652. );
  653. gBS->RestoreTPL (OldTpl);
  654. HiiFreeOpCodeHandle (StartOpCodeHandle);
  655. HiiFreeOpCodeHandle (EndOpCodeHandle);
  656. return Status;
  657. }
  658. /**
  659. Callback function for user to select a Nic.
  660. @param[in] Private The pointer to the global private data structure.
  661. @param[in] KeyValue The key value received from HII input.
  662. @retval EFI_NOT_FOUND The corresponding Nic is not found.
  663. @retval EFI_SUCCESS The operation is completed successfully.
  664. **/
  665. EFI_STATUS
  666. WifiMgrSelectNic (
  667. IN WIFI_MGR_PRIVATE_DATA *Private,
  668. IN EFI_QUESTION_ID KeyValue
  669. )
  670. {
  671. WIFI_MGR_DEVICE_DATA *Nic;
  672. UINT32 NicIndex;
  673. CHAR16 MacString[WIFI_MGR_MAX_MAC_STRING_LEN];
  674. NicIndex = KeyValue - KEY_MAC_ENTRY_BASE;
  675. Nic = WifiMgrGetNicByIndex (Private, NicIndex);
  676. if (Nic == NULL) {
  677. return EFI_NOT_FOUND;
  678. }
  679. Private->CurrentNic = Nic;
  680. WifiMgrMacAddrToStr (&Nic->MacAddress, sizeof (MacString), MacString);
  681. HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_MAC_ADDRESS), MacString, NULL);
  682. return EFI_SUCCESS;
  683. }
  684. /**
  685. Restore the NV data to be default.
  686. @param[in] Private The pointer to the global private data structure.
  687. @param[out] IfrNvData The IFR NV data.
  688. **/
  689. VOID
  690. WifiMgrCleanUserInput (
  691. IN WIFI_MGR_PRIVATE_DATA *Private
  692. )
  693. {
  694. Private->SecurityType = SECURITY_TYPE_NONE;
  695. Private->EapAuthMethod = EAP_AUTH_METHOD_TTLS;
  696. Private->EapSecondAuthMethod = EAP_SEAUTH_METHOD_MSCHAPV2;
  697. Private->FileType = FileTypeMax;
  698. }
  699. /**
  700. UI handle function when user select a network to connect.
  701. @param[in] Private The pointer to the global private data structure.
  702. @param[in] ProfileIndex The profile index user selected to connect.
  703. @retval EFI_INVALID_PARAMETER Nic is null.
  704. @retval EFI_NOT_FOUND Profile could not be found.
  705. @retval EFI_SUCCESS The operation is completed successfully.
  706. **/
  707. EFI_STATUS
  708. WifiMgrUserSelectProfileToConnect (
  709. IN WIFI_MGR_PRIVATE_DATA *Private,
  710. IN UINT32 ProfileIndex
  711. )
  712. {
  713. WIFI_MGR_NETWORK_PROFILE *Profile;
  714. WIFI_MGR_DEVICE_DATA *Nic;
  715. Nic = Private->CurrentNic;
  716. if (Nic == NULL) {
  717. return EFI_INVALID_PARAMETER;
  718. }
  719. //
  720. // Initialize the connection page
  721. //
  722. WifiMgrCleanUserInput (Private);
  723. Profile = WifiMgrGetProfileByProfileIndex (ProfileIndex, &Nic->ProfileList);
  724. if (Profile == NULL) {
  725. return EFI_NOT_FOUND;
  726. }
  727. Private->CurrentNic->UserSelectedProfile = Profile;
  728. return EFI_SUCCESS;
  729. }
  730. /**
  731. Record password from a HII input string.
  732. @param[in] Private The pointer to the global private data structure.
  733. @param[in] StringId The QuestionId received from HII input.
  734. @param[in] StringBuffer The unicode string buffer to store password.
  735. @param[in] StringBufferLen The len of unicode string buffer.
  736. @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
  737. @retval EFI_NOT_FOUND The password string is not found or invalid.
  738. @retval EFI_SUCCESS The operation is completed successfully.
  739. **/
  740. EFI_STATUS
  741. WifiMgrRecordPassword (
  742. IN WIFI_MGR_PRIVATE_DATA *Private,
  743. IN EFI_STRING_ID StringId,
  744. IN CHAR16 *StringBuffer,
  745. IN UINTN StringBufferLen
  746. )
  747. {
  748. CHAR16 *Password;
  749. if ((StringId == 0) || (StringBuffer == NULL) || (StringBufferLen <= 0)) {
  750. return EFI_INVALID_PARAMETER;
  751. }
  752. Password = HiiGetString (Private->RegisteredHandle, StringId, NULL);
  753. if (Password == NULL) {
  754. return EFI_NOT_FOUND;
  755. }
  756. if (StrLen (Password) > StringBufferLen) {
  757. FreePool (Password);
  758. return EFI_NOT_FOUND;
  759. }
  760. StrnCpyS (StringBuffer, StringBufferLen, Password, StrLen (Password));
  761. ZeroMem (Password, (StrLen (Password) + 1) * sizeof (CHAR16));
  762. FreePool (Password);
  763. //
  764. // Clean password in string package
  765. //
  766. HiiSetString (Private->RegisteredHandle, StringId, L"", NULL);
  767. return EFI_SUCCESS;
  768. }
  769. /**
  770. Update connection message on connect configuration page, and trigger related form refresh.
  771. @param[in] Nic The related Nic for updating message.
  772. @param[in] ConnectStateChanged The tag to tell if the connection state has been changed, only
  773. when the connection changes from "Connected" or "Disconnecting"
  774. to "Disconnected", or from "Disconnected" or "Connecting" to
  775. "Connected", this tag can be set as TRUE.
  776. @param[in] ConnectStatusMessage The message to show on connected status bar, if NULL, will
  777. use default message.
  778. **/
  779. VOID
  780. WifiMgrUpdateConnectMessage (
  781. IN WIFI_MGR_DEVICE_DATA *Nic,
  782. IN BOOLEAN ConnectStateChanged,
  783. IN EFI_STRING ConnectStatusMessage
  784. )
  785. {
  786. CHAR16 ConnectStatusStr[WIFI_STR_MAX_SIZE];
  787. WIFI_MGR_PRIVATE_DATA *Private;
  788. Private = Nic->Private;
  789. if ((Private == NULL) || (Private->CurrentNic != Nic)) {
  790. return;
  791. }
  792. //
  793. // Update Connection Status Bar
  794. //
  795. if (ConnectStatusMessage != NULL) {
  796. HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECT_STATUS), ConnectStatusMessage, NULL);
  797. } else {
  798. if (Nic->ConnectState == WifiMgrConnectedToAp) {
  799. UnicodeSPrint (
  800. ConnectStatusStr,
  801. sizeof (ConnectStatusStr),
  802. L"Connected to %s",
  803. Nic->CurrentOperateNetwork->SSId
  804. );
  805. HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECT_STATUS), ConnectStatusStr, NULL);
  806. } else if (Nic->ConnectState == WifiMgrDisconnected) {
  807. HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECT_STATUS), L"Disconnected", NULL);
  808. } else if (Nic->ConnectState == WifiMgrConnectingToAp) {
  809. UnicodeSPrint (
  810. ConnectStatusStr,
  811. sizeof (ConnectStatusStr),
  812. L"Connecting to %s ...",
  813. Nic->CurrentOperateNetwork->SSId
  814. );
  815. HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECT_STATUS), ConnectStatusStr, NULL);
  816. } else if (Nic->ConnectState == WifiMgrDisconnectingToAp) {
  817. UnicodeSPrint (
  818. ConnectStatusStr,
  819. sizeof (ConnectStatusStr),
  820. L"Disconnecting from %s ...",
  821. Nic->CurrentOperateNetwork->SSId
  822. );
  823. HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECT_STATUS), ConnectStatusStr, NULL);
  824. } else {
  825. return;
  826. }
  827. }
  828. //
  829. // Update Connect Button
  830. //
  831. if ((Nic->ConnectState == WifiMgrConnectedToAp) && (Nic->UserSelectedProfile == Nic->CurrentOperateNetwork)) {
  832. HiiSetString (
  833. Private->RegisteredHandle,
  834. STRING_TOKEN (STR_CONNECT_NOW),
  835. L"Disconnect from this Network",
  836. NULL
  837. );
  838. } else {
  839. HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECT_NOW), L"Connect to this Network", NULL);
  840. }
  841. gBS->SignalEvent (Private->ConnectFormRefreshEvent);
  842. //
  843. // Update Main Page and Network List
  844. //
  845. if (ConnectStateChanged) {
  846. if (Nic->ConnectState == WifiMgrConnectedToAp) {
  847. HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECTION_INFO), L"Connected to", NULL);
  848. HiiSetString (
  849. Private->RegisteredHandle,
  850. STRING_TOKEN (STR_CONNECTED_SSID),
  851. Nic->CurrentOperateNetwork->SSId,
  852. NULL
  853. );
  854. } else {
  855. HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECTION_INFO), L"Disconnected", NULL);
  856. HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_CONNECTED_SSID), L"", NULL);
  857. }
  858. gBS->SignalEvent (Private->NetworkListRefreshEvent);
  859. gBS->SignalEvent (Private->MainPageRefreshEvent);
  860. }
  861. }
  862. /**
  863. Convert the driver configuration data into the IFR data.
  864. @param[in] Private The pointer to the global private data structure.
  865. @param[out] IfrNvData The IFR NV data.
  866. @retval EFI_SUCCESS The operation is completed successfully.
  867. **/
  868. EFI_STATUS
  869. WifiMgrConvertConfigDataToIfrNvData (
  870. IN WIFI_MGR_PRIVATE_DATA *Private,
  871. OUT WIFI_MANAGER_IFR_NVDATA *IfrNvData
  872. )
  873. {
  874. //
  875. // Private shouldn't be NULL here, assert if Private is NULL.
  876. //
  877. ASSERT (Private != NULL);
  878. if (Private->CurrentNic != NULL) {
  879. IfrNvData->ProfileCount = Private->CurrentNic->AvailableCount;
  880. } else {
  881. IfrNvData->ProfileCount = 0;
  882. }
  883. return EFI_SUCCESS;
  884. }
  885. /**
  886. Convert the IFR data into the driver configuration data.
  887. @param[in] Private The pointer to the global private data structure.
  888. @param[in, out] IfrNvData The IFR NV data.
  889. @retval EFI_SUCCESS The operation is completed successfully.
  890. **/
  891. EFI_STATUS
  892. WifiMgrConvertIfrNvDataToConfigData (
  893. IN WIFI_MGR_PRIVATE_DATA *Private,
  894. IN OUT WIFI_MANAGER_IFR_NVDATA *IfrNvData
  895. )
  896. {
  897. return EFI_SUCCESS;
  898. }
  899. /**
  900. This function allows the caller to request the current
  901. configuration for one or more named elements. The resulting
  902. string is in <ConfigAltResp> format. Any and all alternative
  903. configuration strings shall also be appended to the end of the
  904. current configuration string. If they are, they must appear
  905. after the current configuration. They must contain the same
  906. routing (GUID, NAME, PATH) as the current configuration string.
  907. They must have an additional description indicating the type of
  908. alternative configuration the string represents,
  909. "ALTCFG=<StringToken>". That <StringToken> (when
  910. converted from Hex UNICODE to binary) is a reference to a
  911. string in the associated string pack.
  912. @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
  913. @param Request A null-terminated Unicode string in
  914. <ConfigRequest> format. Note that this
  915. includes the routing information as well as
  916. the configurable name / value pairs. It is
  917. invalid for this string to be in
  918. <MultiConfigRequest> format.
  919. If a NULL is passed in for the Request field,
  920. all of the settings being abstracted by this function
  921. will be returned in the Results field. In addition,
  922. if a ConfigHdr is passed in with no request elements,
  923. all of the settings being abstracted for that particular
  924. ConfigHdr reference will be returned in the Results Field.
  925. @param Progress On return, points to a character in the
  926. Request string. Points to the string's null
  927. terminator if request was successful. Points
  928. to the most recent "&" before the first
  929. failing name / value pair (or the beginning
  930. of the string if the failure is in the first
  931. name / value pair) if the request was not
  932. successful.
  933. @param Results A null-terminated Unicode string in
  934. <MultiConfigAltResp> format which has all values
  935. filled in for the names in the Request string.
  936. String to be allocated by the called function.
  937. @retval EFI_SUCCESS The Results string is filled with the
  938. values corresponding to all requested
  939. names.
  940. @retval EFI_OUT_OF_RESOURCES Not enough memory to store the
  941. parts of the results that must be
  942. stored awaiting possible future
  943. protocols.
  944. @retval EFI_NOT_FOUND Routing data doesn't match any
  945. known driver. Progress set to the
  946. first character in the routing header.
  947. Note: There is no requirement that the
  948. driver validate the routing data. It
  949. must skip the <ConfigHdr> in order to
  950. process the names.
  951. @retval EFI_INVALID_PARAMETER Illegal syntax. Progress set
  952. to most recent "&" before the
  953. error or the beginning of the
  954. string.
  955. @retval EFI_INVALID_PARAMETER Unknown name. Progress points
  956. to the & before the name in
  957. question.
  958. **/
  959. EFI_STATUS
  960. EFIAPI
  961. WifiMgrDxeHiiConfigAccessExtractConfig (
  962. IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
  963. IN CONST EFI_STRING Request,
  964. OUT EFI_STRING *Progress,
  965. OUT EFI_STRING *Results
  966. )
  967. {
  968. WIFI_MGR_PRIVATE_DATA *Private;
  969. WIFI_MANAGER_IFR_NVDATA *IfrNvData;
  970. EFI_STRING ConfigRequestHdr;
  971. EFI_STRING ConfigRequest;
  972. UINTN Size;
  973. BOOLEAN AllocatedRequest;
  974. UINTN BufferSize;
  975. EFI_STATUS Status;
  976. if ((This == NULL) || (Progress == NULL) || (Results == NULL)) {
  977. return EFI_INVALID_PARAMETER;
  978. }
  979. *Progress = Request;
  980. if ((Request != NULL) &&
  981. !HiiIsConfigHdrMatch (Request, &gWifiConfigFormSetGuid, mVendorStorageName))
  982. {
  983. return EFI_NOT_FOUND;
  984. }
  985. ConfigRequestHdr = NULL;
  986. ConfigRequest = NULL;
  987. AllocatedRequest = FALSE;
  988. Size = 0;
  989. Private = WIFI_MGR_PRIVATE_DATA_FROM_CONFIG_ACCESS (This);
  990. BufferSize = sizeof (WIFI_MANAGER_IFR_NVDATA);
  991. IfrNvData = AllocateZeroPool (BufferSize);
  992. if (IfrNvData == NULL) {
  993. return EFI_OUT_OF_RESOURCES;
  994. }
  995. WifiMgrConvertConfigDataToIfrNvData (Private, IfrNvData);
  996. ConfigRequest = Request;
  997. if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {
  998. //
  999. // Request has no request element, construct full request string.
  1000. // Allocate and fill a buffer large enough to hold the <ConfigHdr> template
  1001. // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator.
  1002. //
  1003. ConfigRequestHdr = HiiConstructConfigHdr (
  1004. &gWifiConfigFormSetGuid,
  1005. mVendorStorageName,
  1006. Private->DriverHandle
  1007. );
  1008. if (ConfigRequestHdr == NULL) {
  1009. FreePool (IfrNvData);
  1010. return EFI_OUT_OF_RESOURCES;
  1011. }
  1012. Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
  1013. ConfigRequest = AllocateZeroPool (Size);
  1014. if (ConfigRequest == NULL) {
  1015. FreePool (IfrNvData);
  1016. FreePool (ConfigRequestHdr);
  1017. return EFI_OUT_OF_RESOURCES;
  1018. }
  1019. AllocatedRequest = TRUE;
  1020. UnicodeSPrint (
  1021. ConfigRequest,
  1022. Size,
  1023. L"%s&OFFSET=0&WIDTH=%016LX",
  1024. ConfigRequestHdr,
  1025. (UINT64)BufferSize
  1026. );
  1027. FreePool (ConfigRequestHdr);
  1028. }
  1029. //
  1030. // Convert buffer data to <ConfigResp> by helper function BlockToConfig()
  1031. //
  1032. Status = gHiiConfigRouting->BlockToConfig (
  1033. gHiiConfigRouting,
  1034. ConfigRequest,
  1035. (UINT8 *)IfrNvData,
  1036. BufferSize,
  1037. Results,
  1038. Progress
  1039. );
  1040. FreePool (IfrNvData);
  1041. //
  1042. // Free the allocated config request string.
  1043. //
  1044. if (AllocatedRequest) {
  1045. FreePool (ConfigRequest);
  1046. ConfigRequest = NULL;
  1047. }
  1048. //
  1049. // Set Progress string to the original request string.
  1050. //
  1051. if (Request == NULL) {
  1052. *Progress = NULL;
  1053. } else if (StrStr (Request, L"OFFSET") == NULL) {
  1054. *Progress = Request + StrLen (Request);
  1055. }
  1056. return Status;
  1057. }
  1058. /**
  1059. This function applies changes in a driver's configuration.
  1060. Input is a Configuration, which has the routing data for this
  1061. driver followed by name / value configuration pairs. The driver
  1062. must apply those pairs to its configurable storage. If the
  1063. driver's configuration is stored in a linear block of data
  1064. and the driver's name / value pairs are in <BlockConfig>
  1065. format, it may use the ConfigToBlock helper function (above) to
  1066. simplify the job.
  1067. @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
  1068. @param Configuration A null-terminated Unicode string in
  1069. <ConfigString> format.
  1070. @param Progress A pointer to a string filled in with the
  1071. offset of the most recent '&' before the
  1072. first failing name / value pair (or the
  1073. beginn ing of the string if the failure
  1074. is in the first name / value pair) or
  1075. the terminating NULL if all was
  1076. successful.
  1077. @retval EFI_SUCCESS The results have been distributed or are
  1078. awaiting distribution.
  1079. @retval EFI_OUT_OF_RESOURCES Not enough memory to store the
  1080. parts of the results that must be
  1081. stored awaiting possible future
  1082. protocols.
  1083. @retval EFI_INVALID_PARAMETERS Passing in a NULL for the
  1084. Results parameter would result
  1085. in this type of error.
  1086. @retval EFI_NOT_FOUND Target for the specified routing data
  1087. was not found
  1088. **/
  1089. EFI_STATUS
  1090. EFIAPI
  1091. WifiMgrDxeHiiConfigAccessRouteConfig (
  1092. IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
  1093. IN CONST EFI_STRING Configuration,
  1094. OUT EFI_STRING *Progress
  1095. )
  1096. {
  1097. EFI_STATUS Status;
  1098. UINTN BufferSize;
  1099. WIFI_MGR_PRIVATE_DATA *Private;
  1100. WIFI_MANAGER_IFR_NVDATA *IfrNvData;
  1101. if ((Configuration == NULL) || (Progress == NULL)) {
  1102. return EFI_INVALID_PARAMETER;
  1103. }
  1104. IfrNvData = NULL;
  1105. *Progress = Configuration;
  1106. BufferSize = sizeof (WIFI_MANAGER_IFR_NVDATA);
  1107. Private = WIFI_MGR_PRIVATE_DATA_FROM_CONFIG_ACCESS (This);
  1108. if (!HiiIsConfigHdrMatch (Configuration, &gWifiConfigFormSetGuid, mVendorStorageName)) {
  1109. return EFI_NOT_FOUND;
  1110. }
  1111. IfrNvData = AllocateZeroPool (BufferSize);
  1112. if (IfrNvData == NULL) {
  1113. return EFI_OUT_OF_RESOURCES;
  1114. }
  1115. WifiMgrConvertConfigDataToIfrNvData (Private, IfrNvData);
  1116. Status = gHiiConfigRouting->ConfigToBlock (
  1117. gHiiConfigRouting,
  1118. Configuration,
  1119. (UINT8 *)IfrNvData,
  1120. &BufferSize,
  1121. Progress
  1122. );
  1123. if (EFI_ERROR (Status)) {
  1124. return Status;
  1125. }
  1126. Status = WifiMgrConvertIfrNvDataToConfigData (Private, IfrNvData);
  1127. ZeroMem (IfrNvData, sizeof (WIFI_MANAGER_IFR_NVDATA));
  1128. FreePool (IfrNvData);
  1129. return Status;
  1130. }
  1131. /**
  1132. This function is called to provide results data to the driver.
  1133. This data consists of a unique key that is used to identify
  1134. which data is either being passed back or being asked for.
  1135. @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
  1136. @param Action Specifies the type of action taken by the browser.
  1137. @param QuestionId A unique value which is sent to the original
  1138. exporting driver so that it can identify the type
  1139. of data to expect. The format of the data tends to
  1140. vary based on the opcode that generated the callback.
  1141. @param Type The type of value for the question.
  1142. @param Value A pointer to the data being sent to the original
  1143. exporting driver.
  1144. @param ActionRequest On return, points to the action requested by the
  1145. callback function.
  1146. @retval EFI_SUCCESS The callback successfully handled the action.
  1147. @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the
  1148. variable and its data.
  1149. @retval EFI_DEVICE_ERROR The variable could not be saved.
  1150. @retval EFI_UNSUPPORTED The specified Action is not supported by the
  1151. callback.
  1152. **/
  1153. EFI_STATUS
  1154. EFIAPI
  1155. WifiMgrDxeHiiConfigAccessCallback (
  1156. IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
  1157. IN EFI_BROWSER_ACTION Action,
  1158. IN EFI_QUESTION_ID QuestionId,
  1159. IN UINT8 Type,
  1160. IN OUT EFI_IFR_TYPE_VALUE *Value,
  1161. OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
  1162. )
  1163. {
  1164. EFI_STATUS Status;
  1165. EFI_INPUT_KEY Key;
  1166. UINTN BufferSize;
  1167. WIFI_MGR_PRIVATE_DATA *Private;
  1168. WIFI_MANAGER_IFR_NVDATA *IfrNvData;
  1169. EFI_DEVICE_PATH_PROTOCOL *FilePath;
  1170. WIFI_MGR_NETWORK_PROFILE *Profile;
  1171. WIFI_MGR_NETWORK_PROFILE *ProfileToConnect;
  1172. WIFI_HIDDEN_NETWORK_DATA *HiddenNetwork;
  1173. UINTN TempDataSize;
  1174. VOID *TempData;
  1175. LIST_ENTRY *Entry;
  1176. UINT32 Index;
  1177. UINT32 RemoveCount;
  1178. CHAR16 *TempPassword;
  1179. CHAR16 *ErrorMessage;
  1180. if ((Action != EFI_BROWSER_ACTION_FORM_OPEN) &&
  1181. (Action != EFI_BROWSER_ACTION_FORM_CLOSE) &&
  1182. (Action != EFI_BROWSER_ACTION_CHANGING) &&
  1183. (Action != EFI_BROWSER_ACTION_CHANGED) &&
  1184. (Action != EFI_BROWSER_ACTION_RETRIEVE))
  1185. {
  1186. return EFI_UNSUPPORTED;
  1187. }
  1188. if ((Value == NULL) || (ActionRequest == NULL)) {
  1189. return EFI_INVALID_PARAMETER;
  1190. }
  1191. Status = EFI_SUCCESS;
  1192. Private = WIFI_MGR_PRIVATE_DATA_FROM_CONFIG_ACCESS (This);
  1193. if (Private->CurrentNic == NULL) {
  1194. return EFI_DEVICE_ERROR;
  1195. }
  1196. //
  1197. // Retrieve uncommitted data from Browser
  1198. //
  1199. BufferSize = sizeof (WIFI_MANAGER_IFR_NVDATA);
  1200. IfrNvData = AllocateZeroPool (BufferSize);
  1201. if (IfrNvData == NULL) {
  1202. return EFI_OUT_OF_RESOURCES;
  1203. }
  1204. HiiGetBrowserData (&gWifiConfigFormSetGuid, mVendorStorageName, BufferSize, (UINT8 *)IfrNvData);
  1205. if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {
  1206. switch (QuestionId) {
  1207. case KEY_MAC_LIST:
  1208. Status = WifiMgrShowNicList (Private);
  1209. break;
  1210. case KEY_REFRESH_NETWORK_LIST:
  1211. if (Private->CurrentNic->UserSelectedProfile != NULL) {
  1212. Profile = Private->CurrentNic->UserSelectedProfile;
  1213. //
  1214. // Erase secrets since user has left Connection Page
  1215. // Connection Page may direct to Network List Page or Eap Configuration Page,
  1216. // secrets only need to be erased when head to Network List Page
  1217. //
  1218. WifiMgrCleanProfileSecrets (Profile);
  1219. Private->CurrentNic->UserSelectedProfile = NULL;
  1220. }
  1221. break;
  1222. case KEY_CONNECT_ACTION:
  1223. if (Private->CurrentNic->UserSelectedProfile == NULL) {
  1224. break;
  1225. }
  1226. Profile = Private->CurrentNic->UserSelectedProfile;
  1227. //
  1228. // Enter the network connection configuration page
  1229. // Recovery from restored data
  1230. //
  1231. if (HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_SSID), Profile->SSId, NULL) == 0) {
  1232. return EFI_OUT_OF_RESOURCES;
  1233. }
  1234. IfrNvData->SecurityType = Profile->SecurityType;
  1235. if (HiiSetString (
  1236. Private->RegisteredHandle,
  1237. STRING_TOKEN (STR_SECURITY_TYPE),
  1238. mSecurityType[IfrNvData->SecurityType],
  1239. NULL
  1240. ) == 0)
  1241. {
  1242. return EFI_OUT_OF_RESOURCES;
  1243. }
  1244. if ((IfrNvData->SecurityType == SECURITY_TYPE_WPA2_ENTERPRISE) ||
  1245. (IfrNvData->SecurityType == SECURITY_TYPE_WPA3_ENTERPRISE))
  1246. {
  1247. IfrNvData->EapAuthMethod = Profile->EapAuthMethod;
  1248. IfrNvData->EapSecondAuthMethod = Profile->EapSecondAuthMethod;
  1249. StrCpyS (IfrNvData->EapIdentity, EAP_IDENTITY_SIZE, Profile->EapIdentity);
  1250. }
  1251. break;
  1252. case KEY_ENROLLED_CERT_NAME:
  1253. if (Private->CurrentNic->UserSelectedProfile == NULL) {
  1254. break;
  1255. }
  1256. Profile = Private->CurrentNic->UserSelectedProfile;
  1257. //
  1258. // Enter the key enrollment page
  1259. // For TTLS and PEAP, only CA cert needs to be cared
  1260. //
  1261. if (Private->FileType == FileTypeCACert) {
  1262. if (Profile->CACertData != NULL) {
  1263. HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_EAP_ENROLLED_CERT_NAME), Profile->CACertName, NULL);
  1264. } else {
  1265. HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_EAP_ENROLLED_CERT_NAME), L"", NULL);
  1266. }
  1267. } else if (Private->FileType == FileTypeClientCert) {
  1268. if (Profile->ClientCertData != NULL) {
  1269. HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_EAP_ENROLLED_CERT_NAME), Profile->ClientCertName, NULL);
  1270. } else {
  1271. HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_EAP_ENROLLED_CERT_NAME), L"", NULL);
  1272. }
  1273. }
  1274. break;
  1275. case KEY_ENROLLED_PRIVATE_KEY_NAME:
  1276. if (Private->CurrentNic->UserSelectedProfile == NULL) {
  1277. break;
  1278. }
  1279. Profile = Private->CurrentNic->UserSelectedProfile;
  1280. if (Profile->PrivateKeyData != NULL) {
  1281. HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_EAP_ENROLLED_PRIVATE_KEY_NAME), Profile->PrivateKeyName, NULL);
  1282. } else {
  1283. HiiSetString (Private->RegisteredHandle, STRING_TOKEN (STR_EAP_ENROLLED_PRIVATE_KEY_NAME), L"", NULL);
  1284. }
  1285. break;
  1286. default:
  1287. break;
  1288. }
  1289. } else if (Action == EFI_BROWSER_ACTION_FORM_CLOSE) {
  1290. switch (QuestionId) {
  1291. case KEY_CONNECT_ACTION:
  1292. if (Private->CurrentNic->UserSelectedProfile == NULL) {
  1293. break;
  1294. }
  1295. Profile = Private->CurrentNic->UserSelectedProfile;
  1296. //
  1297. // Restore User Config Data for Page recovery
  1298. //
  1299. if ((IfrNvData->SecurityType == SECURITY_TYPE_WPA2_ENTERPRISE) ||
  1300. (IfrNvData->SecurityType == SECURITY_TYPE_WPA3_ENTERPRISE))
  1301. {
  1302. Profile->EapAuthMethod = IfrNvData->EapAuthMethod;
  1303. Profile->EapSecondAuthMethod = IfrNvData->EapSecondAuthMethod;
  1304. StrCpyS (Profile->EapIdentity, EAP_IDENTITY_SIZE, IfrNvData->EapIdentity);
  1305. }
  1306. break;
  1307. default:
  1308. break;
  1309. }
  1310. } else if (Action == EFI_BROWSER_ACTION_CHANGING) {
  1311. switch (QuestionId) {
  1312. case KEY_NETWORK_LIST:
  1313. //
  1314. // User triggered a scan process.
  1315. //
  1316. Private->CurrentNic->OneTimeScanRequest = TRUE;
  1317. break;
  1318. case KEY_PASSWORD_CONNECT_NETWORK:
  1319. case KEY_EAP_PASSWORD_CONNECT_NETWORK:
  1320. case KEY_PRIVATE_KEY_PASSWORD:
  1321. if (Private->CurrentNic->UserSelectedProfile == NULL) {
  1322. break;
  1323. }
  1324. Profile = Private->CurrentNic->UserSelectedProfile;
  1325. if (QuestionId == KEY_PASSWORD_CONNECT_NETWORK) {
  1326. TempPassword = Profile->Password;
  1327. } else if (QuestionId == KEY_EAP_PASSWORD_CONNECT_NETWORK) {
  1328. TempPassword = Profile->EapPassword;
  1329. } else {
  1330. TempPassword = Profile->PrivateKeyPassword;
  1331. }
  1332. Status = WifiMgrRecordPassword (Private, Value->string, TempPassword, PASSWORD_STORAGE_SIZE);
  1333. if (EFI_ERROR (Status)) {
  1334. DEBUG ((DEBUG_ERROR, "[WiFi Connection Manager] Error: Failed to input password!"));
  1335. break;
  1336. }
  1337. //
  1338. // This password is not a new created password, so no need to confirm.
  1339. //
  1340. Status = EFI_NOT_FOUND;
  1341. break;
  1342. case KEY_CONNECT_ACTION:
  1343. ErrorMessage = NULL;
  1344. ProfileToConnect = NULL;
  1345. if (Private->CurrentNic->UserSelectedProfile == NULL) {
  1346. break;
  1347. }
  1348. Profile = Private->CurrentNic->UserSelectedProfile;
  1349. if ((Private->CurrentNic->ConnectState == WifiMgrDisconnected) ||
  1350. (Profile != Private->CurrentNic->CurrentOperateNetwork))
  1351. {
  1352. //
  1353. // When this network is not currently connected, pend it to connect.
  1354. //
  1355. if (Profile->AKMSuiteSupported && Profile->CipherSuiteSupported) {
  1356. if ((Profile->SecurityType == SECURITY_TYPE_NONE) ||
  1357. (Profile->SecurityType == SECURITY_TYPE_WPA2_PERSONAL) ||
  1358. (Profile->SecurityType == SECURITY_TYPE_WPA3_PERSONAL))
  1359. {
  1360. //
  1361. // For Open network, connect directly.
  1362. //
  1363. ProfileToConnect = Profile;
  1364. } else if ((Profile->SecurityType == SECURITY_TYPE_WPA2_ENTERPRISE) ||
  1365. (Profile->SecurityType == SECURITY_TYPE_WPA3_ENTERPRISE))
  1366. {
  1367. //
  1368. // For WPA/WPA2-Enterprise network, conduct eap configuration first.
  1369. // Only EAP-TLS, TTLS and PEAP is supported now!
  1370. //
  1371. Profile->EapAuthMethod = IfrNvData->EapAuthMethod;
  1372. StrCpyS (Profile->EapIdentity, EAP_IDENTITY_SIZE, IfrNvData->EapIdentity);
  1373. if ((IfrNvData->EapAuthMethod == EAP_AUTH_METHOD_TTLS) || (IfrNvData->EapAuthMethod == EAP_AUTH_METHOD_PEAP)) {
  1374. Profile->EapSecondAuthMethod = IfrNvData->EapSecondAuthMethod;
  1375. ProfileToConnect = Profile;
  1376. } else if (IfrNvData->EapAuthMethod == EAP_AUTH_METHOD_TLS) {
  1377. ProfileToConnect = Profile;
  1378. } else {
  1379. ErrorMessage = L"ERROR: Only EAP-TLS, TTLS or PEAP is supported now!";
  1380. }
  1381. } else {
  1382. ErrorMessage = L"ERROR: Can't connect to this network!";
  1383. }
  1384. } else {
  1385. ErrorMessage = L"ERROR: This network is not supported!";
  1386. }
  1387. if (ErrorMessage != NULL) {
  1388. CreatePopUp (
  1389. EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
  1390. &Key,
  1391. ErrorMessage,
  1392. NULL
  1393. );
  1394. }
  1395. if (ProfileToConnect != NULL) {
  1396. Private->CurrentNic->OneTimeConnectRequest = TRUE;
  1397. Private->CurrentNic->ConnectPendingNetwork = ProfileToConnect;
  1398. }
  1399. } else if (Private->CurrentNic->ConnectState == WifiMgrConnectedToAp) {
  1400. //
  1401. // This network is currently connected, just disconnect from it.
  1402. //
  1403. Private->CurrentNic->OneTimeDisconnectRequest = TRUE;
  1404. Private->CurrentNic->HasDisconnectPendingNetwork = TRUE;
  1405. }
  1406. break;
  1407. case KEY_ENROLL_CA_CERT_CONNECT_NETWORK:
  1408. Private->FileType = FileTypeCACert;
  1409. break;
  1410. case KEY_ENROLL_CLIENT_CERT_CONNECT_NETWORK:
  1411. Private->FileType = FileTypeClientCert;
  1412. break;
  1413. case KEY_EAP_ENROLL_PRIVATE_KEY_FROM_FILE:
  1414. FilePath = NULL;
  1415. ChooseFile (NULL, NULL, NULL, &FilePath);
  1416. if (FilePath != NULL) {
  1417. UpdatePrivateKeyFromFile (Private, FilePath);
  1418. FreePool (FilePath);
  1419. }
  1420. break;
  1421. case KEY_EAP_ENROLL_CERT_FROM_FILE:
  1422. //
  1423. // User will select a cert file from File Explore
  1424. //
  1425. FilePath = NULL;
  1426. ChooseFile (NULL, NULL, NULL, &FilePath);
  1427. if (FilePath != NULL) {
  1428. UpdateCAFromFile (Private, FilePath);
  1429. FreePool (FilePath);
  1430. }
  1431. break;
  1432. case KEY_SAVE_PRIVATE_KEY_TO_MEM:
  1433. if ((Private->FileContext != NULL) && (Private->FileContext->FHandle != NULL) &&
  1434. (Private->CurrentNic->UserSelectedProfile != NULL))
  1435. {
  1436. //
  1437. // Read Private Key file to Buffer
  1438. //
  1439. Profile = Private->CurrentNic->UserSelectedProfile;
  1440. if (Profile->PrivateKeyData != NULL) {
  1441. ZeroMem (Profile->PrivateKeyData, Profile->PrivateKeyDataSize);
  1442. FreePool (Profile->PrivateKeyData);
  1443. Profile->PrivateKeyData = NULL;
  1444. }
  1445. Status = WifiMgrReadFileToBuffer (
  1446. Private->FileContext,
  1447. &TempData,
  1448. &TempDataSize
  1449. );
  1450. if (EFI_ERROR (Status)) {
  1451. CreatePopUp (
  1452. EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
  1453. &Key,
  1454. L"ERROR: Can't read this private key file!",
  1455. NULL
  1456. );
  1457. } else {
  1458. ASSERT (Private->FileContext->FileName != NULL);
  1459. Profile->PrivateKeyData = TempData;
  1460. Profile->PrivateKeyDataSize = TempDataSize;
  1461. StrCpyS (Profile->PrivateKeyName, WIFI_FILENAME_STR_MAX_SIZE, Private->FileContext->FileName);
  1462. DEBUG ((
  1463. DEBUG_INFO,
  1464. "[WiFi Connection Manager] Private Key: %s has been enrolled! Size: %d\n",
  1465. Profile->PrivateKeyName,
  1466. Profile->PrivateKeyDataSize
  1467. ));
  1468. }
  1469. }
  1470. break;
  1471. case KEY_SAVE_CERT_TO_MEM:
  1472. if ((Private->FileContext != NULL) && (Private->FileContext->FHandle != NULL) &&
  1473. (Private->CurrentNic->UserSelectedProfile != NULL))
  1474. {
  1475. //
  1476. // Read Cert file to Buffer
  1477. //
  1478. Profile = Private->CurrentNic->UserSelectedProfile;
  1479. if (Private->FileType == FileTypeCACert) {
  1480. if (Profile->CACertData != NULL) {
  1481. ZeroMem (Profile->CACertData, Profile->CACertSize);
  1482. FreePool (Profile->CACertData);
  1483. Profile->CACertData = NULL;
  1484. }
  1485. } else if (Private->FileType == FileTypeClientCert) {
  1486. if (Profile->ClientCertData != NULL) {
  1487. ZeroMem (Profile->ClientCertData, Profile->ClientCertSize);
  1488. FreePool (Profile->ClientCertData);
  1489. Profile->ClientCertData = NULL;
  1490. }
  1491. } else {
  1492. break;
  1493. }
  1494. Status = WifiMgrReadFileToBuffer (
  1495. Private->FileContext,
  1496. &TempData,
  1497. &TempDataSize
  1498. );
  1499. if (EFI_ERROR (Status)) {
  1500. CreatePopUp (
  1501. EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
  1502. &Key,
  1503. L"ERROR: Can't read this certificate file!",
  1504. NULL
  1505. );
  1506. } else {
  1507. ASSERT (Private->FileContext->FileName != NULL);
  1508. if (Private->FileType == FileTypeCACert) {
  1509. Profile->CACertData = TempData;
  1510. Profile->CACertSize = TempDataSize;
  1511. StrCpyS (Profile->CACertName, WIFI_FILENAME_STR_MAX_SIZE, Private->FileContext->FileName);
  1512. DEBUG ((
  1513. DEBUG_INFO,
  1514. "[WiFi Connection Manager] CA Cert: %s has been enrolled! Size: %d\n",
  1515. Profile->CACertName,
  1516. Profile->CACertSize
  1517. ));
  1518. } else {
  1519. Profile->ClientCertData = TempData;
  1520. Profile->ClientCertSize = TempDataSize;
  1521. StrCpyS (Profile->ClientCertName, WIFI_FILENAME_STR_MAX_SIZE, Private->FileContext->FileName);
  1522. DEBUG ((
  1523. DEBUG_INFO,
  1524. "[WiFi Connection Manager] Client Cert: %s has been enrolled! Size: %d\n",
  1525. Profile->ClientCertName,
  1526. Profile->ClientCertSize
  1527. ));
  1528. }
  1529. }
  1530. }
  1531. break;
  1532. case KEY_ADD_HIDDEN_NETWORK:
  1533. //
  1534. // Add a Hidden Network
  1535. //
  1536. if ((StrLen (IfrNvData->SSId) < SSID_MIN_LEN) ||
  1537. (Private->HiddenNetworkCount >= HIDDEN_NETWORK_LIST_COUNT_MAX))
  1538. {
  1539. Status = EFI_ABORTED;
  1540. break;
  1541. } else {
  1542. //
  1543. // Check if this SSId is already in Hidden Network List
  1544. //
  1545. NET_LIST_FOR_EACH (Entry, &Private->HiddenNetworkList) {
  1546. HiddenNetwork = NET_LIST_USER_STRUCT_S (
  1547. Entry,
  1548. WIFI_HIDDEN_NETWORK_DATA,
  1549. Link,
  1550. WIFI_MGR_HIDDEN_NETWORK_SIGNATURE
  1551. );
  1552. if (StrCmp (HiddenNetwork->SSId, IfrNvData->SSId) == 0) {
  1553. Status = EFI_ABORTED;
  1554. break;
  1555. }
  1556. }
  1557. }
  1558. HiddenNetwork = (WIFI_HIDDEN_NETWORK_DATA *)AllocateZeroPool (sizeof (WIFI_HIDDEN_NETWORK_DATA));
  1559. if (HiddenNetwork == NULL) {
  1560. Status = EFI_OUT_OF_RESOURCES;
  1561. break;
  1562. }
  1563. HiddenNetwork->Signature = WIFI_MGR_HIDDEN_NETWORK_SIGNATURE;
  1564. StrCpyS (HiddenNetwork->SSId, SSID_STORAGE_SIZE, IfrNvData->SSId);
  1565. InsertTailList (&Private->HiddenNetworkList, &HiddenNetwork->Link);
  1566. Private->HiddenNetworkCount++;
  1567. WifiMgrRefreshHiddenList (Private);
  1568. break;
  1569. case KEY_REMOVE_HIDDEN_NETWORK:
  1570. //
  1571. // Remove Hidden Networks
  1572. //
  1573. Entry = GetFirstNode (&Private->HiddenNetworkList);
  1574. RemoveCount = 0;
  1575. for (Index = 0; Index < Private->HiddenNetworkCount; Index++) {
  1576. if (IfrNvData->HiddenNetworkList[Index] != 0) {
  1577. HiddenNetwork = NET_LIST_USER_STRUCT_S (Entry, WIFI_HIDDEN_NETWORK_DATA, Link, WIFI_MGR_HIDDEN_NETWORK_SIGNATURE);
  1578. Entry = RemoveEntryList (Entry);
  1579. RemoveCount++;
  1580. FreePool (HiddenNetwork);
  1581. } else {
  1582. Entry = GetNextNode (&Private->HiddenNetworkList, Entry);
  1583. }
  1584. }
  1585. Private->HiddenNetworkCount -= RemoveCount;
  1586. WifiMgrRefreshHiddenList (Private);
  1587. break;
  1588. default:
  1589. if ((QuestionId >= KEY_MAC_ENTRY_BASE) && (QuestionId < KEY_MAC_ENTRY_BASE + Private->NicCount)) {
  1590. //
  1591. // User selects a wireless NIC.
  1592. //
  1593. Status = WifiMgrSelectNic (Private, QuestionId);
  1594. if (EFI_ERROR (Status)) {
  1595. CreatePopUp (
  1596. EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
  1597. &Key,
  1598. L"ERROR: Fail to operate the wireless NIC!",
  1599. NULL
  1600. );
  1601. }
  1602. } else if (Private->CurrentNic != NULL) {
  1603. if ((QuestionId >= KEY_AVAILABLE_NETWORK_ENTRY_BASE) &&
  1604. (QuestionId <= KEY_AVAILABLE_NETWORK_ENTRY_BASE + Private->CurrentNic->MaxProfileIndex))
  1605. {
  1606. Status = WifiMgrUserSelectProfileToConnect (Private, QuestionId - KEY_AVAILABLE_NETWORK_ENTRY_BASE);
  1607. if (!EFI_ERROR (Status)) {
  1608. WifiMgrUpdateConnectMessage (Private->CurrentNic, FALSE, NULL);
  1609. }
  1610. }
  1611. if (EFI_ERROR (Status)) {
  1612. CreatePopUp (
  1613. EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
  1614. &Key,
  1615. L"ERROR: Fail to operate this profile!",
  1616. NULL
  1617. );
  1618. }
  1619. }
  1620. break;
  1621. }
  1622. } else if (Action == EFI_BROWSER_ACTION_CHANGED) {
  1623. switch (QuestionId) {
  1624. case KEY_SAVE_CERT_TO_MEM:
  1625. case KEY_SAVE_PRIVATE_KEY_TO_MEM:
  1626. *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;
  1627. break;
  1628. case KEY_NO_SAVE_CERT_TO_MEM:
  1629. case KEY_NO_SAVE_PRIVATE_KEY_TO_MEM:
  1630. *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;
  1631. break;
  1632. default:
  1633. *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY;
  1634. break;
  1635. }
  1636. } else if (Action == EFI_BROWSER_ACTION_RETRIEVE) {
  1637. switch (QuestionId) {
  1638. case KEY_REFRESH_NETWORK_LIST:
  1639. WifiMgrRefreshNetworkList (Private, IfrNvData);
  1640. break;
  1641. default:
  1642. break;
  1643. }
  1644. }
  1645. if (!EFI_ERROR (Status)) {
  1646. //
  1647. // Pass changed uncommitted data back to Form Browser.
  1648. //
  1649. BufferSize = sizeof (WIFI_MANAGER_IFR_NVDATA);
  1650. HiiSetBrowserData (&gWifiConfigFormSetGuid, mVendorStorageName, BufferSize, (UINT8 *)IfrNvData, NULL);
  1651. }
  1652. ZeroMem (IfrNvData, sizeof (WIFI_MANAGER_IFR_NVDATA));
  1653. FreePool (IfrNvData);
  1654. return Status;
  1655. }
  1656. /**
  1657. Initialize the WiFi configuration form.
  1658. @param[in] Private The pointer to the global private data structure.
  1659. @retval EFI_SUCCESS The configuration form is initialized.
  1660. @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
  1661. @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
  1662. @retval Other Erros Returned Errors when installing protocols.
  1663. **/
  1664. EFI_STATUS
  1665. WifiMgrDxeConfigFormInit (
  1666. WIFI_MGR_PRIVATE_DATA *Private
  1667. )
  1668. {
  1669. EFI_STATUS Status;
  1670. if (Private == NULL) {
  1671. return EFI_INVALID_PARAMETER;
  1672. }
  1673. Private->ConfigAccess.ExtractConfig = WifiMgrDxeHiiConfigAccessExtractConfig;
  1674. Private->ConfigAccess.RouteConfig = WifiMgrDxeHiiConfigAccessRouteConfig;
  1675. Private->ConfigAccess.Callback = WifiMgrDxeHiiConfigAccessCallback;
  1676. //
  1677. // Install Device Path Protocol and Config Access protocol to driver handle.
  1678. //
  1679. Status = gBS->InstallMultipleProtocolInterfaces (
  1680. &Private->DriverHandle,
  1681. &gEfiDevicePathProtocolGuid,
  1682. &mWifiMgrDxeHiiVendorDevicePath,
  1683. &gEfiHiiConfigAccessProtocolGuid,
  1684. &Private->ConfigAccess,
  1685. NULL
  1686. );
  1687. if (EFI_ERROR (Status)) {
  1688. return Status;
  1689. }
  1690. //
  1691. // Publish our HII data.
  1692. //
  1693. Private->RegisteredHandle = HiiAddPackages (
  1694. &gWifiConfigFormSetGuid,
  1695. Private->DriverHandle,
  1696. WifiConnectionManagerDxeStrings,
  1697. WifiConnectionManagerDxeBin,
  1698. NULL
  1699. );
  1700. if (Private->RegisteredHandle == NULL) {
  1701. gBS->UninstallMultipleProtocolInterfaces (
  1702. Private->DriverHandle,
  1703. &gEfiDevicePathProtocolGuid,
  1704. &mWifiMgrDxeHiiVendorDevicePath,
  1705. &gEfiHiiConfigAccessProtocolGuid,
  1706. &Private->ConfigAccess,
  1707. NULL
  1708. );
  1709. return EFI_OUT_OF_RESOURCES;
  1710. }
  1711. Private->FileContext = AllocateZeroPool (sizeof (WIFI_MGR_FILE_CONTEXT));
  1712. if (Private->FileContext == NULL) {
  1713. return EFI_OUT_OF_RESOURCES;
  1714. }
  1715. return EFI_SUCCESS;
  1716. }
  1717. /**
  1718. Unload the WiFi configuration form.
  1719. @param[in] Private The pointer to the global private data structure.
  1720. @retval EFI_SUCCESS The configuration form is unloaded successfully.
  1721. @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
  1722. @retval Other Errors Returned Erros when uninstalling protocols.
  1723. **/
  1724. EFI_STATUS
  1725. WifiMgrDxeConfigFormUnload (
  1726. WIFI_MGR_PRIVATE_DATA *Private
  1727. )
  1728. {
  1729. EFI_STATUS Status;
  1730. if (Private == NULL) {
  1731. return EFI_INVALID_PARAMETER;
  1732. }
  1733. if (Private->FileContext != NULL) {
  1734. if (Private->FileContext->FHandle != NULL) {
  1735. Private->FileContext->FHandle->Close (Private->FileContext->FHandle);
  1736. }
  1737. if (Private->FileContext->FileName != NULL) {
  1738. FreePool (Private->FileContext->FileName);
  1739. }
  1740. FreePool (Private->FileContext);
  1741. }
  1742. HiiRemovePackages (Private->RegisteredHandle);
  1743. Status = gBS->UninstallMultipleProtocolInterfaces (
  1744. Private->DriverHandle,
  1745. &gEfiDevicePathProtocolGuid,
  1746. &mWifiMgrDxeHiiVendorDevicePath,
  1747. &gEfiHiiConfigAccessProtocolGuid,
  1748. &Private->ConfigAccess,
  1749. NULL
  1750. );
  1751. return Status;
  1752. }