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