4 Copyright (c) 2007 - 2009, 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 AsciiStrnCpy (Private
->Mode
.TftpError
.ErrorString
, (CHAR8
*) Packet
->Error
.ErrorMessage
, 127);
66 if (Callback
!= NULL
) {
68 Status
= Callback
->Callback (
73 (EFI_PXE_BASE_CODE_PACKET
*) Packet
75 if (Status
!= EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE
) {
89 This function is to get size of a file by Tftp.
91 @param Private Pointer to PxeBc private data
92 @param Config Pointer to Mtftp configuration data
93 @param Filename Pointer to file name
94 @param BlockSize Pointer to block size
95 @param BufferSize Pointer to buffer size
97 @retval EFI_SUCCESS Get the size of file success
98 @retval EFI_NOT_FOUND Parse the tftp ptions failed.
99 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
100 @retval Other Has not get the size of the file.
104 PxeBcTftpGetFileSize (
105 IN PXEBC_PRIVATE_DATA
*Private
,
106 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
109 IN OUT UINT64
*BufferSize
112 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
113 EFI_MTFTP4_OPTION ReqOpt
[2];
114 EFI_MTFTP4_PACKET
*Packet
;
115 EFI_MTFTP4_OPTION
*Option
;
122 Status
= EFI_DEVICE_ERROR
;
123 Mtftp4
= Private
->Mtftp4
;
128 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
130 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
131 if (EFI_ERROR (Status
)) {
136 ReqOpt
[0].OptionStr
= (UINT8
*)mMtftpOptions
[PXE_MTFTP_OPTION_TSIZE_INDEX
];
137 UtoA10 (0, (CHAR8
*) OptBuf
);
138 ReqOpt
[0].ValueStr
= OptBuf
;
140 if (BlockSize
!= NULL
) {
141 ReqOpt
[1].OptionStr
= (UINT8
*)mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
142 ReqOpt
[1].ValueStr
= ReqOpt
[0].ValueStr
+ AsciiStrLen ((CHAR8
*) ReqOpt
[0].ValueStr
) + 1;
143 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[1].ValueStr
);
147 Status
= Mtftp4
->GetInfo (
158 if (EFI_ERROR (Status
)) {
159 if (Status
== EFI_TFTP_ERROR
) {
160 Private
->Mode
.TftpErrorReceived
= TRUE
;
161 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
163 Private
->Mode
.TftpError
.ErrorString
,
164 (CHAR8
*) Packet
->Error
.ErrorMessage
,
173 Status
= Mtftp4
->ParseOptions (
181 if (EFI_ERROR (Status
)) {
186 Status
= EFI_NOT_FOUND
;
188 while (OptCnt
!= 0) {
190 if (AsciiStrnCmp ((CHAR8
*) Option
[OptCnt
- 1].OptionStr
, "tsize", 5) == 0) {
192 *BufferSize
= AtoU64 (Option
[OptCnt
- 1].ValueStr
);
193 Status
= EFI_SUCCESS
;
203 if (Packet
!= NULL
) {
207 Mtftp4
->Configure (Mtftp4
, NULL
);
214 This function is to get data of a file by Tftp.
216 @param Private Pointer to PxeBc private data
217 @param Config Pointer to Mtftp configuration data
218 @param Filename Pointer to file name
219 @param BlockSize Pointer to block size
220 @param BufferPtr Pointer to buffer
221 @param BufferSize Pointer to buffer size
222 @param DontUseBuffer Indicate whether with a receive buffer
224 @retval EFI_SUCCESS Read the data success from the special file.
225 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
226 @retval other Read data from file failed.
231 IN PXEBC_PRIVATE_DATA
*Private
,
232 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
236 IN OUT UINT64
*BufferSize
,
237 IN BOOLEAN DontUseBuffer
240 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
241 EFI_MTFTP4_TOKEN Token
;
242 EFI_MTFTP4_OPTION ReqOpt
[1];
247 Status
= EFI_DEVICE_ERROR
;
248 Mtftp4
= Private
->Mtftp4
;
250 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
252 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
253 if (EFI_ERROR (Status
)) {
258 if (BlockSize
!= NULL
) {
260 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
261 ReqOpt
[0].ValueStr
= OptBuf
;
262 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
);
267 Token
.OverrideData
= NULL
;
268 Token
.Filename
= Filename
;
269 Token
.ModeStr
= NULL
;
270 Token
.OptionCount
= OptCnt
;
271 Token
.OptionList
= ReqOpt
;
272 Token
.Context
= Private
;
275 Token
.BufferSize
= 0;
278 Token
.BufferSize
= *BufferSize
;
279 Token
.Buffer
= BufferPtr
;
282 Token
.CheckPacket
= PxeBcCheckPacket
;
283 Token
.TimeoutCallback
= NULL
;
284 Token
.PacketNeeded
= NULL
;
286 Status
= Mtftp4
->ReadFile (Mtftp4
, &Token
);
288 *BufferSize
= Token
.BufferSize
;
290 Mtftp4
->Configure (Mtftp4
, NULL
);
297 This function is put data of a file by Tftp.
299 @param Private Pointer to PxeBc private data
300 @param Config Pointer to Mtftp configuration data
301 @param Filename Pointer to file name
302 @param Overwrite Indicate whether with overwrite attribute
303 @param BlockSize Pointer to block size
304 @param BufferPtr Pointer to buffer
305 @param BufferSize Pointer to buffer size
307 @retval EFI_SUCCESS Write the data success into the special file.
308 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
309 @retval other Write data into file failed.
314 IN PXEBC_PRIVATE_DATA
*Private
,
315 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
317 IN BOOLEAN Overwrite
,
320 IN OUT UINT64
*BufferSize
323 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
324 EFI_MTFTP4_TOKEN Token
;
325 EFI_MTFTP4_OPTION ReqOpt
[1];
330 Status
= EFI_DEVICE_ERROR
;
331 Mtftp4
= Private
->Mtftp4
;
333 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
335 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
336 if (EFI_ERROR (Status
)) {
341 if (BlockSize
!= NULL
) {
343 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
344 ReqOpt
[0].ValueStr
= OptBuf
;
345 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
);
350 Token
.OverrideData
= NULL
;
351 Token
.Filename
= Filename
;
352 Token
.ModeStr
= NULL
;
353 Token
.OptionCount
= OptCnt
;
354 Token
.OptionList
= ReqOpt
;
355 Token
.BufferSize
= *BufferSize
;
356 Token
.Buffer
= BufferPtr
;
357 Token
.CheckPacket
= PxeBcCheckPacket
;
358 Token
.TimeoutCallback
= NULL
;
359 Token
.PacketNeeded
= NULL
;
361 Status
= Mtftp4
->WriteFile (Mtftp4
, &Token
);
362 *BufferSize
= Token
.BufferSize
;
364 Mtftp4
->Configure (Mtftp4
, NULL
);
371 This function is to get data(file) from a directory(may be a server) by Tftp.
373 @param Private Pointer to PxeBc private data.
374 @param Config Pointer to Mtftp configuration data.
375 @param Filename Pointer to file name.
376 @param BlockSize Pointer to block size.
377 @param BufferPtr Pointer to buffer.
378 @param BufferSize Pointer to buffer size.
379 @param DontUseBuffer Indicate whether with a receive buffer.
381 @retval EFI_SUCCES Get the data from the file included in directory success.
382 @retval EFI_DEVICE_ERROR The network device encountered an error during this operation.
383 @retval other Operation failed.
387 PxeBcTftpReadDirectory (
388 IN PXEBC_PRIVATE_DATA
*Private
,
389 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
393 IN OUT UINT64
*BufferSize
,
394 IN BOOLEAN DontUseBuffer
397 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
398 EFI_MTFTP4_TOKEN Token
;
399 EFI_MTFTP4_OPTION ReqOpt
[1];
404 Status
= EFI_DEVICE_ERROR
;
405 Mtftp4
= Private
->Mtftp4
;
407 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
409 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
410 if (EFI_ERROR (Status
)) {
415 if (BlockSize
!= NULL
) {
417 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
418 ReqOpt
[0].ValueStr
= OptBuf
;
419 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
);
424 Token
.OverrideData
= NULL
;
425 Token
.Filename
= Filename
;
426 Token
.ModeStr
= NULL
;
427 Token
.OptionCount
= OptCnt
;
428 Token
.OptionList
= ReqOpt
;
429 Token
.Context
= Private
;
432 Token
.BufferSize
= 0;
435 Token
.BufferSize
= *BufferSize
;
436 Token
.Buffer
= BufferPtr
;
439 Token
.CheckPacket
= PxeBcCheckPacket
;
440 Token
.TimeoutCallback
= NULL
;
441 Token
.PacketNeeded
= NULL
;
443 Status
= Mtftp4
->ReadDirectory (Mtftp4
, &Token
);
445 *BufferSize
= Token
.BufferSize
;
447 Mtftp4
->Configure (Mtftp4
, NULL
);