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