Home | History | Annotate | Download | only in HttpDxe
      1 /** @file
      2   The header files of miscellaneous routines for HttpDxe driver.
      3 
      4 Copyright (c) 2015, 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   EFI_HANDLE                    Tcp4ChildHandle;
     94   EFI_TCP4_PROTOCOL             *Tcp4;
     95   EFI_TCP4_CONFIG_DATA          Tcp4CfgData;
     96   EFI_TCP4_OPTION               Tcp4Option;
     97 
     98   EFI_TCP4_CONNECTION_TOKEN     Tcp4ConnToken;
     99   BOOLEAN                       IsTcp4ConnDone;
    100   EFI_TCP4_CLOSE_TOKEN          Tcp4CloseToken;
    101   BOOLEAN                       IsTcp4CloseDone;
    102   CHAR8                         *RemoteHost;
    103   UINT16                        RemotePort;
    104   EFI_IPv4_ADDRESS              RemoteAddr;
    105 
    106   EFI_HANDLE                    Tcp6ChildHandle;
    107   EFI_TCP6_PROTOCOL             *Tcp6;
    108   EFI_TCP6_CONFIG_DATA          Tcp6CfgData;
    109   EFI_TCP6_OPTION               Tcp6Option;
    110 
    111   EFI_TCP6_CONNECTION_TOKEN     Tcp6ConnToken;
    112   BOOLEAN                       IsTcp6ConnDone;
    113   EFI_TCP6_CLOSE_TOKEN          Tcp6CloseToken;
    114   BOOLEAN                       IsTcp6CloseDone;
    115   EFI_IPv6_ADDRESS              RemoteIpv6Addr;
    116 
    117 
    118 
    119   //
    120   // Rx4Token or Rx6Token used for receiving HTTP header.
    121   //
    122   EFI_TCP4_IO_TOKEN             Rx4Token;
    123   EFI_TCP4_RECEIVE_DATA         Rx4Data;
    124   EFI_TCP6_IO_TOKEN             Rx6Token;
    125   EFI_TCP6_RECEIVE_DATA         Rx6Data;
    126   BOOLEAN                       IsRxDone;
    127 
    128   CHAR8                         **EndofHeader;
    129   CHAR8                         **HttpHeaders;
    130   CHAR8                         *CacheBody;
    131   CHAR8                         *NextMsg;
    132   UINTN                         CacheLen;
    133   UINTN                         CacheOffset;
    134 
    135   //
    136   // HTTP message-body parser.
    137   //
    138   VOID                          *MsgParser;
    139 
    140   EFI_HTTP_VERSION              HttpVersion;
    141   UINT32                        TimeOutMillisec;
    142   BOOLEAN                       LocalAddressIsIPv6;
    143 
    144   EFI_HTTPv4_ACCESS_POINT       IPv4Node;
    145   EFI_HTTPv6_ACCESS_POINT       Ipv6Node;
    146 
    147   NET_MAP                       TxTokens;
    148   NET_MAP                       RxTokens;
    149 
    150   CHAR8                         *Url;
    151 } HTTP_PROTOCOL;
    152 
    153 typedef struct {
    154   EFI_HTTP_TOKEN                *HttpToken;
    155   HTTP_PROTOCOL                 *HttpInstance;
    156   HTTP_TCP_TOKEN_WRAP           TcpWrap;
    157 } HTTP_TOKEN_WRAP;
    158 
    159 
    160 #define HTTP_PROTOCOL_SIGNATURE  SIGNATURE_32('H', 't', 't', 'P')
    161 
    162 #define HTTP_INSTANCE_FROM_PROTOCOL(a) \
    163   CR ( \
    164   (a), \
    165   HTTP_PROTOCOL, \
    166   Http, \
    167   HTTP_PROTOCOL_SIGNATURE \
    168   )
    169 
    170 /**
    171   The common notify function used in HTTP driver.
    172 
    173   @param[in]  Event   The event signaled.
    174   @param[in]  Context The context.
    175 
    176 **/
    177 VOID
    178 EFIAPI
    179 HttpCommonNotify (
    180   IN EFI_EVENT  Event,
    181   IN VOID       *Context
    182   );
    183 
    184 /**
    185   Create events for the TCP connection token and TCP close token.
    186 
    187   @param[in]  HttpInstance       Pointer to HTTP_PROTOCOL structure.
    188 
    189   @retval EFI_SUCCESS            The events are created successfully.
    190   @retval others                 Other error as indicated.
    191 
    192 **/
    193 EFI_STATUS
    194 HttpCreateTcpConnCloseEvent (
    195   IN  HTTP_PROTOCOL        *HttpInstance
    196   );
    197 
    198 /**
    199   Close events in the TCP connection token and TCP close token.
    200 
    201   @param[in]  HttpInstance   Pointer to HTTP_PROTOCOL structure.
    202 
    203 **/
    204 VOID
    205 HttpCloseTcpConnCloseEvent (
    206   IN  HTTP_PROTOCOL        *HttpInstance
    207   );
    208 
    209 /**
    210   Create event for the TCP transmit token.
    211 
    212   @param[in]  Wrap               Point to HTTP token's wrap data.
    213 
    214   @retval EFI_SUCCESS            The events is created successfully.
    215   @retval others                 Other error as indicated.
    216 
    217 **/
    218 EFI_STATUS
    219 HttpCreateTcpTxEvent (
    220   IN  HTTP_TOKEN_WRAP      *Wrap
    221   );
    222 
    223 /**
    224   Create event for the TCP receive token which is used to receive HTTP header.
    225 
    226   @param[in]  HttpInstance       Pointer to HTTP_PROTOCOL structure.
    227 
    228   @retval EFI_SUCCESS            The events is created successfully.
    229   @retval others                 Other error as indicated.
    230 
    231 **/
    232 EFI_STATUS
    233 HttpCreateTcpRxEventForHeader (
    234   IN  HTTP_PROTOCOL        *HttpInstance
    235   );
    236 
    237 /**
    238   Create event for the TCP receive token which is used to receive HTTP body.
    239 
    240   @param[in]  Wrap               Point to HTTP token's wrap data.
    241 
    242   @retval EFI_SUCCESS            The events is created successfully.
    243   @retval others                 Other error as indicated.
    244 
    245 **/
    246 EFI_STATUS
    247 HttpCreateTcpRxEvent (
    248   IN  HTTP_TOKEN_WRAP      *Wrap
    249   );
    250 
    251 /**
    252   Close Events for Tcp Receive Tokens for HTTP body and HTTP header.
    253 
    254   @param[in]  Wrap               Pointer to HTTP token's wrap data.
    255 
    256 **/
    257 VOID
    258 HttpCloseTcpRxEvent (
    259   IN  HTTP_TOKEN_WRAP      *Wrap
    260   );
    261 
    262 /**
    263   Intiialize the HTTP_PROTOCOL structure to the unconfigured state.
    264 
    265   @param[in, out]  HttpInstance         Pointer to HTTP_PROTOCOL structure.
    266   @param[in]       IpVersion            Indicate us TCP4 protocol or TCP6 protocol.
    267 
    268   @retval EFI_SUCCESS       HTTP_PROTOCOL structure is initialized successfully.
    269   @retval Others            Other error as indicated.
    270 
    271 **/
    272 EFI_STATUS
    273 HttpInitProtocol (
    274   IN OUT HTTP_PROTOCOL           *HttpInstance,
    275   IN     BOOLEAN                 IpVersion
    276   );
    277 
    278 /**
    279   Clean up the HTTP child, release all the resources used by it.
    280 
    281   @param[in]  HttpInstance       The HTTP child to clean up.
    282 
    283 **/
    284 VOID
    285 HttpCleanProtocol (
    286   IN  HTTP_PROTOCOL          *HttpInstance
    287   );
    288 
    289 /**
    290   Establish TCP connection with HTTP server.
    291 
    292   @param[in]  HttpInstance       The HTTP instance private data.
    293 
    294   @retval EFI_SUCCESS            The TCP connection is established.
    295   @retval Others                 Other error as indicated.
    296 
    297 **/
    298 EFI_STATUS
    299 HttpCreateConnection (
    300   IN  HTTP_PROTOCOL        *HttpInstance
    301   );
    302 
    303 /**
    304   Close existing TCP connection.
    305 
    306   @param[in]  HttpInstance       The HTTP instance private data.
    307 
    308   @retval EFI_SUCCESS            The TCP connection is closed.
    309   @retval Others                 Other error as indicated.
    310 
    311 **/
    312 EFI_STATUS
    313 HttpCloseConnection (
    314   IN  HTTP_PROTOCOL        *HttpInstance
    315   );
    316 
    317 /**
    318   Configure TCP4 protocol child.
    319 
    320   @param[in]  HttpInstance       The HTTP instance private data.
    321   @param[in]  Wrap               The HTTP token's wrap data.
    322 
    323   @retval EFI_SUCCESS            The TCP4 protocol child is configured.
    324   @retval Others                 Other error as indicated.
    325 
    326 **/
    327 EFI_STATUS
    328 HttpConfigureTcp4 (
    329   IN  HTTP_PROTOCOL        *HttpInstance,
    330   IN  HTTP_TOKEN_WRAP      *Wrap
    331   );
    332 
    333 /**
    334   Configure TCP6 protocol child.
    335 
    336   @param[in]  HttpInstance       The HTTP instance private data.
    337   @param[in]  Wrap               The HTTP token's wrap data.
    338 
    339   @retval EFI_SUCCESS            The TCP6 protocol child is configured.
    340   @retval Others                 Other error as indicated.
    341 
    342 **/
    343 EFI_STATUS
    344 HttpConfigureTcp6 (
    345   IN  HTTP_PROTOCOL        *HttpInstance,
    346   IN  HTTP_TOKEN_WRAP      *Wrap
    347   );
    348 
    349 /**
    350   Check existing TCP connection, if in error state, receover TCP4 connection.
    351 
    352   @param[in]  HttpInstance       The HTTP instance private data.
    353 
    354   @retval EFI_SUCCESS            The TCP connection is established.
    355   @retval EFI_NOT_READY          TCP4 protocol child is not created or configured.
    356   @retval Others                 Other error as indicated.
    357 
    358 **/
    359 EFI_STATUS
    360 HttpConnectTcp4 (
    361   IN  HTTP_PROTOCOL        *HttpInstance
    362   );
    363 
    364 /**
    365   Check existing TCP connection, if in error state, recover TCP6 connection.
    366 
    367   @param[in]  HttpInstance       The HTTP instance private data.
    368 
    369   @retval EFI_SUCCESS            The TCP connection is established.
    370   @retval EFI_NOT_READY          TCP6 protocol child is not created or configured.
    371   @retval Others                 Other error as indicated.
    372 
    373 **/
    374 EFI_STATUS
    375 HttpConnectTcp6 (
    376   IN  HTTP_PROTOCOL        *HttpInstance
    377   );
    378 
    379 /**
    380   Send the HTTP message through TCP4 or TCP6.
    381 
    382   @param[in]  HttpInstance       The HTTP instance private data.
    383   @param[in]  Wrap               The HTTP token's wrap data.
    384   @param[in]  TxString           Buffer containing the HTTP message string.
    385   @param[in]  TxStringLen        Length of the HTTP message string in bytes.
    386 
    387   @retval EFI_SUCCESS            The HTTP message is queued into TCP transmit queue.
    388   @retval Others                 Other error as indicated.
    389 
    390 **/
    391 EFI_STATUS
    392 HttpTransmitTcp (
    393   IN  HTTP_PROTOCOL    *HttpInstance,
    394   IN  HTTP_TOKEN_WRAP  *Wrap,
    395   IN  UINT8            *TxString,
    396   IN  UINTN            TxStringLen
    397   );
    398 
    399 /**
    400   Translate the status code in HTTP message to EFI_HTTP_STATUS_CODE defined
    401   in UEFI 2.5 specification.
    402 
    403   @param[in]  StatusCode         The status code value in HTTP message.
    404 
    405   @return                        Value defined in EFI_HTTP_STATUS_CODE .
    406 
    407 **/
    408 EFI_HTTP_STATUS_CODE
    409 HttpMappingToStatusCode (
    410   IN UINTN                  StatusCode
    411   );
    412 
    413 /**
    414   Check whether the user's token or event has already
    415   been enqueue on HTTP Tx or Rx Token list.
    416 
    417   @param[in]  Map                The container of either user's transmit or receive
    418                                  token.
    419   @param[in]  Item               Current item to check against.
    420   @param[in]  Context            The Token to check againist.
    421 
    422   @retval EFI_ACCESS_DENIED      The token or event has already been enqueued in IP
    423   @retval EFI_SUCCESS            The current item isn't the same token/event as the
    424                                  context.
    425 
    426 **/
    427 EFI_STATUS
    428 EFIAPI
    429 HttpTokenExist (
    430   IN NET_MAP                *Map,
    431   IN NET_MAP_ITEM           *Item,
    432   IN VOID                   *Context
    433   );
    434 
    435 /**
    436   Check whether the HTTP message associated with TxToken or Tx6Token is already sent out.
    437 
    438   @param[in]  Map                The container of TxToken.
    439   @param[in]  Item               Current item to check against.
    440   @param[in]  Context            The Token to check againist.
    441 
    442   @retval EFI_NOT_READY          The HTTP message is still queued in the list.
    443   @retval EFI_SUCCESS            The HTTP message has been sent out.
    444 
    445 **/
    446 EFI_STATUS
    447 EFIAPI
    448 HttpTcpNotReady (
    449   IN NET_MAP                *Map,
    450   IN NET_MAP_ITEM           *Item,
    451   IN VOID                   *Context
    452   );
    453 
    454 /**
    455   Initialize TCP related data.
    456 
    457   @param[in]  HttpInstance       The HTTP instance private data.
    458   @param[in]  Wrap               The HTTP token's wrap data.
    459   @param[in]  Configure          The Flag indicates whether the first time to initialize Tcp.
    460 
    461   @retval EFI_SUCCESS            The initialization of TCP instance is done.
    462   @retval Others                 Other error as indicated.
    463 
    464 **/
    465 EFI_STATUS
    466 HttpInitTcp (
    467   IN  HTTP_PROTOCOL    *HttpInstance,
    468   IN  HTTP_TOKEN_WRAP  *Wrap,
    469   IN  BOOLEAN          Configure
    470   );
    471 
    472 /**
    473   Transmit the HTTP mssage by processing the associated HTTP token.
    474 
    475   @param[in]  Map                The container of TxToken or Tx6Token.
    476   @param[in]  Item               Current item to check against.
    477   @param[in]  Context            The Token to check againist.
    478 
    479   @retval EFI_OUT_OF_RESOURCES   Failed to allocate resources.
    480   @retval EFI_SUCCESS            The HTTP message is queued into TCP transmit
    481                                  queue.
    482 
    483 **/
    484 EFI_STATUS
    485 EFIAPI
    486 HttpTcpTransmit (
    487   IN NET_MAP                *Map,
    488   IN NET_MAP_ITEM           *Item,
    489   IN VOID                   *Context
    490   );
    491 
    492 /**
    493   Receive the HTTP response by processing the associated HTTP token.
    494 
    495   @param[in]  Map                The container of Rx4Token or Rx6Token.
    496   @param[in]  Item               Current item to check against.
    497   @param[in]  Context            The Token to check againist.
    498 
    499   @retval EFI_SUCCESS            The HTTP response is queued into TCP receive
    500                                  queue.
    501   @retval Others                 Other error as indicated.
    502 
    503 **/
    504 EFI_STATUS
    505 EFIAPI
    506 HttpTcpReceive (
    507   IN NET_MAP                *Map,
    508   IN NET_MAP_ITEM           *Item,
    509   IN VOID                   *Context
    510   );
    511 
    512 /**
    513   Receive the HTTP header by processing the associated HTTP token.
    514 
    515   @param[in]       HttpInstance    The HTTP instance private data.
    516   @param[in, out]  SizeofHeaders   The HTTP header length.
    517   @param[in, out]  BufferSize      The size of buffer to cacahe the header message.
    518 
    519   @retval EFI_SUCCESS              The HTTP header is received.
    520   @retval Others                   Other errors as indicated.
    521 
    522 **/
    523 EFI_STATUS
    524 HttpTcpReceiveHeader (
    525   IN  HTTP_PROTOCOL         *HttpInstance,
    526   IN  OUT UINTN             *SizeofHeaders,
    527   IN  OUT UINTN             *BufferSize
    528   );
    529 
    530 /**
    531   Receive the HTTP body by processing the associated HTTP token.
    532 
    533   @param[in]  Wrap               The HTTP token's wrap data.
    534   @param[in]  HttpMsg            The HTTP message data.
    535 
    536   @retval EFI_SUCCESS            The HTTP body is received.
    537   @retval Others                 Other error as indicated.
    538 
    539 **/
    540 EFI_STATUS
    541 HttpTcpReceiveBody (
    542   IN  HTTP_TOKEN_WRAP       *Wrap,
    543   IN  EFI_HTTP_MESSAGE      *HttpMsg
    544   );
    545 
    546 /**
    547   Clean up Tcp Tokens while the Tcp transmission error occurs.
    548 
    549   @param[in]  Wrap               Pointer to HTTP token's wrap data.
    550 
    551 **/
    552 VOID
    553 HttpTcpTokenCleanup (
    554   IN  HTTP_TOKEN_WRAP      *Wrap
    555   );
    556 
    557 /**
    558   Generate HTTP request string.
    559 
    560   @param[in]  HttpInstance       Pointer to HTTP_PROTOCOL structure.
    561   @param[in]  Message            Pointer to storage containing HTTP message data.
    562   @param[in]  Url                The URL of a remote host.
    563 
    564   @return     Pointer to the created HTTP request string.
    565   @return     NULL if any error occured.
    566 
    567 **/
    568 CHAR8 *
    569 HttpGenRequestString (
    570   IN  HTTP_PROTOCOL        *HttpInstance,
    571   IN  EFI_HTTP_MESSAGE     *Message,
    572   IN  CHAR8                *Url
    573   );
    574 
    575 /**
    576   The work function of EfiHttpResponse().
    577 
    578   @param[in]  Wrap                Pointer to HTTP token's wrap data.
    579 
    580   @retval EFI_SUCCESS             Allocation succeeded.
    581   @retval EFI_OUT_OF_RESOURCES    Failed to complete the opration due to lack of resources.
    582   @retval EFI_NOT_READY           Can't find a corresponding TxToken.
    583 
    584 **/
    585 EFI_STATUS
    586 HttpResponseWorker (
    587   IN  HTTP_TOKEN_WRAP           *Wrap
    588   );
    589 
    590 #endif
    591