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