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