HttpProto.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. /** @file
  2. The header files of miscellaneous routines for HttpDxe driver.
  3. Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR>
  4. (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
  5. SPDX-License-Identifier: BSD-2-Clause-Patent
  6. **/
  7. #ifndef __EFI_HTTP_PROTO_H__
  8. #define __EFI_HTTP_PROTO_H__
  9. #define DEF_BUF_LEN 2048
  10. #define HTTP_SERVICE_SIGNATURE SIGNATURE_32('H', 't', 't', 'S')
  11. #define HTTP_SERVICE_FROM_PROTOCOL(a) \
  12. CR ( \
  13. (a), \
  14. HTTP_SERVICE, \
  15. ServiceBinding, \
  16. HTTP_SERVICE_SIGNATURE \
  17. )
  18. //
  19. // The state of HTTP protocol. It starts from UNCONFIGED.
  20. //
  21. #define HTTP_STATE_UNCONFIGED 0
  22. #define HTTP_STATE_HTTP_CONFIGED 1
  23. #define HTTP_STATE_TCP_CONFIGED 2
  24. #define HTTP_STATE_TCP_UNCONFIGED 3
  25. #define HTTP_STATE_TCP_CONNECTED 4
  26. #define HTTP_STATE_TCP_CLOSED 5
  27. //
  28. // TCP configured data.
  29. //
  30. #define HTTP_TOS_DEAULT 8
  31. #define HTTP_TTL_DEAULT 255
  32. #define HTTP_BUFFER_SIZE_DEAULT 65535
  33. #define HTTP_MAX_SYN_BACK_LOG 5
  34. #define HTTP_CONNECTION_TIMEOUT 60
  35. #define HTTP_DATA_RETRIES 12
  36. #define HTTP_FIN_TIMEOUT 2
  37. #define HTTP_KEEP_ALIVE_PROBES 6
  38. #define HTTP_KEEP_ALIVE_TIME 7200
  39. #define HTTP_KEEP_ALIVE_INTERVAL 30
  40. #define HTTP_URL_BUFFER_LEN 4096
  41. typedef struct _HTTP_SERVICE {
  42. UINT32 Signature;
  43. EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
  44. EFI_HANDLE Ip4DriverBindingHandle;
  45. EFI_HANDLE Ip6DriverBindingHandle;
  46. EFI_HANDLE ControllerHandle;
  47. EFI_HANDLE Tcp4ChildHandle;
  48. EFI_HANDLE Tcp6ChildHandle;
  49. LIST_ENTRY ChildrenList;
  50. UINTN ChildrenNumber;
  51. INTN State;
  52. } HTTP_SERVICE;
  53. typedef struct {
  54. EFI_TCP4_IO_TOKEN Tx4Token;
  55. EFI_TCP4_TRANSMIT_DATA Tx4Data;
  56. EFI_TCP6_IO_TOKEN Tx6Token;
  57. EFI_TCP6_TRANSMIT_DATA Tx6Data;
  58. EFI_TCP4_IO_TOKEN Rx4Token;
  59. EFI_TCP4_RECEIVE_DATA Rx4Data;
  60. EFI_TCP6_IO_TOKEN Rx6Token;
  61. EFI_TCP6_RECEIVE_DATA Rx6Data;
  62. BOOLEAN IsTxDone;
  63. BOOLEAN IsRxDone;
  64. UINTN BodyLen;
  65. EFI_HTTP_METHOD Method;
  66. } HTTP_TCP_TOKEN_WRAP;
  67. typedef struct {
  68. EFI_TLS_VERSION Version;
  69. EFI_TLS_CONNECTION_END ConnectionEnd;
  70. EFI_TLS_VERIFY VerifyMethod;
  71. EFI_TLS_VERIFY_HOST VerifyHost;
  72. EFI_TLS_SESSION_STATE SessionState;
  73. } TLS_CONFIG_DATA;
  74. //
  75. // Callback data for HTTP_PARSER_CALLBACK()
  76. //
  77. typedef struct {
  78. UINTN ParseDataLength;
  79. VOID *ParseData;
  80. VOID *Wrap;
  81. } HTTP_CALLBACK_DATA;
  82. typedef struct _HTTP_PROTOCOL {
  83. UINT32 Signature;
  84. EFI_HTTP_PROTOCOL Http;
  85. EFI_HANDLE Handle;
  86. HTTP_SERVICE *Service;
  87. LIST_ENTRY Link; // Link to all HTTP instance from the service.
  88. BOOLEAN InDestroy;
  89. INTN State;
  90. EFI_HTTP_METHOD Method;
  91. UINTN StatusCode;
  92. EFI_EVENT TimeoutEvent;
  93. EFI_HANDLE Tcp4ChildHandle;
  94. EFI_TCP4_PROTOCOL *Tcp4;
  95. EFI_TCP4_CONFIG_DATA Tcp4CfgData;
  96. EFI_TCP4_OPTION Tcp4Option;
  97. EFI_TCP4_CONNECTION_TOKEN Tcp4ConnToken;
  98. BOOLEAN IsTcp4ConnDone;
  99. EFI_TCP4_CLOSE_TOKEN Tcp4CloseToken;
  100. BOOLEAN IsTcp4CloseDone;
  101. CHAR8 *RemoteHost;
  102. UINT16 RemotePort;
  103. EFI_IPv4_ADDRESS RemoteAddr;
  104. EFI_HANDLE Tcp6ChildHandle;
  105. EFI_TCP6_PROTOCOL *Tcp6;
  106. EFI_TCP6_CONFIG_DATA Tcp6CfgData;
  107. EFI_TCP6_OPTION Tcp6Option;
  108. EFI_TCP6_CONNECTION_TOKEN Tcp6ConnToken;
  109. BOOLEAN IsTcp6ConnDone;
  110. EFI_TCP6_CLOSE_TOKEN Tcp6CloseToken;
  111. BOOLEAN IsTcp6CloseDone;
  112. EFI_IPv6_ADDRESS RemoteIpv6Addr;
  113. //
  114. // Rx4Token or Rx6Token used for receiving HTTP header.
  115. //
  116. EFI_TCP4_IO_TOKEN Rx4Token;
  117. EFI_TCP4_RECEIVE_DATA Rx4Data;
  118. EFI_TCP6_IO_TOKEN Rx6Token;
  119. EFI_TCP6_RECEIVE_DATA Rx6Data;
  120. BOOLEAN IsRxDone;
  121. CHAR8 **EndofHeader;
  122. CHAR8 **HttpHeaders;
  123. CHAR8 *CacheBody;
  124. CHAR8 *NextMsg;
  125. UINTN CacheLen;
  126. UINTN CacheOffset;
  127. //
  128. // HTTP message-body parser.
  129. //
  130. VOID *MsgParser;
  131. HTTP_CALLBACK_DATA CallbackData;
  132. EFI_HTTP_VERSION HttpVersion;
  133. UINT32 TimeOutMillisec;
  134. BOOLEAN LocalAddressIsIPv6;
  135. EFI_HTTPv4_ACCESS_POINT IPv4Node;
  136. EFI_HTTPv6_ACCESS_POINT Ipv6Node;
  137. NET_MAP TxTokens;
  138. NET_MAP RxTokens;
  139. CHAR8 *Url;
  140. //
  141. // Https Support
  142. //
  143. BOOLEAN UseHttps;
  144. EFI_SERVICE_BINDING_PROTOCOL *TlsSb;
  145. EFI_HANDLE TlsChildHandle; /// Tls ChildHandle
  146. TLS_CONFIG_DATA TlsConfigData;
  147. EFI_TLS_PROTOCOL *Tls;
  148. EFI_TLS_CONFIGURATION_PROTOCOL *TlsConfiguration;
  149. EFI_TLS_SESSION_STATE TlsSessionState;
  150. //
  151. // TlsTxData used for transmitting TLS related messages.
  152. //
  153. EFI_TCP4_IO_TOKEN Tcp4TlsTxToken;
  154. EFI_TCP4_TRANSMIT_DATA Tcp4TlsTxData;
  155. EFI_TCP6_IO_TOKEN Tcp6TlsTxToken;
  156. EFI_TCP6_TRANSMIT_DATA Tcp6TlsTxData;
  157. BOOLEAN TlsIsTxDone;
  158. //
  159. // TlsRxData used for receiving TLS related messages.
  160. //
  161. EFI_TCP4_IO_TOKEN Tcp4TlsRxToken;
  162. EFI_TCP4_RECEIVE_DATA Tcp4TlsRxData;
  163. EFI_TCP6_IO_TOKEN Tcp6TlsRxToken;
  164. EFI_TCP6_RECEIVE_DATA Tcp6TlsRxData;
  165. BOOLEAN TlsIsRxDone;
  166. } HTTP_PROTOCOL;
  167. typedef struct {
  168. EFI_HTTP_TOKEN *HttpToken;
  169. HTTP_PROTOCOL *HttpInstance;
  170. HTTP_TCP_TOKEN_WRAP TcpWrap;
  171. } HTTP_TOKEN_WRAP;
  172. #define HTTP_PROTOCOL_SIGNATURE SIGNATURE_32('H', 't', 't', 'P')
  173. #define HTTP_INSTANCE_FROM_PROTOCOL(a) \
  174. CR ( \
  175. (a), \
  176. HTTP_PROTOCOL, \
  177. Http, \
  178. HTTP_PROTOCOL_SIGNATURE \
  179. )
  180. /**
  181. The common notify function used in HTTP driver.
  182. @param[in] Event The event signaled.
  183. @param[in] Context The context.
  184. **/
  185. VOID
  186. EFIAPI
  187. HttpCommonNotify (
  188. IN EFI_EVENT Event,
  189. IN VOID *Context
  190. );
  191. /**
  192. Create events for the TCP connection token and TCP close token.
  193. @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
  194. @retval EFI_SUCCESS The events are created successfully.
  195. @retval others Other error as indicated.
  196. **/
  197. EFI_STATUS
  198. HttpCreateTcpConnCloseEvent (
  199. IN HTTP_PROTOCOL *HttpInstance
  200. );
  201. /**
  202. Close events in the TCP connection token and TCP close token.
  203. @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
  204. **/
  205. VOID
  206. HttpCloseTcpConnCloseEvent (
  207. IN HTTP_PROTOCOL *HttpInstance
  208. );
  209. /**
  210. Create event for the TCP transmit token.
  211. @param[in] Wrap Point to HTTP token's wrap data.
  212. @retval EFI_SUCCESS The events is created successfully.
  213. @retval others Other error as indicated.
  214. **/
  215. EFI_STATUS
  216. HttpCreateTcpTxEvent (
  217. IN HTTP_TOKEN_WRAP *Wrap
  218. );
  219. /**
  220. Create event for the TCP receive token which is used to receive HTTP header.
  221. @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
  222. @retval EFI_SUCCESS The events is created successfully.
  223. @retval others Other error as indicated.
  224. **/
  225. EFI_STATUS
  226. HttpCreateTcpRxEventForHeader (
  227. IN HTTP_PROTOCOL *HttpInstance
  228. );
  229. /**
  230. Create event for the TCP receive token which is used to receive HTTP body.
  231. @param[in] Wrap Point to HTTP token's wrap data.
  232. @retval EFI_SUCCESS The events is created successfully.
  233. @retval others Other error as indicated.
  234. **/
  235. EFI_STATUS
  236. HttpCreateTcpRxEvent (
  237. IN HTTP_TOKEN_WRAP *Wrap
  238. );
  239. /**
  240. Close Events for Tcp Receive Tokens for HTTP body and HTTP header.
  241. @param[in] Wrap Pointer to HTTP token's wrap data.
  242. **/
  243. VOID
  244. HttpCloseTcpRxEvent (
  245. IN HTTP_TOKEN_WRAP *Wrap
  246. );
  247. /**
  248. Initialize the HTTP_PROTOCOL structure to the unconfigured state.
  249. @param[in, out] HttpInstance Pointer to HTTP_PROTOCOL structure.
  250. @param[in] IpVersion Indicate us TCP4 protocol or TCP6 protocol.
  251. @retval EFI_SUCCESS HTTP_PROTOCOL structure is initialized successfully.
  252. @retval Others Other error as indicated.
  253. **/
  254. EFI_STATUS
  255. HttpInitProtocol (
  256. IN OUT HTTP_PROTOCOL *HttpInstance,
  257. IN BOOLEAN IpVersion
  258. );
  259. /**
  260. Clean up the HTTP child, release all the resources used by it.
  261. @param[in] HttpInstance The HTTP child to clean up.
  262. **/
  263. VOID
  264. HttpCleanProtocol (
  265. IN HTTP_PROTOCOL *HttpInstance
  266. );
  267. /**
  268. Establish TCP connection with HTTP server.
  269. @param[in] HttpInstance The HTTP instance private data.
  270. @retval EFI_SUCCESS The TCP connection is established.
  271. @retval Others Other error as indicated.
  272. **/
  273. EFI_STATUS
  274. HttpCreateConnection (
  275. IN HTTP_PROTOCOL *HttpInstance
  276. );
  277. /**
  278. Close existing TCP connection.
  279. @param[in] HttpInstance The HTTP instance private data.
  280. @retval EFI_SUCCESS The TCP connection is closed.
  281. @retval Others Other error as indicated.
  282. **/
  283. EFI_STATUS
  284. HttpCloseConnection (
  285. IN HTTP_PROTOCOL *HttpInstance
  286. );
  287. /**
  288. Configure TCP4 protocol child.
  289. @param[in] HttpInstance The HTTP instance private data.
  290. @param[in] Wrap The HTTP token's wrap data.
  291. @retval EFI_SUCCESS The TCP4 protocol child is configured.
  292. @retval Others Other error as indicated.
  293. **/
  294. EFI_STATUS
  295. HttpConfigureTcp4 (
  296. IN HTTP_PROTOCOL *HttpInstance,
  297. IN HTTP_TOKEN_WRAP *Wrap
  298. );
  299. /**
  300. Configure TCP6 protocol child.
  301. @param[in] HttpInstance The HTTP instance private data.
  302. @param[in] Wrap The HTTP token's wrap data.
  303. @retval EFI_SUCCESS The TCP6 protocol child is configured.
  304. @retval Others Other error as indicated.
  305. **/
  306. EFI_STATUS
  307. HttpConfigureTcp6 (
  308. IN HTTP_PROTOCOL *HttpInstance,
  309. IN HTTP_TOKEN_WRAP *Wrap
  310. );
  311. /**
  312. Check existing TCP connection, if in error state, recover TCP4 connection. Then,
  313. connect one TLS session if required.
  314. @param[in] HttpInstance The HTTP instance private data.
  315. @retval EFI_SUCCESS The TCP connection is established.
  316. @retval EFI_NOT_READY TCP4 protocol child is not created or configured.
  317. @retval Others Other error as indicated.
  318. **/
  319. EFI_STATUS
  320. HttpConnectTcp4 (
  321. IN HTTP_PROTOCOL *HttpInstance
  322. );
  323. /**
  324. Check existing TCP connection, if in error state, recover TCP6 connection. Then,
  325. connect one TLS session if required.
  326. @param[in] HttpInstance The HTTP instance private data.
  327. @retval EFI_SUCCESS The TCP connection is established.
  328. @retval EFI_NOT_READY TCP6 protocol child is not created or configured.
  329. @retval Others Other error as indicated.
  330. **/
  331. EFI_STATUS
  332. HttpConnectTcp6 (
  333. IN HTTP_PROTOCOL *HttpInstance
  334. );
  335. /**
  336. Send the HTTP or HTTPS message through TCP4 or TCP6.
  337. @param[in] HttpInstance The HTTP instance private data.
  338. @param[in] Wrap The HTTP token's wrap data.
  339. @param[in] TxString Buffer containing the HTTP message string.
  340. @param[in] TxStringLen Length of the HTTP message string in bytes.
  341. @retval EFI_SUCCESS The HTTP message is queued into TCP transmit queue.
  342. @retval Others Other error as indicated.
  343. **/
  344. EFI_STATUS
  345. HttpTransmitTcp (
  346. IN HTTP_PROTOCOL *HttpInstance,
  347. IN HTTP_TOKEN_WRAP *Wrap,
  348. IN UINT8 *TxString,
  349. IN UINTN TxStringLen
  350. );
  351. /**
  352. Check whether the user's token or event has already
  353. been enqueue on HTTP Tx or Rx Token list.
  354. @param[in] Map The container of either user's transmit or receive
  355. token.
  356. @param[in] Item Current item to check against.
  357. @param[in] Context The Token to check against.
  358. @retval EFI_ACCESS_DENIED The token or event has already been enqueued in IP
  359. @retval EFI_SUCCESS The current item isn't the same token/event as the
  360. context.
  361. **/
  362. EFI_STATUS
  363. EFIAPI
  364. HttpTokenExist (
  365. IN NET_MAP *Map,
  366. IN NET_MAP_ITEM *Item,
  367. IN VOID *Context
  368. );
  369. /**
  370. Check whether the HTTP message associated with TxToken or Tx6Token is already sent out.
  371. @param[in] Map The container of TxToken.
  372. @param[in] Item Current item to check against.
  373. @param[in] Context The Token to check against.
  374. @retval EFI_NOT_READY The HTTP message is still queued in the list.
  375. @retval EFI_SUCCESS The HTTP message has been sent out.
  376. **/
  377. EFI_STATUS
  378. EFIAPI
  379. HttpTcpNotReady (
  380. IN NET_MAP *Map,
  381. IN NET_MAP_ITEM *Item,
  382. IN VOID *Context
  383. );
  384. /**
  385. Initialize Http session.
  386. @param[in] HttpInstance The HTTP instance private data.
  387. @param[in] Wrap The HTTP token's wrap data.
  388. @param[in] Configure The Flag indicates whether need to initialize session.
  389. @param[in] TlsConfigure The Flag indicates whether it's the new Tls session.
  390. @retval EFI_SUCCESS The initialization of session is done.
  391. @retval Others Other error as indicated.
  392. **/
  393. EFI_STATUS
  394. HttpInitSession (
  395. IN HTTP_PROTOCOL *HttpInstance,
  396. IN HTTP_TOKEN_WRAP *Wrap,
  397. IN BOOLEAN Configure,
  398. IN BOOLEAN TlsConfigure
  399. );
  400. /**
  401. Transmit the HTTP or HTTPS message by processing the associated HTTP token.
  402. @param[in] Map The container of TxToken or Tx6Token.
  403. @param[in] Item Current item to check against.
  404. @param[in] Context The Token to check against.
  405. @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
  406. @retval EFI_SUCCESS The HTTP message is queued into TCP transmit
  407. queue.
  408. **/
  409. EFI_STATUS
  410. EFIAPI
  411. HttpTcpTransmit (
  412. IN NET_MAP *Map,
  413. IN NET_MAP_ITEM *Item,
  414. IN VOID *Context
  415. );
  416. /**
  417. Receive the HTTP response by processing the associated HTTP token.
  418. @param[in] Map The container of Rx4Token or Rx6Token.
  419. @param[in] Item Current item to check against.
  420. @param[in] Context The Token to check against.
  421. @retval EFI_SUCCESS The HTTP response is queued into TCP receive
  422. queue.
  423. @retval Others Other error as indicated.
  424. **/
  425. EFI_STATUS
  426. EFIAPI
  427. HttpTcpReceive (
  428. IN NET_MAP *Map,
  429. IN NET_MAP_ITEM *Item,
  430. IN VOID *Context
  431. );
  432. /**
  433. Receive the HTTP header by processing the associated HTTP token.
  434. @param[in] HttpInstance The HTTP instance private data.
  435. @param[in, out] SizeofHeaders The HTTP header length.
  436. @param[in, out] BufferSize The size of buffer to cache the header message.
  437. @param[in] Timeout The time to wait for receiving the header packet.
  438. @retval EFI_SUCCESS The HTTP header is received.
  439. @retval Others Other errors as indicated.
  440. **/
  441. EFI_STATUS
  442. HttpTcpReceiveHeader (
  443. IN HTTP_PROTOCOL *HttpInstance,
  444. IN OUT UINTN *SizeofHeaders,
  445. IN OUT UINTN *BufferSize,
  446. IN EFI_EVENT Timeout
  447. );
  448. /**
  449. Receive the HTTP body by processing the associated HTTP token.
  450. @param[in] Wrap The HTTP token's wrap data.
  451. @param[in] HttpMsg The HTTP message data.
  452. @retval EFI_SUCCESS The HTTP body is received.
  453. @retval Others Other error as indicated.
  454. **/
  455. EFI_STATUS
  456. HttpTcpReceiveBody (
  457. IN HTTP_TOKEN_WRAP *Wrap,
  458. IN EFI_HTTP_MESSAGE *HttpMsg
  459. );
  460. /**
  461. Clean up Tcp Tokens while the Tcp transmission error occurs.
  462. @param[in] Wrap Pointer to HTTP token's wrap data.
  463. **/
  464. VOID
  465. HttpTcpTokenCleanup (
  466. IN HTTP_TOKEN_WRAP *Wrap
  467. );
  468. /**
  469. The work function of EfiHttpResponse().
  470. @param[in] Wrap Pointer to HTTP token's wrap data.
  471. @retval EFI_SUCCESS Allocation succeeded.
  472. @retval EFI_OUT_OF_RESOURCES Failed to complete the operation due to lack of resources.
  473. @retval EFI_NOT_READY Can't find a corresponding TxToken.
  474. **/
  475. EFI_STATUS
  476. HttpResponseWorker (
  477. IN HTTP_TOKEN_WRAP *Wrap
  478. );
  479. /**
  480. Send Events via EDKII_HTTP_CALLBACK_PROTOCOL.
  481. @param[in] Event The event that occurs in the current state.
  482. @param[in] EventStatus The Status of Event, EFI_SUCCESS or other errors.
  483. **/
  484. VOID
  485. HttpNotify (
  486. IN EDKII_HTTP_CALLBACK_EVENT Event,
  487. IN EFI_STATUS EventStatus
  488. );
  489. #endif