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 SEC_TO_NS
= 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[in] 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 Length
= StrLen (ConfigHdr
);
610 ConfigResp
= AllocateZeroPool ((Length
+ NIC_ITEM_CONFIG_SIZE
* 2 + 100) * sizeof (CHAR16
));
611 if (ConfigResp
== NULL
) {
612 Status
= EFI_OUT_OF_RESOURCES
;
615 StrCpy (ConfigResp
, ConfigHdr
);
618 // Append OFFSET/WIDTH pair
620 String
= ConfigResp
+ Length
;
622 AppendOffsetWidthValue (String
, Offset
, NIC_ITEM_CONFIG_SIZE
, NULL
);
624 NicInfo
= AllocateZeroPool (sizeof (NIC_INFO
));
625 if (NicInfo
== NULL
) {
626 Status
= EFI_OUT_OF_RESOURCES
;
629 NicInfo
->Handle
= Handles
[Index
];
632 // Get network physical devcie MAC information
634 IfConfigGetNicMacInfo (Handles
[Index
], &NicInfo
->NicAddress
);
635 if (NicInfo
->NicAddress
.Type
== NET_IFTYPE_ETHERNET
) {
636 UnicodeSPrint (NicInfo
->Name
, IP4_NIC_NAME_LENGTH
, L
"eth%d", Index
);
638 UnicodeSPrint (NicInfo
->Name
, IP4_NIC_NAME_LENGTH
, L
"unk%d", Index
);
644 IfConfigGetNicMediaStatus (Handles
[Index
], &NicInfo
->MediaPresentSupported
, &NicInfo
->MediaPresent
);
646 NicConfigRequest
= AllocateZeroPool (NIC_ITEM_CONFIG_SIZE
);
647 if (NicConfigRequest
== NULL
) {
648 Status
= EFI_OUT_OF_RESOURCES
;
653 // Get network parameters by HII service
655 Status
= mHiiConfigRouting
->ExtractConfig (
661 if (!EFI_ERROR (Status
)) {
662 BufferSize
= NIC_ITEM_CONFIG_SIZE
;
663 Status
= mHiiConfigRouting
->ConfigToBlock (
666 (UINT8
*) NicConfigRequest
,
670 if (!EFI_ERROR (Status
)) {
671 BufferSize
= sizeof (NIC_IP4_CONFIG_INFO
) + sizeof (EFI_IP4_ROUTE_TABLE
) * NicConfigRequest
->Ip4Info
.RouteTableSize
;
672 NicConfig
= AllocateZeroPool (BufferSize
);
673 if (NicConfig
== NULL
) {
674 Status
= EFI_OUT_OF_RESOURCES
;
677 CopyMem (NicConfig
, NicConfigRequest
, BufferSize
);
680 // If succeeds to get NIC configuration, fix up routetable pointer.
682 NicConfig
->Ip4Info
.RouteTable
= (EFI_IP4_ROUTE_TABLE
*) (&NicConfig
->Ip4Info
+ 1);
683 NicInfo
->ConfigInfo
= NicConfig
;
686 NicInfo
->ConfigInfo
= NULL
;
689 FreePool (AccessResults
);
692 NicInfo
->ConfigInfo
= NULL
;
696 // Add the Nic's info to the global NicInfoList.
698 InsertTailList (&NicInfoList
, &NicInfo
->Link
);
700 FreePool (NicConfigRequest
);
701 FreePool (ConfigResp
);
702 FreePool (ConfigHdr
);
710 if (AccessResults
!= NULL
) {
711 FreePool (AccessResults
);
713 if (NicConfigRequest
!= NULL
) {
714 FreePool (NicConfigRequest
);
716 if (NicInfo
!= NULL
) {
719 if (ConfigResp
!= NULL
) {
720 FreePool (ConfigResp
);
722 if (ConfigHdr
!= NULL
) {
723 FreePool (ConfigHdr
);
732 Set the address for the specified nic by HII service.
734 @param[in] NicInfo A pointer to the NIC_INFO of the Nic to be configured.
735 @param[in] Config The command line arguments for the set operation.
737 @retval EFI_SUCCESS The address set operation is done.
741 IfconfigSetNicAddrByHii (
742 IN CONST NIC_INFO
*NicInfo
,
743 IN CONST NIC_IP4_CONFIG_INFO
*Config
747 SHELL_STATUS ShellStatus
;
748 NIC_IP4_CONFIG_INFO
*NicConfig
;
751 CHAR16
*AccessProgress
;
752 CHAR16
*AccessResults
;
756 EFI_HANDLE ChildHandle
;
758 AccessResults
= NULL
;
762 ShellStatus
= SHELL_SUCCESS
;
764 Status
= GetChildHandle (NicInfo
->Handle
, &ChildHandle
);
765 if (EFI_ERROR (Status
)) {
767 // If failed to get Child handle, try NIC controller handle for back-compatibility
769 ChildHandle
= NicInfo
->Handle
;
772 // Construct config request string header
774 ConfigHdr
= ConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid
, EFI_NIC_IP4_CONFIG_VARIABLE
, ChildHandle
);
776 Length
= StrLen (ConfigHdr
);
777 ConfigResp
= AllocateZeroPool ((Length
+ NIC_ITEM_CONFIG_SIZE
* 2 + 100) * sizeof (CHAR16
));
778 StrCpy (ConfigResp
, ConfigHdr
);
780 NicConfig
= AllocateZeroPool (NIC_ITEM_CONFIG_SIZE
);
781 if (NicConfig
== NULL
) {
782 ShellStatus
= SHELL_OUT_OF_RESOURCES
;
786 if (Config
!= NULL
) {
787 CopyMem (NicConfig
, Config
, sizeof (NIC_IP4_CONFIG_INFO
) + sizeof (EFI_IP4_ROUTE_TABLE
) * Config
->Ip4Info
.RouteTableSize
);
791 // Append OFFSET/WIDTH pair
793 String
= ConfigResp
+ Length
;
795 AppendOffsetWidthValue (String
, Offset
, NIC_ITEM_CONFIG_SIZE
, NULL
);
798 // Call HII helper function to generate configuration string
800 Status
= mHiiConfigRouting
->BlockToConfig (
804 NIC_ITEM_CONFIG_SIZE
,
808 if (EFI_ERROR (Status
)) {
809 ShellStatus
= SHELL_NOT_FOUND
;
814 // Set IP setting by HII servie
816 Status
= mHiiConfigRouting
->RouteConfig (
821 if (EFI_ERROR(Status
)) {
822 ShellStatus
= SHELL_ACCESS_DENIED
;
826 SHELL_FREE_NON_NULL(AccessResults
);
827 SHELL_FREE_NON_NULL(NicConfig
);
828 SHELL_FREE_NON_NULL(ConfigResp
);
829 SHELL_FREE_NON_NULL(ConfigHdr
);
835 The callback function for the Arp address resolved event.
837 @param[in] Event The event this function is registered to.
838 @param[in] Context The context registered to the event.
842 IfconfigOnArpResolved (
847 ARP_REQUEST
*Request
;
850 Request
= (ARP_REQUEST
*) Context
;
851 ASSERT (Request
!= NULL
);
853 Request
->Duplicate
= FALSE
;
855 if (0 == CompareMem (&Request
->LocalMac
, &Request
->DestMac
, Request
->MacLen
)) {
860 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR
),
861 gShellNetwork1HiiHandle
,
862 L
"Already Configured",
863 (UINTN
)Request
->DestIp
.v4
.Addr
[0],
864 (UINTN
)Request
->DestIp
.v4
.Addr
[1],
865 (UINTN
)Request
->DestIp
.v4
.Addr
[2],
866 (UINTN
)Request
->DestIp
.v4
.Addr
[3]
872 for (Index
= 0; Index
< Request
->MacLen
; Index
++) {
873 if (Request
->DestMac
.Addr
[Index
] != 0) {
874 Request
->Duplicate
= TRUE
;
878 if (Request
->Duplicate
) {
883 STRING_TOKEN(STR_IFCONFIG_CONF_IP_ADDR
),
884 gShellNetwork1HiiHandle
,
885 (UINTN
)Request
->DestMac
.Addr
[0],
886 (UINTN
)Request
->DestMac
.Addr
[1],
887 (UINTN
)Request
->DestMac
.Addr
[2],
888 (UINTN
)Request
->DestMac
.Addr
[3],
889 (UINTN
)Request
->DestMac
.Addr
[4],
890 (UINTN
)Request
->DestMac
.Addr
[5]
899 Check whether the address to be configured conflicts with other hosts.
901 @param[in] NicInfo The pointer to the NIC_INFO of the Nic to be configured.
902 @param[in] IpAddr The IPv4 address to be configured to the Nic.
904 @return TRUE Some other host already uses the IpAddr.
905 @return FALSE The address is unused.
909 IfconfigIsIpDuplicate (
910 IN NIC_INFO
*NicInfo
,
914 EFI_ARP_PROTOCOL
*Arp
;
915 EFI_ARP_CONFIG_DATA ArpCfgData
;
916 EFI_HANDLE ArpHandle
;
922 ZeroMem (&Request
, sizeof (ARP_REQUEST
));
924 Status
= NetLibCreateServiceChild (
927 &gEfiArpServiceBindingProtocolGuid
,
931 if (EFI_ERROR (Status
)) {
935 Status
= gBS
->OpenProtocol (
937 &gEfiArpProtocolGuid
,
941 EFI_OPEN_PROTOCOL_GET_PROTOCOL
944 if (EFI_ERROR (Status
)) {
949 // Set up the Arp requests
951 EFI_IP4_TO_U32 (Request
.DestIp
.v4
) = IpAddr
;
952 EFI_IP4_TO_U32 (Request
.LocalIp
.v4
) = 0xffffffff;
953 Request
.LocalMac
= NicInfo
->NicAddress
.MacAddr
;
954 Request
.MacLen
= NicInfo
->NicAddress
.Len
;
956 Status
= gBS
->CreateEvent (
959 IfconfigOnArpResolved
,
964 if (EFI_ERROR (Status
)) {
968 ArpCfgData
.SwAddressType
= 0x0800;
969 ArpCfgData
.SwAddressLength
= 4;
970 ArpCfgData
.StationAddress
= &Request
.LocalIp
;
971 ArpCfgData
.EntryTimeOut
= 0;
972 ArpCfgData
.RetryCount
= 3;
973 ArpCfgData
.RetryTimeOut
= 0;
975 Status
= Arp
->Configure (Arp
, &ArpCfgData
);
977 if (EFI_ERROR (Status
)) {
981 Status
= Arp
->Request (
988 if (EFI_ERROR (Status
) && (Status
!= EFI_NOT_READY
)) {
992 while (!ArpResolved
) {
997 if (Request
.OnResolved
!= NULL
) {
998 gBS
->CloseEvent (Request
.OnResolved
);
1001 NetLibDestroyServiceChild (
1004 &gEfiArpServiceBindingProtocolGuid
,
1008 return Request
.Duplicate
;
1012 The callback function for the timer event used to get map.
1014 @param[in] Event The event this function is registered to.
1015 @param[in] Context The context registered to the event.
1029 Create an IP child, use it to start the auto configuration, then destory it.
1031 @param[in] NicInfo The pointer to the NIC_INFO of the Nic to be configured.
1033 @retval EFI_SUCCESS The configuration is done.
1038 IN NIC_INFO
*NicInfo
1041 EFI_IP4_PROTOCOL
*Ip4
;
1042 EFI_HANDLE Ip4Handle
;
1043 EFI_HANDLE TimerToGetMap
;
1044 EFI_IP4_CONFIG_DATA Ip4ConfigData
;
1045 EFI_IP4_MODE_DATA Ip4Mode
;
1049 // Get the Ip4ServiceBinding Protocol
1053 TimerToGetMap
= NULL
;
1055 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_START_SET_ADDR
), gShellNetwork1HiiHandle
);
1057 Status
= NetLibCreateServiceChild (
1060 &gEfiIp4ServiceBindingProtocolGuid
,
1064 if (EFI_ERROR (Status
)) {
1068 Status
= gBS
->OpenProtocol (
1070 &gEfiIp4ProtocolGuid
,
1074 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1077 if (EFI_ERROR (Status
)) {
1081 Ip4ConfigData
.DefaultProtocol
= EFI_IP_PROTO_ICMP
;
1082 Ip4ConfigData
.AcceptAnyProtocol
= FALSE
;
1083 Ip4ConfigData
.AcceptIcmpErrors
= FALSE
;
1084 Ip4ConfigData
.AcceptBroadcast
= FALSE
;
1085 Ip4ConfigData
.AcceptPromiscuous
= FALSE
;
1086 Ip4ConfigData
.UseDefaultAddress
= TRUE
;
1087 ZeroMem (&Ip4ConfigData
.StationAddress
, sizeof (EFI_IPv4_ADDRESS
));
1088 ZeroMem (&Ip4ConfigData
.SubnetMask
, sizeof (EFI_IPv4_ADDRESS
));
1089 Ip4ConfigData
.TypeOfService
= 0;
1090 Ip4ConfigData
.TimeToLive
= 1;
1091 Ip4ConfigData
.DoNotFragment
= FALSE
;
1092 Ip4ConfigData
.RawData
= FALSE
;
1093 Ip4ConfigData
.ReceiveTimeout
= 0;
1094 Ip4ConfigData
.TransmitTimeout
= 0;
1096 Status
= Ip4
->Configure (Ip4
, &Ip4ConfigData
);
1098 if (Status
== EFI_NO_MAPPING
) {
1100 Status
= gBS
->CreateEvent (
1101 EVT_NOTIFY_SIGNAL
| EVT_TIMER
,
1108 if (EFI_ERROR (Status
)) {
1112 Status
= gBS
->SetTimer (
1115 MultU64x32 (SEC_TO_NS
, 5)
1118 if (EFI_ERROR (Status
)) {
1122 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_WAIT_SET_DONE
), gShellNetwork1HiiHandle
);
1127 if (!EFI_ERROR (Ip4
->GetModeData (Ip4
, &Ip4Mode
, NULL
, NULL
)) &&
1128 Ip4Mode
.IsConfigured
) {
1134 Status
= Ip4
->GetModeData (Ip4
, &Ip4Mode
, NULL
, NULL
);
1136 if ((Status
== EFI_SUCCESS
) && Ip4Mode
.IsConfigured
) {
1141 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR
),
1142 gShellNetwork1HiiHandle
,
1144 (UINTN
)Ip4Mode
.ConfigData
.StationAddress
.Addr
[0],
1145 (UINTN
)Ip4Mode
.ConfigData
.StationAddress
.Addr
[1],
1146 (UINTN
)Ip4Mode
.ConfigData
.StationAddress
.Addr
[2],
1147 (UINTN
)Ip4Mode
.ConfigData
.StationAddress
.Addr
[3]
1153 if (EFI_ERROR (Status
)) {
1154 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_GET_DEF_ADDR_FAIL
), gShellNetwork1HiiHandle
);
1157 if (TimerToGetMap
!= NULL
) {
1158 gBS
->SetTimer (TimerToGetMap
, TimerCancel
, 0);
1159 gBS
->CloseEvent (TimerToGetMap
);
1162 NetLibDestroyServiceChild (
1165 &gEfiIp4ServiceBindingProtocolGuid
,
1173 Set the address for the nic specified by the params.
1175 @param[in] Argc The count of the passed in Params.
1176 @param[in] Params The command line arguments for the set operation.
1178 @retval EFI_SUCCESS The address set operation is done.
1179 @return Some error occurs.
1183 IfconfigSetNicAddr (
1185 IN CONST CHAR16
*Params
1188 NIC_IP4_CONFIG_INFO
*Config
;
1189 NIC_IP4_CONFIG_INFO
*OldConfig
;
1191 EFI_IP_ADDRESS Mask
;
1192 EFI_IP_ADDRESS Gateway
;
1195 SHELL_STATUS ShellStatus
;
1196 CONST CHAR16
*Walker
;
1198 CONST CHAR16
*DhcpTemp
;
1199 CONST CHAR16
*StaticTemp
;
1200 CONST CHAR16
*PermTemp
;
1201 UINT32 NetworkBytes1
;
1202 UINT32 NetworkBytes2
;
1207 Temp
= StrnCatGrow(&Temp
, NULL
, Walker
, StrStr(Walker
, L
" ")-Walker
);
1208 Info
= IfconfigFindNicByName (Temp
);
1211 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_INTERFACE_NOT_FOUND
), gShellNetwork1HiiHandle
, Temp
);
1212 return SHELL_NOT_FOUND
;
1215 Walker
+= StrLen(Temp
) + 1;
1218 Temp
= StrnCatGrow(&Temp
, NULL
, Walker
, StrStr(Walker
, L
" ")==NULL
?0:StrStr(Walker
, L
" ")-Walker
);
1220 Config
= AllocateZeroPool (sizeof (NIC_IP4_CONFIG_INFO
) + 2 * sizeof (EFI_IP4_ROUTE_TABLE
));
1221 if (Config
== NULL
) {
1222 return SHELL_OUT_OF_RESOURCES
;
1225 Config
->Ip4Info
.RouteTable
= (EFI_IP4_ROUTE_TABLE
*) (Config
+ 1);
1227 OldConfig
= Info
->ConfigInfo
;
1229 ShellStatus
= SHELL_INVALID_PARAMETER
;
1231 DhcpTemp
= DhcpString
;
1232 StaticTemp
= StaticString
;
1234 if (StringNoCaseCompare(&Temp
, &DhcpTemp
) == 0) {
1236 // Validate the parameter for DHCP, two valid forms: eth0 DHCP and eth0 DHCP perment
1238 if ((Argc
!= 2) && (Argc
!= 3)) {
1239 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellNetwork1HiiHandle
, Temp
);
1240 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1245 Walker
+= StrLen(Temp
) + 1;
1248 Temp
= StrnCatGrow(&Temp
, NULL
, Walker
, 0);
1250 PermTemp
= PermanentString
;
1251 if (StringNoCaseCompare(&Temp
, &PermTemp
) != 0) {
1252 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_GEN_PROBLEM_OP2
), gShellNetwork1HiiHandle
, Temp
, PermanentString
, L
"Nothing");
1253 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1260 if ((OldConfig
!= NULL
) && (OldConfig
->Source
== IP4_CONFIG_SOURCE_DHCP
) &&
1261 (OldConfig
->Perment
== Permanent
)) {
1263 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_INTERFACE_CONFIGURED
), gShellNetwork1HiiHandle
, Info
->Name
);
1264 ShellStatus
= SHELL_ALREADY_STARTED
;
1268 Config
->Source
= IP4_CONFIG_SOURCE_DHCP
;
1269 } else if (StringNoCaseCompare(&Temp
, &StaticTemp
) == 0) {
1271 // validate the parameter, two forms: eth0 static IP NETMASK GATEWAY and
1272 // eth0 static IP NETMASK GATEWAY perment
1274 if ((Argc
!= 5) && (Argc
!= 6)) {
1275 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellNetwork1HiiHandle
, Temp
);
1276 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1280 Walker
+= StrLen(Temp
) + 1;
1283 Temp
= StrnCatGrow(&Temp
, NULL
, Walker
, StrStr(Walker
, L
" ")-Walker
);
1285 if (EFI_ERROR (NetLibStrToIp4 (Temp
, &Ip
.v4
))) {
1286 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR
), gShellNetwork1HiiHandle
, Temp
);
1287 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1291 Walker
+= StrLen(Temp
) + 1;
1294 Temp
= StrnCatGrow(&Temp
, NULL
, Walker
, StrStr(Walker
, L
" ")-Walker
);
1295 if (EFI_ERROR (NetLibStrToIp4 (Temp
, &Mask
.v4
))) {
1296 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR
), gShellNetwork1HiiHandle
, Temp
);
1297 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1301 Walker
+= StrLen(Temp
) + 1;
1305 Temp
= StrnCatGrow(&Temp
, NULL
, Walker
, StrStr(Walker
, L
" ")-Walker
);
1307 Temp
= StrnCatGrow(&Temp
, NULL
, Walker
, 0);
1309 if (EFI_ERROR (NetLibStrToIp4 (Temp
, &Gateway
.v4
))) {
1310 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_INVALID_IP_STR
), gShellNetwork1HiiHandle
, Temp
);
1311 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1316 Walker
+= StrLen(Temp
) + 1;
1319 Temp
= StrnCatGrow(&Temp
, NULL
, Walker
, 0);
1321 PermTemp
= PermanentString
;
1322 if (StringNoCaseCompare(&Temp
, &PermTemp
) != 0) {
1323 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_GEN_PROBLEM_OP2
), gShellNetwork1HiiHandle
, Temp
, PermanentString
, L
"Nothing");
1324 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1331 NetworkBytes1
= NTOHL (Ip
.Addr
[0]);
1332 NetworkBytes2
= NTOHL (Mask
.Addr
[0]);
1333 if ((Ip
.Addr
[0] == 0) || (Mask
.Addr
[0] == 0) ||
1334 !NetIp4IsUnicast (NetworkBytes1
, NetworkBytes2
)) {
1336 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_INVALID_ADDR_PAIR
), gShellNetwork1HiiHandle
);
1337 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1341 NetworkBytes1
= NTOHL (Gateway
.Addr
[0]);
1342 if (!IP4_NET_EQUAL (Ip
.Addr
[0], Gateway
.Addr
[0], Mask
.Addr
[0]) ||
1343 !NetIp4IsUnicast (NetworkBytes1
, NetworkBytes2
)) {
1345 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_INVALID_GATEWAY
), gShellNetwork1HiiHandle
);
1346 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1351 // Set the configuration up, two route table entries are added:
1352 // one for the direct connected network, and another for the
1353 // default gateway. Remember, some structure members are cleared
1354 // by AllocateZeroPool
1356 Config
->Source
= IP4_CONFIG_SOURCE_STATIC
;
1357 Config
->Ip4Info
.RouteTableSize
= 2;
1359 CopyMem (&Config
->Ip4Info
.StationAddress
, &Ip
.v4
, sizeof (EFI_IPv4_ADDRESS
));
1360 CopyMem (&Config
->Ip4Info
.SubnetMask
, &Mask
.v4
, sizeof (EFI_IPv4_ADDRESS
));
1362 Ip
.Addr
[0] = Ip
.Addr
[0] & Mask
.Addr
[0];
1364 CopyMem (&Config
->Ip4Info
.RouteTable
[0].SubnetAddress
, &Ip
.v4
, sizeof (EFI_IPv4_ADDRESS
));
1365 CopyMem (&Config
->Ip4Info
.RouteTable
[0].SubnetMask
, &Mask
.v4
, sizeof (EFI_IPv4_ADDRESS
));
1366 CopyMem (&Config
->Ip4Info
.RouteTable
[1].GatewayAddress
, &Gateway
.v4
, sizeof (EFI_IPv4_ADDRESS
));
1368 // neither static or DHCP. error.
1369 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_GEN_TOO_FEW
), gShellNetwork1HiiHandle
);
1370 ASSERT(ShellStatus
== SHELL_INVALID_PARAMETER
);
1374 CopyMem (&Config
->NicAddr
, &Info
->NicAddress
, sizeof (NIC_ADDR
));
1375 Config
->Perment
= Permanent
;
1378 // Use HII service to set NIC address
1380 ShellStatus
= IfconfigSetNicAddrByHii (Info
, Config
);
1381 if (ShellStatus
!= SHELL_SUCCESS
) {
1382 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_SET_FAIL
), gShellNetwork1HiiHandle
, ShellStatus
^MAX_BIT
);
1386 Status
= IfconfigStartIp4 (Info
);
1387 if (EFI_ERROR(Status
)) {
1388 ShellStatus
= SHELL_ACCESS_DENIED
;
1391 if (ShellStatus
!= SHELL_SUCCESS
) {
1392 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_IP_CHILD_FAIL
), gShellNetwork1HiiHandle
, ShellStatus
^MAX_BIT
);
1396 SHELL_FREE_NON_NULL(Config
);
1402 Show the address information for the nic specified.
1404 @param[in] Name A pointer to the string containg the nic's name, if NULL,
1405 all nics' information is shown.
1409 IfconfigShowNicInfo (
1410 IN CONST CHAR16
*Name
1414 LIST_ENTRY
*NextEntry
;
1417 EFI_IP4_IPCONFIG_DATA
*Ip4Config
;
1418 EFI_IPv4_ADDRESS Gateway
;
1419 CONST CHAR16
*TempString
;
1421 NET_LIST_FOR_EACH_SAFE (Entry
, NextEntry
, &NicInfoList
) {
1422 NicInfo
= BASE_CR (Entry
, NIC_INFO
, Link
);
1424 TempString
= (CHAR16
*)NicInfo
->Name
;
1425 if ((Name
!= NULL
) && (StringNoCaseCompare (&Name
, &TempString
) != 0)) {
1429 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_NIC_NAME
), gShellNetwork1HiiHandle
, NicInfo
->Name
);
1435 STRING_TOKEN(STR_IFCONFIG_SHOW_MAC_ADDR
),
1436 gShellNetwork1HiiHandle
,
1437 (UINTN
)NicInfo
->NicAddress
.MacAddr
.Addr
[0],
1438 (UINTN
)NicInfo
->NicAddress
.MacAddr
.Addr
[1],
1439 (UINTN
)NicInfo
->NicAddress
.MacAddr
.Addr
[2],
1440 (UINTN
)NicInfo
->NicAddress
.MacAddr
.Addr
[3],
1441 (UINTN
)NicInfo
->NicAddress
.MacAddr
.Addr
[4],
1442 (UINTN
)NicInfo
->NicAddress
.MacAddr
.Addr
[5]
1445 Print (L
" Media State: %s\n", NicInfo
->MediaPresent
? L
"Media present" : L
"Media disconnected");
1447 if (NicInfo
->ConfigInfo
== NULL
) {
1448 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_NIC_NOT_CONFIGURED
), gShellNetwork1HiiHandle
);
1452 if (NicInfo
->ConfigInfo
->Source
== IP4_CONFIG_SOURCE_DHCP
) {
1453 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE
), gShellNetwork1HiiHandle
, L
"DHCP");
1454 } else if (NicInfo
->ConfigInfo
->Source
== IP4_CONFIG_SOURCE_STATIC
) {
1455 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE
), gShellNetwork1HiiHandle
, L
"STATIC");
1457 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_CONFIG_SOURCE
), gShellNetwork1HiiHandle
, L
"Unknown");
1460 ShellPrintHiiEx(-1, -1, NULL
,
1461 STRING_TOKEN (STR_IFCONFIG_PERMENT_STATUS
),
1462 gShellNetwork1HiiHandle
,
1463 (NicInfo
->ConfigInfo
->Perment
? L
"TRUE":L
"FALSE")
1466 Ip4Config
= &NicInfo
->ConfigInfo
->Ip4Info
;
1472 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR
),
1473 gShellNetwork1HiiHandle
,
1475 (UINTN
)Ip4Config
->StationAddress
.Addr
[0],
1476 (UINTN
)Ip4Config
->StationAddress
.Addr
[1],
1477 (UINTN
)Ip4Config
->StationAddress
.Addr
[2],
1478 (UINTN
)Ip4Config
->StationAddress
.Addr
[3]
1484 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR
),
1485 gShellNetwork1HiiHandle
,
1487 (UINTN
)Ip4Config
->SubnetMask
.Addr
[0],
1488 (UINTN
)Ip4Config
->SubnetMask
.Addr
[1],
1489 (UINTN
)Ip4Config
->SubnetMask
.Addr
[2],
1490 (UINTN
)Ip4Config
->SubnetMask
.Addr
[3]
1493 ZeroMem (&Gateway
, sizeof (EFI_IPv4_ADDRESS
));
1495 for (Index
= 0; Index
< Ip4Config
->RouteTableSize
; Index
++) {
1496 if ((CompareMem (&Ip4Config
->RouteTable
[Index
].SubnetAddress
, &mZeroIp4Addr
, sizeof (EFI_IPv4_ADDRESS
)) == 0) &&
1497 (CompareMem (&Ip4Config
->RouteTable
[Index
].SubnetMask
, &mZeroIp4Addr
, sizeof (EFI_IPv4_ADDRESS
)) == 0) ){
1498 CopyMem (&Gateway
, &Ip4Config
->RouteTable
[Index
].GatewayAddress
, sizeof (EFI_IPv4_ADDRESS
));
1506 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR
),
1507 gShellNetwork1HiiHandle
,
1509 (UINTN
)Gateway
.Addr
[0],
1510 (UINTN
)Gateway
.Addr
[1],
1511 (UINTN
)Gateway
.Addr
[2],
1512 (UINTN
)Gateway
.Addr
[3]
1515 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_ROUTES_SIZE
), gShellNetwork1HiiHandle
, Ip4Config
->RouteTableSize
);
1517 for (Index
= 0; Index
< Ip4Config
->RouteTableSize
; Index
++) {
1518 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_ROUTES_ENTRY_INDEX
), gShellNetwork1HiiHandle
, Index
);
1524 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR
),
1525 gShellNetwork1HiiHandle
,
1527 (UINTN
)Ip4Config
->RouteTable
[Index
].SubnetAddress
.Addr
[0],
1528 (UINTN
)Ip4Config
->RouteTable
[Index
].SubnetAddress
.Addr
[1],
1529 (UINTN
)Ip4Config
->RouteTable
[Index
].SubnetAddress
.Addr
[2],
1530 (UINTN
)Ip4Config
->RouteTable
[Index
].SubnetAddress
.Addr
[3]
1537 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR
),
1538 gShellNetwork1HiiHandle
,
1540 (UINTN
)Ip4Config
->RouteTable
[Index
].SubnetMask
.Addr
[0],
1541 (UINTN
)Ip4Config
->RouteTable
[Index
].SubnetMask
.Addr
[1],
1542 (UINTN
)Ip4Config
->RouteTable
[Index
].SubnetMask
.Addr
[2],
1543 (UINTN
)Ip4Config
->RouteTable
[Index
].SubnetMask
.Addr
[3]
1550 STRING_TOKEN (STR_IFCONFIG_SHOW_IP_ADDR
),
1551 gShellNetwork1HiiHandle
,
1553 (UINTN
)Ip4Config
->RouteTable
[Index
].GatewayAddress
.Addr
[0],
1554 (UINTN
)Ip4Config
->RouteTable
[Index
].GatewayAddress
.Addr
[1],
1555 (UINTN
)Ip4Config
->RouteTable
[Index
].GatewayAddress
.Addr
[2],
1556 (UINTN
)Ip4Config
->RouteTable
[Index
].GatewayAddress
.Addr
[3]
1565 Clear address configuration for the nic specified.
1567 @param[in] Name A pointer to the string containg the nic's name,
1568 if NULL, all nics address configurations are cleared.
1570 @retval EFI_SUCCESS The address configuration is cleared.
1571 @return Some error occurs.
1575 IfconfigClearNicAddr (
1576 IN CONST CHAR16
*Name
1580 LIST_ENTRY
*NextEntry
;
1584 NET_LIST_FOR_EACH_SAFE (Entry
, NextEntry
, &NicInfoList
) {
1585 Info
= BASE_CR (Entry
, NIC_INFO
, Link
);
1587 if ((Name
!= NULL
) && (StrCmp (Name
, Info
->Name
) != 0)) {
1591 // if (Info->NicIp4Config == NULL) {
1592 Status
= IfconfigSetNicAddrByHii (Info
, NULL
);
1594 // Status = Info->NicIp4Config->SetInfo (Info->NicIp4Config, NULL, TRUE);
1597 if (EFI_ERROR (Status
)) {
1607 Function for 'ifconfig' command.
1609 @param[in] ImageHandle Handle to the Image (NULL if Internal).
1610 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
1614 ShellCommandRunIfconfig (
1615 IN EFI_HANDLE ImageHandle
,
1616 IN EFI_SYSTEM_TABLE
*SystemTable
1620 LIST_ENTRY
*Package
;
1621 CHAR16
*ProblemParam
;
1622 SHELL_STATUS ShellStatus
;
1623 BOOLEAN ListOperation
;
1624 BOOLEAN ClearOperation
;
1625 BOOLEAN SetOperation
;
1630 InitializeListHead (&NicInfoList
);
1631 Status
= EFI_INVALID_PARAMETER
;
1632 ShellStatus
= SHELL_SUCCESS
;
1635 // initialize the shell lib (we must be in non-auto-init...)
1637 Status
= ShellInitialize();
1638 ASSERT_EFI_ERROR(Status
);
1641 // parse the command line
1643 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
1644 if (EFI_ERROR(Status
)) {
1645 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
1646 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellNetwork1HiiHandle
, ProblemParam
);
1647 FreePool(ProblemParam
);
1648 ShellStatus
= SHELL_INVALID_PARAMETER
;
1656 ClearOperation
= ShellCommandLineGetFlag(Package
, L
"-c");
1657 ListOperation
= ShellCommandLineGetFlag(Package
, L
"-l");
1658 SetOperation
= ShellCommandLineGetFlag(Package
, L
"-s");
1660 if (ClearOperation
&& ListOperation
1661 ||SetOperation
&& ListOperation
1662 ||ClearOperation
&& SetOperation
1664 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PARAM_CON
), gShellNetwork1HiiHandle
);
1665 ShellStatus
= SHELL_INVALID_PARAMETER
;
1667 } else if (!ClearOperation
&& !ListOperation
&& !SetOperation
) {
1668 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellNetwork1HiiHandle
);
1669 ShellStatus
= SHELL_INVALID_PARAMETER
;
1674 Status
= IfconfigGetAllNicInfoByHii ();
1675 if (EFI_ERROR (Status
)) {
1676 if (mIp4ConfigExist
) {
1677 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_IFCONFIG_GET_NIC_FAIL
), gShellNetwork1HiiHandle
, Status
);
1679 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROTOCOL_NF
), gShellNetwork1HiiHandle
, L
"gEfiIp4ConfigProtocolGuid", &gEfiIp4ConfigProtocolGuid
);
1682 return SHELL_NOT_FOUND
;
1685 if (ListOperation
) {
1686 Item
= ShellCommandLineGetValue (Package
, L
"-l");
1688 if (Item
!= NULL
&& CountSubItems(Item
) > 1) {
1689 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellNetwork1HiiHandle
, L
"-l");
1690 ShellStatus
= SHELL_INVALID_PARAMETER
;
1695 // Show the configuration.
1697 IfconfigShowNicInfo (Item
);
1698 } else if (SetOperation
) {
1699 Item
= ShellCommandLineGetValue (Package
, L
"-s");
1702 // The correct command line arguments for setting address are:
1703 // IfConfig -s eth0 DHCP [perment]
1704 // IfConfig -s eth0 static ip netmask gateway [perment]
1706 if (Item
== NULL
|| (CountSubItems(Item
) < 2) || (CountSubItems(Item
) > 6) || (CountSubItems(Item
) == 4)) {
1707 ShellPrintHiiEx(-1, -1, NULL
,STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellNetwork1HiiHandle
, L
"-s");
1708 ShellStatus
= SHELL_INVALID_PARAMETER
;
1712 ShellStatus
= IfconfigSetNicAddr (CountSubItems(Item
), Item
);
1713 } else if (ClearOperation
) {
1714 Item
= ShellCommandLineGetValue (Package
, L
"-c");
1716 if (Item
!= NULL
&& CountSubItems(Item
) > 1) {
1717 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM_VAL
), gShellNetwork1HiiHandle
, L
"-c");
1718 ShellStatus
= SHELL_INVALID_PARAMETER
;
1722 IfconfigClearNicAddr (Item
);
1728 while (!IsListEmpty (&NicInfoList
)) {
1729 Entry
= NicInfoList
.ForwardLink
;
1730 Info
= BASE_CR (Entry
, NIC_INFO
, Link
);
1732 RemoveEntryList (Entry
);
1734 if (Info
->ConfigInfo
!= NULL
) {
1735 FreePool (Info
->ConfigInfo
);
1741 if (Package
!= NULL
) {
1742 ShellCommandLineFreeVarList(Package
);
1745 return (ShellStatus
);