/** @file\r
Functions implementation related with DHCPv4 for HTTP boot driver.\r
\r
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
This program and the accompanying materials are licensed and made available under \r
the terms and conditions of the BSD License that accompanies this distribution. \r
The full text of the license may be found at\r
// This is a map from the interested DHCP4 option tags' index to the tag value.\r
//\r
UINT8 mInterestedDhcp4Tags[HTTP_BOOT_DHCP4_TAG_INDEX_MAX] = {\r
- HTTP_BOOT_DHCP4_TAG_BOOTFILE_LEN,\r
- HTTP_BOOT_DHCP4_TAG_OVERLOAD,\r
- HTTP_BOOT_DHCP4_TAG_MSG_TYPE,\r
- HTTP_BOOT_DHCP4_TAG_SERVER_ID,\r
- HTTP_BOOT_DHCP4_TAG_CLASS_ID,\r
- HTTP_BOOT_DHCP4_TAG_BOOTFILE,\r
- HTTP_BOOT_DHCP4_TAG_DNS_SERVER\r
+ DHCP4_TAG_BOOTFILE_LEN,\r
+ DHCP4_TAG_OVERLOAD,\r
+ DHCP4_TAG_MSG_TYPE,\r
+ DHCP4_TAG_SERVER_ID,\r
+ DHCP4_TAG_VENDOR_CLASS_ID,\r
+ DHCP4_TAG_BOOTFILE,\r
+ DHCP4_TAG_DNS_SERVER\r
};\r
\r
//\r
//\r
// Append parameter request list option.\r
//\r
- OptList[Index]->OpCode = HTTP_BOOT_DHCP4_TAG_PARA_LIST;\r
+ OptList[Index]->OpCode = DHCP4_TAG_PARA_LIST;\r
OptList[Index]->Length = 27;\r
OptEnt.Para = (HTTP_BOOT_DHCP4_OPTION_PARA *) OptList[Index]->Data;\r
- OptEnt.Para->ParaList[0] = HTTP_BOOT_DHCP4_TAG_NETMASK;\r
- OptEnt.Para->ParaList[1] = HTTP_BOOT_DHCP4_TAG_TIME_OFFSET;\r
- OptEnt.Para->ParaList[2] = HTTP_BOOT_DHCP4_TAG_ROUTER;\r
- OptEnt.Para->ParaList[3] = HTTP_BOOT_DHCP4_TAG_TIME_SERVER;\r
- OptEnt.Para->ParaList[4] = HTTP_BOOT_DHCP4_TAG_NAME_SERVER;\r
- OptEnt.Para->ParaList[5] = HTTP_BOOT_DHCP4_TAG_DNS_SERVER;\r
- OptEnt.Para->ParaList[6] = HTTP_BOOT_DHCP4_TAG_HOSTNAME;\r
- OptEnt.Para->ParaList[7] = HTTP_BOOT_DHCP4_TAG_BOOTFILE_LEN;\r
- OptEnt.Para->ParaList[8] = HTTP_BOOT_DHCP4_TAG_DOMAINNAME;\r
- OptEnt.Para->ParaList[9] = HTTP_BOOT_DHCP4_TAG_ROOTPATH;\r
- OptEnt.Para->ParaList[10] = HTTP_BOOT_DHCP4_TAG_EXTEND_PATH;\r
- OptEnt.Para->ParaList[11] = HTTP_BOOT_DHCP4_TAG_EMTU;\r
- OptEnt.Para->ParaList[12] = HTTP_BOOT_DHCP4_TAG_TTL;\r
- OptEnt.Para->ParaList[13] = HTTP_BOOT_DHCP4_TAG_BROADCAST;\r
- OptEnt.Para->ParaList[14] = HTTP_BOOT_DHCP4_TAG_NIS_DOMAIN;\r
- OptEnt.Para->ParaList[15] = HTTP_BOOT_DHCP4_TAG_NIS_SERVER;\r
- OptEnt.Para->ParaList[16] = HTTP_BOOT_DHCP4_TAG_NTP_SERVER;\r
- OptEnt.Para->ParaList[17] = HTTP_BOOT_DHCP4_TAG_VENDOR;\r
- OptEnt.Para->ParaList[18] = HTTP_BOOT_DHCP4_TAG_REQUEST_IP;\r
- OptEnt.Para->ParaList[19] = HTTP_BOOT_DHCP4_TAG_LEASE;\r
- OptEnt.Para->ParaList[20] = HTTP_BOOT_DHCP4_TAG_SERVER_ID;\r
- OptEnt.Para->ParaList[21] = HTTP_BOOT_DHCP4_TAG_T1;\r
- OptEnt.Para->ParaList[22] = HTTP_BOOT_DHCP4_TAG_T2;\r
- OptEnt.Para->ParaList[23] = HTTP_BOOT_DHCP4_TAG_CLASS_ID;\r
- OptEnt.Para->ParaList[25] = HTTP_BOOT_DHCP4_TAG_BOOTFILE;\r
- OptEnt.Para->ParaList[26] = HTTP_BOOT_DHCP4_TAG_UUID;\r
+ OptEnt.Para->ParaList[0] = DHCP4_TAG_NETMASK;\r
+ OptEnt.Para->ParaList[1] = DHCP4_TAG_TIME_OFFSET;\r
+ OptEnt.Para->ParaList[2] = DHCP4_TAG_ROUTER;\r
+ OptEnt.Para->ParaList[3] = DHCP4_TAG_TIME_SERVER;\r
+ OptEnt.Para->ParaList[4] = DHCP4_TAG_NAME_SERVER;\r
+ OptEnt.Para->ParaList[5] = DHCP4_TAG_DNS_SERVER;\r
+ OptEnt.Para->ParaList[6] = DHCP4_TAG_HOSTNAME;\r
+ OptEnt.Para->ParaList[7] = DHCP4_TAG_BOOTFILE_LEN;\r
+ OptEnt.Para->ParaList[8] = DHCP4_TAG_DOMAINNAME;\r
+ OptEnt.Para->ParaList[9] = DHCP4_TAG_ROOTPATH;\r
+ OptEnt.Para->ParaList[10] = DHCP4_TAG_EXTEND_PATH;\r
+ OptEnt.Para->ParaList[11] = DHCP4_TAG_EMTU;\r
+ OptEnt.Para->ParaList[12] = DHCP4_TAG_TTL;\r
+ OptEnt.Para->ParaList[13] = DHCP4_TAG_BROADCAST;\r
+ OptEnt.Para->ParaList[14] = DHCP4_TAG_NIS_DOMAIN;\r
+ OptEnt.Para->ParaList[15] = DHCP4_TAG_NIS_SERVER;\r
+ OptEnt.Para->ParaList[16] = DHCP4_TAG_NTP_SERVER;\r
+ OptEnt.Para->ParaList[17] = DHCP4_TAG_VENDOR;\r
+ OptEnt.Para->ParaList[18] = DHCP4_TAG_REQUEST_IP;\r
+ OptEnt.Para->ParaList[19] = DHCP4_TAG_LEASE;\r
+ OptEnt.Para->ParaList[20] = DHCP4_TAG_SERVER_ID;\r
+ OptEnt.Para->ParaList[21] = DHCP4_TAG_T1;\r
+ OptEnt.Para->ParaList[22] = DHCP4_TAG_T2;\r
+ OptEnt.Para->ParaList[23] = DHCP4_TAG_VENDOR_CLASS_ID;\r
+ OptEnt.Para->ParaList[25] = DHCP4_TAG_BOOTFILE;\r
+ OptEnt.Para->ParaList[26] = DHCP4_TAG_UUID;\r
Index++;\r
OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);\r
\r
//\r
// Append UUID/Guid-based client identifier option\r
//\r
- OptList[Index]->OpCode = HTTP_BOOT_DHCP4_TAG_UUID;\r
+ OptList[Index]->OpCode = DHCP4_TAG_UUID;\r
OptList[Index]->Length = (UINT8) sizeof (HTTP_BOOT_DHCP4_OPTION_UUID);\r
OptEnt.Uuid = (HTTP_BOOT_DHCP4_OPTION_UUID *) OptList[Index]->Data;\r
OptEnt.Uuid->Type = 0;\r
//\r
// Append client network device interface option\r
//\r
- OptList[Index]->OpCode = HTTP_BOOT_DHCP4_TAG_UNDI;\r
+ OptList[Index]->OpCode = DHCP4_TAG_UNDI;\r
OptList[Index]->Length = (UINT8) sizeof (HTTP_BOOT_DHCP4_OPTION_UNDI);\r
OptEnt.Undi = (HTTP_BOOT_DHCP4_OPTION_UNDI *) OptList[Index]->Data;\r
\r
//\r
// Append client system architecture option\r
//\r
- OptList[Index]->OpCode = HTTP_BOOT_DHCP4_TAG_ARCH;\r
+ OptList[Index]->OpCode = DHCP4_TAG_ARCH;\r
OptList[Index]->Length = (UINT8) sizeof (HTTP_BOOT_DHCP4_OPTION_ARCH);\r
OptEnt.Arch = (HTTP_BOOT_DHCP4_OPTION_ARCH *) OptList[Index]->Data;\r
Value = HTONS (EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE);\r
//\r
// Append vendor class identify option\r
//\r
- OptList[Index]->OpCode = HTTP_BOOT_DHCP4_TAG_CLASS_ID;\r
+ OptList[Index]->OpCode = DHCP4_TAG_VENDOR_CLASS_ID;\r
OptList[Index]->Length = (UINT8) sizeof (HTTP_BOOT_DHCP4_OPTION_CLID);\r
OptEnt.Clid = (HTTP_BOOT_DHCP4_OPTION_CLID *) OptList[Index]->Data;\r
CopyMem (\r
Option = (EFI_DHCP4_PACKET_OPTION *) Buffer;\r
Offset = 0;\r
\r
- while (Offset < Length && Option->OpCode != HTTP_BOOT_DHCP4_TAG_EOP) {\r
+ while (Offset < Length && Option->OpCode != DHCP4_TAG_EOP) {\r
\r
if (Option->OpCode == OptTag) {\r
//\r
//\r
// Skip the current option to the next.\r
//\r
- if (Option->OpCode == HTTP_BOOT_DHCP4_TAG_PAD) {\r
+ if (Option->OpCode == DHCP4_TAG_PAD) {\r
Offset++;\r
} else {\r
Offset += Option->Length + 2;\r
EFI_STATUS Status;\r
HTTP_BOOT_OFFER_TYPE OfferType;\r
EFI_IPv4_ADDRESS IpAddr;\r
+ BOOLEAN FileFieldOverloaded;\r
\r
IsDnsOffer = FALSE;\r
IpExpressedUri = FALSE;\r
IsProxyOffer = FALSE;\r
IsHttpOffer = FALSE;\r
+ FileFieldOverloaded = FALSE;\r
\r
ZeroMem (Cache4->OptList, sizeof (Cache4->OptList));\r
\r
Option = Options[HTTP_BOOT_DHCP4_TAG_INDEX_OVERLOAD];\r
if (Option != NULL) {\r
if ((Option->Data[0] & HTTP_BOOT_DHCP4_OVERLOAD_FILE) != 0) {\r
+ FileFieldOverloaded = TRUE;\r
for (Index = 0; Index < HTTP_BOOT_DHCP4_TAG_INDEX_MAX; Index++) {\r
if (Options[Index] == NULL) {\r
Options[Index] = HttpBootParseDhcp4Options (\r
}\r
\r
//\r
- // The offer with "HttpClient" is a Http offer.\r
+ // The offer with "HTTPClient" is a Http offer.\r
//\r
Option = Options[HTTP_BOOT_DHCP4_TAG_INDEX_CLASS_ID];\r
if ((Option != NULL) && (Option->Length >= 9) &&\r
if (*(Ptr8 - 1) != '\0') {\r
*Ptr8 = '\0';\r
}\r
- } else if (Offer->Dhcp4.Header.BootFileName[0] != 0) {\r
+ } else if (!FileFieldOverloaded && Offer->Dhcp4.Header.BootFileName[0] != 0) {\r
//\r
// If the bootfile is not present and bootfilename is present in DHCPv4 packet, just parse it.\r
// Do not count dhcp option header here, or else will destroy the serverhostname.\r
//\r
if (IsHttpOffer) {\r
if (IpExpressedUri) {\r
- OfferType = IsProxyOffer ? HttpOfferTypeProxyIpUri : HttpOfferTypeDhcpIpUri;\r
+ if (IsProxyOffer) {\r
+ OfferType = HttpOfferTypeProxyIpUri;\r
+ } else {\r
+ OfferType = IsDnsOffer ? HttpOfferTypeDhcpIpUriDns : HttpOfferTypeDhcpIpUri;\r
+ }\r
} else {\r
if (!IsProxyOffer) {\r
OfferType = IsDnsOffer ? HttpOfferTypeDhcpNameUriDns : HttpOfferTypeDhcpNameUri;\r
}\r
\r
/**\r
- Select an DHCPv4 offer, and record SelectIndex and SelectProxyType.\r
+ Select an DHCPv4 or DHCP6 offer, and record SelectIndex and SelectProxyType.\r
\r
@param[in] Private Pointer to HTTP boot driver private data.\r
\r
**/\r
VOID\r
-HttpBootSelectDhcp4Offer (\r
+HttpBootSelectDhcpOffer (\r
IN HTTP_BOOT_PRIVATE_DATA *Private\r
)\r
{\r
Private->SelectIndex = 0;\r
Private->SelectProxyType = HttpOfferTypeMax;\r
- \r
- //\r
- // Priority1: HttpOfferTypeDhcpIpUri \r
- // Priority2: HttpOfferTypeDhcpNameUriDns \r
- // Priority3: HttpOfferTypeDhcpOnly + HttpOfferTypeProxyIpUri \r
- // Priority4: HttpOfferTypeDhcpDns + HttpOfferTypeProxyIpUri \r
- // Priority5: HttpOfferTypeDhcpDns + HttpOfferTypeProxyNameUri\r
- // Priority6: HttpOfferTypeDhcpDns + HttpOfferTypeDhcpNameUri \r
- // \r
- if (Private->OfferCount[HttpOfferTypeDhcpIpUri] > 0) {\r
+\r
+ if (Private->FilePathUri != NULL) {\r
+ //\r
+ // We are in home environment, the URI is already specified.\r
+ // Just need to choose a DHCP offer.\r
+ // The offer with DNS server address takes priority here.\r
+ //\r
+ if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0) {\r
+ \r
+ Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;\r
+ \r
+ } else if (Private->OfferCount[HttpOfferTypeDhcpIpUriDns] > 0) {\r
\r
- Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpIpUri][0] + 1;\r
+ Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpIpUriDns][0] + 1;\r
+ \r
+ } else if (Private->OfferCount[HttpOfferTypeDhcpNameUriDns] > 0) {\r
\r
- } else if (Private->OfferCount[HttpOfferTypeDhcpNameUriDns] > 0) {\r
- \r
- Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpNameUriDns][0] + 1;\r
+ Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpNameUriDns][0] + 1;\r
+ \r
+ } else if (Private->OfferCount[HttpOfferTypeDhcpOnly] > 0) {\r
\r
- } else if (Private->OfferCount[HttpOfferTypeDhcpOnly] > 0 &&\r
- Private->OfferCount[HttpOfferTypeProxyIpUri] > 0) {\r
- \r
- Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpOnly][0] + 1;\r
- Private->SelectProxyType = HttpOfferTypeProxyIpUri;\r
+ Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpOnly][0] + 1;\r
+ \r
+ } else if (Private->OfferCount[HttpOfferTypeDhcpIpUri] > 0) {\r
\r
- } else if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0 &&\r
- Private->OfferCount[HttpOfferTypeProxyIpUri] > 0) {\r
- \r
- Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;\r
- Private->SelectProxyType = HttpOfferTypeProxyIpUri;\r
+ Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpIpUri][0] + 1;\r
+ }\r
\r
- } else if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0 &&\r
- Private->OfferCount[HttpOfferTypeProxyNameUri] > 0) {\r
- \r
- Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;\r
- Private->SelectProxyType = HttpOfferTypeProxyNameUri;\r
+ } else {\r
+ //\r
+ // We are in corporate environment.\r
+ //\r
+ // Priority1: HttpOfferTypeDhcpIpUri or HttpOfferTypeDhcpIpUriDns\r
+ // Priority2: HttpOfferTypeDhcpNameUriDns \r
+ // Priority3: HttpOfferTypeDhcpOnly + HttpOfferTypeProxyIpUri \r
+ // Priority4: HttpOfferTypeDhcpDns + HttpOfferTypeProxyIpUri \r
+ // Priority5: HttpOfferTypeDhcpDns + HttpOfferTypeProxyNameUri\r
+ // Priority6: HttpOfferTypeDhcpDns + HttpOfferTypeDhcpNameUri \r
+ // \r
+ if (Private->OfferCount[HttpOfferTypeDhcpIpUri] > 0) {\r
+ \r
+ Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpIpUri][0] + 1;\r
+ \r
+ } else if (Private->OfferCount[HttpOfferTypeDhcpIpUriDns] > 0) {\r
+ \r
+ Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpIpUriDns][0] + 1;\r
+ \r
+ }else if (Private->OfferCount[HttpOfferTypeDhcpNameUriDns] > 0) {\r
\r
- } else if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0 &&\r
- Private->OfferCount[HttpOfferTypeDhcpNameUri] > 0) {\r
- \r
- Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;\r
- Private->SelectProxyType = HttpOfferTypeDhcpNameUri;\r
+ Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpNameUriDns][0] + 1;\r
+ \r
+ } else if (Private->OfferCount[HttpOfferTypeDhcpOnly] > 0 &&\r
+ Private->OfferCount[HttpOfferTypeProxyIpUri] > 0) {\r
+ \r
+ Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpOnly][0] + 1;\r
+ Private->SelectProxyType = HttpOfferTypeProxyIpUri;\r
+ \r
+ } else if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0 &&\r
+ Private->OfferCount[HttpOfferTypeProxyIpUri] > 0) {\r
+ \r
+ Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;\r
+ Private->SelectProxyType = HttpOfferTypeProxyIpUri;\r
+ \r
+ } else if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0 &&\r
+ Private->OfferCount[HttpOfferTypeProxyNameUri] > 0) {\r
+ \r
+ Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;\r
+ Private->SelectProxyType = HttpOfferTypeProxyNameUri;\r
+ \r
+ } else if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0 &&\r
+ Private->OfferCount[HttpOfferTypeDhcpNameUri] > 0) {\r
+ \r
+ Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;\r
+ Private->SelectProxyType = HttpOfferTypeDhcpNameUri;\r
+ }\r
}\r
}\r
\r
MaxMsgSize = HttpBootParseDhcp4Options (\r
Packet->Dhcp4.Option,\r
GET_OPTION_BUFFER_LEN (Packet),\r
- HTTP_BOOT_DHCP4_TAG_MAXMSG\r
+ DHCP4_TAG_MAXMSG\r
);\r
if (MaxMsgSize != NULL) {\r
Value = HTONS (HTTP_BOOT_DHCP4_PACKET_MAX_SIZE);\r
// Select offer according to the priority in UEFI spec, and record the SelectIndex \r
// and SelectProxyType.\r
//\r
- HttpBootSelectDhcp4Offer (Private);\r
+ HttpBootSelectDhcpOffer (Private);\r
\r
if (Private->SelectIndex == 0) {\r
Status = EFI_ABORTED;\r
\r
**/\r
EFI_STATUS\r
-HttpBootSetIpPolicy (\r
+HttpBootSetIp4Policy (\r
IN HTTP_BOOT_PRIVATE_DATA *Private\r
)\r
{\r
Dhcp4 = Private->Dhcp4;\r
ASSERT (Dhcp4 != NULL);\r
\r
- Status = HttpBootSetIpPolicy (Private);\r
+ Status = HttpBootSetIp4Policy (Private);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r