2 Functions implementation related with Mtftp for UefiPxeBc Driver.
4 Copyright (c) 2007 - 2014, 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
] = {
27 This is a callback function when packets are received or transmitted in Mtftp driver.
29 A callback function that is provided by the caller to intercept
30 the EFI_MTFTP6_OPCODE_DATA or EFI_MTFTP6_OPCODE_DATA8 packets processed in the
31 EFI_MTFTP6_PROTOCOL.ReadFile() function, and alternatively to intercept
32 EFI_MTFTP6_OPCODE_OACK or EFI_MTFTP6_OPCODE_ERROR packets during a call to
33 EFI_MTFTP6_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().
35 @param[in] This Pointer to EFI_MTFTP6_PROTOCOL.
36 @param[in] Token Pointer to EFI_MTFTP6_TOKEN.
37 @param[in] PacketLen Length of EFI_MTFTP6_PACKET.
38 @param[in] Packet Pointer to EFI_MTFTP6_PACKET to be checked.
40 @retval EFI_SUCCESS The current operation succeeded.
41 @retval EFI_ABORTED Abort the current transfer process.
46 PxeBcMtftp6CheckPacket (
47 IN EFI_MTFTP6_PROTOCOL
*This
,
48 IN EFI_MTFTP6_TOKEN
*Token
,
50 IN EFI_MTFTP6_PACKET
*Packet
53 PXEBC_PRIVATE_DATA
*Private
;
54 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
*Callback
;
57 Private
= (PXEBC_PRIVATE_DATA
*) Token
->Context
;
58 Callback
= Private
->PxeBcCallback
;
61 if (Packet
->OpCode
== EFI_MTFTP6_OPCODE_ERROR
) {
63 // Store the tftp error message into mode data and set the received flag.
65 Private
->Mode
.TftpErrorReceived
= TRUE
;
66 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
68 Private
->Mode
.TftpError
.ErrorString
,
69 (CHAR8
*) Packet
->Error
.ErrorMessage
,
70 PXE_MTFTP_ERROR_STRING_LENGTH
72 Private
->Mode
.TftpError
.ErrorString
[PXE_MTFTP_ERROR_STRING_LENGTH
- 1] = '\0';
75 if (Callback
!= NULL
) {
77 // Callback to user if has when received any tftp packet.
79 Status
= Callback
->Callback (
84 (EFI_PXE_BASE_CODE_PACKET
*) Packet
86 if (Status
!= EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE
) {
88 // User wants to abort current process if not EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.
93 // User wants to continue current process if EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.
104 This function is to get the size of a file using Tftp.
106 @param[in] Private Pointer to PxeBc private data.
107 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.
108 @param[in] Filename Pointer to boot file name.
109 @param[in] BlockSize Pointer to required block size.
110 @param[in, out] BufferSize Pointer to buffer size.
112 @retval EFI_SUCCESS Sucessfully obtained the size of file.
113 @retval EFI_NOT_FOUND Parse the tftp ptions failed.
114 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
115 @retval Others Has not obtained the size of the file.
119 PxeBcMtftp6GetFileSize (
120 IN PXEBC_PRIVATE_DATA
*Private
,
121 IN EFI_MTFTP6_CONFIG_DATA
*Config
,
124 IN OUT UINT64
*BufferSize
127 EFI_MTFTP6_PROTOCOL
*Mtftp6
;
128 EFI_MTFTP6_OPTION ReqOpt
[2];
129 EFI_MTFTP6_PACKET
*Packet
;
130 EFI_MTFTP6_OPTION
*Option
;
137 Status
= EFI_DEVICE_ERROR
;
138 Mtftp6
= Private
->Mtftp6
;
143 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
145 Status
= Mtftp6
->Configure (Mtftp6
, Config
);
146 if (EFI_ERROR (Status
)) {
151 // Build the required options for get info.
153 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_TSIZE_INDEX
];
154 PxeBcUintnToAscDec (0, OptBuf
);
155 ReqOpt
[0].ValueStr
= OptBuf
;
157 if (BlockSize
!= NULL
) {
158 ReqOpt
[1].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
159 ReqOpt
[1].ValueStr
= (UINT8
*) (ReqOpt
[0].ValueStr
+ AsciiStrLen ((CHAR8
*) ReqOpt
[0].ValueStr
) + 1);
160 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[1].ValueStr
);
164 Status
= Mtftp6
->GetInfo (
174 if (EFI_ERROR (Status
)) {
175 if (Status
== EFI_TFTP_ERROR
) {
177 // Store the tftp error message into mode data and set the received flag.
179 Private
->Mode
.TftpErrorReceived
= TRUE
;
180 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
182 Private
->Mode
.TftpError
.ErrorString
,
183 (CHAR8
*) Packet
->Error
.ErrorMessage
,
184 PXE_MTFTP_ERROR_STRING_LENGTH
186 Private
->Mode
.TftpError
.ErrorString
[PXE_MTFTP_ERROR_STRING_LENGTH
- 1] = '\0';
192 // Parse the options in the reply packet.
195 Status
= Mtftp6
->ParseOptions (
202 if (EFI_ERROR (Status
)) {
207 // Parse out the value of "tsize" option.
209 Status
= EFI_NOT_FOUND
;
210 while (OptCnt
!= 0) {
211 if (AsciiStrnCmp ((CHAR8
*) Option
[OptCnt
- 1].OptionStr
, "tsize", 5) == 0) {
212 *BufferSize
= AsciiStrDecimalToUint64 ((CHAR8
*) (Option
[OptCnt
- 1].ValueStr
));
213 Status
= EFI_SUCCESS
;
220 if (Packet
!= NULL
) {
223 Mtftp6
->Configure (Mtftp6
, NULL
);
230 This function is to get data of a file using Tftp.
232 @param[in] Private Pointer to PxeBc private data.
233 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.
234 @param[in] Filename Pointer to boot file name.
235 @param[in] BlockSize Pointer to required block size.
236 @param[in] BufferPtr Pointer to buffer.
237 @param[in, out] BufferSize Pointer to buffer size.
238 @param[in] DontUseBuffer Indicates whether with a receive buffer.
240 @retval EFI_SUCCESS Successfully read the data from the special file.
241 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
242 @retval Others Read data from file failed.
246 PxeBcMtftp6ReadFile (
247 IN PXEBC_PRIVATE_DATA
*Private
,
248 IN EFI_MTFTP6_CONFIG_DATA
*Config
,
252 IN OUT UINT64
*BufferSize
,
253 IN BOOLEAN DontUseBuffer
256 EFI_MTFTP6_PROTOCOL
*Mtftp6
;
257 EFI_MTFTP6_TOKEN Token
;
258 EFI_MTFTP6_OPTION ReqOpt
[1];
263 Status
= EFI_DEVICE_ERROR
;
264 Mtftp6
= Private
->Mtftp6
;
266 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
268 Status
= Mtftp6
->Configure (Mtftp6
, Config
);
269 if (EFI_ERROR (Status
)) {
273 if (BlockSize
!= NULL
) {
274 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
275 ReqOpt
[0].ValueStr
= OptBuf
;
276 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
);
281 Token
.OverrideData
= NULL
;
282 Token
.Filename
= Filename
;
283 Token
.ModeStr
= NULL
;
284 Token
.OptionCount
= OptCnt
;
285 Token
.OptionList
= ReqOpt
;
286 Token
.Context
= Private
;
289 Token
.BufferSize
= 0;
292 Token
.BufferSize
= *BufferSize
;
293 Token
.Buffer
= BufferPtr
;
296 Token
.CheckPacket
= PxeBcMtftp6CheckPacket
;
297 Token
.TimeoutCallback
= NULL
;
298 Token
.PacketNeeded
= NULL
;
300 Status
= Mtftp6
->ReadFile (Mtftp6
, &Token
);
302 // Get the real size of received buffer.
304 *BufferSize
= Token
.BufferSize
;
306 Mtftp6
->Configure (Mtftp6
, NULL
);
313 This function is used to write the data of a file using Tftp.
315 @param[in] Private Pointer to PxeBc private data.
316 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.
317 @param[in] Filename Pointer to boot file name.
318 @param[in] Overwrite Indicate whether with overwrite attribute.
319 @param[in] BlockSize Pointer to required block size.
320 @param[in] BufferPtr Pointer to buffer.
321 @param[in, out] BufferSize Pointer to buffer size.
323 @retval EFI_SUCCESS Successfully wrote the data into a special file.
324 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
325 @retval other Write data into file failed.
329 PxeBcMtftp6WriteFile (
330 IN PXEBC_PRIVATE_DATA
*Private
,
331 IN EFI_MTFTP6_CONFIG_DATA
*Config
,
333 IN BOOLEAN Overwrite
,
336 IN OUT UINT64
*BufferSize
339 EFI_MTFTP6_PROTOCOL
*Mtftp6
;
340 EFI_MTFTP6_TOKEN Token
;
341 EFI_MTFTP6_OPTION ReqOpt
[1];
346 Status
= EFI_DEVICE_ERROR
;
347 Mtftp6
= Private
->Mtftp6
;
349 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
351 Status
= Mtftp6
->Configure (Mtftp6
, Config
);
352 if (EFI_ERROR (Status
)) {
356 if (BlockSize
!= NULL
) {
357 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
358 ReqOpt
[0].ValueStr
= OptBuf
;
359 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
);
364 Token
.OverrideData
= NULL
;
365 Token
.Filename
= Filename
;
366 Token
.ModeStr
= NULL
;
367 Token
.OptionCount
= OptCnt
;
368 Token
.OptionList
= ReqOpt
;
369 Token
.BufferSize
= *BufferSize
;
370 Token
.Buffer
= BufferPtr
;
371 Token
.CheckPacket
= PxeBcMtftp6CheckPacket
;
372 Token
.TimeoutCallback
= NULL
;
373 Token
.PacketNeeded
= NULL
;
375 Status
= Mtftp6
->WriteFile (Mtftp6
, &Token
);
377 // Get the real size of transmitted buffer.
379 *BufferSize
= Token
.BufferSize
;
381 Mtftp6
->Configure (Mtftp6
, NULL
);
388 This function is to read the data (file) from a directory using Tftp.
390 @param[in] Private Pointer to PxeBc private data.
391 @param[in] Config Pointer to EFI_MTFTP6_CONFIG_DATA.
392 @param[in] Filename Pointer to boot file name.
393 @param[in] BlockSize Pointer to required block size.
394 @param[in] BufferPtr Pointer to buffer.
395 @param[in, out] BufferSize Pointer to buffer size.
396 @param[in] DontUseBuffer Indicates whether to use a receive buffer.
398 @retval EFI_SUCCESS Successfully obtained the data from the file included in directory.
399 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
400 @retval Others Operation failed.
404 PxeBcMtftp6ReadDirectory (
405 IN PXEBC_PRIVATE_DATA
*Private
,
406 IN EFI_MTFTP6_CONFIG_DATA
*Config
,
410 IN OUT UINT64
*BufferSize
,
411 IN BOOLEAN DontUseBuffer
414 EFI_MTFTP6_PROTOCOL
*Mtftp6
;
415 EFI_MTFTP6_TOKEN Token
;
416 EFI_MTFTP6_OPTION ReqOpt
[1];
421 Status
= EFI_DEVICE_ERROR
;
422 Mtftp6
= Private
->Mtftp6
;
424 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
426 Status
= Mtftp6
->Configure (Mtftp6
, Config
);
427 if (EFI_ERROR (Status
)) {
431 if (BlockSize
!= NULL
) {
432 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
433 ReqOpt
[0].ValueStr
= OptBuf
;
434 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
);
439 Token
.OverrideData
= NULL
;
440 Token
.Filename
= Filename
;
441 Token
.ModeStr
= NULL
;
442 Token
.OptionCount
= OptCnt
;
443 Token
.OptionList
= ReqOpt
;
444 Token
.Context
= Private
;
447 Token
.BufferSize
= 0;
450 Token
.BufferSize
= *BufferSize
;
451 Token
.Buffer
= BufferPtr
;
454 Token
.CheckPacket
= PxeBcMtftp6CheckPacket
;
455 Token
.TimeoutCallback
= NULL
;
456 Token
.PacketNeeded
= NULL
;
458 Status
= Mtftp6
->ReadDirectory (Mtftp6
, &Token
);
460 // Get the real size of received buffer.
462 *BufferSize
= Token
.BufferSize
;
464 Mtftp6
->Configure (Mtftp6
, NULL
);
471 This is a callback function when packets are received or transmitted in Mtftp driver.
473 A callback function that is provided by the caller to intercept
474 the EFI_MTFTP6_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the
475 EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept
476 EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to
477 EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().
479 @param[in] This Pointer to EFI_MTFTP4_PROTOCOL.
480 @param[in] Token Pointer to EFI_MTFTP4_TOKEN.
481 @param[in] PacketLen Length of EFI_MTFTP4_PACKET.
482 @param[in] Packet Pointer to EFI_MTFTP4_PACKET to be checked.
484 @retval EFI_SUCCESS The current operation succeeeded.
485 @retval EFI_ABORTED Abort the current transfer process.
490 PxeBcMtftp4CheckPacket (
491 IN EFI_MTFTP4_PROTOCOL
*This
,
492 IN EFI_MTFTP4_TOKEN
*Token
,
494 IN EFI_MTFTP4_PACKET
*Packet
497 PXEBC_PRIVATE_DATA
*Private
;
498 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
*Callback
;
501 Private
= (PXEBC_PRIVATE_DATA
*) Token
->Context
;
502 Callback
= Private
->PxeBcCallback
;
503 Status
= EFI_SUCCESS
;
505 if (Packet
->OpCode
== EFI_MTFTP4_OPCODE_ERROR
) {
507 // Store the tftp error message into mode data and set the received flag.
509 Private
->Mode
.TftpErrorReceived
= TRUE
;
510 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
512 Private
->Mode
.TftpError
.ErrorString
,
513 (CHAR8
*) Packet
->Error
.ErrorMessage
,
514 PXE_MTFTP_ERROR_STRING_LENGTH
516 Private
->Mode
.TftpError
.ErrorString
[PXE_MTFTP_ERROR_STRING_LENGTH
- 1] = '\0';
519 if (Callback
!= NULL
) {
521 // Callback to user if has when received any tftp packet.
523 Status
= Callback
->Callback (
528 (EFI_PXE_BASE_CODE_PACKET
*) Packet
530 if (Status
!= EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE
) {
532 // User wants to abort current process if not EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.
534 Status
= EFI_ABORTED
;
537 // User wants to continue current process if EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE.
539 Status
= EFI_SUCCESS
;
548 This function is to get size of a file using Tftp.
550 @param[in] Private Pointer to PxeBc private data.
551 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.
552 @param[in] Filename Pointer to boot file name.
553 @param[in] BlockSize Pointer to required block size.
554 @param[in, out] BufferSize Pointer to buffer size.
556 @retval EFI_SUCCESS Successfully obtained the size of file.
557 @retval EFI_NOT_FOUND Parse the tftp options failed.
558 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
559 @retval Others Did not obtain the size of the file.
563 PxeBcMtftp4GetFileSize (
564 IN PXEBC_PRIVATE_DATA
*Private
,
565 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
568 IN OUT UINT64
*BufferSize
571 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
572 EFI_MTFTP4_OPTION ReqOpt
[2];
573 EFI_MTFTP4_PACKET
*Packet
;
574 EFI_MTFTP4_OPTION
*Option
;
581 Status
= EFI_DEVICE_ERROR
;
582 Mtftp4
= Private
->Mtftp4
;
587 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
589 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
590 if (EFI_ERROR (Status
)) {
595 // Build the required options for get info.
597 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_TSIZE_INDEX
];
598 PxeBcUintnToAscDec (0, OptBuf
);
599 ReqOpt
[0].ValueStr
= OptBuf
;
601 if (BlockSize
!= NULL
) {
602 ReqOpt
[1].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
603 ReqOpt
[1].ValueStr
= (UINT8
*) (ReqOpt
[0].ValueStr
+ AsciiStrLen ((CHAR8
*) ReqOpt
[0].ValueStr
) + 1);
604 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[1].ValueStr
);
608 Status
= Mtftp4
->GetInfo (
618 if (EFI_ERROR (Status
)) {
619 if (Status
== EFI_TFTP_ERROR
) {
621 // Store the tftp error message into mode data and set the received flag.
623 Private
->Mode
.TftpErrorReceived
= TRUE
;
624 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
626 Private
->Mode
.TftpError
.ErrorString
,
627 (CHAR8
*) Packet
->Error
.ErrorMessage
,
628 PXE_MTFTP_ERROR_STRING_LENGTH
630 Private
->Mode
.TftpError
.ErrorString
[PXE_MTFTP_ERROR_STRING_LENGTH
- 1] = '\0';
636 // Parse the options in the reply packet.
639 Status
= Mtftp4
->ParseOptions (
646 if (EFI_ERROR (Status
)) {
651 // Parse out the value of "tsize" option.
653 Status
= EFI_NOT_FOUND
;
654 while (OptCnt
!= 0) {
655 if (AsciiStrnCmp ((CHAR8
*) Option
[OptCnt
- 1].OptionStr
, "tsize", 5) == 0) {
656 *BufferSize
= AsciiStrDecimalToUint64 ((CHAR8
*) (Option
[OptCnt
- 1].ValueStr
));
657 Status
= EFI_SUCCESS
;
664 if (Packet
!= NULL
) {
667 Mtftp4
->Configure (Mtftp4
, NULL
);
674 This function is to read the data of a file using Tftp.
676 @param[in] Private Pointer to PxeBc private data.
677 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.
678 @param[in] Filename Pointer to boot file name.
679 @param[in] BlockSize Pointer to required block size.
680 @param[in] BufferPtr Pointer to buffer.
681 @param[in, out] BufferSize Pointer to buffer size.
682 @param[in] DontUseBuffer Indicates whether to use a receive buffer.
684 @retval EFI_SUCCESS Successfully read the data from the special file.
685 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
686 @retval Others Read data from file failed.
690 PxeBcMtftp4ReadFile (
691 IN PXEBC_PRIVATE_DATA
*Private
,
692 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
696 IN OUT UINT64
*BufferSize
,
697 IN BOOLEAN DontUseBuffer
700 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
701 EFI_MTFTP4_TOKEN Token
;
702 EFI_MTFTP4_OPTION ReqOpt
[1];
707 Status
= EFI_DEVICE_ERROR
;
708 Mtftp4
= Private
->Mtftp4
;
710 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
712 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
713 if (EFI_ERROR (Status
)) {
717 if (BlockSize
!= NULL
) {
718 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
719 ReqOpt
[0].ValueStr
= OptBuf
;
720 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
);
725 Token
.OverrideData
= NULL
;
726 Token
.Filename
= Filename
;
727 Token
.ModeStr
= NULL
;
728 Token
.OptionCount
= OptCnt
;
729 Token
.OptionList
= ReqOpt
;
730 Token
.Context
= Private
;
733 Token
.BufferSize
= 0;
736 Token
.BufferSize
= *BufferSize
;
737 Token
.Buffer
= BufferPtr
;
740 Token
.CheckPacket
= PxeBcMtftp4CheckPacket
;
741 Token
.TimeoutCallback
= NULL
;
742 Token
.PacketNeeded
= NULL
;
744 Status
= Mtftp4
->ReadFile (Mtftp4
, &Token
);
746 // Get the real size of received buffer.
748 *BufferSize
= Token
.BufferSize
;
750 Mtftp4
->Configure (Mtftp4
, NULL
);
757 This function is to write the data of a file using Tftp.
759 @param[in] Private Pointer to PxeBc private data.
760 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.
761 @param[in] Filename Pointer to boot file name.
762 @param[in] Overwrite Indicates whether to use the overwrite attribute.
763 @param[in] BlockSize Pointer to required block size.
764 @param[in] BufferPtr Pointer to buffer.
765 @param[in, out] BufferSize Pointer to buffer size.
767 @retval EFI_SUCCESS Successfully write the data into the special file.
768 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
769 @retval other Write data into file failed.
773 PxeBcMtftp4WriteFile (
774 IN PXEBC_PRIVATE_DATA
*Private
,
775 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
777 IN BOOLEAN Overwrite
,
780 IN OUT UINT64
*BufferSize
783 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
784 EFI_MTFTP4_TOKEN Token
;
785 EFI_MTFTP4_OPTION ReqOpt
[1];
790 Status
= EFI_DEVICE_ERROR
;
791 Mtftp4
= Private
->Mtftp4
;
793 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
795 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
796 if (EFI_ERROR (Status
)) {
800 if (BlockSize
!= NULL
) {
801 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
802 ReqOpt
[0].ValueStr
= OptBuf
;
803 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
);
808 Token
.OverrideData
= NULL
;
809 Token
.Filename
= Filename
;
810 Token
.ModeStr
= NULL
;
811 Token
.OptionCount
= OptCnt
;
812 Token
.OptionList
= ReqOpt
;
813 Token
.BufferSize
= *BufferSize
;
814 Token
.Buffer
= BufferPtr
;
815 Token
.CheckPacket
= PxeBcMtftp4CheckPacket
;
816 Token
.TimeoutCallback
= NULL
;
817 Token
.PacketNeeded
= NULL
;
819 Status
= Mtftp4
->WriteFile (Mtftp4
, &Token
);
821 // Get the real size of transmitted buffer.
823 *BufferSize
= Token
.BufferSize
;
825 Mtftp4
->Configure (Mtftp4
, NULL
);
832 This function is to get data (file) from a directory using Tftp.
834 @param[in] Private Pointer to PxeBc private data.
835 @param[in] Config Pointer to EFI_MTFTP4_CONFIG_DATA.
836 @param[in] Filename Pointer to boot file name.
837 @param[in] BlockSize Pointer to required block size.
838 @param[in] BufferPtr Pointer to buffer.
839 @param[in, out] BufferSize Pointer to buffer size.
840 @param[in] DontUseBuffer Indicates whether to use a receive buffer.
842 @retval EFI_SUCCES Successfully obtained the data from the file included in the directory.
843 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
844 @retval Others Operation failed.
848 PxeBcMtftp4ReadDirectory (
849 IN PXEBC_PRIVATE_DATA
*Private
,
850 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
854 IN OUT UINT64
*BufferSize
,
855 IN BOOLEAN DontUseBuffer
858 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
859 EFI_MTFTP4_TOKEN Token
;
860 EFI_MTFTP4_OPTION ReqOpt
[1];
865 Status
= EFI_DEVICE_ERROR
;
866 Mtftp4
= Private
->Mtftp4
;
868 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
870 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
871 if (EFI_ERROR (Status
)) {
875 if (BlockSize
!= NULL
) {
876 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
877 ReqOpt
[0].ValueStr
= OptBuf
;
878 PxeBcUintnToAscDec (*BlockSize
, ReqOpt
[0].ValueStr
);
883 Token
.OverrideData
= NULL
;
884 Token
.Filename
= Filename
;
885 Token
.ModeStr
= NULL
;
886 Token
.OptionCount
= OptCnt
;
887 Token
.OptionList
= ReqOpt
;
888 Token
.Context
= Private
;
891 Token
.BufferSize
= 0;
894 Token
.BufferSize
= *BufferSize
;
895 Token
.Buffer
= BufferPtr
;
898 Token
.CheckPacket
= PxeBcMtftp4CheckPacket
;
899 Token
.TimeoutCallback
= NULL
;
900 Token
.PacketNeeded
= NULL
;
902 Status
= Mtftp4
->ReadDirectory (Mtftp4
, &Token
);
904 // Get the real size of received buffer.
906 *BufferSize
= Token
.BufferSize
;
908 Mtftp4
->Configure (Mtftp4
, NULL
);
915 This function is wrapper to get the file size using TFTP.
917 @param[in] Private Pointer to PxeBc private data.
918 @param[in] Config Pointer to configure data.
919 @param[in] Filename Pointer to boot file name.
920 @param[in] BlockSize Pointer to required block size.
921 @param[in, out] BufferSize Pointer to buffer size.
923 @retval EFI_SUCCESS Successfully obtained the size of file.
924 @retval EFI_NOT_FOUND Parse the tftp options failed.
925 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
926 @retval Others Did not obtain the size of the file.
930 PxeBcTftpGetFileSize (
931 IN PXEBC_PRIVATE_DATA
*Private
,
935 IN OUT UINT64
*BufferSize
938 if (Private
->PxeBc
.Mode
->UsingIpv6
) {
939 return PxeBcMtftp6GetFileSize (
941 (EFI_MTFTP6_CONFIG_DATA
*) Config
,
947 return PxeBcMtftp4GetFileSize (
949 (EFI_MTFTP4_CONFIG_DATA
*) Config
,
959 This function is a wrapper to get file using TFTP.
961 @param[in] Private Pointer to PxeBc private data.
962 @param[in] Config Pointer to config data.
963 @param[in] Filename Pointer to boot file name.
964 @param[in] BlockSize Pointer to required block size.
965 @param[in] BufferPtr Pointer to buffer.
966 @param[in, out] BufferSize Pointer to buffer size.
967 @param[in] DontUseBuffer Indicates whether to use a receive buffer.
969 @retval EFI_SUCCESS Sucessfully read the data from the special file.
970 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
971 @retval Others Read data from file failed.
976 IN PXEBC_PRIVATE_DATA
*Private
,
981 IN OUT UINT64
*BufferSize
,
982 IN BOOLEAN DontUseBuffer
985 if (Private
->PxeBc
.Mode
->UsingIpv6
) {
986 return PxeBcMtftp6ReadFile (
988 (EFI_MTFTP6_CONFIG_DATA
*) Config
,
996 return PxeBcMtftp4ReadFile (
998 (EFI_MTFTP4_CONFIG_DATA
*) Config
,
1010 This function is a wrapper to write file using TFTP.
1012 @param[in] Private Pointer to PxeBc private data.
1013 @param[in] Config Pointer to config data.
1014 @param[in] Filename Pointer to boot file name.
1015 @param[in] Overwrite Indicate whether with overwrite attribute.
1016 @param[in] BlockSize Pointer to required block size.
1017 @param[in] BufferPtr Pointer to buffer.
1018 @param[in, out] BufferSize Pointer to buffer size.
1020 @retval EFI_SUCCESS Successfully wrote the data into a special file.
1021 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
1022 @retval other Write data into file failed.
1026 PxeBcTftpWriteFile (
1027 IN PXEBC_PRIVATE_DATA
*Private
,
1030 IN BOOLEAN Overwrite
,
1031 IN UINTN
*BlockSize
,
1032 IN UINT8
*BufferPtr
,
1033 IN OUT UINT64
*BufferSize
1036 if (Private
->PxeBc
.Mode
->UsingIpv6
) {
1037 return PxeBcMtftp6WriteFile (
1039 (EFI_MTFTP6_CONFIG_DATA
*) Config
,
1047 return PxeBcMtftp4WriteFile (
1049 (EFI_MTFTP4_CONFIG_DATA
*) Config
,
1061 This function is a wrapper to get the data (file) from a directory using TFTP.
1063 @param[in] Private Pointer to PxeBc private data.
1064 @param[in] Config Pointer to config data.
1065 @param[in] Filename Pointer to boot file name.
1066 @param[in] BlockSize Pointer to required block size.
1067 @param[in] BufferPtr Pointer to buffer.
1068 @param[in, out] BufferSize Pointer to buffer size.
1069 @param[in] DontUseBuffer Indicatse whether to use a receive buffer.
1071 @retval EFI_SUCCES Successfully obtained the data from the file included in the directory.
1072 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
1073 @retval Others Operation failed.
1077 PxeBcTftpReadDirectory (
1078 IN PXEBC_PRIVATE_DATA
*Private
,
1081 IN UINTN
*BlockSize
,
1082 IN UINT8
*BufferPtr
,
1083 IN OUT UINT64
*BufferSize
,
1084 IN BOOLEAN DontUseBuffer
1087 if (Private
->PxeBc
.Mode
->UsingIpv6
) {
1088 return PxeBcMtftp6ReadDirectory (
1090 (EFI_MTFTP6_CONFIG_DATA
*) Config
,
1098 return PxeBcMtftp4ReadDirectory (
1100 (EFI_MTFTP4_CONFIG_DATA
*) Config
,