]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - NetworkPkg/HttpDxe/HttpProto.h
NetworkPkg: Apply uncrustify changes
[mirror_edk2.git] / NetworkPkg / HttpDxe / HttpProto.h
... / ...
CommitLineData
1/** @file\r
2 The header files of miscellaneous routines for HttpDxe driver.\r
3\r
4Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR>\r
5(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
6SPDX-License-Identifier: BSD-2-Clause-Patent\r
7\r
8**/\r
9\r
10#ifndef __EFI_HTTP_PROTO_H__\r
11#define __EFI_HTTP_PROTO_H__\r
12\r
13#define DEF_BUF_LEN 2048\r
14\r
15#define HTTP_SERVICE_SIGNATURE SIGNATURE_32('H', 't', 't', 'S')\r
16\r
17#define HTTP_SERVICE_FROM_PROTOCOL(a) \\r
18 CR ( \\r
19 (a), \\r
20 HTTP_SERVICE, \\r
21 ServiceBinding, \\r
22 HTTP_SERVICE_SIGNATURE \\r
23 )\r
24\r
25//\r
26// The state of HTTP protocol. It starts from UNCONFIGED.\r
27//\r
28#define HTTP_STATE_UNCONFIGED 0\r
29#define HTTP_STATE_HTTP_CONFIGED 1\r
30#define HTTP_STATE_TCP_CONFIGED 2\r
31#define HTTP_STATE_TCP_UNCONFIGED 3\r
32#define HTTP_STATE_TCP_CONNECTED 4\r
33#define HTTP_STATE_TCP_CLOSED 5\r
34\r
35//\r
36// TCP configured data.\r
37//\r
38#define HTTP_TOS_DEAULT 8\r
39#define HTTP_TTL_DEAULT 255\r
40#define HTTP_BUFFER_SIZE_DEAULT 65535\r
41#define HTTP_MAX_SYN_BACK_LOG 5\r
42#define HTTP_CONNECTION_TIMEOUT 60\r
43#define HTTP_DATA_RETRIES 12\r
44#define HTTP_FIN_TIMEOUT 2\r
45#define HTTP_KEEP_ALIVE_PROBES 6\r
46#define HTTP_KEEP_ALIVE_TIME 7200\r
47#define HTTP_KEEP_ALIVE_INTERVAL 30\r
48\r
49#define HTTP_URL_BUFFER_LEN 4096\r
50\r
51typedef struct _HTTP_SERVICE {\r
52 UINT32 Signature;\r
53 EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;\r
54 EFI_HANDLE Ip4DriverBindingHandle;\r
55 EFI_HANDLE Ip6DriverBindingHandle;\r
56 EFI_HANDLE ControllerHandle;\r
57 EFI_HANDLE Tcp4ChildHandle;\r
58 EFI_HANDLE Tcp6ChildHandle;\r
59 LIST_ENTRY ChildrenList;\r
60 UINTN ChildrenNumber;\r
61 INTN State;\r
62} HTTP_SERVICE;\r
63\r
64typedef struct {\r
65 EFI_TCP4_IO_TOKEN Tx4Token;\r
66 EFI_TCP4_TRANSMIT_DATA Tx4Data;\r
67 EFI_TCP6_IO_TOKEN Tx6Token;\r
68 EFI_TCP6_TRANSMIT_DATA Tx6Data;\r
69 EFI_TCP4_IO_TOKEN Rx4Token;\r
70 EFI_TCP4_RECEIVE_DATA Rx4Data;\r
71 EFI_TCP6_IO_TOKEN Rx6Token;\r
72 EFI_TCP6_RECEIVE_DATA Rx6Data;\r
73 BOOLEAN IsTxDone;\r
74 BOOLEAN IsRxDone;\r
75 UINTN BodyLen;\r
76 EFI_HTTP_METHOD Method;\r
77} HTTP_TCP_TOKEN_WRAP;\r
78\r
79typedef struct {\r
80 EFI_TLS_VERSION Version;\r
81 EFI_TLS_CONNECTION_END ConnectionEnd;\r
82 EFI_TLS_VERIFY VerifyMethod;\r
83 EFI_TLS_VERIFY_HOST VerifyHost;\r
84 EFI_TLS_SESSION_STATE SessionState;\r
85} TLS_CONFIG_DATA;\r
86\r
87//\r
88// Callback data for HTTP_PARSER_CALLBACK()\r
89//\r
90typedef struct {\r
91 UINTN ParseDataLength;\r
92 VOID *ParseData;\r
93 VOID *Wrap;\r
94} HTTP_CALLBACK_DATA;\r
95\r
96typedef struct _HTTP_PROTOCOL {\r
97 UINT32 Signature;\r
98 EFI_HTTP_PROTOCOL Http;\r
99 EFI_HANDLE Handle;\r
100 HTTP_SERVICE *Service;\r
101 LIST_ENTRY Link; // Link to all HTTP instance from the service.\r
102 BOOLEAN InDestroy;\r
103 INTN State;\r
104 EFI_HTTP_METHOD Method;\r
105\r
106 UINTN StatusCode;\r
107\r
108 EFI_EVENT TimeoutEvent;\r
109\r
110 EFI_HANDLE Tcp4ChildHandle;\r
111 EFI_TCP4_PROTOCOL *Tcp4;\r
112 EFI_TCP4_CONFIG_DATA Tcp4CfgData;\r
113 EFI_TCP4_OPTION Tcp4Option;\r
114\r
115 EFI_TCP4_CONNECTION_TOKEN Tcp4ConnToken;\r
116 BOOLEAN IsTcp4ConnDone;\r
117 EFI_TCP4_CLOSE_TOKEN Tcp4CloseToken;\r
118 BOOLEAN IsTcp4CloseDone;\r
119 CHAR8 *RemoteHost;\r
120 UINT16 RemotePort;\r
121 EFI_IPv4_ADDRESS RemoteAddr;\r
122\r
123 EFI_HANDLE Tcp6ChildHandle;\r
124 EFI_TCP6_PROTOCOL *Tcp6;\r
125 EFI_TCP6_CONFIG_DATA Tcp6CfgData;\r
126 EFI_TCP6_OPTION Tcp6Option;\r
127\r
128 EFI_TCP6_CONNECTION_TOKEN Tcp6ConnToken;\r
129 BOOLEAN IsTcp6ConnDone;\r
130 EFI_TCP6_CLOSE_TOKEN Tcp6CloseToken;\r
131 BOOLEAN IsTcp6CloseDone;\r
132 EFI_IPv6_ADDRESS RemoteIpv6Addr;\r
133\r
134 //\r
135 // Rx4Token or Rx6Token used for receiving HTTP header.\r
136 //\r
137 EFI_TCP4_IO_TOKEN Rx4Token;\r
138 EFI_TCP4_RECEIVE_DATA Rx4Data;\r
139 EFI_TCP6_IO_TOKEN Rx6Token;\r
140 EFI_TCP6_RECEIVE_DATA Rx6Data;\r
141 BOOLEAN IsRxDone;\r
142\r
143 CHAR8 **EndofHeader;\r
144 CHAR8 **HttpHeaders;\r
145 CHAR8 *CacheBody;\r
146 CHAR8 *NextMsg;\r
147 UINTN CacheLen;\r
148 UINTN CacheOffset;\r
149\r
150 //\r
151 // HTTP message-body parser.\r
152 //\r
153 VOID *MsgParser;\r
154 HTTP_CALLBACK_DATA CallbackData;\r
155\r
156 EFI_HTTP_VERSION HttpVersion;\r
157 UINT32 TimeOutMillisec;\r
158 BOOLEAN LocalAddressIsIPv6;\r
159\r
160 EFI_HTTPv4_ACCESS_POINT IPv4Node;\r
161 EFI_HTTPv6_ACCESS_POINT Ipv6Node;\r
162\r
163 NET_MAP TxTokens;\r
164 NET_MAP RxTokens;\r
165\r
166 CHAR8 *Url;\r
167\r
168 //\r
169 // Https Support\r
170 //\r
171 BOOLEAN UseHttps;\r
172\r
173 EFI_SERVICE_BINDING_PROTOCOL *TlsSb;\r
174 EFI_HANDLE TlsChildHandle; /// Tls ChildHandle\r
175 TLS_CONFIG_DATA TlsConfigData;\r
176 EFI_TLS_PROTOCOL *Tls;\r
177 EFI_TLS_CONFIGURATION_PROTOCOL *TlsConfiguration;\r
178 EFI_TLS_SESSION_STATE TlsSessionState;\r
179\r
180 //\r
181 // TlsTxData used for transmitting TLS related messages.\r
182 //\r
183 EFI_TCP4_IO_TOKEN Tcp4TlsTxToken;\r
184 EFI_TCP4_TRANSMIT_DATA Tcp4TlsTxData;\r
185 EFI_TCP6_IO_TOKEN Tcp6TlsTxToken;\r
186 EFI_TCP6_TRANSMIT_DATA Tcp6TlsTxData;\r
187 BOOLEAN TlsIsTxDone;\r
188\r
189 //\r
190 // TlsRxData used for receiving TLS related messages.\r
191 //\r
192 EFI_TCP4_IO_TOKEN Tcp4TlsRxToken;\r
193 EFI_TCP4_RECEIVE_DATA Tcp4TlsRxData;\r
194 EFI_TCP6_IO_TOKEN Tcp6TlsRxToken;\r
195 EFI_TCP6_RECEIVE_DATA Tcp6TlsRxData;\r
196 BOOLEAN TlsIsRxDone;\r
197} HTTP_PROTOCOL;\r
198\r
199typedef struct {\r
200 EFI_HTTP_TOKEN *HttpToken;\r
201 HTTP_PROTOCOL *HttpInstance;\r
202 HTTP_TCP_TOKEN_WRAP TcpWrap;\r
203} HTTP_TOKEN_WRAP;\r
204\r
205#define HTTP_PROTOCOL_SIGNATURE SIGNATURE_32('H', 't', 't', 'P')\r
206\r
207#define HTTP_INSTANCE_FROM_PROTOCOL(a) \\r
208 CR ( \\r
209 (a), \\r
210 HTTP_PROTOCOL, \\r
211 Http, \\r
212 HTTP_PROTOCOL_SIGNATURE \\r
213 )\r
214\r
215/**\r
216 The common notify function used in HTTP driver.\r
217\r
218 @param[in] Event The event signaled.\r
219 @param[in] Context The context.\r
220\r
221**/\r
222VOID\r
223EFIAPI\r
224HttpCommonNotify (\r
225 IN EFI_EVENT Event,\r
226 IN VOID *Context\r
227 );\r
228\r
229/**\r
230 Create events for the TCP connection token and TCP close token.\r
231\r
232 @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.\r
233\r
234 @retval EFI_SUCCESS The events are created successfully.\r
235 @retval others Other error as indicated.\r
236\r
237**/\r
238EFI_STATUS\r
239HttpCreateTcpConnCloseEvent (\r
240 IN HTTP_PROTOCOL *HttpInstance\r
241 );\r
242\r
243/**\r
244 Close events in the TCP connection token and TCP close token.\r
245\r
246 @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.\r
247\r
248**/\r
249VOID\r
250HttpCloseTcpConnCloseEvent (\r
251 IN HTTP_PROTOCOL *HttpInstance\r
252 );\r
253\r
254/**\r
255 Create event for the TCP transmit token.\r
256\r
257 @param[in] Wrap Point to HTTP token's wrap data.\r
258\r
259 @retval EFI_SUCCESS The events is created successfully.\r
260 @retval others Other error as indicated.\r
261\r
262**/\r
263EFI_STATUS\r
264HttpCreateTcpTxEvent (\r
265 IN HTTP_TOKEN_WRAP *Wrap\r
266 );\r
267\r
268/**\r
269 Create event for the TCP receive token which is used to receive HTTP header.\r
270\r
271 @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.\r
272\r
273 @retval EFI_SUCCESS The events is created successfully.\r
274 @retval others Other error as indicated.\r
275\r
276**/\r
277EFI_STATUS\r
278HttpCreateTcpRxEventForHeader (\r
279 IN HTTP_PROTOCOL *HttpInstance\r
280 );\r
281\r
282/**\r
283 Create event for the TCP receive token which is used to receive HTTP body.\r
284\r
285 @param[in] Wrap Point to HTTP token's wrap data.\r
286\r
287 @retval EFI_SUCCESS The events is created successfully.\r
288 @retval others Other error as indicated.\r
289\r
290**/\r
291EFI_STATUS\r
292HttpCreateTcpRxEvent (\r
293 IN HTTP_TOKEN_WRAP *Wrap\r
294 );\r
295\r
296/**\r
297 Close Events for Tcp Receive Tokens for HTTP body and HTTP header.\r
298\r
299 @param[in] Wrap Pointer to HTTP token's wrap data.\r
300\r
301**/\r
302VOID\r
303HttpCloseTcpRxEvent (\r
304 IN HTTP_TOKEN_WRAP *Wrap\r
305 );\r
306\r
307/**\r
308 Initialize the HTTP_PROTOCOL structure to the unconfigured state.\r
309\r
310 @param[in, out] HttpInstance Pointer to HTTP_PROTOCOL structure.\r
311 @param[in] IpVersion Indicate us TCP4 protocol or TCP6 protocol.\r
312\r
313 @retval EFI_SUCCESS HTTP_PROTOCOL structure is initialized successfully.\r
314 @retval Others Other error as indicated.\r
315\r
316**/\r
317EFI_STATUS\r
318HttpInitProtocol (\r
319 IN OUT HTTP_PROTOCOL *HttpInstance,\r
320 IN BOOLEAN IpVersion\r
321 );\r
322\r
323/**\r
324 Clean up the HTTP child, release all the resources used by it.\r
325\r
326 @param[in] HttpInstance The HTTP child to clean up.\r
327\r
328**/\r
329VOID\r
330HttpCleanProtocol (\r
331 IN HTTP_PROTOCOL *HttpInstance\r
332 );\r
333\r
334/**\r
335 Establish TCP connection with HTTP server.\r
336\r
337 @param[in] HttpInstance The HTTP instance private data.\r
338\r
339 @retval EFI_SUCCESS The TCP connection is established.\r
340 @retval Others Other error as indicated.\r
341\r
342**/\r
343EFI_STATUS\r
344HttpCreateConnection (\r
345 IN HTTP_PROTOCOL *HttpInstance\r
346 );\r
347\r
348/**\r
349 Close existing TCP connection.\r
350\r
351 @param[in] HttpInstance The HTTP instance private data.\r
352\r
353 @retval EFI_SUCCESS The TCP connection is closed.\r
354 @retval Others Other error as indicated.\r
355\r
356**/\r
357EFI_STATUS\r
358HttpCloseConnection (\r
359 IN HTTP_PROTOCOL *HttpInstance\r
360 );\r
361\r
362/**\r
363 Configure TCP4 protocol child.\r
364\r
365 @param[in] HttpInstance The HTTP instance private data.\r
366 @param[in] Wrap The HTTP token's wrap data.\r
367\r
368 @retval EFI_SUCCESS The TCP4 protocol child is configured.\r
369 @retval Others Other error as indicated.\r
370\r
371**/\r
372EFI_STATUS\r
373HttpConfigureTcp4 (\r
374 IN HTTP_PROTOCOL *HttpInstance,\r
375 IN HTTP_TOKEN_WRAP *Wrap\r
376 );\r
377\r
378/**\r
379 Configure TCP6 protocol child.\r
380\r
381 @param[in] HttpInstance The HTTP instance private data.\r
382 @param[in] Wrap The HTTP token's wrap data.\r
383\r
384 @retval EFI_SUCCESS The TCP6 protocol child is configured.\r
385 @retval Others Other error as indicated.\r
386\r
387**/\r
388EFI_STATUS\r
389HttpConfigureTcp6 (\r
390 IN HTTP_PROTOCOL *HttpInstance,\r
391 IN HTTP_TOKEN_WRAP *Wrap\r
392 );\r
393\r
394/**\r
395 Check existing TCP connection, if in error state, recover TCP4 connection. Then,\r
396 connect one TLS session if required.\r
397\r
398 @param[in] HttpInstance The HTTP instance private data.\r
399\r
400 @retval EFI_SUCCESS The TCP connection is established.\r
401 @retval EFI_NOT_READY TCP4 protocol child is not created or configured.\r
402 @retval Others Other error as indicated.\r
403\r
404**/\r
405EFI_STATUS\r
406HttpConnectTcp4 (\r
407 IN HTTP_PROTOCOL *HttpInstance\r
408 );\r
409\r
410/**\r
411 Check existing TCP connection, if in error state, recover TCP6 connection. Then,\r
412 connect one TLS session if required.\r
413\r
414 @param[in] HttpInstance The HTTP instance private data.\r
415\r
416 @retval EFI_SUCCESS The TCP connection is established.\r
417 @retval EFI_NOT_READY TCP6 protocol child is not created or configured.\r
418 @retval Others Other error as indicated.\r
419\r
420**/\r
421EFI_STATUS\r
422HttpConnectTcp6 (\r
423 IN HTTP_PROTOCOL *HttpInstance\r
424 );\r
425\r
426/**\r
427 Send the HTTP or HTTPS message through TCP4 or TCP6.\r
428\r
429 @param[in] HttpInstance The HTTP instance private data.\r
430 @param[in] Wrap The HTTP token's wrap data.\r
431 @param[in] TxString Buffer containing the HTTP message string.\r
432 @param[in] TxStringLen Length of the HTTP message string in bytes.\r
433\r
434 @retval EFI_SUCCESS The HTTP message is queued into TCP transmit queue.\r
435 @retval Others Other error as indicated.\r
436\r
437**/\r
438EFI_STATUS\r
439HttpTransmitTcp (\r
440 IN HTTP_PROTOCOL *HttpInstance,\r
441 IN HTTP_TOKEN_WRAP *Wrap,\r
442 IN UINT8 *TxString,\r
443 IN UINTN TxStringLen\r
444 );\r
445\r
446/**\r
447 Check whether the user's token or event has already\r
448 been enqueue on HTTP Tx or Rx Token list.\r
449\r
450 @param[in] Map The container of either user's transmit or receive\r
451 token.\r
452 @param[in] Item Current item to check against.\r
453 @param[in] Context The Token to check against.\r
454\r
455 @retval EFI_ACCESS_DENIED The token or event has already been enqueued in IP\r
456 @retval EFI_SUCCESS The current item isn't the same token/event as the\r
457 context.\r
458\r
459**/\r
460EFI_STATUS\r
461EFIAPI\r
462HttpTokenExist (\r
463 IN NET_MAP *Map,\r
464 IN NET_MAP_ITEM *Item,\r
465 IN VOID *Context\r
466 );\r
467\r
468/**\r
469 Check whether the HTTP message associated with TxToken or Tx6Token is already sent out.\r
470\r
471 @param[in] Map The container of TxToken.\r
472 @param[in] Item Current item to check against.\r
473 @param[in] Context The Token to check against.\r
474\r
475 @retval EFI_NOT_READY The HTTP message is still queued in the list.\r
476 @retval EFI_SUCCESS The HTTP message has been sent out.\r
477\r
478**/\r
479EFI_STATUS\r
480EFIAPI\r
481HttpTcpNotReady (\r
482 IN NET_MAP *Map,\r
483 IN NET_MAP_ITEM *Item,\r
484 IN VOID *Context\r
485 );\r
486\r
487/**\r
488 Initialize Http session.\r
489\r
490 @param[in] HttpInstance The HTTP instance private data.\r
491 @param[in] Wrap The HTTP token's wrap data.\r
492 @param[in] Configure The Flag indicates whether need to initialize session.\r
493 @param[in] TlsConfigure The Flag indicates whether it's the new Tls session.\r
494\r
495 @retval EFI_SUCCESS The initialization of session is done.\r
496 @retval Others Other error as indicated.\r
497\r
498**/\r
499EFI_STATUS\r
500HttpInitSession (\r
501 IN HTTP_PROTOCOL *HttpInstance,\r
502 IN HTTP_TOKEN_WRAP *Wrap,\r
503 IN BOOLEAN Configure,\r
504 IN BOOLEAN TlsConfigure\r
505 );\r
506\r
507/**\r
508 Transmit the HTTP or HTTPS message by processing the associated HTTP token.\r
509\r
510 @param[in] Map The container of TxToken or Tx6Token.\r
511 @param[in] Item Current item to check against.\r
512 @param[in] Context The Token to check against.\r
513\r
514 @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.\r
515 @retval EFI_SUCCESS The HTTP message is queued into TCP transmit\r
516 queue.\r
517\r
518**/\r
519EFI_STATUS\r
520EFIAPI\r
521HttpTcpTransmit (\r
522 IN NET_MAP *Map,\r
523 IN NET_MAP_ITEM *Item,\r
524 IN VOID *Context\r
525 );\r
526\r
527/**\r
528 Receive the HTTP response by processing the associated HTTP token.\r
529\r
530 @param[in] Map The container of Rx4Token or Rx6Token.\r
531 @param[in] Item Current item to check against.\r
532 @param[in] Context The Token to check against.\r
533\r
534 @retval EFI_SUCCESS The HTTP response is queued into TCP receive\r
535 queue.\r
536 @retval Others Other error as indicated.\r
537\r
538**/\r
539EFI_STATUS\r
540EFIAPI\r
541HttpTcpReceive (\r
542 IN NET_MAP *Map,\r
543 IN NET_MAP_ITEM *Item,\r
544 IN VOID *Context\r
545 );\r
546\r
547/**\r
548 Receive the HTTP header by processing the associated HTTP token.\r
549\r
550 @param[in] HttpInstance The HTTP instance private data.\r
551 @param[in, out] SizeofHeaders The HTTP header length.\r
552 @param[in, out] BufferSize The size of buffer to cache the header message.\r
553 @param[in] Timeout The time to wait for receiving the header packet.\r
554\r
555 @retval EFI_SUCCESS The HTTP header is received.\r
556 @retval Others Other errors as indicated.\r
557\r
558**/\r
559EFI_STATUS\r
560HttpTcpReceiveHeader (\r
561 IN HTTP_PROTOCOL *HttpInstance,\r
562 IN OUT UINTN *SizeofHeaders,\r
563 IN OUT UINTN *BufferSize,\r
564 IN EFI_EVENT Timeout\r
565 );\r
566\r
567/**\r
568 Receive the HTTP body by processing the associated HTTP token.\r
569\r
570 @param[in] Wrap The HTTP token's wrap data.\r
571 @param[in] HttpMsg The HTTP message data.\r
572\r
573 @retval EFI_SUCCESS The HTTP body is received.\r
574 @retval Others Other error as indicated.\r
575\r
576**/\r
577EFI_STATUS\r
578HttpTcpReceiveBody (\r
579 IN HTTP_TOKEN_WRAP *Wrap,\r
580 IN EFI_HTTP_MESSAGE *HttpMsg\r
581 );\r
582\r
583/**\r
584 Clean up Tcp Tokens while the Tcp transmission error occurs.\r
585\r
586 @param[in] Wrap Pointer to HTTP token's wrap data.\r
587\r
588**/\r
589VOID\r
590HttpTcpTokenCleanup (\r
591 IN HTTP_TOKEN_WRAP *Wrap\r
592 );\r
593\r
594/**\r
595 The work function of EfiHttpResponse().\r
596\r
597 @param[in] Wrap Pointer to HTTP token's wrap data.\r
598\r
599 @retval EFI_SUCCESS Allocation succeeded.\r
600 @retval EFI_OUT_OF_RESOURCES Failed to complete the operation due to lack of resources.\r
601 @retval EFI_NOT_READY Can't find a corresponding TxToken.\r
602\r
603**/\r
604EFI_STATUS\r
605HttpResponseWorker (\r
606 IN HTTP_TOKEN_WRAP *Wrap\r
607 );\r
608\r
609/**\r
610 Send Events via EDKII_HTTP_CALLBACK_PROTOCOL.\r
611\r
612 @param[in] Event The event that occurs in the current state.\r
613 @param[in] EventStatus The Status of Event, EFI_SUCCESS or other errors.\r
614\r
615**/\r
616VOID\r
617HttpNotify (\r
618 IN EDKII_HTTP_CALLBACK_EVENT Event,\r
619 IN EFI_STATUS EventStatus\r
620 );\r
621\r
622#endif\r