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

Reply via email to