VirtualBox

source: vbox/trunk/src/VBox/Devices/EFI/FirmwareNew/NetworkPkg/HttpDxe/HttpProto.h

Last change on this file was 108794, checked in by vboxsync, 4 weeks ago

Devices/EFI/FirmwareNew: Merge edk2-stable202502 from the vendor branch and make it build for the important platforms, bugref:4643

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

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette