20 IN EFI_IP4_CONFIG2_DATA_TYPE DataType,
27 CopyMem (*Heap, Data, DataSize);
29 Variable->DataRecord[Variable->DataRecordCount].Offset = (UINT16)(*Heap - (CHAR8 *)Variable);
30 Variable->DataRecord[Variable->DataRecordCount].DataSize = (UINT32)DataSize;
31 Variable->DataRecord[Variable->DataRecordCount].DataType = DataType;
33 ++Variable->DataRecordCount;
46 EFI_IP4_CONFIG2_POLICY Policy,
47 EFI_IP4_CONFIG2_MANUAL_ADDRESS *ManualAddress,
48 EFI_IP_ADDRESS *Gateway,
49 EFI_IPv4_ADDRESS *DnsAddress,
57 UINT16 DataRecordCount;
61 VarSize =
sizeof (*Variable);
64 VarSize +=
sizeof (Policy);
66 if (ManualAddress != NULL) {
68 VarSize +=
sizeof (*ManualAddress);
71 if (Gateway != NULL) {
73 VarSize +=
sizeof (Gateway->v4);
76 if (DnsAddress != NULL) {
79 VarSize += DnsCount *
sizeof (*DnsAddress);
82 VarSize +=
sizeof (Variable->
DataRecord[0]) * DataRecordCount;
84 Variable = AllocatePool (VarSize);
86 if (Variable == NULL) {
87 return EFI_OUT_OF_RESOURCES;
90 Heap = (CHAR8 *)Variable + VarSize;
94 AddDataRecord (Variable, Ip4Config2DataTypePolicy, &Policy,
sizeof (Policy), &Heap);
95 if (ManualAddress != NULL) {
96 AddDataRecord (Variable, Ip4Config2DataTypeManualAddress, ManualAddress,
sizeof (*ManualAddress), &Heap);
99 if (Gateway != NULL) {
100 AddDataRecord (Variable, Ip4Config2DataTypeGateway, &Gateway->v4, sizeof (Gateway->v4), &Heap);
103 if (DnsAddress != NULL) {
104 AddDataRecord (Variable, Ip4Config2DataTypeDnsServer, DnsAddress,
sizeof (*DnsAddress) * DnsCount, &Heap);
111 Variable->
Checksum = (UINT16) ~NetblockChecksum ((UINT8 *)Variable, (UINT32)VarSize);
113 Status =
gRT->SetVariable (
115 &gEfiIp4Config2ProtocolGuid,
135 EFI_IP4_CONFIG2_POLICY Policy;
136 EFI_IP4_CONFIG2_MANUAL_ADDRESS ManualAddress;
137 EFI_IP_ADDRESS StationAddress;
138 EFI_IP_ADDRESS SubnetMask;
139 EFI_IP_ADDRESS Gateway;
141 EFI_IPv4_ADDRESS *DnsAddress;
148 Policy = Ip4Config2PolicyStatic;
152 DEBUG ((DEBUG_WARN,
"NETB: Invalid subnet mask %s\n", ConfigData->SubnetMask));
153 return EFI_INVALID_PARAMETER;
157 if (EFI_ERROR (Status) ||
158 ((SubnetMask.Addr[0] != 0) && !NetIp4IsUnicast (NTOHL (StationAddress.Addr[0]), NTOHL (SubnetMask.Addr[0]))) ||
161 DEBUG ((DEBUG_WARN,
"NETB: Invalid IP address %s\n", ConfigData->StationAddress));
162 return EFI_INVALID_PARAMETER;
166 if (EFI_ERROR (Status) ||
167 ((Gateway.Addr[0] != 0) && (SubnetMask.Addr[0] != 0) && !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), NTOHL (SubnetMask.Addr[0]))))
169 DEBUG ((DEBUG_WARN,
"NETB: Invalid gateway %s\n", ConfigData->GatewayAddress));
170 return EFI_INVALID_PARAMETER;
174 if (!EFI_ERROR (Status) && (DnsCount > 0)) {
175 for (Index = 0; Index < DnsCount; Index++) {
176 CopyMem (&Ip, &DnsAddress[Index],
sizeof (IP4_ADDR));
177 if (IP4_IS_UNSPECIFIED (NTOHL (Ip)) || IP4_IS_LOCAL_BROADCAST (NTOHL (Ip))) {
180 "NETB: Invalid DNS address %d.%d.%d.%d\n",
181 DnsAddress[Index].Addr[0],
182 DnsAddress[Index].Addr[1],
183 DnsAddress[Index].Addr[2],
184 DnsAddress[Index].Addr[3]
186 FreePool (DnsAddress);
187 return EFI_INVALID_PARAMETER;
191 if (EFI_ERROR (Status)) {
192 DEBUG ((DEBUG_WARN,
"NETB: Invalid DNS server list %s\n", ConfigData->DnsAddress));
196 return EFI_INVALID_PARAMETER;
200 CopyMem (&ManualAddress.Address, &StationAddress.v4, sizeof (EFI_IPv4_ADDRESS));
201 CopyMem (&ManualAddress.SubnetMask, &SubnetMask.v4, sizeof (EFI_IPv4_ADDRESS));
207 "NETB: Adding %a %s - %r\n",
208 "IPv4 NVRAM config for MAC address",
213 if (DnsAddress != NULL) {
214 FreePool (DnsAddress);
235 EFI_IP4_CONFIG2_POLICY Policy;
237 BOOLEAN FoundStaticPolicy;
238 BOOLEAN FoundManualAddress;
241 Status =
gRT->GetVariable (
243 &gEfiIp4Config2ProtocolGuid,
249 if (Status != EFI_BUFFER_TOO_SMALL) {
253 Variable = AllocatePool (VarSize);
254 if (Variable == NULL) {
255 return EFI_OUT_OF_RESOURCES;
258 Status =
gRT->GetVariable (
260 &gEfiIp4Config2ProtocolGuid,
265 if (EFI_ERROR (Status) || ((UINT16)(~NetblockChecksum ((UINT8 *)Variable, (UINT32)VarSize)) != 0)) {
274 "NETB: %a, %a %a %s - %r\n",
277 "IPv4 NVRAM config for MAC address",
282 return EFI_NOT_FOUND;
289 FoundStaticPolicy = FALSE;
290 FoundManualAddress = FALSE;
294 if ( (DataRecord->
DataType == Ip4Config2DataTypePolicy)
295 && (DataRecord->
DataSize == sizeof (Policy)))
298 if (Policy == Ip4Config2PolicyStatic) {
299 FoundStaticPolicy = TRUE;
301 }
else if ( (DataRecord->
DataType == Ip4Config2DataTypeManualAddress)
302 && (DataRecord->
DataSize == sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS)))
304 FoundManualAddress = TRUE;
308 if (FoundStaticPolicy && FoundManualAddress) {
316 Policy = Ip4Config2PolicyStatic;
321 "NETB: Removing %a %s - %r\n",
322 "IPv4 NVRAM config for MAC address",
329 "NETB: %a, %a %a %s\n",
332 "IPv4 NVRAM config for MAC address",
335 Status = EFI_NOT_FOUND;
STATIC EFI_STATUS Ip4Config2WriteConfigData(IN CHAR16 *VarName, EFI_IP4_CONFIG2_POLICY Policy, EFI_IP4_CONFIG2_MANUAL_ADDRESS *ManualAddress, EFI_IP_ADDRESS *Gateway, EFI_IPv4_ADDRESS *DnsAddress, UINTN DnsCount)
STATIC VOID AddDataRecord(IN OUT IP4_CONFIG2_VARIABLE *Variable, IN EFI_IP4_CONFIG2_DATA_TYPE DataType, IN VOID *Data, IN UINTN DataSize, IN OUT CHAR8 **Heap)