1/** @file
2  Mtftp6 support functions declaration.
3
4  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
5
6  This program and the accompanying materials
7  are licensed and made available under the terms and conditions of the BSD License
8  which accompanies this distribution.  The full text of the license may be found at
9  http://opensource.org/licenses/bsd-license.php.
10
11  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14**/
15
16#ifndef __EFI_MTFTP6_SUPPORT_H__
17#define __EFI_MTFTP6_SUPPORT_H__
18
19//
20// The structure representing a range of block numbers, [Start, End].
21// It is used to remember the holes in the MTFTP block space. If all
22// the holes are filled in, then the download or upload has completed.
23//
24typedef struct {
25  LIST_ENTRY                Link;
26  INTN                      Start;
27  INTN                      End;
28  INTN                      Round;
29  INTN                      Bound;
30} MTFTP6_BLOCK_RANGE;
31
32
33/**
34  Initialize the block range for either RRQ or WRQ. RRQ and WRQ have
35  different requirements for Start and End. For example, during startup,
36  WRQ initializes its whole valid block range to [0, 0xffff]. This
37  is because the server will send an ACK0 to inform the user to start the
38  upload. When the client receives an ACK0, it will remove 0 from the range,
39  get the next block number, which is 1, then upload the BLOCK1. For RRQ
40  without option negotiation, the server will directly send us the BLOCK1
41  in response to the client's RRQ. When BLOCK1 is received, the client will
42  remove it from the block range and send an ACK. It also works if there
43  is option negotiation.
44
45  @param[in]  Head                   The block range head to initialize.
46  @param[in]  Start                  The Start block number.
47  @param[in]  End                    The last block number.
48
49  @retval EFI_OUT_OF_RESOURCES   Failed to allocate memory for initial block range.
50  @retval EFI_SUCCESS            The initial block range is created.
51
52**/
53EFI_STATUS
54Mtftp6InitBlockRange (
55  IN LIST_ENTRY             *Head,
56  IN UINT16                 Start,
57  IN UINT16                 End
58  );
59
60
61/**
62  Get the first valid block number on the range list.
63
64  @param[in]  Head                   The block range head.
65
66  @retval     ==-1                   If the block range is empty.
67  @retval     >-1                    The first valid block number.
68
69**/
70INTN
71Mtftp6GetNextBlockNum (
72  IN LIST_ENTRY             *Head
73  );
74
75
76/**
77  Set the last block number of the block range list. It
78  removes all the blocks after the Last. MTFTP initialize the
79  block range to the maximum possible range, such as [0, 0xffff]
80  for WRQ. When it gets the last block number, it calls
81  this function to set the last block number.
82
83  @param[in]  Head                   The block range list.
84  @param[in]  Last                   The last block number.
85
86**/
87VOID
88Mtftp6SetLastBlockNum (
89  IN LIST_ENTRY             *Head,
90  IN UINT16                 Last
91  );
92
93
94/**
95  Remove the block number from the block range list.
96
97  @param[in]  Head                   The block range list to remove from.
98  @param[in]  Num                    The block number to remove.
99  @param[in]  Completed              Whether Num is the last block number
100  @param[out] TotalBlock             The continuous block number in all
101
102  @retval EFI_NOT_FOUND          The block number isn't in the block range list.
103  @retval EFI_SUCCESS            The block number has been removed from the list.
104  @retval EFI_OUT_OF_RESOURCES   Failed to allocate resources.
105
106**/
107EFI_STATUS
108Mtftp6RemoveBlockNum (
109  IN LIST_ENTRY             *Head,
110  IN UINT16                 Num,
111  IN BOOLEAN                Completed,
112  OUT UINT64                *TotalBlock
113  );
114
115
116/**
117  Build and transmit the request packet for the Mtftp6 instance.
118
119  @param[in]  Instance               The pointer to the Mtftp6 instance.
120  @param[in]  Operation              The operation code of this packet.
121
122  @retval EFI_OUT_OF_RESOURCES   Failed to allocate memory for the request.
123  @retval EFI_SUCCESS            The request was built and sent.
124  @retval Others                 Failed to transmit the packet.
125
126**/
127EFI_STATUS
128Mtftp6SendRequest (
129  IN MTFTP6_INSTANCE        *Instance,
130  IN UINT16                 Operation
131  );
132
133
134/**
135  Build and send an error packet.
136
137  @param[in]  Instance               The pointer to the Mtftp6 instance.
138  @param[in]  ErrCode                The error code in the packet.
139  @param[in]  ErrInfo                The error message in the packet.
140
141  @retval EFI_OUT_OF_RESOURCES   Failed to allocate memory for the error packet.
142  @retval EFI_SUCCESS            The error packet was transmitted.
143  @retval Others                 Failed to transmit the packet.
144
145**/
146EFI_STATUS
147Mtftp6SendError (
148  IN MTFTP6_INSTANCE        *Instance,
149  IN UINT16                 ErrCode,
150  IN UINT8*                 ErrInfo
151  );
152
153
154/**
155  Send the packet for the Mtftp6 instance.
156
157  @param[in]  Instance               The pointer to the Mtftp6 instance.
158  @param[in]  Packet                 The pointer to the packet to be sent.
159
160  @retval EFI_SUCCESS            The packet was sent out
161  @retval Others                 Failed to transmit the packet.
162
163**/
164EFI_STATUS
165Mtftp6TransmitPacket (
166  IN MTFTP6_INSTANCE        *Instance,
167  IN NET_BUF                *Packet
168  );
169
170
171/**
172  Check packet for GetInfo callback routine.
173
174  @param[in]  This                   The pointer to the Mtftp6 protocol.
175  @param[in]  Token                  The pointer to the Mtftp6 token.
176  @param[in]  PacketLen              The length of the packet
177  @param[in]  Packet                 The pointer to the received packet.
178
179  @retval EFI_SUCCESS            The check process passed successfully.
180  @retval EFI_ABORTED            Abort the Mtftp6 operation.
181
182**/
183EFI_STATUS
184EFIAPI
185Mtftp6CheckPacket (
186  IN EFI_MTFTP6_PROTOCOL    *This,
187  IN EFI_MTFTP6_TOKEN       *Token,
188  IN UINT16                 PacketLen,
189  IN EFI_MTFTP6_PACKET      *Packet
190  );
191
192
193/**
194  The dummy configure routine for create a new Udp6 Io.
195
196  @param[in]  UdpIo                  The pointer to the Udp6 Io.
197  @param[in]  Context                The pointer to the context.
198
199  @retval EFI_SUCCESS                The value is always returned.
200
201**/
202EFI_STATUS
203EFIAPI
204Mtftp6ConfigDummyUdpIo (
205  IN UDP_IO                 *UdpIo,
206  IN VOID                   *Context
207  );
208
209
210/**
211  The configure routine for the Mtftp6 instance to transmit/receive.
212
213  @param[in]  UdpIo                  The pointer to the Udp6 Io.
214  @param[in]  ServerIp               The pointer to the server address.
215  @param[in]  ServerPort             The pointer to the server port.
216  @param[in]  LocalIp                The pointer to the local address.
217  @param[in]  LocalPort              The pointer to the local port.
218
219  @retval EFI_SUCCESS            Configure the Udp6 Io for Mtftp6 successfully.
220  @retval EFI_NO_MAPPING         The corresponding Ip6 instance has not been
221                                 configured yet.
222
223**/
224EFI_STATUS
225Mtftp6ConfigUdpIo (
226  IN UDP_IO                 *UdpIo,
227  IN EFI_IPv6_ADDRESS       *ServerIp,
228  IN UINT16                 ServerPort,
229  IN EFI_IPv6_ADDRESS       *LocalIp,
230  IN UINT16                 LocalPort
231  );
232
233
234/**
235  Clean up the current Mtftp6 operation.
236
237  @param[in]  Instance               The pointer to the Mtftp6 instance.
238  @param[in]  Result                 The result to be returned to the user.
239
240**/
241VOID
242Mtftp6OperationClean (
243  IN MTFTP6_INSTANCE        *Instance,
244  IN EFI_STATUS             Result
245  );
246
247
248/**
249  Start the Mtftp6 instance to perform the operation, such as read file,
250  write file, and read directory.
251
252  @param[in]  This                   The MTFTP session
253  @param[in]  Token                  The token that encapsulates the user's request.
254  @param[in]  OpCode                 The operation to perform.
255
256  @retval EFI_INVALID_PARAMETER  Some of the parameters are invalid.
257  @retval EFI_NOT_STARTED        The MTFTP session hasn't been configured.
258  @retval EFI_ALREADY_STARTED    There is pending operation for the session.
259  @retval EFI_SUCCESS            The operation was successfully started.
260
261**/
262EFI_STATUS
263Mtftp6OperationStart (
264  IN EFI_MTFTP6_PROTOCOL    *This,
265  IN EFI_MTFTP6_TOKEN       *Token,
266  IN UINT16                 OpCode
267  );
268
269
270/**
271  The timer ticking routine for the Mtftp6 instance.
272
273  @param[in]  Event                  The pointer to the ticking event.
274  @param[in]  Context                The pointer to the context.
275
276**/
277VOID
278EFIAPI
279Mtftp6OnTimerTick (
280  IN EFI_EVENT              Event,
281  IN VOID                   *Context
282  );
283
284
285/**
286  The packet process callback for Mtftp6 upload.
287
288  @param[in]  UdpPacket             The pointer to the packet received.
289  @param[in]  UdpEpt                The pointer to the Udp6 access point.
290  @param[in]  IoStatus              The status from the Udp6 instance.
291  @param[in]  Context               The pointer to the context.
292
293**/
294VOID
295EFIAPI
296Mtftp6WrqInput (
297  IN NET_BUF                *UdpPacket,
298  IN UDP_END_POINT          *UdpEpt,
299  IN EFI_STATUS             IoStatus,
300  IN VOID                   *Context
301  );
302
303
304/**
305  Start the Mtftp6 instance to upload. It will first init some states,
306  then send the WRQ request packet, and start to receive the packet.
307
308  @param[in]  Instance              The pointer to the Mtftp6 instance.
309  @param[in]  Operation             The operation code of current packet.
310
311  @retval EFI_SUCCESS           The Mtftp6 was started to upload.
312  @retval Others                Failed to start to upload.
313
314**/
315EFI_STATUS
316Mtftp6WrqStart (
317  IN MTFTP6_INSTANCE        *Instance,
318  IN UINT16                 Operation
319  );
320
321
322/**
323  The packet process callback for Mtftp6 download.
324
325  @param[in]  UdpPacket             The pointer to the packet received.
326  @param[in]  UdpEpt                The pointer to the Udp6 access point.
327  @param[in]  IoStatus              The status from Udp6 instance.
328  @param[in]  Context               The pointer to the context.
329
330**/
331VOID
332EFIAPI
333Mtftp6RrqInput (
334  IN NET_BUF                *UdpPacket,
335  IN UDP_END_POINT          *UdpEpt,
336  IN EFI_STATUS             IoStatus,
337  IN VOID                   *Context
338  );
339
340
341/**
342  Start the Mtftp6 instance to download. It first initializes some
343  of the internal states then builds and sends an RRQ reqeuest packet.
344  Finally, it starts receive for the downloading.
345
346  @param[in]  Instance              The pointer to the Mtftp6 instance.
347  @param[in]  Operation             The operation code of current packet.
348
349  @retval EFI_SUCCESS           The Mtftp6 was started to download.
350  @retval Others                Failed to start to download.
351
352**/
353EFI_STATUS
354Mtftp6RrqStart (
355  IN MTFTP6_INSTANCE        *Instance,
356  IN UINT16                 Operation
357  );
358
359#endif
360