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