]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellNetwork2CommandsLib/Ifconfig6.c
CryptoPkg: Append options to make CLANG9 tool chain pass build
[mirror_edk2.git] / ShellPkg / Library / UefiShellNetwork2CommandsLib / Ifconfig6.c
CommitLineData
43ca1753
ZL
1/** @file\r
2 The implementation for Shell command IfConfig6.\r
3\r
4 Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
1f480707 5 (C) Copyright 2017 Hewlett Packard Enterprise Development LP<BR>\r
43ca1753 6\r
56ba3746 7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
43ca1753
ZL
8\r
9**/\r
10#include "UefiShellNetwork2CommandsLib.h"\r
11\r
12enum {\r
13 IfConfig6OpList = 1,\r
14 IfConfig6OpSet = 2,\r
15 IfConfig6OpClear = 3\r
16};\r
17\r
18typedef enum {\r
19 VarCheckReserved = -1,\r
20 VarCheckOk = 0,\r
21 VarCheckDuplicate,\r
22 VarCheckConflict,\r
23 VarCheckUnknown,\r
24 VarCheckLackValue,\r
25 VarCheckOutOfMem\r
26} VAR_CHECK_CODE;\r
27\r
28typedef enum {\r
29 FlagTypeSingle = 0,\r
30 FlagTypeNeedVar,\r
31 FlagTypeNeedSet,\r
32 FlagTypeSkipUnknown\r
33} VAR_CHECK_FLAG_TYPE;\r
34\r
35#define MACADDRMAXSIZE 32\r
36#define PREFIXMAXLEN 16\r
37\r
38typedef struct _IFCONFIG6_INTERFACE_CB {\r
39 EFI_HANDLE NicHandle;\r
40 LIST_ENTRY Link;\r
41 EFI_IP6_CONFIG_PROTOCOL *IfCfg;\r
42 EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo;\r
43 EFI_IP6_CONFIG_INTERFACE_ID *IfId;\r
44 EFI_IP6_CONFIG_POLICY Policy;\r
45 EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS Xmits;\r
46 UINT32 DnsCnt;\r
47 EFI_IPv6_ADDRESS DnsAddr[1];\r
48} IFCONFIG6_INTERFACE_CB;\r
49\r
50typedef struct _ARG_LIST ARG_LIST;\r
51\r
52struct _ARG_LIST {\r
53 ARG_LIST *Next;\r
54 CHAR16 *Arg;\r
55};\r
56\r
57typedef struct _IFCONFIG6_PRIVATE_DATA {\r
58 EFI_HANDLE ImageHandle;\r
59 LIST_ENTRY IfList;\r
60\r
61 UINT32 OpCode;\r
62 CHAR16 *IfName;\r
63 ARG_LIST *VarArg;\r
64} IFCONFIG6_PRIVATE_DATA;\r
65\r
66typedef struct _VAR_CHECK_ITEM{\r
67 CHAR16 *FlagStr;\r
68 UINT32 FlagID;\r
69 UINT32 ConflictMask;\r
70 VAR_CHECK_FLAG_TYPE FlagType;\r
71} VAR_CHECK_ITEM;\r
72\r
73\r
74SHELL_PARAM_ITEM mIfConfig6CheckList[] = {\r
75 {\r
76 L"-b",\r
77 TypeFlag\r
78 },\r
79 {\r
80 L"-s",\r
81 TypeMaxValue\r
82 },\r
83 {\r
84 L"-l",\r
85 TypeValue\r
86 },\r
87 {\r
88 L"-r",\r
89 TypeValue\r
90 },\r
91 {\r
92 L"-?",\r
93 TypeFlag\r
94 },\r
95 {\r
96 NULL,\r
97 TypeMax\r
98 },\r
99};\r
100\r
101VAR_CHECK_ITEM mIfConfig6SetCheckList[] = {\r
102 {\r
103 L"auto",\r
104 0x00000001,\r
105 0x00000001,\r
106 FlagTypeSingle\r
107 },\r
108 {\r
109 L"man",\r
110 0x00000002,\r
111 0x00000001,\r
112 FlagTypeSingle\r
113 },\r
114 {\r
115 L"host",\r
116 0x00000004,\r
117 0x00000002,\r
118 FlagTypeSingle\r
119 },\r
120 {\r
121 L"dad",\r
122 0x00000008,\r
123 0x00000004,\r
124 FlagTypeSingle\r
125 },\r
126 {\r
127 L"gw",\r
128 0x00000010,\r
129 0x00000008,\r
130 FlagTypeSingle\r
131 },\r
132 {\r
133 L"dns",\r
134 0x00000020,\r
135 0x00000010,\r
136 FlagTypeSingle\r
137 },\r
138 {\r
139 L"id",\r
140 0x00000040,\r
141 0x00000020,\r
142 FlagTypeSingle\r
143 },\r
144 {\r
145 NULL,\r
146 0x0,\r
147 0x0,\r
148 FlagTypeSkipUnknown\r
149 },\r
150};\r
151\r
a915fea6
RN
152/**\r
153 Free the ARG_LIST.\r
154\r
155 @param List Pointer to ARG_LIST to free.\r
156**/\r
157VOID\r
158IfConfig6FreeArgList (\r
159 ARG_LIST *List\r
160)\r
161{\r
162 ARG_LIST *Next;\r
163 while (List->Next != NULL) {\r
164 Next = List->Next;\r
165 FreePool (List);\r
166 List = Next;\r
167 }\r
168\r
169 FreePool (List);\r
170}\r
171\r
43ca1753
ZL
172/**\r
173 Split a string with specified separator and save the substring to a list.\r
174\r
175 @param[in] String The pointer of the input string.\r
176 @param[in] Separator The specified separator.\r
177\r
178 @return The pointer of headnode of ARG_LIST.\r
179\r
180**/\r
181ARG_LIST *\r
182IfConfig6SplitStrToList (\r
183 IN CONST CHAR16 *String,\r
184 IN CHAR16 Separator\r
185 )\r
186{\r
187 CHAR16 *Str;\r
188 CHAR16 *ArgStr;\r
189 ARG_LIST *ArgList;\r
190 ARG_LIST *ArgNode;\r
191\r
192 if (String == NULL || *String == L'\0') {\r
193 return NULL;\r
194 }\r
195\r
196 //\r
197 // Copy the CONST string to a local copy.\r
198 //\r
a915fea6
RN
199 Str = AllocateCopyPool (StrSize (String), String);\r
200 if (Str == NULL) {\r
201 return NULL;\r
202 }\r
43ca1753
ZL
203 ArgStr = Str;\r
204\r
205 //\r
206 // init a node for the list head.\r
207 //\r
208 ArgNode = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));\r
a915fea6
RN
209 if (ArgNode == NULL) {\r
210 return NULL;\r
211 }\r
43ca1753
ZL
212 ArgList = ArgNode;\r
213\r
214 //\r
215 // Split the local copy and save in the list node.\r
216 //\r
217 while (*Str != L'\0') {\r
218 if (*Str == Separator) {\r
219 *Str = L'\0';\r
220 ArgNode->Arg = ArgStr;\r
221 ArgStr = Str + 1;\r
222 ArgNode->Next = (ARG_LIST *) AllocateZeroPool (sizeof (ARG_LIST));\r
a915fea6
RN
223 if (ArgNode->Next == NULL) {\r
224 //\r
225 // Free the local copy of string stored in the first node\r
226 //\r
227 FreePool (ArgList->Arg);\r
228 IfConfig6FreeArgList (ArgList);\r
229 return NULL;\r
230 }\r
43ca1753
ZL
231 ArgNode = ArgNode->Next;\r
232 }\r
233\r
234 Str++;\r
235 }\r
236\r
237 ArgNode->Arg = ArgStr;\r
238 ArgNode->Next = NULL;\r
239\r
240 return ArgList;\r
241}\r
242\r
243/**\r
244 Check the correctness of input Args with '-s' option.\r
245\r
246 @param[in] CheckList The pointer of VAR_CHECK_ITEM array.\r
247 @param[in] Name The pointer of input arg.\r
248 @param[in] Init The switch to execute the check.\r
249\r
250 @return The value of VAR_CHECK_CODE.\r
251\r
252**/\r
253VAR_CHECK_CODE\r
254IfConfig6RetriveCheckListByName(\r
255 IN VAR_CHECK_ITEM *CheckList,\r
256 IN CHAR16 *Name,\r
257 IN BOOLEAN Init\r
258)\r
259{\r
260 STATIC UINT32 CheckDuplicate;\r
261 STATIC UINT32 CheckConflict;\r
262 VAR_CHECK_CODE RtCode;\r
263 UINT32 Index;\r
264 VAR_CHECK_ITEM Arg;\r
265\r
266 if (Init) {\r
267 CheckDuplicate = 0;\r
268 CheckConflict = 0;\r
269 return VarCheckOk;\r
270 }\r
271\r
272 RtCode = VarCheckOk;\r
273 Index = 0;\r
274 Arg = CheckList[Index];\r
275\r
276 //\r
277 // Check the Duplicated/Conflicted/Unknown input Args.\r
278 //\r
279 while (Arg.FlagStr != NULL) {\r
280 if (StrCmp (Arg.FlagStr, Name) == 0) {\r
281\r
282 if (CheckDuplicate & Arg.FlagID) {\r
283 RtCode = VarCheckDuplicate;\r
284 break;\r
285 }\r
286\r
287 if (CheckConflict & Arg.ConflictMask) {\r
288 RtCode = VarCheckConflict;\r
289 break;\r
290 }\r
291\r
292 CheckDuplicate |= Arg.FlagID;\r
293 CheckConflict |= Arg.ConflictMask;\r
294 break;\r
295 }\r
296\r
297 Arg = CheckList[++Index];\r
298 }\r
299\r
300 if (Arg.FlagStr == NULL) {\r
301 RtCode = VarCheckUnknown;\r
302 }\r
303\r
304 return RtCode;\r
305}\r
306\r
307/**\r
308 The notify function of create event when performing a manual config.\r
309\r
310 @param[in] Event The event this notify function registered to.\r
311 @param[in] Context Pointer to the context data registered to the event.\r
312\r
313**/\r
314VOID\r
315EFIAPI\r
316IfConfig6ManualAddressNotify (\r
317 IN EFI_EVENT Event,\r
318 IN VOID *Context\r
319 )\r
320{\r
321 *((BOOLEAN *) Context) = TRUE;\r
322}\r
323\r
324/**\r
325 Print MAC address.\r
326\r
327 @param[in] Node The pointer of MAC address buffer.\r
328 @param[in] Size The size of MAC address buffer.\r
329\r
330**/\r
331VOID\r
332IfConfig6PrintMacAddr (\r
333 IN UINT8 *Node,\r
334 IN UINT32 Size\r
335 )\r
336{\r
337 UINTN Index;\r
338\r
339 ASSERT (Size <= MACADDRMAXSIZE);\r
340\r
341 for (Index = 0; Index < Size; Index++) {\r
342 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_MAC_ADDR_BODY), gShellNetwork2HiiHandle, Node[Index]);\r
343 if (Index + 1 < Size) {\r
344 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_COLON), gShellNetwork2HiiHandle);\r
345 }\r
346 }\r
347\r
348 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle);\r
349}\r
350\r
351/**\r
352 Print IPv6 address.\r
353\r
354 @param[in] Ip The pointer of Ip bufffer in EFI_IPv6_ADDRESS format.\r
355 @param[in] PrefixLen The pointer of PrefixLen that describes the size Prefix.\r
356\r
357**/\r
358VOID\r
359IfConfig6PrintIpAddr (\r
360 IN EFI_IPv6_ADDRESS *Ip,\r
361 IN UINT8 *PrefixLen\r
362 )\r
363{\r
364 UINTN Index;\r
365 BOOLEAN Short;\r
366\r
367 Short = FALSE;\r
368\r
369 for (Index = 0; Index < PREFIXMAXLEN; Index = Index + 2) {\r
370\r
371 if (!Short && (Index + 1 < PREFIXMAXLEN) && (Index % 2 == 0) && (Ip->Addr[Index] == 0) && (Ip->Addr[Index + 1] == 0)) {\r
372 //\r
373 // Deal with the case of ::.\r
374 //\r
375 if (Index == 0) {\r
376 //\r
377 // :: is at the beginning of the address.\r
378 //\r
379 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_COLON), gShellNetwork2HiiHandle);\r
380 }\r
381 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_COLON), gShellNetwork2HiiHandle);\r
382\r
383 while ((Ip->Addr[Index] == 0) && (Ip->Addr[Index + 1] == 0) && (Index < PREFIXMAXLEN)) {\r
384 Index = Index + 2;\r
385 if (Index > PREFIXMAXLEN - 2) {\r
386 break;\r
387 }\r
388 }\r
389\r
390 Short = TRUE;\r
391\r
392 if (Index == PREFIXMAXLEN) {\r
393 //\r
394 // :: is at the end of the address.\r
395 //\r
396 break;\r
397 }\r
398 }\r
399\r
400 if (Index < PREFIXMAXLEN - 1) {\r
401 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_IP_ADDR_BODY), gShellNetwork2HiiHandle, Ip->Addr[Index]);\r
402 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_IP_ADDR_BODY), gShellNetwork2HiiHandle, Ip->Addr[Index + 1]);\r
403 }\r
404\r
405 if (Index + 2 < PREFIXMAXLEN) {\r
406 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_COLON), gShellNetwork2HiiHandle);\r
407 }\r
408 }\r
409\r
410 if (PrefixLen != NULL) {\r
411 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_PREFIX_LEN), gShellNetwork2HiiHandle, *PrefixLen);\r
412 }\r
413}\r
414\r
415/**\r
416 Pick up host IPv6 address in string format from Args with "-s" option and convert it to EFI_IP6_CONFIG_MANUAL_ADDRESS format.\r
417\r
418 @param[in, out] Arg The pointer of the address of ARG_LIST which save Args with the "-s" option.\r
419 @param[out] Buf The pointer of the address of EFI_IP6_CONFIG_MANUAL_ADDRESS.\r
420 @param[out] BufSize The pointer of BufSize that describes the size of Buf in bytes.\r
421\r
422 @retval EFI_SUCCESS The convertion is successful.\r
423 @retval Others Does't find the host address, or it is an invalid IPv6 address in string format.\r
424\r
425**/\r
426EFI_STATUS\r
427IfConfig6ParseManualAddressList (\r
428 IN OUT ARG_LIST **Arg,\r
429 OUT EFI_IP6_CONFIG_MANUAL_ADDRESS **Buf,\r
430 OUT UINTN *BufSize\r
431 )\r
432{\r
433 EFI_STATUS Status;\r
434 EFI_IP6_CONFIG_MANUAL_ADDRESS *AddrBuf;\r
435 ARG_LIST *VarArg;\r
436 EFI_IPv6_ADDRESS Address;\r
437 UINT8 Prefix;\r
438 UINT8 AddrCnt;\r
439\r
440 Prefix = 0;\r
441 AddrCnt = 0;\r
442 *BufSize = 0;\r
443 *Buf = NULL;\r
444 VarArg = *Arg;\r
445 Status = EFI_SUCCESS;\r
446\r
447 //\r
448 // Go through the list to check the correctness of input host ip6 address.\r
449 //\r
450 while ((!EFI_ERROR (Status)) && (VarArg != NULL)) {\r
451\r
452 Status = NetLibStrToIp6andPrefix (VarArg->Arg, &Address, &Prefix);\r
453\r
454 if (EFI_ERROR (Status)) {\r
455 //\r
456 // host ip ip ... gw\r
457 //\r
458 break;\r
459 }\r
460\r
461 VarArg = VarArg->Next;\r
462 AddrCnt++;\r
463 }\r
464\r
465 if (AddrCnt == 0) {\r
466 return EFI_INVALID_PARAMETER;\r
467 }\r
468\r
469 AddrBuf = AllocateZeroPool (AddrCnt * sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS));\r
470 ASSERT (AddrBuf != NULL);\r
471\r
472 AddrCnt = 0;\r
473 VarArg = *Arg;\r
474 Status = EFI_SUCCESS;\r
475\r
476 //\r
477 // Go through the list to fill in the EFI_IP6_CONFIG_MANUAL_ADDRESS structure.\r
478 //\r
479 while ((!EFI_ERROR (Status)) && (VarArg != NULL)) {\r
480\r
481 Status = NetLibStrToIp6andPrefix (VarArg->Arg, &Address, &Prefix);\r
482\r
483 if (EFI_ERROR (Status)) {\r
484 break;\r
485 }\r
486\r
487 //\r
488 // If prefix length is not set, set it as Zero here. In the IfConfigSetInterfaceInfo()\r
489 // Zero prefix, length will be transfered to default prefix length.\r
490 //\r
491 if (Prefix == 0xFF) {\r
492 Prefix = 0;\r
493 }\r
494 AddrBuf[AddrCnt].IsAnycast = FALSE;\r
495 AddrBuf[AddrCnt].PrefixLength = Prefix;\r
496 IP6_COPY_ADDRESS (&AddrBuf[AddrCnt].Address, &Address);\r
497 VarArg = VarArg->Next;\r
498 AddrCnt++;\r
499 }\r
500\r
501 *Arg = VarArg;\r
502\r
503 if (EFI_ERROR (Status) && (Status != EFI_INVALID_PARAMETER)) {\r
504 goto ON_ERROR;\r
505 }\r
506\r
507 *Buf = AddrBuf;\r
508 *BufSize = AddrCnt * sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS);\r
509\r
510 return EFI_SUCCESS;\r
511\r
512ON_ERROR:\r
513\r
514 FreePool (AddrBuf);\r
515 return Status;\r
516}\r
517\r
518/**\r
519 Pick up gw/dns IPv6 address in string format from Args with "-s" option and convert it to EFI_IPv6_ADDRESS format.\r
520\r
521 @param[in, out] Arg The pointer of the address of ARG_LIST that save Args with the "-s" option.\r
522 @param[out] Buf The pointer of the address of EFI_IPv6_ADDRESS.\r
523 @param[out] BufSize The pointer of BufSize that describes the size of Buf in bytes.\r
524\r
525 @retval EFI_SUCCESS The conversion is successful.\r
526 @retval Others Doesn't find the host address, or it is an invalid IPv6 address in string format.\r
527\r
528**/\r
529EFI_STATUS\r
530IfConfig6ParseGwDnsAddressList (\r
531 IN OUT ARG_LIST **Arg,\r
532 OUT EFI_IPv6_ADDRESS **Buf,\r
533 OUT UINTN *BufSize\r
534 )\r
535{\r
536 EFI_STATUS Status;\r
537 EFI_IPv6_ADDRESS *AddrBuf;\r
538 ARG_LIST *VarArg;\r
539 EFI_IPv6_ADDRESS Address;\r
540 UINT8 Prefix;\r
541 UINT8 AddrCnt;\r
542\r
543 AddrCnt = 0;\r
544 *BufSize = 0;\r
545 *Buf = NULL;\r
546 VarArg = *Arg;\r
547 Status = EFI_SUCCESS;\r
548\r
549 //\r
550 // Go through the list to check the correctness of input gw/dns address.\r
551 //\r
552 while ((!EFI_ERROR (Status)) && (VarArg != NULL)) {\r
553\r
554 Status = NetLibStrToIp6andPrefix (VarArg->Arg, &Address, &Prefix);\r
555\r
556 if (EFI_ERROR (Status)) {\r
557 //\r
558 // gw ip ip ... host\r
559 //\r
560 break;\r
561 }\r
562\r
563 VarArg = VarArg->Next;\r
564 AddrCnt++;\r
565 }\r
566\r
567 if (AddrCnt == 0) {\r
568 return EFI_INVALID_PARAMETER;\r
569 }\r
570\r
571 AddrBuf = AllocateZeroPool (AddrCnt * sizeof (EFI_IPv6_ADDRESS));\r
572 ASSERT (AddrBuf != NULL);\r
573\r
574 AddrCnt = 0;\r
575 VarArg = *Arg;\r
576 Status = EFI_SUCCESS;\r
577\r
578 //\r
579 // Go through the list to fill in the EFI_IPv6_ADDRESS structure.\r
580 //\r
581 while ((!EFI_ERROR (Status)) && (VarArg != NULL)) {\r
582\r
583 Status = NetLibStrToIp6andPrefix (VarArg->Arg, &Address, &Prefix);\r
584\r
585 if (EFI_ERROR (Status)) {\r
586 break;\r
587 }\r
588\r
589 IP6_COPY_ADDRESS (&AddrBuf[AddrCnt], &Address);\r
590\r
591 VarArg = VarArg->Next;\r
592 AddrCnt++;\r
593 }\r
594\r
595 *Arg = VarArg;\r
596\r
597 if (EFI_ERROR (Status) && (Status != EFI_INVALID_PARAMETER)) {\r
598 goto ON_ERROR;\r
599 }\r
600\r
601 *Buf = AddrBuf;\r
602 *BufSize = AddrCnt * sizeof (EFI_IPv6_ADDRESS);\r
603\r
604 return EFI_SUCCESS;\r
605\r
606ON_ERROR:\r
607\r
608 FreePool (AddrBuf);\r
609 return Status;\r
610}\r
611\r
612/**\r
613 Parse InterfaceId in string format from Args with the "-s" option and convert it to EFI_IP6_CONFIG_INTERFACE_ID format.\r
614\r
615 @param[in, out] Arg The pointer of the address of ARG_LIST that saves Args with the "-s" option.\r
616 @param[out] IfId The pointer of EFI_IP6_CONFIG_INTERFACE_ID.\r
617\r
618 @retval EFI_SUCCESS The get status processed successfullly.\r
619 @retval EFI_INVALID_PARAMETER The get status process failed.\r
620\r
621**/\r
622EFI_STATUS\r
623IfConfig6ParseInterfaceId (\r
624 IN OUT ARG_LIST **Arg,\r
625 OUT EFI_IP6_CONFIG_INTERFACE_ID **IfId\r
626 )\r
627{\r
628 UINT8 Index;\r
629 UINT8 NodeVal;\r
630 CHAR16 *IdStr;\r
631\r
632 if (*Arg == NULL) {\r
633 return EFI_INVALID_PARAMETER;\r
634 }\r
635\r
636 Index = 0;\r
637 IdStr = (*Arg)->Arg;\r
638 ASSERT (IfId != NULL);\r
639 *IfId = AllocateZeroPool (sizeof (EFI_IP6_CONFIG_INTERFACE_ID));\r
640 ASSERT (*IfId != NULL);\r
641\r
642 while ((*IdStr != L'\0') && (Index < 8)) {\r
643\r
644 NodeVal = 0;\r
645 while ((*IdStr != L':') && (*IdStr != L'\0')) {\r
646\r
647 if ((*IdStr <= L'F') && (*IdStr >= L'A')) {\r
648 NodeVal = (UINT8)((NodeVal << 4) + *IdStr - L'A' + 10);\r
649 } else if ((*IdStr <= L'f') && (*IdStr >= L'a')) {\r
650 NodeVal = (UINT8)((NodeVal << 4) + *IdStr - L'a' + 10);\r
651 } else if ((*IdStr <= L'9') && (*IdStr >= L'0')) {\r
652 NodeVal = (UINT8)((NodeVal << 4) + *IdStr - L'0');\r
653 } else {\r
654 FreePool (*IfId);\r
655 return EFI_INVALID_PARAMETER;\r
656 }\r
657\r
658 IdStr++;\r
659 }\r
660\r
661 (*IfId)->Id[Index++] = NodeVal;\r
662\r
663 if (*IdStr == L':') {\r
664 IdStr++;\r
665 }\r
666 }\r
667\r
668 *Arg = (*Arg)->Next;\r
669 return EFI_SUCCESS;\r
670}\r
671\r
672/**\r
673 Parse dad in string format from Args with the "-s" option and convert it to UINT32 format.\r
674\r
675 @param[in, out] Arg The pointer of the address of ARG_LIST that saves Args with the "-s" option.\r
676 @param[out] Xmits The pointer of Xmits.\r
677\r
678 @retval EFI_SUCCESS The get status processed successfully.\r
679 @retval others The get status process failed.\r
680\r
681**/\r
682EFI_STATUS\r
683IfConfig6ParseDadXmits (\r
684 IN OUT ARG_LIST **Arg,\r
685 OUT UINT32 *Xmits\r
686 )\r
687{\r
688 CHAR16 *ValStr;\r
689\r
690 if (*Arg == NULL) {\r
691 return EFI_INVALID_PARAMETER;\r
692 }\r
693\r
694 ValStr = (*Arg)->Arg;\r
695 *Xmits = 0;\r
696\r
697 while (*ValStr != L'\0') {\r
698\r
699 if ((*ValStr <= L'9') && (*ValStr >= L'0')) {\r
700\r
701 *Xmits = (*Xmits * 10) + (*ValStr - L'0');\r
702\r
703 } else {\r
704\r
705 return EFI_INVALID_PARAMETER;\r
706 }\r
707\r
708 ValStr++;\r
709 }\r
710\r
711 *Arg = (*Arg)->Next;\r
712 return EFI_SUCCESS;\r
713}\r
714\r
715/**\r
716 The get current status of all handles.\r
717\r
718 @param[in] ImageHandle The handle of ImageHandle.\r
719 @param[in] IfName The pointer of IfName(interface name).\r
720 @param[in] IfList The pointer of IfList(interface list).\r
721\r
722 @retval EFI_SUCCESS The get status processed successfully.\r
723 @retval others The get status process failed.\r
724\r
725**/\r
726EFI_STATUS\r
727IfConfig6GetInterfaceInfo (\r
728 IN EFI_HANDLE ImageHandle,\r
729 IN CHAR16 *IfName,\r
730 IN LIST_ENTRY *IfList\r
731 )\r
732{\r
733 EFI_STATUS Status;\r
734 UINTN HandleIndex;\r
735 UINTN HandleNum;\r
736 EFI_HANDLE *HandleBuffer;\r
737 EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg;\r
738 EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo;\r
739 IFCONFIG6_INTERFACE_CB *IfCb;\r
740 UINTN DataSize;\r
741\r
742 HandleBuffer = NULL;\r
743 HandleNum = 0;\r
744\r
745 IfInfo = NULL;\r
746 IfCb = NULL;\r
747\r
748 //\r
749 // Locate all the handles with ip6 service binding protocol.\r
750 //\r
751 Status = gBS->LocateHandleBuffer (\r
752 ByProtocol,\r
753 &gEfiIp6ServiceBindingProtocolGuid,\r
754 NULL,\r
755 &HandleNum,\r
756 &HandleBuffer\r
757 );\r
758 if (EFI_ERROR (Status) || (HandleNum == 0)) {\r
759 return Status;\r
760 }\r
761\r
762 //\r
763 // Enumerate all handles that installed with ip6 service binding protocol.\r
764 //\r
765 for (HandleIndex = 0; HandleIndex < HandleNum; HandleIndex++) {\r
766 IfCb = NULL;\r
767 IfInfo = NULL;\r
768 DataSize = 0;\r
769\r
770 //\r
771 // Ip6config protocol and ip6 service binding protocol are installed\r
772 // on the same handle.\r
773 //\r
774 ASSERT (HandleBuffer != NULL);\r
775 Status = gBS->HandleProtocol (\r
776 HandleBuffer[HandleIndex],\r
777 &gEfiIp6ConfigProtocolGuid,\r
778 (VOID **) &Ip6Cfg\r
779 );\r
780\r
781 if (EFI_ERROR (Status)) {\r
782 goto ON_ERROR;\r
783 }\r
784 //\r
785 // Get the interface information size.\r
786 //\r
787 Status = Ip6Cfg->GetData (\r
788 Ip6Cfg,\r
789 Ip6ConfigDataTypeInterfaceInfo,\r
790 &DataSize,\r
791 NULL\r
792 );\r
793\r
794 if (Status != EFI_BUFFER_TOO_SMALL) {\r
795 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);\r
796 goto ON_ERROR;\r
797 }\r
798\r
799 IfInfo = AllocateZeroPool (DataSize);\r
800\r
801 if (IfInfo == NULL) {\r
802 Status = EFI_OUT_OF_RESOURCES;\r
803 goto ON_ERROR;\r
804 }\r
805 //\r
806 // Get the interface info.\r
807 //\r
808 Status = Ip6Cfg->GetData (\r
809 Ip6Cfg,\r
810 Ip6ConfigDataTypeInterfaceInfo,\r
811 &DataSize,\r
812 IfInfo\r
813 );\r
814\r
815 if (EFI_ERROR (Status)) {\r
816 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);\r
817 goto ON_ERROR;\r
818 }\r
819 //\r
820 // Check the interface name if required.\r
821 //\r
822 if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) != 0)) {\r
823 FreePool (IfInfo);\r
824 continue;\r
825 }\r
826\r
827 DataSize = 0;\r
828 //\r
829 // Get the size of dns server list.\r
830 //\r
831 Status = Ip6Cfg->GetData (\r
832 Ip6Cfg,\r
833 Ip6ConfigDataTypeDnsServer,\r
834 &DataSize,\r
835 NULL\r
836 );\r
837\r
838 if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) {\r
839 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);\r
840 goto ON_ERROR;\r
841 }\r
842\r
843 IfCb = AllocateZeroPool (sizeof (IFCONFIG6_INTERFACE_CB) + DataSize);\r
844\r
845 if (IfCb == NULL) {\r
846 Status = EFI_OUT_OF_RESOURCES;\r
847 goto ON_ERROR;\r
848 }\r
849\r
850 IfCb->NicHandle = HandleBuffer[HandleIndex];\r
851 IfCb->IfInfo = IfInfo;\r
852 IfCb->IfCfg = Ip6Cfg;\r
853 IfCb->DnsCnt = (UINT32) (DataSize / sizeof (EFI_IPv6_ADDRESS));\r
854\r
855 //\r
856 // Get the dns server list if has.\r
857 //\r
858 if (DataSize > 0) {\r
859\r
860 Status = Ip6Cfg->GetData (\r
861 Ip6Cfg,\r
862 Ip6ConfigDataTypeDnsServer,\r
863 &DataSize,\r
864 IfCb->DnsAddr\r
865 );\r
866\r
867 if (EFI_ERROR (Status)) {\r
868 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);\r
869 goto ON_ERROR;\r
870 }\r
871 }\r
872 //\r
873 // Get the interface id if has.\r
874 //\r
875 DataSize = sizeof (EFI_IP6_CONFIG_INTERFACE_ID);\r
876 IfCb->IfId = AllocateZeroPool (DataSize);\r
877\r
878 if (IfCb->IfId == NULL) {\r
879 goto ON_ERROR;\r
880 }\r
881\r
882 Status = Ip6Cfg->GetData (\r
883 Ip6Cfg,\r
884 Ip6ConfigDataTypeAltInterfaceId,\r
885 &DataSize,\r
886 IfCb->IfId\r
887 );\r
888\r
889 if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {\r
890 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);\r
891 goto ON_ERROR;\r
892 }\r
893\r
894 if (Status == EFI_NOT_FOUND) {\r
895 FreePool (IfCb->IfId);\r
896 IfCb->IfId = NULL;\r
897 }\r
898 //\r
899 // Get the config policy.\r
900 //\r
901 DataSize = sizeof (EFI_IP6_CONFIG_POLICY);\r
902 Status = Ip6Cfg->GetData (\r
903 Ip6Cfg,\r
904 Ip6ConfigDataTypePolicy,\r
905 &DataSize,\r
906 &IfCb->Policy\r
907 );\r
908\r
909 if (EFI_ERROR (Status)) {\r
910 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);\r
911 goto ON_ERROR;\r
912 }\r
913 //\r
914 // Get the dad transmits.\r
915 //\r
916 DataSize = sizeof (EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS);\r
917 Status = Ip6Cfg->GetData (\r
918 Ip6Cfg,\r
919 Ip6ConfigDataTypeDupAddrDetectTransmits,\r
920 &DataSize,\r
921 &IfCb->Xmits\r
922 );\r
923\r
924 if (EFI_ERROR (Status)) {\r
925 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);\r
926 goto ON_ERROR;\r
927 }\r
928\r
929 InsertTailList (IfList, &IfCb->Link);\r
930\r
931 if ((IfName != NULL) && (StrCmp (IfName, IfInfo->Name) == 0)) {\r
932 //\r
933 // Only need the appointed interface, keep the allocated buffer.\r
934 //\r
935 IfCb = NULL;\r
936 IfInfo = NULL;\r
937 break;\r
938 }\r
939 }\r
940\r
941 if (HandleBuffer != NULL) {\r
942 FreePool (HandleBuffer);\r
943 }\r
944\r
945 return EFI_SUCCESS;\r
946\r
947ON_ERROR:\r
948\r
949 if (IfInfo != NULL) {\r
950 FreePool (IfInfo);\r
951 }\r
952\r
953 if (IfCb != NULL) {\r
954 if (IfCb->IfId != NULL) {\r
955 FreePool (IfCb->IfId);\r
956 }\r
957\r
958 FreePool (IfCb);\r
959 }\r
960\r
961 return Status;\r
962}\r
963\r
964/**\r
965 The list process of the IfConfig6 application.\r
966\r
967 @param[in] IfList The pointer of IfList(interface list).\r
968\r
969 @retval SHELL_SUCCESS The IfConfig6 list processed successfully.\r
970 @retval others The IfConfig6 list process failed.\r
971\r
972**/\r
973SHELL_STATUS\r
974IfConfig6ShowInterfaceInfo (\r
975 IN LIST_ENTRY *IfList\r
976 )\r
977{\r
978 LIST_ENTRY *Entry;\r
979 IFCONFIG6_INTERFACE_CB *IfCb;\r
980 UINTN Index;\r
981\r
982 Entry = IfList->ForwardLink;\r
983\r
984 if (IsListEmpty (IfList)) {\r
985 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_INTERFACE), gShellNetwork2HiiHandle);\r
986 }\r
987\r
988 //\r
989 // Go through the interface list.\r
990 //\r
991 while (Entry != IfList) {\r
992\r
993 IfCb = BASE_CR (Entry, IFCONFIG6_INTERFACE_CB, Link);\r
994\r
995 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_BREAK), gShellNetwork2HiiHandle);\r
996\r
997 //\r
998 // Print interface name.\r
999 //\r
1000 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_IF_NAME), gShellNetwork2HiiHandle, IfCb->IfInfo->Name);\r
1001\r
1002 //\r
1003 // Print interface config policy.\r
1004 //\r
1005 if (IfCb->Policy == Ip6ConfigPolicyAutomatic) {\r
1006 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_POLICY_AUTO), gShellNetwork2HiiHandle);\r
1007 } else {\r
1008 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_POLICY_MAN), gShellNetwork2HiiHandle);\r
1009 }\r
1010\r
1011 //\r
1012 // Print dad transmit.\r
1013 //\r
1014 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_DAD_TRANSMITS), gShellNetwork2HiiHandle, IfCb->Xmits);\r
1015\r
1016 //\r
1017 // Print interface id if has.\r
1018 //\r
1019 if (IfCb->IfId != NULL) {\r
1020 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_INTERFACE_ID_HEAD), gShellNetwork2HiiHandle);\r
1021\r
1022 IfConfig6PrintMacAddr (\r
1023 IfCb->IfId->Id,\r
1024 8\r
1025 );\r
1026 }\r
1027 //\r
1028 // Print mac address of the interface.\r
1029 //\r
1030 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_MAC_ADDR_HEAD), gShellNetwork2HiiHandle);\r
1031\r
1032 IfConfig6PrintMacAddr (\r
1033 IfCb->IfInfo->HwAddress.Addr,\r
1034 IfCb->IfInfo->HwAddressSize\r
1035 );\r
1036\r
1037 //\r
1038 // Print ip addresses list of the interface.\r
1039 //\r
1040 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_IP_ADDR_HEAD), gShellNetwork2HiiHandle);\r
1041\r
1042 for (Index = 0; Index < IfCb->IfInfo->AddressInfoCount; Index++) {\r
1043 IfConfig6PrintIpAddr (\r
1044 &IfCb->IfInfo->AddressInfo[Index].Address,\r
1045 &IfCb->IfInfo->AddressInfo[Index].PrefixLength\r
1046 );\r
1047 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle);\r
1048 }\r
1049\r
1050 //\r
1051 // Print dns server addresses list of the interface if has.\r
1052 //\r
1053 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_DNS_ADDR_HEAD), gShellNetwork2HiiHandle);\r
1054\r
1055 for (Index = 0; Index < IfCb->DnsCnt; Index++) {\r
1056 IfConfig6PrintIpAddr (\r
1057 &IfCb->DnsAddr[Index],\r
1058 NULL\r
1059 );\r
1060 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle);\r
1061 }\r
1062\r
1063 //\r
1064 // Print route table of the interface if has.\r
1065 //\r
1066 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_ROUTE_HEAD), gShellNetwork2HiiHandle);\r
1067\r
1068 for (Index = 0; Index < IfCb->IfInfo->RouteCount; Index++) {\r
1069 IfConfig6PrintIpAddr (\r
1070 &IfCb->IfInfo->RouteTable[Index].Destination,\r
1071 &IfCb->IfInfo->RouteTable[Index].PrefixLength\r
1072 );\r
1073 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_JOINT), gShellNetwork2HiiHandle);\r
1074\r
1075 IfConfig6PrintIpAddr (\r
1076 &IfCb->IfInfo->RouteTable[Index].Gateway,\r
1077 NULL\r
1078 );\r
1079 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle);\r
1080 }\r
1081\r
1082 Entry = Entry->ForwardLink;\r
1083 }\r
1084\r
1085 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_BREAK), gShellNetwork2HiiHandle);\r
e2f5c491 1086 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle);\r
43ca1753
ZL
1087\r
1088 return SHELL_SUCCESS;\r
1089}\r
1090\r
1091/**\r
1092 The clean process of the IfConfig6 application.\r
1093\r
1094 @param[in] IfList The pointer of IfList(interface list).\r
e2f5c491 1095 @param[in] IfName The pointer of interface name.\r
43ca1753
ZL
1096\r
1097 @retval SHELL_SUCCESS The IfConfig6 clean processed successfully.\r
1098 @retval others The IfConfig6 clean process failed.\r
1099\r
1100**/\r
1101SHELL_STATUS\r
1102IfConfig6ClearInterfaceInfo (\r
e2f5c491
ZL
1103 IN LIST_ENTRY *IfList,\r
1104 IN CHAR16 *IfName\r
43ca1753
ZL
1105 )\r
1106{\r
1107 EFI_STATUS Status;\r
1108 SHELL_STATUS ShellStatus;\r
1109 LIST_ENTRY *Entry;\r
1110 IFCONFIG6_INTERFACE_CB *IfCb;\r
1111 EFI_IP6_CONFIG_POLICY Policy;\r
1112\r
43ca1753
ZL
1113 Entry = IfList->ForwardLink;\r
1114 Status = EFI_SUCCESS;\r
1115 ShellStatus = SHELL_SUCCESS;\r
1116\r
1117 if (IsListEmpty (IfList)) {\r
1118 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_INTERFACE), gShellNetwork2HiiHandle);\r
1119 }\r
1120\r
1121 //\r
e2f5c491
ZL
1122 // Go through the interface list.If the interface name is specified, then\r
1123 // need to refresh the configuration.\r
43ca1753
ZL
1124 //\r
1125 while (Entry != IfList) {\r
1126\r
1127 IfCb = BASE_CR (Entry, IFCONFIG6_INTERFACE_CB, Link);\r
1128\r
e2f5c491
ZL
1129 if ((IfName != NULL) && (StrCmp (IfName, IfCb->IfInfo->Name) == 0)) {\r
1130 Policy = Ip6ConfigPolicyManual;\r
1131\r
1132 Status = IfCb->IfCfg->SetData (\r
1133 IfCb->IfCfg,\r
1134 Ip6ConfigDataTypePolicy,\r
1135 sizeof (EFI_IP6_CONFIG_POLICY),\r
1136 &Policy\r
1137 );\r
1138 if (EFI_ERROR (Status)) {\r
1139 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork2HiiHandle, L"ifconfig6");\r
1140 ShellStatus = SHELL_ACCESS_DENIED;\r
1141 break;\r
1142 }\r
1143 }\r
1144\r
1145 Policy = Ip6ConfigPolicyAutomatic;\r
1146\r
43ca1753
ZL
1147 Status = IfCb->IfCfg->SetData (\r
1148 IfCb->IfCfg,\r
1149 Ip6ConfigDataTypePolicy,\r
1150 sizeof (EFI_IP6_CONFIG_POLICY),\r
1151 &Policy\r
1152 );\r
1153\r
1154 if (EFI_ERROR (Status)) {\r
e2f5c491 1155 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_ERR_AD), gShellNetwork2HiiHandle, L"ifconfig6");\r
43ca1753
ZL
1156 ShellStatus = SHELL_ACCESS_DENIED;\r
1157 break;\r
1158 }\r
1159\r
1160 Entry = Entry->ForwardLink;\r
1161 }\r
1162\r
1163 return ShellStatus;\r
1164}\r
1165\r
1166/**\r
1167 The set process of the IfConfig6 application.\r
1168\r
1169 @param[in] IfList The pointer of IfList(interface list).\r
1170 @param[in] VarArg The pointer of ARG_LIST(Args with "-s" option).\r
1171\r
1172 @retval SHELL_SUCCESS The IfConfig6 set processed successfully.\r
1173 @retval others The IfConfig6 set process failed.\r
1174\r
1175**/\r
1176SHELL_STATUS\r
1177IfConfig6SetInterfaceInfo (\r
1178 IN LIST_ENTRY *IfList,\r
1179 IN ARG_LIST *VarArg\r
1180 )\r
1181{\r
1182 EFI_STATUS Status;\r
1183 SHELL_STATUS ShellStatus;\r
1184 IFCONFIG6_INTERFACE_CB *IfCb;\r
1185 EFI_IP6_CONFIG_MANUAL_ADDRESS *CfgManAddr;\r
1186 EFI_IPv6_ADDRESS *CfgAddr;\r
1187 UINTN AddrSize;\r
1188 EFI_IP6_CONFIG_INTERFACE_ID *InterfaceId;\r
1189 UINT32 DadXmits;\r
1190 UINT32 CurDadXmits;\r
1191 UINTN CurDadXmitsLen;\r
1192 EFI_IP6_CONFIG_POLICY Policy;\r
1193\r
1194 VAR_CHECK_CODE CheckCode;\r
1195 EFI_EVENT TimeOutEvt;\r
1196 EFI_EVENT MappedEvt;\r
1197 BOOLEAN IsAddressOk;\r
1198\r
1199 UINTN DataSize;\r
1200 UINT32 Index;\r
1201 UINT32 Index2;\r
1202 BOOLEAN IsAddressSet;\r
1203 EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo;\r
1204\r
1205 CfgManAddr = NULL;\r
1206 CfgAddr = NULL;\r
1207 TimeOutEvt = NULL;\r
1208 MappedEvt = NULL;\r
1209 IfInfo = NULL;\r
1210 InterfaceId = NULL;\r
1211 CurDadXmits = 0;\r
1212\r
1213 if (IsListEmpty (IfList)) {\r
1214 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_INTERFACE), gShellNetwork2HiiHandle);\r
1215 return SHELL_INVALID_PARAMETER;\r
1216 }\r
1217 //\r
1218 // Make sure to set only one interface each time.\r
1219 //\r
1220 IfCb = BASE_CR (IfList->ForwardLink, IFCONFIG6_INTERFACE_CB, Link);\r
1221 Status = EFI_SUCCESS;\r
1222 ShellStatus = SHELL_SUCCESS;\r
1223\r
1224 //\r
1225 // Initialize check list mechanism.\r
1226 //\r
1227 CheckCode = IfConfig6RetriveCheckListByName(\r
1228 NULL,\r
1229 NULL,\r
1230 TRUE\r
1231 );\r
1232\r
1233 //\r
1234 // Create events & timers for asynchronous settings.\r
1235 //\r
1236 Status = gBS->CreateEvent (\r
1237 EVT_TIMER,\r
1238 TPL_CALLBACK,\r
1239 NULL,\r
1240 NULL,\r
1241 &TimeOutEvt\r
1242 );\r
1243 if (EFI_ERROR (Status)) {\r
1244 ShellStatus = SHELL_ACCESS_DENIED;\r
1245 goto ON_EXIT;\r
1246 }\r
1247\r
1248 Status = gBS->CreateEvent (\r
1249 EVT_NOTIFY_SIGNAL,\r
1250 TPL_NOTIFY,\r
1251 IfConfig6ManualAddressNotify,\r
1252 &IsAddressOk,\r
1253 &MappedEvt\r
1254 );\r
1255 if (EFI_ERROR (Status)) {\r
1256 ShellStatus = SHELL_ACCESS_DENIED;\r
1257 goto ON_EXIT;\r
1258 }\r
1259 //\r
1260 // Parse the setting variables.\r
1261 //\r
1262 while (VarArg != NULL) {\r
1263 //\r
1264 // Check invalid parameters (duplication & unknown & conflict).\r
1265 //\r
1266 CheckCode = IfConfig6RetriveCheckListByName(\r
1267 mIfConfig6SetCheckList,\r
1268 VarArg->Arg,\r
1269 FALSE\r
1270 );\r
1271\r
1272 if (VarCheckOk != CheckCode) {\r
1273 switch (CheckCode) {\r
1274 case VarCheckDuplicate:\r
1275 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_DUPLICATE_COMMAND), gShellNetwork2HiiHandle, VarArg->Arg);\r
1276 break;\r
1277\r
1278 case VarCheckConflict:\r
1279 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_CONFLICT_COMMAND), gShellNetwork2HiiHandle, VarArg->Arg);\r
1280 break;\r
1281\r
1282 case VarCheckUnknown:\r
1283 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_UNKNOWN_COMMAND), gShellNetwork2HiiHandle, VarArg->Arg);\r
1284 break;\r
1285\r
1286 default:\r
1287 break;\r
1288 }\r
1289\r
1290 VarArg = VarArg->Next;\r
1291 continue;\r
1292 }\r
1293 //\r
1294 // Process valid variables.\r
1295 //\r
1296 if (StrCmp(VarArg->Arg, L"auto") == 0) {\r
1297 //\r
1298 // Set automaic config policy\r
1299 //\r
1300 Policy = Ip6ConfigPolicyAutomatic;\r
1301 Status = IfCb->IfCfg->SetData (\r
1302 IfCb->IfCfg,\r
1303 Ip6ConfigDataTypePolicy,\r
1304 sizeof (EFI_IP6_CONFIG_POLICY),\r
1305 &Policy\r
1306 );\r
1307\r
1308 if (EFI_ERROR(Status)) {\r
1309 ShellStatus = SHELL_ACCESS_DENIED;\r
1310 goto ON_EXIT;\r
1311 }\r
1312\r
1313 VarArg= VarArg->Next;\r
1314\r
521981ee 1315 if (VarArg != NULL) {\r
1316 if (StrCmp (VarArg->Arg, L"host") == 0) {\r
1317 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_IP_CONFIG), gShellNetwork2HiiHandle, Status);\r
1318 ShellStatus = SHELL_INVALID_PARAMETER;\r
1319 goto ON_EXIT;\r
1320 } else if (StrCmp (VarArg->Arg, L"gw") == 0) {\r
1321 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_GW_CONFIG), gShellNetwork2HiiHandle, Status);\r
1322 ShellStatus = SHELL_INVALID_PARAMETER;\r
1323 goto ON_EXIT;\r
1324 } else if (StrCmp (VarArg->Arg, L"dns") == 0) {\r
1325 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_DNS_CONFIG), gShellNetwork2HiiHandle, Status);\r
1326 ShellStatus = SHELL_INVALID_PARAMETER;\r
1327 goto ON_EXIT;\r
1328 }\r
445d2007 1329 }\r
43ca1753
ZL
1330 } else if (StrCmp (VarArg->Arg, L"man") == 0) {\r
1331 //\r
1332 // Set manual config policy.\r
1333 //\r
1334 Policy = Ip6ConfigPolicyManual;\r
1335 Status = IfCb->IfCfg->SetData (\r
1336 IfCb->IfCfg,\r
1337 Ip6ConfigDataTypePolicy,\r
1338 sizeof (EFI_IP6_CONFIG_POLICY),\r
1339 &Policy\r
1340 );\r
1341\r
1342 if (EFI_ERROR(Status)) {\r
1343 ShellStatus = SHELL_ACCESS_DENIED;\r
1344 goto ON_EXIT;\r
1345 }\r
1346\r
1347 VarArg= VarArg->Next;\r
1348\r
1349 } else if (StrCmp (VarArg->Arg, L"host") == 0) {\r
1350 //\r
1351 // Parse till the next tag or the end of command line.\r
1352 //\r
1353 VarArg = VarArg->Next;\r
1354 Status = IfConfig6ParseManualAddressList (\r
1355 &VarArg,\r
1356 &CfgManAddr,\r
1357 &AddrSize\r
1358 );\r
1359\r
1360 if (EFI_ERROR (Status)) {\r
1361 if (Status == EFI_INVALID_PARAMETER) {\r
1362 ShellStatus = SHELL_INVALID_PARAMETER;\r
1363 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_ARGUMENTS), gShellNetwork2HiiHandle, L"host");\r
1364 continue;\r
1365 } else {\r
1366 ShellStatus = SHELL_ACCESS_DENIED;\r
1367 goto ON_EXIT;\r
1368 }\r
1369 }\r
1370 //\r
1371 // Set static host ip6 address list.\r
1372 // This is a asynchronous process.\r
1373 //\r
1374 IsAddressOk = FALSE;\r
1375\r
1376 Status = IfCb->IfCfg->RegisterDataNotify (\r
1377 IfCb->IfCfg,\r
1378 Ip6ConfigDataTypeManualAddress,\r
1379 MappedEvt\r
1380 );\r
1381 if (EFI_ERROR (Status)) {\r
1382 ShellStatus = SHELL_ACCESS_DENIED;\r
1383 goto ON_EXIT;\r
1384 }\r
1385\r
1386 Status = IfCb->IfCfg->SetData (\r
1387 IfCb->IfCfg,\r
1388 Ip6ConfigDataTypeManualAddress,\r
1389 AddrSize,\r
1390 CfgManAddr\r
1391 );\r
1392\r
1393 if (Status == EFI_NOT_READY) {\r
1394 //\r
1395 // Get current dad transmits count.\r
1396 //\r
1397 CurDadXmitsLen = sizeof (EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS);\r
1398 IfCb->IfCfg->GetData (\r
1399 IfCb->IfCfg,\r
1400 Ip6ConfigDataTypeDupAddrDetectTransmits,\r
1401 &CurDadXmitsLen,\r
1402 &CurDadXmits\r
1403 );\r
1404\r
1405 gBS->SetTimer (TimeOutEvt, TimerRelative, 50000000 + 10000000 * CurDadXmits);\r
1406\r
1407 while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) {\r
1408 if (IsAddressOk) {\r
1409 Status = EFI_SUCCESS;\r
1410 break;\r
1411 }\r
1412 }\r
1413 }\r
1414\r
1415 IfCb->IfCfg->UnregisterDataNotify (\r
1416 IfCb->IfCfg,\r
1417 Ip6ConfigDataTypeManualAddress,\r
1418 MappedEvt\r
1419 );\r
1420\r
1421 if (EFI_ERROR (Status)) {\r
1422 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_MAN_HOST), gShellNetwork2HiiHandle, Status);\r
1423 ShellStatus = SHELL_ACCESS_DENIED;\r
1424 goto ON_EXIT;\r
1425 }\r
1426\r
1427 //\r
1428 // Check whether the address is set successfully.\r
1429 //\r
1430 DataSize = 0;\r
1431\r
1432 Status = IfCb->IfCfg->GetData (\r
1433 IfCb->IfCfg,\r
1434 Ip6ConfigDataTypeInterfaceInfo,\r
1435 &DataSize,\r
1436 NULL\r
1437 );\r
1438\r
1439 if (Status != EFI_BUFFER_TOO_SMALL) {\r
1440 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);\r
1441 ShellStatus = SHELL_ACCESS_DENIED;\r
1442 goto ON_EXIT;\r
1443 }\r
1444\r
1445 IfInfo = AllocateZeroPool (DataSize);\r
1446\r
1447 if (IfInfo == NULL) {\r
1448 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
1449 goto ON_EXIT;\r
1450 }\r
1451\r
1452 Status = IfCb->IfCfg->GetData (\r
1453 IfCb->IfCfg,\r
1454 Ip6ConfigDataTypeInterfaceInfo,\r
1455 &DataSize,\r
1456 IfInfo\r
1457 );\r
1458\r
1459 if (EFI_ERROR (Status)) {\r
1460 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_IP6CFG_GETDATA), gShellNetwork2HiiHandle, Status);\r
1461 ShellStatus = SHELL_ACCESS_DENIED;\r
1462 goto ON_EXIT;\r
1463 }\r
1464\r
1465 for ( Index = 0; Index < (UINTN) (AddrSize / sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS)); Index++) {\r
1466 IsAddressSet = FALSE;\r
1467 //\r
1468 // By default, the prefix length 0 is regarded as 64.\r
1469 //\r
1470 if (CfgManAddr[Index].PrefixLength == 0) {\r
1471 CfgManAddr[Index].PrefixLength = 64;\r
1472 }\r
1473\r
1474 for (Index2 = 0; Index2 < IfInfo->AddressInfoCount; Index2++) {\r
1475 if (EFI_IP6_EQUAL (&IfInfo->AddressInfo[Index2].Address, &CfgManAddr[Index].Address) &&\r
1476 (IfInfo->AddressInfo[Index2].PrefixLength == CfgManAddr[Index].PrefixLength)) {\r
1477 IsAddressSet = TRUE;\r
1478 break;\r
1479 }\r
1480 }\r
1481\r
1482 if (!IsAddressSet) {\r
1483 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_ADDRESS_FAILED), gShellNetwork2HiiHandle);\r
1484 IfConfig6PrintIpAddr (\r
1485 &CfgManAddr[Index].Address,\r
1486 &CfgManAddr[Index].PrefixLength\r
1487 );\r
1f480707 1488 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_INFO_NEWLINE), gShellNetwork2HiiHandle);\r
43ca1753
ZL
1489 }\r
1490 }\r
1491\r
1492 } else if (StrCmp (VarArg->Arg, L"gw") == 0) {\r
1493 //\r
1494 // Parse till the next tag or the end of command line.\r
1495 //\r
1496 VarArg = VarArg->Next;\r
1497 Status = IfConfig6ParseGwDnsAddressList (\r
1498 &VarArg,\r
1499 &CfgAddr,\r
1500 &AddrSize\r
1501 );\r
1502\r
1503 if (EFI_ERROR (Status)) {\r
1504 if (Status == EFI_INVALID_PARAMETER) {\r
1505 ShellStatus = SHELL_INVALID_PARAMETER;\r
1506 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_ARGUMENTS), gShellNetwork2HiiHandle, L"gw");\r
1507 continue;\r
1508 } else {\r
1509 ShellStatus = SHELL_ACCESS_DENIED;\r
1510 goto ON_EXIT;\r
1511 }\r
1512 }\r
1513 //\r
1514 // Set static gateway ip6 address list.\r
1515 //\r
1516 Status = IfCb->IfCfg->SetData (\r
1517 IfCb->IfCfg,\r
1518 Ip6ConfigDataTypeGateway,\r
1519 AddrSize,\r
1520 CfgAddr\r
1521 );\r
1522\r
1523 if (EFI_ERROR (Status)) {\r
1524 ShellStatus = SHELL_ACCESS_DENIED;\r
445d2007 1525 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_MAN_GW), gShellNetwork2HiiHandle, Status);\r
43ca1753
ZL
1526 goto ON_EXIT;\r
1527 }\r
1528\r
1529 } else if (StrCmp (VarArg->Arg, L"dns") == 0) {\r
1530 //\r
1531 // Parse till the next tag or the end of command line.\r
1532 //\r
1533 VarArg = VarArg->Next;\r
1534 Status = IfConfig6ParseGwDnsAddressList (\r
1535 &VarArg,\r
1536 &CfgAddr,\r
1537 &AddrSize\r
1538 );\r
1539\r
1540 if (EFI_ERROR (Status)) {\r
1541 if (Status == EFI_INVALID_PARAMETER) {\r
1542 ShellStatus = SHELL_INVALID_PARAMETER;\r
1543 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_ARGUMENTS), gShellNetwork2HiiHandle, L"dns");\r
1544 continue;\r
1545 } else {\r
1546 ShellStatus = SHELL_ACCESS_DENIED;\r
1547 goto ON_EXIT;\r
1548 }\r
1549 }\r
1550 //\r
1551 // Set static DNS server ip6 address list.\r
1552 //\r
1553 Status = IfCb->IfCfg->SetData (\r
1554 IfCb->IfCfg,\r
1555 Ip6ConfigDataTypeDnsServer,\r
1556 AddrSize,\r
1557 CfgAddr\r
1558 );\r
1559\r
1560 if (EFI_ERROR (Status)) {\r
1561 ShellStatus = SHELL_ACCESS_DENIED;\r
1562 goto ON_EXIT;\r
1563 }\r
1564\r
1565 } else if (StrCmp (VarArg->Arg, L"id") == 0) {\r
1566 //\r
1567 // Parse till the next tag or the end of command line.\r
1568 //\r
1569 VarArg = VarArg->Next;\r
1570 Status = IfConfig6ParseInterfaceId (&VarArg, &InterfaceId);\r
1571\r
1572 if (EFI_ERROR (Status)) {\r
1573 ShellStatus = SHELL_INVALID_PARAMETER;\r
1574 goto ON_EXIT;\r
1575 }\r
1576 //\r
1577 // Set alternative interface id.\r
1578 //\r
1579 Status = IfCb->IfCfg->SetData (\r
1580 IfCb->IfCfg,\r
1581 Ip6ConfigDataTypeAltInterfaceId,\r
1582 sizeof (EFI_IP6_CONFIG_INTERFACE_ID),\r
1583 InterfaceId\r
1584 );\r
1585\r
1586 if (EFI_ERROR (Status)) {\r
1587 ShellStatus = SHELL_ACCESS_DENIED;\r
1588 goto ON_EXIT;\r
1589 }\r
1590\r
1591 } else if (StrCmp (VarArg->Arg, L"dad") == 0) {\r
1592 //\r
1593 // Parse till the next tag or the end of command line.\r
1594 //\r
1595 VarArg = VarArg->Next;\r
1596 Status = IfConfig6ParseDadXmits (&VarArg, &DadXmits);\r
1597\r
1598 if (EFI_ERROR (Status)) {\r
1599 ShellStatus = SHELL_ACCESS_DENIED;\r
1600 goto ON_EXIT;\r
1601 }\r
1602 //\r
1603 // Set dad transmits count.\r
1604 //\r
1605 Status = IfCb->IfCfg->SetData (\r
1606 IfCb->IfCfg,\r
1607 Ip6ConfigDataTypeDupAddrDetectTransmits,\r
1608 sizeof (EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS),\r
1609 &DadXmits\r
1610 );\r
1611\r
1612 if (EFI_ERROR(Status)) {\r
1613 ShellStatus = SHELL_ACCESS_DENIED;\r
1614 goto ON_EXIT;\r
1615 }\r
1616 }\r
1617 }\r
1618\r
1619ON_EXIT:\r
1620\r
1621 if (CfgManAddr != NULL) {\r
1622 FreePool (CfgManAddr);\r
1623 }\r
1624\r
1625 if (CfgAddr != NULL) {\r
1626 FreePool (CfgAddr);\r
1627 }\r
1628\r
1629 if (MappedEvt != NULL) {\r
1630 gBS->CloseEvent (MappedEvt);\r
1631 }\r
1632\r
1633 if (TimeOutEvt != NULL) {\r
1634 gBS->CloseEvent (TimeOutEvt);\r
1635 }\r
1636\r
1637 if (IfInfo != NULL) {\r
1638 FreePool (IfInfo);\r
1639 }\r
1640\r
1641 return ShellStatus;\r
1642\r
1643}\r
1644\r
1645/**\r
1646 The IfConfig6 main process.\r
1647\r
1648 @param[in] Private The pointer of IFCONFIG6_PRIVATE_DATA.\r
1649\r
1650 @retval SHELL_SUCCESS IfConfig6 processed successfully.\r
1651 @retval others The IfConfig6 process failed.\r
1652\r
1653**/\r
1654SHELL_STATUS\r
1655IfConfig6 (\r
1656 IN IFCONFIG6_PRIVATE_DATA *Private\r
1657 )\r
1658{\r
1659 EFI_STATUS Status;\r
1660 SHELL_STATUS ShellStatus;\r
1661\r
1662 ShellStatus = SHELL_SUCCESS;\r
1663\r
1664 //\r
1665 // Get configure information of all interfaces.\r
1666 //\r
1667 Status = IfConfig6GetInterfaceInfo (\r
1668 Private->ImageHandle,\r
1669 Private->IfName,\r
1670 &Private->IfList\r
1671 );\r
1672\r
1673 if (EFI_ERROR (Status)) {\r
1674 ShellStatus = SHELL_NOT_FOUND;\r
1675 goto ON_EXIT;\r
1676 }\r
1677\r
1678 switch (Private->OpCode) {\r
1679 case IfConfig6OpList:\r
1680 ShellStatus = IfConfig6ShowInterfaceInfo (&Private->IfList);\r
1681 break;\r
1682\r
1683 case IfConfig6OpClear:\r
e2f5c491 1684 ShellStatus = IfConfig6ClearInterfaceInfo (&Private->IfList, Private->IfName);\r
43ca1753
ZL
1685 break;\r
1686\r
1687 case IfConfig6OpSet:\r
1688 ShellStatus = IfConfig6SetInterfaceInfo (&Private->IfList, Private->VarArg);\r
1689 break;\r
1690\r
1691 default:\r
1692 ShellStatus = SHELL_UNSUPPORTED;\r
1693 }\r
1694\r
1695ON_EXIT:\r
1696\r
1697 return ShellStatus;\r
1698}\r
1699\r
1700/**\r
1701 The IfConfig6 cleanup process, free the allocated memory.\r
1702\r
1703 @param[in] Private The pointer of IFCONFIG6_PRIVATE_DATA.\r
1704\r
1705**/\r
1706VOID\r
1707IfConfig6Cleanup (\r
1708 IN IFCONFIG6_PRIVATE_DATA *Private\r
1709 )\r
1710{\r
1711 LIST_ENTRY *Entry;\r
1712 LIST_ENTRY *NextEntry;\r
1713 IFCONFIG6_INTERFACE_CB *IfCb;\r
43ca1753
ZL
1714\r
1715 ASSERT (Private != NULL);\r
1716\r
1717 //\r
1718 // Clean the list which save the set config Args.\r
1719 //\r
1720 if (Private->VarArg != NULL) {\r
a915fea6 1721 IfConfig6FreeArgList (Private->VarArg);\r
43ca1753
ZL
1722 }\r
1723\r
1724 if (Private->IfName != NULL)\r
1725 FreePool (Private->IfName);\r
1726\r
1727\r
1728 //\r
1729 // Clean the IFCONFIG6_INTERFACE_CB list.\r
1730 //\r
1731 Entry = Private->IfList.ForwardLink;\r
1732 NextEntry = Entry->ForwardLink;\r
1733\r
1734 while (Entry != &Private->IfList) {\r
1735\r
1736 IfCb = BASE_CR (Entry, IFCONFIG6_INTERFACE_CB, Link);\r
1737\r
1738 RemoveEntryList (&IfCb->Link);\r
1739\r
1740 if (IfCb->IfId != NULL) {\r
1741\r
1742 FreePool (IfCb->IfId);\r
1743 }\r
1744\r
1745 if (IfCb->IfInfo != NULL) {\r
1746\r
1747 FreePool (IfCb->IfInfo);\r
1748 }\r
1749\r
1750 FreePool (IfCb);\r
1751\r
1752 Entry = NextEntry;\r
1753 NextEntry = Entry->ForwardLink;\r
1754 }\r
1755\r
1756 FreePool (Private);\r
1757}\r
1758\r
1759/**\r
1760 Function for 'ifconfig6' command.\r
1761\r
1762 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
1763 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
1764\r
1765 @retval SHELL_SUCCESS ifconfig6 command processed successfully.\r
1766 @retval others The ifconfig6 command process failed.\r
1767\r
1768**/\r
1769SHELL_STATUS\r
1770EFIAPI\r
1771ShellCommandRunIfconfig6 (\r
1772 IN EFI_HANDLE ImageHandle,\r
1773 IN EFI_SYSTEM_TABLE *SystemTable\r
1774 )\r
1775{\r
1776 EFI_STATUS Status;\r
1777 SHELL_STATUS ShellStatus;\r
1778 IFCONFIG6_PRIVATE_DATA *Private;\r
1779 LIST_ENTRY *ParamPackage;\r
1780 CONST CHAR16 *ValueStr;\r
1781 ARG_LIST *ArgList;\r
1782 CHAR16 *ProblemParam;\r
1783 CHAR16 *Str;\r
1784\r
1785 Private = NULL;\r
1786 Status = EFI_INVALID_PARAMETER;\r
1787 ShellStatus = SHELL_SUCCESS;\r
1788\r
1789 Status = ShellCommandLineParseEx (mIfConfig6CheckList, &ParamPackage, &ProblemParam, TRUE, FALSE);\r
1790 if (EFI_ERROR (Status)) {\r
1791 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_INVALID_COMMAND), gShellNetwork2HiiHandle, L"ifconfig6", ProblemParam);\r
1792 ShellStatus = SHELL_INVALID_PARAMETER;\r
1793 goto ON_EXIT;\r
1794 }\r
1795\r
1796 //\r
1797 // To handle no option.\r
1798 //\r
1799 if (!ShellCommandLineGetFlag (ParamPackage, L"-r") && !ShellCommandLineGetFlag (ParamPackage, L"-s") &&\r
1800 !ShellCommandLineGetFlag (ParamPackage, L"-?") && !ShellCommandLineGetFlag (ParamPackage, L"-l")) {\r
1801 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_LACK_OPTION), gShellNetwork2HiiHandle);\r
1802 ShellStatus = SHELL_INVALID_PARAMETER;\r
1803 goto ON_EXIT;\r
1804 }\r
1805 //\r
1806 // To handle conflict options.\r
1807 //\r
1808 if (((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-s"))) ||\r
1809 ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||\r
1810 ((ShellCommandLineGetFlag (ParamPackage, L"-r")) && (ShellCommandLineGetFlag (ParamPackage, L"-?"))) ||\r
1811 ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-l"))) ||\r
1812 ((ShellCommandLineGetFlag (ParamPackage, L"-s")) && (ShellCommandLineGetFlag (ParamPackage, L"-?"))) ||\r
1813 ((ShellCommandLineGetFlag (ParamPackage, L"-l")) && (ShellCommandLineGetFlag (ParamPackage, L"-?")))) {\r
1814 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_CONFLICT_OPTIONS), gShellNetwork2HiiHandle);\r
1815 ShellStatus = SHELL_INVALID_PARAMETER;\r
1816 goto ON_EXIT;\r
1817 }\r
1818\r
1819 Private = AllocateZeroPool (sizeof (IFCONFIG6_PRIVATE_DATA));\r
1820\r
1821 if (Private == NULL) {\r
1822 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
1823 goto ON_EXIT;\r
1824 }\r
1825\r
1826 InitializeListHead (&Private->IfList);\r
1827\r
1828 //\r
1829 // To get interface name for the list option.\r
1830 //\r
1831 if (ShellCommandLineGetFlag (ParamPackage, L"-l")) {\r
1832 Private->OpCode = IfConfig6OpList;\r
1833 ValueStr = ShellCommandLineGetValue (ParamPackage, L"-l");\r
1834 if (ValueStr != NULL) {\r
a915fea6
RN
1835 Str = AllocateCopyPool (StrSize (ValueStr), ValueStr);\r
1836 if (Str == NULL) {\r
1837 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6");\r
1838 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
1839 goto ON_EXIT;\r
1840 }\r
43ca1753
ZL
1841 Private->IfName = Str;\r
1842 }\r
1843 }\r
1844 //\r
1845 // To get interface name for the clear option.\r
1846 //\r
1847 if (ShellCommandLineGetFlag (ParamPackage, L"-r")) {\r
1848 Private->OpCode = IfConfig6OpClear;\r
1849 ValueStr = ShellCommandLineGetValue (ParamPackage, L"-r");\r
1850 if (ValueStr != NULL) {\r
a915fea6
RN
1851 Str = AllocateCopyPool (StrSize (ValueStr), ValueStr);\r
1852 if (Str == NULL) {\r
1853 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6");\r
1854 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
1855 goto ON_EXIT;\r
1856 }\r
43ca1753
ZL
1857 Private->IfName = Str;\r
1858 }\r
1859 }\r
1860 //\r
1861 // To get interface name and corresponding Args for the set option.\r
1862 //\r
1863 if (ShellCommandLineGetFlag (ParamPackage, L"-s")) {\r
1864\r
1865 ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s");\r
1866 if (ValueStr == NULL) {\r
1867 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_INTERFACE), gShellNetwork2HiiHandle);\r
1868 ShellStatus = SHELL_INVALID_PARAMETER;\r
1869 goto ON_EXIT;\r
1870 }\r
1871 //\r
1872 // To split the configuration into multi-section.\r
1873 //\r
a915fea6
RN
1874 ArgList = IfConfig6SplitStrToList (ValueStr, L' ');\r
1875 if (ArgList == NULL) {\r
1876 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellNetwork2HiiHandle, L"ifconfig6");\r
1877 ShellStatus = SHELL_OUT_OF_RESOURCES;\r
1878 goto ON_EXIT;\r
1879 }\r
43ca1753
ZL
1880\r
1881 Private->OpCode = IfConfig6OpSet;\r
1882 Private->IfName = ArgList->Arg;\r
1883\r
1884 Private->VarArg = ArgList->Next;\r
1885\r
1886 if (Private->IfName == NULL || Private->VarArg == NULL) {\r
1887 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IFCONFIG6_ERR_LACK_COMMAND), gShellNetwork2HiiHandle);\r
1888 ShellStatus = SHELL_INVALID_PARAMETER;\r
1889 goto ON_EXIT;\r
1890 }\r
1891 }\r
1892 //\r
1893 // Main process of ifconfig6.\r
1894 //\r
1895 ShellStatus = IfConfig6 (Private);\r
1896\r
1897ON_EXIT:\r
1898\r
1899 ShellCommandLineFreeVarList (ParamPackage);\r
1900 if (Private != NULL) {\r
1901 IfConfig6Cleanup (Private);\r
1902 }\r
1903 return ShellStatus;\r
1904\r
1905}\r
1906\r