2 The implementation for ifcommand shell command.
4 Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php.
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "UefiShellNetwork1CommandsLib.h"
17 #define NIC_ITEM_CONFIG_SIZE (sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * MAX_IP4_CONFIG_IN_VARIABLE)
18 #define EFI_IP4_TO_U32(EfiIpAddr) (*(IP4_ADDR*)((EfiIpAddr).Addr))
20 BOOLEAN mIp4ConfigExist
= FALSE
;
21 STATIC EFI_HII_CONFIG_ROUTING_PROTOCOL
*mHiiConfigRouting
= NULL
;
23 STATIC CONST UINTN SecondsToNanoSeconds
= 10000000;
24 STATIC CONST CHAR16 DhcpString
[5] = L
"DHCP";
25 STATIC CONST CHAR16 StaticString
[7] = L
"STATIC";
26 STATIC CONST CHAR16 PermanentString
[10] = L
"PERMANENT";
32 CHAR16 Name
[IP4_NIC_NAME_LENGTH
];
33 BOOLEAN MediaPresentSupported
;
35 EFI_IP4_CONFIG_PROTOCOL
*Ip4Config
;
36 NIC_IP4_CONFIG_INFO
*ConfigInfo
;
40 EFI_IP_ADDRESS DestIp
;
41 EFI_MAC_ADDRESS DestMac
;
42 EFI_IP_ADDRESS LocalIp
;
43 EFI_MAC_ADDRESS LocalMac
;
49 STATIC CONST SHELL_PARAM_ITEM ParamList
[] = {
52 {L
"-s", TypeMaxValue
},
56 STATIC LIST_ENTRY NicInfoList
;
57 STATIC BOOLEAN ArpResolved
;
58 STATIC BOOLEAN mTimeout
;
61 Count the space delimited items in a string.
63 @param[in] String A pointer to the string to count.
65 @return The number of space-delimited items.
66 @retval 0xFF an error occured.
71 IN CONST CHAR16
*String
77 if (String
== NULL
|| *String
== CHAR_NULL
) {
81 for (Walker
= String
, Count
= 0 ; Walker
!= NULL
&& *Walker
!= CHAR_NULL
; Walker
= (StrStr(Walker
, L
" ")==NULL
?NULL
:StrStr(Walker
, L
" ")+1), Count
++);
86 Find the NIC_INFO by the specified nic name.
88 @param[in] Name The pointer to the string containing the NIC name.
90 @return The pointer to the NIC_INFO if there is a NIC_INFO named by Name.
91 @retval NULL No NIC_INFO was found for Name.
95 IfconfigFindNicByName (
100 LIST_ENTRY
*NextEntry
;
104 NET_LIST_FOR_EACH_SAFE (Entry
, NextEntry
, &NicInfoList
) {
105 Info
= BASE_CR (Entry
, NIC_INFO
, Link
);
106 TempString
= (CHAR16
*)Info
->Name
;
108 if (StringNoCaseCompare (&Name
, &TempString
) == 0) {
117 Tests whether a child handle is a child device of the controller.
119 @param[in] ControllerHandle A handle for a (parent) controller to test.
120 @param[in] ChildHandle A child handle to test.
121 @param[in] ProtocolGuid Supplies the protocol that the child controller
122 opens on its parent controller.
124 @retval EFI_SUCCESS ChildHandle is a child of the ControllerHandle.
125 @retval EFI_UNSUPPORTED ChildHandle is not a child of the ControllerHandle.
130 IN CONST EFI_HANDLE ControllerHandle
,
131 IN CONST EFI_HANDLE ChildHandle
,
132 IN CONST EFI_GUID
*ProtocolGuid
136 EFI_OPEN_PROTOCOL_INFORMATION_ENTRY
*OpenInfoBuffer
;
140 ASSERT (ProtocolGuid
!= NULL
);
143 // Retrieve the list of agents that are consuming the specific protocol
144 // on ControllerHandle.
146 Status
= gBS
->OpenProtocolInformation (
148 (EFI_GUID
*) ProtocolGuid
,
152 if (EFI_ERROR (Status
)) {
153 return EFI_UNSUPPORTED
;
157 // Inspect if ChildHandle is one of the agents.
159 Status
= EFI_UNSUPPORTED
;
160 for (Index
= 0; Index
< EntryCount
; Index
++) {
161 if ((OpenInfoBuffer
[Index
].ControllerHandle
== ChildHandle
) &&
162 (OpenInfoBuffer
[Index
].Attributes
& EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
) != 0) {
163 Status
= EFI_SUCCESS
;
168 FreePool (OpenInfoBuffer
);
173 Get the child handle of the NIC handle.
175 @param[in] Controller Routing information: GUID.
176 @param[out] ChildHandle Returned child handle.
178 @retval EFI_SUCCESS Successfully to get child handle.
182 IN EFI_HANDLE Controller
,
183 OUT EFI_HANDLE
*ChildHandle
190 EFI_DEVICE_PATH_PROTOCOL
*ChildDeviceDevicePath
;
191 VENDOR_DEVICE_PATH
*VendorDeviceNode
;
194 // Locate all EFI Hii Config Access protocols
196 Status
= gBS
->LocateHandleBuffer (
198 &gEfiHiiConfigAccessProtocolGuid
,
203 if (EFI_ERROR (Status
) || (HandleCount
== 0)) {
207 Status
= EFI_NOT_FOUND
;
209 for (Index
= 0; Index
< HandleCount
; Index
++) {
211 Status
= TestChildHandle (Controller
, Handles
[Index
], &gEfiManagedNetworkServiceBindingProtocolGuid
);
212 if (!EFI_ERROR (Status
)) {
214 // Get device path on the child handle
216 Status
= gBS
->HandleProtocol (
218 &gEfiDevicePathProtocolGuid
,
219 (VOID
**) &ChildDeviceDevicePath
222 if (!EFI_ERROR (Status
)) {
223 while (!IsDevicePathEnd (ChildDeviceDevicePath
)) {
224 ChildDeviceDevicePath
= NextDevicePathNode (ChildDeviceDevicePath
);
226 // Parse one instance
228 if (ChildDeviceDevicePath
->Type
== HARDWARE_DEVICE_PATH
&&
229 ChildDeviceDevicePath
->SubType
== HW_VENDOR_DP
) {
230 VendorDeviceNode
= (VENDOR_DEVICE_PATH
*) ChildDeviceDevicePath
;
231 if (CompareMem (&VendorDeviceNode
->Guid
, &gEfiNicIp4ConfigVariableGuid
, sizeof (EFI_GUID
)) == 0) {
233 // Found item matched gEfiNicIp4ConfigVariableGuid
235 *ChildHandle
= Handles
[Index
];
250 Append OFFSET/WIDTH/VALUE items at the beginning of string.
252 @param[in, out] String The pointer to the string to append onto.
253 @param[in] Offset Offset value.
254 @param[in] Width Width value.
255 @param[in] Block Point to data buffer.
257 @return The count of unicode character that were appended.
261 AppendOffsetWidthValue (
262 IN OUT CHAR16
*String
,
265 IN CONST UINT8
*Block
273 StrCpy (String
, L
"&OFFSET=");
274 String
+= StrLen (L
"&OFFSET=");
275 String
+= UnicodeSPrint (String
, 20, L
"%x", Offset
);
277 StrCpy (String
,L
"&WIDTH=");
278 String
+= StrLen (L
"&WIDTH=");
279 String
+= UnicodeSPrint (String
, 20, L
"%x", Width
);
282 StrCpy (String
,L
"&VALUE=");
283 String
+= StrLen (L
"&VALUE=");
284 while ((Width
--) != 0) {
285 String
+= UnicodeSPrint (String
, 20, L
"%x", Block
[Width
]);
289 return String
- OriString
;
293 Converts the unicode character of the string from uppercase to lowercase.
294 This is a internal function.
296 @param ConfigString String to be converted
301 IN CHAR16
*ConfigString
308 // Convert all hex digits in range [A-F] in the configuration header to [a-f]
310 for (String
= ConfigString
, Lower
= FALSE
; String
!= NULL
&& *String
!= L
'\0'; String
++) {
311 if (*String
== L
'=') {
313 } else if (*String
== L
'&') {
315 } else if (Lower
&& *String
>= L
'A' && *String
<= L
'F') {
316 *String
= (CHAR16
) (*String
- L
'A' + L
'a');
320 return (ConfigString
);
325 Construct <ConfigHdr> using routing information GUID/NAME/PATH.
327 @param[in] Guid Routing information: GUID.
328 @param[in] Name Routing information: NAME.
329 @param[in] DriverHandle Driver handle which contains the routing information: PATH.
331 @retval NULL An error occured.
332 @return The pointer to configHdr string.
337 IN CONST EFI_GUID
*Guid
,
338 IN CONST CHAR16
*Name
,
339 IN EFI_HANDLE DriverHandle
344 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
348 UINTN DevicePathLength
;
352 // Get the device path from handle installed EFI HII Config Access protocol
354 Status
= gBS
->HandleProtocol (
356 &gEfiDevicePathProtocolGuid
,
357 (VOID
**) &DevicePath
359 if (EFI_ERROR (Status
)) {
363 DevicePathLength
= GetDevicePathSize (DevicePath
);
364 NameLength
= StrLen (Name
);
365 ConfigHdr
= AllocateZeroPool ((5 + sizeof (EFI_GUID
) * 2 + 6 + NameLength
* 4 + 6 + DevicePathLength
* 2 + 1) * sizeof (CHAR16
));
366 if (ConfigHdr
== NULL
) {
371 StrCpy (String
, L
"GUID=");
372 String
+= StrLen (L
"GUID=");
375 // Append Guid converted to <HexCh>32
377 for (Index
= 0, Buffer
= (UINT8
*)Guid
; Index
< sizeof (EFI_GUID
); Index
++) {
378 String
+= UnicodeSPrint (String
, 6, L
"%02x", *Buffer
++);
384 StrCpy (String
, L
"&NAME=");
385 String
+= StrLen (L
"&NAME=");
386 for (Index
= 0; Index
< NameLength
; Index
++) {
387 String
+= UnicodeSPrint (String
, 10, L
"00%x", Name
[Index
]);
393 StrCpy (String
, L
"&PATH=");
394 String
+= StrLen (L
"&PATH=");
395 for (Index
= 0, Buffer
= (UINT8
*) DevicePath
; Index
< DevicePathLength
; Index
++) {
396 String
+= UnicodeSPrint (String
, 6, L
"%02x", *Buffer
++);
399 return (HiiToLower(ConfigHdr
));
403 Get network physical device NIC information.
405 @param[in] Handle The network physical device handle.
406 @param[out] NicAddr NIC information.
408 @retval EFI_SUCCESS Get NIC information successfully.
412 IfConfigGetNicMacInfo (
413 IN EFI_HANDLE Handle
,
414 OUT NIC_ADDR
*NicAddr
418 EFI_HANDLE MnpHandle
;
419 EFI_SIMPLE_NETWORK_MODE SnpMode
;
420 EFI_MANAGED_NETWORK_PROTOCOL
*Mnp
;
425 Status
= NetLibCreateServiceChild (
428 &gEfiManagedNetworkServiceBindingProtocolGuid
,
431 if (EFI_ERROR (Status
)) {
435 Status
= gBS
->HandleProtocol (
437 &gEfiManagedNetworkProtocolGuid
,
440 if (EFI_ERROR (Status
)) {
444 Status
= Mnp
->GetModeData (Mnp
, NULL
, &SnpMode
);
445 if (EFI_ERROR (Status
) && (Status
!= EFI_NOT_STARTED
)) {
449 NicAddr
->Type
= (UINT16
) SnpMode
.IfType
;
450 NicAddr
->Len
= (UINT8
) SnpMode
.HwAddressSize
;
451 CopyMem (&NicAddr
->MacAddr
, &SnpMode
.CurrentAddress
, NicAddr
->Len
);
455 NetLibDestroyServiceChild (
458 &gEfiManagedNetworkServiceBindingProtocolGuid
,
467 Get network physical device NIC information.
469 @param[in] Handle The network physical device handle.
470 @param[out] MediaPresentSupported
471 Upon successful return, TRUE is media present
472 is supported. FALSE otherwise.
473 @param[out] MediaPresent Upon successful return, TRUE is media present
474 is enabled. FALSE otherwise.
476 @retval EFI_SUCCESS The operation was successful.
480 IfConfigGetNicMediaStatus (
481 IN EFI_HANDLE Handle
,
482 OUT BOOLEAN
*MediaPresentSupported
,
483 OUT BOOLEAN
*MediaPresent
488 EFI_HANDLE MnpHandle
;
489 EFI_SIMPLE_NETWORK_MODE SnpMode
;
490 EFI_MANAGED_NETWORK_PROTOCOL
*Mnp
;
495 Status
= NetLibCreateServiceChild (
498 &gEfiManagedNetworkServiceBindingProtocolGuid
,
501 if (EFI_ERROR (Status
)) {
505 Status
= gBS
->HandleProtocol (
507 &gEfiManagedNetworkProtocolGuid
,
510 if (EFI_ERROR (Status
)) {
514 Status
= Mnp
->GetModeData (Mnp
, NULL
, &SnpMode
);
515 if (EFI_ERROR (Status
) && (Status
!= EFI_NOT_STARTED
)) {
519 *MediaPresentSupported
= SnpMode
.MediaPresentSupported
;
520 *MediaPresent
= SnpMode
.MediaPresent
;
524 NetLibDestroyServiceChild (
527 &gEfiManagedNetworkServiceBindingProtocolGuid
,
536 Get all Nic's information through HII service.
538 @retval EFI_SUCCESS All the nic information is collected.
542 IfconfigGetAllNicInfoByHii (
552 CHAR16
*AccessProgress
;
553 CHAR16
*AccessResults
;
556 NIC_IP4_CONFIG_INFO
*NicConfigRequest
;
557 NIC_IP4_CONFIG_INFO
*NicConfig
;
561 EFI_HANDLE ChildHandle
;
563 AccessResults
= NULL
;
566 NicConfigRequest
= NULL
;
569 InitializeListHead (&NicInfoList
);
572 // Check if HII Config Routing protocol available.
574 Status
= gBS
->LocateProtocol (
575 &gEfiHiiConfigRoutingProtocolGuid
,
577 (VOID
**)&mHiiConfigRouting
579 if (EFI_ERROR (Status
)) {
580 return EFI_NOT_FOUND
;
584 // Locate all network device handles
586 Status
= gBS
->LocateHandleBuffer (
588 &gEfiManagedNetworkServiceBindingProtocolGuid
,
593 if (EFI_ERROR (Status
) || (HandleCount
== 0)) {
594 return EFI_NOT_FOUND
;
597 for (Index
= 0; Index
< HandleCount
; Index
++) {
598 Status
= GetChildHandle (Handles
[Index
], &ChildHandle
);
599 if (EFI_ERROR (Status
)) {
601 // If failed to get Child handle, try NIC controller handle for back-compatibility.
603 ChildHandle
= Handles
[Index
];
606 // Construct configuration request string header
608 ConfigHdr
= ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid
, EFI_NIC_IP4_CONFIG_VARIABLE
, ChildHandle
);
609 if (ConfigHdr
!= NULL
) {
610 Length
= StrLen (ConfigHdr
);
614 ConfigResp
= AllocateZeroPool ((Length
+ NIC_ITEM_CONFIG_SIZE
* 2 + 100) * sizeof (CHAR16
));
615 if (ConfigResp
== NULL
) {
616 Status
= EFI_OUT_OF_RESOURCES
;
619 if (ConfigHdr
!= NULL
) {
620 StrCpy (ConfigResp
, ConfigHdr
);
624 // Append OFFSET/WIDTH pair
626 String
= ConfigResp
+ Length
;
628 AppendOffsetWidthValue (String
, Offset
, NIC_ITEM_CONFIG_SIZE
, NULL
);
630 NicInfo
= AllocateZeroPool (sizeof (NIC_INFO
));
631 if (NicInfo
== NULL
) {
632 Status
= EFI_OUT_OF_RESOURCES
;
635 NicInfo
->Handle
= Handles
[Index
];
638 // Get network physical devcie MAC information
640 IfConfigGetNicMacInfo (Handles
[Index
], &NicInfo
->NicAddress
);
641 if (NicInfo
->NicAddress
.Type
== NET_IFTYPE_ETHERNET
) {
642 UnicodeSPrint (NicInfo
->Name
, IP4_NIC_NAME_LENGTH
, L
"eth%d", Index
);
644 UnicodeSPrint (NicInfo
->Name
, IP4_NIC_NAME_LENGTH
, L
"unk%d", Index
);
650 IfConfigGetNicMediaStatus (Handles
[Index
], &NicInfo
->MediaPresentSupported
, &NicInfo
->MediaPresent
);
652 NicConfigRequest
= AllocateZeroPool (NIC_ITEM_CONFIG_SIZE
);
653 if (NicConfigRequest
== NULL
) {
654 Status
= EFI_OUT_OF_RESOURCES
;
659 // Get network parameters by HII service
661 Status
= mHiiConfigRouting
->ExtractConfig (
667 if (!EFI_ERROR (Status
)) {
668 BufferSize
= NIC_ITEM_CONFIG_SIZE
;
669 Status
= mHiiConfigRouting
->ConfigToBlock (
672 (UINT8
*) NicConfigRequest
,
676 if (!EFI_ERROR (Status
)) {
677 BufferSize
= sizeof (NIC_IP4_CONFIG_INFO
) + sizeof (EFI_IP4_ROUTE_TABLE
) * NicConfigRequest
->Ip4Info
.RouteTableSize
;
678 NicConfig
= AllocateZeroPool (BufferSize
);
679 if (NicConfig
== NULL
) {
680 Status
= EFI_OUT_OF_RESOURCES
;
683 CopyMem (NicConfig
, NicConfigRequest
, BufferSize
);
686 // If succeeds to get NIC configuration, fix up routetable pointer.
688 NicConfig
->Ip4Info
.RouteTable
= (EFI_IP4_ROUTE_TABLE
*) (&NicConfig
->Ip4Info
+ 1);
689 NicInfo
->ConfigInfo
= NicConfig
;
692 NicInfo
->ConfigInfo
= NULL
;
695 FreePool (AccessResults
);
698 NicInfo
->ConfigInfo
= NULL
;
702 // Add the Nic's info to the global NicInfoList.
704 InsertTailList (&NicInfoList
, &NicInfo
->Link
);
706 FreePool (NicConfigRequest
);
707 FreePool (ConfigResp
);
708 FreePool (ConfigHdr
);
716 if (AccessResults
!= NULL
) {
717 FreePool (AccessResults
);
719 if (NicConfigRequest
!= NULL
) {
720 FreePool (NicConfigRequest
);
722 if (NicInfo
!= NULL
) {
725 if (ConfigResp
!= NULL
) {
726 FreePool (ConfigResp
);
728 if (ConfigHdr
!= NULL
) {
729 FreePool (ConfigHdr
);
738 Set the address for the specified nic by HII service.
740 @param[in] NicInfo A pointer to the NIC_INFO of the Nic to be configured.
741 @param[in] Config The command line arguments for the set operation.
743 @retval EFI_SUCCESS The address set operation is done.
747 IfconfigSetNicAddrByHii (
748 IN CONST NIC_INFO
*NicInfo
,
749 IN CONST NIC_IP4_CONFIG_INFO
*Config
753 SHELL_STATUS ShellStatus
;
754 NIC_IP4_CONFIG_INFO
*NicConfig
;
757 CHAR16
*AccessProgress
;
758 CHAR16
*AccessResults
;
762 EFI_HANDLE ChildHandle
;
764 AccessResults
= NULL
;
768 ShellStatus
= SHELL_SUCCESS
;
770 Status
= GetChildHandle (NicInfo
->Handle
, &ChildHandle
);
771 if (EFI_ERROR (Status
)) {
773 // If failed to get Child handle, try NIC controller handle for back-compatibility
775 ChildHandle
= NicInfo
->Handle
;
778 // Construct config request string header
780 ConfigHdr
= ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid
, EFI_NIC_IP4_CONFIG_VARIABLE
, ChildHandle
);
781 if (ConfigHdr
!= NULL
) {
782 Length
= StrLen (ConfigHdr
);
784 ShellStatus
= SHELL_OUT_OF_RESOURCES
;
787 ConfigResp
= AllocateZeroPool ((Length
+ NIC_ITEM_CONFIG_SIZE
* 2 + 100) * sizeof (CHAR16
));
788 if (ConfigResp
== NULL
) {
789 ShellStatus
= SHELL_OUT_OF_RESOURCES
;
792 if (ConfigHdr
!= NULL
) {
793 StrCpy (ConfigResp
, ConfigHdr
);
796 NicConfig
= AllocateZeroPool (NIC_ITEM_CONFIG_SIZE
);
797 if (NicConfig
== NULL
) {
798 ShellStatus
= SHELL_OUT_OF_RESOURCES
;
802 if (Config
!= NULL
) {
803 CopyMem (NicConfig
, Config
, sizeof (NIC_IP4_CONFIG_INFO
) + sizeof (EFI_IP4_ROUTE_TABLE
) * Config
->Ip4Info
.RouteTableSize
);
807 // Append OFFSET/WIDTH pair
809 String
= ConfigResp
+ Length
;
811 AppendOffsetWidthValue (String
, Offset
, NIC_ITEM_CONFIG_SIZE
, NULL
);
814 // Call HII helper function to generate configuration string
816 Status
= mHiiConfigRouting
->BlockToConfig (
820 NIC_ITEM_CONFIG_SIZE
,
824 if (EFI_ERROR (Status
)) {
825 ShellStatus
= SHELL_NOT_FOUND
;
830 // Set IP setting by HII servie
832 Status
= mHiiConfigRouting
->RouteConfig (
837 if (EFI_ERROR(Status
)) {
838 ShellStatus
= SHELL_ACCESS_DENIED
;
842 SHELL_FREE_NON_NULL(AccessResults
);
843 SHELL_FREE_NON_NULL(NicConfig
);
844 SHELL_FREE_NON_NULL(ConfigResp
);
845 SHELL_FREE_NON_NULL(ConfigHdr
);
851 The callback function for the Arp address resolved event.
853 @param[in] Event The event this function is registered to.
854 @param[in] Context The context registered to the event.
858 IfconfigOnArpResolved (
863 ARP_REQUEST
*Request
;
866 Request
= (ARP_REQUEST
*) Context
;
867 ASSERT (Request
!= NULL
);
869 Request
->Duplicate
= FALSE
;
871 if (0 == CompareMem (&Request
->LocalMac
, &Request
->DestMac
, Request
->MacLen
)) {
876 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR
),
877 gShellNetwork1HiiHandle
,
878 L
"Already Configured",
879 (UINTN
)Request
->DestIp
.v4
.Addr
[0],
880 (UINTN
)Request
->DestIp
.v4
.Addr
[1],
881 (UINTN
)Request
->DestIp
.v4
.Addr
[2],
882 (UINTN
)Request
->DestIp
.v4
.Addr
[3]
888 for (Index
= 0; Index
< Request
->MacLen
; Index
++) {
889 if (Request
->DestMac
.Addr
[Index
] != 0) {
890 Request
->Duplicate
= TRUE
;
894 if (Request
->Duplicate
) {
899 STRING_TOKEN(STR_IFCONFIG_CONF_IP_ADDR
),
900 gShellNetwork1HiiHandle
,
901 (UINTN
)Request
->DestMac
.Addr
[0],
902 (UINTN
)Request
->DestMac
.Addr
[1],
903 (UINTN
)Request
->DestMac
.Addr
[2],
904 (UINTN
)Request
->DestMac
.Addr
[3],
905 (UINTN
)Request
->DestMac
.Addr
[4],
906 (UINTN
)Request
->DestMac
.Addr
[5]
915 Check whether the address to be configured conflicts with other hosts.
917 @param[in] NicInfo The pointer to the NIC_INFO of the Nic to be configured.
918 @param[in] IpAddr The IPv4 address to be configured to the Nic.
920 @return TRUE Some other host already uses the IpAddr.
921 @return FALSE The address is unused.
925 IfconfigIsIpDuplicate (
926 IN NIC_INFO
*NicInfo
,
930 EFI_ARP_PROTOCOL
*Arp
;
931 EFI_ARP_CONFIG_DATA ArpCfgData
;
932 EFI_HANDLE ArpHandle
;
938 ZeroMem (&Request
, sizeof (ARP_REQUEST
));
940 Status
= NetLibCreateServiceChild (
943 &gEfiArpServiceBindingProtocolGuid
,
947 if (EFI_ERROR (Status
)) {
951 Status
= gBS
->OpenProtocol (
953 &gEfiArpProtocolGuid
,
957 EFI_OPEN_PROTOCOL_GET_PROTOCOL
960 if (EFI_ERROR (Status
)) {
965 // Set up the Arp requests
967 EFI_IP4_TO_U32 (Request
.DestIp
.v4
) = IpAddr
;
968 EFI_IP4_TO_U32 (Request
.LocalIp
.v4
) = 0xffffffff;
969 Request
.LocalMac
= NicInfo
->NicAddress
.MacAddr
;
970 Request
.MacLen
= NicInfo
->NicAddress
.Len
;
972 Status
= gBS
->CreateEvent (
975 IfconfigOnArpResolved
,
980 if (EFI_ERROR (Status
)) {
984 ArpCfgData
.SwAddressType
= 0x0800;
985 ArpCfgData
.SwAddressLength
= 4;
986 ArpCfgData
.StationAddress
= &Request
.LocalIp
;
987 ArpCfgData
.EntryTimeOut
= 0;
988 ArpCfgData
.RetryCount
= 3;
989 ArpCfgData
.RetryTimeOut
= 0;
991 Status
= Arp
->Configure (Arp
, &ArpCfgData
);
993 if (EFI_ERROR (Status
)) {
997 Status
= Arp
->Request (
1004 if (EFI_ERROR (Status
) && (Status
!= EFI_NOT_READY
)) {
1008 while (!ArpResolved
) {
1013 if (Request
.OnResolved
!= NULL
) {
1014 gBS
->CloseEvent (Request
.OnResolved
);
1017 NetLibDestroyServiceChild (
1020 &gEfiArpServiceBindingProtocolGuid
,
1024 return Request
.Duplicate
;
1028 The callback function for the timer event used to get map.
1030 @param[in] Event The event this function is registered to.
1031 @param[in] Context The context registered to the event.
1045 Create an IP child, use it to start the auto configuration, then destory it.
1047 @param[in] NicInfo The pointer to the NIC_INFO of the Nic to be configured.
1049 @retval EFI_SUCCESS The configuration is done.
1054 IN NIC_INFO
*NicInfo
1057 EFI_IP4_PROTOCOL
*Ip4
;
1058 EFI_HANDLE Ip4Handle
;
1059 EFI_HANDLE TimerToGetMap
;
1060 EFI_IP4_CONFIG_DATA Ip4ConfigData
;
1061 EFI_IP4_MODE_DATA Ip4Mode
;
1065 // Get the Ip4ServiceBinding Protocol
1069 TimerToGetMap
= NULL
;
1071 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_START_SET_ADDR
), gShellNetwork1HiiHandle
);
1073 Status
= NetLibCreateServiceChild (
1076 &gEfiIp4ServiceBindingProtocolGuid
,
1080 if (EFI_ERROR (Status
)) {
1084 Status
= gBS
->OpenProtocol (
1086 &gEfiIp4ProtocolGuid
,
1090 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1093 if (EFI_ERROR (Status
)) {
1097 Ip4ConfigData
.DefaultProtocol
= EFI_IP_PROTO_ICMP
;
1098 Ip4ConfigData
.AcceptAnyProtocol
= FALSE
;
1099 Ip4ConfigData
.AcceptIcmpErrors
= FALSE
;
1100 Ip4ConfigData
.AcceptBroadcast
= FALSE
;
1101 Ip4ConfigData
.AcceptPromiscuous
= FALSE
;
1102 Ip4ConfigData
.UseDefaultAddress
= TRUE
;
1103 ZeroMem (&Ip4ConfigData
.StationAddress
, sizeof (EFI_IPv4_ADDRESS
));
1104 ZeroMem (&Ip4ConfigData
.SubnetMask
, sizeof (EFI_IPv4_ADDRESS
));
1105 Ip4ConfigData
.TypeOfService
= 0;
1106 Ip4ConfigData
.TimeToLive
= 1;
1107 Ip4ConfigData
.DoNotFragment
= FALSE
;
1108 Ip4ConfigData
.RawData
= FALSE
;
1109 Ip4ConfigData
.ReceiveTimeout
= 0;
1110 Ip4ConfigData
.TransmitTimeout
= 0;
1112 Status
= Ip4
->Configure (Ip4
, &Ip4ConfigData
);
1114 if (Status
== EFI_NO_MAPPING
) {
1116 Status
= gBS
->CreateEvent (
1117 EVT_NOTIFY_SIGNAL
| EVT_TIMER
,
1124 if (EFI_ERROR (Status
)) {
1128 Status
= gBS
->SetTimer (
1131 MultU64x32 (SecondsToNanoSeconds
, 5)
1134 if (EFI_ERROR (Status
)) {
1138 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_WAIT_SET_DONE
), gShellNetwork1HiiHandle
);
1143 if (!EFI_ERROR (Ip4
->GetModeData (Ip4
, &Ip4Mode
, NULL
, NULL
)) &&
1144 Ip4Mode
.IsConfigured
) {
1150 Status
= Ip4
->GetModeData (Ip4
, &Ip4Mode
, NULL
, NULL
);
1152 if ((Status
== EFI_SUCCESS
) && Ip4Mode
.IsConfigured
) {
1157 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR
),
1158 gShellNetwork1HiiHandle
,
1160 (UINTN
)Ip4Mode
.ConfigData
.StationAddress
.Addr
[0],
1161 (UINTN
)Ip4Mode
.ConfigData
.StationAddress
.Addr
[1],
1162 (UINTN
)Ip4Mode
.ConfigData
.StationAddress
.Addr
[2],
1163 (UINTN
)Ip4Mode
.ConfigData
.StationAddress
.Addr
[3]
1169 if (EFI_ERROR (Status
)) {
1170 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_GET_DEF_ADDR_FAIL
), gShellNetwork1HiiHandle
);
1173 if (TimerToGetMap
!= NULL
) {
1174 gBS
->SetTimer (TimerToGetMap
, TimerCancel
, 0);
1175 gBS
->CloseEvent (TimerToGetMap
);
1178 NetLibDestroyServiceChild (
1181 &gEfiIp4ServiceBindingProtocolGuid
,
1189 Set the address for the nic specified by the params.
1191 @param[in] Argc The count of the passed in Params.
1192 @param[in] Params The command line arguments for the set operation.
1194 @retval EFI_SUCCESS The address set operation is done.
1195 @return Some error occurs.
1199 IfconfigSetNicAddr (
1201 IN CONST CHAR16
*Params
1204 NIC_IP4_CONFIG_INFO
*Config
;
1205 NIC_IP4_CONFIG_INFO
*OldConfig
;
1207 EFI_IP_ADDRESS Mask
;
1208 EFI_IP_ADDRESS Gateway
;
1211 SHELL_STATUS ShellStatus
;
1212 CONST CHAR16
*Walker
;
1214 CONST CHAR16
*DhcpTemp
;
1215 CONST CHAR16
*StaticTemp
;
1216 CONST CHAR16
*PermTemp
;
1217 UINT32 NetworkBytes1
;
1218 UINT32 NetworkBytes2
;
1223 Temp
= StrnCatGrow(&Temp
, NULL
, Walker
, StrStr(Walker
, L
" ")-Walker
);
1224 Info
= IfconfigFindNicByName (Temp
);
1227 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_INTERFACE_NOT_FOUND
), gShellNetwork1HiiHandle
, Temp
);
1228 return SHELL_NOT_FOUND
;
1231 Walker
+= StrLen(Temp
) + 1;
1234 Temp
= StrnCatGrow(&Temp
, NULL
, Walker
, StrStr(Walker
, L
" ")==NULL
?0:StrStr(Walker
, L
" ")-Walker
);
1236 Config
= AllocateZeroPool (sizeof (NIC_IP4_CONFIG_INFO
) + 2 * sizeof (EFI_IP4_ROUTE_TABLE
));
1237 if (Config
== NULL
) {
1238 return SHELL_OUT_OF_RESOURCES
;
1241 Config
->Ip4Info
.RouteTable
= (EFI_IP4_ROUTE_TABLE
*) (Config
+ 1);
1243 OldConfig
= Info
->ConfigInfo
;
1245 ShellStatus
= SHELL_INVALID_PARAMETER
;
1247 DhcpTemp
= DhcpString
;
1248 StaticTemp
= StaticString
;
1250 if (StringNoCaseCompare(&Temp
, &DhcpTemp
) == 0) {
1252 // Validate the parameter for DHCP, two valid forms: eth0 DHCP and eth0 DHCP perment
1254 if ((Argc
!= 2) && (Argc
!= 3)) {
1255 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellNetwork1HiiHandle
, Temp
);
1256 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1261 Walker
+= StrLen(Temp
) + 1;
1264 Temp
= StrnCatGrow(&Temp
, NULL
, Walker
, 0);
1266 PermTemp
= PermanentString
;
1267 if (StringNoCaseCompare(&Temp
, &PermTemp
) != 0) {
1268 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_GEN_PROBLEM_OP2
), gShellNetwork1HiiHandle
, Temp
, PermanentString
, L
"Nothing");
1269 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1276 if ((OldConfig
!= NULL
) && (OldConfig
->Source
== IP4_CONFIG_SOURCE_DHCP
) &&
1277 (OldConfig
->Perment
== Permanent
)) {
1279 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_INTERFACE_CONFIGURED
), gShellNetwork1HiiHandle
, Info
->Name
);
1280 ShellStatus
= SHELL_ALREADY_STARTED
;
1284 Config
->Source
= IP4_CONFIG_SOURCE_DHCP
;
1285 } else if (StringNoCaseCompare(&Temp
, &StaticTemp
) == 0) {
1287 // validate the parameter, two forms: eth0 static IP NETMASK GATEWAY and
1288 // eth0 static IP NETMASK GATEWAY perment
1290 if ((Argc
!= 5) && (Argc
!= 6)) {
1291 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellNetwork1HiiHandle
, Temp
);
1292 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1296 Walker
+= StrLen(Temp
) + 1;
1299 Temp
= StrnCatGrow(&Temp
, NULL
, Walker
, StrStr(Walker
, L
" ")-Walker
);
1301 if (EFI_ERROR (NetLibStrToIp4 (Temp
, &Ip
.v4
))) {
1302 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR
), gShellNetwork1HiiHandle
, Temp
);
1303 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1307 Walker
+= StrLen(Temp
) + 1;
1310 Temp
= StrnCatGrow(&Temp
, NULL
, Walker
, StrStr(Walker
, L
" ")-Walker
);
1311 if (EFI_ERROR (NetLibStrToIp4 (Temp
, &Mask
.v4
))) {
1312 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR
), gShellNetwork1HiiHandle
, Temp
);
1313 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1317 Walker
+= StrLen(Temp
) + 1;
1321 Temp
= StrnCatGrow(&Temp
, NULL
, Walker
, StrStr(Walker
, L
" ")-Walker
);
1323 Temp
= StrnCatGrow(&Temp
, NULL
, Walker
, 0);
1325 if (EFI_ERROR (NetLibStrToIp4 (Temp
, &Gateway
.v4
))) {
1326 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR
), gShellNetwork1HiiHandle
, Temp
);
1327 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1332 Walker
+= StrLen(Temp
) + 1;
1335 Temp
= StrnCatGrow(&Temp
, NULL
, Walker
, 0);
1337 PermTemp
= PermanentString
;
1338 if (StringNoCaseCompare(&Temp
, &PermTemp
) != 0) {
1339 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_GEN_PROBLEM_OP2
), gShellNetwork1HiiHandle
, Temp
, PermanentString
, L
"Nothing");
1340 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1347 NetworkBytes1
= NTOHL (Ip
.Addr
[0]);
1348 NetworkBytes2
= NTOHL (Mask
.Addr
[0]);
1349 if ((Ip
.Addr
[0] == 0) || (Mask
.Addr
[0] == 0) ||
1350 !NetIp4IsUnicast (NetworkBytes1
, NetworkBytes2
)) {
1352 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_INVALID_ADDR_PAIR
), gShellNetwork1HiiHandle
);
1353 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1357 NetworkBytes1
= NTOHL (Gateway
.Addr
[0]);
1358 if (!IP4_NET_EQUAL (Ip
.Addr
[0], Gateway
.Addr
[0], Mask
.Addr
[0]) ||
1359 !NetIp4IsUnicast (NetworkBytes1
, NetworkBytes2
)) {
1361 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_INVALID_GATEWAY
), gShellNetwork1HiiHandle
);
1362 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1367 // Set the configuration up, two route table entries are added:
1368 // one for the direct connected network, and another for the
1369 // default gateway. Remember, some structure members are cleared
1370 // by AllocateZeroPool
1372 Config
->Source
= IP4_CONFIG_SOURCE_STATIC
;
1373 Config
->Ip4Info
.RouteTableSize
= 2;
1375 CopyMem (&Config
->Ip4Info
.StationAddress
, &Ip
.v4
, sizeof (EFI_IPv4_ADDRESS
));
1376 CopyMem (&Config
->Ip4Info
.SubnetMask
, &Mask
.v4
, sizeof (EFI_IPv4_ADDRESS
));
1378 Ip
.Addr
[0] = Ip
.Addr
[0] & Mask
.Addr
[0];
1380 CopyMem (&Config
->Ip4Info
.RouteTable
[0].SubnetAddress
, &Ip
.v4
, sizeof (EFI_IPv4_ADDRESS
));
1381 CopyMem (&Config
->Ip4Info
.RouteTable
[0].SubnetMask
, &Mask
.v4
, sizeof (EFI_IPv4_ADDRESS
));
1382 CopyMem (&Config
->Ip4Info
.RouteTable
[1].GatewayAddress
, &Gateway
.v4
, sizeof (EFI_IPv4_ADDRESS
));
1384 // neither static or DHCP. error.
1385 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_GEN_TOO_FEW
), gShellNetwork1HiiHandle
);
1386 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1390 CopyMem (&Config
->NicAddr
, &Info
->NicAddress
, sizeof (NIC_ADDR
));
1391 Config
->Perment
= Permanent
;
1394 // Use HII service to set NIC address
1396 ShellStatus
= IfconfigSetNicAddrByHii (Info
, Config
);
1397 if (ShellStatus
!= SHELL_SUCCESS
) {
1398 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_SET_FAIL
), gShellNetwork1HiiHandle
, ShellStatus
^MAX_BIT
);
1402 Status
= IfconfigStartIp4 (Info
);
1403 if (EFI_ERROR(Status
)) {
1404 ShellStatus
= SHELL_ACCESS_DENIED
;
1407 if (ShellStatus
!= SHELL_SUCCESS
) {
1408 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_IP_CHILD_FAIL
), gShellNetwork1HiiHandle
, ShellStatus
^MAX_BIT
);
1412 SHELL_FREE_NON_NULL(Config
);
1418 Show the address information for the nic specified.
1420 @param[in] Name A pointer to the string containg the nic's name, if NULL,
1421 all nics' information is shown.
1425 IfconfigShowNicInfo (
1426 IN CONST CHAR16
*Name
1430 LIST_ENTRY
*NextEntry
;
1433 EFI_IP4_IPCONFIG_DATA
*Ip4Config
;
1434 EFI_IPv4_ADDRESS Gateway
;
1435 CONST CHAR16
*TempString
;
1437 NET_LIST_FOR_EACH_SAFE (Entry
, NextEntry
, &NicInfoList
) {
1438 NicInfo
= BASE_CR (Entry
, NIC_INFO
, Link
);
1440 TempString
= (CHAR16
*)NicInfo
->Name
;
1441 if ((Name
!= NULL
) && (StringNoCaseCompare (&Name
, &TempString
) != 0)) {
1445 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_NIC_NAME
), gShellNetwork1HiiHandle
, NicInfo
->Name
);
1451 STRING_TOKEN(STR_IFCONFIG_SHOW_MAC_ADDR
),
1452 gShellNetwork1HiiHandle
,
1453 (UINTN
)NicInfo
->NicAddress
.MacAddr
.Addr
[0],
1454 (UINTN
)NicInfo
->NicAddress
.MacAddr
.Addr
[1],
1455 (UINTN
)NicInfo
->NicAddress
.MacAddr
.Addr
[2],
1456 (UINTN
)NicInfo
->NicAddress
.MacAddr
.Addr
[3],
1457 (UINTN
)NicInfo
->NicAddress
.MacAddr
.Addr
[4],
1458 (UINTN
)NicInfo
->NicAddress
.MacAddr
.Addr
[5]
1461 Print (L
" Media State: %s\n", NicInfo
->MediaPresent
? L
"Media present" : L
"Media disconnected");
1463 if (NicInfo
->ConfigInfo
== NULL
) {
1464 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_NIC_NOT_CONFIGURED
), gShellNetwork1HiiHandle
);
1468 if (NicInfo
->ConfigInfo
->Source
== IP4_CONFIG_SOURCE_DHCP
) {
1469 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE
), gShellNetwork1HiiHandle
, L
"DHCP");
1470 } else if (NicInfo
->ConfigInfo
->Source
== IP4_CONFIG_SOURCE_STATIC
) {
1471 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE
), gShellNetwork1HiiHandle
, L
"STATIC");
1473 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE
), gShellNetwork1HiiHandle
, L
"Unknown");
1476 ShellPrintHiiEx(-1, -1, NULL
,
1477 STRING_TOKEN (STR_IFCONFIG_PERMENT_STATUS
),
1478 gShellNetwork1HiiHandle
,
1479 (NicInfo
->ConfigInfo
->Perment
? L
"TRUE":L
"FALSE")
1482 Ip4Config
= &NicInfo
->ConfigInfo
->Ip4Info
;
1488 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR
),
1489 gShellNetwork1HiiHandle
,
1491 (UINTN
)Ip4Config
->StationAddress
.Addr
[0],
1492 (UINTN
)Ip4Config
->StationAddress
.Addr
[1],
1493 (UINTN
)Ip4Config
->StationAddress
.Addr
[2],
1494 (UINTN
)Ip4Config
->StationAddress
.Addr
[3]
1500 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR
),
1501 gShellNetwork1HiiHandle
,
1503 (UINTN
)Ip4Config
->SubnetMask
.Addr
[0],
1504 (UINTN
)Ip4Config
->SubnetMask
.Addr
[1],
1505 (UINTN
)Ip4Config
->SubnetMask
.Addr
[2],
1506 (UINTN
)Ip4Config
->SubnetMask
.Addr
[3]
1509 ZeroMem (&Gateway
, sizeof (EFI_IPv4_ADDRESS
));
1511 for (Index
= 0; Index
< Ip4Config
->RouteTableSize
; Index
++) {
1512 if ((CompareMem (&Ip4Config
->RouteTable
[Index
].SubnetAddress
, &mZeroIp4Addr
, sizeof (EFI_IPv4_ADDRESS
)) == 0) &&
1513 (CompareMem (&Ip4Config
->RouteTable
[Index
].SubnetMask
, &mZeroIp4Addr
, sizeof (EFI_IPv4_ADDRESS
)) == 0) ){
1514 CopyMem (&Gateway
, &Ip4Config
->RouteTable
[Index
].GatewayAddress
, sizeof (EFI_IPv4_ADDRESS
));
1522 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR
),
1523 gShellNetwork1HiiHandle
,
1525 (UINTN
)Gateway
.Addr
[0],
1526 (UINTN
)Gateway
.Addr
[1],
1527 (UINTN
)Gateway
.Addr
[2],
1528 (UINTN
)Gateway
.Addr
[3]
1531 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE
), gShellNetwork1HiiHandle
, Ip4Config
->RouteTableSize
);
1533 for (Index
= 0; Index
< Ip4Config
->RouteTableSize
; Index
++) {
1534 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX
), gShellNetwork1HiiHandle
, Index
);
1540 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR
),
1541 gShellNetwork1HiiHandle
,
1543 (UINTN
)Ip4Config
->RouteTable
[Index
].SubnetAddress
.Addr
[0],
1544 (UINTN
)Ip4Config
->RouteTable
[Index
].SubnetAddress
.Addr
[1],
1545 (UINTN
)Ip4Config
->RouteTable
[Index
].SubnetAddress
.Addr
[2],
1546 (UINTN
)Ip4Config
->RouteTable
[Index
].SubnetAddress
.Addr
[3]
1553 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR
),
1554 gShellNetwork1HiiHandle
,
1556 (UINTN
)Ip4Config
->RouteTable
[Index
].SubnetMask
.Addr
[0],
1557 (UINTN
)Ip4Config
->RouteTable
[Index
].SubnetMask
.Addr
[1],
1558 (UINTN
)Ip4Config
->RouteTable
[Index
].SubnetMask
.Addr
[2],
1559 (UINTN
)Ip4Config
->RouteTable
[Index
].SubnetMask
.Addr
[3]
1566 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR
),
1567 gShellNetwork1HiiHandle
,
1569 (UINTN
)Ip4Config
->RouteTable
[Index
].GatewayAddress
.Addr
[0],
1570 (UINTN
)Ip4Config
->RouteTable
[Index
].GatewayAddress
.Addr
[1],
1571 (UINTN
)Ip4Config
->RouteTable
[Index
].GatewayAddress
.Addr
[2],
1572 (UINTN
)Ip4Config
->RouteTable
[Index
].GatewayAddress
.Addr
[3]
1581 Clear address configuration for the nic specified.
1583 @param[in] Name A pointer to the string containg the nic's name,
1584 if NULL, all nics address configurations are cleared.
1586 @retval EFI_SUCCESS The address configuration is cleared.
1587 @return Some error occurs.
1591 IfconfigClearNicAddr (
1592 IN CONST CHAR16
*Name
1596 LIST_ENTRY
*NextEntry
;
1600 NET_LIST_FOR_EACH_SAFE (Entry
, NextEntry
, &NicInfoList
) {
1601 Info
= BASE_CR (Entry
, NIC_INFO
, Link
);
1603 if ((Name
!= NULL
) && (StrCmp (Name
, Info
->Name
) != 0)) {
1607 // if (Info->NicIp4Config == NULL) {
1608 Status
= IfconfigSetNicAddrByHii (Info
, NULL
);
1610 // Status = Info->NicIp4Config->SetInfo (Info->NicIp4Config, NULL, TRUE);
1613 if (EFI_ERROR (Status
)) {
1623 Function for 'ifconfig' command.
1625 @param[in] ImageHandle Handle to the Image (NULL if Internal).
1626 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
1630 ShellCommandRunIfconfig (
1631 IN EFI_HANDLE ImageHandle
,
1632 IN EFI_SYSTEM_TABLE
*SystemTable
1636 LIST_ENTRY
*Package
;
1637 CHAR16
*ProblemParam
;
1638 SHELL_STATUS ShellStatus
;
1639 BOOLEAN ListOperation
;
1640 BOOLEAN ClearOperation
;
1641 BOOLEAN SetOperation
;
1646 InitializeListHead (&NicInfoList
);
1647 Status
= EFI_INVALID_PARAMETER
;
1648 ShellStatus
= SHELL_SUCCESS
;
1651 // initialize the shell lib (we must be in non-auto-init...)
1653 Status
= ShellInitialize();
1654 ASSERT_EFI_ERROR(Status
);
1657 // parse the command line
1659 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
1660 if (EFI_ERROR(Status
)) {
1661 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
1662 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellNetwork1HiiHandle
, ProblemParam
);
1663 FreePool(ProblemParam
);
1664 ShellStatus
= SHELL_INVALID_PARAMETER
;
1672 ClearOperation
= ShellCommandLineGetFlag(Package
, L
"-c");
1673 ListOperation
= ShellCommandLineGetFlag(Package
, L
"-l");
1674 SetOperation
= ShellCommandLineGetFlag(Package
, L
"-s");
1676 if ((ClearOperation
&& ListOperation
)
1677 ||(SetOperation
&& ListOperation
)
1678 ||(ClearOperation
&& SetOperation
)
1680 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CON
), gShellNetwork1HiiHandle
);
1681 ShellStatus
= SHELL_INVALID_PARAMETER
;
1683 } else if (!ClearOperation
&& !ListOperation
&& !SetOperation
) {
1684 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellNetwork1HiiHandle
);
1685 ShellStatus
= SHELL_INVALID_PARAMETER
;
1690 Status
= IfconfigGetAllNicInfoByHii ();
1691 if (EFI_ERROR (Status
)) {
1692 if (mIp4ConfigExist
) {
1693 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_GET_NIC_FAIL
), gShellNetwork1HiiHandle
, Status
);
1695 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROTOCOL_NF
), gShellNetwork1HiiHandle
, L
"gEfiIp4ConfigProtocolGuid", &gEfiIp4ConfigProtocolGuid
);
1698 return SHELL_NOT_FOUND
;
1701 if (ListOperation
) {
1702 Item
= ShellCommandLineGetValue (Package
, L
"-l");
1704 if (Item
!= NULL
&& CountSubItems(Item
) > 1) {
1705 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellNetwork1HiiHandle
, L
"-l");
1706 ShellStatus
= SHELL_INVALID_PARAMETER
;
1711 // Show the configuration.
1713 IfconfigShowNicInfo (Item
);
1714 } else if (SetOperation
) {
1715 Item
= ShellCommandLineGetValue (Package
, L
"-s");
1718 // The correct command line arguments for setting address are:
1719 // IfConfig -s eth0 DHCP [perment]
1720 // IfConfig -s eth0 static ip netmask gateway [perment]
1722 if (Item
== NULL
|| (CountSubItems(Item
) < 2) || (CountSubItems(Item
) > 6) || (CountSubItems(Item
) == 4)) {
1723 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellNetwork1HiiHandle
, L
"-s");
1724 ShellStatus
= SHELL_INVALID_PARAMETER
;
1728 ShellStatus
= IfconfigSetNicAddr (CountSubItems(Item
), Item
);
1729 } else if (ClearOperation
) {
1730 Item
= ShellCommandLineGetValue (Package
, L
"-c");
1732 if (Item
!= NULL
&& CountSubItems(Item
) > 1) {
1733 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellNetwork1HiiHandle
, L
"-c");
1734 ShellStatus
= SHELL_INVALID_PARAMETER
;
1738 IfconfigClearNicAddr (Item
);
1744 while (!IsListEmpty (&NicInfoList
)) {
1745 Entry
= NicInfoList
.ForwardLink
;
1746 Info
= BASE_CR (Entry
, NIC_INFO
, Link
);
1748 RemoveEntryList (Entry
);
1750 if (Info
->ConfigInfo
!= NULL
) {
1751 FreePool (Info
->ConfigInfo
);
1757 if (Package
!= NULL
) {
1758 ShellCommandLineFreeVarList(Package
);
1761 return (ShellStatus
);