IP4_ADDR SubnetMask;\r
VOID *Ptr;\r
IP4_SERVICE *IpSb;\r
+ IP4_INTERFACE *IpIf;\r
+ IP4_ROUTE_TABLE *RouteTable;\r
+\r
+ DataItem = NULL;\r
+ Status = EFI_SUCCESS;\r
+ Ptr = NULL;\r
+ IpIf = NULL;\r
+ RouteTable = NULL;\r
\r
IpSb = IP4_SERVICE_FROM_IP4_CONFIG2_INSTANCE (Instance);\r
\r
ASSERT (Instance->DataItem[Ip4Config2DataTypeManualAddress].Status != EFI_NOT_READY);\r
\r
- if (((DataSize % sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS)) != 0) || (DataSize == 0)) {\r
+ if ((DataSize != 0) && ((DataSize % sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS)) != 0)) {\r
return EFI_BAD_BUFFER_SIZE;\r
}\r
\r
return EFI_WRITE_PROTECTED;\r
}\r
\r
- NewAddress = *((EFI_IP4_CONFIG2_MANUAL_ADDRESS *) Data);\r
+ DataItem = &Instance->DataItem[Ip4Config2DataTypeManualAddress];\r
\r
- StationAddress = EFI_NTOHL (NewAddress.Address);\r
- SubnetMask = EFI_NTOHL (NewAddress.SubnetMask);\r
+ if (Data != NULL && DataSize != 0) {\r
+ NewAddress = *((EFI_IP4_CONFIG2_MANUAL_ADDRESS *) Data);\r
\r
- //\r
- // Check whether the StationAddress/SubnetMask pair is valid.\r
- //\r
- if (!Ip4StationAddressValid (StationAddress, SubnetMask)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
+ StationAddress = EFI_NTOHL (NewAddress.Address);\r
+ SubnetMask = EFI_NTOHL (NewAddress.SubnetMask);\r
\r
- //\r
- // Store the new data, and init the DataItem status to EFI_NOT_READY because\r
- // we may have an asynchronous configuration process.\r
- //\r
- Ptr = AllocateCopyPool (DataSize, Data);\r
- if (Ptr == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
+ //\r
+ // Check whether the StationAddress/SubnetMask pair is valid.\r
+ //\r
+ if (!Ip4StationAddressValid (StationAddress, SubnetMask)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
\r
- DataItem = &Instance->DataItem[Ip4Config2DataTypeManualAddress];\r
- if (DataItem->Data.Ptr != NULL) {\r
- FreePool (DataItem->Data.Ptr);\r
- }\r
- \r
- DataItem->Data.Ptr = Ptr;\r
- DataItem->DataSize = DataSize;\r
- DataItem->Status = EFI_NOT_READY;\r
+ //\r
+ // Store the new data, and init the DataItem status to EFI_NOT_READY because\r
+ // we may have an asynchronous configuration process.\r
+ //\r
+ Ptr = AllocateCopyPool (DataSize, Data);\r
+ if (Ptr == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
\r
- IpSb->Reconfig = TRUE;\r
- Status = Ip4Config2SetDefaultAddr (IpSb, StationAddress, SubnetMask);\r
+ if (DataItem->Data.Ptr != NULL) {\r
+ FreePool (DataItem->Data.Ptr);\r
+ }\r
+ \r
+ DataItem->Data.Ptr = Ptr;\r
+ DataItem->DataSize = DataSize;\r
+ DataItem->Status = EFI_NOT_READY;\r
+\r
+ IpSb->Reconfig = TRUE;\r
+ Status = Ip4Config2SetDefaultAddr (IpSb, StationAddress, SubnetMask);\r
\r
- DataItem->Status = Status; \r
+ DataItem->Status = Status;\r
\r
- if (EFI_ERROR (DataItem->Status) && DataItem->Status != EFI_NOT_READY) {\r
- if (Ptr != NULL) {\r
- FreePool (Ptr);\r
+ if (EFI_ERROR (DataItem->Status) && DataItem->Status != EFI_NOT_READY) {\r
+ if (Ptr != NULL) {\r
+ FreePool (Ptr);\r
+ }\r
+ DataItem->Data.Ptr = NULL; \r
+ }\r
+ } else {\r
+ //\r
+ // DataSize is 0 and Data is NULL, clean up the manual address.\r
+ //\r
+ if (DataItem->Data.Ptr != NULL) {\r
+ FreePool (DataItem->Data.Ptr);\r
+ }\r
+ DataItem->Data.Ptr = NULL;\r
+ DataItem->DataSize = 0;\r
+ DataItem->Status = EFI_NOT_FOUND;\r
+\r
+ //\r
+ // Free the default router table and Interface, clean up the assemble table.\r
+ //\r
+ if (IpSb->DefaultInterface != NULL) {\r
+ if (IpSb->DefaultRouteTable != NULL) {\r
+ Ip4FreeRouteTable (IpSb->DefaultRouteTable);\r
+ IpSb->DefaultRouteTable = NULL; \r
+ }\r
+\r
+ Ip4CancelReceive (IpSb->DefaultInterface);\r
+\r
+ Ip4FreeInterface (IpSb->DefaultInterface, NULL);\r
+ IpSb->DefaultInterface = NULL;\r
+ }\r
+\r
+ Ip4CleanAssembleTable (&IpSb->Assemble);\r
+\r
+ //\r
+ // Create new default interface and route table.\r
+ // \r
+ IpIf = Ip4CreateInterface (IpSb->Mnp, IpSb->Controller, IpSb->Image);\r
+ if (IpIf == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ RouteTable = Ip4CreateRouteTable ();\r
+ if (RouteTable == NULL) {\r
+ Ip4FreeInterface (IpIf, NULL);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ \r
+ IpSb->DefaultInterface = IpIf;\r
+ InsertHeadList (&IpSb->Interfaces, &IpIf->Link);\r
+ IpSb->DefaultRouteTable = RouteTable;\r
+ Ip4ReceiveFrame (IpIf, NULL, Ip4AccpetFrame, IpSb);\r
+\r
+ //\r
+ // Reset the State to unstarted. \r
+ //\r
+ if (IpSb->State == IP4_SERVICE_CONFIGED || IpSb->State == IP4_SERVICE_STARTED) {\r
+ IpSb->State = IP4_SERVICE_UNSTARTED;\r
}\r
- DataItem->Data.Ptr = NULL; \r
}\r
\r
return Status;\r
BOOLEAN OneAdded;\r
VOID *Tmp;\r
\r
- if ((DataSize % sizeof (EFI_IPv4_ADDRESS) != 0) || (DataSize == 0)) {\r
+ OldGateway = NULL;\r
+ NewGateway = NULL;\r
+ OneRemoved = FALSE;\r
+ OneAdded = FALSE;\r
+ Tmp = NULL;\r
+\r
+ if ((DataSize != 0) && (DataSize % sizeof (EFI_IPv4_ADDRESS) != 0)) {\r
return EFI_BAD_BUFFER_SIZE;\r
}\r
\r
\r
IpSb = IP4_SERVICE_FROM_IP4_CONFIG2_INSTANCE (Instance);\r
\r
- NewGateway = (EFI_IPv4_ADDRESS *) Data;\r
- NewGatewayCount = DataSize / sizeof (EFI_IPv4_ADDRESS);\r
- for (Index1 = 0; Index1 < NewGatewayCount; Index1++) {\r
- CopyMem (&Gateway, NewGateway + Index1, sizeof (IP4_ADDR));\r
-\r
- if ((IpSb->DefaultInterface->SubnetMask != 0) && \r
- !NetIp4IsUnicast (NTOHL (Gateway), IpSb->DefaultInterface->SubnetMask)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- for (Index2 = Index1 + 1; Index2 < NewGatewayCount; Index2++) {\r
- if (EFI_IP4_EQUAL (NewGateway + Index1, NewGateway + Index2)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- }\r
- }\r
- \r
- DataItem = &Instance->DataItem[Ip4Config2DataTypeGateway];\r
+ DataItem = &Instance->DataItem[Ip4Config2DataTypeGateway];\r
OldGateway = DataItem->Data.Gateway;\r
OldGatewayCount = DataItem->DataSize / sizeof (EFI_IPv4_ADDRESS);\r
- OneRemoved = FALSE;\r
- OneAdded = FALSE;\r
-\r
- if (NewGatewayCount != OldGatewayCount) {\r
- Tmp = AllocatePool (DataSize);\r
- if (Tmp == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- } else {\r
- Tmp = NULL;\r
- }\r
\r
for (Index1 = 0; Index1 < OldGatewayCount; Index1++) {\r
//\r
- // Remove this route entry.\r
+ // Remove the old route entry.\r
//\r
CopyMem (&Gateway, OldGateway + Index1, sizeof (IP4_ADDR));\r
Ip4DelRoute (\r
NTOHL (Gateway)\r
);\r
OneRemoved = TRUE;\r
-\r
}\r
\r
- for (Index1 = 0; Index1 < NewGatewayCount; Index1++) {\r
- CopyMem (&Gateway, NewGateway + Index1, sizeof (IP4_ADDR));\r
- Ip4AddRoute (\r
- IpSb->DefaultRouteTable,\r
- IP4_ALLZERO_ADDRESS,\r
- IP4_ALLZERO_ADDRESS,\r
- NTOHL (Gateway)\r
- ); \r
-\r
- OneAdded = TRUE;\r
- }\r
+ if (Data != NULL && DataSize != 0) {\r
+ NewGateway = (EFI_IPv4_ADDRESS *) Data;\r
+ NewGatewayCount = DataSize / sizeof (EFI_IPv4_ADDRESS);\r
+ for (Index1 = 0; Index1 < NewGatewayCount; Index1++) {\r
+ CopyMem (&Gateway, NewGateway + Index1, sizeof (IP4_ADDR));\r
\r
+ if ((IpSb->DefaultInterface->SubnetMask != 0) && \r
+ !NetIp4IsUnicast (NTOHL (Gateway), IpSb->DefaultInterface->SubnetMask)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
\r
- if (!OneRemoved && !OneAdded) {\r
- DataItem->Status = EFI_SUCCESS;\r
- return EFI_ABORTED;\r
- } else {\r
+ for (Index2 = Index1 + 1; Index2 < NewGatewayCount; Index2++) {\r
+ if (EFI_IP4_EQUAL (NewGateway + Index1, NewGateway + Index2)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ }\r
+ }\r
\r
- if (Tmp != NULL) {\r
- if (DataItem->Data.Ptr != NULL) {\r
- FreePool (DataItem->Data.Ptr);\r
+ if (NewGatewayCount != OldGatewayCount) {\r
+ Tmp = AllocatePool (DataSize);\r
+ if (Tmp == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
}\r
- DataItem->Data.Ptr = Tmp;\r
+ } else {\r
+ Tmp = NULL;\r
}\r
\r
- CopyMem (DataItem->Data.Ptr, Data, DataSize);\r
- DataItem->DataSize = DataSize;\r
- DataItem->Status = EFI_SUCCESS;\r
- return EFI_SUCCESS;\r
+ for (Index1 = 0; Index1 < NewGatewayCount; Index1++) {\r
+ //\r
+ // Add the new route entry.\r
+ //\r
+ CopyMem (&Gateway, NewGateway + Index1, sizeof (IP4_ADDR));\r
+ Ip4AddRoute (\r
+ IpSb->DefaultRouteTable,\r
+ IP4_ALLZERO_ADDRESS,\r
+ IP4_ALLZERO_ADDRESS,\r
+ NTOHL (Gateway)\r
+ ); \r
+\r
+ OneAdded = TRUE;\r
+ }\r
+\r
+ if (!OneRemoved && !OneAdded) {\r
+ DataItem->Status = EFI_SUCCESS;\r
+ return EFI_ABORTED;\r
+ } else {\r
+ if (Tmp != NULL) {\r
+ if (DataItem->Data.Ptr != NULL) {\r
+ FreePool (DataItem->Data.Ptr);\r
+ }\r
+ DataItem->Data.Ptr = Tmp;\r
+ }\r
+\r
+ CopyMem (DataItem->Data.Ptr, Data, DataSize);\r
+ DataItem->DataSize = DataSize;\r
+ DataItem->Status = EFI_SUCCESS;\r
+ }\r
+ } else {\r
+ //\r
+ // DataSize is 0 and Data is NULL, clean up the Gateway address.\r
+ //\r
+ if (DataItem->Data.Ptr != NULL) {\r
+ FreePool (DataItem->Data.Ptr);\r
+ }\r
+ DataItem->Data.Ptr = NULL;\r
+ DataItem->DataSize = 0;\r
+ DataItem->Status = EFI_NOT_FOUND;\r
}\r
\r
+ return EFI_SUCCESS;\r
}\r
\r
/**\r
IN VOID *Data\r
)\r
{\r
- IP4_CONFIG2_DATA_ITEM *Item;\r
+ EFI_STATUS Status;\r
+ IP4_CONFIG2_DATA_ITEM *Item;\r
\r
- Item = NULL;\r
+ Status = EFI_SUCCESS;\r
+ Item = NULL;\r
\r
if (Instance->Policy != Ip4Config2PolicyStatic) {\r
return EFI_WRITE_PROTECTED;\r
REMOVE_DATA_ATTRIB (Item->Attribute, DATA_ATTRIB_VOLATILE);\r
}\r
\r
- return Ip4Config2SetDnsServerWorker (Instance, DataSize, Data);\r
+ if (Data != NULL && DataSize != 0) {\r
+ Status = Ip4Config2SetDnsServerWorker (Instance, DataSize, Data);\r
+ } else {\r
+ //\r
+ // DataSize is 0 and Data is NULL, clean up the DnsServer address. \r
+ //\r
+ if (Item->Data.Ptr != NULL) {\r
+ FreePool (Item->Data.Ptr);\r
+ }\r
+ Item->Data.Ptr = NULL;\r
+ Item->DataSize = 0;\r
+ Item->Status = EFI_NOT_FOUND;\r
+ }\r
+ \r
+ return Status;\r
}\r
\r
/**\r
network stack was set successfully.\r
@retval EFI_INVALID_PARAMETER One or more of the following are TRUE:\r
- This is NULL.\r
- - Data is NULL.\r
- - One or more fields in Data do not match the requirement of the\r
- data type indicated by DataType.\r
+ - One or more fields in Data and DataSize do not match the \r
+ requirement of the data type indicated by DataType.\r
@retval EFI_WRITE_PROTECTED The specified configuration data is read-only or the specified\r
configuration data cannot be set under the current policy.\r
@retval EFI_ACCESS_DENIED Another set operation on the specified configuration\r
IP4_CONFIG2_INSTANCE *Instance;\r
IP4_SERVICE *IpSb;\r
\r
- if ((This == NULL) || (Data == NULL)) {\r
+ if ((This == NULL) || (Data == NULL && DataSize != 0) || (Data != NULL && DataSize == 0)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r