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