From 3fd0ea1b796e9f540926a5acf05cf379e0c57c67 Mon Sep 17 00:00:00 2001 From: Thomas Oltmann Date: Wed, 4 Jun 2025 21:11:48 +0200 Subject: [PATCH] Added declarations for EFI HTTP protocol --- x86_64-efi/.gitignore | 3 + x86_64-efi/bootnetboot.c | 12 ++ x86_64-efi/efihttp.h | 232 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 247 insertions(+) create mode 100644 x86_64-efi/efihttp.h diff --git a/x86_64-efi/.gitignore b/x86_64-efi/.gitignore index 9faefab..dfcee5a 100644 --- a/x86_64-efi/.gitignore +++ b/x86_64-efi/.gitignore @@ -1,2 +1,5 @@ *.o !crt0-efi-x86_64.o +bootnetboot.efi +bootnetboot.rom +efirom diff --git a/x86_64-efi/bootnetboot.c b/x86_64-efi/bootnetboot.c index ff1864d..56ce433 100644 --- a/x86_64-efi/bootnetboot.c +++ b/x86_64-efi/bootnetboot.c @@ -44,6 +44,9 @@ #include #include #include +#include "efiip.h" +#include "efitcp.h" +#include "efihttp.h" #include "tinf.h" // get BOOTBOOT specific stuff #include @@ -1191,6 +1194,15 @@ GetLFB() return EFI_SUCCESS; } +EFI_STATUS +RetrieveFile(IN CHAR16 *FileName, OUT UINT8 **FileData, OUT UINTN *FileDataLength) +{ + (void)FileName; + (void)FileData; + (void)FileDataLength; + return EFI_SUCCESS; +} + /** * Load a file from FS0 into memory */ diff --git a/x86_64-efi/efihttp.h b/x86_64-efi/efihttp.h new file mode 100644 index 0000000..e38819d --- /dev/null +++ b/x86_64-efi/efihttp.h @@ -0,0 +1,232 @@ +/* Declarations for the UEFI HTTP + HTTPSB Protocol. + * Mostly taken directly from the spec. + */ + +#ifndef EFI_HTTP_H +#define EFI_HTTP_H + +// HTTP Service Binding Protocol + +#define EFI_HTTP_SERVICE_BINDING_PROTOCOL_GUID \ + {0xbdc8e6af, 0xd9bc, 0x4379,\ + {0xa7, 0x2a, 0xe0, 0xc4, 0xe7, 0x5d, 0xae, 0x1c}} + +// HTTP Binding Protocol + +#define EFI_HTTP_PROTOCOL_GUID \ + {0x7A59B29B, 0x910B, 0x4171,\ + {0x82, 0x42, 0xA8, 0x5A, 0x0D, 0xF2, 0x5B, 0x5B}} + +INTERFACE_DECL(_EFI_HTTP); + +typedef struct _EFI_HTTP_PROTOCOL EFI_HTTP_PROTOCOL; + +//******************************************* +// EFI_HTTP_VERSION +//******************************************* +typedef enum { + HttpVersion10, + HttpVersion11, + HttpVersionUnsupported +} EFI_HTTP_VERSION; + +//******************************************* +// EFI_HTTP_METHOD +//******************************************* +typedef enum { + HttpMethodGet, + HttpMethodPost, + HttpMethodPatch, + HttpMethodOptions, + HttpMethodConnect, + HttpMethodHead, + HttpMethodPut, + HttpMethodDelete, + HttpMethodTrace, + HttpMethodMax +} EFI_HTTP_METHOD; + +//******************************************* +// EFI_HTTP_STATUS +//******************************************* +typedef enum { + HTTP_STATUS_UNSUPPORTED_STATUS = 0, + HTTP_STATUS_100_CONTINUE, + HTTP_STATUS_101_SWITCHING_PROTOCOLS, + HTTP_STATUS_200_OK, + HTTP_STATUS_201_CREATED, + HTTP_STATUS_202_ACCEPTED, + HTTP_STATUS_203_NON_AUTHORITATIVE_INFORMATION, + HTTP_STATUS_204_NO_CONTENT, + HTTP_STATUS_205_RESET_CONTENT, + HTTP_STATUS_206_PARTIAL_CONTENT, + HTTP_STATUS_300_MULTIPLE_CHOICES, + HTTP_STATUS_301_MOVED_PERMANENTLY, + HTTP_STATUS_302_FOUND, + HTTP_STATUS_303_SEE_OTHER, + HTTP_STATUS_304_NOT_MODIFIED, + HTTP_STATUS_305_USE_PROXY, + HTTP_STATUS_307_TEMPORARY_REDIRECT, + HTTP_STATUS_400_BAD_REQUEST, + HTTP_STATUS_401_UNAUTHORIZED, + HTTP_STATUS_402_PAYMENT_REQUIRED, + HTTP_STATUS_403_FORBIDDEN, + HTTP_STATUS_404_NOT_FOUND, + HTTP_STATUS_405_METHOD_NOT_ALLOWED, + HTTP_STATUS_406_NOT_ACCEPTABLE, + HTTP_STATUS_407_PROXY_AUTHENTICATION_REQUIRED, + HTTP_STATUS_408_REQUEST_TIME_OUT, + HTTP_STATUS_409_CONFLICT, + HTTP_STATUS_410_GONE, + HTTP_STATUS_411_LENGTH_REQUIRED, + HTTP_STATUS_412_PRECONDITION_FAILED, + HTTP_STATUS_413_REQUEST_ENTITY_TOO_LARGE, + HTTP_STATUS_414_REQUEST_URI_TOO_LARGE, + HTTP_STATUS_415_UNSUPPORTED_MEDIA_TYPE, + HTTP_STATUS_416_REQUESTED_RANGE_NOT_SATISFIED, + HTTP_STATUS_417_EXPECTATION_FAILED, + HTTP_STATUS_500_INTERNAL_SERVER_ERROR, + HTTP_STATUS_501_NOT_IMPLEMENTED, + HTTP_STATUS_502_BAD_GATEWAY, + HTTP_STATUS_503_SERVICE_UNAVAILABLE, + HTTP_STATUS_504_GATEWAY_TIME_OUT, + HTTP_STATUS_505_HTTP_VERSION_NOT_SUPPORTED, + HTTP_STATUS_308_PERMANENT_REDIRECT +} EFI_HTTP_STATUS_CODE; + +//******************************************* +// EFI_HTTPv4_ACCESS_POINT +//******************************************* +typedef struct { + BOOLEAN UseDefaultAddress; + EFI_IPv4_ADDRESS LocalAddress; + EFI_IPv4_ADDRESS LocalSubnet; + UINT16 LocalPort; +} EFI_HTTPv4_ACCESS_POINT; + +//****************************************** +// EFI_HTTPv6_ACCESS_POINT +//****************************************** +typedef struct { + EFI_IPv6_ADDRESS LocalAddress; + UINT16 LocalPort; +} EFI_HTTPv6_ACCESS_POINT; + +//****************************************** +// EFI_HTTP_CONFIG_DATA +//****************************************** +typedef struct { + EFI_HTTP_VERSION HttpVersion; + UINT32 TimeOutMillisec; + BOOLEAN LocalAddressIsIPv6; + union { + EFI_HTTPv4_ACCESS_POINT *IPv4Node; + EFI_HTTPv6_ACCESS_POINT *IPv6Node; + } AccessPoint; +} EFI_HTTP_CONFIG_DATA; + +//******************************************* +// EFI_HTTP_REQUEST_DATA +//******************************************* +typedef struct { + EFI_HTTP_METHOD Method; + CHAR16 *Url; +} EFI_HTTP_REQUEST_DATA; + +//******************************************* +// EFI_HTTP_CONNECT_REQUEST_DATA +//******************************************* +typedef struct { + EFI_HTTP_REQUEST_DATA Base; + CHAR16 *ProxyUrl; +} EFI_HTTP_CONNECT_REQUEST_DATA; + +//******************************************* +// EFI_HTTP_RESPONSE_DATA +//******************************************* +typedef struct { + EFI_HTTP_STATUS_CODE StatusCode; +} EFI_HTTP_RESPONSE_DATA; + +//******************************************* +// EFI_HTTP_HEADER +//******************************************* +typedef struct { + CHAR8 *FieldName; + CHAR8 *FieldValue; +} EFI_HTTP_HEADER; + +//****************************************** +// EFI_HTTP_MESSAGE +//****************************************** +typedef struct { + union { + EFI_HTTP_REQUEST_DATA *Request; + EFI_HTTP_RESPONSE_DATA *Response; + } Data; + UINTN HeaderCount; + EFI_HTTP_HEADER *Headers; + UINTN BodyLength; + VOID *Body; +} EFI_HTTP_MESSAGE; + +//****************************************** +// EFI_HTTP_TOKEN +//****************************************** +typedef struct { + EFI_EVENT Event; + EFI_STATUS Status; + EFI_HTTP_MESSAGE *Message; +} EFI_HTTP_TOKEN; + +typedef +EFI_STATUS +(EFIAPI * EFI_HTTP_GET_MODE_DATA)( + IN EFI_HTTP_PROTOCOL *This, + OUT EFI_HTTP_CONFIG_DATA *HttpConfigData +); + +typedef +EFI_STATUS +(EFIAPI *EFI_HTTP_CONFIGURE)( + IN EFI_HTTP_PROTOCOL *This, + IN EFI_HTTP_CONFIG_DATA *HttpConfigData OPTIONAL +); + +typedef +EFI_STATUS +(EFIAPI *EFI_HTTP_REQUEST) ( + IN EFI_HTTP_PROTOCOL *This, + IN EFI_HTTP_TOKEN *Token +); + +typedef +EFI_STATUS +(EFIAPI * EFI_HTTP_CANCEL)( + IN EFI_HTTP_PROTOCOL *This, + IN EFI_HTTP_TOKEN *Token +); + +typedef +EFI_STATUS +(EFIAPI *EFI_HTTP_RESPONSE) ( + IN EFI_HTTP_PROTOCOL *This, + IN EFI_HTTP_TOKEN *Token +); + +typedef +EFI_STATUS +(EFIAPI *EFI_HTTP_POLL) ( + IN EFI_HTTP_PROTOCOL *This +); + +typedef struct _EFI_HTTP_PROTOCOL { + EFI_HTTP_GET_MODE_DATA GetModeData; + EFI_HTTP_CONFIGURE Configure; + EFI_HTTP_REQUEST Request; + EFI_HTTP_CANCEL Cancel; + EFI_HTTP_RESPONSE Response; + EFI_HTTP_POLL Poll; +} EFI_HTTP_PROTOCOL; + +#endif