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