123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611 |
- /** @file
- The header files of miscellaneous routines for HttpDxe driver.
- Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
- (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #ifndef __EFI_HTTP_PROTO_H__
- #define __EFI_HTTP_PROTO_H__
- #define DEF_BUF_LEN 2048
- #define HTTP_SERVICE_SIGNATURE SIGNATURE_32('H', 't', 't', 'S')
- #define HTTP_SERVICE_FROM_PROTOCOL(a) \
- CR ( \
- (a), \
- HTTP_SERVICE, \
- ServiceBinding, \
- HTTP_SERVICE_SIGNATURE \
- )
- //
- // The state of HTTP protocol. It starts from UNCONFIGED.
- //
- #define HTTP_STATE_UNCONFIGED 0
- #define HTTP_STATE_HTTP_CONFIGED 1
- #define HTTP_STATE_TCP_CONFIGED 2
- #define HTTP_STATE_TCP_UNCONFIGED 3
- #define HTTP_STATE_TCP_CONNECTED 4
- #define HTTP_STATE_TCP_CLOSED 5
- //
- // TCP configured data.
- //
- #define HTTP_TOS_DEAULT 8
- #define HTTP_TTL_DEAULT 255
- #define HTTP_BUFFER_SIZE_DEAULT 65535
- #define HTTP_MAX_SYN_BACK_LOG 5
- #define HTTP_CONNECTION_TIMEOUT 60
- #define HTTP_RESPONSE_TIMEOUT 5
- #define HTTP_DATA_RETRIES 12
- #define HTTP_FIN_TIMEOUT 2
- #define HTTP_KEEP_ALIVE_PROBES 6
- #define HTTP_KEEP_ALIVE_TIME 7200
- #define HTTP_KEEP_ALIVE_INTERVAL 30
- #define HTTP_URL_BUFFER_LEN 4096
- typedef struct _HTTP_SERVICE {
- UINT32 Signature;
- EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
- EFI_HANDLE Ip4DriverBindingHandle;
- EFI_HANDLE Ip6DriverBindingHandle;
- EFI_HANDLE ControllerHandle;
- EFI_HANDLE Tcp4ChildHandle;
- EFI_HANDLE Tcp6ChildHandle;
- LIST_ENTRY ChildrenList;
- UINTN ChildrenNumber;
- INTN State;
- } HTTP_SERVICE;
- typedef struct {
- EFI_TCP4_IO_TOKEN Tx4Token;
- EFI_TCP4_TRANSMIT_DATA Tx4Data;
- EFI_TCP6_IO_TOKEN Tx6Token;
- EFI_TCP6_TRANSMIT_DATA Tx6Data;
- EFI_TCP4_IO_TOKEN Rx4Token;
- EFI_TCP4_RECEIVE_DATA Rx4Data;
- EFI_TCP6_IO_TOKEN Rx6Token;
- EFI_TCP6_RECEIVE_DATA Rx6Data;
- BOOLEAN IsTxDone;
- BOOLEAN IsRxDone;
- UINTN BodyLen;
- EFI_HTTP_METHOD Method;
- } HTTP_TCP_TOKEN_WRAP;
- typedef struct {
- EFI_TLS_VERSION Version;
- EFI_TLS_CONNECTION_END ConnectionEnd;
- EFI_TLS_VERIFY VerifyMethod;
- EFI_TLS_SESSION_STATE SessionState;
- } TLS_CONFIG_DATA;
- //
- // Callback data for HTTP_PARSER_CALLBACK()
- //
- typedef struct {
- UINTN ParseDataLength;
- VOID *ParseData;
- VOID *Wrap;
- } HTTP_CALLBACK_DATA;
- typedef struct _HTTP_PROTOCOL {
- UINT32 Signature;
- EFI_HTTP_PROTOCOL Http;
- EFI_HANDLE Handle;
- HTTP_SERVICE *Service;
- LIST_ENTRY Link; // Link to all HTTP instance from the service.
- BOOLEAN InDestroy;
- INTN State;
- EFI_HTTP_METHOD Method;
- UINTN StatusCode;
- EFI_EVENT TimeoutEvent;
- EFI_HANDLE Tcp4ChildHandle;
- EFI_TCP4_PROTOCOL *Tcp4;
- EFI_TCP4_CONFIG_DATA Tcp4CfgData;
- EFI_TCP4_OPTION Tcp4Option;
- EFI_TCP4_CONNECTION_TOKEN Tcp4ConnToken;
- BOOLEAN IsTcp4ConnDone;
- EFI_TCP4_CLOSE_TOKEN Tcp4CloseToken;
- BOOLEAN IsTcp4CloseDone;
- CHAR8 *RemoteHost;
- UINT16 RemotePort;
- EFI_IPv4_ADDRESS RemoteAddr;
- EFI_HANDLE Tcp6ChildHandle;
- EFI_TCP6_PROTOCOL *Tcp6;
- EFI_TCP6_CONFIG_DATA Tcp6CfgData;
- EFI_TCP6_OPTION Tcp6Option;
- EFI_TCP6_CONNECTION_TOKEN Tcp6ConnToken;
- BOOLEAN IsTcp6ConnDone;
- EFI_TCP6_CLOSE_TOKEN Tcp6CloseToken;
- BOOLEAN IsTcp6CloseDone;
- EFI_IPv6_ADDRESS RemoteIpv6Addr;
- //
- // Rx4Token or Rx6Token used for receiving HTTP header.
- //
- EFI_TCP4_IO_TOKEN Rx4Token;
- EFI_TCP4_RECEIVE_DATA Rx4Data;
- EFI_TCP6_IO_TOKEN Rx6Token;
- EFI_TCP6_RECEIVE_DATA Rx6Data;
- BOOLEAN IsRxDone;
- CHAR8 **EndofHeader;
- CHAR8 **HttpHeaders;
- CHAR8 *CacheBody;
- CHAR8 *NextMsg;
- UINTN CacheLen;
- UINTN CacheOffset;
- //
- // HTTP message-body parser.
- //
- VOID *MsgParser;
- HTTP_CALLBACK_DATA CallbackData;
- EFI_HTTP_VERSION HttpVersion;
- UINT32 TimeOutMillisec;
- BOOLEAN LocalAddressIsIPv6;
- EFI_HTTPv4_ACCESS_POINT IPv4Node;
- EFI_HTTPv6_ACCESS_POINT Ipv6Node;
- NET_MAP TxTokens;
- NET_MAP RxTokens;
- CHAR8 *Url;
- //
- // Https Support
- //
- BOOLEAN UseHttps;
- EFI_SERVICE_BINDING_PROTOCOL *TlsSb;
- EFI_HANDLE TlsChildHandle; /// Tls ChildHandle
- TLS_CONFIG_DATA TlsConfigData;
- EFI_TLS_PROTOCOL *Tls;
- EFI_TLS_CONFIGURATION_PROTOCOL *TlsConfiguration;
- EFI_TLS_SESSION_STATE TlsSessionState;
- //
- // TlsTxData used for transmitting TLS related messages.
- //
- EFI_TCP4_IO_TOKEN Tcp4TlsTxToken;
- EFI_TCP4_TRANSMIT_DATA Tcp4TlsTxData;
- EFI_TCP6_IO_TOKEN Tcp6TlsTxToken;
- EFI_TCP6_TRANSMIT_DATA Tcp6TlsTxData;
- BOOLEAN TlsIsTxDone;
- //
- // TlsRxData used for receiving TLS related messages.
- //
- EFI_TCP4_IO_TOKEN Tcp4TlsRxToken;
- EFI_TCP4_RECEIVE_DATA Tcp4TlsRxData;
- EFI_TCP6_IO_TOKEN Tcp6TlsRxToken;
- EFI_TCP6_RECEIVE_DATA Tcp6TlsRxData;
- BOOLEAN TlsIsRxDone;
- } HTTP_PROTOCOL;
- typedef struct {
- EFI_HTTP_TOKEN *HttpToken;
- HTTP_PROTOCOL *HttpInstance;
- HTTP_TCP_TOKEN_WRAP TcpWrap;
- } HTTP_TOKEN_WRAP;
- #define HTTP_PROTOCOL_SIGNATURE SIGNATURE_32('H', 't', 't', 'P')
- #define HTTP_INSTANCE_FROM_PROTOCOL(a) \
- CR ( \
- (a), \
- HTTP_PROTOCOL, \
- Http, \
- HTTP_PROTOCOL_SIGNATURE \
- )
- /**
- The common notify function used in HTTP driver.
- @param[in] Event The event signaled.
- @param[in] Context The context.
- **/
- VOID
- EFIAPI
- HttpCommonNotify (
- IN EFI_EVENT Event,
- IN VOID *Context
- );
- /**
- Create events for the TCP connection token and TCP close token.
- @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
- @retval EFI_SUCCESS The events are created successfully.
- @retval others Other error as indicated.
- **/
- EFI_STATUS
- HttpCreateTcpConnCloseEvent (
- IN HTTP_PROTOCOL *HttpInstance
- );
- /**
- Close events in the TCP connection token and TCP close token.
- @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
- **/
- VOID
- HttpCloseTcpConnCloseEvent (
- IN HTTP_PROTOCOL *HttpInstance
- );
- /**
- Create event for the TCP transmit token.
- @param[in] Wrap Point to HTTP token's wrap data.
- @retval EFI_SUCCESS The events is created successfully.
- @retval others Other error as indicated.
- **/
- EFI_STATUS
- HttpCreateTcpTxEvent (
- IN HTTP_TOKEN_WRAP *Wrap
- );
- /**
- Create event for the TCP receive token which is used to receive HTTP header.
- @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
- @retval EFI_SUCCESS The events is created successfully.
- @retval others Other error as indicated.
- **/
- EFI_STATUS
- HttpCreateTcpRxEventForHeader (
- IN HTTP_PROTOCOL *HttpInstance
- );
- /**
- Create event for the TCP receive token which is used to receive HTTP body.
- @param[in] Wrap Point to HTTP token's wrap data.
- @retval EFI_SUCCESS The events is created successfully.
- @retval others Other error as indicated.
- **/
- EFI_STATUS
- HttpCreateTcpRxEvent (
- IN HTTP_TOKEN_WRAP *Wrap
- );
- /**
- Close Events for Tcp Receive Tokens for HTTP body and HTTP header.
- @param[in] Wrap Pointer to HTTP token's wrap data.
- **/
- VOID
- HttpCloseTcpRxEvent (
- IN HTTP_TOKEN_WRAP *Wrap
- );
- /**
- Intiialize the HTTP_PROTOCOL structure to the unconfigured state.
- @param[in, out] HttpInstance Pointer to HTTP_PROTOCOL structure.
- @param[in] IpVersion Indicate us TCP4 protocol or TCP6 protocol.
- @retval EFI_SUCCESS HTTP_PROTOCOL structure is initialized successfully.
- @retval Others Other error as indicated.
- **/
- EFI_STATUS
- HttpInitProtocol (
- IN OUT HTTP_PROTOCOL *HttpInstance,
- IN BOOLEAN IpVersion
- );
- /**
- Clean up the HTTP child, release all the resources used by it.
- @param[in] HttpInstance The HTTP child to clean up.
- **/
- VOID
- HttpCleanProtocol (
- IN HTTP_PROTOCOL *HttpInstance
- );
- /**
- Establish TCP connection with HTTP server.
- @param[in] HttpInstance The HTTP instance private data.
- @retval EFI_SUCCESS The TCP connection is established.
- @retval Others Other error as indicated.
- **/
- EFI_STATUS
- HttpCreateConnection (
- IN HTTP_PROTOCOL *HttpInstance
- );
- /**
- Close existing TCP connection.
- @param[in] HttpInstance The HTTP instance private data.
- @retval EFI_SUCCESS The TCP connection is closed.
- @retval Others Other error as indicated.
- **/
- EFI_STATUS
- HttpCloseConnection (
- IN HTTP_PROTOCOL *HttpInstance
- );
- /**
- Configure TCP4 protocol child.
- @param[in] HttpInstance The HTTP instance private data.
- @param[in] Wrap The HTTP token's wrap data.
- @retval EFI_SUCCESS The TCP4 protocol child is configured.
- @retval Others Other error as indicated.
- **/
- EFI_STATUS
- HttpConfigureTcp4 (
- IN HTTP_PROTOCOL *HttpInstance,
- IN HTTP_TOKEN_WRAP *Wrap
- );
- /**
- Configure TCP6 protocol child.
- @param[in] HttpInstance The HTTP instance private data.
- @param[in] Wrap The HTTP token's wrap data.
- @retval EFI_SUCCESS The TCP6 protocol child is configured.
- @retval Others Other error as indicated.
- **/
- EFI_STATUS
- HttpConfigureTcp6 (
- IN HTTP_PROTOCOL *HttpInstance,
- IN HTTP_TOKEN_WRAP *Wrap
- );
- /**
- Check existing TCP connection, if in error state, recover TCP4 connection. Then,
- connect one TLS session if required.
- @param[in] HttpInstance The HTTP instance private data.
- @retval EFI_SUCCESS The TCP connection is established.
- @retval EFI_NOT_READY TCP4 protocol child is not created or configured.
- @retval Others Other error as indicated.
- **/
- EFI_STATUS
- HttpConnectTcp4 (
- IN HTTP_PROTOCOL *HttpInstance
- );
- /**
- Check existing TCP connection, if in error state, recover TCP6 connection. Then,
- connect one TLS session if required.
- @param[in] HttpInstance The HTTP instance private data.
- @retval EFI_SUCCESS The TCP connection is established.
- @retval EFI_NOT_READY TCP6 protocol child is not created or configured.
- @retval Others Other error as indicated.
- **/
- EFI_STATUS
- HttpConnectTcp6 (
- IN HTTP_PROTOCOL *HttpInstance
- );
- /**
- Send the HTTP or HTTPS message through TCP4 or TCP6.
- @param[in] HttpInstance The HTTP instance private data.
- @param[in] Wrap The HTTP token's wrap data.
- @param[in] TxString Buffer containing the HTTP message string.
- @param[in] TxStringLen Length of the HTTP message string in bytes.
- @retval EFI_SUCCESS The HTTP message is queued into TCP transmit queue.
- @retval Others Other error as indicated.
- **/
- EFI_STATUS
- HttpTransmitTcp (
- IN HTTP_PROTOCOL *HttpInstance,
- IN HTTP_TOKEN_WRAP *Wrap,
- IN UINT8 *TxString,
- IN UINTN TxStringLen
- );
- /**
- Check whether the user's token or event has already
- been enqueue on HTTP Tx or Rx Token list.
- @param[in] Map The container of either user's transmit or receive
- token.
- @param[in] Item Current item to check against.
- @param[in] Context The Token to check againist.
- @retval EFI_ACCESS_DENIED The token or event has already been enqueued in IP
- @retval EFI_SUCCESS The current item isn't the same token/event as the
- context.
- **/
- EFI_STATUS
- EFIAPI
- HttpTokenExist (
- IN NET_MAP *Map,
- IN NET_MAP_ITEM *Item,
- IN VOID *Context
- );
- /**
- Check whether the HTTP message associated with TxToken or Tx6Token is already sent out.
- @param[in] Map The container of TxToken.
- @param[in] Item Current item to check against.
- @param[in] Context The Token to check againist.
- @retval EFI_NOT_READY The HTTP message is still queued in the list.
- @retval EFI_SUCCESS The HTTP message has been sent out.
- **/
- EFI_STATUS
- EFIAPI
- HttpTcpNotReady (
- IN NET_MAP *Map,
- IN NET_MAP_ITEM *Item,
- IN VOID *Context
- );
- /**
- Initialize Http session.
- @param[in] HttpInstance The HTTP instance private data.
- @param[in] Wrap The HTTP token's wrap data.
- @param[in] Configure The Flag indicates whether need to initialize session.
- @param[in] TlsConfigure The Flag indicates whether it's the new Tls session.
- @retval EFI_SUCCESS The initialization of session is done.
- @retval Others Other error as indicated.
- **/
- EFI_STATUS
- HttpInitSession (
- IN HTTP_PROTOCOL *HttpInstance,
- IN HTTP_TOKEN_WRAP *Wrap,
- IN BOOLEAN Configure,
- IN BOOLEAN TlsConfigure
- );
- /**
- Transmit the HTTP or HTTPS mssage by processing the associated HTTP token.
- @param[in] Map The container of TxToken or Tx6Token.
- @param[in] Item Current item to check against.
- @param[in] Context The Token to check againist.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
- @retval EFI_SUCCESS The HTTP message is queued into TCP transmit
- queue.
- **/
- EFI_STATUS
- EFIAPI
- HttpTcpTransmit (
- IN NET_MAP *Map,
- IN NET_MAP_ITEM *Item,
- IN VOID *Context
- );
- /**
- Receive the HTTP response by processing the associated HTTP token.
- @param[in] Map The container of Rx4Token or Rx6Token.
- @param[in] Item Current item to check against.
- @param[in] Context The Token to check againist.
- @retval EFI_SUCCESS The HTTP response is queued into TCP receive
- queue.
- @retval Others Other error as indicated.
- **/
- EFI_STATUS
- EFIAPI
- HttpTcpReceive (
- IN NET_MAP *Map,
- IN NET_MAP_ITEM *Item,
- IN VOID *Context
- );
- /**
- Receive the HTTP header by processing the associated HTTP token.
- @param[in] HttpInstance The HTTP instance private data.
- @param[in, out] SizeofHeaders The HTTP header length.
- @param[in, out] BufferSize The size of buffer to cacahe the header message.
- @param[in] Timeout The time to wait for receiving the header packet.
- @retval EFI_SUCCESS The HTTP header is received.
- @retval Others Other errors as indicated.
- **/
- EFI_STATUS
- HttpTcpReceiveHeader (
- IN HTTP_PROTOCOL *HttpInstance,
- IN OUT UINTN *SizeofHeaders,
- IN OUT UINTN *BufferSize,
- IN EFI_EVENT Timeout
- );
- /**
- Receive the HTTP body by processing the associated HTTP token.
- @param[in] Wrap The HTTP token's wrap data.
- @param[in] HttpMsg The HTTP message data.
- @retval EFI_SUCCESS The HTTP body is received.
- @retval Others Other error as indicated.
- **/
- EFI_STATUS
- HttpTcpReceiveBody (
- IN HTTP_TOKEN_WRAP *Wrap,
- IN EFI_HTTP_MESSAGE *HttpMsg
- );
- /**
- Clean up Tcp Tokens while the Tcp transmission error occurs.
- @param[in] Wrap Pointer to HTTP token's wrap data.
- **/
- VOID
- HttpTcpTokenCleanup (
- IN HTTP_TOKEN_WRAP *Wrap
- );
- /**
- The work function of EfiHttpResponse().
- @param[in] Wrap Pointer to HTTP token's wrap data.
- @retval EFI_SUCCESS Allocation succeeded.
- @retval EFI_OUT_OF_RESOURCES Failed to complete the opration due to lack of resources.
- @retval EFI_NOT_READY Can't find a corresponding TxToken.
- **/
- EFI_STATUS
- HttpResponseWorker (
- IN HTTP_TOKEN_WRAP *Wrap
- );
- #endif
|