Reviewed-by: Jaben Carsey <[email protected]>
> -----Original Message----- > From: edk2-devel [mailto:[email protected]] On Behalf Of > Jiaxin Wu > Sent: Wednesday, August 19, 2015 1:56 AM > To: [email protected] > Cc: Ye, Ting <[email protected]>; Zhang, Lubo <[email protected]> > Subject: [edk2] [Patch] ShellPkg: Fix 'ifconfig' getting the address from dhcp > error > Importance: High > > 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 <[email protected]> > Cc: Zhang Lubo <[email protected]> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Jiaxin Wu <[email protected]> > --- > .../UefiShellNetwork1CommandsLib/Ifconfig.c | 115 > ++++++++++++++++++--- > 1 file changed, 100 insertions(+), 15 deletions(-) > > diff --git a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c > b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c > index df19a9f..273f1a8 100644 > --- a/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c > +++ b/ShellPkg/Library/UefiShellNetwork1CommandsLib/Ifconfig.c > @@ -273,10 +273,89 @@ IfConfigManualAddressNotify ( > *((BOOLEAN *) Context) = TRUE; > } > > > /** > + 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. > @param[in] Size The size of MAC address buffer. > > @@ -872,25 +951,31 @@ 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) { > // > // Set manual config policy. > @@ -1036,11 +1121,11 @@ IfConfigSetInterfaceInfo ( > ON_EXIT: > if (Dns != NULL) { > FreePool (Dns); > } > > - return EFI_SUCCESS; > + return Status; > > } > > /** > The ifconfig command main process. > -- > 1.9.5.msysgit.1 > > _______________________________________________ > edk2-devel mailing list > [email protected] > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

