4 Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "PxeBcImpl.h"
17 CHAR8
*mMtftpOptions
[PXE_MTFTP_OPTION_MAXIMUM_INDEX
] = {
26 This is a callback function when packets received/transmitted in Mtftp driver.
28 A callback function that is provided by the caller to intercept
29 the EFI_MTFTP4_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the
30 EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept
31 EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to
32 EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().
34 @param This Pointer to Mtftp protocol instance
35 @param Token Pointer to Mtftp token
36 @param PacketLen Length of Mtftp packet
37 @param Packet Pointer to Mtftp packet
39 @retval EFI_SUCCESS Operation sucess
40 @retval EFI_ABORTED Abort transfer process
46 IN EFI_MTFTP4_PROTOCOL
*This
,
47 IN EFI_MTFTP4_TOKEN
*Token
,
49 IN EFI_MTFTP4_PACKET
*Packet
52 PXEBC_PRIVATE_DATA
*Private
;
53 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
*Callback
;
56 Private
= (PXEBC_PRIVATE_DATA
*) Token
->Context
;
57 Callback
= Private
->PxeBcCallback
;
60 if (Packet
->OpCode
== EFI_MTFTP4_OPCODE_ERROR
) {
61 Private
->Mode
.TftpErrorReceived
= TRUE
;
62 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
63 AsciiStrnCpyS (Private
->Mode
.TftpError
.ErrorString
, PXE_MTFTP_ERROR_STRING_LENGTH
, (CHAR8
*) Packet
->Error
.ErrorMessage
, PXE_MTFTP_ERROR_STRING_LENGTH
- 1);
64 Private
->Mode
.TftpError
.ErrorString
[PXE_MTFTP_ERROR_STRING_LENGTH
- 1] = '\0';
67 if (Callback
!= NULL
) {
69 Status
= Callback
->Callback (
74 (EFI_PXE_BASE_CODE_PACKET
*) Packet
76 if (Status
!= EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE
) {
90 This function is to get size of a file by Tftp.
92 @param Private Pointer to PxeBc private data
93 @param Config Pointer to Mtftp configuration data
94 @param Filename Pointer to file name
95 @param BlockSize Pointer to block size
96 @param BufferSize Pointer to buffer size
98 @retval EFI_SUCCESS Get the size of file success
99 @retval EFI_NOT_FOUND Parse the tftp ptions failed.
100 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
101 @retval Other Has not get the size of the file.
105 PxeBcTftpGetFileSize (
106 IN PXEBC_PRIVATE_DATA
*Private
,
107 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
110 IN OUT UINT64
*BufferSize
113 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
114 EFI_MTFTP4_OPTION ReqOpt
[2];
115 EFI_MTFTP4_PACKET
*Packet
;
116 EFI_MTFTP4_OPTION
*Option
;
123 Status
= EFI_DEVICE_ERROR
;
124 Mtftp4
= Private
->Mtftp4
;
129 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
131 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
132 if (EFI_ERROR (Status
)) {
137 ReqOpt
[0].OptionStr
= (UINT8
*)mMtftpOptions
[PXE_MTFTP_OPTION_TSIZE_INDEX
];
138 UtoA10 (0, (CHAR8
*) OptBuf
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
);
139 ReqOpt
[0].ValueStr
= OptBuf
;
141 if (BlockSize
!= NULL
) {
142 ReqOpt
[1].OptionStr
= (UINT8
*)mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
143 ReqOpt
[1].ValueStr
= ReqOpt
[0].ValueStr
+ AsciiStrLen ((CHAR8
*) ReqOpt
[0].ValueStr
) + 1;
144 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[1].ValueStr
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
- (AsciiStrLen ((CHAR8
*) ReqOpt
[0].ValueStr
) + 1));
148 Status
= Mtftp4
->GetInfo (
159 if (EFI_ERROR (Status
)) {
160 if (Status
== EFI_TFTP_ERROR
) {
161 Private
->Mode
.TftpErrorReceived
= TRUE
;
162 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
164 Private
->Mode
.TftpError
.ErrorString
,
165 PXE_MTFTP_ERROR_STRING_LENGTH
,
166 (CHAR8
*) Packet
->Error
.ErrorMessage
,
167 PXE_MTFTP_ERROR_STRING_LENGTH
- 1
169 Private
->Mode
.TftpError
.ErrorString
[PXE_MTFTP_ERROR_STRING_LENGTH
- 1] = '\0';
176 Status
= Mtftp4
->ParseOptions (
184 if (EFI_ERROR (Status
)) {
189 Status
= EFI_NOT_FOUND
;
191 while (OptCnt
!= 0) {
193 if (AsciiStrnCmp ((CHAR8
*) Option
[OptCnt
- 1].OptionStr
, "tsize", 5) == 0) {
195 *BufferSize
= AtoU64 (Option
[OptCnt
- 1].ValueStr
);
196 Status
= EFI_SUCCESS
;
206 if (Packet
!= NULL
) {
210 Mtftp4
->Configure (Mtftp4
, NULL
);
217 This function is to get data of a file by Tftp.
219 @param Private Pointer to PxeBc private data
220 @param Config Pointer to Mtftp configuration data
221 @param Filename Pointer to file name
222 @param BlockSize Pointer to block size
223 @param BufferPtr Pointer to buffer
224 @param BufferSize Pointer to buffer size
225 @param DontUseBuffer Indicate whether with a receive buffer
227 @retval EFI_SUCCESS Read the data success from the special file.
228 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
229 @retval other Read data from file failed.
234 IN PXEBC_PRIVATE_DATA
*Private
,
235 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
239 IN OUT UINT64
*BufferSize
,
240 IN BOOLEAN DontUseBuffer
243 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
244 EFI_MTFTP4_TOKEN Token
;
245 EFI_MTFTP4_OPTION ReqOpt
[1];
250 Status
= EFI_DEVICE_ERROR
;
251 Mtftp4
= Private
->Mtftp4
;
253 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
255 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
256 if (EFI_ERROR (Status
)) {
261 if (BlockSize
!= NULL
) {
263 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
264 ReqOpt
[0].ValueStr
= OptBuf
;
265 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
);
270 Token
.OverrideData
= NULL
;
271 Token
.Filename
= Filename
;
272 Token
.ModeStr
= NULL
;
273 Token
.OptionCount
= OptCnt
;
274 Token
.OptionList
= ReqOpt
;
275 Token
.Context
= Private
;
278 Token
.BufferSize
= 0;
281 Token
.BufferSize
= *BufferSize
;
282 Token
.Buffer
= BufferPtr
;
285 Token
.CheckPacket
= PxeBcCheckPacket
;
286 Token
.TimeoutCallback
= NULL
;
287 Token
.PacketNeeded
= NULL
;
289 Status
= Mtftp4
->ReadFile (Mtftp4
, &Token
);
291 *BufferSize
= Token
.BufferSize
;
293 Mtftp4
->Configure (Mtftp4
, NULL
);
300 This function is put data of a file by Tftp.
302 @param Private Pointer to PxeBc private data
303 @param Config Pointer to Mtftp configuration data
304 @param Filename Pointer to file name
305 @param Overwrite Indicate whether with overwrite attribute
306 @param BlockSize Pointer to block size
307 @param BufferPtr Pointer to buffer
308 @param BufferSize Pointer to buffer size
310 @retval EFI_SUCCESS Write the data success into the special file.
311 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
312 @retval other Write data into file failed.
317 IN PXEBC_PRIVATE_DATA
*Private
,
318 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
320 IN BOOLEAN Overwrite
,
323 IN OUT UINT64
*BufferSize
326 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
327 EFI_MTFTP4_TOKEN Token
;
328 EFI_MTFTP4_OPTION ReqOpt
[1];
333 Status
= EFI_DEVICE_ERROR
;
334 Mtftp4
= Private
->Mtftp4
;
336 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
338 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
339 if (EFI_ERROR (Status
)) {
344 if (BlockSize
!= NULL
) {
346 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
347 ReqOpt
[0].ValueStr
= OptBuf
;
348 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
);
353 Token
.OverrideData
= NULL
;
354 Token
.Filename
= Filename
;
355 Token
.ModeStr
= NULL
;
356 Token
.OptionCount
= OptCnt
;
357 Token
.OptionList
= ReqOpt
;
358 Token
.BufferSize
= *BufferSize
;
359 Token
.Buffer
= BufferPtr
;
360 Token
.CheckPacket
= PxeBcCheckPacket
;
361 Token
.TimeoutCallback
= NULL
;
362 Token
.PacketNeeded
= NULL
;
364 Status
= Mtftp4
->WriteFile (Mtftp4
, &Token
);
365 *BufferSize
= Token
.BufferSize
;
367 Mtftp4
->Configure (Mtftp4
, NULL
);
374 This function is to get data(file) from a directory(may be a server) by Tftp.
376 @param Private Pointer to PxeBc private data.
377 @param Config Pointer to Mtftp configuration data.
378 @param Filename Pointer to file name.
379 @param BlockSize Pointer to block size.
380 @param BufferPtr Pointer to buffer.
381 @param BufferSize Pointer to buffer size.
382 @param DontUseBuffer Indicate whether with a receive buffer.
384 @retval EFI_SUCCES Get the data from the file included in directory success.
385 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
386 @retval other Operation failed.
390 PxeBcTftpReadDirectory (
391 IN PXEBC_PRIVATE_DATA
*Private
,
392 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
396 IN OUT UINT64
*BufferSize
,
397 IN BOOLEAN DontUseBuffer
400 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
401 EFI_MTFTP4_TOKEN Token
;
402 EFI_MTFTP4_OPTION ReqOpt
[1];
407 Status
= EFI_DEVICE_ERROR
;
408 Mtftp4
= Private
->Mtftp4
;
410 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
412 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
413 if (EFI_ERROR (Status
)) {
418 if (BlockSize
!= NULL
) {
420 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
421 ReqOpt
[0].ValueStr
= OptBuf
;
422 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
, PXE_MTFTP_OPTBUF_MAXNUM_INDEX
);
427 Token
.OverrideData
= NULL
;
428 Token
.Filename
= Filename
;
429 Token
.ModeStr
= NULL
;
430 Token
.OptionCount
= OptCnt
;
431 Token
.OptionList
= ReqOpt
;
432 Token
.Context
= Private
;
435 Token
.BufferSize
= 0;
438 Token
.BufferSize
= *BufferSize
;
439 Token
.Buffer
= BufferPtr
;
442 Token
.CheckPacket
= PxeBcCheckPacket
;
443 Token
.TimeoutCallback
= NULL
;
444 Token
.PacketNeeded
= NULL
;
446 Status
= Mtftp4
->ReadDirectory (Mtftp4
, &Token
);
448 *BufferSize
= Token
.BufferSize
;
450 Mtftp4
->Configure (Mtftp4
, NULL
);