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 (Callback
!= NULL
) {
65 Status
= Callback
->Callback (
70 (EFI_PXE_BASE_CODE_PACKET
*) Packet
72 if (Status
!= EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE
) {
86 This function is to get size of a file by Tftp.
88 @param Private Pointer to PxeBc private data
89 @param Config Pointer to Mtftp configuration data
90 @param Filename Pointer to file name
91 @param BlockSize Pointer to block size
92 @param BufferSize Pointer to buffer size
96 @return EFI_DEVICE_ERROR
100 PxeBcTftpGetFileSize (
101 IN PXEBC_PRIVATE_DATA
*Private
,
102 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
105 IN OUT UINT64
*BufferSize
108 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
109 EFI_MTFTP4_OPTION ReqOpt
[2];
110 EFI_MTFTP4_PACKET
*Packet
;
111 EFI_MTFTP4_OPTION
*Option
;
118 Status
= EFI_DEVICE_ERROR
;
119 Mtftp4
= Private
->Mtftp4
;
124 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
126 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
127 if (EFI_ERROR (Status
)) {
132 ReqOpt
[0].OptionStr
= (UINT8
*)mMtftpOptions
[PXE_MTFTP_OPTION_TSIZE_INDEX
];
133 UtoA10 (0, (CHAR8
*) OptBuf
);
134 ReqOpt
[0].ValueStr
= OptBuf
;
136 if (BlockSize
!= NULL
) {
137 ReqOpt
[1].OptionStr
= (UINT8
*)mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
138 ReqOpt
[1].ValueStr
= ReqOpt
[0].ValueStr
+ AsciiStrLen ((CHAR8
*) ReqOpt
[0].ValueStr
) + 1;
139 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[1].ValueStr
);
143 Status
= Mtftp4
->GetInfo (
154 if (EFI_ERROR (Status
)) {
161 Status
= Mtftp4
->ParseOptions (
169 if (EFI_ERROR (Status
)) {
174 Status
= EFI_NOT_FOUND
;
176 while (OptCnt
!= 0) {
178 if (AsciiStrnCmp ((CHAR8
*) Option
[OptCnt
- 1].OptionStr
, "tsize", 5) == 0) {
180 *BufferSize
= AtoU64 (Option
[OptCnt
- 1].ValueStr
);
181 Status
= EFI_SUCCESS
;
187 gBS
->FreePool (Option
);
191 if (Packet
!= NULL
) {
192 gBS
->FreePool (Packet
);
195 Mtftp4
->Configure (Mtftp4
, NULL
);
202 This function is to get data of a file by Tftp.
204 @param Private Pointer to PxeBc private data
205 @param Config Pointer to Mtftp configuration data
206 @param Filename Pointer to file name
207 @param BlockSize Pointer to block size
208 @param BufferPtr Pointer to buffer
209 @param BufferSize Pointer to buffer size
210 @param DontUseBuffer Indicate whether with a receive buffer
213 @return EFI_DEVICE_ERROR
218 IN PXEBC_PRIVATE_DATA
*Private
,
219 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
223 IN OUT UINT64
*BufferSize
,
224 IN BOOLEAN DontUseBuffer
227 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
228 EFI_MTFTP4_TOKEN Token
;
229 EFI_MTFTP4_OPTION ReqOpt
[1];
234 Status
= EFI_DEVICE_ERROR
;
235 Mtftp4
= Private
->Mtftp4
;
237 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
239 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
240 if (EFI_ERROR (Status
)) {
245 if (BlockSize
!= NULL
) {
247 ReqOpt
[0].OptionStr
= (UINT8
*)mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
248 ReqOpt
[0].ValueStr
= OptBuf
;
249 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
);
254 Token
.OverrideData
= NULL
;
255 Token
.Filename
= Filename
;
256 Token
.ModeStr
= NULL
;
257 Token
.OptionCount
= OptCnt
;
258 Token
.OptionList
= ReqOpt
;
259 TokenContext
= Private
;
262 Token
.BufferSize
= 0;
265 Token
.BufferSize
= *BufferSize
;
266 Token
.Buffer
= BufferPtr
;
269 Token
.CheckPacket
= PxeBcCheckPacket
;
270 Token
.TimeoutCallback
= NULL
;
271 Token
.PacketNeeded
= NULL
;
273 Status
= Mtftp4
->ReadFile (Mtftp4
, &Token
);
275 *BufferSize
= Token
.BufferSize
;
277 Mtftp4
->Configure (Mtftp4
, NULL
);
284 This function is put data of a file by Tftp.
286 @param Private Pointer to PxeBc private data
287 @param Config Pointer to Mtftp configuration data
288 @param Filename Pointer to file name
289 @param Overwrite Indicate whether with overwrite attribute
290 @param BlockSize Pointer to block size
291 @param BufferPtr Pointer to buffer
292 @param BufferSize Pointer to buffer size
295 @return EFI_DEVICE_ERROR
300 IN PXEBC_PRIVATE_DATA
*Private
,
301 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
303 IN BOOLEAN Overwrite
,
306 IN OUT UINT64
*BufferSize
309 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
310 EFI_MTFTP4_TOKEN Token
;
311 EFI_MTFTP4_OPTION ReqOpt
[1];
316 Status
= EFI_DEVICE_ERROR
;
317 Mtftp4
= Private
->Mtftp4
;
319 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
321 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
322 if (EFI_ERROR (Status
)) {
327 if (BlockSize
!= NULL
) {
329 ReqOpt
[0].OptionStr
= (UINT8
*)mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
330 ReqOpt
[0].ValueStr
= OptBuf
;
331 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
);
336 Token
.OverrideData
= NULL
;
337 Token
.Filename
= Filename
;
338 Token
.ModeStr
= NULL
;
339 Token
.OptionCount
= OptCnt
;
340 Token
.OptionList
= ReqOpt
;
341 Token
.BufferSize
= *BufferSize
;
342 Token
.Buffer
= BufferPtr
;
343 Token
.CheckPacket
= PxeBcCheckPacket
;
344 Token
.TimeoutCallback
= NULL
;
345 Token
.PacketNeeded
= NULL
;
347 Status
= Mtftp4
->WriteFile (Mtftp4
, &Token
);
348 *BufferSize
= Token
.BufferSize
;
350 Mtftp4
->Configure (Mtftp4
, NULL
);
357 This function is to get data of a directory by Tftp.
359 @param Private Pointer to PxeBc private data
360 @param Config Pointer to Mtftp configuration data
361 @param Filename Pointer to file name
362 @param BlockSize Pointer to block size
363 @param BufferPtr Pointer to buffer
364 @param BufferSize Pointer to buffer size
365 @param DontUseBuffer Indicate whether with a receive buffer
368 @return EFI_DEVICE_ERROR
371 // GC_NOTO: EFI_SUCCESS - add return value to function comment
373 PxeBcTftpReadDirectory (
374 IN PXEBC_PRIVATE_DATA
*Private
,
375 IN EFI_MTFTP4_CONFIG_DATA
*Config
,
379 IN OUT UINT64
*BufferSize
,
380 IN BOOLEAN DontUseBuffer
383 EFI_MTFTP4_PROTOCOL
*Mtftp4
;
384 EFI_MTFTP4_TOKEN Token
;
385 EFI_MTFTP4_OPTION ReqOpt
[1];
390 Status
= EFI_DEVICE_ERROR
;
391 Mtftp4
= Private
->Mtftp4
;
393 Config
->InitialServerPort
= PXEBC_BS_DOWNLOAD_PORT
;
395 Status
= Mtftp4
->Configure (Mtftp4
, Config
);
396 if (EFI_ERROR (Status
)) {
401 if (BlockSize
!= NULL
) {
403 ReqOpt
[0].OptionStr
= (UINT8
*)mMtftpOptions
[PXE_MTFTP_OPTION_BLKSIZE_INDEX
];
404 ReqOpt
[0].ValueStr
= OptBuf
;
405 UtoA10 (*BlockSize
, (CHAR8
*) ReqOpt
[0].ValueStr
);
410 Token
.OverrideData
= NULL
;
411 Token
.Filename
= Filename
;
412 Token
.ModeStr
= NULL
;
413 Token
.OptionCount
= OptCnt
;
414 Token
.OptionList
= ReqOpt
;
415 TokenContext
= Private
;
418 Token
.BufferSize
= 0;
421 Token
.BufferSize
= *BufferSize
;
422 Token
.Buffer
= BufferPtr
;
425 Token
.CheckPacket
= PxeBcCheckPacket
;
426 Token
.TimeoutCallback
= NULL
;
427 Token
.PacketNeeded
= NULL
;
429 Status
= Mtftp4
->ReadDirectory (Mtftp4
, &Token
);
431 *BufferSize
= Token
.BufferSize
;
433 Mtftp4
->Configure (Mtftp4
, NULL
);