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_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 59 typedef 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 71 typedef 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 86 typedef 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 93 typedef 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 194 typedef 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 **/ 218 VOID 219 EFIAPI 220 HttpCommonNotify ( 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 **/ 234 EFI_STATUS 235 HttpCreateTcpConnCloseEvent ( 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 **/ 245 VOID 246 HttpCloseTcpConnCloseEvent ( 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 **/ 259 EFI_STATUS 260 HttpCreateTcpTxEvent ( 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 **/ 273 EFI_STATUS 274 HttpCreateTcpRxEventForHeader ( 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 **/ 287 EFI_STATUS 288 HttpCreateTcpRxEvent ( 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 **/ 298 VOID 299 HttpCloseTcpRxEvent ( 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 **/ 313 EFI_STATUS 314 HttpInitProtocol ( 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 **/ 325 VOID 326 HttpCleanProtocol ( 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 **/ 339 EFI_STATUS 340 HttpCreateConnection ( 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 **/ 353 EFI_STATUS 354 HttpCloseConnection ( 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 **/ 368 EFI_STATUS 369 HttpConfigureTcp4 ( 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 **/ 384 EFI_STATUS 385 HttpConfigureTcp6 ( 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 **/ 401 EFI_STATUS 402 HttpConnectTcp4 ( 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 **/ 417 EFI_STATUS 418 HttpConnectTcp6 ( 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 **/ 434 EFI_STATUS 435 HttpTransmitTcp ( 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 **/ 456 EFI_STATUS 457 EFIAPI 458 HttpTokenExist ( 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 **/ 475 EFI_STATUS 476 EFIAPI 477 HttpTcpNotReady ( 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 **/ 495 EFI_STATUS 496 HttpInitSession ( 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 **/ 515 EFI_STATUS 516 EFIAPI 517 HttpTcpTransmit ( 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 **/ 535 EFI_STATUS 536 EFIAPI 537 HttpTcpReceive ( 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 **/ 555 EFI_STATUS 556 HttpTcpReceiveHeader ( 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 **/ 573 EFI_STATUS 574 HttpTcpReceiveBody ( 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 **/ 585 VOID 586 HttpTcpTokenCleanup ( 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 **/ 600 EFI_STATUS 601 HttpResponseWorker ( 602 IN HTTP_TOKEN_WRAP *Wrap 603 ); 604 605 #endif 606