2 Functions implementation related with Mtftp for UefiPxeBc Driver.
4 Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php.
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include "PxeBcImpl.h"
18 CHAR8
*mMtftpOptions
[PXE_MTFTP_OPTION_MAXIMUM_INDEX
] = {
28 This is a callback function when packets are received or transmitted in Mtftp driver.
30 A callback function that is provided by the caller to intercept
31 the EFI_MTFTP6_OPCODE_DATA or EFI_MTFTP6_OPCODE_DATA8 packets processed in the
32 EFI_MTFTP6_PROTOCOL.ReadFile() function, and alternatively to intercept
33 EFI_MTFTP6_OPCODE_OACK or EFI_MTFTP6_OPCODE_ERROR packets during a call to
34 EFI_MTFTP6_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().
36 @param[in] This Pointer to EFI_MTFTP6_PROTOCOL.
37 @param[in] Token Pointer to EFI_MTFTP6_TOKEN.
38 @param[in] PacketLen Length of EFI_MTFTP6_PACKET.
39 @param[in] Packet Pointer to EFI_MTFTP6_PACKET to be checked.
41 @retval EFI_SUCCESS The current operation succeeded.
42 @retval EFI_ABORTED Abort the current transfer process.
47 PxeBcMtftp6CheckPacket (
48 IN EFI_MTFTP6_PROTOCOL
*This
,
49 IN EFI_MTFTP6_TOKEN
*Token
,
51 IN EFI_MTFTP6_PACKET
*Packet
54 PXEBC_PRIVATE_DATA
*Private
;
55 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
*Callback
;
58 Private
= (PXEBC_PRIVATE_DATA
*) Token
->Context
;
59 Callback
= Private
->PxeBcCallback
;
62 if (Packet
->OpCode
== EFI_MTFTP6_OPCODE_ERROR
) {
64 // Store the tftp error message into mode data and set the received flag.
66 Private
->Mode
.TftpErrorReceived
= TRUE
;
67 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
69 Private
->Mode
.TftpError
.ErrorString
,
70 PXE_MTFTP_ERROR_STRING_LENGTH
,
71 (CHAR8
*) Packet
->Error
.ErrorMessage
,
72 PXE_MTFTP_ERROR_STRING_LENGTH
- 1
74 Private
->Mode
.TftpError
.ErrorString
[PXE_MTFTP_ERROR_STRING_LENGTH
- 1] = '\0';
77 if (Callback
!= NULL
) {
79 // Callback to user if has when received any tftp packet.
81 Status
= Callback
->Callback (
86 (EFI_PXE_BASE_CODE_PACKET
*) Packet
88 if (Status
!= EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE
) {
90 // User wants to abort current process if not EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.
95 // User wants to continue current process if EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.
106 This function is to get the size of a file using Tftp.
108 @param[in] Private Pointer to PxeBc private data.
109 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.
110 @param[in] Filename Pointer to boot file name.
111 @param[in] BlockSize Pointer to required block size.
112 @param[in, out] BufferSize Pointer to buffer size.
114 @retval EFI_SUCCESS Sucessfully obtained the size of file.
115 @retval EFI_NOT_FOUND Parse the tftp ptions failed.
116 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
117 @retval Others Has not obtained the size of the file.
121 PxeBcMtftp6GetFileSize (
122 IN PXEBC_PRIVATE_DATA
*Private
,
123 IN EFI_MTFTP6_CONFIG_DATA
*Config
,
126 IN UINTN
*WindowSize
,
127 IN OUT UINT64
*BufferSize
130 EFI_MTFTP6_PROTOCOL
*Mtftp6
;
131 EFI_MTFTP6_OPTION ReqOpt
[3];
132 EFI_MTFTP6_PACKET
*Packet
;
133 EFI_MTFTP6_OPTION
*Option
;
135 UINT8 OptBuf
[PXE_MTFTP_OPTBUF_MAXNUM_INDEX
];
141 Status
= EFI_DEVICE_ERROR
;
142 Mtftp6
= Private
->Mtftp6
;
146 OptBufSize
= PXE_MTFTP_OPTBUF_MAXNUM_INDEX
;
148 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
150 Status
= Mtftp6
->Configure (Mtftp6
, Config
);
151 if (EFI_ERROR (Status
)) {
156 // Build the required options for get info.
158 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_TSIZE_INDEX
];
159 PxeBcUintnToAscDec (0, OptBuf
, OptBufSize
);
160 ReqOpt
[0].ValueStr
= OptBuf
;
162 if (BlockSize
!= NULL
) {
163 ReqOpt
[OptCnt
].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
164 ReqOpt
[OptCnt
].ValueStr
= (UINT8
*) (ReqOpt
[OptCnt
-1].ValueStr
+ AsciiStrLen ((CHAR8
*) ReqOpt
[OptCnt
-1].ValueStr
) + 1);
165 OptBufSize
-= (AsciiStrLen ((CHAR8
*) ReqOpt
[OptCnt
-1].ValueStr
) + 1);
166 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[OptCnt
].ValueStr
, OptBufSize
);
170 if (WindowSize
!= NULL
) {
171 ReqOpt
[OptCnt
].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX
];
172 ReqOpt
[OptCnt
].ValueStr
= (UINT8
*) (ReqOpt
[OptCnt
-1].ValueStr
+ AsciiStrLen ((CHAR8
*) ReqOpt
[OptCnt
-1].ValueStr
) + 1);
173 OptBufSize
-= (AsciiStrLen ((CHAR8
*) ReqOpt
[OptCnt
-1].ValueStr
) + 1);
174 PxeBcUintnToAscDec (*WindowSize
, ReqOpt
[OptCnt
].ValueStr
, OptBufSize
);
178 Status
= Mtftp6
->GetInfo (
188 if (EFI_ERROR (Status
)) {
189 if (Status
== EFI_TFTP_ERROR
) {
191 // Store the tftp error message into mode data and set the received flag.
193 Private
->Mode
.TftpErrorReceived
= TRUE
;
194 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
196 Private
->Mode
.TftpError
.ErrorString
,
197 PXE_MTFTP_ERROR_STRING_LENGTH
,
198 (CHAR8
*) Packet
->Error
.ErrorMessage
,
199 PXE_MTFTP_ERROR_STRING_LENGTH
- 1
201 Private
->Mode
.TftpError
.ErrorString
[PXE_MTFTP_ERROR_STRING_LENGTH
- 1] = '\0';
207 // Parse the options in the reply packet.
210 Status
= Mtftp6
->ParseOptions (
217 if (EFI_ERROR (Status
)) {
222 // Parse out the value of "tsize" option.
224 Status
= EFI_NOT_FOUND
;
225 while (OptCnt
!= 0) {
226 if (AsciiStrnCmp ((CHAR8
*) Option
[OptCnt
- 1].OptionStr
, "tsize", 5) == 0) {
227 *BufferSize
= AsciiStrDecimalToUint64 ((CHAR8
*) (Option
[OptCnt
- 1].ValueStr
));
228 Status
= EFI_SUCCESS
;
235 if (Packet
!= NULL
) {
238 Mtftp6
->Configure (Mtftp6
, NULL
);
245 This function is to get data of a file using Tftp.
247 @param[in] Private Pointer to PxeBc private data.
248 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.
249 @param[in] Filename Pointer to boot file name.
250 @param[in] BlockSize Pointer to required block size.
251 @param[in] BufferPtr Pointer to buffer.
252 @param[in, out] BufferSize Pointer to buffer size.
253 @param[in] DontUseBuffer Indicates whether with a receive buffer.
255 @retval EFI_SUCCESS Successfully read the data from the special file.
256 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
257 @retval Others Read data from file failed.
261 PxeBcMtftp6ReadFile (
262 IN PXEBC_PRIVATE_DATA
*Private
,
263 IN EFI_MTFTP6_CONFIG_DATA
*Config
,
266 IN UINTN
*WindowSize
,
268 IN OUT UINT64
*BufferSize
,
269 IN BOOLEAN DontUseBuffer
272 EFI_MTFTP6_PROTOCOL
*Mtftp6
;
273 EFI_MTFTP6_TOKEN Token
;
274 EFI_MTFTP6_OPTION ReqOpt
[2];
276 UINT8 BlksizeBuf
[10];
277 UINT8 WindowsizeBuf
[10];
280 Status
= EFI_DEVICE_ERROR
;
281 Mtftp6
= Private
->Mtftp6
;
283 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
285 Status
= Mtftp6
->Configure (Mtftp6
, Config
);
286 if (EFI_ERROR (Status
)) {
290 if (BlockSize
!= NULL
) {
291 ReqOpt
[OptCnt
].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
292 ReqOpt
[OptCnt
].ValueStr
= BlksizeBuf
;
293 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[OptCnt
].ValueStr
, sizeof (BlksizeBuf
));
297 if (WindowSize
!= NULL
) {
298 ReqOpt
[OptCnt
].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX
];
299 ReqOpt
[OptCnt
].ValueStr
= WindowsizeBuf
;
300 PxeBcUintnToAscDec (*WindowSize
, ReqOpt
[OptCnt
].ValueStr
, sizeof (WindowsizeBuf
));
306 Token
.OverrideData
= NULL
;
307 Token
.Filename
= Filename
;
308 Token
.ModeStr
= NULL
;
309 Token
.OptionCount
= OptCnt
;
310 Token
.OptionList
= ReqOpt
;
311 Token
.Context
= Private
;
314 Token
.BufferSize
= 0;
317 Token
.BufferSize
= *BufferSize
;
318 Token
.Buffer
= BufferPtr
;
321 Token
.CheckPacket
= PxeBcMtftp6CheckPacket
;
322 Token
.TimeoutCallback
= NULL
;
323 Token
.PacketNeeded
= NULL
;
325 Status
= Mtftp6
->ReadFile (Mtftp6
, &Token
);
327 // Get the real size of received buffer.
329 *BufferSize
= Token
.BufferSize
;
331 Mtftp6
->Configure (Mtftp6
, NULL
);
338 This function is used to write the data of a file using Tftp.
340 @param[in] Private Pointer to PxeBc private data.
341 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.
342 @param[in] Filename Pointer to boot file name.
343 @param[in] Overwrite Indicate whether with overwrite attribute.
344 @param[in] BlockSize Pointer to required block size.
345 @param[in] BufferPtr Pointer to buffer.
346 @param[in, out] BufferSize Pointer to buffer size.
348 @retval EFI_SUCCESS Successfully wrote the data into a special file.
349 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
350 @retval other Write data into file failed.
354 PxeBcMtftp6WriteFile (
355 IN PXEBC_PRIVATE_DATA
*Private
,
356 IN EFI_MTFTP6_CONFIG_DATA
*Config
,
358 IN BOOLEAN Overwrite
,
361 IN OUT UINT64
*BufferSize
364 EFI_MTFTP6_PROTOCOL
*Mtftp6
;
365 EFI_MTFTP6_TOKEN Token
;
366 EFI_MTFTP6_OPTION ReqOpt
[1];
371 Status
= EFI_DEVICE_ERROR
;
372 Mtftp6
= Private
->Mtftp6
;
374 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
376 Status
= Mtftp6
->Configure (Mtftp6
, Config
);
377 if (EFI_ERROR (Status
)) {
381 if (BlockSize
!= NULL
) {
382 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
383 ReqOpt
[0].ValueStr
= OptBuf
;
384 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
);
389 Token
.OverrideData
= NULL
;
390 Token
.Filename
= Filename
;
391 Token
.ModeStr
= NULL
;
392 Token
.OptionCount
= OptCnt
;
393 Token
.OptionList
= ReqOpt
;
394 Token
.BufferSize
= *BufferSize
;
395 Token
.Buffer
= BufferPtr
;
396 Token
.CheckPacket
= PxeBcMtftp6CheckPacket
;
397 Token
.TimeoutCallback
= NULL
;
398 Token
.PacketNeeded
= NULL
;
400 Status
= Mtftp6
->WriteFile (Mtftp6
, &Token
);
402 // Get the real size of transmitted buffer.
404 *BufferSize
= Token
.BufferSize
;
406 Mtftp6
->Configure (Mtftp6
, NULL
);
413 This function is to read the data (file) from a directory using Tftp.
415 @param[in] Private Pointer to PxeBc private data.
416 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.
417 @param[in] Filename Pointer to boot file name.
418 @param[in] BlockSize Pointer to required block size.
419 @param[in] BufferPtr Pointer to buffer.
420 @param[in, out] BufferSize Pointer to buffer size.
421 @param[in] DontUseBuffer Indicates whether to use a receive buffer.
423 @retval EFI_SUCCESS Successfully obtained the data from the file included in directory.
424 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
425 @retval Others Operation failed.
429 PxeBcMtftp6ReadDirectory (
430 IN PXEBC_PRIVATE_DATA
*Private
,
431 IN EFI_MTFTP6_CONFIG_DATA
*Config
,
434 IN UINTN
*WindowSize
,
436 IN OUT UINT64
*BufferSize
,
437 IN BOOLEAN DontUseBuffer
440 EFI_MTFTP6_PROTOCOL
*Mtftp6
;
441 EFI_MTFTP6_TOKEN Token
;
442 EFI_MTFTP6_OPTION ReqOpt
[2];
444 UINT8 BlksizeBuf
[10];
445 UINT8 WindowsizeBuf
[10];
448 Status
= EFI_DEVICE_ERROR
;
449 Mtftp6
= Private
->Mtftp6
;
451 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
453 Status
= Mtftp6
->Configure (Mtftp6
, Config
);
454 if (EFI_ERROR (Status
)) {
458 if (BlockSize
!= NULL
) {
459 ReqOpt
[OptCnt
].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
460 ReqOpt
[OptCnt
].ValueStr
= BlksizeBuf
;
461 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[OptCnt
].ValueStr
, sizeof (BlksizeBuf
));
465 if (WindowSize
!= NULL
) {
466 ReqOpt
[OptCnt
].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX
];
467 ReqOpt
[OptCnt
].ValueStr
= WindowsizeBuf
;
468 PxeBcUintnToAscDec (*WindowSize
, ReqOpt
[OptCnt
].ValueStr
, sizeof (WindowsizeBuf
));
473 Token
.OverrideData
= NULL
;
474 Token
.Filename
= Filename
;
475 Token
.ModeStr
= NULL
;
476 Token
.OptionCount
= OptCnt
;
477 Token
.OptionList
= ReqOpt
;
478 Token
.Context
= Private
;
481 Token
.BufferSize
= 0;
484 Token
.BufferSize
= *BufferSize
;
485 Token
.Buffer
= BufferPtr
;
488 Token
.CheckPacket
= PxeBcMtftp6CheckPacket
;
489 Token
.TimeoutCallback
= NULL
;
490 Token
.PacketNeeded
= NULL
;
492 Status
= Mtftp6
->ReadDirectory (Mtftp6
, &Token
);
494 // Get the real size of received buffer.
496 *BufferSize
= Token
.BufferSize
;
498 Mtftp6
->Configure (Mtftp6
, NULL
);
505 This is a callback function when packets are received or transmitted in Mtftp driver.
507 A callback function that is provided by the caller to intercept
508 the EFI_MTFTP6_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the
509 EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept
510 EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to
511 EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().
513 @param[in] This Pointer to EFI_MTFTP4_PROTOCOL.
514 @param[in] Token Pointer to EFI_MTFTP4_TOKEN.
515 @param[in] PacketLen Length of EFI_MTFTP4_PACKET.
516 @param[in] Packet Pointer to EFI_MTFTP4_PACKET to be checked.
518 @retval EFI_SUCCESS The current operation succeeeded.
519 @retval EFI_ABORTED Abort the current transfer process.
524 PxeBcMtftp4CheckPacket (
525 IN EFI_MTFTP4_PROTOCOL
*This
,
526 IN EFI_MTFTP4_TOKEN
*Token
,
528 IN EFI_MTFTP4_PACKET
*Packet
531 PXEBC_PRIVATE_DATA
*Private
;
532 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
*Callback
;
535 Private
= (PXEBC_PRIVATE_DATA
*) Token
->Context
;
536 Callback
= Private
->PxeBcCallback
;
537 Status
= EFI_SUCCESS
;
539 if (Packet
->OpCode
== EFI_MTFTP4_OPCODE_ERROR
) {
541 // Store the tftp error message into mode data and set the received flag.
543 Private
->Mode
.TftpErrorReceived
= TRUE
;
544 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
546 Private
->Mode
.TftpError
.ErrorString
,
547 PXE_MTFTP_ERROR_STRING_LENGTH
,
548 (CHAR8
*) Packet
->Error
.ErrorMessage
,
549 PXE_MTFTP_ERROR_STRING_LENGTH
- 1
551 Private
->Mode
.TftpError
.ErrorString
[PXE_MTFTP_ERROR_STRING_LENGTH
- 1] = '\0';
554 if (Callback
!= NULL
) {
556 // Callback to user if has when received any tftp packet.
558 Status
= Callback
->Callback (
563 (EFI_PXE_BASE_CODE_PACKET
*) Packet
565 if (Status
!= EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE
) {
567 // User wants to abort current process if not EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.
569 Status
= EFI_ABORTED
;
572 // User wants to continue current process if EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.
574 Status
= EFI_SUCCESS
;
583 This function is to get size of a file using Tftp.
585 @param[in] Private Pointer to PxeBc private data.
586 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.
587 @param[in] Filename Pointer to boot file name.
588 @param[in] BlockSize Pointer to required block size.
589 @param[in, out] BufferSize Pointer to buffer size.
591 @retval EFI_SUCCESS Successfully obtained the size of file.
592 @retval EFI_NOT_FOUND Parse the tftp options failed.
593 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
594 @retval Others Did not obtain the size of the file.
598 PxeBcMtftp4GetFileSize (
599 IN PXEBC_PRIVATE_DATA
*Private
,
600 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
603 IN UINTN
*WindowSize
,
604 IN OUT UINT64
*BufferSize
607 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
608 EFI_MTFTP4_OPTION ReqOpt
[3];
609 EFI_MTFTP4_PACKET
*Packet
;
610 EFI_MTFTP4_OPTION
*Option
;
612 UINT8 OptBuf
[PXE_MTFTP_OPTBUF_MAXNUM_INDEX
];
618 Status
= EFI_DEVICE_ERROR
;
619 Mtftp4
= Private
->Mtftp4
;
623 OptBufSize
= PXE_MTFTP_OPTBUF_MAXNUM_INDEX
;
625 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
627 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
628 if (EFI_ERROR (Status
)) {
633 // Build the required options for get info.
635 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_TSIZE_INDEX
];
636 PxeBcUintnToAscDec (0, OptBuf
, OptBufSize
);
637 ReqOpt
[0].ValueStr
= OptBuf
;
639 if (BlockSize
!= NULL
) {
640 ReqOpt
[OptCnt
].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
641 ReqOpt
[OptCnt
].ValueStr
= (UINT8
*) (ReqOpt
[OptCnt
-1].ValueStr
+ AsciiStrLen ((CHAR8
*) ReqOpt
[OptCnt
-1].ValueStr
) + 1);
642 OptBufSize
-= (AsciiStrLen ((CHAR8
*) ReqOpt
[OptCnt
-1].ValueStr
) + 1);
643 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[OptCnt
].ValueStr
, OptBufSize
);
647 if (WindowSize
!= NULL
) {
648 ReqOpt
[OptCnt
].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX
];
649 ReqOpt
[OptCnt
].ValueStr
= (UINT8
*) (ReqOpt
[OptCnt
-1].ValueStr
+ AsciiStrLen ((CHAR8
*) ReqOpt
[OptCnt
-1].ValueStr
) + 1);
650 OptBufSize
-= (AsciiStrLen ((CHAR8
*) ReqOpt
[OptCnt
-1].ValueStr
) + 1);
651 PxeBcUintnToAscDec (*WindowSize
, ReqOpt
[OptCnt
].ValueStr
, OptBufSize
);
655 Status
= Mtftp4
->GetInfo (
665 if (EFI_ERROR (Status
)) {
666 if (Status
== EFI_TFTP_ERROR
) {
668 // Store the tftp error message into mode data and set the received flag.
670 Private
->Mode
.TftpErrorReceived
= TRUE
;
671 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
673 Private
->Mode
.TftpError
.ErrorString
,
674 PXE_MTFTP_ERROR_STRING_LENGTH
,
675 (CHAR8
*) Packet
->Error
.ErrorMessage
,
676 PXE_MTFTP_ERROR_STRING_LENGTH
- 1
678 Private
->Mode
.TftpError
.ErrorString
[PXE_MTFTP_ERROR_STRING_LENGTH
- 1] = '\0';
684 // Parse the options in the reply packet.
687 Status
= Mtftp4
->ParseOptions (
694 if (EFI_ERROR (Status
)) {
699 // Parse out the value of "tsize" option.
701 Status
= EFI_NOT_FOUND
;
702 while (OptCnt
!= 0) {
703 if (AsciiStrnCmp ((CHAR8
*) Option
[OptCnt
- 1].OptionStr
, "tsize", 5) == 0) {
704 *BufferSize
= AsciiStrDecimalToUint64 ((CHAR8
*) (Option
[OptCnt
- 1].ValueStr
));
705 Status
= EFI_SUCCESS
;
712 if (Packet
!= NULL
) {
715 Mtftp4
->Configure (Mtftp4
, NULL
);
722 This function is to read the data of a file using Tftp.
724 @param[in] Private Pointer to PxeBc private data.
725 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.
726 @param[in] Filename Pointer to boot file name.
727 @param[in] BlockSize Pointer to required block size.
728 @param[in] BufferPtr Pointer to buffer.
729 @param[in, out] BufferSize Pointer to buffer size.
730 @param[in] DontUseBuffer Indicates whether to use a receive buffer.
732 @retval EFI_SUCCESS Successfully read the data from the special file.
733 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
734 @retval Others Read data from file failed.
738 PxeBcMtftp4ReadFile (
739 IN PXEBC_PRIVATE_DATA
*Private
,
740 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
743 IN UINTN
*WindowSize
,
745 IN OUT UINT64
*BufferSize
,
746 IN BOOLEAN DontUseBuffer
749 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
750 EFI_MTFTP4_TOKEN Token
;
751 EFI_MTFTP4_OPTION ReqOpt
[2];
753 UINT8 BlksizeBuf
[10];
754 UINT8 WindowsizeBuf
[10];
757 Status
= EFI_DEVICE_ERROR
;
758 Mtftp4
= Private
->Mtftp4
;
760 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
762 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
763 if (EFI_ERROR (Status
)) {
767 if (BlockSize
!= NULL
) {
768 ReqOpt
[OptCnt
].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
769 ReqOpt
[OptCnt
].ValueStr
= BlksizeBuf
;
770 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[OptCnt
].ValueStr
, sizeof (BlksizeBuf
));
774 if (WindowSize
!= NULL
) {
775 ReqOpt
[OptCnt
].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX
];
776 ReqOpt
[OptCnt
].ValueStr
= WindowsizeBuf
;
777 PxeBcUintnToAscDec (*WindowSize
, ReqOpt
[OptCnt
].ValueStr
, sizeof (WindowsizeBuf
));
782 Token
.OverrideData
= NULL
;
783 Token
.Filename
= Filename
;
784 Token
.ModeStr
= NULL
;
785 Token
.OptionCount
= OptCnt
;
786 Token
.OptionList
= ReqOpt
;
787 Token
.Context
= Private
;
790 Token
.BufferSize
= 0;
793 Token
.BufferSize
= *BufferSize
;
794 Token
.Buffer
= BufferPtr
;
797 Token
.CheckPacket
= PxeBcMtftp4CheckPacket
;
798 Token
.TimeoutCallback
= NULL
;
799 Token
.PacketNeeded
= NULL
;
801 Status
= Mtftp4
->ReadFile (Mtftp4
, &Token
);
803 // Get the real size of received buffer.
805 *BufferSize
= Token
.BufferSize
;
807 Mtftp4
->Configure (Mtftp4
, NULL
);
814 This function is to write the data of a file using Tftp.
816 @param[in] Private Pointer to PxeBc private data.
817 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.
818 @param[in] Filename Pointer to boot file name.
819 @param[in] Overwrite Indicates whether to use the overwrite attribute.
820 @param[in] BlockSize Pointer to required block size.
821 @param[in] BufferPtr Pointer to buffer.
822 @param[in, out] BufferSize Pointer to buffer size.
824 @retval EFI_SUCCESS Successfully write the data into the special file.
825 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
826 @retval other Write data into file failed.
830 PxeBcMtftp4WriteFile (
831 IN PXEBC_PRIVATE_DATA
*Private
,
832 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
834 IN BOOLEAN Overwrite
,
837 IN OUT UINT64
*BufferSize
840 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
841 EFI_MTFTP4_TOKEN Token
;
842 EFI_MTFTP4_OPTION ReqOpt
[1];
847 Status
= EFI_DEVICE_ERROR
;
848 Mtftp4
= Private
->Mtftp4
;
850 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
852 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
853 if (EFI_ERROR (Status
)) {
857 if (BlockSize
!= NULL
) {
858 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
859 ReqOpt
[0].ValueStr
= OptBuf
;
860 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
);
865 Token
.OverrideData
= NULL
;
866 Token
.Filename
= Filename
;
867 Token
.ModeStr
= NULL
;
868 Token
.OptionCount
= OptCnt
;
869 Token
.OptionList
= ReqOpt
;
870 Token
.BufferSize
= *BufferSize
;
871 Token
.Buffer
= BufferPtr
;
872 Token
.CheckPacket
= PxeBcMtftp4CheckPacket
;
873 Token
.TimeoutCallback
= NULL
;
874 Token
.PacketNeeded
= NULL
;
876 Status
= Mtftp4
->WriteFile (Mtftp4
, &Token
);
878 // Get the real size of transmitted buffer.
880 *BufferSize
= Token
.BufferSize
;
882 Mtftp4
->Configure (Mtftp4
, NULL
);
889 This function is to get data (file) from a directory using Tftp.
891 @param[in] Private Pointer to PxeBc private data.
892 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.
893 @param[in] Filename Pointer to boot file name.
894 @param[in] BlockSize Pointer to required block size.
895 @param[in] BufferPtr Pointer to buffer.
896 @param[in, out] BufferSize Pointer to buffer size.
897 @param[in] DontUseBuffer Indicates whether to use a receive buffer.
899 @retval EFI_SUCCES Successfully obtained the data from the file included in the directory.
900 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
901 @retval Others Operation failed.
905 PxeBcMtftp4ReadDirectory (
906 IN PXEBC_PRIVATE_DATA
*Private
,
907 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
910 IN UINTN
*WindowSize
,
912 IN OUT UINT64
*BufferSize
,
913 IN BOOLEAN DontUseBuffer
916 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
917 EFI_MTFTP4_TOKEN Token
;
918 EFI_MTFTP4_OPTION ReqOpt
[2];
920 UINT8 BlksizeBuf
[10];
921 UINT8 WindowsizeBuf
[10];
924 Status
= EFI_DEVICE_ERROR
;
925 Mtftp4
= Private
->Mtftp4
;
927 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
929 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
930 if (EFI_ERROR (Status
)) {
934 if (BlockSize
!= NULL
) {
935 ReqOpt
[OptCnt
].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
936 ReqOpt
[OptCnt
].ValueStr
= BlksizeBuf
;
937 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[OptCnt
].ValueStr
, sizeof (BlksizeBuf
));
941 if (WindowSize
!= NULL
) {
942 ReqOpt
[OptCnt
].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_WINDOWSIZE_INDEX
];
943 ReqOpt
[OptCnt
].ValueStr
= WindowsizeBuf
;
944 PxeBcUintnToAscDec (*WindowSize
, ReqOpt
[OptCnt
].ValueStr
, sizeof (WindowsizeBuf
));
949 Token
.OverrideData
= NULL
;
950 Token
.Filename
= Filename
;
951 Token
.ModeStr
= NULL
;
952 Token
.OptionCount
= OptCnt
;
953 Token
.OptionList
= ReqOpt
;
954 Token
.Context
= Private
;
957 Token
.BufferSize
= 0;
960 Token
.BufferSize
= *BufferSize
;
961 Token
.Buffer
= BufferPtr
;
964 Token
.CheckPacket
= PxeBcMtftp4CheckPacket
;
965 Token
.TimeoutCallback
= NULL
;
966 Token
.PacketNeeded
= NULL
;
968 Status
= Mtftp4
->ReadDirectory (Mtftp4
, &Token
);
970 // Get the real size of received buffer.
972 *BufferSize
= Token
.BufferSize
;
974 Mtftp4
->Configure (Mtftp4
, NULL
);
981 This function is wrapper to get the file size using TFTP.
983 @param[in] Private Pointer to PxeBc private data.
984 @param[in] Config Pointer to configure data.
985 @param[in] Filename Pointer to boot file name.
986 @param[in] BlockSize Pointer to required block size.
987 @param[in, out] BufferSize Pointer to buffer size.
989 @retval EFI_SUCCESS Successfully obtained the size of file.
990 @retval EFI_NOT_FOUND Parse the tftp options failed.
991 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
992 @retval Others Did not obtain the size of the file.
996 PxeBcTftpGetFileSize (
997 IN PXEBC_PRIVATE_DATA
*Private
,
1000 IN UINTN
*BlockSize
,
1001 IN UINTN
*WindowSize
,
1002 IN OUT UINT64
*BufferSize
1005 if (Private
->PxeBc
.Mode
->UsingIpv6
) {
1006 return PxeBcMtftp6GetFileSize (
1008 (EFI_MTFTP6_CONFIG_DATA
*) Config
,
1015 return PxeBcMtftp4GetFileSize (
1017 (EFI_MTFTP4_CONFIG_DATA
*) Config
,
1028 This function is a wrapper to get file using TFTP.
1030 @param[in] Private Pointer to PxeBc private data.
1031 @param[in] Config Pointer to config data.
1032 @param[in] Filename Pointer to boot file name.
1033 @param[in] BlockSize Pointer to required block size.
1034 @param[in] BufferPtr Pointer to buffer.
1035 @param[in, out] BufferSize Pointer to buffer size.
1036 @param[in] DontUseBuffer Indicates whether to use a receive buffer.
1038 @retval EFI_SUCCESS Sucessfully read the data from the special file.
1039 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
1040 @retval Others Read data from file failed.
1045 IN PXEBC_PRIVATE_DATA
*Private
,
1048 IN UINTN
*BlockSize
,
1049 IN UINTN
*WindowSize
,
1050 IN UINT8
*BufferPtr
,
1051 IN OUT UINT64
*BufferSize
,
1052 IN BOOLEAN DontUseBuffer
1055 if (Private
->PxeBc
.Mode
->UsingIpv6
) {
1056 return PxeBcMtftp6ReadFile (
1058 (EFI_MTFTP6_CONFIG_DATA
*) Config
,
1067 return PxeBcMtftp4ReadFile (
1069 (EFI_MTFTP4_CONFIG_DATA
*) Config
,
1082 This function is a wrapper to write file using TFTP.
1084 @param[in] Private Pointer to PxeBc private data.
1085 @param[in] Config Pointer to config data.
1086 @param[in] Filename Pointer to boot file name.
1087 @param[in] Overwrite Indicate whether with overwrite attribute.
1088 @param[in] BlockSize Pointer to required block size.
1089 @param[in] BufferPtr Pointer to buffer.
1090 @param[in, out] BufferSize Pointer to buffer size.
1092 @retval EFI_SUCCESS Successfully wrote the data into a special file.
1093 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
1094 @retval other Write data into file failed.
1098 PxeBcTftpWriteFile (
1099 IN PXEBC_PRIVATE_DATA
*Private
,
1102 IN BOOLEAN Overwrite
,
1103 IN UINTN
*BlockSize
,
1104 IN UINT8
*BufferPtr
,
1105 IN OUT UINT64
*BufferSize
1108 if (Private
->PxeBc
.Mode
->UsingIpv6
) {
1109 return PxeBcMtftp6WriteFile (
1111 (EFI_MTFTP6_CONFIG_DATA
*) Config
,
1119 return PxeBcMtftp4WriteFile (
1121 (EFI_MTFTP4_CONFIG_DATA
*) Config
,
1133 This function is a wrapper to get the data (file) from a directory using TFTP.
1135 @param[in] Private Pointer to PxeBc private data.
1136 @param[in] Config Pointer to config data.
1137 @param[in] Filename Pointer to boot file name.
1138 @param[in] BlockSize Pointer to required block size.
1139 @param[in] BufferPtr Pointer to buffer.
1140 @param[in, out] BufferSize Pointer to buffer size.
1141 @param[in] DontUseBuffer Indicatse whether to use a receive buffer.
1143 @retval EFI_SUCCES Successfully obtained the data from the file included in the directory.
1144 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
1145 @retval Others Operation failed.
1149 PxeBcTftpReadDirectory (
1150 IN PXEBC_PRIVATE_DATA
*Private
,
1153 IN UINTN
*BlockSize
,
1154 IN UINTN
*WindowSize
,
1155 IN UINT8
*BufferPtr
,
1156 IN OUT UINT64
*BufferSize
,
1157 IN BOOLEAN DontUseBuffer
1160 if (Private
->PxeBc
.Mode
->UsingIpv6
) {
1161 return PxeBcMtftp6ReadDirectory (
1163 (EFI_MTFTP6_CONFIG_DATA
*) Config
,
1172 return PxeBcMtftp4ReadDirectory (
1174 (EFI_MTFTP4_CONFIG_DATA
*) Config
,