summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiaxin Wu <jiaxin.wu@intel.com>2015-08-20 06:45:19 +0000
committerjiaxinwu <jiaxinwu@Edk2>2015-08-20 06:45:19 +0000
commitd6cf1af908f387334e99cdb3930e8a244db03566 (patch)
tree26c9b8e744050296d1530a0558873edef858d1d6
parent3e708eedd719f5ca8dae84f7440360c60b75b4ad (diff)
downloadedk2-platforms-d6cf1af908f387334e99cdb3930e8a244db03566.tar.xz
ShellPkg: Fix 'ifconfig' can't get the address from dhcp in some case
R18201 fix caused ifconfig in shell failed to get the address from dhcp with the command "ifconfig -s eth0 dhcp" since the default policy is dhcp already. We can fix it by following the rule to starting the Ip4 auto configuration. Cc: Ye Ting <ting.ye@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jiaxin Wu <jiaxin.wu@intel.com> Reviewed-by: Jaben Carsey <jaben.carsey@intel.com> Reviwed-by: Ye Ting <ting.ye@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18244 6f19259b-4bc3-4df7-8a09-765794883524
-rw-r--r--ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c115
1 files changed, 100 insertions, 15 deletions
diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
index df19a9f902..273f1a85dd 100644
--- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
+++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c
@@ -275,6 +275,85 @@ IfConfigManualAddressNotify (
/**
+ Create an IP child, use it to start the auto configuration, then destroy it.
+
+ @param[in] Controller The controller which has the service installed.
+ @param[in] Image The image handle used to open service.
+
+ @retval EFI_SUCCESS The configuration is done.
+**/
+EFI_STATUS
+EFIAPI
+IfConfigStartIp4(
+ IN EFI_HANDLE Controller,
+ IN EFI_HANDLE Image
+ )
+{
+ EFI_IP4_PROTOCOL *Ip4;
+ EFI_HANDLE Ip4Handle;
+ EFI_IP4_CONFIG_DATA Ip4ConfigData;
+ EFI_STATUS Status;
+
+ //
+ // Get the Ip4ServiceBinding Protocol
+ //
+ Ip4Handle = NULL;
+ Ip4 = NULL;
+
+ Status = NetLibCreateServiceChild (
+ Controller,
+ Image,
+ &gEfiIp4ServiceBindingProtocolGuid,
+ &Ip4Handle
+ );
+
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ Status = gBS->OpenProtocol (
+ Ip4Handle,
+ &gEfiIp4ProtocolGuid,
+ (VOID **) &Ip4,
+ Controller,
+ Image,
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL
+ );
+
+ if (EFI_ERROR (Status)) {
+ goto ON_EXIT;
+ }
+
+ Ip4ConfigData.DefaultProtocol = EFI_IP_PROTO_ICMP;
+ Ip4ConfigData.AcceptAnyProtocol = FALSE;
+ Ip4ConfigData.AcceptIcmpErrors = FALSE;
+ Ip4ConfigData.AcceptBroadcast = FALSE;
+ Ip4ConfigData.AcceptPromiscuous = FALSE;
+ Ip4ConfigData.UseDefaultAddress = TRUE;
+ ZeroMem (&Ip4ConfigData.StationAddress, sizeof (EFI_IPv4_ADDRESS));
+ ZeroMem (&Ip4ConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
+ Ip4ConfigData.TypeOfService = 0;
+ Ip4ConfigData.TimeToLive = 1;
+ Ip4ConfigData.DoNotFragment = FALSE;
+ Ip4ConfigData.RawData = FALSE;
+ Ip4ConfigData.ReceiveTimeout = 0;
+ Ip4ConfigData.TransmitTimeout = 0;
+
+ Ip4->Configure (Ip4, &Ip4ConfigData);
+
+ON_EXIT:
+ NetLibDestroyServiceChild (
+ Controller,
+ Image,
+ &gEfiIp4ServiceBindingProtocolGuid,
+ Ip4Handle
+ );
+
+ return Status;
+}
+
+
+/**
Print MAC address.
@param[in] Node The pointer of MAC address buffer.
@@ -874,21 +953,27 @@ IfConfigSetInterfaceInfo (
// Process valid variables.
//
if (StrCmp(VarArg->Arg, L"dhcp") == 0) {
- //
- // Set dhcp config policy
- //
- Policy = Ip4Config2PolicyDhcp;
- Status = IfCb->IfCfg->SetData (
- IfCb->IfCfg,
- Ip4Config2DataTypePolicy,
- sizeof (EFI_IP4_CONFIG2_POLICY),
- &Policy
- );
-
- if (EFI_ERROR(Status)) {
- goto ON_EXIT;
+ if (IfCb->Policy == Ip4Config2PolicyDhcp) {
+ Status = IfConfigStartIp4 (IfCb->NicHandle, gImageHandle);
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
+ } else {
+ //
+ // Set dhcp config policy
+ //
+ Policy = Ip4Config2PolicyDhcp;
+ Status = IfCb->IfCfg->SetData (
+ IfCb->IfCfg,
+ Ip4Config2DataTypePolicy,
+ sizeof (EFI_IP4_CONFIG2_POLICY),
+ &Policy
+ );
+ if (EFI_ERROR(Status)) {
+ goto ON_EXIT;
+ }
}
-
+
VarArg= VarArg->Next;
} else if (StrCmp (VarArg->Arg, L"static") == 0) {
@@ -1038,7 +1123,7 @@ ON_EXIT:
FreePool (Dns);
}
- return EFI_SUCCESS;
+ return Status;
}