]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
ShellPkg: Remove Status definition in function scope
[mirror_edk2.git] / ShellPkg / Library / UefiShellNetwork1CommandsLib / Ifconfig.c
CommitLineData
68fb0527 1/** @file\r
7c25b7ea 2 The implementation for Shell command ifconfig based on IP4Config2 protocol.\r
68fb0527 3\r
c011b6c9 4 (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>\r
e75390f0 5 Copyright (c) 2006 - 2015, 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
7c25b7ea 14\r
68fb0527 15**/\r
16\r
17#include "UefiShellNetwork1CommandsLib.h"\r
18\r
7c25b7ea 19typedef enum {\r
20 IfConfigOpList = 1,\r
21 IfConfigOpSet = 2,\r
22 IfConfigOpClear = 3\r
23} IFCONFIG_OPCODE;\r
24\r
25typedef enum {\r
26 VarCheckReserved = -1,\r
27 VarCheckOk = 0,\r
28 VarCheckDuplicate,\r
29 VarCheckConflict,\r
30 VarCheckUnknown,\r
31 VarCheckLackValue,\r
32 VarCheckOutOfMem\r
33} VAR_CHECK_CODE;\r
34\r
35typedef enum {\r
36 FlagTypeSingle = 0,\r
37 FlagTypeNeedVar,\r
38 FlagTypeNeedSet,\r
39 FlagTypeSkipUnknown\r
40} VAR_CHECK_FLAG_TYPE;\r
41\r
42#define MACADDRMAXSIZE 32\r
43\r
44typedef struct _IFCONFIG_INTERFACE_CB {\r
45 EFI_HANDLE NicHandle;\r
46 LIST_ENTRY Link;\r
47 EFI_IP4_CONFIG2_PROTOCOL *IfCfg;\r
48 EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo; \r
49 EFI_IP4_CONFIG2_POLICY Policy;\r
50 UINT32 DnsCnt;\r
51 EFI_IPv4_ADDRESS DnsAddr[1];\r
52} IFCONFIG_INTERFACE_CB;\r
53\r
54typedef struct _ARG_LIST ARG_LIST;\r
55\r
56struct _ARG_LIST {\r
57 ARG_LIST *Next;\r
58 CHAR16 *Arg;\r
59};\r
60\r
61typedef struct _IFCONFIG4_PRIVATE_DATA {\r
62 LIST_ENTRY IfList;\r
63\r
64 UINT32 OpCode;\r
65 CHAR16 *IfName;\r
66 ARG_LIST *VarArg;\r
67} IFCONFIG_PRIVATE_DATA;\r
68\r
69typedef struct _VAR_CHECK_ITEM{\r
70 CHAR16 *FlagStr;\r
71 UINT32 FlagID;\r
72 UINT32 ConflictMask;\r
73 VAR_CHECK_FLAG_TYPE FlagType;\r
74} VAR_CHECK_ITEM;\r
75\r
76SHELL_PARAM_ITEM mIfConfigCheckList[] = {\r
77 {\r
78 L"-b",\r
79 TypeFlag\r
80 },\r
81 {\r
82 L"-l",\r
83 TypeValue\r
84 },\r
85 {\r
86 L"-r",\r
87 TypeValue\r
88 },\r
89 {\r
90 L"-c",\r
91 TypeValue\r
92 },\r
93 {\r
94 L"-s",\r
95 TypeMaxValue\r
96 },\r
97 {\r
98 NULL,\r
99 TypeMax\r
100 },\r
101};\r
102\r
103VAR_CHECK_ITEM mSetCheckList[] = {\r
104 {\r
105 L"static",\r
106 0x00000001,\r
107 0x00000001,\r
108 FlagTypeSingle\r
109 },\r
110 {\r
111 L"dhcp",\r
112 0x00000002,\r
113 0x00000001,\r
114 FlagTypeSingle\r
115 },\r
116 {\r
117 L"dns",\r
118 0x00000008,\r
119 0x00000004,\r
120 FlagTypeSingle\r
121 },\r
122 {\r
123 NULL,\r
124 0x0,\r
125 0x0,\r
126 FlagTypeSkipUnknown\r
127 },\r
128};\r
68fb0527 129\r
68fb0527 130STATIC CONST CHAR16 PermanentString[10] = L"PERMANENT";\r
131\r
68fb0527 132/**\r
7c25b7ea 133 Split a string with specified separator and save the substring to a list.\r
68fb0527 134\r
7c25b7ea 135 @param[in] String The pointer of the input string.\r
136 @param[in] Separator The specified separator.\r
68fb0527 137\r
7c25b7ea 138 @return The pointer of headnode of ARG_LIST.\r
68fb0527 139\r
68fb0527 140**/\r
7c25b7ea 141ARG_LIST *\r
142SplitStrToList (\r
143 IN CONST CHAR16 *String,\r
144 IN CHAR16 Separator\r
68fb0527 145 )\r
146{\r
7c25b7ea 147 CHAR16 *Str;\r
148 CHAR16 *ArgStr;\r
149 ARG_LIST *ArgList;\r
150 ARG_LIST *ArgNode;\r
68fb0527 151\r
7c25b7ea 152 if (*String == L'\0') {\r
153 return NULL;\r
68fb0527 154 }\r
155\r
68fb0527 156 //\r
7c25b7ea 157 // Copy the CONST string to a local copy.\r
68fb0527 158 //\r
7c25b7ea 159 Str = AllocateCopyPool (StrSize (String), String);\r
160 ASSERT (Str != NULL);\r
161 ArgStr = Str;\r
68fb0527 162\r
163 //\r
7c25b7ea 164 // init a node for the list head.\r
68fb0527 165 //\r
7c25b7ea 166 ArgNode = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));\r
167 ASSERT (ArgNode != NULL);\r
168 ArgList = ArgNode;\r
68fb0527 169\r
170 //\r
7c25b7ea 171 // Split the local copy and save in the list node.\r
68fb0527 172 //\r
7c25b7ea 173 while (*Str != L'\0') {\r
174 if (*Str == Separator) {\r
175 *Str = L'\0';\r
176 ArgNode->Arg = ArgStr;\r
177 ArgStr = Str + 1;\r
178 ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));\r
179 ASSERT (ArgNode->Next != NULL);\r
180 ArgNode = ArgNode->Next;\r
68fb0527 181 }\r
7c25b7ea 182\r
183 Str++;\r
68fb0527 184 }\r
185\r
7c25b7ea 186 ArgNode->Arg = ArgStr;\r
187 ArgNode->Next = NULL;\r
188\r
189 return ArgList;\r
68fb0527 190}\r
191\r
192/**\r
7c25b7ea 193 Check the correctness of input Args with '-s' option.\r
68fb0527 194\r
7c25b7ea 195 @param[in] CheckList The pointer of VAR_CHECK_ITEM array.\r
196 @param[in] Name The pointer of input arg.\r
197 @param[in] Init The switch to execute the check.\r
68fb0527 198\r
7c25b7ea 199 @return VarCheckOk Valid parameter or Initialize check successfully.\r
200 @return VarCheckDuplicate Duplicated parameter happened.\r
201 @return VarCheckConflict Conflicted parameter happened\r
202 @return VarCheckUnknown Unknown parameter.\r
68fb0527 203\r
68fb0527 204**/\r
7c25b7ea 205VAR_CHECK_CODE\r
206IfConfigRetriveCheckListByName(\r
207 IN VAR_CHECK_ITEM *CheckList,\r
208 IN CHAR16 *Name,\r
209 IN BOOLEAN Init\r
210)\r
68fb0527 211{\r
7c25b7ea 212 STATIC UINT32 CheckDuplicate;\r
213 STATIC UINT32 CheckConflict;\r
214 VAR_CHECK_CODE RtCode;\r
215 UINT32 Index;\r
216 VAR_CHECK_ITEM Arg;\r
217\r
218 if (Init) {\r
219 CheckDuplicate = 0;\r
220 CheckConflict = 0;\r
221 return VarCheckOk;\r
68fb0527 222 }\r
223\r
7c25b7ea 224 RtCode = VarCheckOk;\r
225 Index = 0;\r
226 Arg = CheckList[Index];\r
68fb0527 227\r
228 //\r
7c25b7ea 229 // Check the Duplicated/Conflicted/Unknown input Args.\r
68fb0527 230 //\r
7c25b7ea 231 while (Arg.FlagStr != NULL) {\r
232 if (StrCmp (Arg.FlagStr, Name) == 0) {\r
68fb0527 233\r
7c25b7ea 234 if (CheckDuplicate & Arg.FlagID) {\r
235 RtCode = VarCheckDuplicate;\r
236 break;\r
237 }\r
68fb0527 238\r
7c25b7ea 239 if (CheckConflict & Arg.ConflictMask) {\r
240 RtCode = VarCheckConflict;\r
241 break;\r
242 }\r
68fb0527 243\r
7c25b7ea 244 CheckDuplicate |= Arg.FlagID;\r
245 CheckConflict |= Arg.ConflictMask;\r
246 break;\r
247 }\r
68fb0527 248\r
7c25b7ea 249 Arg = CheckList[++Index];\r
68fb0527 250 }\r
7c25b7ea 251\r
252 if (Arg.FlagStr == NULL) {\r
253 RtCode = VarCheckUnknown;\r
68fb0527 254 }\r
255\r
7c25b7ea 256 return RtCode;\r
68fb0527 257}\r
258\r
259/**\r
7c25b7ea 260 The notify function of create event when performing a manual config.\r
68fb0527 261\r
7c25b7ea 262 @param[in] Event The event this notify function registered to.\r
263 @param[in] Context Pointer to the context data registered to the event.\r
68fb0527 264\r
7c25b7ea 265**/\r
266VOID\r
68fb0527 267EFIAPI\r
7c25b7ea 268IfConfigManualAddressNotify (\r
269 IN EFI_EVENT Event,\r
270 IN VOID *Context\r
271 )\r
68fb0527 272{\r
7c25b7ea 273 *((BOOLEAN *) Context) = TRUE;\r
68fb0527 274}\r
275\r
7c25b7ea 276\r
68fb0527 277/**\r
7c25b7ea 278 Print MAC address.\r
68fb0527 279\r
7c25b7ea 280 @param[in] Node The pointer of MAC address buffer.\r
281 @param[in] Size The size of MAC address buffer.\r
68fb0527 282\r
68fb0527 283**/\r
7c25b7ea 284VOID\r
285IfConfigPrintMacAddr (\r
286 IN UINT8 *Node,\r
287 IN UINT32 Size\r
288 )\r
68fb0527 289{\r
7c25b7ea 290 UINTN Index;\r
68fb0527 291\r
7c25b7ea 292 ASSERT (Size <= MACADDRMAXSIZE);\r
68fb0527 293\r
7c25b7ea 294 for (Index = 0; Index < Size; Index++) {\r
295 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_BODY), gShellNetwork1HiiHandle, Node[Index]);\r
296 if (Index + 1 < Size) {\r
297 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_COLON), gShellNetwork1HiiHandle);\r
298 }\r
68fb0527 299 }\r
68fb0527 300\r
7c25b7ea 301 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);\r
302}\r
68fb0527 303\r
68fb0527 304\r
7c25b7ea 305/**\r
306 The get current status of all handles.\r
68fb0527 307\r
7c25b7ea 308 @param[in] IfName The pointer of IfName(interface name).\r
309 @param[in] IfList The pointer of IfList(interface list).\r
68fb0527 310\r
7c25b7ea 311 @retval EFI_SUCCESS The get status processed successfully.\r
312 @retval others The get status process failed.\r
68fb0527 313\r
68fb0527 314**/\r
315EFI_STATUS\r
7c25b7ea 316IfConfigGetInterfaceInfo (\r
317 IN CHAR16 *IfName,\r
318 IN LIST_ENTRY *IfList\r
68fb0527 319 )\r
320{\r
7c25b7ea 321 EFI_STATUS Status;\r
322 UINTN HandleIndex;\r
323 UINTN HandleNum;\r
324 EFI_HANDLE *HandleBuffer;\r
325 EFI_IP4_CONFIG2_PROTOCOL *Ip4Cfg2;\r
326 EFI_IP4_CONFIG2_INTERFACE_INFO *IfInfo;\r
327 IFCONFIG_INTERFACE_CB *IfCb;\r
328 UINTN DataSize;\r
68fb0527 329\r
7c25b7ea 330 HandleBuffer = NULL;\r
331 HandleNum = 0;\r
332\r
333 IfInfo = NULL;\r
334 IfCb = NULL;\r
68fb0527 335\r
336 //\r
7c25b7ea 337 // Locate all the handles with ip4 service binding protocol.\r
68fb0527 338 //\r
339 Status = gBS->LocateHandleBuffer (\r
7c25b7ea 340 ByProtocol,\r
341 &gEfiIp4ServiceBindingProtocolGuid,\r
342 NULL,\r
343 &HandleNum,\r
344 &HandleBuffer\r
68fb0527 345 );\r
7c25b7ea 346 if (EFI_ERROR (Status) || (HandleNum == 0)) {\r
347 return EFI_ABORTED;\r
68fb0527 348 }\r
349\r
7c25b7ea 350 //\r
351 // Enumerate all handles that installed with ip4 service binding protocol.\r
352 //\r
353 for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) {\r
354 IfCb = NULL;\r
355 IfInfo = NULL;\r
356 DataSize = 0;\r
357\r
358 //\r
359 // Ip4config protocol and ip4 service binding protocol are installed\r
360 // on the same handle.\r
361 //\r
362 ASSERT (HandleBuffer != NULL);\r
363 Status = gBS->HandleProtocol (\r
364 HandleBuffer[HandleIndex],\r
365 &gEfiIp4Config2ProtocolGuid,\r
366 (VOID **) &Ip4Cfg2\r
367 );\r
368\r
68fb0527 369 if (EFI_ERROR (Status)) {\r
7c25b7ea 370 goto ON_ERROR;\r
68fb0527 371 }\r
7c25b7ea 372 \r
68fb0527 373 //\r
7c25b7ea 374 // Get the interface information size.\r
68fb0527 375 //\r
7c25b7ea 376 Status = Ip4Cfg2->GetData (\r
377 Ip4Cfg2,\r
378 Ip4Config2DataTypeInterfaceInfo,\r
379 &DataSize,\r
380 NULL\r
381 );\r
382\r
383 if (Status != EFI_BUFFER_TOO_SMALL) {\r
384 goto ON_ERROR;\r
33c031ee 385 }\r
7c25b7ea 386\r
387 IfInfo = AllocateZeroPool (DataSize);\r
388\r
389 if (IfInfo == NULL) {\r
68fb0527 390 Status = EFI_OUT_OF_RESOURCES;\r
391 goto ON_ERROR;\r
392 }\r
7c25b7ea 393 \r
68fb0527 394 //\r
7c25b7ea 395 // Get the interface info.\r
68fb0527 396 //\r
7c25b7ea 397 Status = Ip4Cfg2->GetData (\r
398 Ip4Cfg2,\r
399 Ip4Config2DataTypeInterfaceInfo,\r
400 &DataSize,\r
401 IfInfo\r
402 );\r
68fb0527 403\r
7c25b7ea 404 if (EFI_ERROR (Status)) {\r
68fb0527 405 goto ON_ERROR;\r
406 }\r
7c25b7ea 407 \r
68fb0527 408 //\r
7c25b7ea 409 // Check the interface name if required.\r
68fb0527 410 //\r
7c25b7ea 411 if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) != 0)) {\r
412 FreePool (IfInfo);\r
413 continue;\r
68fb0527 414 }\r
415\r
7c25b7ea 416 DataSize = 0;\r
417 \r
68fb0527 418 //\r
7c25b7ea 419 // Get the size of dns server list.\r
68fb0527 420 //\r
7c25b7ea 421 Status = Ip4Cfg2->GetData (\r
422 Ip4Cfg2,\r
423 Ip4Config2DataTypeDnsServer,\r
424 &DataSize,\r
425 NULL\r
426 );\r
427\r
428 if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) {\r
429 goto ON_ERROR;\r
430 }\r
431\r
432 IfCb = AllocateZeroPool (sizeof (IFCONFIG_INTERFACE_CB) + DataSize);\r
68fb0527 433\r
7c25b7ea 434 if (IfCb == NULL) {\r
68fb0527 435 Status = EFI_OUT_OF_RESOURCES;\r
436 goto ON_ERROR;\r
437 }\r
438\r
7c25b7ea 439 IfCb->NicHandle = HandleBuffer[HandleIndex];\r
440 IfCb->IfInfo = IfInfo;\r
441 IfCb->IfCfg = Ip4Cfg2;\r
442 IfCb->DnsCnt = (UINT32) (DataSize / sizeof (EFI_IPv4_ADDRESS));\r
443\r
68fb0527 444 //\r
7c25b7ea 445 // Get the dns server list if has.\r
68fb0527 446 //\r
7c25b7ea 447 if (DataSize > 0) {\r
448 Status = Ip4Cfg2->GetData (\r
449 Ip4Cfg2,\r
450 Ip4Config2DataTypeDnsServer,\r
451 &DataSize,\r
452 IfCb->DnsAddr\r
453 );\r
454\r
455 if (EFI_ERROR (Status)) {\r
456 goto ON_ERROR;\r
68fb0527 457 }\r
68fb0527 458 }\r
459\r
460 //\r
7c25b7ea 461 // Get the config policy.\r
68fb0527 462 //\r
7c25b7ea 463 DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);\r
464 Status = Ip4Cfg2->GetData (\r
465 Ip4Cfg2,\r
466 Ip4Config2DataTypePolicy,\r
467 &DataSize,\r
468 &IfCb->Policy\r
469 );\r
470\r
471 if (EFI_ERROR (Status)) {\r
472 goto ON_ERROR;\r
473 }\r
474\r
475 InsertTailList (IfList, &IfCb->Link);\r
68fb0527 476\r
7c25b7ea 477 if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) == 0)) {\r
478 //\r
479 // Only need the appointed interface, keep the allocated buffer.\r
480 //\r
481 IfCb = NULL;\r
482 IfInfo = NULL;\r
483 break;\r
484 }\r
68fb0527 485 }\r
486\r
7c25b7ea 487 if (HandleBuffer != NULL) {\r
488 FreePool (HandleBuffer);\r
489 }\r
68fb0527 490\r
491 return EFI_SUCCESS;\r
7c25b7ea 492\r
68fb0527 493ON_ERROR:\r
7c25b7ea 494\r
495 if (IfInfo != NULL) {\r
496 FreePool (IfInfo);\r
68fb0527 497 }\r
498\r
7c25b7ea 499 if (IfCb != NULL) {\r
500 FreePool (IfCb);\r
501 }\r
68fb0527 502\r
503 return Status;\r
504}\r
505\r
506/**\r
7c25b7ea 507 The list process of the ifconfig command.\r
68fb0527 508\r
7c25b7ea 509 @param[in] IfList The pointer of IfList(interface list).\r
510\r
511 @retval EFI_SUCCESS The ifconfig command list processed successfully.\r
512 @retval others The ifconfig command list process failed.\r
68fb0527 513\r
68fb0527 514**/\r
7c25b7ea 515EFI_STATUS\r
516IfConfigShowInterfaceInfo (\r
517 IN LIST_ENTRY *IfList\r
68fb0527 518 )\r
519{\r
7c25b7ea 520 LIST_ENTRY *Entry;\r
521 LIST_ENTRY *Next;\r
522 IFCONFIG_INTERFACE_CB *IfCb;\r
523 EFI_IPv4_ADDRESS Gateway;\r
524 UINT32 Index;\r
68fb0527 525\r
7c25b7ea 526 if (IsListEmpty (IfList)) {\r
527 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle);\r
68fb0527 528 }\r
529\r
530 //\r
7c25b7ea 531 // Go through the interface list.\r
68fb0527 532 //\r
7c25b7ea 533 NET_LIST_FOR_EACH_SAFE (Entry, Next, IfList) {\r
534 IfCb = NET_LIST_USER_STRUCT (Entry, IFCONFIG_INTERFACE_CB, Link);\r
68fb0527 535\r
7c25b7ea 536 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);\r
68fb0527 537\r
7c25b7ea 538 //\r
539 // Print interface name.\r
540 //\r
541 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IF_NAME), gShellNetwork1HiiHandle, IfCb->IfInfo->Name);\r
68fb0527 542\r
7c25b7ea 543 //\r
544 // Print interface config policy.\r
545 //\r
546 if (IfCb->Policy == Ip4Config2PolicyDhcp) {\r
547 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_DHCP), gShellNetwork1HiiHandle);\r
548 } else {\r
549 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_POLICY_MAN), gShellNetwork1HiiHandle);\r
550 }\r
68fb0527 551\r
7c25b7ea 552 //\r
553 // Print mac address of the interface.\r
554 //\r
555 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_MAC_ADDR_HEAD), gShellNetwork1HiiHandle);\r
68fb0527 556\r
7c25b7ea 557 IfConfigPrintMacAddr (\r
558 IfCb->IfInfo->HwAddress.Addr,\r
559 IfCb->IfInfo->HwAddressSize\r
560 );\r
68fb0527 561\r
7c25b7ea 562 //\r
563 // Print IPv4 address list of the interface.\r
564 //\r
565 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_HEAD), gShellNetwork1HiiHandle);\r
68fb0527 566\r
7c25b7ea 567 ShellPrintHiiEx(\r
568 -1, \r
569 -1, \r
570 NULL,\r
571 STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), \r
572 gShellNetwork1HiiHandle,\r
573 (UINTN)IfCb->IfInfo->StationAddress.Addr[0],\r
574 (UINTN)IfCb->IfInfo->StationAddress.Addr[1],\r
575 (UINTN)IfCb->IfInfo->StationAddress.Addr[2],\r
576 (UINTN)IfCb->IfInfo->StationAddress.Addr[3]\r
577 );\r
578\r
579 //\r
580 // Print subnet mask list of the interface.\r
581 //\r
582 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_SUBNET_MASK_HEAD), gShellNetwork1HiiHandle);\r
68fb0527 583\r
68fb0527 584 ShellPrintHiiEx(\r
585 -1, \r
586 -1, \r
587 NULL,\r
7c25b7ea 588 STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), \r
589 gShellNetwork1HiiHandle,\r
590 (UINTN)IfCb->IfInfo->SubnetMask.Addr[0],\r
591 (UINTN)IfCb->IfInfo->SubnetMask.Addr[1],\r
592 (UINTN)IfCb->IfInfo->SubnetMask.Addr[2],\r
593 (UINTN)IfCb->IfInfo->SubnetMask.Addr[3]\r
68fb0527 594 );\r
68fb0527 595\r
7c25b7ea 596 //\r
597 // Print default gateway of the interface.\r
598 //\r
599 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_GATEWAY_HEAD), gShellNetwork1HiiHandle);\r
600\r
601 ZeroMem (&Gateway, sizeof (EFI_IPv4_ADDRESS));\r
602 \r
603 for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {\r
604 if ((CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetAddress, &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) &&\r
605 (CompareMem (&IfCb->IfInfo->RouteTable[Index].SubnetMask , &mZeroIp4Addr, sizeof (EFI_IPv4_ADDRESS)) == 0) ){\r
606 CopyMem (&Gateway, &IfCb->IfInfo->RouteTable[Index].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));\r
607 }\r
608 } \r
609\r
68fb0527 610 ShellPrintHiiEx(\r
7c25b7ea 611 -1, \r
612 -1, \r
613 NULL,\r
614 STRING_TOKEN (STR_IFCONFIG_INFO_IP_ADDR_BODY), \r
615 gShellNetwork1HiiHandle,\r
616 (UINTN)Gateway.Addr[0],\r
617 (UINTN)Gateway.Addr[1],\r
618 (UINTN)Gateway.Addr[2],\r
619 (UINTN)Gateway.Addr[3]\r
620 );\r
621 \r
622 //\r
623 // Print route table entry.\r
624 //\r
625 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE), gShellNetwork1HiiHandle, IfCb->IfInfo->RouteTableSize);\r
626\r
627 for (Index = 0; Index < IfCb->IfInfo->RouteTableSize; Index++) {\r
628 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX), gShellNetwork1HiiHandle, Index);\r
629\r
630 ShellPrintHiiEx(\r
631 -1, \r
632 -1, \r
633 NULL,\r
634 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), \r
635 gShellNetwork1HiiHandle, \r
636 L"Subnet ",\r
637 (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[0],\r
638 (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[1],\r
639 (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[2],\r
640 (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetAddress.Addr[3]\r
641 );\r
642\r
643 ShellPrintHiiEx(\r
644 -1, \r
645 -1, \r
646 NULL,\r
647 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), \r
648 gShellNetwork1HiiHandle, \r
649 L"Netmask",\r
650 (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[0],\r
651 (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[1],\r
652 (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[2],\r
653 (UINTN)IfCb->IfInfo->RouteTable[Index].SubnetMask.Addr[3]\r
654 );\r
655\r
656 ShellPrintHiiEx(\r
657 -1, \r
658 -1, \r
659 NULL,\r
660 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR), \r
661 gShellNetwork1HiiHandle, \r
662 L"Gateway",\r
663 (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[0],\r
664 (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[1],\r
665 (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[2],\r
666 (UINTN)IfCb->IfInfo->RouteTable[Index].GatewayAddress.Addr[3]\r
667 );\r
668 }\r
669\r
670 //\r
671 // Print dns server addresses list of the interface if has.\r
672 //\r
673 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_HEAD), gShellNetwork1HiiHandle);\r
674\r
675 for (Index = 0; Index < IfCb->DnsCnt; Index++) {\r
676 ShellPrintHiiEx(\r
677 -1, \r
678 -1, \r
679 NULL,\r
680 STRING_TOKEN (STR_IFCONFIG_INFO_DNS_ADDR_BODY), \r
681 gShellNetwork1HiiHandle,\r
682 (UINTN) IfCb->DnsAddr[Index].Addr[0],\r
683 (UINTN) IfCb->DnsAddr[Index].Addr[1],\r
684 (UINTN) IfCb->DnsAddr[Index].Addr[2],\r
685 (UINTN) IfCb->DnsAddr[Index].Addr[3]\r
686 );\r
687\r
688 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_NEWLINE), gShellNetwork1HiiHandle);\r
689 }\r
68fb0527 690 }\r
7c25b7ea 691 \r
692 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INFO_BREAK), gShellNetwork1HiiHandle);\r
68fb0527 693\r
7c25b7ea 694 return EFI_SUCCESS;\r
68fb0527 695}\r
696\r
697/**\r
7c25b7ea 698 The clean process of the ifconfig command to clear interface info.\r
699\r
700 @param[in] IfList The pointer of IfList(interface list).\r
68fb0527 701\r
7c25b7ea 702 @retval EFI_SUCCESS The ifconfig command clean processed successfully.\r
703 @retval others The ifconfig command clean process failed.\r
68fb0527 704\r
68fb0527 705**/\r
7c25b7ea 706EFI_STATUS\r
707IfConfigClearInterfaceInfo (\r
708 IN LIST_ENTRY *IfList\r
68fb0527 709 )\r
710{\r
7c25b7ea 711 EFI_STATUS Status;\r
712 LIST_ENTRY *Entry;\r
713 LIST_ENTRY *Next;\r
714 IFCONFIG_INTERFACE_CB *IfCb;\r
715 EFI_IP4_CONFIG2_POLICY Policy;\r
68fb0527 716\r
7c25b7ea 717 Policy = Ip4Config2PolicyDhcp;\r
718 Status = EFI_SUCCESS;\r
68fb0527 719\r
7c25b7ea 720 if (IsListEmpty (IfList)) {\r
721 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle);\r
68fb0527 722 }\r
723\r
724 //\r
7c25b7ea 725 // Go through the interface list.\r
68fb0527 726 //\r
7c25b7ea 727 NET_LIST_FOR_EACH_SAFE (Entry, Next, IfList) {\r
728 IfCb = NET_LIST_USER_STRUCT (Entry, IFCONFIG_INTERFACE_CB, Link);\r
68fb0527 729 \r
7c25b7ea 730 Status = IfCb->IfCfg->SetData (\r
731 IfCb->IfCfg,\r
732 Ip4Config2DataTypePolicy,\r
733 sizeof (EFI_IP4_CONFIG2_POLICY),\r
734 &Policy\r
735 );\r
68fb0527 736\r
7c25b7ea 737 if (EFI_ERROR (Status)) {\r
738 break;\r
739 }\r
68fb0527 740 }\r
741\r
7c25b7ea 742 return Status;\r
68fb0527 743}\r
744\r
745/**\r
7c25b7ea 746 The set process of the ifconfig command.\r
68fb0527 747\r
7c25b7ea 748 @param[in] IfList The pointer of IfList(interface list).\r
749 @param[in] VarArg The pointer of ARG_LIST(Args with "-s" option).\r
68fb0527 750\r
7c25b7ea 751 @retval EFI_SUCCESS The ifconfig command set processed successfully.\r
752 @retval others The ifconfig command set process failed.\r
68fb0527 753\r
68fb0527 754**/\r
755EFI_STATUS\r
7c25b7ea 756IfConfigSetInterfaceInfo (\r
757 IN LIST_ENTRY *IfList,\r
758 IN ARG_LIST *VarArg\r
68fb0527 759 )\r
760{\r
68fb0527 761\r
7c25b7ea 762 EFI_STATUS Status;\r
763 IFCONFIG_INTERFACE_CB *IfCb;\r
764 VAR_CHECK_CODE CheckCode;\r
765 EFI_EVENT TimeOutEvt;\r
766 EFI_EVENT MappedEvt;\r
767 BOOLEAN IsAddressOk;\r
68fb0527 768\r
7c25b7ea 769 EFI_IP4_CONFIG2_POLICY Policy;\r
770 EFI_IP4_CONFIG2_MANUAL_ADDRESS ManualAddress;\r
771 UINTN DataSize;\r
772 EFI_IPv4_ADDRESS Gateway;\r
773 EFI_IPv4_ADDRESS *Dns;\r
774 ARG_LIST *Tmp;\r
775 UINTN Index;\r
68fb0527 776\r
7c25b7ea 777 CONST CHAR16* TempString;\r
68fb0527 778\r
7c25b7ea 779 Dns = NULL;\r
68fb0527 780\r
7c25b7ea 781 if (IsListEmpty (IfList)) {\r
782 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_INVALID_INTERFACE), gShellNetwork1HiiHandle);\r
783 return EFI_INVALID_PARAMETER;\r
68fb0527 784 }\r
68fb0527 785 \r
7c25b7ea 786 //\r
787 // Make sure to set only one interface each time.\r
788 //\r
789 IfCb = NET_LIST_USER_STRUCT (IfList->ForwardLink, IFCONFIG_INTERFACE_CB, Link);\r
790 Status = EFI_SUCCESS;\r
68fb0527 791\r
7c25b7ea 792 //\r
793 // Initialize check list mechanism.\r
794 //\r
795 CheckCode = IfConfigRetriveCheckListByName(\r
796 NULL,\r
797 NULL,\r
798 TRUE\r
799 );\r
68fb0527 800\r
7c25b7ea 801 //\r
802 // Create events & timers for asynchronous settings.\r
803 //\r
804 Status = gBS->CreateEvent (\r
805 EVT_TIMER,\r
806 TPL_CALLBACK,\r
807 NULL,\r
808 NULL,\r
809 &TimeOutEvt\r
810 );\r
68fb0527 811 if (EFI_ERROR (Status)) {\r
7c25b7ea 812 goto ON_EXIT;\r
68fb0527 813 }\r
814\r
7c25b7ea 815 Status = gBS->CreateEvent (\r
816 EVT_NOTIFY_SIGNAL,\r
817 TPL_NOTIFY,\r
818 IfConfigManualAddressNotify,\r
819 &IsAddressOk,\r
820 &MappedEvt\r
821 );\r
822 if (EFI_ERROR (Status)) {\r
823 goto ON_EXIT;\r
68fb0527 824 }\r
825\r
7c25b7ea 826 //\r
827 // Parse the setting variables.\r
828 //\r
829 while (VarArg != NULL) {\r
830 //\r
831 // Check invalid parameters (duplication & unknown & conflict).\r
832 //\r
833 CheckCode = IfConfigRetriveCheckListByName(\r
834 mSetCheckList,\r
835 VarArg->Arg,\r
836 FALSE\r
837 );\r
68fb0527 838\r
7c25b7ea 839 if (VarCheckOk != CheckCode) {\r
840 switch (CheckCode) {\r
841 case VarCheckDuplicate:\r
842 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_DUPLICATE_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);\r
843 break;\r
68fb0527 844\r
7c25b7ea 845 case VarCheckConflict:\r
846 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_CONFLICT_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);\r
847 break;\r
68fb0527 848\r
7c25b7ea 849 case VarCheckUnknown:\r
850 //\r
851 // To handle unsupported option.\r
852 //\r
853 TempString = PermanentString;\r
854 if (StringNoCaseCompare(&VarArg->Arg, &TempString) == 0) {\r
855 ShellPrintHiiEx(-1, -1, NULL,STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle, PermanentString);\r
856 goto ON_EXIT;\r
857 }\r
68fb0527 858\r
7c25b7ea 859 //\r
860 // To handle unknown option.\r
861 //\r
862 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNKNOWN_COMMAND), gShellNetwork1HiiHandle, VarArg->Arg);\r
863 break;\r
68fb0527 864\r
7c25b7ea 865 default:\r
866 break;\r
867 }\r
68fb0527 868\r
7c25b7ea 869 VarArg = VarArg->Next;\r
870 continue; \r
871 }\r
68fb0527 872\r
68fb0527 873 //\r
7c25b7ea 874 // Process valid variables.\r
68fb0527 875 //\r
7c25b7ea 876 if (StrCmp(VarArg->Arg, L"dhcp") == 0) {\r
877 //\r
878 // Set dhcp config policy\r
879 //\r
880 Policy = Ip4Config2PolicyDhcp;\r
881 Status = IfCb->IfCfg->SetData (\r
882 IfCb->IfCfg,\r
883 Ip4Config2DataTypePolicy,\r
884 sizeof (EFI_IP4_CONFIG2_POLICY),\r
885 &Policy\r
886 );\r
887\r
888 if (EFI_ERROR(Status)) {\r
889 goto ON_EXIT;\r
890 }\r
68fb0527 891\r
7c25b7ea 892 VarArg= VarArg->Next; \r
68fb0527 893\r
7c25b7ea 894 } else if (StrCmp (VarArg->Arg, L"static") == 0) {\r
895 //\r
896 // Set manual config policy.\r
897 //\r
898 Policy = Ip4Config2PolicyStatic;\r
899 Status = IfCb->IfCfg->SetData (\r
900 IfCb->IfCfg,\r
901 Ip4Config2DataTypePolicy,\r
902 sizeof (EFI_IP4_CONFIG2_POLICY),\r
903 &Policy\r
904 );\r
905\r
906 if (EFI_ERROR(Status)) {\r
68fb0527 907 goto ON_EXIT;\r
908 }\r
909\r
7c25b7ea 910 VarArg= VarArg->Next; \r
68fb0527 911\r
7c25b7ea 912 ZeroMem (&ManualAddress, sizeof (ManualAddress));\r
913 \r
914 //\r
915 // Get manual IP address.\r
916 //\r
917 Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.Address);\r
918 if (EFI_ERROR(Status)) {\r
919 goto ON_EXIT;\r
920 }\r
68fb0527 921\r
7c25b7ea 922 //\r
923 // Get subnetmask.\r
924 // \r
925 VarArg = VarArg->Next;\r
926 Status = NetLibStrToIp4 (VarArg->Arg, &ManualAddress.SubnetMask);\r
927 if (EFI_ERROR(Status)) {\r
928 goto ON_EXIT;\r
929 }\r
68fb0527 930\r
7c25b7ea 931 //\r
932 // Get gateway.\r
933 //\r
934 VarArg = VarArg->Next;\r
935 Status = NetLibStrToIp4 (VarArg->Arg, &Gateway);\r
936 if (EFI_ERROR(Status)) {\r
937 goto ON_EXIT;\r
938 }\r
939 \r
940 IsAddressOk = FALSE;\r
941\r
942 Status = IfCb->IfCfg->RegisterDataNotify (\r
943 IfCb->IfCfg,\r
944 Ip4Config2DataTypeManualAddress,\r
945 MappedEvt\r
946 );\r
947 if (EFI_ERROR (Status)) {\r
948 goto ON_EXIT;\r
949 }\r
68fb0527 950\r
7c25b7ea 951 DataSize = sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS);\r
68fb0527 952\r
7c25b7ea 953 Status = IfCb->IfCfg->SetData (\r
954 IfCb->IfCfg,\r
955 Ip4Config2DataTypeManualAddress,\r
956 DataSize,\r
957 &ManualAddress\r
958 );\r
68fb0527 959\r
7c25b7ea 960 if (Status == EFI_NOT_READY) {\r
961 gBS->SetTimer (TimeOutEvt, TimerRelative, 50000000);\r
68fb0527 962\r
7c25b7ea 963 while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) {\r
964 if (IsAddressOk) {\r
965 Status = EFI_SUCCESS;\r
966 break;\r
967 }\r
968 }\r
969 }\r
68fb0527 970\r
7c25b7ea 971 IfCb->IfCfg->UnregisterDataNotify (\r
972 IfCb->IfCfg,\r
973 Ip4Config2DataTypeManualAddress,\r
974 MappedEvt\r
975 );\r
68fb0527 976\r
7c25b7ea 977 if (EFI_ERROR (Status)) {\r
978 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_SET_ADDR_FAILED), gShellNetwork1HiiHandle, Status);\r
68fb0527 979 goto ON_EXIT;\r
980 }\r
981\r
7c25b7ea 982 //\r
983 // Set gateway.\r
984 //\r
985 DataSize = sizeof (EFI_IPv4_ADDRESS);\r
986\r
987 Status = IfCb->IfCfg->SetData (\r
988 IfCb->IfCfg,\r
989 Ip4Config2DataTypeGateway,\r
990 DataSize,\r
991 &Gateway\r
992 );\r
993 VarArg = VarArg->Next;\r
994 \r
995 } else if (StrCmp (VarArg->Arg, L"dns") == 0) {\r
996 //\r
997 // Get DNS addresses.\r
998 //\r
999 VarArg = VarArg->Next;\r
1000 Tmp = VarArg;\r
1001 Index = 0;\r
1002 while (Tmp != NULL) {\r
1003 Index ++;\r
1004 Tmp = Tmp->Next;\r
1005 }\r
68fb0527 1006\r
7c25b7ea 1007 Dns = AllocatePool (Index * sizeof (EFI_IPv4_ADDRESS));\r
1008 ASSERT(Dns != NULL);\r
1009 Tmp = VarArg;\r
1010 Index = 0;\r
1011 while (Tmp != NULL) {\r
1012 Status = NetLibStrToIp4 (Tmp->Arg, Dns + Index);\r
1013 if (EFI_ERROR(Status)) {\r
1014 goto ON_EXIT;\r
1015 }\r
1016 Index ++;\r
1017 Tmp = Tmp->Next;\r
1018 }\r
1019 \r
1020 VarArg = Tmp;\r
68fb0527 1021\r
7c25b7ea 1022 //\r
1023 // Set DNS addresses.\r
1024 //\r
1025 DataSize = Index * sizeof (EFI_IPv4_ADDRESS);\r
1026\r
1027 Status = IfCb->IfCfg->SetData (\r
1028 IfCb->IfCfg,\r
1029 Ip4Config2DataTypeDnsServer,\r
1030 DataSize,\r
1031 Dns\r
1032 );\r
68fb0527 1033 }\r
7c25b7ea 1034 }\r
68fb0527 1035\r
7c25b7ea 1036ON_EXIT:\r
1037 if (Dns != NULL) {\r
1038 FreePool (Dns);\r
1039 }\r
1040 \r
1041 return EFI_SUCCESS;\r
68fb0527 1042\r
7c25b7ea 1043}\r
68fb0527 1044\r
7c25b7ea 1045/**\r
1046 The ifconfig command main process.\r
68fb0527 1047\r
7c25b7ea 1048 @param[in] Private The pointer of IFCONFIG_PRIVATE_DATA.\r
68fb0527 1049\r
7c25b7ea 1050 @retval EFI_SUCCESS ifconfig command processed successfully.\r
1051 @retval others The ifconfig command process failed.\r
68fb0527 1052\r
7c25b7ea 1053**/\r
1054EFI_STATUS\r
1055IfConfig (\r
1056 IN IFCONFIG_PRIVATE_DATA *Private\r
1057 )\r
1058{\r
1059 EFI_STATUS Status;\r
68fb0527 1060\r
1061 //\r
7c25b7ea 1062 // Get configure information of all interfaces.\r
68fb0527 1063 //\r
7c25b7ea 1064 Status = IfConfigGetInterfaceInfo (\r
1065 Private->IfName,\r
1066 &Private->IfList\r
1067 );\r
68fb0527 1068\r
7c25b7ea 1069 if (EFI_ERROR (Status)) {\r
1070 goto ON_EXIT;\r
68fb0527 1071 }\r
1072\r
7c25b7ea 1073 switch (Private->OpCode) {\r
1074 case IfConfigOpList:\r
1075 Status = IfConfigShowInterfaceInfo (&Private->IfList);\r
1076 break;\r
1077\r
1078 case IfConfigOpClear:\r
1079 Status = IfConfigClearInterfaceInfo (&Private->IfList);\r
1080 break;\r
1081\r
1082 case IfConfigOpSet:\r
1083 Status = IfConfigSetInterfaceInfo (&Private->IfList, Private->VarArg);\r
1084 break;\r
1085\r
1086 default:\r
1087 Status = EFI_ABORTED;\r
68fb0527 1088 }\r
7c25b7ea 1089\r
68fb0527 1090ON_EXIT:\r
7c25b7ea 1091\r
1092 return Status;\r
68fb0527 1093}\r
1094\r
1095/**\r
7c25b7ea 1096 The ifconfig command cleanup process, free the allocated memory.\r
1097\r
1098 @param[in] Private The pointer of IFCONFIG_PRIVATE_DATA.\r
68fb0527 1099\r
68fb0527 1100**/\r
1101VOID\r
7c25b7ea 1102IfConfigCleanup (\r
1103 IN IFCONFIG_PRIVATE_DATA *Private\r
68fb0527 1104 )\r
1105{\r
1106 LIST_ENTRY *Entry;\r
1107 LIST_ENTRY *NextEntry;\r
7c25b7ea 1108 IFCONFIG_INTERFACE_CB *IfCb;\r
1109 ARG_LIST *ArgNode;\r
1110 ARG_LIST *ArgHead;\r
68fb0527 1111\r
7c25b7ea 1112 ASSERT (Private != NULL);\r
68fb0527 1113\r
7c25b7ea 1114 //\r
1115 // Clean the list which save the set config Args.\r
1116 //\r
1117 if (Private->VarArg != NULL) {\r
1118 ArgHead = Private->VarArg;\r
68fb0527 1119\r
7c25b7ea 1120 while (ArgHead->Next != NULL) {\r
1121 ArgNode = ArgHead->Next;\r
1122 FreePool (ArgHead);\r
1123 ArgHead = ArgNode;\r
68fb0527 1124 }\r
1125\r
7c25b7ea 1126 FreePool (ArgHead);\r
68fb0527 1127 }\r
1128\r
7c25b7ea 1129 if (Private->IfName != NULL) {\r
1130 FreePool (Private->IfName);\r
1131 }\r
68fb0527 1132\r
7c25b7ea 1133 //\r
1134 // Clean the IFCONFIG_INTERFACE_CB list.\r
1135 //\r
1136 NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &Private->IfList) {\r
1137 IfCb = NET_LIST_USER_STRUCT (Entry, IFCONFIG_INTERFACE_CB, Link);\r
68fb0527 1138\r
7c25b7ea 1139 RemoveEntryList (&IfCb->Link);\r
68fb0527 1140\r
7c25b7ea 1141 if (IfCb->IfInfo != NULL) {\r
68fb0527 1142\r
7c25b7ea 1143 FreePool (IfCb->IfInfo);\r
68fb0527 1144 }\r
1145\r
7c25b7ea 1146 FreePool (IfCb);\r
68fb0527 1147 }\r
1148\r
7c25b7ea 1149 FreePool (Private);\r
68fb0527 1150}\r
1151\r
1152/**\r
1153 Function for 'ifconfig' command.\r
1154\r
1155 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
1156 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
7c25b7ea 1157\r
1158 @retval EFI_SUCCESS ifconfig command processed successfully.\r
1159 @retval others The ifconfig command process failed.\r
1160 \r
68fb0527 1161**/\r
1162SHELL_STATUS\r
1163EFIAPI\r
1164ShellCommandRunIfconfig (\r
1165 IN EFI_HANDLE ImageHandle,\r
1166 IN EFI_SYSTEM_TABLE *SystemTable\r
1167 )\r
1168{\r
7c25b7ea 1169 EFI_STATUS Status;\r
1170 IFCONFIG_PRIVATE_DATA *Private;\r
1171 LIST_ENTRY *ParamPackage;\r
1172 CONST CHAR16 *ValueStr;\r
1173 ARG_LIST *ArgList;\r
1174 CHAR16 *ProblemParam;\r
1175 CHAR16 *Str;\r
1176\r
1177 Private = NULL;\r
1178\r
1179 Status = ShellCommandLineParseEx (mIfConfigCheckList, &ParamPackage, &ProblemParam, TRUE, FALSE);\r
1180 if (EFI_ERROR (Status)) {\r
1181 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellNetwork1HiiHandle, L"ifconfig", ProblemParam);\r
1182 goto ON_EXIT;\r
1183 }\r
68fb0527 1184\r
1185 //\r
7c25b7ea 1186 // To handle unsupported option.\r
68fb0527 1187 //\r
7c25b7ea 1188 if (ShellCommandLineGetFlag (ParamPackage, L"-c")) {\r
1189 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_UNSUPPORTED_OPTION), gShellNetwork1HiiHandle,L"-c");\r
1190 goto ON_EXIT;\r
1191 }\r
68fb0527 1192\r
1193 //\r
7c25b7ea 1194 // To handle no option.\r
68fb0527 1195 //\r
7c25b7ea 1196 if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && !ShellCommandLineGetFlag (ParamPackage, L"-s") &&\r
1197 !ShellCommandLineGetFlag (ParamPackage, L"-l")) {\r
1198 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_OPTION), gShellNetwork1HiiHandle);\r
1199 goto ON_EXIT;\r
68fb0527 1200 }\r
1201\r
7c25b7ea 1202 //\r
1203 // To handle conflict options.\r
1204 //\r
1205 if (((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-s"))) ||\r
1206 ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||\r
1207 ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-l")))) {\r
1208 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CON), gShellNetwork1HiiHandle, L"ifconfig");\r
1209 goto ON_EXIT;\r
68fb0527 1210 }\r
68fb0527 1211\r
7c25b7ea 1212 Status = EFI_INVALID_PARAMETER;\r
1213\r
1214 Private = AllocateZeroPool (sizeof (IFCONFIG_PRIVATE_DATA));\r
1215\r
1216 if (Private == NULL) {\r
1217 Status = EFI_OUT_OF_RESOURCES;\r
1218 goto ON_EXIT;\r
68fb0527 1219 }\r
1220\r
7c25b7ea 1221 InitializeListHead (&Private->IfList);\r
68fb0527 1222\r
7c25b7ea 1223 //\r
1224 // To get interface name for the list option.\r
1225 //\r
1226 if (ShellCommandLineGetFlag (ParamPackage, L"-l")) {\r
1227 Private->OpCode = IfConfigOpList;\r
1228 ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l");\r
1229 if (ValueStr != NULL) {\r
1230 Str = AllocateCopyPool (StrSize (ValueStr), ValueStr);\r
1231 ASSERT (Str != NULL);\r
1232 Private->IfName = Str;\r
1233 }\r
1234 }\r
1235 \r
1236 //\r
1237 // To get interface name for the clear option.\r
1238 //\r
1239 if (ShellCommandLineGetFlag (ParamPackage, L"-r")) {\r
1240 Private->OpCode = IfConfigOpClear;\r
1241 ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r");\r
1242 if (ValueStr != NULL) {\r
1243 Str = AllocateCopyPool (StrSize (ValueStr), ValueStr);\r
1244 ASSERT (Str != NULL);\r
1245 Private->IfName = Str;\r
1246 }\r
1247 }\r
1248 \r
1249 //\r
1250 // To get interface name and corresponding Args for the set option.\r
1251 //\r
1252 if (ShellCommandLineGetFlag (ParamPackage, L"-s")) {\r
1253 ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s");\r
1254 if (ValueStr == NULL) {\r
1255 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_INTERFACE), gShellNetwork1HiiHandle);\r
1256 goto ON_EXIT;\r
1257 }\r
68fb0527 1258 \r
1259 //\r
7c25b7ea 1260 // To split the configuration into multi-section.\r
68fb0527 1261 //\r
7c25b7ea 1262 ArgList = SplitStrToList (ValueStr, L' ');\r
1263 ASSERT (ArgList != NULL);\r
68fb0527 1264\r
7c25b7ea 1265 Private->OpCode = IfConfigOpSet;\r
1266 Private->IfName = ArgList->Arg;\r
68fb0527 1267\r
7c25b7ea 1268 Private->VarArg = ArgList->Next;\r
68fb0527 1269\r
7c25b7ea 1270 if (Private->IfName == NULL || Private->VarArg == NULL) {\r
1271 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG_LACK_COMMAND), gShellNetwork1HiiHandle);\r
1272 goto ON_EXIT;\r
68fb0527 1273 }\r
68fb0527 1274 }\r
7c25b7ea 1275 \r
1276 //\r
1277 // Main process of ifconfig.\r
1278 //\r
1279 Status = IfConfig (Private);\r
68fb0527 1280\r
7c25b7ea 1281ON_EXIT:\r
68fb0527 1282\r
7c25b7ea 1283 ShellCommandLineFreeVarList (ParamPackage);\r
1284 \r
1285 if (Private != NULL) {\r
1286 IfConfigCleanup (Private);\r
68fb0527 1287 }\r
1288\r
7c25b7ea 1289 return Status;\r
68fb0527 1290}\r