]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - NetworkPkg/UefiPxeBcDxe/PxeBcMtftp.c
NetworkPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / NetworkPkg / UefiPxeBcDxe / PxeBcMtftp.c
... / ...
CommitLineData
1/** @file\r
2 Functions implementation related with Mtftp for UefiPxeBc Driver.\r
3\r
4 Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
5\r
6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
7\r
8**/\r
9\r
10#include "PxeBcImpl.h"\r
11\r
12CHAR8 *mMtftpOptions[PXE_MTFTP_OPTION_MAXIMUM_INDEX] = {\r
13 "blksize",\r
14 "timeout",\r
15 "tsize",\r
16 "multicast",\r
17 "windowsize"\r
18};\r
19\r
20\r
21/**\r
22 This is a callback function when packets are received or transmitted in Mtftp driver.\r
23\r
24 A callback function that is provided by the caller to intercept\r
25 the EFI_MTFTP6_OPCODE_DATA or EFI_MTFTP6_OPCODE_DATA8 packets processed in the\r
26 EFI_MTFTP6_PROTOCOL.ReadFile() function, and alternatively to intercept\r
27 EFI_MTFTP6_OPCODE_OACK or EFI_MTFTP6_OPCODE_ERROR packets during a call to\r
28 EFI_MTFTP6_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().\r
29\r
30 @param[in] This Pointer to EFI_MTFTP6_PROTOCOL.\r
31 @param[in] Token Pointer to EFI_MTFTP6_TOKEN.\r
32 @param[in] PacketLen Length of EFI_MTFTP6_PACKET.\r
33 @param[in] Packet Pointer to EFI_MTFTP6_PACKET to be checked.\r
34\r
35 @retval EFI_SUCCESS The current operation succeeded.\r
36 @retval EFI_ABORTED Abort the current transfer process.\r
37\r
38**/\r
39EFI_STATUS\r
40EFIAPI\r
41PxeBcMtftp6CheckPacket (\r
42 IN EFI_MTFTP6_PROTOCOL *This,\r
43 IN EFI_MTFTP6_TOKEN *Token,\r
44 IN UINT16 PacketLen,\r
45 IN EFI_MTFTP6_PACKET *Packet\r
46 )\r
47{\r
48 PXEBC_PRIVATE_DATA *Private;\r
49 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback;\r
50 EFI_STATUS Status;\r
51\r
52 Private = (PXEBC_PRIVATE_DATA *) Token->Context;\r
53 Callback = Private->PxeBcCallback;\r
54 Status = EFI_SUCCESS;\r
55\r
56 if (Packet->OpCode == EFI_MTFTP6_OPCODE_ERROR) {\r
57 //\r
58 // Store the tftp error message into mode data and set the received flag.\r
59 //\r
60 Private->Mode.TftpErrorReceived = TRUE;\r
61 Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
62 AsciiStrnCpyS (\r
63 Private->Mode.TftpError.ErrorString,\r
64 PXE_MTFTP_ERROR_STRING_LENGTH,\r
65 (CHAR8 *) Packet->Error.ErrorMessage,\r
66 PXE_MTFTP_ERROR_STRING_LENGTH - 1\r
67 );\r
68 Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';\r
69 }\r
70\r
71 if (Callback != NULL) {\r
72 //\r
73 // Callback to user if has when received any tftp packet.\r
74 //\r
75 Status = Callback->Callback (\r
76 Callback,\r
77 Private->Function,\r
78 TRUE,\r
79 PacketLen,\r
80 (EFI_PXE_BASE_CODE_PACKET *) Packet\r
81 );\r
82 if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {\r
83 //\r
84 // User wants to abort current process if not EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.\r
85 //\r
86 Status = EFI_ABORTED;\r
87 } else {\r
88 //\r
89 // User wants to continue current process if EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.\r
90 //\r
91 Status = EFI_SUCCESS;\r
92 }\r
93 }\r
94\r
95 return Status;\r
96}\r
97\r
98\r
99/**\r
100 This function is to get the size of a file using Tftp.\r
101\r
102 @param[in] Private Pointer to PxeBc private data.\r
103 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.\r
104 @param[in] Filename Pointer to boot file name.\r
105 @param[in] BlockSize Pointer to required block size.\r
106 @param[in] WindowSize Pointer to required window size.\r
107 @param[in, out] BufferSize Pointer to buffer size.\r
108\r
109 @retval EFI_SUCCESS Sucessfully obtained the size of file.\r
110 @retval EFI_NOT_FOUND Parse the tftp ptions failed.\r
111 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
112 @retval Others Has not obtained the size of the file.\r
113\r
114**/\r
115EFI_STATUS\r
116PxeBcMtftp6GetFileSize (\r
117 IN PXEBC_PRIVATE_DATA *Private,\r
118 IN EFI_MTFTP6_CONFIG_DATA *Config,\r
119 IN UINT8 *Filename,\r
120 IN UINTN *BlockSize,\r
121 IN UINTN *WindowSize,\r
122 IN OUT UINT64 *BufferSize\r
123 )\r
124{\r
125 EFI_MTFTP6_PROTOCOL *Mtftp6;\r
126 EFI_MTFTP6_OPTION ReqOpt[3];\r
127 EFI_MTFTP6_PACKET *Packet;\r
128 EFI_MTFTP6_OPTION *Option;\r
129 UINT32 PktLen;\r
130 UINT8 OptBuf[PXE_MTFTP_OPTBUF_MAXNUM_INDEX];\r
131 UINTN OptBufSize;\r
132 UINT32 OptCnt;\r
133 EFI_STATUS Status;\r
134\r
135 *BufferSize = 0;\r
136 Status = EFI_DEVICE_ERROR;\r
137 Mtftp6 = Private->Mtftp6;\r
138 Packet = NULL;\r
139 Option = NULL;\r
140 PktLen = 0;\r
141 OptBufSize = PXE_MTFTP_OPTBUF_MAXNUM_INDEX;\r
142 OptCnt = 1;\r
143 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
144\r
145 Status = Mtftp6->Configure (Mtftp6, Config);\r
146 if (EFI_ERROR (Status)) {\r
147 return Status;\r
148 }\r
149\r
150 //\r
151 // Build the required options for get info.\r
152 //\r
153 ReqOpt[0].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX];\r
154 PxeBcUintnToAscDec (0, OptBuf, OptBufSize);\r
155 ReqOpt[0].ValueStr = OptBuf;\r
156\r
157 if (BlockSize != NULL) {\r
158 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
159 ReqOpt[OptCnt].ValueStr = (UINT8 *) (ReqOpt[OptCnt-1].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
160 OptBufSize -= (AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
161 PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, OptBufSize);\r
162 OptCnt++;\r
163 }\r
164\r
165 if (WindowSize != NULL) {\r
166 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
167 ReqOpt[OptCnt].ValueStr = (UINT8 *) (ReqOpt[OptCnt-1].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
168 OptBufSize -= (AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
169 PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, OptBufSize);\r
170 OptCnt++;\r
171 }\r
172\r
173 Status = Mtftp6->GetInfo (\r
174 Mtftp6,\r
175 NULL,\r
176 Filename,\r
177 NULL,\r
178 (UINT8) OptCnt,\r
179 ReqOpt,\r
180 &PktLen,\r
181 &Packet\r
182 );\r
183 if (EFI_ERROR (Status)) {\r
184 if (Status == EFI_TFTP_ERROR) {\r
185 //\r
186 // Store the tftp error message into mode data and set the received flag.\r
187 //\r
188 Private->Mode.TftpErrorReceived = TRUE;\r
189 Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
190 AsciiStrnCpyS (\r
191 Private->Mode.TftpError.ErrorString,\r
192 PXE_MTFTP_ERROR_STRING_LENGTH,\r
193 (CHAR8 *) Packet->Error.ErrorMessage,\r
194 PXE_MTFTP_ERROR_STRING_LENGTH - 1\r
195 );\r
196 Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';\r
197 }\r
198 goto ON_ERROR;\r
199 }\r
200\r
201 //\r
202 // Parse the options in the reply packet.\r
203 //\r
204 OptCnt = 0;\r
205 Status = Mtftp6->ParseOptions (\r
206 Mtftp6,\r
207 PktLen,\r
208 Packet,\r
209 (UINT32 *) &OptCnt,\r
210 &Option\r
211 );\r
212 if (EFI_ERROR (Status)) {\r
213 goto ON_ERROR;\r
214 }\r
215\r
216 //\r
217 // Parse out the value of "tsize" option.\r
218 //\r
219 Status = EFI_NOT_FOUND;\r
220 while (OptCnt != 0) {\r
221 if (AsciiStrnCmp ((CHAR8 *) Option[OptCnt - 1].OptionStr, "tsize", 5) == 0) {\r
222 *BufferSize = AsciiStrDecimalToUint64 ((CHAR8 *) (Option[OptCnt - 1].ValueStr));\r
223 Status = EFI_SUCCESS;\r
224 }\r
225 OptCnt--;\r
226 }\r
227 FreePool (Option);\r
228\r
229ON_ERROR:\r
230 if (Packet != NULL) {\r
231 FreePool (Packet);\r
232 }\r
233 Mtftp6->Configure (Mtftp6, NULL);\r
234\r
235 return Status;\r
236}\r
237\r
238\r
239/**\r
240 This function is to get data of a file using Tftp.\r
241\r
242 @param[in] Private Pointer to PxeBc private data.\r
243 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.\r
244 @param[in] Filename Pointer to boot file name.\r
245 @param[in] BlockSize Pointer to required block size.\r
246 @param[in] WindowSize Pointer to required window size.\r
247 @param[in] BufferPtr Pointer to buffer.\r
248 @param[in, out] BufferSize Pointer to buffer size.\r
249 @param[in] DontUseBuffer Indicates whether with a receive buffer.\r
250\r
251 @retval EFI_SUCCESS Successfully read the data from the special file.\r
252 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
253 @retval Others Read data from file failed.\r
254\r
255**/\r
256EFI_STATUS\r
257PxeBcMtftp6ReadFile (\r
258 IN PXEBC_PRIVATE_DATA *Private,\r
259 IN EFI_MTFTP6_CONFIG_DATA *Config,\r
260 IN UINT8 *Filename,\r
261 IN UINTN *BlockSize,\r
262 IN UINTN *WindowSize,\r
263 IN UINT8 *BufferPtr,\r
264 IN OUT UINT64 *BufferSize,\r
265 IN BOOLEAN DontUseBuffer\r
266 )\r
267{\r
268 EFI_MTFTP6_PROTOCOL *Mtftp6;\r
269 EFI_MTFTP6_TOKEN Token;\r
270 EFI_MTFTP6_OPTION ReqOpt[2];\r
271 UINT32 OptCnt;\r
272 UINT8 BlksizeBuf[10];\r
273 UINT8 WindowsizeBuf[10];\r
274 EFI_STATUS Status;\r
275\r
276 Status = EFI_DEVICE_ERROR;\r
277 Mtftp6 = Private->Mtftp6;\r
278 OptCnt = 0;\r
279 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
280\r
281 Status = Mtftp6->Configure (Mtftp6, Config);\r
282 if (EFI_ERROR (Status)) {\r
283 return Status;\r
284 }\r
285\r
286 if (BlockSize != NULL) {\r
287 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
288 ReqOpt[OptCnt].ValueStr = BlksizeBuf;\r
289 PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, sizeof (BlksizeBuf));\r
290 OptCnt++;\r
291 }\r
292\r
293 if (WindowSize != NULL) {\r
294 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
295 ReqOpt[OptCnt].ValueStr = WindowsizeBuf;\r
296 PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, sizeof (WindowsizeBuf));\r
297 OptCnt++;\r
298 }\r
299\r
300\r
301 Token.Event = NULL;\r
302 Token.OverrideData = NULL;\r
303 Token.Filename = Filename;\r
304 Token.ModeStr = NULL;\r
305 Token.OptionCount = OptCnt;\r
306 Token.OptionList = ReqOpt;\r
307 Token.Context = Private;\r
308\r
309 if (DontUseBuffer) {\r
310 Token.BufferSize = 0;\r
311 Token.Buffer = NULL;\r
312 } else {\r
313 Token.BufferSize = *BufferSize;\r
314 Token.Buffer = BufferPtr;\r
315 }\r
316\r
317 Token.CheckPacket = PxeBcMtftp6CheckPacket;\r
318 Token.TimeoutCallback = NULL;\r
319 Token.PacketNeeded = NULL;\r
320\r
321 Status = Mtftp6->ReadFile (Mtftp6, &Token);\r
322 //\r
323 // Get the real size of received buffer.\r
324 //\r
325 *BufferSize = Token.BufferSize;\r
326\r
327 Mtftp6->Configure (Mtftp6, NULL);\r
328\r
329 return Status;\r
330}\r
331\r
332\r
333/**\r
334 This function is used to write the data of a file using Tftp.\r
335\r
336 @param[in] Private Pointer to PxeBc private data.\r
337 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.\r
338 @param[in] Filename Pointer to boot file name.\r
339 @param[in] Overwrite Indicate whether with overwrite attribute.\r
340 @param[in] BlockSize Pointer to required block size.\r
341 @param[in] BufferPtr Pointer to buffer.\r
342 @param[in, out] BufferSize Pointer to buffer size.\r
343\r
344 @retval EFI_SUCCESS Successfully wrote the data into a special file.\r
345 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
346 @retval other Write data into file failed.\r
347\r
348**/\r
349EFI_STATUS\r
350PxeBcMtftp6WriteFile (\r
351 IN PXEBC_PRIVATE_DATA *Private,\r
352 IN EFI_MTFTP6_CONFIG_DATA *Config,\r
353 IN UINT8 *Filename,\r
354 IN BOOLEAN Overwrite,\r
355 IN UINTN *BlockSize,\r
356 IN UINT8 *BufferPtr,\r
357 IN OUT UINT64 *BufferSize\r
358 )\r
359{\r
360 EFI_MTFTP6_PROTOCOL *Mtftp6;\r
361 EFI_MTFTP6_TOKEN Token;\r
362 EFI_MTFTP6_OPTION ReqOpt[1];\r
363 UINT32 OptCnt;\r
364 UINT8 OptBuf[128];\r
365 EFI_STATUS Status;\r
366\r
367 Status = EFI_DEVICE_ERROR;\r
368 Mtftp6 = Private->Mtftp6;\r
369 OptCnt = 0;\r
370 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
371\r
372 Status = Mtftp6->Configure (Mtftp6, Config);\r
373 if (EFI_ERROR (Status)) {\r
374 return Status;\r
375 }\r
376\r
377 if (BlockSize != NULL) {\r
378 ReqOpt[0].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
379 ReqOpt[0].ValueStr = OptBuf;\r
380 PxeBcUintnToAscDec (*BlockSize, ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\r
381 OptCnt++;\r
382 }\r
383\r
384 Token.Event = NULL;\r
385 Token.OverrideData = NULL;\r
386 Token.Filename = Filename;\r
387 Token.ModeStr = NULL;\r
388 Token.OptionCount = OptCnt;\r
389 Token.OptionList = ReqOpt;\r
390 Token.BufferSize = *BufferSize;\r
391 Token.Buffer = BufferPtr;\r
392 Token.CheckPacket = PxeBcMtftp6CheckPacket;\r
393 Token.TimeoutCallback = NULL;\r
394 Token.PacketNeeded = NULL;\r
395\r
396 Status = Mtftp6->WriteFile (Mtftp6, &Token);\r
397 //\r
398 // Get the real size of transmitted buffer.\r
399 //\r
400 *BufferSize = Token.BufferSize;\r
401\r
402 Mtftp6->Configure (Mtftp6, NULL);\r
403\r
404 return Status;\r
405}\r
406\r
407\r
408/**\r
409 This function is to read the data (file) from a directory using Tftp.\r
410\r
411 @param[in] Private Pointer to PxeBc private data.\r
412 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.\r
413 @param[in] Filename Pointer to boot file name.\r
414 @param[in] BlockSize Pointer to required block size.\r
415 @param[in] WindowSize Pointer to required window size.\r
416 @param[in] BufferPtr Pointer to buffer.\r
417 @param[in, out] BufferSize Pointer to buffer size.\r
418 @param[in] DontUseBuffer Indicates whether to use a receive buffer.\r
419\r
420 @retval EFI_SUCCESS Successfully obtained the data from the file included in directory.\r
421 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
422 @retval Others Operation failed.\r
423\r
424**/\r
425EFI_STATUS\r
426PxeBcMtftp6ReadDirectory (\r
427 IN PXEBC_PRIVATE_DATA *Private,\r
428 IN EFI_MTFTP6_CONFIG_DATA *Config,\r
429 IN UINT8 *Filename,\r
430 IN UINTN *BlockSize,\r
431 IN UINTN *WindowSize,\r
432 IN UINT8 *BufferPtr,\r
433 IN OUT UINT64 *BufferSize,\r
434 IN BOOLEAN DontUseBuffer\r
435 )\r
436{\r
437 EFI_MTFTP6_PROTOCOL *Mtftp6;\r
438 EFI_MTFTP6_TOKEN Token;\r
439 EFI_MTFTP6_OPTION ReqOpt[2];\r
440 UINT32 OptCnt;\r
441 UINT8 BlksizeBuf[10];\r
442 UINT8 WindowsizeBuf[10];\r
443 EFI_STATUS Status;\r
444\r
445 Status = EFI_DEVICE_ERROR;\r
446 Mtftp6 = Private->Mtftp6;\r
447 OptCnt = 0;\r
448 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
449\r
450 Status = Mtftp6->Configure (Mtftp6, Config);\r
451 if (EFI_ERROR (Status)) {\r
452 return Status;\r
453 }\r
454\r
455 if (BlockSize != NULL) {\r
456 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
457 ReqOpt[OptCnt].ValueStr = BlksizeBuf;\r
458 PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, sizeof (BlksizeBuf));\r
459 OptCnt++;\r
460 }\r
461\r
462 if (WindowSize != NULL) {\r
463 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
464 ReqOpt[OptCnt].ValueStr = WindowsizeBuf;\r
465 PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, sizeof (WindowsizeBuf));\r
466 OptCnt++;\r
467 }\r
468\r
469 Token.Event = NULL;\r
470 Token.OverrideData = NULL;\r
471 Token.Filename = Filename;\r
472 Token.ModeStr = NULL;\r
473 Token.OptionCount = OptCnt;\r
474 Token.OptionList = ReqOpt;\r
475 Token.Context = Private;\r
476\r
477 if (DontUseBuffer) {\r
478 Token.BufferSize = 0;\r
479 Token.Buffer = NULL;\r
480 } else {\r
481 Token.BufferSize = *BufferSize;\r
482 Token.Buffer = BufferPtr;\r
483 }\r
484\r
485 Token.CheckPacket = PxeBcMtftp6CheckPacket;\r
486 Token.TimeoutCallback = NULL;\r
487 Token.PacketNeeded = NULL;\r
488\r
489 Status = Mtftp6->ReadDirectory (Mtftp6, &Token);\r
490 //\r
491 // Get the real size of received buffer.\r
492 //\r
493 *BufferSize = Token.BufferSize;\r
494\r
495 Mtftp6->Configure (Mtftp6, NULL);\r
496\r
497 return Status;\r
498}\r
499\r
500\r
501/**\r
502 This is a callback function when packets are received or transmitted in Mtftp driver.\r
503\r
504 A callback function that is provided by the caller to intercept\r
505 the EFI_MTFTP6_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the\r
506 EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept\r
507 EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to\r
508 EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().\r
509\r
510 @param[in] This Pointer to EFI_MTFTP4_PROTOCOL.\r
511 @param[in] Token Pointer to EFI_MTFTP4_TOKEN.\r
512 @param[in] PacketLen Length of EFI_MTFTP4_PACKET.\r
513 @param[in] Packet Pointer to EFI_MTFTP4_PACKET to be checked.\r
514\r
515 @retval EFI_SUCCESS The current operation succeeeded.\r
516 @retval EFI_ABORTED Abort the current transfer process.\r
517\r
518**/\r
519EFI_STATUS\r
520EFIAPI\r
521PxeBcMtftp4CheckPacket (\r
522 IN EFI_MTFTP4_PROTOCOL *This,\r
523 IN EFI_MTFTP4_TOKEN *Token,\r
524 IN UINT16 PacketLen,\r
525 IN EFI_MTFTP4_PACKET *Packet\r
526 )\r
527{\r
528 PXEBC_PRIVATE_DATA *Private;\r
529 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback;\r
530 EFI_STATUS Status;\r
531\r
532 Private = (PXEBC_PRIVATE_DATA *) Token->Context;\r
533 Callback = Private->PxeBcCallback;\r
534 Status = EFI_SUCCESS;\r
535\r
536 if (Packet->OpCode == EFI_MTFTP4_OPCODE_ERROR) {\r
537 //\r
538 // Store the tftp error message into mode data and set the received flag.\r
539 //\r
540 Private->Mode.TftpErrorReceived = TRUE;\r
541 Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
542 AsciiStrnCpyS (\r
543 Private->Mode.TftpError.ErrorString,\r
544 PXE_MTFTP_ERROR_STRING_LENGTH,\r
545 (CHAR8 *) Packet->Error.ErrorMessage,\r
546 PXE_MTFTP_ERROR_STRING_LENGTH - 1\r
547 );\r
548 Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';\r
549 }\r
550\r
551 if (Callback != NULL) {\r
552 //\r
553 // Callback to user if has when received any tftp packet.\r
554 //\r
555 Status = Callback->Callback (\r
556 Callback,\r
557 Private->Function,\r
558 TRUE,\r
559 PacketLen,\r
560 (EFI_PXE_BASE_CODE_PACKET *) Packet\r
561 );\r
562 if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {\r
563 //\r
564 // User wants to abort current process if not EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.\r
565 //\r
566 Status = EFI_ABORTED;\r
567 } else {\r
568 //\r
569 // User wants to continue current process if EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.\r
570 //\r
571 Status = EFI_SUCCESS;\r
572 }\r
573 }\r
574\r
575 return Status;\r
576}\r
577\r
578\r
579/**\r
580 This function is to get size of a file using Tftp.\r
581\r
582 @param[in] Private Pointer to PxeBc private data.\r
583 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.\r
584 @param[in] Filename Pointer to boot file name.\r
585 @param[in] BlockSize Pointer to required block size.\r
586 @param[in] WindowSize Pointer to required window size.\r
587 @param[in, out] BufferSize Pointer to buffer size.\r
588\r
589 @retval EFI_SUCCESS Successfully obtained the size of file.\r
590 @retval EFI_NOT_FOUND Parse the tftp options failed.\r
591 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
592 @retval Others Did not obtain the size of the file.\r
593\r
594**/\r
595EFI_STATUS\r
596PxeBcMtftp4GetFileSize (\r
597 IN PXEBC_PRIVATE_DATA *Private,\r
598 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
599 IN UINT8 *Filename,\r
600 IN UINTN *BlockSize,\r
601 IN UINTN *WindowSize,\r
602 IN OUT UINT64 *BufferSize\r
603 )\r
604{\r
605 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
606 EFI_MTFTP4_OPTION ReqOpt[3];\r
607 EFI_MTFTP4_PACKET *Packet;\r
608 EFI_MTFTP4_OPTION *Option;\r
609 UINT32 PktLen;\r
610 UINT8 OptBuf[PXE_MTFTP_OPTBUF_MAXNUM_INDEX];\r
611 UINTN OptBufSize;\r
612 UINT32 OptCnt;\r
613 EFI_STATUS Status;\r
614\r
615 *BufferSize = 0;\r
616 Status = EFI_DEVICE_ERROR;\r
617 Mtftp4 = Private->Mtftp4;\r
618 Packet = NULL;\r
619 Option = NULL;\r
620 PktLen = 0;\r
621 OptBufSize = PXE_MTFTP_OPTBUF_MAXNUM_INDEX;\r
622 OptCnt = 1;\r
623 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
624\r
625 Status = Mtftp4->Configure (Mtftp4, Config);\r
626 if (EFI_ERROR (Status)) {\r
627 return Status;\r
628 }\r
629\r
630 //\r
631 // Build the required options for get info.\r
632 //\r
633 ReqOpt[0].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX];\r
634 PxeBcUintnToAscDec (0, OptBuf, OptBufSize);\r
635 ReqOpt[0].ValueStr = OptBuf;\r
636\r
637 if (BlockSize != NULL) {\r
638 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
639 ReqOpt[OptCnt].ValueStr = (UINT8 *) (ReqOpt[OptCnt-1].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
640 OptBufSize -= (AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
641 PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, OptBufSize);\r
642 OptCnt++;\r
643 }\r
644\r
645 if (WindowSize != NULL) {\r
646 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
647 ReqOpt[OptCnt].ValueStr = (UINT8 *) (ReqOpt[OptCnt-1].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
648 OptBufSize -= (AsciiStrLen ((CHAR8 *) ReqOpt[OptCnt-1].ValueStr) + 1);\r
649 PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, OptBufSize);\r
650 OptCnt++;\r
651 }\r
652\r
653 Status = Mtftp4->GetInfo (\r
654 Mtftp4,\r
655 NULL,\r
656 Filename,\r
657 NULL,\r
658 (UINT8) OptCnt,\r
659 ReqOpt,\r
660 &PktLen,\r
661 &Packet\r
662 );\r
663 if (EFI_ERROR (Status)) {\r
664 if (Status == EFI_TFTP_ERROR) {\r
665 //\r
666 // Store the tftp error message into mode data and set the received flag.\r
667 //\r
668 Private->Mode.TftpErrorReceived = TRUE;\r
669 Private->Mode.TftpError.ErrorCode = (UINT8) Packet->Error.ErrorCode;\r
670 AsciiStrnCpyS (\r
671 Private->Mode.TftpError.ErrorString,\r
672 PXE_MTFTP_ERROR_STRING_LENGTH,\r
673 (CHAR8 *) Packet->Error.ErrorMessage,\r
674 PXE_MTFTP_ERROR_STRING_LENGTH - 1\r
675 );\r
676 Private->Mode.TftpError.ErrorString[PXE_MTFTP_ERROR_STRING_LENGTH - 1] = '\0';\r
677 }\r
678 goto ON_ERROR;\r
679 }\r
680\r
681 //\r
682 // Parse the options in the reply packet.\r
683 //\r
684 OptCnt = 0;\r
685 Status = Mtftp4->ParseOptions (\r
686 Mtftp4,\r
687 PktLen,\r
688 Packet,\r
689 (UINT32 *) &OptCnt,\r
690 &Option\r
691 );\r
692 if (EFI_ERROR (Status)) {\r
693 goto ON_ERROR;\r
694 }\r
695\r
696 //\r
697 // Parse out the value of "tsize" option.\r
698 //\r
699 Status = EFI_NOT_FOUND;\r
700 while (OptCnt != 0) {\r
701 if (AsciiStrnCmp ((CHAR8 *) Option[OptCnt - 1].OptionStr, "tsize", 5) == 0) {\r
702 *BufferSize = AsciiStrDecimalToUint64 ((CHAR8 *) (Option[OptCnt - 1].ValueStr));\r
703 Status = EFI_SUCCESS;\r
704 }\r
705 OptCnt--;\r
706 }\r
707 FreePool (Option);\r
708\r
709ON_ERROR:\r
710 if (Packet != NULL) {\r
711 FreePool (Packet);\r
712 }\r
713 Mtftp4->Configure (Mtftp4, NULL);\r
714\r
715 return Status;\r
716}\r
717\r
718\r
719/**\r
720 This function is to read the data of a file using Tftp.\r
721\r
722 @param[in] Private Pointer to PxeBc private data.\r
723 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.\r
724 @param[in] Filename Pointer to boot file name.\r
725 @param[in] BlockSize Pointer to required block size.\r
726 @param[in] WindowSize Pointer to required window size.\r
727 @param[in] BufferPtr Pointer to buffer.\r
728 @param[in, out] BufferSize Pointer to buffer size.\r
729 @param[in] DontUseBuffer Indicates whether to use a receive buffer.\r
730\r
731 @retval EFI_SUCCESS Successfully read the data from the special file.\r
732 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
733 @retval Others Read data from file failed.\r
734\r
735**/\r
736EFI_STATUS\r
737PxeBcMtftp4ReadFile (\r
738 IN PXEBC_PRIVATE_DATA *Private,\r
739 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
740 IN UINT8 *Filename,\r
741 IN UINTN *BlockSize,\r
742 IN UINTN *WindowSize,\r
743 IN UINT8 *BufferPtr,\r
744 IN OUT UINT64 *BufferSize,\r
745 IN BOOLEAN DontUseBuffer\r
746 )\r
747{\r
748 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
749 EFI_MTFTP4_TOKEN Token;\r
750 EFI_MTFTP4_OPTION ReqOpt[2];\r
751 UINT32 OptCnt;\r
752 UINT8 BlksizeBuf[10];\r
753 UINT8 WindowsizeBuf[10];\r
754 EFI_STATUS Status;\r
755\r
756 Status = EFI_DEVICE_ERROR;\r
757 Mtftp4 = Private->Mtftp4;\r
758 OptCnt = 0;\r
759 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
760\r
761 Status = Mtftp4->Configure (Mtftp4, Config);\r
762 if (EFI_ERROR (Status)) {\r
763 return Status;\r
764 }\r
765\r
766 if (BlockSize != NULL) {\r
767 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
768 ReqOpt[OptCnt].ValueStr = BlksizeBuf;\r
769 PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, sizeof (BlksizeBuf));\r
770 OptCnt++;\r
771 }\r
772\r
773 if (WindowSize != NULL) {\r
774 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
775 ReqOpt[OptCnt].ValueStr = WindowsizeBuf;\r
776 PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, sizeof (WindowsizeBuf));\r
777 OptCnt++;\r
778 }\r
779\r
780 Token.Event = NULL;\r
781 Token.OverrideData = NULL;\r
782 Token.Filename = Filename;\r
783 Token.ModeStr = NULL;\r
784 Token.OptionCount = OptCnt;\r
785 Token.OptionList = ReqOpt;\r
786 Token.Context = Private;\r
787\r
788 if (DontUseBuffer) {\r
789 Token.BufferSize = 0;\r
790 Token.Buffer = NULL;\r
791 } else {\r
792 Token.BufferSize = *BufferSize;\r
793 Token.Buffer = BufferPtr;\r
794 }\r
795\r
796 Token.CheckPacket = PxeBcMtftp4CheckPacket;\r
797 Token.TimeoutCallback = NULL;\r
798 Token.PacketNeeded = NULL;\r
799\r
800 Status = Mtftp4->ReadFile (Mtftp4, &Token);\r
801 //\r
802 // Get the real size of received buffer.\r
803 //\r
804 *BufferSize = Token.BufferSize;\r
805\r
806 Mtftp4->Configure (Mtftp4, NULL);\r
807\r
808 return Status;\r
809}\r
810\r
811\r
812/**\r
813 This function is to write the data of a file using Tftp.\r
814\r
815 @param[in] Private Pointer to PxeBc private data.\r
816 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.\r
817 @param[in] Filename Pointer to boot file name.\r
818 @param[in] Overwrite Indicates whether to use the overwrite attribute.\r
819 @param[in] BlockSize Pointer to required block size.\r
820 @param[in] BufferPtr Pointer to buffer.\r
821 @param[in, out] BufferSize Pointer to buffer size.\r
822\r
823 @retval EFI_SUCCESS Successfully write the data into the special file.\r
824 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
825 @retval other Write data into file failed.\r
826\r
827**/\r
828EFI_STATUS\r
829PxeBcMtftp4WriteFile (\r
830 IN PXEBC_PRIVATE_DATA *Private,\r
831 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
832 IN UINT8 *Filename,\r
833 IN BOOLEAN Overwrite,\r
834 IN UINTN *BlockSize,\r
835 IN UINT8 *BufferPtr,\r
836 IN OUT UINT64 *BufferSize\r
837 )\r
838{\r
839 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
840 EFI_MTFTP4_TOKEN Token;\r
841 EFI_MTFTP4_OPTION ReqOpt[1];\r
842 UINT32 OptCnt;\r
843 UINT8 OptBuf[128];\r
844 EFI_STATUS Status;\r
845\r
846 Status = EFI_DEVICE_ERROR;\r
847 Mtftp4 = Private->Mtftp4;\r
848 OptCnt = 0;\r
849 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
850\r
851 Status = Mtftp4->Configure (Mtftp4, Config);\r
852 if (EFI_ERROR (Status)) {\r
853 return Status;\r
854 }\r
855\r
856 if (BlockSize != NULL) {\r
857 ReqOpt[0].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
858 ReqOpt[0].ValueStr = OptBuf;\r
859 PxeBcUintnToAscDec (*BlockSize, ReqOpt[0].ValueStr, PXE_MTFTP_OPTBUF_MAXNUM_INDEX);\r
860 OptCnt++;\r
861 }\r
862\r
863 Token.Event = NULL;\r
864 Token.OverrideData = NULL;\r
865 Token.Filename = Filename;\r
866 Token.ModeStr = NULL;\r
867 Token.OptionCount = OptCnt;\r
868 Token.OptionList = ReqOpt;\r
869 Token.BufferSize = *BufferSize;\r
870 Token.Buffer = BufferPtr;\r
871 Token.CheckPacket = PxeBcMtftp4CheckPacket;\r
872 Token.TimeoutCallback = NULL;\r
873 Token.PacketNeeded = NULL;\r
874\r
875 Status = Mtftp4->WriteFile (Mtftp4, &Token);\r
876 //\r
877 // Get the real size of transmitted buffer.\r
878 //\r
879 *BufferSize = Token.BufferSize;\r
880\r
881 Mtftp4->Configure (Mtftp4, NULL);\r
882\r
883 return Status;\r
884}\r
885\r
886\r
887/**\r
888 This function is to get data (file) from a directory using Tftp.\r
889\r
890 @param[in] Private Pointer to PxeBc private data.\r
891 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.\r
892 @param[in] Filename Pointer to boot file name.\r
893 @param[in] BlockSize Pointer to required block size.\r
894 @param[in] WindowSize Pointer to required window size.\r
895 @param[in] BufferPtr Pointer to buffer.\r
896 @param[in, out] BufferSize Pointer to buffer size.\r
897 @param[in] DontUseBuffer Indicates whether to use a receive buffer.\r
898\r
899 @retval EFI_SUCCES Successfully obtained the data from the file included in the directory.\r
900 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
901 @retval Others Operation failed.\r
902\r
903**/\r
904EFI_STATUS\r
905PxeBcMtftp4ReadDirectory (\r
906 IN PXEBC_PRIVATE_DATA *Private,\r
907 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
908 IN UINT8 *Filename,\r
909 IN UINTN *BlockSize,\r
910 IN UINTN *WindowSize,\r
911 IN UINT8 *BufferPtr,\r
912 IN OUT UINT64 *BufferSize,\r
913 IN BOOLEAN DontUseBuffer\r
914 )\r
915{\r
916 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
917 EFI_MTFTP4_TOKEN Token;\r
918 EFI_MTFTP4_OPTION ReqOpt[2];\r
919 UINT32 OptCnt;\r
920 UINT8 BlksizeBuf[10];\r
921 UINT8 WindowsizeBuf[10];\r
922 EFI_STATUS Status;\r
923\r
924 Status = EFI_DEVICE_ERROR;\r
925 Mtftp4 = Private->Mtftp4;\r
926 OptCnt = 0;\r
927 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
928\r
929 Status = Mtftp4->Configure (Mtftp4, Config);\r
930 if (EFI_ERROR (Status)) {\r
931 return Status;\r
932 }\r
933\r
934 if (BlockSize != NULL) {\r
935 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
936 ReqOpt[OptCnt].ValueStr = BlksizeBuf;\r
937 PxeBcUintnToAscDec (*BlockSize, ReqOpt[OptCnt].ValueStr, sizeof (BlksizeBuf));\r
938 OptCnt++;\r
939 }\r
940\r
941 if (WindowSize != NULL) {\r
942 ReqOpt[OptCnt].OptionStr = (UINT8 *) mMtftpOptions[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX];\r
943 ReqOpt[OptCnt].ValueStr = WindowsizeBuf;\r
944 PxeBcUintnToAscDec (*WindowSize, ReqOpt[OptCnt].ValueStr, sizeof (WindowsizeBuf));\r
945 OptCnt++;\r
946 }\r
947\r
948 Token.Event = NULL;\r
949 Token.OverrideData = NULL;\r
950 Token.Filename = Filename;\r
951 Token.ModeStr = NULL;\r
952 Token.OptionCount = OptCnt;\r
953 Token.OptionList = ReqOpt;\r
954 Token.Context = Private;\r
955\r
956 if (DontUseBuffer) {\r
957 Token.BufferSize = 0;\r
958 Token.Buffer = NULL;\r
959 } else {\r
960 Token.BufferSize = *BufferSize;\r
961 Token.Buffer = BufferPtr;\r
962 }\r
963\r
964 Token.CheckPacket = PxeBcMtftp4CheckPacket;\r
965 Token.TimeoutCallback = NULL;\r
966 Token.PacketNeeded = NULL;\r
967\r
968 Status = Mtftp4->ReadDirectory (Mtftp4, &Token);\r
969 //\r
970 // Get the real size of received buffer.\r
971 //\r
972 *BufferSize = Token.BufferSize;\r
973\r
974 Mtftp4->Configure (Mtftp4, NULL);\r
975\r
976 return Status;\r
977}\r
978\r
979\r
980/**\r
981 This function is wrapper to get the file size using TFTP.\r
982\r
983 @param[in] Private Pointer to PxeBc private data.\r
984 @param[in] Config Pointer to configure data.\r
985 @param[in] Filename Pointer to boot file name.\r
986 @param[in] BlockSize Pointer to required block size.\r
987 @param[in] WindowSize Pointer to required window size.\r
988 @param[in, out] BufferSize Pointer to buffer size.\r
989\r
990 @retval EFI_SUCCESS Successfully obtained the size of file.\r
991 @retval EFI_NOT_FOUND Parse the tftp options failed.\r
992 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
993 @retval Others Did not obtain the size of the file.\r
994\r
995**/\r
996EFI_STATUS\r
997PxeBcTftpGetFileSize (\r
998 IN PXEBC_PRIVATE_DATA *Private,\r
999 IN VOID *Config,\r
1000 IN UINT8 *Filename,\r
1001 IN UINTN *BlockSize,\r
1002 IN UINTN *WindowSize,\r
1003 IN OUT UINT64 *BufferSize\r
1004 )\r
1005{\r
1006 if (Private->PxeBc.Mode->UsingIpv6) {\r
1007 return PxeBcMtftp6GetFileSize (\r
1008 Private,\r
1009 (EFI_MTFTP6_CONFIG_DATA *) Config,\r
1010 Filename,\r
1011 BlockSize,\r
1012 WindowSize,\r
1013 BufferSize\r
1014 );\r
1015 } else {\r
1016 return PxeBcMtftp4GetFileSize (\r
1017 Private,\r
1018 (EFI_MTFTP4_CONFIG_DATA *) Config,\r
1019 Filename,\r
1020 BlockSize,\r
1021 WindowSize,\r
1022 BufferSize\r
1023 );\r
1024 }\r
1025}\r
1026\r
1027\r
1028/**\r
1029 This function is a wrapper to get file using TFTP.\r
1030\r
1031 @param[in] Private Pointer to PxeBc private data.\r
1032 @param[in] Config Pointer to config data.\r
1033 @param[in] Filename Pointer to boot file name.\r
1034 @param[in] BlockSize Pointer to required block size.\r
1035 @param[in] WindowSize Pointer to required window size.\r
1036 @param[in] BufferPtr Pointer to buffer.\r
1037 @param[in, out] BufferSize Pointer to buffer size.\r
1038 @param[in] DontUseBuffer Indicates whether to use a receive buffer.\r
1039\r
1040 @retval EFI_SUCCESS Sucessfully read the data from the special file.\r
1041 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
1042 @retval Others Read data from file failed.\r
1043\r
1044**/\r
1045EFI_STATUS\r
1046PxeBcTftpReadFile (\r
1047 IN PXEBC_PRIVATE_DATA *Private,\r
1048 IN VOID *Config,\r
1049 IN UINT8 *Filename,\r
1050 IN UINTN *BlockSize,\r
1051 IN UINTN *WindowSize,\r
1052 IN UINT8 *BufferPtr,\r
1053 IN OUT UINT64 *BufferSize,\r
1054 IN BOOLEAN DontUseBuffer\r
1055 )\r
1056{\r
1057 if (Private->PxeBc.Mode->UsingIpv6) {\r
1058 return PxeBcMtftp6ReadFile (\r
1059 Private,\r
1060 (EFI_MTFTP6_CONFIG_DATA *) Config,\r
1061 Filename,\r
1062 BlockSize,\r
1063 WindowSize,\r
1064 BufferPtr,\r
1065 BufferSize,\r
1066 DontUseBuffer\r
1067 );\r
1068 } else {\r
1069 return PxeBcMtftp4ReadFile (\r
1070 Private,\r
1071 (EFI_MTFTP4_CONFIG_DATA *) Config,\r
1072 Filename,\r
1073 BlockSize,\r
1074 WindowSize,\r
1075 BufferPtr,\r
1076 BufferSize,\r
1077 DontUseBuffer\r
1078 );\r
1079 }\r
1080}\r
1081\r
1082\r
1083/**\r
1084 This function is a wrapper to write file using TFTP.\r
1085\r
1086 @param[in] Private Pointer to PxeBc private data.\r
1087 @param[in] Config Pointer to config data.\r
1088 @param[in] Filename Pointer to boot file name.\r
1089 @param[in] Overwrite Indicate whether with overwrite attribute.\r
1090 @param[in] BlockSize Pointer to required block size.\r
1091 @param[in] BufferPtr Pointer to buffer.\r
1092 @param[in, out] BufferSize Pointer to buffer size.\r
1093\r
1094 @retval EFI_SUCCESS Successfully wrote the data into a special file.\r
1095 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
1096 @retval other Write data into file failed.\r
1097\r
1098**/\r
1099EFI_STATUS\r
1100PxeBcTftpWriteFile (\r
1101 IN PXEBC_PRIVATE_DATA *Private,\r
1102 IN VOID *Config,\r
1103 IN UINT8 *Filename,\r
1104 IN BOOLEAN Overwrite,\r
1105 IN UINTN *BlockSize,\r
1106 IN UINT8 *BufferPtr,\r
1107 IN OUT UINT64 *BufferSize\r
1108 )\r
1109{\r
1110 if (Private->PxeBc.Mode->UsingIpv6) {\r
1111 return PxeBcMtftp6WriteFile (\r
1112 Private,\r
1113 (EFI_MTFTP6_CONFIG_DATA *) Config,\r
1114 Filename,\r
1115 Overwrite,\r
1116 BlockSize,\r
1117 BufferPtr,\r
1118 BufferSize\r
1119 );\r
1120 } else {\r
1121 return PxeBcMtftp4WriteFile (\r
1122 Private,\r
1123 (EFI_MTFTP4_CONFIG_DATA *) Config,\r
1124 Filename,\r
1125 Overwrite,\r
1126 BlockSize,\r
1127 BufferPtr,\r
1128 BufferSize\r
1129 );\r
1130 }\r
1131}\r
1132\r
1133\r
1134/**\r
1135 This function is a wrapper to get the data (file) from a directory using TFTP.\r
1136\r
1137 @param[in] Private Pointer to PxeBc private data.\r
1138 @param[in] Config Pointer to config data.\r
1139 @param[in] Filename Pointer to boot file name.\r
1140 @param[in] BlockSize Pointer to required block size.\r
1141 @param[in] WindowSize Pointer to required window size.\r
1142 @param[in] BufferPtr Pointer to buffer.\r
1143 @param[in, out] BufferSize Pointer to buffer size.\r
1144 @param[in] DontUseBuffer Indicatse whether to use a receive buffer.\r
1145\r
1146 @retval EFI_SUCCES Successfully obtained the data from the file included in the directory.\r
1147 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.\r
1148 @retval Others Operation failed.\r
1149\r
1150**/\r
1151EFI_STATUS\r
1152PxeBcTftpReadDirectory (\r
1153 IN PXEBC_PRIVATE_DATA *Private,\r
1154 IN VOID *Config,\r
1155 IN UINT8 *Filename,\r
1156 IN UINTN *BlockSize,\r
1157 IN UINTN *WindowSize,\r
1158 IN UINT8 *BufferPtr,\r
1159 IN OUT UINT64 *BufferSize,\r
1160 IN BOOLEAN DontUseBuffer\r
1161 )\r
1162{\r
1163 if (Private->PxeBc.Mode->UsingIpv6) {\r
1164 return PxeBcMtftp6ReadDirectory (\r
1165 Private,\r
1166 (EFI_MTFTP6_CONFIG_DATA *) Config,\r
1167 Filename,\r
1168 BlockSize,\r
1169 WindowSize,\r
1170 BufferPtr,\r
1171 BufferSize,\r
1172 DontUseBuffer\r
1173 );\r
1174 } else {\r
1175 return PxeBcMtftp4ReadDirectory (\r
1176 Private,\r
1177 (EFI_MTFTP4_CONFIG_DATA *) Config,\r
1178 Filename,\r
1179 BlockSize,\r
1180 WindowSize,\r
1181 BufferPtr,\r
1182 BufferSize,\r
1183 DontUseBuffer\r
1184 );\r
1185 }\r
1186}\r
1187\r