Hi, Ting The locate protocol in HttpBootRegisterRamDisk() may return EFI_NOT_FOUND is the RAM disk driver is not present in the system , that's why I add this return parameter. I will update patch according to other comments, thanks.
Best Regards, Siyuan > -----Original Message----- > From: Ye, Ting > Sent: Wednesday, April 6, 2016 4:57 PM > To: Fu, Siyuan <siyuan...@intel.com>; edk2-devel@lists.01.org > Cc: Wu, Jiaxin <jiaxin...@intel.com> > Subject: RE: [edk2] [Patch] NetworkPkg: Add RAM disk boot support to HTTP > Boot driver. > > Siyuan, > > Some minor comments to the patch: > > 1. Add perform parameter check for ImageType in > HttpBootGetFileFromCache(). > 2. Update function description of HttpBootStart/HttpBootLoadFile for > EFI_INVALID_PARAMETER since we now add further check. > 3. Add EFI_INVALID_PARAMETER to function description of > HttpBootCheckImageType > 4. In HttpBootCheckImageType, ImageType is checked but others are skipped. > Not necessary? > 5. Is EFI_NOT_FOUND irrelevant to HttpBootRegisterRamDisk? I see > EFI_UNSUPPORTED returned below. Please double check. > > Others are good to me. > > Reviewed-by: Ye Ting <ting...@intel.com> > > Thanks, > Ting > > > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of Fu > Siyuan > Sent: Thursday, March 31, 2016 11:37 AM > To: edk2-devel@lists.01.org > Cc: Ye, Ting <ting...@intel.com>; Wu, Jiaxin <jiaxin...@intel.com> > Subject: [edk2] [Patch] NetworkPkg: Add RAM disk boot support to HTTP Boot > driver. > > This patch updates the HTTP Boot driver to support the download and boot a > RAM disk image from HTTP server. > The HTTP RAM disk boot is described in section 23.7 "HTTP Boot" in UEFI 2.6. > HTTP server could provide either an UEFI image or a RAM disk image for the > HTTP boot client to use. The RAM disk image must contain a UEFI compliant > file system in it. > HTTP boot driver will identify the image type either by the "Content-Type" > entity header filed or by the file name extension as below: > "application/efi" or *.efi -> EFI Image > *.iso -> CD/DVD Image > *.img -> Virtual Disk Image > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Fu Siyuan <siyuan...@intel.com> > Cc: Ye Ting <ting...@intel.com> > Cc: Wu Jiaxin <jiaxin...@intel.com> > Cc: El-Haj-Mahmoud Samer <samer.el-haj-mahm...@hpe.com> > --- > NetworkPkg/HttpBootDxe/HttpBootClient.c | 35 ++++++-- > NetworkPkg/HttpBootDxe/HttpBootClient.h | 5 +- > NetworkPkg/HttpBootDxe/HttpBootDxe.h | 19 +++++ > NetworkPkg/HttpBootDxe/HttpBootDxe.inf | 3 + > NetworkPkg/HttpBootDxe/HttpBootImpl.c | 130 ++++++++++++++++++------- > ---- > NetworkPkg/HttpBootDxe/HttpBootSupport.c | 135 > +++++++++++++++++++++++++++++++ > NetworkPkg/HttpBootDxe/HttpBootSupport.h | 44 ++++++++++ > 7 files changed, 319 insertions(+), 52 deletions(-) > > diff --git a/NetworkPkg/HttpBootDxe/HttpBootClient.c > b/NetworkPkg/HttpBootDxe/HttpBootClient.c > index 0c47293..0e30b22 100644 > --- a/NetworkPkg/HttpBootDxe/HttpBootClient.c > +++ b/NetworkPkg/HttpBootDxe/HttpBootClient.c > @@ -570,6 +570,7 @@ HttpBootFreeCacheList ( > @param[out] Buffer The memory buffer to transfer the file > to. IF > Buffer is NULL, > then the size of the requested file is > returned in > BufferSize. > + @param[out] ImageType The image type of the downloaded file. > > @retval EFI_SUCCESS Successfully created. > @retval Others Failed to create HttpIo. > @@ -580,7 +581,8 @@ HttpBootGetFileFromCache ( > IN HTTP_BOOT_PRIVATE_DATA *Private, > IN CHAR16 *Uri, > IN OUT UINTN *BufferSize, > - OUT UINT8 *Buffer > + OUT UINT8 *Buffer, > + OUT HTTP_BOOT_IMAGE_TYPE *ImageType > ) > { > LIST_ENTRY *Entry; > @@ -603,7 +605,12 @@ HttpBootGetFileFromCache ( > (StrCmp (Uri, Cache->RequestData->Url) == 0)) > { > // > - // Hit cache, check buffer size. > + // Hit in cache, record image type. > + // > + *ImageType = Cache->ImageType; > + > + // > + // Check buffer size. > // > if (*BufferSize < Cache->EntityLength) { > *BufferSize = Cache->EntityLength; @@ -712,6 +719,7 @@ > HttpBootGetBootFileCallback ( > @param[out] Buffer The memory buffer to transfer the file > to. IF > Buffer is NULL, > then the size of the requested file is > returned in > BufferSize. > + @param[out] ImageType The image type of the downloaded file. > > @retval EFI_SUCCESS The file was loaded. > @retval EFI_INVALID_PARAMETER BufferSize is NULL or Buffer Size is not > NULL but Buffer is NULL. > @@ -727,7 +735,8 @@ HttpBootGetBootFile ( > IN HTTP_BOOT_PRIVATE_DATA *Private, > IN BOOLEAN HeaderOnly, > IN OUT UINTN *BufferSize, > - OUT UINT8 *Buffer > + OUT UINT8 *Buffer, > + OUT HTTP_BOOT_IMAGE_TYPE *ImageType > ) > { > EFI_STATUS Status; > @@ -750,7 +759,7 @@ HttpBootGetBootFile ( > ASSERT (Private != NULL); > ASSERT (Private->HttpCreated); > > - if (BufferSize == NULL) { > + if (BufferSize == NULL || ImageType == NULL) { > return EFI_INVALID_PARAMETER; > } > > @@ -767,7 +776,7 @@ HttpBootGetBootFile ( > } > AsciiStrToUnicodeStr (Private->BootFileUri, Url); > if (!HeaderOnly) { > - Status = HttpBootGetFileFromCache (Private, Url, BufferSize, Buffer); > + Status = HttpBootGetFileFromCache (Private, Url, BufferSize, > + Buffer, ImageType); > if (Status != EFI_NOT_FOUND) { > FreePool (Url); > return Status; > @@ -788,6 +797,7 @@ HttpBootGetBootFile ( > Status = EFI_OUT_OF_RESOURCES; > goto ERROR_1; > } > + Cache->ImageType = ImageTypeMax; > InitializeListHead (&Cache->EntityDataList); > } > > @@ -919,10 +929,25 @@ HttpBootGetBootFile ( > } > > // > + // Check the image type according to server's response. > + // > + Status = HttpBootCheckImageType ( > + Private->BootFileUri, > + Private->BootFileUriParser, > + ResponseData->HeaderCount, > + ResponseData->Headers, > + ImageType > + ); > + if (EFI_ERROR (Status)) { > + goto ERROR_5; > + } > + > + // > // 3.2 Cache the response header. > // > if (Cache != NULL) { > Cache->ResponseData = ResponseData; > + Cache->ImageType = *ImageType; > } > > // > diff --git a/NetworkPkg/HttpBootDxe/HttpBootClient.h > b/NetworkPkg/HttpBootDxe/HttpBootClient.h > index b929fa7..2fd7dfc 100644 > --- a/NetworkPkg/HttpBootDxe/HttpBootClient.h > +++ b/NetworkPkg/HttpBootDxe/HttpBootClient.h > @@ -40,6 +40,7 @@ typedef struct { > LIST_ENTRY Link; // Link to the CacheList in > driver's private > data. > EFI_HTTP_REQUEST_DATA *RequestData; > HTTP_IO_RESPONSE_DATA *ResponseData; // Not include any message- > body data. > + HTTP_BOOT_IMAGE_TYPE ImageType; > UINTN EntityLength; > LIST_ENTRY EntityDataList; // Entity data (message-body) > } HTTP_BOOT_CACHE_CONTENT; > @@ -105,6 +106,7 @@ HttpBootCreateHttpIo ( > @param[out] Buffer The memory buffer to transfer the file > to. IF > Buffer is NULL, > then the size of the requested file is > returned in > BufferSize. > + @param[out] ImageType The image type of the downloaded file. > > @retval EFI_SUCCESS The file was loaded. > @retval EFI_INVALID_PARAMETER BufferSize is NULL or Buffer Size is not > NULL but Buffer is NULL. > @@ -120,7 +122,8 @@ HttpBootGetBootFile ( > IN HTTP_BOOT_PRIVATE_DATA *Private, > IN BOOLEAN HeaderOnly, > IN OUT UINTN *BufferSize, > - OUT UINT8 *Buffer > + OUT UINT8 *Buffer, > + OUT HTTP_BOOT_IMAGE_TYPE *ImageType > ); > > /** > diff --git a/NetworkPkg/HttpBootDxe/HttpBootDxe.h > b/NetworkPkg/HttpBootDxe/HttpBootDxe.h > index b3e2576..76b7943 100644 > --- a/NetworkPkg/HttpBootDxe/HttpBootDxe.h > +++ b/NetworkPkg/HttpBootDxe/HttpBootDxe.h > @@ -55,6 +55,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY > KIND, EITHER EXPRESS OR IMPLIED. > #include <Protocol/Http.h> > #include <Protocol/Ip4Config2.h> > #include <Protocol/Ip6Config.h> > +#include <Protocol/RamDisk.h> > // > // Produced Protocols > // > @@ -71,6 +72,12 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY > KIND, EITHER EXPRESS OR IMPLIED. > #define HTTP_BOOT_DXE_VERSION 0xa > > // > +// Provisional Standard Media Types defined in // > +http://www.iana.org/assignments/provisional-standard-media-types/provis > +ional-standard-media-types.xhtml > +// > +#define HTTP_CONTENT_TYPE_APP_EFI "application/efi" > + > +// > // Protocol instances > // > extern EFI_DRIVER_BINDING_PROTOCOL gHttpBootDxeDriverBinding; @@ - > 83,6 +90,13 @@ extern EFI_COMPONENT_NAME_PROTOCOL > gHttpBootDxeComponentName; > typedef struct _HTTP_BOOT_PRIVATE_DATA HTTP_BOOT_PRIVATE_DATA; > typedef struct _HTTP_BOOT_VIRTUAL_NIC HTTP_BOOT_VIRTUAL_NIC; > > +typedef enum { > + ImageTypeEfi, > + ImageTypeVirtualCd, > + ImageTypeVirtualDisk, > + ImageTypeMax > +} HTTP_BOOT_IMAGE_TYPE; > + > // > // Include files with internal function prototypes // @@ -166,6 +180,11 @@ > struct _HTTP_BOOT_PRIVATE_DATA { > EFI_IP_ADDRESS GatewayIp; > EFI_IP_ADDRESS ServerIp; > UINT16 Port; > + > + // > + // The URI string attempt to download through HTTP, may point to // > + the memory in cached DHCP offer, or to the memory in FilePathUri. > + // > CHAR8 *BootFileUri; > VOID *BootFileUriParser; > UINTN BootFileSize; > diff --git a/NetworkPkg/HttpBootDxe/HttpBootDxe.inf > b/NetworkPkg/HttpBootDxe/HttpBootDxe.inf > index 7393ecd..d3df5f7 100644 > --- a/NetworkPkg/HttpBootDxe/HttpBootDxe.inf > +++ b/NetworkPkg/HttpBootDxe/HttpBootDxe.inf > @@ -81,6 +81,7 @@ > gEfiIp6ProtocolGuid ## TO_START > gEfiIp6ConfigProtocolGuid ## TO_START > gEfiNetworkInterfaceIdentifierProtocolGuid_31 ## > SOMETIMES_CONSUMES > + gEfiRamDiskProtocolGuid ## SOMETIMES_CONSUMES > gEfiHiiConfigAccessProtocolGuid ## BY_START > > [Guids] > @@ -89,6 +90,8 @@ > ## SOMETIMES_PRODUCES ## GUID # HiiGetBrowserData > mHttpBootConfigStorageName > ## SOMETIMES_CONSUMES ## HII > gHttpBootConfigGuid > + gEfiVirtualCdGuid ## SOMETIMES_CONSUMES ## GUID > + gEfiVirtualDiskGuid ## SOMETIMES_CONSUMES ## GUID > > [UserExtensions.TianoCore."ExtraFiles"] > HttpBootDxeExtra.uni > diff --git a/NetworkPkg/HttpBootDxe/HttpBootImpl.c > b/NetworkPkg/HttpBootDxe/HttpBootImpl.c > index c4a3e70..7ce7b34 100644 > --- a/NetworkPkg/HttpBootDxe/HttpBootImpl.c > +++ b/NetworkPkg/HttpBootDxe/HttpBootImpl.c > @@ -17,6 +17,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY > KIND, EITHER EXPRESS OR IMPLIED. > /** > Enable the use of UEFI HTTP boot function. > > + If the driver has already been started but not satisfy the > + requirement (IP stack and specified boot file path), this function will > stop > the driver and start it again. > + > @param[in] Private The pointer to the driver's private data. > @param[in] UsingIpv6 Specifies the type of IP addresses that > are to be > used during the session that is being > started. > @@ -38,13 +41,50 @@ HttpBootStart ( > { > UINTN Index; > EFI_STATUS Status; > + CHAR8 *Uri; > + > > if (Private == NULL || FilePath == NULL) { > return EFI_INVALID_PARAMETER; > } > - > + > + // > + // Check the URI in the input FilePath, in order to see whether it is > + // required to boot from a new specified boot file. > + // > + Status = HttpBootParseFilePath (FilePath, &Uri); if (EFI_ERROR > + (Status)) { > + return EFI_INVALID_PARAMETER; > + } > + > + // > + // Check whether we need to stop and restart the HTTP boot driver. > + // > if (Private->Started) { > - return EFI_ALREADY_STARTED; > + // > + // Restart is needed in 2 cases: > + // 1. Http boot driver has already been started but not on the required > IP > stack. > + // 2. The specified boot file URI in FilePath is different with the one > we > have > + // recorded before. > + // > + if ((UsingIpv6 != Private->UsingIpv6) || > + ((Uri != NULL) && (AsciiStrCmp (Private->BootFileUri, Uri) != 0))) { > + // > + // Restart is required, first stop then continue this start function. > + // > + Status = HttpBootStop (Private); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + } else { > + // > + // Restart is not required. > + // > + if (Uri != NULL) { > + FreePool (Uri); > + } > + return EFI_ALREADY_STARTED; > + } > } > > // > @@ -55,17 +95,16 @@ HttpBootStart ( > } else if (!UsingIpv6 && Private->Ip4Nic != NULL) { > Private->UsingIpv6 = FALSE; > } else { > + if (Uri != NULL) { > + FreePool (Uri); > + } > return EFI_UNSUPPORTED; > } > > // > - // Check whether the URI address is specified. > + // Record the specified URI and prepare the URI parser if needed. > // > - Status = HttpBootParseFilePath (FilePath, &Private->FilePathUri); > - if (EFI_ERROR (Status)) { > - return EFI_INVALID_PARAMETER; > - } > - > + Private->FilePathUri = Uri; > if (Private->FilePathUri != NULL) { > Status = HttpParseUrl ( > Private->FilePathUri, > @@ -74,6 +113,7 @@ HttpBootStart ( > &Private->FilePathUriParser > ); > if (EFI_ERROR (Status)) { > + FreePool (Private->FilePathUri); > return Status; > } > } > @@ -101,7 +141,7 @@ HttpBootStart ( > return Status; > } > } > - Private->Started = TRUE; > + Private->Started = TRUE; > > return EFI_SUCCESS; > } > @@ -161,6 +201,7 @@ HttpBootDhcp ( > @param[in] Buffer The memory buffer to transfer the file > to. If > Buffer is NULL, > then the size of the requested file is > returned in > BufferSize. > + @param[out] ImageType The image type of the downloaded file. > > @retval EFI_SUCCESS Boot file was loaded successfully. > @retval EFI_INVALID_PARAMETER Private is NULL. > @@ -175,12 +216,17 @@ EFI_STATUS > HttpBootLoadFile ( > IN HTTP_BOOT_PRIVATE_DATA *Private, > IN OUT UINTN *BufferSize, > - IN VOID *Buffer OPTIONAL > + IN VOID *Buffer, OPTIONAL > + OUT HTTP_BOOT_IMAGE_TYPE *ImageType > ) > { > EFI_STATUS Status; > > - if (Private == NULL) { > + if (Private == NULL || ImageType == NULL || BufferSize == NULL ) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (*BufferSize != 0 && Buffer == NULL) { > return EFI_INVALID_PARAMETER; > } > > @@ -222,7 +268,8 @@ HttpBootLoadFile ( > Private, > TRUE, > &Private->BootFileSize, > - NULL > + NULL, > + ImageType > ); > if (EFI_ERROR (Status) && Status != EFI_BUFFER_TOO_SMALL) { > // > @@ -233,7 +280,8 @@ HttpBootLoadFile ( > Private, > FALSE, > &Private->BootFileSize, > - NULL > + NULL, > + ImageType > ); > if (EFI_ERROR (Status) && Status != EFI_BUFFER_TOO_SMALL) { > return Status; > @@ -253,7 +301,8 @@ HttpBootLoadFile ( > Private, > FALSE, > BufferSize, > - Buffer > + Buffer, > + ImageType > ); > } > > @@ -388,6 +437,7 @@ HttpBootDxeLoadFile ( > BOOLEAN MediaPresent; > BOOLEAN UsingIpv6; > EFI_STATUS Status; > + HTTP_BOOT_IMAGE_TYPE ImageType; > > if (This == NULL || BufferSize == NULL || FilePath == NULL) { > return EFI_INVALID_PARAMETER; > @@ -424,46 +474,34 @@ HttpBootDxeLoadFile ( > // Initialize HTTP boot. > // > Status = HttpBootStart (Private, UsingIpv6, FilePath); > - if (Status == EFI_ALREADY_STARTED) { > - // > - // Restart the HTTP boot driver in 2 cases: > - // 1. Http boot Driver has already been started but not on the required > IP > version. > - // 2. The required boot FilePath is different with the one we produced in > the device path > - // protocol. > - // > - if ((UsingIpv6 != Private->UsingIpv6) || ((Private->FilePathUri != NULL) > && > (AsciiStrCmp (Private->BootFileUri, Private->FilePathUri) != 0))) { > - Status = HttpBootStop (Private); > - if (!EFI_ERROR (Status)) { > - Status = HttpBootStart (Private, UsingIpv6, FilePath); > - } > - } > + if (Status != EFI_SUCCESS && Status != EFI_ALREADY_STARTED) { > + return Status; > } > - > + > // > // Load the boot file. > // > - if (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED) { > - Status = HttpBootLoadFile (Private, BufferSize, Buffer); > + ImageType = ImageTypeMax; > + Status = HttpBootLoadFile (Private, BufferSize, Buffer, &ImageType); > + if (EFI_ERROR (Status)) { > + if (Status == EFI_BUFFER_TOO_SMALL && (ImageType == > ImageTypeVirtualCd || ImageType == ImageTypeVirtualDisk)) { > + Status = EFI_WARN_FILE_SYSTEM; > + } else if (Status != EFI_BUFFER_TOO_SMALL) { > + HttpBootStop (Private); > + } > + return Status; > } > > - if (Status != EFI_SUCCESS && Status != EFI_BUFFER_TOO_SMALL) { > - HttpBootStop (Private); > - } else { > - if (!Private->UsingIpv6) { > - // > - // Stop and release the DHCP4 child. > - // > - Private->Dhcp4->Stop (Private->Dhcp4); > - Private->Dhcp4->Configure (Private->Dhcp4, NULL); > - } else { > - // > - // Stop and release the DHCP6 child. > - // > - Private->Dhcp6->Stop (Private->Dhcp6); > - Private->Dhcp6->Configure (Private->Dhcp6, NULL); > + // > + // Register the RAM Disk to the system if needed. > + // > + if (ImageType == ImageTypeVirtualCd || ImageType == > ImageTypeVirtualDisk) { > + Status = HttpBootRegisterRamDisk (Private, *BufferSize, Buffer, > ImageType); > + if (!EFI_ERROR (Status)) { > + Status = EFI_WARN_FILE_SYSTEM; > } > } > - > + > return Status; > } > > diff --git a/NetworkPkg/HttpBootDxe/HttpBootSupport.c > b/NetworkPkg/HttpBootDxe/HttpBootSupport.c > index bd99a91..aae8ab3 100644 > --- a/NetworkPkg/HttpBootDxe/HttpBootSupport.c > +++ b/NetworkPkg/HttpBootDxe/HttpBootSupport.c > @@ -1007,3 +1007,138 @@ HttpBootParseFilePath ( > > return EFI_SUCCESS; > } > + > +/** > + This function returns the image type according to server replied HTTP > +message > + and also the image's URI info. > + > + @param[in] Uri The pointer to the image's URI string. > + @param[in] UriParser URI Parse result returned by > NetHttpParseUrl(). > + @param[in] HeaderCount Number of HTTP header structures in > Headers list. > + @param[in] Headers Array containing list of HTTP headers. > + @param[out] ImageType The image type of the downloaded file. > + > + @retval EFI_SUCCESS The image type is returned in ImageType. > + @retval EFI_NOT_FOUND Failed to identify the image type. > + @retval Others Unexpect error happened. > + > +**/ > +EFI_STATUS > +HttpBootCheckImageType ( > + IN CHAR8 *Uri, > + IN VOID *UriParser, > + IN UINTN HeaderCount, > + IN EFI_HTTP_HEADER *Headers, > + OUT HTTP_BOOT_IMAGE_TYPE *ImageType > + ) > +{ > + EFI_STATUS Status; > + EFI_HTTP_HEADER *Header; > + CHAR8 *FilePath; > + CHAR8 *FilePost; > + > + if (ImageType == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + // > + // Determine the image type by the HTTP Content-Type header field first. > + // "application/efi" -> EFI Image > + // > + Header = HttpFindHeader (HeaderCount, Headers, > + HTTP_HEADER_CONTENT_TYPE); if (Header != NULL) { > + if (AsciiStriCmp (Header->FieldValue, HTTP_CONTENT_TYPE_APP_EFI) == 0) > { > + *ImageType = ImageTypeEfi; > + return EFI_SUCCESS; > + } > + } > + > + // > + // Determine the image type by file extension: > + // *.efi -> EFI Image > + // *.iso -> CD/DVD Image > + // *.img -> Virtual Disk Image > + // > + Status = HttpUrlGetPath ( > + Uri, > + UriParser, > + &FilePath > + ); > + if (EFI_ERROR (Status)) { > + return Status; > + } > + > + FilePost = FilePath + AsciiStrLen (FilePath) - 4; if (AsciiStrCmp > + (FilePost, ".efi") == 0) { > + *ImageType = ImageTypeEfi; > + } else if (AsciiStrCmp (FilePost, ".iso") == 0) { > + *ImageType = ImageTypeVirtualCd; > + } else if (AsciiStrCmp (FilePost, ".img") == 0) { > + *ImageType = ImageTypeVirtualDisk; > + } else { > + *ImageType = ImageTypeMax; > + } > + > + FreePool (FilePath); > + > + return (*ImageType < ImageTypeMax) ? EFI_SUCCESS : EFI_NOT_FOUND; } > + > +/** > + This function register the RAM disk info to the system. > + > + @param[in] Private The pointer to the driver's private data. > + @param[in] BufferSize The size of Buffer in bytes. > + @param[in] Buffer The base address of the RAM disk. > + @param[in] ImageType The image type of the file in Buffer. > + > + @retval EFI_SUCCESS The RAM disk has been registered. > + @retval EFI_NOT_FOUND No RAM disk protocol instances were > found. > + @retval Others Unexpected error happened. > + > +**/ > +EFI_STATUS > +HttpBootRegisterRamDisk ( > + IN HTTP_BOOT_PRIVATE_DATA *Private, > + IN UINTN BufferSize, > + IN VOID *Buffer, > + IN HTTP_BOOT_IMAGE_TYPE ImageType > + ) > +{ > + EFI_RAM_DISK_PROTOCOL *RamDisk; > + EFI_STATUS Status; > + EFI_DEVICE_PATH_PROTOCOL *DevicePath; > + EFI_GUID *RamDiskType; > + > + ASSERT (Private != NULL); > + ASSERT (Buffer != NULL); > + ASSERT (BufferSize != 0); > + > + Status = gBS->LocateProtocol (&gEfiRamDiskProtocolGuid, NULL, > + (VOID**) &RamDisk); if (EFI_ERROR (Status)) { > + DEBUG ((EFI_D_ERROR, "HTTP Boot: Couldn't find the RAM Disk protocol - > %r\n", Status)); > + return Status; > + } > + > + if (ImageType == ImageTypeVirtualCd) { > + RamDiskType = &gEfiVirtualCdGuid; > + } else if (ImageType == ImageTypeVirtualDisk) { > + RamDiskType = &gEfiVirtualDiskGuid; } else { > + return EFI_UNSUPPORTED; > + } > + > + Status = RamDisk->Register ( > + (UINTN)Buffer, > + (UINT64)BufferSize, > + RamDiskType, > + Private->UsingIpv6 ? Private->Ip6Nic->DevicePath : > Private->Ip4Nic- > >DevicePath, > + &DevicePath > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((EFI_D_ERROR, "HTTP Boot: Failed to register RAM Disk - > + %r\n", Status)); } > + > + return Status; > +} > + > diff --git a/NetworkPkg/HttpBootDxe/HttpBootSupport.h > b/NetworkPkg/HttpBootDxe/HttpBootSupport.h > index f382d63..e2c41a0 100644 > --- a/NetworkPkg/HttpBootDxe/HttpBootSupport.h > +++ b/NetworkPkg/HttpBootDxe/HttpBootSupport.h > @@ -347,4 +347,48 @@ HttpBootParseFilePath ( > OUT CHAR8 **UriAddress > ); > > +/** > + This function returns the image type according to server replied HTTP > +message > + and also the image's URI info. > + > + @param[in] Uri The pointer to the image's URI string. > + @param[in] UriParser URI Parse result returned by > NetHttpParseUrl(). > + @param[in] HeaderCount Number of HTTP header structures in > Headers list. > + @param[in] Headers Array containing list of HTTP headers. > + @param[out] ImageType The image type of the downloaded file. > + > + @retval EFI_SUCCESS The image type is returned in ImageType. > + @retval EFI_NOT_FOUND Failed to identify the image type. > + @retval Others Unexpect error happened. > + > +**/ > +EFI_STATUS > +HttpBootCheckImageType ( > + IN CHAR8 *Uri, > + IN VOID *UriParser, > + IN UINTN HeaderCount, > + IN EFI_HTTP_HEADER *Headers, > + OUT HTTP_BOOT_IMAGE_TYPE *ImageType > + ); > + > +/** > + This function register the RAM disk info to the system. > + > + @param[in] Private The pointer to the driver's private data. > + @param[in] BufferSize The size of Buffer in bytes. > + @param[in] Buffer The base address of the RAM disk. > + @param[in] ImageType The image type of the file in Buffer. > + > + @retval EFI_SUCCESS The RAM disk has been registered. > + @retval EFI_NOT_FOUND No RAM disk protocol instances were > found. > + @retval Others Unexpected error happened. > + > +**/ > +EFI_STATUS > +HttpBootRegisterRamDisk ( > + IN HTTP_BOOT_PRIVATE_DATA *Private, > + IN UINTN BufferSize, > + IN VOID *Buffer, > + IN HTTP_BOOT_IMAGE_TYPE ImageType > + ); > #endif > -- > 2.7.4.windows.1 > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel