// HttpOffer contains the boot file URL.\r
//\r
SelectOffer = &Private->OfferBuffer[SelectIndex].Dhcp4;\r
- if ((SelectOffer->OfferType == HttpOfferTypeDhcpIpUri) || (SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns)) {\r
- HttpOffer = SelectOffer;\r
+ if (Private->FilePathUri == NULL) {\r
+ //\r
+ // In Corporate environment, we need a HttpOffer.\r
+ //\r
+ if ((SelectOffer->OfferType == HttpOfferTypeDhcpIpUri) || \r
+ (SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns) ||\r
+ (SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns)) {\r
+ HttpOffer = SelectOffer;\r
+ } else {\r
+ ASSERT (Private->SelectProxyType != HttpOfferTypeMax);\r
+ ProxyIndex = Private->OfferIndex[Private->SelectProxyType][0];\r
+ HttpOffer = &Private->OfferBuffer[ProxyIndex].Dhcp4;\r
+ }\r
+ Private->BootFileUriParser = HttpOffer->UriParser;\r
+ Private->BootFileUri = (CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Data;\r
} else {\r
- ASSERT (Private->SelectProxyType != HttpOfferTypeMax);\r
- ProxyIndex = Private->OfferIndex[Private->SelectProxyType][0];\r
- HttpOffer = &Private->OfferBuffer[ProxyIndex].Dhcp4;\r
+ //\r
+ // In Home environment the BootFileUri comes from the FilePath.\r
+ //\r
+ Private->BootFileUriParser = Private->FilePathUriParser;\r
+ Private->BootFileUri = Private->FilePathUri;\r
}\r
\r
//\r
// Configure the default DNS server if server assigned.\r
//\r
- if ((SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns) || (SelectOffer->OfferType == HttpOfferTypeDhcpDns)) {\r
+ if ((SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns) || \r
+ (SelectOffer->OfferType == HttpOfferTypeDhcpDns) ||\r
+ (SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns)) {\r
Option = SelectOffer->OptList[HTTP_BOOT_DHCP4_TAG_INDEX_DNS_SERVER];\r
ASSERT (Option != NULL);\r
Status = HttpBootRegisterIp4Dns (\r
// Extract the port from URL, and use default HTTP port 80 if not provided.\r
//\r
Status = HttpUrlGetPort (\r
- (CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Data,\r
- HttpOffer->UriParser,\r
+ Private->BootFileUri,\r
+ Private->BootFileUriParser,\r
&Private->Port\r
);\r
if (EFI_ERROR (Status) || Private->Port == 0) {\r
Private->Port = 80;\r
}\r
\r
- //\r
- // Record the URI of boot file from the selected HTTP offer.\r
- //\r
- Private->BootFileUriParser = HttpOffer->UriParser;\r
- Private->BootFileUri = (CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Data;\r
-\r
- \r
//\r
// All boot informations are valid here.\r
//\r
// HttpOffer contains the boot file URL.\r
//\r
SelectOffer = &Private->OfferBuffer[SelectIndex].Dhcp6;\r
- if ((SelectOffer->OfferType == HttpOfferTypeDhcpIpUri) || (SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns)) {\r
- HttpOffer = SelectOffer;\r
+ if (Private->FilePathUri == NULL) {\r
+ //\r
+ // In Corporate environment, we need a HttpOffer.\r
+ //\r
+ if ((SelectOffer->OfferType == HttpOfferTypeDhcpIpUri) ||\r
+ (SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns) ||\r
+ (SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns)) {\r
+ HttpOffer = SelectOffer;\r
+ } else {\r
+ ASSERT (Private->SelectProxyType != HttpOfferTypeMax);\r
+ ProxyIndex = Private->OfferIndex[Private->SelectProxyType][0];\r
+ HttpOffer = &Private->OfferBuffer[ProxyIndex].Dhcp6;\r
+ }\r
+ Private->BootFileUriParser = HttpOffer->UriParser;\r
+ Private->BootFileUri = (CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data;\r
} else {\r
- ASSERT (Private->SelectProxyType != HttpOfferTypeMax);\r
- ProxyIndex = Private->OfferIndex[Private->SelectProxyType][0];\r
- HttpOffer = &Private->OfferBuffer[ProxyIndex].Dhcp6;\r
+ //\r
+ // In Home environment the BootFileUri comes from the FilePath.\r
+ //\r
+ Private->BootFileUriParser = Private->FilePathUriParser;\r
+ Private->BootFileUri = Private->FilePathUri;\r
}\r
\r
//\r
//\r
// Configure the default DNS server if server assigned.\r
//\r
- if ((SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns) || (SelectOffer->OfferType == HttpOfferTypeDhcpDns)) {\r
+ if ((SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns) || \r
+ (SelectOffer->OfferType == HttpOfferTypeDhcpDns) ||\r
+ (SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns)) {\r
Option = SelectOffer->OptList[HTTP_BOOT_DHCP6_IDX_DNS_SERVER];\r
ASSERT (Option != NULL);\r
Status = HttpBootSetIp6Dns (\r
// whether can send message to HTTP Server Ip through the GateWay.\r
//\r
Status = HttpUrlGetIp6 (\r
- (CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data,\r
- HttpOffer->UriParser,\r
+ Private->BootFileUri,\r
+ Private->BootFileUriParser,\r
&IpAddr\r
);\r
\r
// The Http server address is expressed by Name Ip, so perform DNS resolution\r
//\r
Status = HttpUrlGetHostName (\r
- (CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data,\r
- HttpOffer->UriParser,\r
+ Private->BootFileUri,\r
+ Private->BootFileUriParser,\r
&HostName\r
);\r
if (EFI_ERROR (Status)) {\r
// Extract the port from URL, and use default HTTP port 80 if not provided.\r
//\r
Status = HttpUrlGetPort (\r
- (CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data,\r
- HttpOffer->UriParser,\r
+ Private->BootFileUri,\r
+ Private->BootFileUriParser,\r
&Private->Port\r
);\r
if (EFI_ERROR (Status) || Private->Port == 0) {\r
Private->Port = 80;\r
}\r
\r
- //\r
- // Record the URI of boot file from the selected HTTP offer.\r
- //\r
- Private->BootFileUriParser = HttpOffer->UriParser;\r
- Private->BootFileUri = (CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data;\r
-\r
- \r
//\r
// All boot informations are valid here.\r
//\r
{\r
HTTP_IO_CONFIG_DATA ConfigData;\r
EFI_STATUS Status;\r
+ EFI_HANDLE ImageHandle;\r
\r
ASSERT (Private != NULL);\r
\r
ConfigData.Config4.RequestTimeOut = HTTP_BOOT_REQUEST_TIMEOUT;\r
IP4_COPY_ADDRESS (&ConfigData.Config4.LocalIp, &Private->StationIp.v4);\r
IP4_COPY_ADDRESS (&ConfigData.Config4.SubnetMask, &Private->SubnetMask.v4);\r
+ ImageHandle = Private->Ip4Nic->ImageHandle;\r
} else {\r
ConfigData.Config6.HttpVersion = HttpVersion11;\r
ConfigData.Config6.RequestTimeOut = HTTP_BOOT_REQUEST_TIMEOUT;\r
IP6_COPY_ADDRESS (&ConfigData.Config6.LocalIp, &Private->StationIp.v6);\r
+ ImageHandle = Private->Ip6Nic->ImageHandle;\r
}\r
\r
Status = HttpIoCreateIo (\r
- Private->Image,\r
+ ImageHandle,\r
Private->Controller,\r
Private->UsingIpv6 ? IP_VERSION_6 : IP_VERSION_4,\r
&ConfigData,\r
@param[out] Buffer The memory buffer to transfer the file to. IF Buffer is NULL,\r
then the size of the requested file is returned in\r
BufferSize.\r
+ @param[out] ImageType The image type of the downloaded file.\r
\r
@retval EFI_SUCCESS Successfully created.\r
@retval Others Failed to create HttpIo.\r
IN HTTP_BOOT_PRIVATE_DATA *Private,\r
IN CHAR16 *Uri,\r
IN OUT UINTN *BufferSize,\r
- OUT UINT8 *Buffer\r
+ OUT UINT8 *Buffer,\r
+ OUT HTTP_BOOT_IMAGE_TYPE *ImageType\r
)\r
{\r
LIST_ENTRY *Entry;\r
HTTP_BOOT_ENTITY_DATA *EntityData;\r
UINTN CopyedSize;\r
\r
- if (Uri == NULL || BufferSize == 0 || Buffer == NULL) {\r
+ if (Uri == NULL || BufferSize == 0 || Buffer == NULL || ImageType == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- //\r
- // Search file in the cache list, the cache entry will be released upon a successful\r
- // match.\r
- //\r
NET_LIST_FOR_EACH (Entry, &Private->CacheList) {\r
Cache = NET_LIST_USER_STRUCT (Entry, HTTP_BOOT_CACHE_CONTENT, Link);\r
//\r
(StrCmp (Uri, Cache->RequestData->Url) == 0)) \r
{\r
//\r
- // Hit cache, check buffer size.\r
+ // Hit in cache, record image type.\r
+ //\r
+ *ImageType = Cache->ImageType;\r
+\r
+ //\r
+ // Check buffer size.\r
//\r
if (*BufferSize < Cache->EntityLength) {\r
*BufferSize = Cache->EntityLength;\r
}\r
}\r
*BufferSize = CopyedSize;\r
-\r
- //\r
- // On success, free the cached data to release the memory resource.\r
- //\r
- RemoveEntryList (&Cache->Link);\r
- HttpBootFreeCache (Cache);\r
return EFI_SUCCESS;\r
}\r
}\r
@param[out] Buffer The memory buffer to transfer the file to. IF Buffer is NULL,\r
then the size of the requested file is returned in\r
BufferSize.\r
+ @param[out] ImageType The image type of the downloaded file.\r
\r
@retval EFI_SUCCESS The file was loaded.\r
@retval EFI_INVALID_PARAMETER BufferSize is NULL or Buffer Size is not NULL but Buffer is NULL.\r
IN HTTP_BOOT_PRIVATE_DATA *Private,\r
IN BOOLEAN HeaderOnly,\r
IN OUT UINTN *BufferSize,\r
- OUT UINT8 *Buffer\r
+ OUT UINT8 *Buffer,\r
+ OUT HTTP_BOOT_IMAGE_TYPE *ImageType\r
)\r
{\r
EFI_STATUS Status;\r
ASSERT (Private != NULL);\r
ASSERT (Private->HttpCreated);\r
\r
- if (BufferSize == NULL) {\r
+ if (BufferSize == NULL || ImageType == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
}\r
AsciiStrToUnicodeStr (Private->BootFileUri, Url);\r
if (!HeaderOnly) {\r
- Status = HttpBootGetFileFromCache (Private, Url, BufferSize, Buffer);\r
+ Status = HttpBootGetFileFromCache (Private, Url, BufferSize, Buffer, ImageType);\r
if (Status != EFI_NOT_FOUND) {\r
FreePool (Url);\r
return Status;\r
Status = EFI_OUT_OF_RESOURCES;\r
goto ERROR_1;\r
}\r
+ Cache->ImageType = ImageTypeMax;\r
InitializeListHead (&Cache->EntityDataList);\r
}\r
\r
goto ERROR_5;\r
}\r
\r
+ //\r
+ // Check the image type according to server's response.\r
+ //\r
+ Status = HttpBootCheckImageType (\r
+ Private->BootFileUri,\r
+ Private->BootFileUriParser,\r
+ ResponseData->HeaderCount,\r
+ ResponseData->Headers,\r
+ ImageType\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto ERROR_5;\r
+ }\r
+\r
//\r
// 3.2 Cache the response header.\r
//\r
if (Cache != NULL) {\r
Cache->ResponseData = ResponseData;\r
+ Cache->ImageType = *ImageType;\r
}\r
\r
//\r
\r
if (*BufferSize < ContentLength) {\r
Status = EFI_BUFFER_TOO_SMALL;\r
+ } else {\r
+ Status = EFI_SUCCESS;\r
}\r
*BufferSize = ContentLength;\r
\r
HttpFreeMsgParser (Parser);\r
}\r
\r
- return EFI_SUCCESS;\r
+ return Status;\r
\r
ERROR_6:\r
if (Parser != NULL) {\r
\r
return Status;\r
}\r
+\r