3 Copyright (c) 2007, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
23 #include "PxeBcImpl.h"
25 VOID
*TokenContext
= NULL
;
27 CHAR8
*mMtftpOptions
[PXE_MTFTP_OPTION_MAXIMUM_INDEX
] = {
36 This is a callback function when packets received/transmitted in Mtftp driver.
38 @param This Pointer to Mtftp protocol instance
39 @param Token Pointer to Mtftp token
40 @param PacketLen Length of Mtftp packet
41 @param Packet Pointer to Mtftp packet
49 IN EFI_MTFTP4_PROTOCOL
*This
,
50 IN EFI_MTFTP4_TOKEN
*Token
,
52 IN EFI_MTFTP4_PACKET
*Packet
55 PXEBC_PRIVATE_DATA
*Private
;
56 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL
*Callback
;
59 Private
= (PXEBC_PRIVATE_DATA
*) TokenContext
;
60 Callback
= Private
->PxeBcCallback
;
63 if (Packet
->OpCode
== EFI_MTFTP4_OPCODE_ERROR
) {
64 Private
->Mode
.TftpErrorReceived
= TRUE
;
65 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
66 AsciiStrnCpy (Private
->Mode
.TftpError
.ErrorString
, (CHAR8
*) Packet
->Error
.ErrorMessage
, 127);
69 if (Callback
!= NULL
) {
71 Status
= Callback
->Callback (
76 (EFI_PXE_BASE_CODE_PACKET
*) Packet
78 if (Status
!= EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE
) {
92 This function is to get size of a file by Tftp.
94 @param Private Pointer to PxeBc private data
95 @param Config Pointer to Mtftp configuration data
96 @param Filename Pointer to file name
97 @param BlockSize Pointer to block size
98 @param BufferSize Pointer to buffer size
101 @return EFI_NOT_FOUND
102 @return EFI_DEVICE_ERROR
106 PxeBcTftpGetFileSize (
107 IN PXEBC_PRIVATE_DATA
*Private
,
108 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
111 IN OUT UINT64
*BufferSize
114 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
115 EFI_MTFTP4_OPTION ReqOpt
[2];
116 EFI_MTFTP4_PACKET
*Packet
;
117 EFI_MTFTP4_OPTION
*Option
;
124 Status
= EFI_DEVICE_ERROR
;
125 Mtftp4
= Private
->Mtftp4
;
130 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
132 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
133 if (EFI_ERROR (Status
)) {
138 ReqOpt
[0].OptionStr
= (UINT8
*)mMtftpOptions
[PXE_MTFTP_OPTION_TSIZE_INDEX
];
139 UtoA10 (0, (CHAR8
*) OptBuf
);
140 ReqOpt
[0].ValueStr
= OptBuf
;
142 if (BlockSize
!= NULL
) {
143 ReqOpt
[1].OptionStr
= (UINT8
*)mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
144 ReqOpt
[1].ValueStr
= ReqOpt
[0].ValueStr
+ AsciiStrLen ((CHAR8
*) ReqOpt
[0].ValueStr
) + 1;
145 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[1].ValueStr
);
149 Status
= Mtftp4
->GetInfo (
160 if (EFI_ERROR (Status
)) {
161 if (Packet
->OpCode
== EFI_MTFTP4_OPCODE_ERROR
) {
162 Private
->Mode
.TftpErrorReceived
= TRUE
;
163 Private
->Mode
.TftpError
.ErrorCode
= (UINT8
) Packet
->Error
.ErrorCode
;
164 AsciiStrnCpy (Private
->Mode
.TftpError
.ErrorString
, (CHAR8
*) Packet
->Error
.ErrorMessage
, 127);
171 Status
= Mtftp4
->ParseOptions (
179 if (EFI_ERROR (Status
)) {
184 Status
= EFI_NOT_FOUND
;
186 while (OptCnt
!= 0) {
188 if (AsciiStrnCmp ((CHAR8
*) Option
[OptCnt
- 1].OptionStr
, "tsize", 5) == 0) {
190 *BufferSize
= AtoU64 (Option
[OptCnt
- 1].ValueStr
);
191 Status
= EFI_SUCCESS
;
197 gBS
->FreePool (Option
);
201 if (Packet
!= NULL
) {
202 gBS
->FreePool (Packet
);
205 Mtftp4
->Configure (Mtftp4
, NULL
);
212 This function is to get data of a file by Tftp.
214 @param Private Pointer to PxeBc private data
215 @param Config Pointer to Mtftp configuration data
216 @param Filename Pointer to file name
217 @param BlockSize Pointer to block size
218 @param BufferPtr Pointer to buffer
219 @param BufferSize Pointer to buffer size
220 @param DontUseBuffer Indicate whether with a receive buffer
223 @return EFI_DEVICE_ERROR
228 IN PXEBC_PRIVATE_DATA
*Private
,
229 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
233 IN OUT UINT64
*BufferSize
,
234 IN BOOLEAN DontUseBuffer
237 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
238 EFI_MTFTP4_TOKEN Token
;
239 EFI_MTFTP4_OPTION ReqOpt
[1];
244 Status
= EFI_DEVICE_ERROR
;
245 Mtftp4
= Private
->Mtftp4
;
247 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
249 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
250 if (EFI_ERROR (Status
)) {
255 if (BlockSize
!= NULL
) {
257 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
258 ReqOpt
[0].ValueStr
= OptBuf
;
259 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
);
264 Token
.OverrideData
= NULL
;
265 Token
.Filename
= Filename
;
266 Token
.ModeStr
= NULL
;
267 Token
.OptionCount
= OptCnt
;
268 Token
.OptionList
= ReqOpt
;
269 TokenContext
= Private
;
272 Token
.BufferSize
= 0;
275 Token
.BufferSize
= *BufferSize
;
276 Token
.Buffer
= BufferPtr
;
279 Token
.CheckPacket
= PxeBcCheckPacket
;
280 Token
.TimeoutCallback
= NULL
;
281 Token
.PacketNeeded
= NULL
;
283 Status
= Mtftp4
->ReadFile (Mtftp4
, &Token
);
285 *BufferSize
= Token
.BufferSize
;
287 Mtftp4
->Configure (Mtftp4
, NULL
);
294 This function is put data of a file by Tftp.
296 @param Private Pointer to PxeBc private data
297 @param Config Pointer to Mtftp configuration data
298 @param Filename Pointer to file name
299 @param Overwrite Indicate whether with overwrite attribute
300 @param BlockSize Pointer to block size
301 @param BufferPtr Pointer to buffer
302 @param BufferSize Pointer to buffer size
305 @return EFI_DEVICE_ERROR
310 IN PXEBC_PRIVATE_DATA
*Private
,
311 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
313 IN BOOLEAN Overwrite
,
316 IN OUT UINT64
*BufferSize
319 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
320 EFI_MTFTP4_TOKEN Token
;
321 EFI_MTFTP4_OPTION ReqOpt
[1];
326 Status
= EFI_DEVICE_ERROR
;
327 Mtftp4
= Private
->Mtftp4
;
329 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
331 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
332 if (EFI_ERROR (Status
)) {
337 if (BlockSize
!= NULL
) {
339 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
340 ReqOpt
[0].ValueStr
= OptBuf
;
341 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
);
346 Token
.OverrideData
= NULL
;
347 Token
.Filename
= Filename
;
348 Token
.ModeStr
= NULL
;
349 Token
.OptionCount
= OptCnt
;
350 Token
.OptionList
= ReqOpt
;
351 Token
.BufferSize
= *BufferSize
;
352 Token
.Buffer
= BufferPtr
;
353 Token
.CheckPacket
= PxeBcCheckPacket
;
354 Token
.TimeoutCallback
= NULL
;
355 Token
.PacketNeeded
= NULL
;
357 Status
= Mtftp4
->WriteFile (Mtftp4
, &Token
);
358 *BufferSize
= Token
.BufferSize
;
360 Mtftp4
->Configure (Mtftp4
, NULL
);
367 This function is to get data of a directory by Tftp.
369 @param Private Pointer to PxeBc private data
370 @param Config Pointer to Mtftp configuration data
371 @param Filename Pointer to file name
372 @param BlockSize Pointer to block size
373 @param BufferPtr Pointer to buffer
374 @param BufferSize Pointer to buffer size
375 @param DontUseBuffer Indicate whether with a receive buffer
378 @return EFI_DEVICE_ERROR
381 // GC_NOTO: EFI_SUCCESS - add return value to function comment
383 PxeBcTftpReadDirectory (
384 IN PXEBC_PRIVATE_DATA
*Private
,
385 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
389 IN OUT UINT64
*BufferSize
,
390 IN BOOLEAN DontUseBuffer
393 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
394 EFI_MTFTP4_TOKEN Token
;
395 EFI_MTFTP4_OPTION ReqOpt
[1];
400 Status
= EFI_DEVICE_ERROR
;
401 Mtftp4
= Private
->Mtftp4
;
403 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
405 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
406 if (EFI_ERROR (Status
)) {
411 if (BlockSize
!= NULL
) {
413 ReqOpt
[0].OptionStr
= (UINT8
*) mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
414 ReqOpt
[0].ValueStr
= OptBuf
;
415 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
);
420 Token
.OverrideData
= NULL
;
421 Token
.Filename
= Filename
;
422 Token
.ModeStr
= NULL
;
423 Token
.OptionCount
= OptCnt
;
424 Token
.OptionList
= ReqOpt
;
425 TokenContext
= Private
;
428 Token
.BufferSize
= 0;
431 Token
.BufferSize
= *BufferSize
;
432 Token
.Buffer
= BufferPtr
;
435 Token
.CheckPacket
= PxeBcCheckPacket
;
436 Token
.TimeoutCallback
= NULL
;
437 Token
.PacketNeeded
= NULL
;
439 Status
= Mtftp4
->ReadDirectory (Mtftp4
, &Token
);
441 *BufferSize
= Token
.BufferSize
;
443 Mtftp4
->Configure (Mtftp4
, NULL
);