/** @file\r
EFI DHCP protocol implementation.\r
- \r
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
-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 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
// Clear initial time to make sure that elapsed-time is set to 0 for first Discover or REQUEST message.\r
//\r
DhcpSb->ActiveChild->ElaspedTime= 0;\r
- \r
+\r
if (DhcpSb->DhcpState == Dhcp4Init) {\r
DhcpSetState (DhcpSb, Dhcp4Selecting, FALSE);\r
Status = DhcpSendMessage (DhcpSb, NULL, NULL, DHCP_MSG_DISCOVER, NULL);\r
IN OUT DHCP_SERVICE *DhcpSb\r
)\r
{\r
- INTN Class;\r
-\r
DhcpSb->ClientAddr = EFI_NTOHL (DhcpSb->Selected->Dhcp4.Header.YourAddr);\r
\r
if (DhcpSb->Para != NULL) {\r
}\r
\r
if (DhcpSb->Netmask == 0) {\r
- Class = NetGetIpClass (DhcpSb->ClientAddr);\r
- ASSERT (Class < IP4_ADDR_CLASSE);\r
- DhcpSb->Netmask = gIp4AllMasks[Class << 3];\r
+ return EFI_ABORTED;\r
}\r
\r
if (DhcpSb->LeaseIoPort != NULL) {\r
}\r
}\r
\r
-\r
-/**\r
- Release the packet.\r
-\r
- @param[in] Arg The packet to release\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-DhcpReleasePacket (\r
- IN VOID *Arg\r
- )\r
-{\r
- FreePool (Arg);\r
-}\r
-\r
-\r
/**\r
Release the net buffer when packet is sent.\r
\r
//\r
Packet->Dhcp4.Magik = DHCP_OPTION_MAGIC;\r
Buf = Packet->Dhcp4.Option;\r
- Buf = DhcpAppendOption (Buf, DHCP_TAG_TYPE, 1, &Type);\r
+ Buf = DhcpAppendOption (Buf, DHCP4_TAG_MSG_TYPE, 1, &Type);\r
\r
//\r
// Append the serverid option if necessary:\r
ASSERT ((Para != NULL) && (Para->ServerId != 0));\r
\r
IpAddr = HTONL (Para->ServerId);\r
- Buf = DhcpAppendOption (Buf, DHCP_TAG_SERVER_ID, 4, (UINT8 *) &IpAddr);\r
+ Buf = DhcpAppendOption (Buf, DHCP4_TAG_SERVER_ID, 4, (UINT8 *) &IpAddr);\r
}\r
\r
//\r
}\r
\r
if (IpAddr != 0) {\r
- Buf = DhcpAppendOption (Buf, DHCP_TAG_REQUEST_IP, 4, (UINT8 *) &IpAddr);\r
+ Buf = DhcpAppendOption (Buf, DHCP4_TAG_REQUEST_IP, 4, (UINT8 *) &IpAddr);\r
}\r
\r
//\r
//\r
if ((Type != DHCP_MSG_DECLINE) && (Type != DHCP_MSG_RELEASE)) {\r
MaxMsg = HTONS (0xFF00);\r
- Buf = DhcpAppendOption (Buf, DHCP_TAG_MAXMSG, 2, (UINT8 *) &MaxMsg);\r
+ Buf = DhcpAppendOption (Buf, DHCP4_TAG_MAXMSG, 2, (UINT8 *) &MaxMsg);\r
}\r
\r
//\r
//\r
if (Msg != NULL) {\r
Len = MIN ((UINT32) AsciiStrLen ((CHAR8 *) Msg), 255);\r
- Buf = DhcpAppendOption (Buf, DHCP_TAG_MESSAGE, (UINT16) Len, Msg);\r
+ Buf = DhcpAppendOption (Buf, DHCP4_TAG_MESSAGE, (UINT16) Len, Msg);\r
}\r
\r
//\r
// if it is a DHCP decline or DHCP release .\r
//\r
if (((Type == DHCP_MSG_DECLINE) || (Type == DHCP_MSG_RELEASE)) &&\r
- (Config->OptionList[Index]->OpCode != DHCP_TAG_CLIENT_ID)) {\r
+ (Config->OptionList[Index]->OpCode != DHCP4_TAG_CLIENT_ID)) {\r
continue;\r
}\r
\r
}\r
}\r
\r
- *(Buf++) = DHCP_TAG_EOP;\r
+ *(Buf++) = DHCP4_TAG_EOP;\r
Packet->Length += (UINT32) (Buf - Packet->Dhcp4.Option);\r
\r
//\r
Packet->Dhcp4.Header.HwAddrLen\r
);\r
\r
-\r
//\r
// Wrap it into a netbuf then send it.\r
//\r
Frag.Bulk = (UINT8 *) &Packet->Dhcp4.Header;\r
Frag.Len = Packet->Length;\r
- Wrap = NetbufFromExt (&Frag, 1, 0, 0, DhcpReleasePacket, Packet);\r
+ Wrap = NetbufFromExt (&Frag, 1, 0, 0, DhcpDummyExtFree, NULL);\r
\r
if (Wrap == NULL) {\r
FreePool (Packet);\r
}\r
\r
ASSERT (UdpIo != NULL);\r
- NET_GET_REF (Wrap);\r
- \r
+\r
Status = UdpIoSendDatagram (\r
- UdpIo, \r
- Wrap, \r
- &EndPoint, \r
- NULL, \r
- DhcpOnPacketSent, \r
+ UdpIo,\r
+ Wrap,\r
+ &EndPoint,\r
+ NULL,\r
+ DhcpOnPacketSent,\r
DhcpSb\r
);\r
\r
if (EFI_ERROR (Status)) {\r
- NET_PUT_REF (Wrap);\r
+ NetbufFree (Wrap);\r
return EFI_ACCESS_DENIED;\r
}\r
\r
//\r
Frag.Bulk = (UINT8 *) &DhcpSb->LastPacket->Dhcp4.Header;\r
Frag.Len = DhcpSb->LastPacket->Length;\r
- Wrap = NetbufFromExt (&Frag, 1, 0, 0, DhcpReleasePacket, DhcpSb->LastPacket);\r
+ Wrap = NetbufFromExt (&Frag, 1, 0, 0, DhcpDummyExtFree, NULL);\r
\r
if (Wrap == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
- \r
+\r
//\r
// Broadcast the message, unless we know the server address.\r
//\r
\r
ASSERT (UdpIo != NULL);\r
\r
- NET_GET_REF (Wrap);\r
Status = UdpIoSendDatagram (\r
UdpIo,\r
Wrap,\r
);\r
\r
if (EFI_ERROR (Status)) {\r
- NET_PUT_REF (Wrap);\r
+ NetbufFree (Wrap);\r
return EFI_ACCESS_DENIED;\r
}\r
\r
IN VOID *Context\r
)\r
{\r
+ LIST_ENTRY *Entry;\r
+ LIST_ENTRY *Next;\r
DHCP_SERVICE *DhcpSb;\r
DHCP_PROTOCOL *Instance;\r
EFI_STATUS Status;\r
if (Instance != NULL && Instance->ElaspedTime < 0xffff) {\r
Instance->ElaspedTime++;\r
}\r
- \r
+\r
//\r
// Check the retransmit timer\r
//\r
goto ON_EXIT;\r
}\r
}\r
- \r
+\r
if (++DhcpSb->CurRetry < DhcpSb->MaxRetries) {\r
//\r
// Still has another try\r
goto END_SESSION;\r
}\r
}\r
- \r
+\r
//\r
// If an address has been acquired, check whether need to\r
// refresh or whether it has expired.\r
\r
if (Instance != NULL) {\r
Instance->ElaspedTime= 0;\r
- } \r
- \r
+ }\r
+\r
Status = DhcpSendMessage (\r
DhcpSb,\r
DhcpSb->Selected,\r
\r
if (Instance != NULL) {\r
Instance->ElaspedTime= 0;\r
- } \r
+ }\r
\r
Status = DhcpSendMessage (\r
DhcpSb,\r
}\r
\r
ON_EXIT:\r
- if ((Instance != NULL) && (Instance->Token != NULL)) {\r
+ //\r
+ // Iterate through all the DhcpSb Children.\r
+ //\r
+ NET_LIST_FOR_EACH_SAFE (Entry, Next, &DhcpSb->Children) {\r
+ Instance = NET_LIST_USER_STRUCT (Entry, DHCP_PROTOCOL, Link);\r
Instance->Timeout--;\r
- if (Instance->Timeout == 0) {\r
+ if (Instance->Timeout == 0 && Instance->Token != NULL) {\r
PxeDhcpDone (Instance);\r
}\r
}\r