2 The header files of miscellaneous routines for HttpDxe driver.
4 Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR>
5 (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #ifndef __EFI_HTTP_PROTO_H__
11 #define __EFI_HTTP_PROTO_H__
13 #define DEF_BUF_LEN 2048
15 #define HTTP_SERVICE_SIGNATURE SIGNATURE_32('H', 't', 't', 'S')
17 #define HTTP_SERVICE_FROM_PROTOCOL(a) \
22 HTTP_SERVICE_SIGNATURE \
26 // The state of HTTP protocol. It starts from UNCONFIGED.
28 #define HTTP_STATE_UNCONFIGED 0
29 #define HTTP_STATE_HTTP_CONFIGED 1
30 #define HTTP_STATE_TCP_CONFIGED 2
31 #define HTTP_STATE_TCP_UNCONFIGED 3
32 #define HTTP_STATE_TCP_CONNECTED 4
33 #define HTTP_STATE_TCP_CLOSED 5
36 // TCP configured data.
38 #define HTTP_TOS_DEAULT 8
39 #define HTTP_TTL_DEAULT 255
40 #define HTTP_BUFFER_SIZE_DEAULT 65535
41 #define HTTP_MAX_SYN_BACK_LOG 5
42 #define HTTP_CONNECTION_TIMEOUT 60
43 #define HTTP_DATA_RETRIES 12
44 #define HTTP_FIN_TIMEOUT 2
45 #define HTTP_KEEP_ALIVE_PROBES 6
46 #define HTTP_KEEP_ALIVE_TIME 7200
47 #define HTTP_KEEP_ALIVE_INTERVAL 30
49 #define HTTP_URL_BUFFER_LEN 4096
51 typedef struct _HTTP_SERVICE
{
53 EFI_SERVICE_BINDING_PROTOCOL ServiceBinding
;
54 EFI_HANDLE Ip4DriverBindingHandle
;
55 EFI_HANDLE Ip6DriverBindingHandle
;
56 EFI_HANDLE ControllerHandle
;
57 EFI_HANDLE Tcp4ChildHandle
;
58 EFI_HANDLE Tcp6ChildHandle
;
59 LIST_ENTRY ChildrenList
;
65 EFI_TCP4_IO_TOKEN Tx4Token
;
66 EFI_TCP4_TRANSMIT_DATA Tx4Data
;
67 EFI_TCP6_IO_TOKEN Tx6Token
;
68 EFI_TCP6_TRANSMIT_DATA Tx6Data
;
69 EFI_TCP4_IO_TOKEN Rx4Token
;
70 EFI_TCP4_RECEIVE_DATA Rx4Data
;
71 EFI_TCP6_IO_TOKEN Rx6Token
;
72 EFI_TCP6_RECEIVE_DATA Rx6Data
;
76 EFI_HTTP_METHOD Method
;
77 } HTTP_TCP_TOKEN_WRAP
;
80 EFI_TLS_VERSION Version
;
81 EFI_TLS_CONNECTION_END ConnectionEnd
;
82 EFI_TLS_VERIFY VerifyMethod
;
83 EFI_TLS_VERIFY_HOST VerifyHost
;
84 EFI_TLS_SESSION_STATE SessionState
;
88 // Callback data for HTTP_PARSER_CALLBACK()
91 UINTN ParseDataLength
;
96 typedef struct _HTTP_PROTOCOL
{
98 EFI_HTTP_PROTOCOL Http
;
100 HTTP_SERVICE
*Service
;
101 LIST_ENTRY Link
; // Link to all HTTP instance from the service.
104 EFI_HTTP_METHOD Method
;
108 EFI_EVENT TimeoutEvent
;
110 EFI_HANDLE Tcp4ChildHandle
;
111 EFI_TCP4_PROTOCOL
*Tcp4
;
112 EFI_TCP4_CONFIG_DATA Tcp4CfgData
;
113 EFI_TCP4_OPTION Tcp4Option
;
115 EFI_TCP4_CONNECTION_TOKEN Tcp4ConnToken
;
116 BOOLEAN IsTcp4ConnDone
;
117 EFI_TCP4_CLOSE_TOKEN Tcp4CloseToken
;
118 BOOLEAN IsTcp4CloseDone
;
121 EFI_IPv4_ADDRESS RemoteAddr
;
123 EFI_HANDLE Tcp6ChildHandle
;
124 EFI_TCP6_PROTOCOL
*Tcp6
;
125 EFI_TCP6_CONFIG_DATA Tcp6CfgData
;
126 EFI_TCP6_OPTION Tcp6Option
;
128 EFI_TCP6_CONNECTION_TOKEN Tcp6ConnToken
;
129 BOOLEAN IsTcp6ConnDone
;
130 EFI_TCP6_CLOSE_TOKEN Tcp6CloseToken
;
131 BOOLEAN IsTcp6CloseDone
;
132 EFI_IPv6_ADDRESS RemoteIpv6Addr
;
135 // Rx4Token or Rx6Token used for receiving HTTP header.
137 EFI_TCP4_IO_TOKEN Rx4Token
;
138 EFI_TCP4_RECEIVE_DATA Rx4Data
;
139 EFI_TCP6_IO_TOKEN Rx6Token
;
140 EFI_TCP6_RECEIVE_DATA Rx6Data
;
151 // HTTP message-body parser.
154 HTTP_CALLBACK_DATA CallbackData
;
156 EFI_HTTP_VERSION HttpVersion
;
157 UINT32 TimeOutMillisec
;
158 BOOLEAN LocalAddressIsIPv6
;
160 EFI_HTTPv4_ACCESS_POINT IPv4Node
;
161 EFI_HTTPv6_ACCESS_POINT Ipv6Node
;
173 EFI_SERVICE_BINDING_PROTOCOL
*TlsSb
;
174 EFI_HANDLE TlsChildHandle
; /// Tls ChildHandle
175 TLS_CONFIG_DATA TlsConfigData
;
176 EFI_TLS_PROTOCOL
*Tls
;
177 EFI_TLS_CONFIGURATION_PROTOCOL
*TlsConfiguration
;
178 EFI_TLS_SESSION_STATE TlsSessionState
;
181 // TlsTxData used for transmitting TLS related messages.
183 EFI_TCP4_IO_TOKEN Tcp4TlsTxToken
;
184 EFI_TCP4_TRANSMIT_DATA Tcp4TlsTxData
;
185 EFI_TCP6_IO_TOKEN Tcp6TlsTxToken
;
186 EFI_TCP6_TRANSMIT_DATA Tcp6TlsTxData
;
190 // TlsRxData used for receiving TLS related messages.
192 EFI_TCP4_IO_TOKEN Tcp4TlsRxToken
;
193 EFI_TCP4_RECEIVE_DATA Tcp4TlsRxData
;
194 EFI_TCP6_IO_TOKEN Tcp6TlsRxToken
;
195 EFI_TCP6_RECEIVE_DATA Tcp6TlsRxData
;
198 BOOLEAN ConnectionClose
;
202 EFI_HTTP_TOKEN
*HttpToken
;
203 HTTP_PROTOCOL
*HttpInstance
;
204 HTTP_TCP_TOKEN_WRAP TcpWrap
;
207 #define HTTP_PROTOCOL_SIGNATURE SIGNATURE_32('H', 't', 't', 'P')
209 #define HTTP_INSTANCE_FROM_PROTOCOL(a) \
214 HTTP_PROTOCOL_SIGNATURE \
218 The common notify function used in HTTP driver.
220 @param[in] Event The event signaled.
221 @param[in] Context The context.
232 Create events for the TCP connection token and TCP close token.
234 @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
236 @retval EFI_SUCCESS The events are created successfully.
237 @retval others Other error as indicated.
241 HttpCreateTcpConnCloseEvent (
242 IN HTTP_PROTOCOL
*HttpInstance
246 Close events in the TCP connection token and TCP close token.
248 @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
252 HttpCloseTcpConnCloseEvent (
253 IN HTTP_PROTOCOL
*HttpInstance
257 Create event for the TCP transmit token.
259 @param[in] Wrap Point to HTTP token's wrap data.
261 @retval EFI_SUCCESS The events is created successfully.
262 @retval others Other error as indicated.
266 HttpCreateTcpTxEvent (
267 IN HTTP_TOKEN_WRAP
*Wrap
271 Create event for the TCP receive token which is used to receive HTTP header.
273 @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
275 @retval EFI_SUCCESS The events is created successfully.
276 @retval others Other error as indicated.
280 HttpCreateTcpRxEventForHeader (
281 IN HTTP_PROTOCOL
*HttpInstance
285 Create event for the TCP receive token which is used to receive HTTP body.
287 @param[in] Wrap Point to HTTP token's wrap data.
289 @retval EFI_SUCCESS The events is created successfully.
290 @retval others Other error as indicated.
294 HttpCreateTcpRxEvent (
295 IN HTTP_TOKEN_WRAP
*Wrap
299 Close Events for Tcp Receive Tokens for HTTP body and HTTP header.
301 @param[in] Wrap Pointer to HTTP token's wrap data.
305 HttpCloseTcpRxEvent (
306 IN HTTP_TOKEN_WRAP
*Wrap
310 Initialize the HTTP_PROTOCOL structure to the unconfigured state.
312 @param[in, out] HttpInstance Pointer to HTTP_PROTOCOL structure.
313 @param[in] IpVersion Indicate us TCP4 protocol or TCP6 protocol.
315 @retval EFI_SUCCESS HTTP_PROTOCOL structure is initialized successfully.
316 @retval Others Other error as indicated.
321 IN OUT HTTP_PROTOCOL
*HttpInstance
,
326 Clean up the HTTP child, release all the resources used by it.
328 @param[in] HttpInstance The HTTP child to clean up.
333 IN HTTP_PROTOCOL
*HttpInstance
337 Establish TCP connection with HTTP server.
339 @param[in] HttpInstance The HTTP instance private data.
341 @retval EFI_SUCCESS The TCP connection is established.
342 @retval Others Other error as indicated.
346 HttpCreateConnection (
347 IN HTTP_PROTOCOL
*HttpInstance
351 Close existing TCP connection.
353 @param[in] HttpInstance The HTTP instance private data.
355 @retval EFI_SUCCESS The TCP connection is closed.
356 @retval Others Other error as indicated.
360 HttpCloseConnection (
361 IN HTTP_PROTOCOL
*HttpInstance
365 Configure TCP4 protocol child.
367 @param[in] HttpInstance The HTTP instance private data.
368 @param[in] Wrap The HTTP token's wrap data.
370 @retval EFI_SUCCESS The TCP4 protocol child is configured.
371 @retval Others Other error as indicated.
376 IN HTTP_PROTOCOL
*HttpInstance
,
377 IN HTTP_TOKEN_WRAP
*Wrap
381 Configure TCP6 protocol child.
383 @param[in] HttpInstance The HTTP instance private data.
384 @param[in] Wrap The HTTP token's wrap data.
386 @retval EFI_SUCCESS The TCP6 protocol child is configured.
387 @retval Others Other error as indicated.
392 IN HTTP_PROTOCOL
*HttpInstance
,
393 IN HTTP_TOKEN_WRAP
*Wrap
397 Check existing TCP connection, if in error state, recover TCP4 connection. Then,
398 connect one TLS session if required.
400 @param[in] HttpInstance The HTTP instance private data.
402 @retval EFI_SUCCESS The TCP connection is established.
403 @retval EFI_NOT_READY TCP4 protocol child is not created or configured.
404 @retval Others Other error as indicated.
409 IN HTTP_PROTOCOL
*HttpInstance
413 Check existing TCP connection, if in error state, recover TCP6 connection. Then,
414 connect one TLS session if required.
416 @param[in] HttpInstance The HTTP instance private data.
418 @retval EFI_SUCCESS The TCP connection is established.
419 @retval EFI_NOT_READY TCP6 protocol child is not created or configured.
420 @retval Others Other error as indicated.
425 IN HTTP_PROTOCOL
*HttpInstance
429 Send the HTTP or HTTPS message through TCP4 or TCP6.
431 @param[in] HttpInstance The HTTP instance private data.
432 @param[in] Wrap The HTTP token's wrap data.
433 @param[in] TxString Buffer containing the HTTP message string.
434 @param[in] TxStringLen Length of the HTTP message string in bytes.
436 @retval EFI_SUCCESS The HTTP message is queued into TCP transmit queue.
437 @retval Others Other error as indicated.
442 IN HTTP_PROTOCOL
*HttpInstance
,
443 IN HTTP_TOKEN_WRAP
*Wrap
,
449 Check whether the user's token or event has already
450 been enqueue on HTTP Tx or Rx Token list.
452 @param[in] Map The container of either user's transmit or receive
454 @param[in] Item Current item to check against.
455 @param[in] Context The Token to check against.
457 @retval EFI_ACCESS_DENIED The token or event has already been enqueued in IP
458 @retval EFI_SUCCESS The current item isn't the same token/event as the
466 IN NET_MAP_ITEM
*Item
,
471 Check whether the HTTP message associated with TxToken or Tx6Token is already sent out.
473 @param[in] Map The container of TxToken.
474 @param[in] Item Current item to check against.
475 @param[in] Context The Token to check against.
477 @retval EFI_NOT_READY The HTTP message is still queued in the list.
478 @retval EFI_SUCCESS The HTTP message has been sent out.
485 IN NET_MAP_ITEM
*Item
,
490 Initialize Http session.
492 @param[in] HttpInstance The HTTP instance private data.
493 @param[in] Wrap The HTTP token's wrap data.
494 @param[in] Configure The Flag indicates whether need to initialize session.
495 @param[in] TlsConfigure The Flag indicates whether it's the new Tls session.
497 @retval EFI_SUCCESS The initialization of session is done.
498 @retval Others Other error as indicated.
503 IN HTTP_PROTOCOL
*HttpInstance
,
504 IN HTTP_TOKEN_WRAP
*Wrap
,
505 IN BOOLEAN Configure
,
506 IN BOOLEAN TlsConfigure
510 Transmit the HTTP or HTTPS message by processing the associated HTTP token.
512 @param[in] Map The container of TxToken or Tx6Token.
513 @param[in] Item Current item to check against.
514 @param[in] Context The Token to check against.
516 @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
517 @retval EFI_SUCCESS The HTTP message is queued into TCP transmit
525 IN NET_MAP_ITEM
*Item
,
530 Receive the HTTP response by processing the associated HTTP token.
532 @param[in] Map The container of Rx4Token or Rx6Token.
533 @param[in] Item Current item to check against.
534 @param[in] Context The Token to check against.
536 @retval EFI_SUCCESS The HTTP response is queued into TCP receive
538 @retval Others Other error as indicated.
545 IN NET_MAP_ITEM
*Item
,
550 Receive the HTTP header by processing the associated HTTP token.
552 @param[in] HttpInstance The HTTP instance private data.
553 @param[in, out] SizeofHeaders The HTTP header length.
554 @param[in, out] BufferSize The size of buffer to cache the header message.
555 @param[in] Timeout The time to wait for receiving the header packet.
557 @retval EFI_SUCCESS The HTTP header is received.
558 @retval Others Other errors as indicated.
562 HttpTcpReceiveHeader (
563 IN HTTP_PROTOCOL
*HttpInstance
,
564 IN OUT UINTN
*SizeofHeaders
,
565 IN OUT UINTN
*BufferSize
,
570 Receive the HTTP body by processing the associated HTTP token.
572 @param[in] Wrap The HTTP token's wrap data.
573 @param[in] HttpMsg The HTTP message data.
575 @retval EFI_SUCCESS The HTTP body is received.
576 @retval Others Other error as indicated.
581 IN HTTP_TOKEN_WRAP
*Wrap
,
582 IN EFI_HTTP_MESSAGE
*HttpMsg
586 Clean up Tcp Tokens while the Tcp transmission error occurs.
588 @param[in] Wrap Pointer to HTTP token's wrap data.
592 HttpTcpTokenCleanup (
593 IN HTTP_TOKEN_WRAP
*Wrap
597 The work function of EfiHttpResponse().
599 @param[in] Wrap Pointer to HTTP token's wrap data.
601 @retval EFI_SUCCESS Allocation succeeded.
602 @retval EFI_OUT_OF_RESOURCES Failed to complete the operation due to lack of resources.
603 @retval EFI_NOT_READY Can't find a corresponding TxToken.
608 IN HTTP_TOKEN_WRAP
*Wrap
612 Send Events via EDKII_HTTP_CALLBACK_PROTOCOL.
614 @param[in] Event The event that occurs in the current state.
615 @param[in] EventStatus The Status of Event, EFI_SUCCESS or other errors.
620 IN EDKII_HTTP_CALLBACK_EVENT Event
,
621 IN EFI_STATUS EventStatus