2 The header files of miscellaneous routines for HttpDxe driver.
4 Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>
5 (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #ifndef __EFI_HTTP_PROTO_H__
17 #define __EFI_HTTP_PROTO_H__
19 #define DEF_BUF_LEN 2048
21 #define HTTP_SERVICE_SIGNATURE SIGNATURE_32('H', 't', 't', 'S')
23 #define HTTP_SERVICE_FROM_PROTOCOL(a) \
28 HTTP_SERVICE_SIGNATURE \
33 // The state of HTTP protocol. It starts from UNCONFIGED.
35 #define HTTP_STATE_UNCONFIGED 0
36 #define HTTP_STATE_HTTP_CONFIGED 1
37 #define HTTP_STATE_TCP_CONFIGED 2
38 #define HTTP_STATE_TCP_UNCONFIGED 3
39 #define HTTP_STATE_TCP_CONNECTED 4
40 #define HTTP_STATE_TCP_CLOSED 5
43 // TCP configured data.
45 #define HTTP_TOS_DEAULT 8
46 #define HTTP_TTL_DEAULT 255
47 #define HTTP_BUFFER_SIZE_DEAULT 65535
48 #define HTTP_MAX_SYN_BACK_LOG 5
49 #define HTTP_CONNECTION_TIMEOUT 60
50 #define HTTP_RESPONSE_TIMEOUT 5
51 #define HTTP_DATA_RETRIES 12
52 #define HTTP_FIN_TIMEOUT 2
53 #define HTTP_KEEP_ALIVE_PROBES 6
54 #define HTTP_KEEP_ALIVE_TIME 7200
55 #define HTTP_KEEP_ALIVE_INTERVAL 30
57 #define HTTP_URL_BUFFER_LEN 4096
59 typedef struct _HTTP_SERVICE
{
61 EFI_SERVICE_BINDING_PROTOCOL ServiceBinding
;
62 EFI_HANDLE Ip4DriverBindingHandle
;
63 EFI_HANDLE Ip6DriverBindingHandle
;
64 EFI_HANDLE ControllerHandle
;
65 EFI_HANDLE Tcp4ChildHandle
;
66 EFI_HANDLE Tcp6ChildHandle
;
67 LIST_ENTRY ChildrenList
;
73 EFI_TCP4_IO_TOKEN Tx4Token
;
74 EFI_TCP4_TRANSMIT_DATA Tx4Data
;
75 EFI_TCP6_IO_TOKEN Tx6Token
;
76 EFI_TCP6_TRANSMIT_DATA Tx6Data
;
77 EFI_TCP4_IO_TOKEN Rx4Token
;
78 EFI_TCP4_RECEIVE_DATA Rx4Data
;
79 EFI_TCP6_IO_TOKEN Rx6Token
;
80 EFI_TCP6_RECEIVE_DATA Rx6Data
;
84 EFI_HTTP_METHOD Method
;
85 } HTTP_TCP_TOKEN_WRAP
;
88 EFI_TLS_VERSION Version
;
89 EFI_TLS_CONNECTION_END ConnectionEnd
;
90 EFI_TLS_VERIFY VerifyMethod
;
91 EFI_TLS_SESSION_STATE SessionState
;
94 typedef struct _HTTP_PROTOCOL
{
96 EFI_HTTP_PROTOCOL Http
;
98 HTTP_SERVICE
*Service
;
99 LIST_ENTRY Link
; // Link to all HTTP instance from the service.
102 EFI_HTTP_METHOD Method
;
106 EFI_EVENT TimeoutEvent
;
108 EFI_HANDLE Tcp4ChildHandle
;
109 EFI_TCP4_PROTOCOL
*Tcp4
;
110 EFI_TCP4_CONFIG_DATA Tcp4CfgData
;
111 EFI_TCP4_OPTION Tcp4Option
;
113 EFI_TCP4_CONNECTION_TOKEN Tcp4ConnToken
;
114 BOOLEAN IsTcp4ConnDone
;
115 EFI_TCP4_CLOSE_TOKEN Tcp4CloseToken
;
116 BOOLEAN IsTcp4CloseDone
;
119 EFI_IPv4_ADDRESS RemoteAddr
;
121 EFI_HANDLE Tcp6ChildHandle
;
122 EFI_TCP6_PROTOCOL
*Tcp6
;
123 EFI_TCP6_CONFIG_DATA Tcp6CfgData
;
124 EFI_TCP6_OPTION Tcp6Option
;
126 EFI_TCP6_CONNECTION_TOKEN Tcp6ConnToken
;
127 BOOLEAN IsTcp6ConnDone
;
128 EFI_TCP6_CLOSE_TOKEN Tcp6CloseToken
;
129 BOOLEAN IsTcp6CloseDone
;
130 EFI_IPv6_ADDRESS RemoteIpv6Addr
;
133 // Rx4Token or Rx6Token used for receiving HTTP header.
135 EFI_TCP4_IO_TOKEN Rx4Token
;
136 EFI_TCP4_RECEIVE_DATA Rx4Data
;
137 EFI_TCP6_IO_TOKEN Rx6Token
;
138 EFI_TCP6_RECEIVE_DATA Rx6Data
;
149 // HTTP message-body parser.
153 EFI_HTTP_VERSION HttpVersion
;
154 UINT32 TimeOutMillisec
;
155 BOOLEAN LocalAddressIsIPv6
;
157 EFI_HTTPv4_ACCESS_POINT IPv4Node
;
158 EFI_HTTPv6_ACCESS_POINT Ipv6Node
;
170 EFI_SERVICE_BINDING_PROTOCOL
*TlsSb
;
171 EFI_HANDLE TlsChildHandle
; /// Tls ChildHandle
172 TLS_CONFIG_DATA TlsConfigData
;
173 EFI_TLS_PROTOCOL
*Tls
;
174 EFI_TLS_CONFIGURATION_PROTOCOL
*TlsConfiguration
;
175 EFI_TLS_SESSION_STATE TlsSessionState
;
178 // TlsTxData used for transmitting TLS related messages.
180 EFI_TCP4_IO_TOKEN Tcp4TlsTxToken
;
181 EFI_TCP4_TRANSMIT_DATA Tcp4TlsTxData
;
182 EFI_TCP6_IO_TOKEN Tcp6TlsTxToken
;
183 EFI_TCP6_TRANSMIT_DATA Tcp6TlsTxData
;
187 // TlsRxData used for receiving TLS related messages.
189 EFI_TCP4_IO_TOKEN Tcp4TlsRxToken
;
190 EFI_TCP4_RECEIVE_DATA Tcp4TlsRxData
;
191 EFI_TCP6_IO_TOKEN Tcp6TlsRxToken
;
192 EFI_TCP6_RECEIVE_DATA Tcp6TlsRxData
;
197 EFI_HTTP_TOKEN
*HttpToken
;
198 HTTP_PROTOCOL
*HttpInstance
;
199 HTTP_TCP_TOKEN_WRAP TcpWrap
;
203 #define HTTP_PROTOCOL_SIGNATURE SIGNATURE_32('H', 't', 't', 'P')
205 #define HTTP_INSTANCE_FROM_PROTOCOL(a) \
210 HTTP_PROTOCOL_SIGNATURE \
214 The common notify function used in HTTP driver.
216 @param[in] Event The event signaled.
217 @param[in] Context The context.
228 Create events for the TCP connection token and TCP close token.
230 @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
232 @retval EFI_SUCCESS The events are created successfully.
233 @retval others Other error as indicated.
237 HttpCreateTcpConnCloseEvent (
238 IN HTTP_PROTOCOL
*HttpInstance
242 Close events in the TCP connection token and TCP close token.
244 @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
248 HttpCloseTcpConnCloseEvent (
249 IN HTTP_PROTOCOL
*HttpInstance
253 Create event for the TCP transmit token.
255 @param[in] Wrap Point to HTTP token's wrap data.
257 @retval EFI_SUCCESS The events is created successfully.
258 @retval others Other error as indicated.
262 HttpCreateTcpTxEvent (
263 IN HTTP_TOKEN_WRAP
*Wrap
267 Create event for the TCP receive token which is used to receive HTTP header.
269 @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
271 @retval EFI_SUCCESS The events is created successfully.
272 @retval others Other error as indicated.
276 HttpCreateTcpRxEventForHeader (
277 IN HTTP_PROTOCOL
*HttpInstance
281 Create event for the TCP receive token which is used to receive HTTP body.
283 @param[in] Wrap Point to HTTP token's wrap data.
285 @retval EFI_SUCCESS The events is created successfully.
286 @retval others Other error as indicated.
290 HttpCreateTcpRxEvent (
291 IN HTTP_TOKEN_WRAP
*Wrap
295 Close Events for Tcp Receive Tokens for HTTP body and HTTP header.
297 @param[in] Wrap Pointer to HTTP token's wrap data.
301 HttpCloseTcpRxEvent (
302 IN HTTP_TOKEN_WRAP
*Wrap
306 Intiialize the HTTP_PROTOCOL structure to the unconfigured state.
308 @param[in, out] HttpInstance Pointer to HTTP_PROTOCOL structure.
309 @param[in] IpVersion Indicate us TCP4 protocol or TCP6 protocol.
311 @retval EFI_SUCCESS HTTP_PROTOCOL structure is initialized successfully.
312 @retval Others Other error as indicated.
317 IN OUT HTTP_PROTOCOL
*HttpInstance
,
322 Clean up the HTTP child, release all the resources used by it.
324 @param[in] HttpInstance The HTTP child to clean up.
329 IN HTTP_PROTOCOL
*HttpInstance
333 Establish TCP connection with HTTP server.
335 @param[in] HttpInstance The HTTP instance private data.
337 @retval EFI_SUCCESS The TCP connection is established.
338 @retval Others Other error as indicated.
342 HttpCreateConnection (
343 IN HTTP_PROTOCOL
*HttpInstance
347 Close existing TCP connection.
349 @param[in] HttpInstance The HTTP instance private data.
351 @retval EFI_SUCCESS The TCP connection is closed.
352 @retval Others Other error as indicated.
356 HttpCloseConnection (
357 IN HTTP_PROTOCOL
*HttpInstance
361 Configure TCP4 protocol child.
363 @param[in] HttpInstance The HTTP instance private data.
364 @param[in] Wrap The HTTP token's wrap data.
366 @retval EFI_SUCCESS The TCP4 protocol child is configured.
367 @retval Others Other error as indicated.
372 IN HTTP_PROTOCOL
*HttpInstance
,
373 IN HTTP_TOKEN_WRAP
*Wrap
377 Configure TCP6 protocol child.
379 @param[in] HttpInstance The HTTP instance private data.
380 @param[in] Wrap The HTTP token's wrap data.
382 @retval EFI_SUCCESS The TCP6 protocol child is configured.
383 @retval Others Other error as indicated.
388 IN HTTP_PROTOCOL
*HttpInstance
,
389 IN HTTP_TOKEN_WRAP
*Wrap
393 Check existing TCP connection, if in error state, recover TCP4 connection. Then,
394 connect one TLS session if required.
396 @param[in] HttpInstance The HTTP instance private data.
398 @retval EFI_SUCCESS The TCP connection is established.
399 @retval EFI_NOT_READY TCP4 protocol child is not created or configured.
400 @retval Others Other error as indicated.
405 IN HTTP_PROTOCOL
*HttpInstance
409 Check existing TCP connection, if in error state, recover TCP6 connection. Then,
410 connect one TLS session if required.
412 @param[in] HttpInstance The HTTP instance private data.
414 @retval EFI_SUCCESS The TCP connection is established.
415 @retval EFI_NOT_READY TCP6 protocol child is not created or configured.
416 @retval Others Other error as indicated.
421 IN HTTP_PROTOCOL
*HttpInstance
425 Send the HTTP or HTTPS message through TCP4 or TCP6.
427 @param[in] HttpInstance The HTTP instance private data.
428 @param[in] Wrap The HTTP token's wrap data.
429 @param[in] TxString Buffer containing the HTTP message string.
430 @param[in] TxStringLen Length of the HTTP message string in bytes.
432 @retval EFI_SUCCESS The HTTP message is queued into TCP transmit queue.
433 @retval Others Other error as indicated.
438 IN HTTP_PROTOCOL
*HttpInstance
,
439 IN HTTP_TOKEN_WRAP
*Wrap
,
445 Check whether the user's token or event has already
446 been enqueue on HTTP Tx or Rx Token list.
448 @param[in] Map The container of either user's transmit or receive
450 @param[in] Item Current item to check against.
451 @param[in] Context The Token to check againist.
453 @retval EFI_ACCESS_DENIED The token or event has already been enqueued in IP
454 @retval EFI_SUCCESS The current item isn't the same token/event as the
462 IN NET_MAP_ITEM
*Item
,
467 Check whether the HTTP message associated with TxToken or Tx6Token is already sent out.
469 @param[in] Map The container of TxToken.
470 @param[in] Item Current item to check against.
471 @param[in] Context The Token to check againist.
473 @retval EFI_NOT_READY The HTTP message is still queued in the list.
474 @retval EFI_SUCCESS The HTTP message has been sent out.
481 IN NET_MAP_ITEM
*Item
,
486 Initialize Http session.
488 @param[in] HttpInstance The HTTP instance private data.
489 @param[in] Wrap The HTTP token's wrap data.
490 @param[in] Configure The Flag indicates whether need to initialize session.
491 @param[in] TlsConfigure The Flag indicates whether it's the new Tls session.
493 @retval EFI_SUCCESS The initialization of session is done.
494 @retval Others Other error as indicated.
499 IN HTTP_PROTOCOL
*HttpInstance
,
500 IN HTTP_TOKEN_WRAP
*Wrap
,
501 IN BOOLEAN Configure
,
502 IN BOOLEAN TlsConfigure
506 Transmit the HTTP or HTTPS mssage by processing the associated HTTP token.
508 @param[in] Map The container of TxToken or Tx6Token.
509 @param[in] Item Current item to check against.
510 @param[in] Context The Token to check againist.
512 @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
513 @retval EFI_SUCCESS The HTTP message is queued into TCP transmit
521 IN NET_MAP_ITEM
*Item
,
526 Receive the HTTP response by processing the associated HTTP token.
528 @param[in] Map The container of Rx4Token or Rx6Token.
529 @param[in] Item Current item to check against.
530 @param[in] Context The Token to check againist.
532 @retval EFI_SUCCESS The HTTP response is queued into TCP receive
534 @retval Others Other error as indicated.
541 IN NET_MAP_ITEM
*Item
,
546 Receive the HTTP header by processing the associated HTTP token.
548 @param[in] HttpInstance The HTTP instance private data.
549 @param[in, out] SizeofHeaders The HTTP header length.
550 @param[in, out] BufferSize The size of buffer to cacahe the header message.
551 @param[in] Timeout The time to wait for receiving the header packet.
553 @retval EFI_SUCCESS The HTTP header is received.
554 @retval Others Other errors as indicated.
558 HttpTcpReceiveHeader (
559 IN HTTP_PROTOCOL
*HttpInstance
,
560 IN OUT UINTN
*SizeofHeaders
,
561 IN OUT UINTN
*BufferSize
,
566 Receive the HTTP body by processing the associated HTTP token.
568 @param[in] Wrap The HTTP token's wrap data.
569 @param[in] HttpMsg The HTTP message data.
571 @retval EFI_SUCCESS The HTTP body is received.
572 @retval Others Other error as indicated.
577 IN HTTP_TOKEN_WRAP
*Wrap
,
578 IN EFI_HTTP_MESSAGE
*HttpMsg
582 Clean up Tcp Tokens while the Tcp transmission error occurs.
584 @param[in] Wrap Pointer to HTTP token's wrap data.
588 HttpTcpTokenCleanup (
589 IN HTTP_TOKEN_WRAP
*Wrap
593 The work function of EfiHttpResponse().
595 @param[in] Wrap Pointer to HTTP token's wrap data.
597 @retval EFI_SUCCESS Allocation succeeded.
598 @retval EFI_OUT_OF_RESOURCES Failed to complete the opration due to lack of resources.
599 @retval EFI_NOT_READY Can't find a corresponding TxToken.
604 IN HTTP_TOKEN_WRAP
*Wrap