]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
ShellPkg: Prevent StrnCpy from overwriting null terminator when source is larger...
[mirror_edk2.git] / ShellPkg / Library / UefiShellNetwork1CommandsLib / Ifconfig.c
CommitLineData
68fb0527 1/** @file\r
2 The implementation for ifcommand shell command.\r
3\r
891e9f05 4 Copyright (c) 2013 Hewlett-Packard Development Company, L.P.\r
035da677 5 Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
68fb0527 6\r
7 This program and the accompanying materials\r
8 are licensed and made available under the terms and conditions of the BSD License\r
9 which accompanies this distribution. The full text of the license may be found at\r
10 http://opensource.org/licenses/bsd-license.php.\r
11\r
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14**/\r
15\r
16#include "UefiShellNetwork1CommandsLib.h"\r
17\r
18#define NIC_ITEM_CONFIG_SIZE (sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * MAX_IP4_CONFIG_IN_VARIABLE)\r
19#define EFI_IP4_TO_U32(EfiIpAddr) (*(IP4_ADDR*)((EfiIpAddr).Addr))\r
20\r
21BOOLEAN mIp4ConfigExist = FALSE;\r
22STATIC EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRouting = NULL;\r
23\r
a1d4bfcc 24STATIC CONST UINTN SecondsToNanoSeconds = 10000000;\r
68fb0527 25STATIC CONST CHAR16 DhcpString[5] = L"DHCP";\r
26STATIC CONST CHAR16 StaticString[7] = L"STATIC";\r
27STATIC CONST CHAR16 PermanentString[10] = L"PERMANENT";\r
28\r
29typedef struct {\r
30 LIST_ENTRY Link;\r
31 EFI_HANDLE Handle;\r
32 NIC_ADDR NicAddress;\r
33 CHAR16 Name[IP4_NIC_NAME_LENGTH];\r
34 BOOLEAN MediaPresentSupported;\r
35 BOOLEAN MediaPresent;\r
36 EFI_IP4_CONFIG_PROTOCOL *Ip4Config;\r
37 NIC_IP4_CONFIG_INFO *ConfigInfo;\r
38} NIC_INFO;\r
39\r
40typedef struct {\r
41 EFI_IP_ADDRESS DestIp;\r
42 EFI_MAC_ADDRESS DestMac;\r
43 EFI_IP_ADDRESS LocalIp;\r
44 EFI_MAC_ADDRESS LocalMac;\r
45 UINT8 MacLen;\r
46 EFI_EVENT OnResolved;\r
47 BOOLEAN Duplicate;\r
48} ARP_REQUEST;\r
49\r
50STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
51 {L"-c", TypeValue},\r
52 {L"-l", TypeValue},\r
53 {L"-s", TypeMaxValue},\r
54 {NULL, TypeMax}\r
55 };\r
56\r
57STATIC LIST_ENTRY NicInfoList;\r
58STATIC BOOLEAN ArpResolved;\r
59STATIC BOOLEAN mTimeout;\r
60\r
61/**\r
62 Count the space delimited items in a string.\r
63\r
64 @param[in] String A pointer to the string to count.\r
65\r
66 @return The number of space-delimited items.\r
67 @retval 0xFF an error occured.\r
68**/\r
69UINT8\r
70EFIAPI\r
71CountSubItems (\r
72 IN CONST CHAR16 *String\r
73 )\r
74{\r
75 CONST CHAR16 *Walker;\r
76 UINT8 Count;\r
77\r
78 if (String == NULL || *String == CHAR_NULL) {\r
79 return (0xFF);\r
80 }\r
81\r
82 for (Walker = String, Count = 0 ; Walker != NULL && *Walker != CHAR_NULL ; Walker = (StrStr(Walker, L" ")==NULL?NULL:StrStr(Walker, L" ")+1), Count++);\r
83 return (Count);\r
84}\r
85\r
86/**\r
87 Find the NIC_INFO by the specified nic name.\r
88\r
89 @param[in] Name The pointer to the string containing the NIC name.\r
90 \r
91 @return The pointer to the NIC_INFO if there is a NIC_INFO named by Name.\r
92 @retval NULL No NIC_INFO was found for Name.\r
93**/\r
94NIC_INFO*\r
95EFIAPI\r
96IfconfigFindNicByName (\r
97 IN CONST CHAR16 *Name\r
98 )\r
99{\r
100 LIST_ENTRY *Entry;\r
101 LIST_ENTRY *NextEntry;\r
102 NIC_INFO *Info;\r
103 CHAR16 *TempString;\r
104\r
105 NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {\r
106 Info = BASE_CR (Entry, NIC_INFO, Link);\r
107 TempString = (CHAR16*)Info->Name;\r
108\r
109 if (StringNoCaseCompare (&Name, &TempString) == 0) {\r
110 return Info;\r
111 }\r
112 }\r
113\r
114 return NULL;\r
115}\r
116\r
117/**\r
118 Tests whether a child handle is a child device of the controller.\r
119\r
120 @param[in] ControllerHandle A handle for a (parent) controller to test.\r
121 @param[in] ChildHandle A child handle to test.\r
122 @param[in] ProtocolGuid Supplies the protocol that the child controller\r
123 opens on its parent controller.\r
124\r
125 @retval EFI_SUCCESS ChildHandle is a child of the ControllerHandle.\r
126 @retval EFI_UNSUPPORTED ChildHandle is not a child of the ControllerHandle.\r
127**/\r
128EFI_STATUS\r
129EFIAPI\r
130TestChildHandle (\r
131 IN CONST EFI_HANDLE ControllerHandle,\r
132 IN CONST EFI_HANDLE ChildHandle,\r
133 IN CONST EFI_GUID *ProtocolGuid\r
134 )\r
135{\r
136 EFI_STATUS Status;\r
137 EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;\r
138 UINTN EntryCount;\r
139 UINTN Index;\r
140\r
141 ASSERT (ProtocolGuid != NULL);\r
142\r
143 //\r
144 // Retrieve the list of agents that are consuming the specific protocol\r
145 // on ControllerHandle.\r
146 //\r
147 Status = gBS->OpenProtocolInformation (\r
148 ControllerHandle,\r
149 (EFI_GUID *) ProtocolGuid,\r
150 &OpenInfoBuffer,\r
151 &EntryCount\r
152 );\r
153 if (EFI_ERROR (Status)) {\r
154 return EFI_UNSUPPORTED;\r
155 }\r
156\r
157 //\r
158 // Inspect if ChildHandle is one of the agents.\r
159 //\r
160 Status = EFI_UNSUPPORTED;\r
161 for (Index = 0; Index < EntryCount; Index++) {\r
162 if ((OpenInfoBuffer[Index].ControllerHandle == ChildHandle) &&\r
163 (OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
164 Status = EFI_SUCCESS;\r
165 break;\r
166 }\r
167 }\r
168\r
169 FreePool (OpenInfoBuffer);\r
170 return Status;\r
171}\r
172\r
173/**\r
174 Get the child handle of the NIC handle.\r
175\r
176 @param[in] Controller Routing information: GUID.\r
a1d4bfcc 177 @param[out] ChildHandle Returned child handle.\r
68fb0527 178\r
179 @retval EFI_SUCCESS Successfully to get child handle.\r
180**/\r
181EFI_STATUS \r
182GetChildHandle (\r
183 IN EFI_HANDLE Controller,\r
184 OUT EFI_HANDLE *ChildHandle\r
185 )\r
186{\r
187 EFI_STATUS Status;\r
188 EFI_HANDLE *Handles;\r
189 UINTN HandleCount;\r
190 UINTN Index;\r
191 EFI_DEVICE_PATH_PROTOCOL *ChildDeviceDevicePath;\r
192 VENDOR_DEVICE_PATH *VendorDeviceNode;\r
193\r
194 //\r
195 // Locate all EFI Hii Config Access protocols\r
196 //\r
197 Status = gBS->LocateHandleBuffer (\r
198 ByProtocol,\r
199 &gEfiHiiConfigAccessProtocolGuid,\r
200 NULL,\r
201 &HandleCount,\r
202 &Handles\r
203 );\r
204 if (EFI_ERROR (Status) || (HandleCount == 0)) {\r
205 return Status;\r
206 }\r
207\r
208 Status = EFI_NOT_FOUND;\r
209\r
210 for (Index = 0; Index < HandleCount; Index++) {\r
211 \r
212 Status = TestChildHandle (Controller, Handles[Index], &gEfiManagedNetworkServiceBindingProtocolGuid);\r
213 if (!EFI_ERROR (Status)) {\r
214 //\r
215 // Get device path on the child handle\r
216 //\r
217 Status = gBS->HandleProtocol (\r
218 Handles[Index],\r
219 &gEfiDevicePathProtocolGuid,\r
220 (VOID **) &ChildDeviceDevicePath\r
221 );\r
222 \r
223 if (!EFI_ERROR (Status)) {\r
224 while (!IsDevicePathEnd (ChildDeviceDevicePath)) {\r
225 ChildDeviceDevicePath = NextDevicePathNode (ChildDeviceDevicePath);\r
226 //\r
227 // Parse one instance\r
228 //\r
229 if (ChildDeviceDevicePath->Type == HARDWARE_DEVICE_PATH && \r
230 ChildDeviceDevicePath->SubType == HW_VENDOR_DP) {\r
231 VendorDeviceNode = (VENDOR_DEVICE_PATH *) ChildDeviceDevicePath;\r
232 if (CompareMem (&VendorDeviceNode->Guid, &gEfiNicIp4ConfigVariableGuid, sizeof (EFI_GUID)) == 0) {\r
233 //\r
234 // Found item matched gEfiNicIp4ConfigVariableGuid\r
235 //\r
236 *ChildHandle = Handles[Index];\r
237 FreePool (Handles);\r
238 return EFI_SUCCESS;\r
239 }\r
240 }\r
241 }\r
242 } \r
243 }\r
244 }\r
245\r
246 FreePool (Handles);\r
247 return Status; \r
248}\r
249\r
250/**\r
251 Append OFFSET/WIDTH/VALUE items at the beginning of string.\r
252\r
4ff7e37b
ED
253 @param[in, out] String The pointer to the string to append onto.\r
254 @param[in] Offset Offset value.\r
255 @param[in] Width Width value.\r
256 @param[in] Block Point to data buffer.\r
68fb0527 257\r
258 @return The count of unicode character that were appended.\r
259**/\r
260UINTN\r
261EFIAPI\r
262AppendOffsetWidthValue (\r
263 IN OUT CHAR16 *String,\r
264 IN UINTN Offset,\r
265 IN UINTN Width,\r
266 IN CONST UINT8 *Block\r
267 )\r
268\r
269{\r
270 CHAR16 *OriString;\r
271\r
272 OriString = String;\r
273\r
284065b0 274 StrnCpy (String, L"&OFFSET=", 9);\r
68fb0527 275 String += StrLen (L"&OFFSET=");\r
276 String += UnicodeSPrint (String, 20, L"%x", Offset);\r
277\r
284065b0 278 StrnCpy (String,L"&WIDTH=", 8);\r
68fb0527 279 String += StrLen (L"&WIDTH=");\r
280 String += UnicodeSPrint (String, 20, L"%x", Width);\r
281\r
282 if (Block != NULL) {\r
284065b0 283 StrnCpy (String,L"&VALUE=", 8);\r
68fb0527 284 String += StrLen (L"&VALUE=");\r
285 while ((Width--) != 0) {\r
286 String += UnicodeSPrint (String, 20, L"%x", Block[Width]);\r
287 }\r
288 }\r
289 \r
290 return String - OriString;\r
291}\r
292\r
293/**\r
294 Converts the unicode character of the string from uppercase to lowercase.\r
295 This is a internal function.\r
296\r
297 @param ConfigString String to be converted\r
298**/\r
299CHAR16* \r
300EFIAPI\r
301HiiToLower (\r
302 IN CHAR16 *ConfigString\r
303 )\r
304{\r
305 CHAR16 *String;\r
306 BOOLEAN Lower;\r
307\r
308 //\r
309 // Convert all hex digits in range [A-F] in the configuration header to [a-f]\r
310 //\r
311 for (String = ConfigString, Lower = FALSE; String != NULL && *String != L'\0'; String++) {\r
312 if (*String == L'=') {\r
313 Lower = TRUE;\r
314 } else if (*String == L'&') {\r
315 Lower = FALSE;\r
316 } else if (Lower && *String >= L'A' && *String <= L'F') {\r
317 *String = (CHAR16) (*String - L'A' + L'a');\r
318 }\r
319 }\r
320\r
321 return (ConfigString);\r
322}\r
323\r
324\r
325/**\r
326 Construct <ConfigHdr> using routing information GUID/NAME/PATH.\r
327\r
328 @param[in] Guid Routing information: GUID.\r
329 @param[in] Name Routing information: NAME.\r
330 @param[in] DriverHandle Driver handle which contains the routing information: PATH.\r
331\r
332 @retval NULL An error occured.\r
333 @return The pointer to configHdr string.\r
334**/\r
335CHAR16 *\r
336EFIAPI\r
337ConstructConfigHdr (\r
338 IN CONST EFI_GUID *Guid,\r
339 IN CONST CHAR16 *Name,\r
340 IN EFI_HANDLE DriverHandle\r
341 )\r
342{\r
343 EFI_STATUS Status;\r
344 CHAR16 *ConfigHdr;\r
345 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
346 CHAR16 *String;\r
347 UINTN Index;\r
348 UINT8 *Buffer;\r
349 UINTN DevicePathLength;\r
350 UINTN NameLength;\r
351\r
352 //\r
353 // Get the device path from handle installed EFI HII Config Access protocol\r
354 //\r
355 Status = gBS->HandleProtocol (\r
356 DriverHandle,\r
357 &gEfiDevicePathProtocolGuid,\r
358 (VOID **) &DevicePath\r
359 );\r
360 if (EFI_ERROR (Status)) {\r
361 return NULL;\r
362 }\r
363\r
364 DevicePathLength = GetDevicePathSize (DevicePath);\r
365 NameLength = StrLen (Name);\r
366 ConfigHdr = AllocateZeroPool ((5 + sizeof (EFI_GUID) * 2 + 6 + NameLength * 4 + 6 + DevicePathLength * 2 + 1) * sizeof (CHAR16));\r
367 if (ConfigHdr == NULL) {\r
368 return NULL;\r
369 } \r
370\r
371 String = ConfigHdr;\r
284065b0 372 StrnCpy (String, L"GUID=", 6);\r
68fb0527 373 String += StrLen (L"GUID=");\r
374\r
375 //\r
376 // Append Guid converted to <HexCh>32\r
377 //\r
378 for (Index = 0, Buffer = (UINT8 *)Guid; Index < sizeof (EFI_GUID); Index++) {\r
379 String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);\r
380 }\r
381\r
382 //\r
383 // Append L"&NAME="\r
384 //\r
284065b0 385 StrnCpy (String, L"&NAME=", 7);\r
68fb0527 386 String += StrLen (L"&NAME=");\r
387 for (Index = 0; Index < NameLength ; Index++) {\r
388 String += UnicodeSPrint (String, 10, L"00%x", Name[Index]);\r
389 }\r
390 \r
391 //\r
392 // Append L"&PATH="\r
393 //\r
284065b0 394 StrnCpy (String, L"&PATH=", 7);\r
68fb0527 395 String += StrLen (L"&PATH=");\r
396 for (Index = 0, Buffer = (UINT8 *) DevicePath; Index < DevicePathLength; Index++) {\r
397 String += UnicodeSPrint (String, 6, L"%02x", *Buffer++);\r
398 }\r
399\r
400 return (HiiToLower(ConfigHdr));\r
401}\r
402\r
403/**\r
404 Get network physical device NIC information.\r
405\r
406 @param[in] Handle The network physical device handle.\r
407 @param[out] NicAddr NIC information.\r
408\r
409 @retval EFI_SUCCESS Get NIC information successfully.\r
410**/ \r
411EFI_STATUS\r
412EFIAPI\r
413IfConfigGetNicMacInfo (\r
414 IN EFI_HANDLE Handle,\r
415 OUT NIC_ADDR *NicAddr\r
416 ) \r
417{\r
418 EFI_STATUS Status;\r
419 EFI_HANDLE MnpHandle;\r
420 EFI_SIMPLE_NETWORK_MODE SnpMode;\r
421 EFI_MANAGED_NETWORK_PROTOCOL *Mnp;\r
422\r
423 MnpHandle = NULL;\r
424 Mnp = NULL;\r
425\r
426 Status = NetLibCreateServiceChild (\r
427 Handle,\r
428 gImageHandle, \r
429 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
430 &MnpHandle\r
431 );\r
432 if (EFI_ERROR (Status)) {\r
433 return Status;\r
434 }\r
435\r
436 Status = gBS->HandleProtocol (\r
437 MnpHandle,\r
438 &gEfiManagedNetworkProtocolGuid,\r
439 (VOID **) &Mnp\r
440 );\r
441 if (EFI_ERROR (Status)) {\r
442 goto ON_ERROR;\r
443 }\r
444\r
445 Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);\r
446 if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {\r
447 goto ON_ERROR;\r
448 }\r
449 \r
450 NicAddr->Type = (UINT16) SnpMode.IfType;\r
451 NicAddr->Len = (UINT8) SnpMode.HwAddressSize;\r
452 CopyMem (&NicAddr->MacAddr, &SnpMode.CurrentAddress, NicAddr->Len);\r
453\r
454ON_ERROR:\r
455\r
456 NetLibDestroyServiceChild (\r
457 Handle,\r
458 gImageHandle, \r
459 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
460 MnpHandle\r
461 );\r
462\r
463 return Status;\r
464\r
465}\r
466\r
467/**\r
468 Get network physical device NIC information.\r
469\r
470 @param[in] Handle The network physical device handle.\r
471 @param[out] MediaPresentSupported\r
472 Upon successful return, TRUE is media present \r
473 is supported. FALSE otherwise.\r
474 @param[out] MediaPresent Upon successful return, TRUE is media present \r
475 is enabled. FALSE otherwise.\r
476\r
477 @retval EFI_SUCCESS The operation was successful.\r
478**/\r
479EFI_STATUS\r
480EFIAPI\r
481IfConfigGetNicMediaStatus (\r
482 IN EFI_HANDLE Handle,\r
483 OUT BOOLEAN *MediaPresentSupported,\r
484 OUT BOOLEAN *MediaPresent\r
485 ) \r
486 \r
487{\r
488 EFI_STATUS Status;\r
489 EFI_HANDLE MnpHandle;\r
490 EFI_SIMPLE_NETWORK_MODE SnpMode;\r
491 EFI_MANAGED_NETWORK_PROTOCOL *Mnp;\r
492\r
493 MnpHandle = NULL;\r
494 Mnp = NULL;\r
495\r
496 Status = NetLibCreateServiceChild (\r
497 Handle,\r
498 gImageHandle, \r
499 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
500 &MnpHandle\r
501 );\r
502 if (EFI_ERROR (Status)) {\r
503 return Status;\r
504 }\r
505\r
506 Status = gBS->HandleProtocol (\r
507 MnpHandle,\r
508 &gEfiManagedNetworkProtocolGuid,\r
509 (VOID **) &Mnp\r
510 );\r
511 if (EFI_ERROR (Status)) {\r
512 goto ON_ERROR;\r
513 }\r
514\r
515 Status = Mnp->GetModeData (Mnp, NULL, &SnpMode);\r
516 if (EFI_ERROR (Status) && (Status != EFI_NOT_STARTED)) {\r
517 goto ON_ERROR;\r
518 }\r
519 \r
520 *MediaPresentSupported = SnpMode.MediaPresentSupported;\r
521 *MediaPresent = SnpMode.MediaPresent;\r
522\r
523ON_ERROR:\r
524\r
525 NetLibDestroyServiceChild (\r
526 Handle,\r
527 gImageHandle, \r
528 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
529 MnpHandle\r
530 );\r
531\r
532 return Status;\r
533\r
534}\r
535\r
536/**\r
537 Get all Nic's information through HII service.\r
538\r
539 @retval EFI_SUCCESS All the nic information is collected.\r
540**/\r
541EFI_STATUS\r
542EFIAPI\r
543IfconfigGetAllNicInfoByHii (\r
544 VOID\r
545 )\r
546{\r
547 EFI_STATUS Status;\r
548 EFI_HANDLE *Handles;\r
549 UINTN HandleCount;\r
550 CHAR16 *ConfigResp;\r
551 CHAR16 *ConfigHdr;\r
552 UINTN Index;\r
553 CHAR16 *AccessProgress;\r
554 CHAR16 *AccessResults;\r
555 UINTN BufferSize;\r
556 NIC_INFO *NicInfo;\r
557 NIC_IP4_CONFIG_INFO *NicConfigRequest;\r
558 NIC_IP4_CONFIG_INFO *NicConfig;\r
559 CHAR16 *String;\r
560 UINTN Length;\r
561 UINTN Offset;\r
562 EFI_HANDLE ChildHandle;\r
563\r
564 AccessResults = NULL;\r
565 ConfigHdr = NULL;\r
566 ConfigResp = NULL;\r
567 NicConfigRequest = NULL;\r
568 NicInfo = NULL;\r
569\r
570 InitializeListHead (&NicInfoList);\r
571\r
572 //\r
573 // Check if HII Config Routing protocol available.\r
574 //\r
575 Status = gBS->LocateProtocol (\r
576 &gEfiHiiConfigRoutingProtocolGuid,\r
577 NULL,\r
578 (VOID**)&mHiiConfigRouting\r
579 );\r
580 if (EFI_ERROR (Status)) {\r
581 return EFI_NOT_FOUND;\r
582 }\r
583\r
584 //\r
585 // Locate all network device handles\r
586 //\r
587 Status = gBS->LocateHandleBuffer (\r
588 ByProtocol,\r
589 &gEfiManagedNetworkServiceBindingProtocolGuid,\r
590 NULL,\r
591 &HandleCount,\r
592 &Handles\r
593 );\r
594 if (EFI_ERROR (Status) || (HandleCount == 0)) {\r
595 return EFI_NOT_FOUND;\r
596 }\r
597\r
598 for (Index = 0; Index < HandleCount; Index++) {\r
599 Status = GetChildHandle (Handles[Index], &ChildHandle);\r
600 if (EFI_ERROR (Status)) {\r
601 //\r
602 // If failed to get Child handle, try NIC controller handle for back-compatibility.\r
603 //\r
604 ChildHandle = Handles[Index];\r
605 }\r
606 //\r
607 // Construct configuration request string header\r
608 //\r
609 ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);\r
33c031ee 610 if (ConfigHdr != NULL) {\r
611 Length = StrLen (ConfigHdr);\r
612 } else {\r
613 Length = 0;\r
614 }\r
68fb0527 615 ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));\r
616 if (ConfigResp == NULL) {\r
617 Status = EFI_OUT_OF_RESOURCES;\r
618 goto ON_ERROR;\r
619 }\r
33c031ee 620 if (ConfigHdr != NULL) {\r
a3d236df 621 StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 1);\r
33c031ee 622 }\r
68fb0527 623 \r
624 //\r
625 // Append OFFSET/WIDTH pair\r
626 //\r
627 String = ConfigResp + Length;\r
628 Offset = 0;\r
629 AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);\r
630\r
631 NicInfo = AllocateZeroPool (sizeof (NIC_INFO));\r
632 if (NicInfo == NULL) {\r
633 Status = EFI_OUT_OF_RESOURCES;\r
634 goto ON_ERROR;\r
635 }\r
636 NicInfo->Handle = Handles[Index];\r
637\r
638 //\r
639 // Get network physical devcie MAC information\r
640 //\r
641 IfConfigGetNicMacInfo (Handles[Index], &NicInfo->NicAddress);\r
642 if (NicInfo->NicAddress.Type == NET_IFTYPE_ETHERNET) {\r
643 UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"eth%d", Index);\r
644 } else {\r
645 UnicodeSPrint (NicInfo->Name, IP4_NIC_NAME_LENGTH, L"unk%d", Index);\r
646 }\r
647\r
648 //\r
649 // Get media status\r
650 //\r
651 IfConfigGetNicMediaStatus (Handles[Index], &NicInfo->MediaPresentSupported, &NicInfo->MediaPresent);\r
652\r
653 NicConfigRequest = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);\r
654 if (NicConfigRequest == NULL) {\r
655 Status = EFI_OUT_OF_RESOURCES;\r
656 goto ON_ERROR;\r
657 }\r
658\r
659 //\r
660 // Get network parameters by HII service\r
661 //\r
662 Status = mHiiConfigRouting->ExtractConfig (\r
663 mHiiConfigRouting,\r
664 ConfigResp,\r
665 &AccessProgress,\r
666 &AccessResults\r
667 );\r
668 if (!EFI_ERROR (Status)) {\r
669 BufferSize = NIC_ITEM_CONFIG_SIZE;\r
670 Status = mHiiConfigRouting->ConfigToBlock (\r
671 mHiiConfigRouting,\r
672 AccessResults,\r
673 (UINT8 *) NicConfigRequest,\r
674 &BufferSize,\r
675 &AccessProgress\r
676 );\r
677 if (!EFI_ERROR (Status)) {\r
678 BufferSize = sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * NicConfigRequest->Ip4Info.RouteTableSize;\r
679 NicConfig = AllocateZeroPool (BufferSize);\r
680 if (NicConfig == NULL) {\r
681 Status = EFI_OUT_OF_RESOURCES;\r
682 goto ON_ERROR;\r
683 }\r
684 CopyMem (NicConfig, NicConfigRequest, BufferSize);\r
685\r
686 //\r
687 // If succeeds to get NIC configuration, fix up routetable pointer.\r
688 //\r
689 NicConfig->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (&NicConfig->Ip4Info + 1);\r
690 NicInfo->ConfigInfo = NicConfig;\r
691\r
692 } else {\r
693 NicInfo->ConfigInfo = NULL;\r
694 }\r
695\r
696 FreePool (AccessResults);\r
697\r
698 } else {\r
699 NicInfo->ConfigInfo = NULL;\r
700 }\r
701\r
702 //\r
703 // Add the Nic's info to the global NicInfoList.\r
704 //\r
705 InsertTailList (&NicInfoList, &NicInfo->Link);\r
706\r
707 FreePool (NicConfigRequest);\r
708 FreePool (ConfigResp);\r
709 FreePool (ConfigHdr);\r
710 }\r
711\r
712 FreePool (Handles);\r
713\r
714 return EFI_SUCCESS;\r
715 \r
716ON_ERROR:\r
717 if (AccessResults != NULL) {\r
718 FreePool (AccessResults);\r
719 }\r
720 if (NicConfigRequest != NULL) {\r
721 FreePool (NicConfigRequest);\r
722 }\r
723 if (NicInfo != NULL) {\r
724 FreePool (NicInfo);\r
725 }\r
726 if (ConfigResp != NULL) {\r
727 FreePool (ConfigResp);\r
728 }\r
729 if (ConfigHdr != NULL) {\r
730 FreePool (ConfigHdr);\r
731 }\r
732\r
733 FreePool (Handles);\r
734\r
735 return Status;\r
736}\r
737\r
738/**\r
739 Set the address for the specified nic by HII service.\r
740\r
741 @param[in] NicInfo A pointer to the NIC_INFO of the Nic to be configured.\r
742 @param[in] Config The command line arguments for the set operation.\r
743\r
744 @retval EFI_SUCCESS The address set operation is done.\r
745**/\r
746SHELL_STATUS\r
747EFIAPI\r
748IfconfigSetNicAddrByHii (\r
749 IN CONST NIC_INFO *NicInfo,\r
750 IN CONST NIC_IP4_CONFIG_INFO *Config\r
751 )\r
752{\r
753 EFI_STATUS Status;\r
754 SHELL_STATUS ShellStatus;\r
755 NIC_IP4_CONFIG_INFO *NicConfig;\r
756 CHAR16 *ConfigResp;\r
757 CHAR16 *ConfigHdr;\r
758 CHAR16 *AccessProgress;\r
759 CHAR16 *AccessResults;\r
760 CHAR16 *String;\r
761 UINTN Length;\r
762 UINTN Offset;\r
763 EFI_HANDLE ChildHandle;\r
764\r
765 AccessResults = NULL;\r
766 ConfigHdr = NULL;\r
767 ConfigResp = NULL;\r
768 NicConfig = NULL;\r
769 ShellStatus = SHELL_SUCCESS;\r
770\r
771 Status = GetChildHandle (NicInfo->Handle, &ChildHandle);\r
772 if (EFI_ERROR (Status)) {\r
773 //\r
774 // If failed to get Child handle, try NIC controller handle for back-compatibility\r
775 //\r
776 ChildHandle = NicInfo->Handle;\r
777 }\r
778 //\r
779 // Construct config request string header\r
780 //\r
781 ConfigHdr = ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);\r
33c031ee 782 if (ConfigHdr != NULL) {\r
783 Length = StrLen (ConfigHdr);\r
784 } else {\r
ae724571 785 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
786 goto ON_EXIT;\r
33c031ee 787 }\r
68fb0527 788 ConfigResp = AllocateZeroPool ((Length + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));\r
ae724571 789 if (ConfigResp == NULL) {\r
790 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
791 goto ON_EXIT;\r
792 }\r
33c031ee 793 if (ConfigHdr != NULL) {\r
a3d236df 794 StrnCpy (ConfigResp, ConfigHdr, Length + NIC_ITEM_CONFIG_SIZE * 2 + 100 - 1);\r
33c031ee 795 }\r
68fb0527 796\r
797 NicConfig = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);\r
798 if (NicConfig == NULL) {\r
799 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
800 goto ON_EXIT;\r
801 }\r
802\r
803 if (Config != NULL) {\r
804 CopyMem (NicConfig, Config, sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * Config->Ip4Info.RouteTableSize);\r
805 }\r
806\r
807 //\r
808 // Append OFFSET/WIDTH pair\r
809 //\r
810 String = ConfigResp + Length;\r
811 Offset = 0;\r
812 AppendOffsetWidthValue (String, Offset, NIC_ITEM_CONFIG_SIZE, NULL);\r
813\r
814 //\r
815 // Call HII helper function to generate configuration string\r
816 //\r
817 Status = mHiiConfigRouting->BlockToConfig (\r
818 mHiiConfigRouting,\r
819 ConfigResp,\r
820 (UINT8 *) NicConfig,\r
821 NIC_ITEM_CONFIG_SIZE,\r
822 &AccessResults,\r
823 &AccessProgress\r
824 );\r
825 if (EFI_ERROR (Status)) {\r
826 ShellStatus = SHELL_NOT_FOUND;\r
827 goto ON_EXIT;\r
828 }\r
829\r
830 //\r
831 // Set IP setting by HII servie\r
832 //\r
833 Status = mHiiConfigRouting->RouteConfig (\r
834 mHiiConfigRouting,\r
835 AccessResults,\r
836 &AccessProgress\r
837 );\r
838 if (EFI_ERROR(Status)) {\r
839 ShellStatus = SHELL_ACCESS_DENIED;\r
840 }\r
841\r
842ON_EXIT:\r
843 SHELL_FREE_NON_NULL(AccessResults);\r
844 SHELL_FREE_NON_NULL(NicConfig);\r
845 SHELL_FREE_NON_NULL(ConfigResp);\r
846 SHELL_FREE_NON_NULL(ConfigHdr);\r
847\r
848 return ShellStatus;\r
849}\r
850\r
851/**\r
852 The callback function for the Arp address resolved event.\r
853\r
854 @param[in] Event The event this function is registered to.\r
855 @param[in] Context The context registered to the event.\r
856**/\r
857VOID\r
858EFIAPI\r
859IfconfigOnArpResolved (\r
860 IN EFI_EVENT Event,\r
861 IN VOID *Context\r
862 )\r
863{\r
864 ARP_REQUEST *Request;\r
865 UINT8 Index;\r
866\r
867 Request = (ARP_REQUEST *) Context;\r
868 ASSERT (Request != NULL);\r
869\r
870 Request->Duplicate = FALSE;\r
871 \r
872 if (0 == CompareMem (&Request->LocalMac, &Request->DestMac, Request->MacLen)) {\r
873 ShellPrintHiiEx(\r
874 -1, \r
875 -1, \r
876 NULL,\r
877 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), \r
878 gShellNetwork1HiiHandle, \r
879 L"Already Configured",\r
880 (UINTN)Request->DestIp.v4.Addr[0],\r
881 (UINTN)Request->DestIp.v4.Addr[1],\r
882 (UINTN)Request->DestIp.v4.Addr[2],\r
883 (UINTN)Request->DestIp.v4.Addr[3]\r
884 );\r
885 ArpResolved = TRUE;\r
886 return;\r
887 }\r
888 \r
889 for (Index = 0; Index < Request->MacLen; Index++) {\r
890 if (Request->DestMac.Addr[Index] != 0) {\r
891 Request->Duplicate = TRUE;\r
892 }\r
893 }\r
894\r
895 if (Request->Duplicate) {\r
896 ShellPrintHiiEx(\r
897 -1,\r
898 -1,\r
899 NULL,\r
900 STRING_TOKEN(STR_IFCONFIG_CONF_IP_ADDR), \r
901 gShellNetwork1HiiHandle, \r
902 (UINTN)Request->DestMac.Addr[0], \r
903 (UINTN)Request->DestMac.Addr[1], \r
904 (UINTN)Request->DestMac.Addr[2],\r
905 (UINTN)Request->DestMac.Addr[3], \r
906 (UINTN)Request->DestMac.Addr[4], \r
907 (UINTN)Request->DestMac.Addr[5]\r
908 ); \r
909 }\r
910\r
911 ArpResolved = TRUE;\r
912 return ;\r
913}\r
914\r
915/**\r
916 Check whether the address to be configured conflicts with other hosts.\r
917\r
918 @param[in] NicInfo The pointer to the NIC_INFO of the Nic to be configured.\r
919 @param[in] IpAddr The IPv4 address to be configured to the Nic.\r
920\r
921 @return TRUE Some other host already uses the IpAddr.\r
922 @return FALSE The address is unused.\r
923**/\r
924BOOLEAN\r
925EFIAPI\r
926IfconfigIsIpDuplicate (\r
927 IN NIC_INFO *NicInfo,\r
928 IN IP4_ADDR IpAddr\r
929 )\r
930{\r
931 EFI_ARP_PROTOCOL *Arp;\r
932 EFI_ARP_CONFIG_DATA ArpCfgData;\r
933 EFI_HANDLE ArpHandle;\r
934 ARP_REQUEST Request;\r
935 EFI_STATUS Status;\r
936\r
937 Arp = NULL;\r
938 ArpHandle = NULL;\r
939 ZeroMem (&Request, sizeof (ARP_REQUEST));\r
940\r
941 Status = NetLibCreateServiceChild (\r
942 NicInfo->Handle,\r
943 gImageHandle, \r
944 &gEfiArpServiceBindingProtocolGuid,\r
945 &ArpHandle\r
946 );\r
947\r
948 if (EFI_ERROR (Status)) {\r
949 return FALSE;\r
950 }\r
951\r
952 Status = gBS->OpenProtocol (\r
953 ArpHandle,\r
954 &gEfiArpProtocolGuid,\r
955 (VOID**)&Arp,\r
956 gImageHandle,\r
957 ArpHandle,\r
958 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
959 );\r
960\r
961 if (EFI_ERROR (Status)) {\r
962 goto ON_EXIT;\r
963 }\r
964\r
965 //\r
966 // Set up the Arp requests\r
967 //\r
968 EFI_IP4_TO_U32 (Request.DestIp.v4) = IpAddr;\r
969 EFI_IP4_TO_U32 (Request.LocalIp.v4) = 0xffffffff;\r
970 Request.LocalMac = NicInfo->NicAddress.MacAddr;\r
971 Request.MacLen = NicInfo->NicAddress.Len;\r
972 \r
973 Status = gBS->CreateEvent (\r
974 EVT_NOTIFY_SIGNAL,\r
975 TPL_CALLBACK,\r
976 IfconfigOnArpResolved,\r
977 (VOID *) &Request,\r
978 &Request.OnResolved\r
979 );\r
980 \r
981 if (EFI_ERROR (Status)) {\r
982 goto ON_EXIT;\r
983 }\r
984 \r
985 ArpCfgData.SwAddressType = 0x0800;\r
986 ArpCfgData.SwAddressLength = 4;\r
987 ArpCfgData.StationAddress = &Request.LocalIp;\r
988 ArpCfgData.EntryTimeOut = 0;\r
989 ArpCfgData.RetryCount = 3;\r
990 ArpCfgData.RetryTimeOut = 0;\r
991 \r
992 Status = Arp->Configure (Arp, &ArpCfgData);\r
993 \r
994 if (EFI_ERROR (Status)) {\r
995 goto ON_EXIT;\r
996 }\r
997\r
998 Status = Arp->Request (\r
999 Arp,\r
1000 &Request.DestIp,\r
1001 Request.OnResolved,\r
1002 &Request.DestMac\r
1003 );\r
1004 \r
1005 if (EFI_ERROR (Status) && (Status != EFI_NOT_READY)) {\r
1006 goto ON_EXIT;\r
1007 }\r
1008\r
1009 while (!ArpResolved) {\r
1010 \r
1011 }\r
1012\r
1013ON_EXIT:\r
1014 if (Request.OnResolved != NULL) {\r
1015 gBS->CloseEvent (Request.OnResolved);\r
1016 }\r
1017\r
1018 NetLibDestroyServiceChild (\r
1019 NicInfo->Handle, \r
1020 gImageHandle, \r
1021 &gEfiArpServiceBindingProtocolGuid, \r
1022 ArpHandle\r
1023 );\r
1024\r
1025 return Request.Duplicate;\r
1026}\r
1027\r
1028/**\r
1029 The callback function for the timer event used to get map.\r
1030\r
1031 @param[in] Event The event this function is registered to.\r
1032 @param[in] Context The context registered to the event.\r
1033**/\r
1034VOID\r
1035EFIAPI\r
1036TimeoutToGetMap (\r
1037 IN EFI_EVENT Event,\r
1038 IN VOID *Context\r
1039 )\r
1040{\r
1041 mTimeout = TRUE;\r
1042 return ;\r
1043}\r
1044\r
1045/**\r
75dce340 1046 Create an IP child, use it to start the auto configuration, then destroy it.\r
68fb0527 1047\r
1048 @param[in] NicInfo The pointer to the NIC_INFO of the Nic to be configured.\r
1049\r
1050 @retval EFI_SUCCESS The configuration is done.\r
1051**/\r
1052EFI_STATUS\r
1053EFIAPI\r
1054IfconfigStartIp4(\r
1055 IN NIC_INFO *NicInfo\r
1056 )\r
1057{\r
1058 EFI_IP4_PROTOCOL *Ip4;\r
1059 EFI_HANDLE Ip4Handle;\r
1060 EFI_HANDLE TimerToGetMap;\r
1061 EFI_IP4_CONFIG_DATA Ip4ConfigData;\r
1062 EFI_IP4_MODE_DATA Ip4Mode;\r
1063 EFI_STATUS Status;\r
1064\r
1065 //\r
1066 // Get the Ip4ServiceBinding Protocol\r
1067 //\r
1068 Ip4Handle = NULL;\r
1069 Ip4 = NULL;\r
1070 TimerToGetMap = NULL;\r
1071\r
1072 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_START_SET_ADDR), gShellNetwork1HiiHandle);\r
1073\r
1074 Status = NetLibCreateServiceChild (\r
1075 NicInfo->Handle,\r
1076 gImageHandle,\r
1077 &gEfiIp4ServiceBindingProtocolGuid,\r
1078 &Ip4Handle\r
1079 );\r
1080\r
1081 if (EFI_ERROR (Status)) {\r
1082 return Status;\r
1083 }\r
1084\r
1085 Status = gBS->OpenProtocol (\r
1086 Ip4Handle,\r
1087 &gEfiIp4ProtocolGuid,\r
1088 (VOID **) &Ip4,\r
1089 NicInfo->Handle,\r
1090 gImageHandle,\r
1091 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
1092 );\r
1093\r
1094 if (EFI_ERROR (Status)) {\r
1095 goto ON_EXIT;\r
1096 }\r
1097\r
1098 Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP;\r
1099 Ip4ConfigData.AcceptAnyProtocol = FALSE;\r
1100 Ip4ConfigData.AcceptIcmpErrors = FALSE;\r
1101 Ip4ConfigData.AcceptBroadcast = FALSE;\r
1102 Ip4ConfigData.AcceptPromiscuous = FALSE;\r
1103 Ip4ConfigData.UseDefaultAddress = TRUE;\r
1104 ZeroMem (&Ip4ConfigData.StationAddress, sizeof (EFI_IPv4_ADDRESS));\r
1105 ZeroMem (&Ip4ConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
1106 Ip4ConfigData.TypeOfService = 0;\r
1107 Ip4ConfigData.TimeToLive = 1;\r
1108 Ip4ConfigData.DoNotFragment = FALSE;\r
1109 Ip4ConfigData.RawData = FALSE;\r
1110 Ip4ConfigData.ReceiveTimeout = 0;\r
1111 Ip4ConfigData.TransmitTimeout = 0;\r
1112\r
1113 Status = Ip4->Configure (Ip4, &Ip4ConfigData);\r
1114\r
1115 if (Status == EFI_NO_MAPPING) {\r
1116 mTimeout = FALSE;\r
1117 Status = gBS->CreateEvent (\r
1118 EVT_NOTIFY_SIGNAL | EVT_TIMER,\r
035da677 1119 TPL_CALLBACK,\r
68fb0527 1120 TimeoutToGetMap,\r
1121 NULL,\r
1122 &TimerToGetMap\r
1123 );\r
1124 \r
1125 if (EFI_ERROR (Status)) {\r
1126 goto ON_EXIT;\r
1127 }\r
1128 \r
1129 Status = gBS->SetTimer (\r
1130 TimerToGetMap,\r
1131 TimerRelative,\r
a1d4bfcc 1132 MultU64x32 (SecondsToNanoSeconds, 5)\r
68fb0527 1133 );\r
1134 \r
1135 if (EFI_ERROR (Status)) {\r
1136 goto ON_EXIT;\r
1137 }\r
1138\r
1139 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_WAIT_SET_DONE), gShellNetwork1HiiHandle);\r
1140 \r
1141 while (!mTimeout) {\r
1142 Ip4->Poll (Ip4);\r
1143 \r
1144 if (!EFI_ERROR (Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL)) && \r
1145 Ip4Mode.IsConfigured) { \r
1146 break;\r
1147 }\r
1148 } \r
1149 }\r
1150\r
1151 Status = Ip4->GetModeData (Ip4, &Ip4Mode, NULL, NULL);\r
1152\r
1153 if ((Status == EFI_SUCCESS) && Ip4Mode.IsConfigured) {\r
1154 ShellPrintHiiEx(\r
1155 -1, \r
1156 -1, \r
1157 NULL,\r
1158 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), \r
1159 gShellNetwork1HiiHandle, \r
1160 L"Default",\r
1161 (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[0],\r
1162 (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[1],\r
1163 (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[2],\r
1164 (UINTN)Ip4Mode.ConfigData.StationAddress.Addr[3]\r
1165 );\r
1166 }\r
1167 \r
1168ON_EXIT: \r
1169\r
1170 if (EFI_ERROR (Status)) {\r
1171 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_DEF_ADDR_FAIL), gShellNetwork1HiiHandle);\r
1172 }\r
1173\r
1174 if (TimerToGetMap != NULL) {\r
1175 gBS->SetTimer (TimerToGetMap, TimerCancel, 0);\r
1176 gBS->CloseEvent (TimerToGetMap);\r
1177 }\r
1178\r
1179 NetLibDestroyServiceChild (\r
1180 NicInfo->Handle,\r
1181 gImageHandle,\r
1182 &gEfiIp4ServiceBindingProtocolGuid,\r
1183 Ip4Handle\r
1184 );\r
1185 \r
1186 return Status;\r
1187}\r
1188\r
1189/**\r
1190 Set the address for the nic specified by the params.\r
1191\r
1192 @param[in] Argc The count of the passed in Params.\r
1193 @param[in] Params The command line arguments for the set operation.\r
1194\r
1195 @retval EFI_SUCCESS The address set operation is done.\r
1196 @return Some error occurs.\r
1197**/\r
1198SHELL_STATUS\r
1199EFIAPI\r
1200IfconfigSetNicAddr (\r
1201 IN UINTN Argc,\r
1202 IN CONST CHAR16 *Params\r
1203 )\r
1204{\r
1205 NIC_IP4_CONFIG_INFO *Config;\r
1206 NIC_IP4_CONFIG_INFO *OldConfig;\r
1207 EFI_IP_ADDRESS Ip;\r
1208 EFI_IP_ADDRESS Mask;\r
1209 EFI_IP_ADDRESS Gateway;\r
1210 NIC_INFO *Info;\r
1211 BOOLEAN Permanent;\r
1212 SHELL_STATUS ShellStatus;\r
1213 CONST CHAR16 *Walker;\r
1214 CHAR16 *Temp;\r
1215 CONST CHAR16 *DhcpTemp;\r
1216 CONST CHAR16 *StaticTemp;\r
1217 CONST CHAR16 *PermTemp;\r
1218 UINT32 NetworkBytes1;\r
1219 UINT32 NetworkBytes2;\r
1220 EFI_STATUS Status;\r
1221\r
1222 Walker = Params;\r
1223 Temp = NULL;\r
1224 Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);\r
1225 Info = IfconfigFindNicByName (Temp);\r
1226\r
1227 if (Info == NULL) {\r
1228 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INTERFACE_NOT_FOUND), gShellNetwork1HiiHandle, Temp);\r
1229 return SHELL_NOT_FOUND;\r
1230 }\r
1231\r
1232 Walker += StrLen(Temp) + 1;\r
1233 FreePool(Temp);\r
1234 Temp = NULL;\r
1235 Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")==NULL?0:StrStr(Walker, L" ")-Walker);\r
1236\r
1237 Config = AllocateZeroPool (sizeof (NIC_IP4_CONFIG_INFO) + 2 * sizeof (EFI_IP4_ROUTE_TABLE));\r
1238 if (Config == NULL) {\r
1239 return SHELL_OUT_OF_RESOURCES;\r
1240 }\r
1241\r
1242 Config->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (Config + 1);\r
1243\r
1244 OldConfig = Info->ConfigInfo;\r
1245 Permanent = FALSE;\r
1246 ShellStatus = SHELL_INVALID_PARAMETER;\r
1247\r
1248 DhcpTemp = DhcpString;\r
1249 StaticTemp = StaticString;\r
1250 \r
1251 if (StringNoCaseCompare(&Temp, &DhcpTemp) == 0) {\r
1252 //\r
928927dd 1253 // Validate the parameter for DHCP, two valid forms: eth0 DHCP and eth0 DHCP permanent\r
68fb0527 1254 //\r
1255 if ((Argc != 2) && (Argc!= 3)) {\r
1256 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, Temp);\r
1257 ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);\r
1258 goto ON_EXIT;\r
1259 }\r
1260\r
1261 if (Argc == 3) {\r
1262 Walker += StrLen(Temp) + 1;\r
1263 FreePool(Temp);\r
1264 Temp = NULL;\r
1265 Temp = StrnCatGrow(&Temp, NULL, Walker, 0);\r
1266\r
1267 PermTemp = PermanentString;\r
1268 if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {\r
1269 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), gShellNetwork1HiiHandle, Temp, PermanentString, L"Nothing");\r
1270 ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);\r
1271 goto ON_EXIT;\r
1272 }\r
1273\r
1274 Permanent = TRUE;\r
1275 }\r
1276\r
1277 if ((OldConfig != NULL) && (OldConfig->Source == IP4_CONFIG_SOURCE_DHCP) &&\r
928927dd 1278 (OldConfig->Permanent == Permanent)) {\r
68fb0527 1279\r
1280 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INTERFACE_CONFIGURED), gShellNetwork1HiiHandle, Info->Name);\r
1281 ShellStatus = SHELL_ALREADY_STARTED;\r
1282 goto ON_EXIT;\r
1283 }\r
1284\r
1285 Config->Source = IP4_CONFIG_SOURCE_DHCP;\r
1286 } else if (StringNoCaseCompare(&Temp, &StaticTemp) == 0) {\r
1287 //\r
1288 // validate the parameter, two forms: eth0 static IP NETMASK GATEWAY and\r
928927dd 1289 // eth0 static IP NETMASK GATEWAY permanent \r
68fb0527 1290 //\r
1291 if ((Argc != 5) && (Argc != 6)) {\r
1292 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, Temp);\r
1293 ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);\r
1294 goto ON_EXIT;\r
1295 }\r
1296\r
1297 Walker += StrLen(Temp) + 1;\r
1298 FreePool(Temp);\r
1299 Temp = NULL;\r
1300 Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);\r
1301\r
1302 if (EFI_ERROR (NetLibStrToIp4 (Temp, &Ip.v4))) {\r
1303 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);\r
1304 ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);\r
1305 goto ON_EXIT;\r
1306 }\r
1307\r
1308 Walker += StrLen(Temp) + 1;\r
1309 FreePool(Temp);\r
1310 Temp = NULL;\r
1311 Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);\r
1312 if (EFI_ERROR (NetLibStrToIp4 (Temp, &Mask.v4))) {\r
1313 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);\r
1314 ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);\r
1315 goto ON_EXIT;\r
1316 }\r
1317\r
1318 Walker += StrLen(Temp) + 1;\r
1319 FreePool(Temp);\r
1320 Temp = NULL;\r
1321 if (Argc == 6) {\r
1322 Temp = StrnCatGrow(&Temp, NULL, Walker, StrStr(Walker, L" ")-Walker);\r
1323 } else {\r
1324 Temp = StrnCatGrow(&Temp, NULL, Walker, 0);\r
1325 }\r
1326 if (EFI_ERROR (NetLibStrToIp4 (Temp, &Gateway.v4))) {\r
1327 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR), gShellNetwork1HiiHandle, Temp);\r
1328 ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);\r
1329 goto ON_EXIT;\r
1330 }\r
1331\r
1332 if (Argc == 6) {\r
1333 Walker += StrLen(Temp) + 1;\r
1334 FreePool(Temp);\r
1335 Temp = NULL;\r
1336 Temp = StrnCatGrow(&Temp, NULL, Walker, 0);\r
1337\r
1338 PermTemp = PermanentString;\r
1339 if (StringNoCaseCompare(&Temp, &PermTemp) != 0) {\r
1340 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_OP2), gShellNetwork1HiiHandle, Temp, PermanentString, L"Nothing");\r
1341 ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);\r
1342 goto ON_EXIT;\r
1343 }\r
1344\r
1345 Permanent = TRUE;\r
1346 }\r
1347\r
1348 NetworkBytes1 = NTOHL (Ip.Addr[0]);\r
1349 NetworkBytes2 = NTOHL (Mask.Addr[0]);\r
1350 if ((Ip.Addr[0] == 0) || (Mask.Addr[0] == 0) ||\r
1351 !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {\r
1352\r
1353 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_ADDR_PAIR), gShellNetwork1HiiHandle);\r
1354 ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);\r
1355 goto ON_EXIT;\r
1356 }\r
1357\r
1358 NetworkBytes1 = NTOHL (Gateway.Addr[0]);\r
1359 if (!IP4_NET_EQUAL (Ip.Addr[0], Gateway.Addr[0], Mask.Addr[0]) ||\r
1360 !NetIp4IsUnicast (NetworkBytes1, NetworkBytes2)) {\r
1361 \r
1362 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_INVALID_GATEWAY), gShellNetwork1HiiHandle);\r
1363 ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);\r
1364 goto ON_EXIT;\r
1365 }\r
1366\r
1367 //\r
1368 // Set the configuration up, two route table entries are added:\r
1369 // one for the direct connected network, and another for the \r
1370 // default gateway. Remember, some structure members are cleared\r
1371 // by AllocateZeroPool\r
1372 //\r
1373 Config->Source = IP4_CONFIG_SOURCE_STATIC;\r
1374 Config->Ip4Info.RouteTableSize = 2;\r
1375\r
1376 CopyMem (&Config->Ip4Info.StationAddress, &Ip.v4, sizeof (EFI_IPv4_ADDRESS));\r
1377 CopyMem (&Config->Ip4Info.SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));\r
1378\r
1379 Ip.Addr[0] = Ip.Addr[0] & Mask.Addr[0];\r
1380\r
1381 CopyMem (&Config->Ip4Info.RouteTable[0].SubnetAddress, &Ip.v4, sizeof (EFI_IPv4_ADDRESS));\r
1382 CopyMem (&Config->Ip4Info.RouteTable[0].SubnetMask, &Mask.v4, sizeof (EFI_IPv4_ADDRESS));\r
1383 CopyMem (&Config->Ip4Info.RouteTable[1].GatewayAddress, &Gateway.v4, sizeof (EFI_IPv4_ADDRESS));\r
1384 } else {\r
1385 // neither static or DHCP. error.\r
1386 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle);\r
1387 ASSERT(ShellStatus == SHELL_INVALID_PARAMETER);\r
1388 goto ON_EXIT;\r
1389 }\r
1390\r
1391 CopyMem (&Config->NicAddr, &Info->NicAddress, sizeof (NIC_ADDR));\r
891e9f05 1392 Config->Permanent = Permanent;\r
68fb0527 1393\r
1394 //\r
1395 // Use HII service to set NIC address\r
1396 //\r
1397 ShellStatus = IfconfigSetNicAddrByHii (Info, Config);\r
1398 if (ShellStatus != SHELL_SUCCESS) {\r
1399 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_SET_FAIL), gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);\r
1400 goto ON_EXIT;\r
1401 } \r
1402\r
1403 Status = IfconfigStartIp4 (Info);\r
1404 if (EFI_ERROR(Status)) {\r
1405 ShellStatus = SHELL_ACCESS_DENIED;\r
1406 }\r
1407\r
1408 if (ShellStatus != SHELL_SUCCESS) {\r
1409 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_IP_CHILD_FAIL), gShellNetwork1HiiHandle, ShellStatus^MAX_BIT);\r
1410 }\r
1411 \r
1412ON_EXIT:\r
1413 SHELL_FREE_NON_NULL(Config);\r
1414 \r
1415 return ShellStatus;\r
1416}\r
1417\r
1418/**\r
1419 Show the address information for the nic specified.\r
1420\r
1421 @param[in] Name A pointer to the string containg the nic's name, if NULL, \r
1422 all nics' information is shown.\r
1423**/\r
1424VOID\r
1425EFIAPI\r
1426IfconfigShowNicInfo (\r
1427 IN CONST CHAR16 *Name\r
1428 )\r
1429{\r
1430 LIST_ENTRY *Entry;\r
1431 LIST_ENTRY *NextEntry;\r
1432 NIC_INFO *NicInfo;\r
1433 UINT32 Index;\r
1434 EFI_IP4_IPCONFIG_DATA *Ip4Config;\r
1435 EFI_IPv4_ADDRESS Gateway;\r
1436 CONST CHAR16 *TempString;\r
1437\r
1438 NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {\r
1439 NicInfo = BASE_CR (Entry, NIC_INFO, Link);\r
1440\r
1441 TempString = (CHAR16*)NicInfo->Name;\r
1442 if ((Name != NULL) && (StringNoCaseCompare (&Name, &TempString) != 0)) {\r
1443 continue;\r
1444 }\r
1445\r
1446 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NAME), gShellNetwork1HiiHandle, NicInfo->Name);\r
1447\r
1448 ShellPrintHiiEx(\r
1449 -1,\r
1450 -1,\r
1451 NULL,\r
1452 STRING_TOKEN(STR_IFCONFIG_SHOW_MAC_ADDR), \r
1453 gShellNetwork1HiiHandle, \r
1454 (UINTN)NicInfo->NicAddress.MacAddr.Addr[0], \r
1455 (UINTN)NicInfo->NicAddress.MacAddr.Addr[1], \r
1456 (UINTN)NicInfo->NicAddress.MacAddr.Addr[2],\r
1457 (UINTN)NicInfo->NicAddress.MacAddr.Addr[3], \r
1458 (UINTN)NicInfo->NicAddress.MacAddr.Addr[4], \r
1459 (UINTN)NicInfo->NicAddress.MacAddr.Addr[5]\r
1460 ); \r
1461\r
1462 Print (L" Media State: %s\n", NicInfo->MediaPresent ? L"Media present" : L"Media disconnected");\r
1463\r
1464 if (NicInfo->ConfigInfo == NULL) {\r
1465 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_NIC_NOT_CONFIGURED), gShellNetwork1HiiHandle);\r
1466 continue;\r
1467 } \r
1468\r
1469 if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_DHCP) {\r
1470 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"DHCP");\r
1471 } else if (NicInfo->ConfigInfo->Source == IP4_CONFIG_SOURCE_STATIC) {\r
1472 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"STATIC");\r
1473 } else {\r
1474 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE), gShellNetwork1HiiHandle, L"Unknown");\r
1475 }\r
1476\r
1477 ShellPrintHiiEx(-1, -1, NULL,\r
891e9f05 1478 STRING_TOKEN (STR_IFCONFIG_PERMANENT_STATUS),\r
68fb0527 1479 gShellNetwork1HiiHandle,\r
891e9f05 1480 (NicInfo->ConfigInfo->Permanent? L"TRUE":L"FALSE")\r
68fb0527 1481 );\r
1482\r
1483 Ip4Config = &NicInfo->ConfigInfo->Ip4Info;\r
1484\r
1485 ShellPrintHiiEx(\r
1486 -1, \r
1487 -1, \r
1488 NULL,\r
1489 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), \r
1490 gShellNetwork1HiiHandle, \r
1491 L"IP address",\r
1492 (UINTN)Ip4Config->StationAddress.Addr[0],\r
1493 (UINTN)Ip4Config->StationAddress.Addr[1],\r
1494 (UINTN)Ip4Config->StationAddress.Addr[2],\r
1495 (UINTN)Ip4Config->StationAddress.Addr[3]\r
1496 );\r
1497 ShellPrintHiiEx(\r
1498 -1, \r
1499 -1, \r
1500 NULL,\r
1501 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), \r
1502 gShellNetwork1HiiHandle, \r
1503 L"Mask",\r
1504 (UINTN)Ip4Config->SubnetMask.Addr[0],\r
1505 (UINTN)Ip4Config->SubnetMask.Addr[1],\r
1506 (UINTN)Ip4Config->SubnetMask.Addr[2],\r
1507 (UINTN)Ip4Config->SubnetMask.Addr[3]\r
1508 );\r
1509\r
1510 ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));\r
1511 \r
1512 for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {\r
1513 if ((CompareMem (&Ip4Config->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&\r
1514 (CompareMem (&Ip4Config->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){\r
1515 CopyMem (&Gateway, &Ip4Config->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));\r
1516 }\r
1517 }\r
1518 \r
1519 ShellPrintHiiEx(\r
1520 -1, \r
1521 -1, \r
1522 NULL,\r
1523 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), \r
1524 gShellNetwork1HiiHandle, \r
1525 L"Gateway",\r
1526 (UINTN)Gateway.Addr[0],\r
1527 (UINTN)Gateway.Addr[1],\r
1528 (UINTN)Gateway.Addr[2],\r
1529 (UINTN)Gateway.Addr[3]\r
1530 );\r
1531\r
1532 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, Ip4Config->RouteTableSize);\r
1533\r
1534 for (Index = 0; Index < Ip4Config->RouteTableSize; Index++) {\r
1535 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);\r
1536\r
1537 ShellPrintHiiEx(\r
1538 -1, \r
1539 -1, \r
1540 NULL,\r
1541 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), \r
1542 gShellNetwork1HiiHandle, \r
1543 L"Subnet",\r
1544 (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[0],\r
1545 (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[1],\r
1546 (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[2],\r
1547 (UINTN)Ip4Config->RouteTable[Index].SubnetAddress.Addr[3]\r
1548 );\r
1549\r
1550 ShellPrintHiiEx(\r
1551 -1, \r
1552 -1, \r
1553 NULL,\r
1554 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), \r
1555 gShellNetwork1HiiHandle, \r
1556 L"Netmask",\r
1557 (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[0],\r
1558 (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[1],\r
1559 (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[2],\r
1560 (UINTN)Ip4Config->RouteTable[Index].SubnetMask.Addr[3]\r
1561 );\r
1562\r
1563 ShellPrintHiiEx(\r
1564 -1, \r
1565 -1, \r
1566 NULL,\r
1567 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), \r
1568 gShellNetwork1HiiHandle, \r
1569 L"Gateway",\r
1570 (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[0],\r
1571 (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[1],\r
1572 (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[2],\r
1573 (UINTN)Ip4Config->RouteTable[Index].GatewayAddress.Addr[3]\r
1574 );\r
1575 }\r
1576 }\r
1577\r
1578 return ;\r
1579}\r
1580\r
1581/**\r
1582 Clear address configuration for the nic specified.\r
1583\r
1584 @param[in] Name A pointer to the string containg the nic's name, \r
1585 if NULL, all nics address configurations are cleared.\r
1586\r
1587 @retval EFI_SUCCESS The address configuration is cleared.\r
1588 @return Some error occurs.\r
1589**/\r
1590EFI_STATUS\r
1591EFIAPI\r
1592IfconfigClearNicAddr (\r
1593 IN CONST CHAR16 *Name\r
1594 )\r
1595{\r
1596 LIST_ENTRY *Entry;\r
1597 LIST_ENTRY *NextEntry;\r
1598 NIC_INFO *Info;\r
1599 EFI_STATUS Status;\r
1600 \r
1601 NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &NicInfoList) {\r
1602 Info = BASE_CR (Entry, NIC_INFO, Link);\r
1603\r
1604 if ((Name != NULL) && (StrCmp (Name, Info->Name) != 0)) {\r
1605 continue;\r
1606 }\r
1607\r
1608// if (Info->NicIp4Config == NULL) { \r
1609 Status = IfconfigSetNicAddrByHii (Info, NULL);\r
1610// } else {\r
1611// Status = Info->NicIp4Config->SetInfo (Info->NicIp4Config, NULL, TRUE);\r
1612// }\r
1613\r
1614 if (EFI_ERROR (Status)) {\r
1615 return Status;\r
1616 }\r
1617 }\r
1618\r
1619 return EFI_SUCCESS;\r
1620 \r
1621}\r
1622\r
1623/**\r
1624 Function for 'ifconfig' command.\r
1625\r
1626 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
1627 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
1628**/\r
1629SHELL_STATUS\r
1630EFIAPI\r
1631ShellCommandRunIfconfig (\r
1632 IN EFI_HANDLE ImageHandle,\r
1633 IN EFI_SYSTEM_TABLE *SystemTable\r
1634 )\r
1635{\r
1636 EFI_STATUS Status;\r
1637 LIST_ENTRY *Package;\r
1638 CHAR16 *ProblemParam;\r
1639 SHELL_STATUS ShellStatus;\r
1640 BOOLEAN ListOperation;\r
1641 BOOLEAN ClearOperation;\r
1642 BOOLEAN SetOperation;\r
1643 CONST CHAR16 *Item;\r
1644 LIST_ENTRY *Entry;\r
1645 NIC_INFO *Info;\r
1646\r
1647 InitializeListHead (&NicInfoList);\r
1648 Status = EFI_INVALID_PARAMETER;\r
1649 ShellStatus = SHELL_SUCCESS;\r
1650\r
1651 //\r
1652 // initialize the shell lib (we must be in non-auto-init...)\r
1653 //\r
1654 Status = ShellInitialize();\r
1655 ASSERT_EFI_ERROR(Status);\r
1656\r
1657 //\r
1658 // parse the command line\r
1659 //\r
1660 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
1661 if (EFI_ERROR(Status)) {\r
1662 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
1663 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellNetwork1HiiHandle, ProblemParam);\r
1664 FreePool(ProblemParam);\r
1665 ShellStatus = SHELL_INVALID_PARAMETER;\r
1666 } else {\r
1667 ASSERT(FALSE);\r
1668 }\r
1669\r
1670 goto Done;\r
1671 }\r
1672\r
1673 ClearOperation = ShellCommandLineGetFlag(Package, L"-c");\r
1674 ListOperation = ShellCommandLineGetFlag(Package, L"-l");\r
1675 SetOperation = ShellCommandLineGetFlag(Package, L"-s");\r
1676\r
16751bb4 1677 if ((ClearOperation && ListOperation)\r
1678 ||(SetOperation && ListOperation)\r
1679 ||(ClearOperation && SetOperation)\r
68fb0527 1680 ) {\r
1681 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellNetwork1HiiHandle);\r
1682 ShellStatus = SHELL_INVALID_PARAMETER;\r
1683 goto Done;\r
1684 } else if (!ClearOperation && !ListOperation && !SetOperation) {\r
1685 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellNetwork1HiiHandle);\r
1686 ShellStatus = SHELL_INVALID_PARAMETER;\r
1687 goto Done;\r
1688 }\r
1689 \r
1690 \r
1691 Status = IfconfigGetAllNicInfoByHii ();\r
1692 if (EFI_ERROR (Status)) {\r
1693 if (mIp4ConfigExist) {\r
1694 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_GET_NIC_FAIL), gShellNetwork1HiiHandle, Status);\r
1695 } else {\r
1696 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellNetwork1HiiHandle, L"gEfiIp4ConfigProtocolGuid", &gEfiIp4ConfigProtocolGuid);\r
1697 }\r
1698\r
1699 return SHELL_NOT_FOUND;\r
1700 }\r
1701\r
1702 if (ListOperation) {\r
1703 Item = ShellCommandLineGetValue (Package, L"-l");\r
1704\r
1705 if (Item != NULL && CountSubItems(Item) > 1) {\r
1706 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"-l");\r
1707 ShellStatus = SHELL_INVALID_PARAMETER;\r
1708 goto Done;\r
1709 } \r
1710 \r
1711 //\r
1712 // Show the configuration.\r
1713 //\r
1714 IfconfigShowNicInfo (Item);\r
1715 } else if (SetOperation) {\r
1716 Item = ShellCommandLineGetValue (Package, L"-s");\r
1717\r
1718 //\r
1719 // The correct command line arguments for setting address are:\r
928927dd
SEHM
1720 // IfConfig -s eth0 DHCP [permanent]\r
1721 // IfConfig -s eth0 static ip netmask gateway [permanent]\r
68fb0527 1722 //\r
1723 if (Item == NULL || (CountSubItems(Item) < 2) || (CountSubItems(Item) > 6) || (CountSubItems(Item) == 4)) {\r
1724 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"-s");\r
1725 ShellStatus = SHELL_INVALID_PARAMETER;\r
1726 goto Done;\r
1727 }\r
1728\r
1729 ShellStatus = IfconfigSetNicAddr (CountSubItems(Item), Item);\r
1730 } else if (ClearOperation) {\r
1731 Item = ShellCommandLineGetValue (Package, L"-c");\r
1732\r
1733 if (Item != NULL && CountSubItems(Item) > 1) {\r
1734 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellNetwork1HiiHandle, L"-c");\r
1735 ShellStatus = SHELL_INVALID_PARAMETER;\r
1736 goto Done;\r
1737 }\r
1738\r
1739 IfconfigClearNicAddr (Item);\r
1740 } else {\r
1741 ASSERT(FALSE);\r
1742 }\r
1743\r
1744Done:\r
1745 while (!IsListEmpty (&NicInfoList)) {\r
1746 Entry = NicInfoList.ForwardLink;\r
1747 Info = BASE_CR (Entry, NIC_INFO, Link);\r
1748\r
1749 RemoveEntryList (Entry);\r
1750\r
1751 if (Info->ConfigInfo != NULL) {\r
1752 FreePool (Info->ConfigInfo);\r
1753 }\r
1754\r
1755 FreePool (Info);\r
1756 }\r
1757\r
1758 if (Package != NULL) {\r
1759 ShellCommandLineFreeVarList(Package);\r
1760 }\r
1761\r
1762 return (ShellStatus);\r
1763}\r