/** @file\r
The implementation of the Udp4 protocol.\r
- \r
-Copyright (c) 2006 - 2009, Intel Corporation.<BR> \r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
\r
@param[in] Status The completion status of the output udp datagram.\r
@param[in] Context Pointer to the context data.\r
- @param[in] Sender Pointer to the Ip sender of the udp datagram.\r
+ @param[in] Sender Specify a pointer of EFI_IP4_PROTOCOL for sending.\r
@param[in] NotifyData Pointer to the notify data.\r
\r
**/\r
VOID\r
+EFIAPI\r
Udp4DgramSent (\r
- IN EFI_STATUS Status,\r
- IN VOID *Context,\r
- IN VOID *Sender,\r
- IN VOID *NotifyData\r
+ IN EFI_STATUS Status,\r
+ IN VOID *Context,\r
+ IN IP_IO_IP_PROTOCOL Sender,\r
+ IN VOID *NotifyData\r
);\r
\r
/**\r
\r
**/\r
VOID\r
+EFIAPI\r
Udp4DgramRcvd (\r
IN EFI_STATUS Status,\r
- IN ICMP_ERROR IcmpError,\r
+ IN UINT8 IcmpError,\r
IN EFI_NET_SESSION_DATA *NetSession,\r
IN NET_BUF *Packet,\r
IN VOID *Context\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
Udp4CancelTokens (\r
IN NET_MAP *Map,\r
IN NET_MAP_ITEM *Item,\r
);\r
\r
/**\r
- This function demultiplexes the received udp datagram to the apropriate instances.\r
+ This function demultiplexes the received udp datagram to the appropriate instances.\r
\r
@param[in] Udp4Service Pointer to the udp service context data.\r
- @param[in] NetSession Pointer to the EFI_NET_SESSION_DATA abstrated from\r
+ @param[in] NetSession Pointer to the EFI_NET_SESSION_DATA abstracted from\r
the received datagram.\r
@param[in] Packet Pointer to the buffer containing the received udp\r
datagram.\r
VOID\r
Udp4IcmpHandler (\r
IN UDP4_SERVICE_DATA *Udp4Service,\r
- IN ICMP_ERROR IcmpError,\r
+ IN UINT8 IcmpError,\r
IN EFI_NET_SESSION_DATA *NetSession,\r
IN NET_BUF *Packet\r
);\r
/**\r
Create the Udp service context data.\r
\r
- @param Udp4Service Pointer to the UDP4_SERVICE_DATA.\r
- @param ImageHandle The image handle of this udp4 driver.\r
- @param ControllerHandle The controller handle this udp4 driver binds on.\r
+ @param[in, out] Udp4Service Pointer to the UDP4_SERVICE_DATA.\r
+ @param[in] ImageHandle The image handle of this udp4 driver.\r
+ @param[in] ControllerHandle The controller handle this udp4 driver binds on.\r
\r
- @retval EFI_SUCCESS The udp4 service context data is created and\r
- initialized.\r
- @retval EFI_OUT_OF_RESOURCES Cannot allocate memory.\r
- @retval other Other error occurs.\r
+ @retval EFI_SUCCESS The udp4 service context data is created and\r
+ initialized.\r
+ @retval EFI_OUT_OF_RESOURCES Cannot allocate memory.\r
+ @retval other Other error occurs.\r
\r
**/\r
EFI_STATUS\r
IN EFI_HANDLE ControllerHandle\r
)\r
{\r
- EFI_STATUS Status;\r
- IP_IO_OPEN_DATA OpenData;\r
+ EFI_STATUS Status;\r
+ IP_IO_OPEN_DATA OpenData;\r
+ EFI_IP4_CONFIG_DATA *Ip4ConfigData;\r
\r
ZeroMem (Udp4Service, sizeof (UDP4_SERVICE_DATA));\r
\r
//\r
// Create the IpIo for this service context.\r
//\r
- Udp4Service->IpIo = IpIoCreate (ImageHandle, ControllerHandle);\r
+ Udp4Service->IpIo = IpIoCreate (ImageHandle, ControllerHandle, IP_VERSION_4);\r
if (Udp4Service->IpIo == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
//\r
// Set the OpenData used to open the IpIo.\r
//\r
- CopyMem (&OpenData.IpConfigData, &mIpIoDefaultIpConfigData, sizeof (OpenData.IpConfigData));\r
- OpenData.IpConfigData.AcceptBroadcast = TRUE;\r
- OpenData.RcvdContext = (VOID *) Udp4Service;\r
- OpenData.SndContext = NULL;\r
- OpenData.PktRcvdNotify = Udp4DgramRcvd;\r
- OpenData.PktSentNotify = Udp4DgramSent;\r
+ Ip4ConfigData = &OpenData.IpConfigData.Ip4CfgData;\r
+ CopyMem (Ip4ConfigData, &mIp4IoDefaultIpConfigData, sizeof (EFI_IP4_CONFIG_DATA));\r
+ Ip4ConfigData->AcceptBroadcast = TRUE;\r
+ OpenData.RcvdContext = (VOID *) Udp4Service;\r
+ OpenData.SndContext = NULL;\r
+ OpenData.PktRcvdNotify = Udp4DgramRcvd;\r
+ OpenData.PktSentNotify = Udp4DgramSent;\r
\r
//\r
// Configure and start the IpIo.\r
Wrap = NET_LIST_USER_STRUCT (WrapEntry, UDP4_RXDATA_WRAP, Link);\r
\r
//\r
- // TimeoutTick unit is ms, MNP_TIMEOUT_CHECK_INTERVAL unit is 100ns.\r
+ // TimeoutTick unit is microsecond, MNP_TIMEOUT_CHECK_INTERVAL unit is 100ns.\r
//\r
- if (Wrap->TimeoutTick <= (UDP4_TIMEOUT_INTERVAL / 10)) {\r
+ if (Wrap->TimeoutTick < (UDP4_TIMEOUT_INTERVAL / 10)) {\r
//\r
// Remove this RxData if it timeouts.\r
//\r
/**\r
This function intializes the new created udp instance.\r
\r
- @param Udp4Service Pointer to the UDP4_SERVICE_DATA.\r
- @param Instance Pointer to the un-initialized UDP4_INSTANCE_DATA.\r
+ @param[in] Udp4Service Pointer to the UDP4_SERVICE_DATA.\r
+ @param[in, out] Instance Pointer to the un-initialized UDP4_INSTANCE_DATA.\r
\r
**/\r
VOID\r
Instance->IcmpError = EFI_SUCCESS;\r
Instance->Configured = FALSE;\r
Instance->IsNoMapping = FALSE;\r
- Instance->Destroyed = FALSE;\r
+ Instance->InDestroy = FALSE;\r
}\r
\r
\r
This function tries to bind the udp instance according to the configured port\r
allocation strategy.\r
\r
- @param InstanceList Pointer to the head of the list linking the udp\r
+ @param[in] InstanceList Pointer to the head of the list linking the udp\r
instances.\r
- @param ConfigData Pointer to the ConfigData of the instance to be\r
+ @param[in, out] ConfigData Pointer to the ConfigData of the instance to be\r
bound. ConfigData->StationPort will be assigned\r
with an available port value on success.\r
\r
IN OUT EFI_IP4_CONFIG_DATA *Ip4ConfigData\r
)\r
{\r
- CopyMem (Ip4ConfigData, &mIpIoDefaultIpConfigData, sizeof (*Ip4ConfigData));\r
+ CopyMem (Ip4ConfigData, &mIp4IoDefaultIpConfigData, sizeof (*Ip4ConfigData));\r
\r
Ip4ConfigData->DefaultProtocol = EFI_IP_PROTO_UDP;\r
Ip4ConfigData->AcceptBroadcast = Udp4ConfigData->AcceptBroadcast;\r
if (TxData->GatewayAddress != NULL) {\r
CopyMem (&GatewayAddress, TxData->GatewayAddress, sizeof (IP4_ADDR));\r
\r
- if (!Ip4IsUnicast (NTOHL (GatewayAddress), 0)) {\r
+ if (!Instance->ConfigData.UseDefaultAddress &&\r
+ (EFI_NTOHL(Instance->ConfigData.SubnetMask) != 0) &&\r
+ !NetIp4IsUnicast (NTOHL (GatewayAddress), EFI_NTOHL(Instance->ConfigData.SubnetMask))) {\r
//\r
// The specified GatewayAddress is not a unicast IPv4 address while it's not 0.\r
//\r
\r
CopyMem (&SourceAddress, &UdpSessionData->SourceAddress, sizeof (IP4_ADDR));\r
\r
- if ((SourceAddress != 0) && !Ip4IsUnicast (HTONL (SourceAddress), 0)) {\r
+ if ((SourceAddress != 0) &&\r
+ !Instance->ConfigData.UseDefaultAddress &&\r
+ (EFI_NTOHL(Instance->ConfigData.SubnetMask) != 0) &&\r
+ !NetIp4IsUnicast (HTONL (SourceAddress), EFI_NTOHL(Instance->ConfigData.SubnetMask))) {\r
//\r
// Check whether SourceAddress is a valid IPv4 address in case it's not zero.\r
// The configured station address is used if SourceAddress is zero.\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
Udp4TokenExist (\r
IN NET_MAP *Map,\r
IN NET_MAP_ITEM *Item,\r
/**\r
This function removes the specified Token from the TokenMap.\r
\r
- @param TokenMap Pointer to the NET_MAP containing the tokens.\r
- @param Token Pointer to the Token to be removed.\r
+ @param[in, out] TokenMap Pointer to the NET_MAP containing the tokens.\r
+ @param[in] Token Pointer to the Token to be removed.\r
\r
@retval EFI_SUCCESS The specified Token is removed from the TokenMap.\r
@retval EFI_NOT_FOUND The specified Token is not found in the TokenMap.\r
\r
@param[in] Status The completion status of the output udp datagram.\r
@param[in] Context Pointer to the context data.\r
- @param[in] Sender Pointer to the Ip sender of the udp datagram.\r
+ @param[in] Sender Specify a pointer of EFI_IP4_PROTOCOL for sending.\r
@param[in] NotifyData Pointer to the notify data.\r
\r
**/\r
VOID\r
+EFIAPI\r
Udp4DgramSent (\r
- IN EFI_STATUS Status,\r
- IN VOID *Context,\r
- IN VOID *Sender,\r
- IN VOID *NotifyData\r
+ IN EFI_STATUS Status,\r
+ IN VOID *Context,\r
+ IN IP_IO_IP_PROTOCOL Sender,\r
+ IN VOID *NotifyData\r
)\r
{\r
UDP4_INSTANCE_DATA *Instance;\r
//\r
Token->Status = Status;\r
gBS->SignalEvent (Token->Event);\r
- NetLibDispatchDpc ();\r
+ DispatchDpc ();\r
}\r
}\r
\r
\r
**/\r
VOID\r
+EFIAPI\r
Udp4DgramRcvd (\r
IN EFI_STATUS Status,\r
- IN ICMP_ERROR IcmpError,\r
+ IN UINT8 IcmpError,\r
IN EFI_NET_SESSION_DATA *NetSession,\r
IN NET_BUF *Packet,\r
IN VOID *Context\r
// Dispatch the DPC queued by the NotifyFunction of the rx token's events\r
// which are signaled with received data.\r
//\r
- NetLibDispatchDpc ();\r
+ DispatchDpc ();\r
}\r
\r
\r
/**\r
This function removes the multicast group specified by Arg from the Map.\r
\r
- @param Map Pointer to the NET_MAP.\r
- @param Item Pointer to the NET_MAP_ITEM.\r
- @param Arg Pointer to the Arg, it's the pointer to a\r
+ @param[in, out] Map Pointer to the NET_MAP.\r
+ @param[in] Item Pointer to the NET_MAP_ITEM.\r
+ @param[in] Arg Pointer to the Arg, it's the pointer to a\r
multicast IPv4 Address.\r
\r
@retval EFI_SUCCESS The multicast address is removed.\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
Udp4LeaveGroup (\r
IN OUT NET_MAP *Map,\r
IN NET_MAP_ITEM *Item,\r
\r
**/\r
EFI_STATUS\r
+EFIAPI\r
Udp4CancelTokens (\r
IN NET_MAP *Map,\r
IN NET_MAP_ITEM *Item,\r
//\r
gBS->CloseEvent (Wrap->RxData.RecycleSignal);\r
\r
- gBS->FreePool (Wrap);\r
+ FreePool (Wrap);\r
}\r
\r
\r
&Wrap->RxData.RecycleSignal\r
);\r
if (EFI_ERROR (Status)) {\r
- gBS->FreePool (Wrap);\r
+ FreePool (Wrap);\r
return NULL;\r
}\r
\r
\r
\r
/**\r
- This function demultiplexes the received udp datagram to the apropriate instances.\r
+ This function demultiplexes the received udp datagram to the appropriate instances.\r
\r
@param[in] Udp4Service Pointer to the udp service context data.\r
- @param[in] NetSession Pointer to the EFI_NET_SESSION_DATA abstrated from\r
+ @param[in] NetSession Pointer to the EFI_NET_SESSION_DATA abstracted from\r
the received datagram.\r
@param[in] Packet Pointer to the buffer containing the received udp\r
datagram.\r
IN NET_BUF *Packet\r
)\r
{\r
- EFI_UDP4_HEADER *Udp4Header;\r
+ EFI_UDP_HEADER *Udp4Header;\r
UINT16 HeadSum;\r
EFI_UDP4_RECEIVE_DATA RxData;\r
EFI_UDP4_SESSION_DATA *Udp4Session;\r
UINTN Enqueued;\r
\r
+ if (Packet->TotalSize < sizeof (EFI_UDP_HEADER)) {\r
+ NetbufFree (Packet);\r
+ return;\r
+ }\r
+\r
//\r
// Get the datagram header from the packet buffer.\r
//\r
- Udp4Header = (EFI_UDP4_HEADER *) NetbufGetByte (Packet, 0, NULL);\r
+ Udp4Header = (EFI_UDP_HEADER *) NetbufGetByte (Packet, 0, NULL);\r
+ ASSERT (Udp4Header != NULL);\r
\r
if (Udp4Header->Checksum != 0) {\r
//\r
// check the checksum.\r
//\r
HeadSum = NetPseudoHeadChecksum (\r
- NetSession->Source,\r
- NetSession->Dest,\r
+ NetSession->Source.Addr[0],\r
+ NetSession->Dest.Addr[0],\r
EFI_IP_PROTO_UDP,\r
0\r
);\r
//\r
// Wrong checksum.\r
//\r
+ NetbufFree (Packet);\r
return;\r
}\r
}\r
\r
- gRT->GetTime (&RxData.TimeStamp, NULL);\r
-\r
Udp4Session = &RxData.UdpSession;\r
Udp4Session->SourcePort = NTOHS (Udp4Header->SrcPort);\r
Udp4Session->DestinationPort = NTOHS (Udp4Header->DstPort);\r
IP_IO_OVERRIDE Override;\r
IP_IO_IP_INFO *IpSender;\r
\r
- IpSender = IpIoFindSender (&IpIo, NetSession->Dest);\r
+ IpSender = IpIoFindSender (&IpIo, NetSession->IpVersion, &NetSession->Dest);\r
if (IpSender == NULL) {\r
//\r
- // No apropriate sender, since we cannot send out the ICMP message through\r
+ // No appropriate sender, since we cannot send out the ICMP message through\r
// the default zero station address IP instance, abort.\r
//\r
return;\r
}\r
\r
- IpHdr = NetSession->IpHdr;\r
+ IpHdr = NetSession->IpHdr.Ip4Hdr;\r
\r
//\r
- // Calculate the requried length of the icmp error message.\r
+ // Calculate the required length of the icmp error message.\r
//\r
Len = sizeof (IP4_ICMP_ERROR_HEAD) + (EFI_IP4_HEADER_LEN (IpHdr) -\r
sizeof (IP4_HEAD)) + ICMP_ERROR_PACKET_LENGTH;\r
//\r
// Fill the override data.\r
//\r
- Override.DoNotFragment = FALSE;\r
- Override.TypeOfService = 0;\r
- Override.TimeToLive = 255;\r
- Override.Protocol = EFI_IP_PROTO_ICMP;\r
+ Override.Ip4OverrideData.DoNotFragment = FALSE;\r
+ Override.Ip4OverrideData.TypeOfService = 0;\r
+ Override.Ip4OverrideData.TimeToLive = 255;\r
+ Override.Ip4OverrideData.Protocol = EFI_IP_PROTO_ICMP;\r
\r
- CopyMem (&Override.SourceAddress, &NetSession->Dest, sizeof (EFI_IPv4_ADDRESS));\r
- ZeroMem (&Override.GatewayAddress, sizeof (EFI_IPv4_ADDRESS));\r
+ CopyMem (&Override.Ip4OverrideData.SourceAddress, &NetSession->Dest, sizeof (EFI_IPv4_ADDRESS));\r
+ ZeroMem (&Override.Ip4OverrideData.GatewayAddress, sizeof (EFI_IPv4_ADDRESS));\r
\r
//\r
// Send out this icmp packet.\r
//\r
- IpIoSend (IpIo, Packet, IpSender, NULL, NULL, NetSession->Source, &Override);\r
+ IpIoSend (IpIo, Packet, IpSender, NULL, NULL, &NetSession->Source, &Override);\r
\r
NetbufFree (Packet);\r
}\r
VOID\r
Udp4IcmpHandler (\r
IN UDP4_SERVICE_DATA *Udp4Service,\r
- IN ICMP_ERROR IcmpError,\r
+ IN UINT8 IcmpError,\r
IN EFI_NET_SESSION_DATA *NetSession,\r
IN NET_BUF *Packet\r
)\r
{\r
- EFI_UDP4_HEADER *Udp4Header;\r
+ EFI_UDP_HEADER *Udp4Header;\r
EFI_UDP4_SESSION_DATA Udp4Session;\r
LIST_ENTRY *Entry;\r
UDP4_INSTANCE_DATA *Instance;\r
\r
- Udp4Header = (EFI_UDP4_HEADER *) NetbufGetByte (Packet, 0, NULL);\r
+ if (Packet->TotalSize < sizeof (EFI_UDP_HEADER)) {\r
+ NetbufFree (Packet);\r
+ return;\r
+ }\r
+\r
+ Udp4Header = (EFI_UDP_HEADER *) NetbufGetByte (Packet, 0, NULL);\r
+ ASSERT (Udp4Header != NULL);\r
\r
CopyMem (&Udp4Session.SourceAddress, &NetSession->Source, sizeof (EFI_IPv4_ADDRESS));\r
CopyMem (&Udp4Session.DestinationAddress, &NetSession->Dest, sizeof (EFI_IPv4_ADDRESS));\r
//\r
Instance = NET_LIST_USER_STRUCT (Entry, UDP4_INSTANCE_DATA, Link);\r
\r
- if (!Instance->Configured ||\r
- Instance->ConfigData.AcceptPromiscuous ||\r
- Instance->ConfigData.AcceptAnyPort ||\r
- EFI_IP4_EQUAL (&Instance->ConfigData.StationAddress, &mZeroIp4Addr)\r
- ) {\r
- //\r
- // Don't try to deliver the ICMP error to this instance if it is not configured,\r
- // or it's configured to be promiscuous or accept any port or accept all the\r
- // datagrams.\r
- //\r
+ if (!Instance->Configured) {\r
continue;\r
}\r
\r
//\r
// Translate the Icmp Error code according to the udp spec.\r
//\r
- Instance->IcmpError = IpIoGetIcmpErrStatus (IcmpError, NULL, NULL);\r
+ Instance->IcmpError = IpIoGetIcmpErrStatus (IcmpError, IP_VERSION_4, NULL, NULL);\r
\r
if (IcmpError > ICMP_ERR_UNREACH_PORT) {\r
Instance->IcmpError = EFI_ICMP_ERROR;\r
\r
**/\r
VOID\r
+EFIAPI\r
Udp4NetVectorExtFree (\r
VOID *Context\r
)\r
{\r
}\r
\r
-\r
-/**\r
- Set the Udp4 variable data.\r
-\r
- @param Udp4Service Udp4 service data.\r
-\r
- @retval EFI_OUT_OF_RESOURCES There are not enough resources to set the\r
- variable.\r
- @retval EFI_SUCCESS Set variable successfully.\r
- @retval other Set variable failed.\r
-\r
-**/\r
-EFI_STATUS\r
-Udp4SetVariableData (\r
- IN UDP4_SERVICE_DATA *Udp4Service\r
- )\r
-{\r
- UINT32 NumConfiguredInstance;\r
- LIST_ENTRY *Entry;\r
- UINTN VariableDataSize;\r
- EFI_UDP4_VARIABLE_DATA *Udp4VariableData;\r
- EFI_UDP4_SERVICE_POINT *Udp4ServicePoint;\r
- UDP4_INSTANCE_DATA *Udp4Instance;\r
- CHAR16 *NewMacString;\r
- EFI_STATUS Status;\r
-\r
- NumConfiguredInstance = 0;\r
-\r
- //\r
- // Go through the children list to count the configured children.\r
- //\r
- NET_LIST_FOR_EACH (Entry, &Udp4Service->ChildrenList) {\r
- Udp4Instance = NET_LIST_USER_STRUCT_S (\r
- Entry,\r
- UDP4_INSTANCE_DATA,\r
- Link,\r
- UDP4_INSTANCE_DATA_SIGNATURE\r
- );\r
-\r
- if (Udp4Instance->Configured) {\r
- NumConfiguredInstance++;\r
- }\r
- }\r
-\r
- //\r
- // Calculate the size of the Udp4VariableData. As there may be no Udp4 child,\r
- // we should add extra buffer for the service points only if the number of configured\r
- // children is more than 1.\r
- //\r
- VariableDataSize = sizeof (EFI_UDP4_VARIABLE_DATA);\r
-\r
- if (NumConfiguredInstance > 1) {\r
- VariableDataSize += sizeof (EFI_UDP4_SERVICE_POINT) * (NumConfiguredInstance - 1);\r
- }\r
-\r
- Udp4VariableData = AllocatePool (VariableDataSize);\r
- if (Udp4VariableData == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- Udp4VariableData->DriverHandle = Udp4Service->ImageHandle;\r
- Udp4VariableData->ServiceCount = NumConfiguredInstance;\r
-\r
- Udp4ServicePoint = &Udp4VariableData->Services[0];\r
-\r
- //\r
- // Go through the children list to fill the configured children's address pairs.\r
- //\r
- NET_LIST_FOR_EACH (Entry, &Udp4Service->ChildrenList) {\r
- Udp4Instance = NET_LIST_USER_STRUCT_S (\r
- Entry,\r
- UDP4_INSTANCE_DATA,\r
- Link,\r
- UDP4_INSTANCE_DATA_SIGNATURE\r
- );\r
-\r
- if (Udp4Instance->Configured) {\r
- Udp4ServicePoint->InstanceHandle = Udp4Instance->ChildHandle;\r
- Udp4ServicePoint->LocalAddress = Udp4Instance->ConfigData.StationAddress;\r
- Udp4ServicePoint->LocalPort = Udp4Instance->ConfigData.StationPort;\r
- Udp4ServicePoint->RemoteAddress = Udp4Instance->ConfigData.RemoteAddress;\r
- Udp4ServicePoint->RemotePort = Udp4Instance->ConfigData.RemotePort;\r
-\r
- Udp4ServicePoint++;\r
- }\r
- }\r
-\r
- //\r
- // Get the mac string.\r
- //\r
- Status = NetLibGetMacString (\r
- Udp4Service->ControllerHandle,\r
- Udp4Service->ImageHandle,\r
- &NewMacString\r
- );\r
- if (EFI_ERROR (Status)) {\r
- goto ON_ERROR;\r
- }\r
-\r
- if (Udp4Service->MacString != NULL) {\r
- //\r
- // The variable is set already, we're going to update it.\r
- //\r
- if (StrCmp (Udp4Service->MacString, NewMacString) != 0) {\r
- //\r
- // The mac address is changed, delete the previous variable first.\r
- //\r
- gRT->SetVariable (\r
- Udp4Service->MacString,\r
- &gEfiUdp4ServiceBindingProtocolGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- 0,\r
- NULL\r
- );\r
- }\r
-\r
- gBS->FreePool (Udp4Service->MacString);\r
- }\r
-\r
- Udp4Service->MacString = NewMacString;\r
-\r
- Status = gRT->SetVariable (\r
- Udp4Service->MacString,\r
- &gEfiUdp4ServiceBindingProtocolGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- VariableDataSize,\r
- (VOID *) Udp4VariableData\r
- );\r
-\r
-ON_ERROR:\r
-\r
- gBS->FreePool (Udp4VariableData);\r
-\r
- return Status;\r
-}\r
-\r
-\r
-/**\r
- Clear the variable and free the resource.\r
-\r
- @param[[in] Udp4Service Udp4 service data.\r
-\r
-**/\r
-VOID\r
-Udp4ClearVariableData (\r
- IN UDP4_SERVICE_DATA *Udp4Service\r
- )\r
-{\r
- ASSERT (Udp4Service->MacString != NULL);\r
-\r
- gRT->SetVariable (\r
- Udp4Service->MacString,\r
- &gEfiUdp4ServiceBindingProtocolGuid,\r
- EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
- 0,\r
- NULL\r
- );\r
-\r
- gBS->FreePool (Udp4Service->MacString);\r
- Udp4Service->MacString = NULL;\r
-}\r