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