]> git.proxmox.com Git - mirror_edk2.git/blob - NetworkPkg/HttpDxe/HttpProto.h
NetworkPkg: Update cache management in HTTP boot driver.
[mirror_edk2.git] / NetworkPkg / HttpDxe / HttpProto.h
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 // The state of HTTP protocol. It starts from UNCONFIGED.
32 //
33 #define HTTP_STATE_UNCONFIGED 0
34 #define HTTP_STATE_HTTP_CONFIGED 1
35 #define HTTP_STATE_TCP_CONFIGED 2
36 #define HTTP_STATE_TCP_UNCONFIGED 3
37 #define HTTP_STATE_TCP_CONNECTED 4
38 #define HTTP_STATE_TCP_CLOSED 5
39
40 //
41 // TCP configured data.
42 //
43 #define HTTP_TOS_DEAULT 8
44 #define HTTP_TTL_DEAULT 255
45 #define HTTP_BUFFER_SIZE_DEAULT 65535
46 #define HTTP_MAX_SYN_BACK_LOG 5
47 #define HTTP_CONNECTION_TIMEOUT 60
48 #define HTTP_DATA_RETRIES 12
49 #define HTTP_FIN_TIMEOUT 2
50 #define HTTP_KEEP_ALIVE_PROBES 6
51 #define HTTP_KEEP_ALIVE_TIME 7200
52 #define HTTP_KEEP_ALIVE_INTERVAL 30
53
54 typedef struct _HTTP_SERVICE {
55 UINT32 Signature;
56 EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
57 EFI_HANDLE ImageHandle;
58 EFI_HANDLE ControllerHandle;
59 LIST_ENTRY ChildrenList;
60 UINTN ChildrenNumber;
61 EFI_HANDLE TcpChildHandle;
62 INTN State;
63 } HTTP_SERVICE;
64
65 typedef struct {
66 EFI_TCP4_IO_TOKEN TxToken;
67 EFI_TCP4_TRANSMIT_DATA TxData;
68 BOOLEAN IsTxDone;
69 EFI_TCP4_IO_TOKEN RxToken;
70 EFI_TCP4_RECEIVE_DATA RxData;
71 BOOLEAN IsRxDone;
72 UINTN BodyLen;
73 EFI_HTTP_METHOD Method;
74 } HTTP_TCP_TOKEN_WRAP;
75
76 typedef struct _HTTP_PROTOCOL {
77 UINT32 Signature;
78 EFI_HTTP_PROTOCOL Http;
79 EFI_HANDLE Handle;
80 HTTP_SERVICE *Service;
81 LIST_ENTRY Link; // Link to all HTTP instance from the service.
82 BOOLEAN InDestroy;
83 INTN State;
84
85 EFI_HANDLE TcpChildHandle;
86 EFI_TCP4_PROTOCOL *Tcp4;
87 EFI_TCP4_CONFIG_DATA Tcp4CfgData;
88 EFI_TCP4_OPTION Tcp4Option;
89
90 EFI_TCP4_CONNECTION_TOKEN ConnToken;
91 BOOLEAN IsConnDone;
92 EFI_TCP4_CLOSE_TOKEN CloseToken;
93 BOOLEAN IsCloseDone;
94
95 CHAR8 *RemoteHost;
96 UINT16 RemotePort;
97 EFI_IPv4_ADDRESS RemoteAddr;
98 //
99 // RxToken used for receiving HTTP header.
100 //
101 EFI_TCP4_IO_TOKEN RxToken;
102 EFI_TCP4_RECEIVE_DATA RxData;
103 BOOLEAN IsRxDone;
104
105 CHAR8 *CacheBody;
106 CHAR8 *NextMsg;
107 UINTN CacheLen;
108 UINTN CacheOffset;
109
110 //
111 // HTTP message-body parser.
112 //
113 VOID *MsgParser;
114
115 EFI_HTTP_VERSION HttpVersion;
116 UINT32 TimeOutMillisec;
117 BOOLEAN LocalAddressIsIPv6;
118
119 EFI_HTTPv4_ACCESS_POINT IPv4Node;
120
121 NET_MAP TxTokens;
122 NET_MAP RxTokens;
123 } HTTP_PROTOCOL;
124
125 typedef struct {
126 EFI_HTTP_TOKEN *HttpToken;
127 HTTP_PROTOCOL *HttpInstance;
128 HTTP_TCP_TOKEN_WRAP TcpWrap;
129 } HTTP_TOKEN_WRAP;
130
131
132 #define HTTP_PROTOCOL_SIGNATURE SIGNATURE_32('H', 't', 't', 'P')
133
134 #define HTTP_INSTANCE_FROM_PROTOCOL(a) \
135 CR ( \
136 (a), \
137 HTTP_PROTOCOL, \
138 Http, \
139 HTTP_PROTOCOL_SIGNATURE \
140 )
141
142 /**
143 The common notify function used in HTTP driver.
144
145 @param[in] Event The event signaled.
146 @param[in] Context The context.
147
148 **/
149 VOID
150 EFIAPI
151 HttpCommonNotify (
152 IN EFI_EVENT Event,
153 IN VOID *Context
154 );
155
156 /**
157 Create events for the TCP4 connection token and TCP4 close token.
158
159 @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
160
161 @retval EFI_SUCCESS The events are created successfully.
162 @retval others Other error as indicated.
163
164 **/
165 EFI_STATUS
166 HttpCreateTcp4ConnCloseEvent (
167 IN HTTP_PROTOCOL *HttpInstance
168 );
169
170 /**
171 Close events in the TCP4 connection token and TCP4 close token.
172
173 @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
174
175 **/
176 VOID
177 HttpCloseTcp4ConnCloseEvent (
178 IN HTTP_PROTOCOL *HttpInstance
179 );
180
181 /**
182 Create event for the TCP4 transmit token.
183
184 @param[in] Wrap Point to HTTP token's wrap data.
185
186 @retval EFI_SUCCESS The events is created successfully.
187 @retval others Other error as indicated.
188
189 **/
190 EFI_STATUS
191 HttpCreateTcp4TxEvent (
192 IN HTTP_TOKEN_WRAP *Wrap
193 );
194
195 /**
196 Create event for the TCP4 receive token which is used to receive HTTP header.
197
198 @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
199
200 @retval EFI_SUCCESS The events is created successfully.
201 @retval others Other error as indicated.
202
203 **/
204 EFI_STATUS
205 HttpCreateTcp4RxEventForHeader (
206 IN HTTP_PROTOCOL *HttpInstance
207 );
208
209 /**
210 Create event for the TCP4 receive token which is used to receive HTTP body.
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 HttpCreateTcp4RxEvent (
220 IN HTTP_TOKEN_WRAP *Wrap
221 );
222
223 /**
224 Intiialize the HTTP_PROTOCOL structure to the unconfigured state.
225
226 @param[in] HttpSb The HTTP service private instance.
227 @param[in, out] HttpInstance Pointer to HTTP_PROTOCOL structure.
228
229 @retval EFI_SUCCESS HTTP_PROTOCOL structure is initialized successfully.
230 @retval Others Other error as indicated.
231
232 **/
233 EFI_STATUS
234 HttpInitProtocol (
235 IN HTTP_SERVICE *HttpSb,
236 IN OUT HTTP_PROTOCOL *HttpInstance
237 );
238
239 /**
240 Clean up the HTTP child, release all the resources used by it.
241
242 @param[in] HttpInstance The HTTP child to clean up.
243
244 **/
245 VOID
246 HttpCleanProtocol (
247 IN HTTP_PROTOCOL *HttpInstance
248 );
249
250 /**
251 Establish TCP connection with HTTP server.
252
253 @param[in] HttpInstance The HTTP instance private data.
254
255 @retval EFI_SUCCESS The TCP connection is established.
256 @retval Others Other error as indicated.
257
258 **/
259 EFI_STATUS
260 HttpCreateConnection (
261 IN HTTP_PROTOCOL *HttpInstance
262 );
263
264 /**
265 Close existing TCP connection.
266
267 @param[in] HttpInstance The HTTP instance private data.
268
269 @retval EFI_SUCCESS The TCP connection is closed.
270 @retval Others Other error as indicated.
271
272 **/
273 EFI_STATUS
274 HttpCloseConnection (
275 IN HTTP_PROTOCOL *HttpInstance
276 );
277
278 /**
279 Configure TCP4 protocol child.
280
281 @param[in] HttpInstance The HTTP instance private data.
282 @param[in] Wrap The HTTP token's wrap data.
283
284 @retval EFI_SUCCESS The TCP4 protocol child is configured.
285 @retval Others Other error as indicated.
286
287 **/
288 EFI_STATUS
289 HttpConfigureTcp4 (
290 IN HTTP_PROTOCOL *HttpInstance,
291 IN HTTP_TOKEN_WRAP *Wrap
292 );
293
294 /**
295 Check existing TCP connection, if in error state, receover TCP4 connection.
296
297 @param[in] HttpInstance The HTTP instance private data.
298
299 @retval EFI_SUCCESS The TCP connection is established.
300 @retval EFI_NOT_READY TCP4 protocol child is not created or configured.
301 @retval Others Other error as indicated.
302
303 **/
304 EFI_STATUS
305 HttpConnectTcp4 (
306 IN HTTP_PROTOCOL *HttpInstance
307 );
308
309 /**
310 Send the HTTP message through TCP4.
311
312 @param[in] HttpInstance The HTTP instance private data.
313 @param[in] Wrap The HTTP token's wrap data.
314 @param[in] TxString Buffer containing the HTTP message string.
315 @param[in] TxStringLen Length of the HTTP message string in bytes.
316
317 @retval EFI_SUCCESS The HTTP message is queued into TCP transmit queue.
318 @retval Others Other error as indicated.
319
320 **/
321 EFI_STATUS
322 HttpTransmitTcp4 (
323 IN HTTP_PROTOCOL *HttpInstance,
324 IN HTTP_TOKEN_WRAP *Wrap,
325 IN UINT8 *TxString,
326 IN UINTN TxStringLen
327 );
328
329 /**
330 Translate the status code in HTTP message to EFI_HTTP_STATUS_CODE defined
331 in UEFI 2.5 specification.
332
333 @param[in] StatusCode The status code value in HTTP message.
334
335 @return Value defined in EFI_HTTP_STATUS_CODE .
336
337 **/
338 EFI_HTTP_STATUS_CODE
339 HttpMappingToStatusCode (
340 IN UINTN StatusCode
341 );
342
343 /**
344 Check whether the user's token or event has already
345 been enqueue on HTTP TxToken or RxToken list.
346
347 @param[in] Map The container of either user's transmit or receive
348 token.
349 @param[in] Item Current item to check against.
350 @param[in] Context The Token to check againist.
351
352 @retval EFI_ACCESS_DENIED The token or event has already been enqueued in IP
353 @retval EFI_SUCCESS The current item isn't the same token/event as the
354 context.
355
356 **/
357 EFI_STATUS
358 EFIAPI
359 HttpTokenExist (
360 IN NET_MAP *Map,
361 IN NET_MAP_ITEM *Item,
362 IN VOID *Context
363 );
364
365 /**
366 Check whether the HTTP message associated with TxToken is already sent out.
367
368 @param[in] Map The container of TxToken.
369 @param[in] Item Current item to check against.
370 @param[in] Context The Token to check againist.
371
372 @retval EFI_NOT_READY The HTTP message is still queued in the list.
373 @retval EFI_SUCCESS The HTTP message has been sent out.
374
375 **/
376 EFI_STATUS
377 EFIAPI
378 HttpTcpNotReady (
379 IN NET_MAP *Map,
380 IN NET_MAP_ITEM *Item,
381 IN VOID *Context
382 );
383
384 /**
385 Transmit the HTTP mssage by processing the associated HTTP token.
386
387 @param[in] Map The container of TxToken.
388 @param[in] Item Current item to check against.
389 @param[in] Context The Token to check againist.
390
391 @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
392 @retval EFI_SUCCESS The HTTP message is queued into TCP transmit
393 queue.
394
395 **/
396 EFI_STATUS
397 EFIAPI
398 HttpTcpTransmit (
399 IN NET_MAP *Map,
400 IN NET_MAP_ITEM *Item,
401 IN VOID *Context
402 );
403
404 /**
405 Receive the HTTP response by processing the associated HTTP token.
406
407 @param[in] Map The container of RxToken.
408 @param[in] Item Current item to check against.
409 @param[in] Context The Token to check againist.
410
411 @retval EFI_SUCCESS The HTTP response is queued into TCP receive
412 queue.
413 @retval Others Other error as indicated.
414
415 **/
416 EFI_STATUS
417 EFIAPI
418 HttpTcpReceive (
419 IN NET_MAP *Map,
420 IN NET_MAP_ITEM *Item,
421 IN VOID *Context
422 );
423
424 /**
425 Generate HTTP request string.
426
427 @param[in] HttpInstance Pointer to HTTP_PROTOCOL structure.
428 @param[in] Message Pointer to storage containing HTTP message data.
429 @param[in] Url The URL of a remote host.
430
431 @return Pointer to the created HTTP request string.
432 @return NULL if any error occured.
433
434 **/
435 CHAR8 *
436 HttpGenRequestString (
437 IN HTTP_PROTOCOL *HttpInstance,
438 IN EFI_HTTP_MESSAGE *Message,
439 IN CHAR8 *Url
440 );
441
442 /**
443 The work function of EfiHttpResponse().
444
445 @param[in] Wrap Pointer to HTTP token's wrap data.
446
447 @retval EFI_SUCCESS Allocation succeeded.
448 @retval EFI_OUT_OF_RESOURCES Failed to complete the opration due to lack of resources.
449 @retval EFI_NOT_READY Can't find a corresponding TxToken.
450
451 **/
452 EFI_STATUS
453 HttpResponseWorker (
454 IN HTTP_TOKEN_WRAP *Wrap
455 );
456
457 #endif