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