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