X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FNetwork%2FIp4ConfigDxe%2FIp4Config.c;h=736299bec026fa1ff9caa1410ce14c31080aab5e;hp=c0cc15f3de7ff48bff2b7b82d550f00eee00d7ee;hb=7bce0c5a0eb806a55d7231b05769d0efc71cdc59;hpb=b2570da8b7d2154b2d1344f2eb25acac9e6b6578 diff --git a/MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4Config.c b/MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4Config.c index c0cc15f3de..736299bec0 100644 --- a/MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4Config.c +++ b/MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4Config.c @@ -1,6 +1,6 @@ /** @file -Copyright (c) 2006 - 2007, Intel Corporation +Copyright (c) 2006 - 2008, Intel Corporation All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -24,6 +24,16 @@ Abstract: IP4_CONFIG_INSTANCE *mIp4ConfigNicList[MAX_IP4_CONFIG_IN_VARIABLE]; +/** + Callback function when DHCP process finished. It will save the + retrieved IP configure parameter from DHCP to the NVRam. + + @param Event The callback event + @param Context Opaque context to the callback + + @return None + +**/ VOID EFIAPI Ip4ConfigOnDhcp4Complete ( @@ -44,7 +54,6 @@ Ip4ConfigOnDhcp4Complete ( @retval EFI_SUCCESS The name or address of the NIC are returned. **/ -STATIC EFI_STATUS EFIAPI EfiNicIp4ConfigGetName ( @@ -62,11 +71,11 @@ EfiNicIp4ConfigGetName ( Instance = IP4_CONFIG_INSTANCE_FROM_NIC_IP4CONFIG (This); if (Name != NULL) { - NetCopyMem (Name, Instance->NicName, IP4_NIC_NAME_LENGTH); + CopyMem (Name, Instance->NicName, IP4_NIC_NAME_LENGTH); } if (NicAddr != NULL) { - *NicAddr = Instance->NicAddr; + CopyMem (NicAddr, &Instance->NicAddr, sizeof (*NicAddr)); } return EFI_SUCCESS; @@ -105,7 +114,7 @@ Ip4ConfigGetNicInfo ( Config = Ip4ConfigFindNicVariable (Variable, NicAddr); if (Config == NULL) { - NetFreePool (Variable); + gBS->FreePool (Variable); return NULL; } @@ -118,14 +127,14 @@ Ip4ConfigGetNicInfo ( Ip4ConfigWriteVariable (NewVariable); if (NewVariable != NULL) { - NetFreePool (NewVariable); + gBS->FreePool (NewVariable); }; - NetFreePool (Config); + gBS->FreePool (Config); Config = NULL; } - NetFreePool (Variable); + gBS->FreePool (Variable); return Config; } @@ -179,12 +188,13 @@ EfiNicIp4ConfigGetInfo ( Status = EFI_BUFFER_TOO_SMALL; } else { Status = EFI_SUCCESS; - NetCopyMem (NicConfig, Config, Len); + CopyMem (NicConfig, Config, Len); + Ip4ConfigFixRouteTablePointer (&NicConfig->Ip4Info); } *ConfigLen = Len; - NetFreePool (Config); + gBS->FreePool (Config); return Status; } @@ -253,14 +263,14 @@ EfiNicIp4ConfigSetInfo ( Status = Ip4ConfigWriteVariable (NewVariable); if (NewVariable != NULL) { - NetFreePool (NewVariable); + gBS->FreePool (NewVariable); } // // Variable is NULL when saving the first configure parameter // if (Variable != NULL) { - NetFreePool (Variable); + gBS->FreePool (Variable); } if (EFI_ERROR (Status)) { @@ -272,6 +282,7 @@ EfiNicIp4ConfigSetInfo ( // if (Reconfig && (Instance->ReconfigEvent != NULL)) { Status = gBS->SignalEvent (Instance->ReconfigEvent); + NetLibDispatchDpc (); } return Status; @@ -313,7 +324,7 @@ EfiIp4ConfigStart ( Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (This); - OldTpl = NET_RAISE_TPL (NET_TPL_LOCK); + OldTpl = gBS->RaiseTPL (TPL_CALLBACK); if (Instance->State != IP4_CONFIG_STATE_IDLE) { Status = EFI_ALREADY_STARTED; @@ -415,7 +426,7 @@ EfiIp4ConfigStart ( // Status = gBS->CreateEvent ( EVT_NOTIFY_SIGNAL, - NET_TPL_EVENT, + TPL_CALLBACK, Ip4ConfigOnDhcp4Complete, Instance, &Instance->Dhcp4Event @@ -440,7 +451,9 @@ ON_ERROR: } ON_EXIT: - NET_RESTORE_TPL (OldTpl); + gBS->RestoreTPL (OldTpl); + + NetLibDispatchDpc (); return Status; } @@ -473,7 +486,7 @@ EfiIp4ConfigStop ( Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (This); Status = EFI_SUCCESS; - OldTpl = NET_RAISE_TPL (NET_TPL_LOCK); + OldTpl = gBS->RaiseTPL (TPL_CALLBACK); if (Instance->State == IP4_CONFIG_STATE_IDLE) { Status = EFI_NOT_STARTED; @@ -488,7 +501,7 @@ EfiIp4ConfigStop ( Ip4ConfigCleanConfig (Instance); ON_EXIT: - NET_RESTORE_TPL (OldTpl); + gBS->RestoreTPL (OldTpl); return Status; } @@ -528,7 +541,7 @@ EfiIp4ConfigGetData ( Instance = IP4_CONFIG_INSTANCE_FROM_IP4CONFIG (This); Status = EFI_SUCCESS; - OldTpl = NET_RAISE_TPL (NET_TPL_LOCK); + OldTpl = gBS->RaiseTPL (TPL_CALLBACK); if (Instance->State == IP4_CONFIG_STATE_IDLE) { Status = EFI_NOT_STARTED; @@ -554,14 +567,15 @@ EfiIp4ConfigGetData ( if ((*ConfigDataSize < Len) || (ConfigData == NULL)) { Status = EFI_BUFFER_TOO_SMALL; } else { - NetCopyMem (ConfigData, &NicConfig->Ip4Info, Len); + CopyMem (ConfigData, &NicConfig->Ip4Info, Len); + Ip4ConfigFixRouteTablePointer (ConfigData); } *ConfigDataSize = Len; } ON_EXIT: - NET_RESTORE_TPL (OldTpl); + gBS->RestoreTPL (OldTpl); return Status; } @@ -590,6 +604,8 @@ Ip4ConfigOnDhcp4Complete ( EFI_STATUS Status; BOOLEAN Perment; IP4_ADDR Subnet; + IP4_ADDR Ip1; + IP4_ADDR Ip2; Instance = (IP4_CONFIG_INSTANCE *) Context; ASSERT (Instance->Dhcp4 != NULL); @@ -617,18 +633,19 @@ Ip4ConfigOnDhcp4Complete ( if (Instance->NicConfig != NULL) { ASSERT (Instance->NicConfig->Source == IP4_CONFIG_SOURCE_DHCP); Perment = Instance->NicConfig->Perment; - NetFreePool (Instance->NicConfig); + gBS->FreePool (Instance->NicConfig); } - Instance->NicConfig = NetAllocatePool (sizeof (NIC_IP4_CONFIG_INFO) + - sizeof (EFI_IP4_ROUTE_TABLE)); + Instance->NicConfig = AllocatePool (sizeof (NIC_IP4_CONFIG_INFO) + 2* sizeof (EFI_IP4_ROUTE_TABLE)); if (Instance->NicConfig == NULL) { Instance->Result = EFI_OUT_OF_RESOURCES; goto ON_EXIT; } - Instance->NicConfig->NicAddr = Instance->NicAddr; + Instance->NicConfig->Ip4Info.RouteTable = (EFI_IP4_ROUTE_TABLE *) (Instance->NicConfig + 1); + + CopyMem (&Instance->NicConfig->NicAddr, &Instance->NicAddr, sizeof (Instance->NicConfig->NicAddr)); Instance->NicConfig->Source = IP4_CONFIG_SOURCE_DHCP; Instance->NicConfig->Perment = Perment; @@ -641,20 +658,24 @@ Ip4ConfigOnDhcp4Complete ( // Ip4Config->RouteTableSize = 1; - Subnet = EFI_NTOHL (Dhcp4Mode.ClientAddress) & EFI_NTOHL (Dhcp4Mode.SubnetMask); + CopyMem (&Ip1, &Dhcp4Mode.ClientAddress, sizeof (IP4_ADDR)); + CopyMem (&Ip2, &Dhcp4Mode.SubnetMask, sizeof (IP4_ADDR)); - EFI_IP4 (Ip4Config->RouteTable[0].SubnetAddress) = HTONL (Subnet); - Ip4Config->RouteTable[0].SubnetMask = Dhcp4Mode.SubnetMask; - EFI_IP4 (Ip4Config->RouteTable[0].GatewayAddress) = 0; + Subnet = Ip1 & Ip2; + + CopyMem (&Ip4Config->RouteTable[0].SubnetAddress, &Subnet, sizeof (EFI_IPv4_ADDRESS)); + CopyMem (&Ip4Config->RouteTable[0].SubnetMask, &Dhcp4Mode.SubnetMask, sizeof (EFI_IPv4_ADDRESS)); + ZeroMem (&Ip4Config->RouteTable[0].GatewayAddress, sizeof (EFI_IPv4_ADDRESS)); // // Create a route if there is a default router. // - if (EFI_IP4 (Dhcp4Mode.RouterAddress) != 0) { - Ip4Config->RouteTableSize = 2; - EFI_IP4 (Ip4Config->RouteTable[1].SubnetAddress) = 0; - EFI_IP4 (Ip4Config->RouteTable[1].SubnetMask) = 0; - Ip4Config->RouteTable[1].GatewayAddress = Dhcp4Mode.RouterAddress; + if (!EFI_IP4_EQUAL (&Dhcp4Mode.RouterAddress, &mZeroIp4Addr)) { + Ip4Config->RouteTableSize = 2; + + ZeroMem (&Ip4Config->RouteTable[1].SubnetAddress, sizeof (EFI_IPv4_ADDRESS)); + ZeroMem (&Ip4Config->RouteTable[1].SubnetMask, sizeof (EFI_IPv4_ADDRESS)); + CopyMem (&Ip4Config->RouteTable[1].GatewayAddress, &Dhcp4Mode.RouterAddress, sizeof (EFI_IPv4_ADDRESS)); } Instance->Result = EFI_SUCCESS; @@ -669,6 +690,9 @@ Ip4ConfigOnDhcp4Complete ( ON_EXIT: gBS->SignalEvent (Instance->DoneEvent); Ip4ConfigCleanDhcp4 (Instance); + + NetLibDispatchDpc (); + return ; } @@ -718,7 +742,7 @@ Ip4ConfigCleanDhcp4 ( /** - Clean up all the configuration parameters + Clean up all the configuration parameters. @param Instance The IP4 configure instance @@ -731,7 +755,7 @@ Ip4ConfigCleanConfig ( ) { if (Instance->NicConfig != NULL) { - NetFreePool (Instance->NicConfig); + gBS->FreePool (Instance->NicConfig); Instance->NicConfig = NULL; }