]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/UefiPxeBcDxe/PxeBcMtftp.c
Use Mde library and definition instead of some native definitions in NetLib, to simpl...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / UefiPxeBcDxe / PxeBcMtftp.c
CommitLineData
dc361cc5 1/** @file\r
2\r
3Copyright (c) 2007, Intel Corporation\r
4All rights reserved. This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12Module Name:\r
13\r
14 PxeBcMtftp.c\r
15\r
16Abstract:\r
17\r
18 PxeBc MTFTP functions\r
19\r
20\r
21**/\r
22\r
23#include "PxeBcImpl.h"\r
24\r
25VOID *TokenContext = NULL;\r
26\r
27UINT8 *mMtftpOptions[PXE_MTFTP_OPTION_MAXIMUM_INDEX] = {\r
28 "blksize",\r
29 "timeout",\r
30 "tsize",\r
31 "multicast"\r
32};\r
33\r
34\r
35/**\r
36 This is a callback function when packets received/transmitted in Mtftp driver.\r
37\r
38 @param This Pointer to Mtftp protocol instance\r
39 @param Token Pointer to Mtftp token\r
40 @param PacketLen Length of Mtftp packet\r
41 @param Packet Pointer to Mtftp packet\r
42\r
43 @return EFI_SUCCESS\r
44 @return EFI_ABORTED\r
45\r
46**/\r
47EFI_STATUS\r
48PxeBcCheckPacket (\r
49 IN EFI_MTFTP4_PROTOCOL *This,\r
50 IN EFI_MTFTP4_TOKEN *Token,\r
51 IN UINT16 PacketLen,\r
52 IN EFI_MTFTP4_PACKET *Packet\r
53 )\r
54{\r
55 PXEBC_PRIVATE_DATA *Private;\r
56 EFI_PXE_BASE_CODE_CALLBACK_PROTOCOL *Callback;\r
57 EFI_STATUS Status;\r
58\r
59 Private = (PXEBC_PRIVATE_DATA *) TokenContext;\r
60 Callback = Private->PxeBcCallback;\r
61 Status = EFI_SUCCESS;\r
62\r
63 if (Callback != NULL) {\r
64\r
65 Status = Callback->Callback (\r
66 Callback,\r
67 Private->Function,\r
68 TRUE,\r
69 PacketLen,\r
70 (EFI_PXE_BASE_CODE_PACKET *) Packet\r
71 );\r
72 if (Status != EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE) {\r
73\r
74 Status = EFI_ABORTED;\r
75 } else {\r
76\r
77 Status = EFI_SUCCESS;\r
78 }\r
79 }\r
80\r
81 return Status;\r
82}\r
83\r
84\r
85/**\r
86 This function is to get size of a file by Tftp.\r
87\r
88 @param Private Pointer to PxeBc private data\r
89 @param Config Pointer to Mtftp configuration data\r
90 @param Filename Pointer to file name\r
91 @param BlockSize Pointer to block size\r
92 @param BufferSize Pointer to buffer size\r
93\r
94 @return EFI_SUCCESS\r
95 @return EFI_NOT_FOUND\r
96 @return EFI_DEVICE_ERROR\r
97\r
98**/\r
99EFI_STATUS\r
100PxeBcTftpGetFileSize (\r
101 IN PXEBC_PRIVATE_DATA *Private,\r
102 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
103 IN UINT8 *Filename,\r
104 IN UINTN *BlockSize,\r
105 IN OUT UINT64 *BufferSize\r
106 )\r
107{\r
108 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
109 EFI_MTFTP4_OPTION ReqOpt[2];\r
110 EFI_MTFTP4_PACKET *Packet;\r
111 EFI_MTFTP4_OPTION *Option;\r
112 UINT32 PktLen;\r
113 UINT8 OptBuf[128];\r
114 UINT32 OptCnt;\r
115 EFI_STATUS Status;\r
116\r
117 *BufferSize = 0;\r
118 Status = EFI_DEVICE_ERROR;\r
119 Mtftp4 = Private->Mtftp4;\r
120 Packet = NULL;\r
121 Option = NULL;\r
122 PktLen = 0;\r
123 OptCnt = 1;\r
124 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
125\r
126 Status = Mtftp4->Configure (Mtftp4, Config);\r
127 if (EFI_ERROR (Status)) {\r
128\r
129 return Status;\r
130 }\r
131\r
132 ReqOpt[0].OptionStr = mMtftpOptions[PXE_MTFTP_OPTION_TSIZE_INDEX];\r
133 UtoA10 (0, (CHAR8 *) OptBuf);\r
134 ReqOpt[0].ValueStr = OptBuf;\r
135\r
136 if (BlockSize != NULL) {\r
137 ReqOpt[1].OptionStr = mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
138 ReqOpt[1].ValueStr = ReqOpt[0].ValueStr + AsciiStrLen ((CHAR8 *) ReqOpt[0].ValueStr) + 1;\r
139 UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[1].ValueStr);\r
140 OptCnt++;\r
141 }\r
142\r
143 Status = Mtftp4->GetInfo (\r
144 Mtftp4,\r
145 FALSE,\r
146 Filename,\r
147 NULL,\r
148 (UINT8) OptCnt,\r
149 ReqOpt,\r
150 &PktLen,\r
151 &Packet\r
152 );\r
153\r
154 if (EFI_ERROR (Status)) {\r
155\r
156 goto ON_ERROR;\r
157 }\r
158\r
159 OptCnt = 0;\r
160\r
161 Status = Mtftp4->ParseOptions (\r
162 Mtftp4,\r
163 PktLen,\r
164 Packet,\r
165 (UINT32 *) &OptCnt,\r
166 &Option\r
167 );\r
168\r
169 if (EFI_ERROR (Status)) {\r
170\r
171 goto ON_ERROR;\r
172 }\r
173\r
174 Status = EFI_NOT_FOUND;\r
175\r
176 while (OptCnt != 0) {\r
177\r
178 if (AsciiStrnCmp ((CHAR8 *) Option[OptCnt - 1].OptionStr, "tsize", 5) == 0) {\r
179\r
180 *BufferSize = AtoU64 (Option[OptCnt - 1].ValueStr);\r
181 Status = EFI_SUCCESS;\r
182 }\r
183\r
184 OptCnt--;\r
185 }\r
186\r
e48e37fc 187 gBS->FreePool (Option);\r
dc361cc5 188\r
189ON_ERROR:\r
190\r
191 if (Packet != NULL) {\r
e48e37fc 192 gBS->FreePool (Packet);\r
dc361cc5 193 }\r
194\r
195 Mtftp4->Configure (Mtftp4, NULL);\r
196\r
197 return Status;\r
198}\r
199\r
200\r
201/**\r
202 This function is to get data of a file by Tftp.\r
203\r
204 @param Private Pointer to PxeBc private data\r
205 @param Config Pointer to Mtftp configuration data\r
206 @param Filename Pointer to file name\r
207 @param BlockSize Pointer to block size\r
208 @param BufferPtr Pointer to buffer\r
209 @param BufferSize Pointer to buffer size\r
210 @param DontUseBuffer Indicate whether with a receive buffer\r
211\r
212 @return EFI_SUCCESS\r
213 @return EFI_DEVICE_ERROR\r
214\r
215**/\r
216EFI_STATUS\r
217PxeBcTftpReadFile (\r
218 IN PXEBC_PRIVATE_DATA *Private,\r
219 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
220 IN UINT8 *Filename,\r
221 IN UINTN *BlockSize,\r
222 IN UINT8 *BufferPtr,\r
223 IN OUT UINT64 *BufferSize,\r
224 IN BOOLEAN DontUseBuffer\r
225 )\r
226{\r
227 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
228 EFI_MTFTP4_TOKEN Token;\r
229 EFI_MTFTP4_OPTION ReqOpt[1];\r
230 UINT32 OptCnt;\r
231 UINT8 OptBuf[128];\r
232 EFI_STATUS Status;\r
233\r
234 Status = EFI_DEVICE_ERROR;\r
235 Mtftp4 = Private->Mtftp4;\r
236 OptCnt = 0;\r
237 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
238\r
239 Status = Mtftp4->Configure (Mtftp4, Config);\r
240 if (EFI_ERROR (Status)) {\r
241\r
242 return Status;\r
243 }\r
244\r
245 if (BlockSize != NULL) {\r
246\r
247 ReqOpt[0].OptionStr = mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
248 ReqOpt[0].ValueStr = OptBuf;\r
249 UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr);\r
250 OptCnt++;\r
251 }\r
252\r
253 Token.Event = NULL;\r
254 Token.OverrideData = NULL;\r
255 Token.Filename = Filename;\r
256 Token.ModeStr = NULL;\r
257 Token.OptionCount = OptCnt;\r
258 Token.OptionList = ReqOpt;\r
259 TokenContext = Private;\r
260\r
261 if (DontUseBuffer) {\r
262 Token.BufferSize = 0;\r
263 Token.Buffer = NULL;\r
264 } else {\r
265 Token.BufferSize = *BufferSize;\r
266 Token.Buffer = BufferPtr;\r
267 }\r
268\r
269 Token.CheckPacket = PxeBcCheckPacket;\r
270 Token.TimeoutCallback = NULL;\r
271 Token.PacketNeeded = NULL;\r
272\r
273 Status = Mtftp4->ReadFile (Mtftp4, &Token);\r
274\r
275 *BufferSize = Token.BufferSize;\r
276\r
277 Mtftp4->Configure (Mtftp4, NULL);\r
278\r
279 return Status;\r
280}\r
281\r
282\r
283/**\r
284 This function is put data of a file by Tftp.\r
285\r
286 @param Private Pointer to PxeBc private data\r
287 @param Config Pointer to Mtftp configuration data\r
288 @param Filename Pointer to file name\r
289 @param Overwrite Indicate whether with overwrite attribute\r
290 @param BlockSize Pointer to block size\r
291 @param BufferPtr Pointer to buffer\r
292 @param BufferSize Pointer to buffer size\r
293\r
294 @return EFI_SUCCESS\r
295 @return EFI_DEVICE_ERROR\r
296\r
297**/\r
298EFI_STATUS\r
299PxeBcTftpWriteFile (\r
300 IN PXEBC_PRIVATE_DATA *Private,\r
301 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
302 IN UINT8 *Filename,\r
303 IN BOOLEAN Overwrite,\r
304 IN UINTN *BlockSize,\r
305 IN UINT8 *BufferPtr,\r
306 IN OUT UINT64 *BufferSize\r
307 )\r
308{\r
309 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
310 EFI_MTFTP4_TOKEN Token;\r
311 EFI_MTFTP4_OPTION ReqOpt[1];\r
312 UINT32 OptCnt;\r
313 UINT8 OptBuf[128];\r
314 EFI_STATUS Status;\r
315\r
316 Status = EFI_DEVICE_ERROR;\r
317 Mtftp4 = Private->Mtftp4;\r
318 OptCnt = 0;\r
319 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
320\r
321 Status = Mtftp4->Configure (Mtftp4, Config);\r
322 if (EFI_ERROR (Status)) {\r
323\r
324 return Status;\r
325 }\r
326\r
327 if (BlockSize != NULL) {\r
328\r
329 ReqOpt[0].OptionStr = mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
330 ReqOpt[0].ValueStr = OptBuf;\r
331 UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr);\r
332 OptCnt++;\r
333 }\r
334\r
335 Token.Event = NULL;\r
336 Token.OverrideData = NULL;\r
337 Token.Filename = Filename;\r
338 Token.ModeStr = NULL;\r
339 Token.OptionCount = OptCnt;\r
340 Token.OptionList = ReqOpt;\r
341 Token.BufferSize = *BufferSize;\r
342 Token.Buffer = BufferPtr;\r
343 Token.CheckPacket = PxeBcCheckPacket;\r
344 Token.TimeoutCallback = NULL;\r
345 Token.PacketNeeded = NULL;\r
346\r
347 Status = Mtftp4->WriteFile (Mtftp4, &Token);\r
348 *BufferSize = Token.BufferSize;\r
349\r
350 Mtftp4->Configure (Mtftp4, NULL);\r
351\r
352 return Status;\r
353}\r
354\r
355\r
356/**\r
357 This function is to get data of a directory by Tftp.\r
358\r
359 @param Private Pointer to PxeBc private data\r
360 @param Config Pointer to Mtftp configuration data\r
361 @param Filename Pointer to file name\r
362 @param BlockSize Pointer to block size\r
363 @param BufferPtr Pointer to buffer\r
364 @param BufferSize Pointer to buffer size\r
365 @param DontUseBuffer Indicate whether with a receive buffer\r
366\r
367 @return EFI_SUCCES\r
368 @return EFI_DEVICE_ERROR\r
369\r
370**/\r
371// GC_NOTO: EFI_SUCCESS - add return value to function comment\r
372EFI_STATUS\r
373PxeBcTftpReadDirectory (\r
374 IN PXEBC_PRIVATE_DATA *Private,\r
375 IN EFI_MTFTP4_CONFIG_DATA *Config,\r
376 IN UINT8 *Filename,\r
377 IN UINTN *BlockSize,\r
378 IN UINT8 *BufferPtr,\r
379 IN OUT UINT64 *BufferSize,\r
380 IN BOOLEAN DontUseBuffer\r
381 )\r
382{\r
383 EFI_MTFTP4_PROTOCOL *Mtftp4;\r
384 EFI_MTFTP4_TOKEN Token;\r
385 EFI_MTFTP4_OPTION ReqOpt[1];\r
386 UINT32 OptCnt;\r
387 UINT8 OptBuf[128];\r
388 EFI_STATUS Status;\r
389\r
390 Status = EFI_DEVICE_ERROR;\r
391 Mtftp4 = Private->Mtftp4;\r
392 OptCnt = 0;\r
393 Config->InitialServerPort = PXEBC_BS_DOWNLOAD_PORT;\r
394\r
395 Status = Mtftp4->Configure (Mtftp4, Config);\r
396 if (EFI_ERROR (Status)) {\r
397\r
398 return Status;\r
399 }\r
400\r
401 if (BlockSize != NULL) {\r
402\r
403 ReqOpt[0].OptionStr = mMtftpOptions[PXE_MTFTP_OPTION_BLKSIZE_INDEX];\r
404 ReqOpt[0].ValueStr = OptBuf;\r
405 UtoA10 (*BlockSize, (CHAR8 *) ReqOpt[0].ValueStr);\r
406 OptCnt++;\r
407 }\r
408\r
409 Token.Event = NULL;\r
410 Token.OverrideData = NULL;\r
411 Token.Filename = Filename;\r
412 Token.ModeStr = NULL;\r
413 Token.OptionCount = OptCnt;\r
414 Token.OptionList = ReqOpt;\r
415 TokenContext = Private;\r
416\r
417 if (DontUseBuffer) {\r
418 Token.BufferSize = 0;\r
419 Token.Buffer = NULL;\r
420 } else {\r
421 Token.BufferSize = *BufferSize;\r
422 Token.Buffer = BufferPtr;\r
423 }\r
424\r
425 Token.CheckPacket = PxeBcCheckPacket;\r
426 Token.TimeoutCallback = NULL;\r
427 Token.PacketNeeded = NULL;\r
428\r
429 Status = Mtftp4->ReadDirectory (Mtftp4, &Token);\r
430\r
431 *BufferSize = Token.BufferSize;\r
432\r
433 Mtftp4->Configure (Mtftp4, NULL);\r
434\r
435 return Status;\r
436}\r
437\r