| /** @file | |
| Mtftp6 support functions declaration. | |
| Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR> | |
| This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php. | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #ifndef __EFI_MTFTP6_SUPPORT_H__ | |
| #define __EFI_MTFTP6_SUPPORT_H__ | |
| // | |
| // The structure representing a range of block numbers, [Start, End]. | |
| // It is used to remember the holes in the MTFTP block space. If all | |
| // the holes are filled in, then the download or upload has completed. | |
| // | |
| typedef struct { | |
| LIST_ENTRY Link; | |
| INTN Start; | |
| INTN End; | |
| INTN Round; | |
| INTN Bound; | |
| } MTFTP6_BLOCK_RANGE; | |
| /** | |
| Initialize the block range for either RRQ or WRQ. RRQ and WRQ have | |
| different requirements for Start and End. For example, during startup, | |
| WRQ initializes its whole valid block range to [0, 0xffff]. This | |
| is because the server will send an ACK0 to inform the user to start the | |
| upload. When the client receives an ACK0, it will remove 0 from the range, | |
| get the next block number, which is 1, then upload the BLOCK1. For RRQ | |
| without option negotiation, the server will directly send us the BLOCK1 | |
| in response to the client's RRQ. When BLOCK1 is received, the client will | |
| remove it from the block range and send an ACK. It also works if there | |
| is option negotiation. | |
| @param[in] Head The block range head to initialize. | |
| @param[in] Start The Start block number. | |
| @param[in] End The last block number. | |
| @retval EFI_OUT_OF_RESOURCES Failed to allocate memory for initial block range. | |
| @retval EFI_SUCCESS The initial block range is created. | |
| **/ | |
| EFI_STATUS | |
| Mtftp6InitBlockRange ( | |
| IN LIST_ENTRY *Head, | |
| IN UINT16 Start, | |
| IN UINT16 End | |
| ); | |
| /** | |
| Get the first valid block number on the range list. | |
| @param[in] Head The block range head. | |
| @retval ==-1 If the block range is empty. | |
| @retval >-1 The first valid block number. | |
| **/ | |
| INTN | |
| Mtftp6GetNextBlockNum ( | |
| IN LIST_ENTRY *Head | |
| ); | |
| /** | |
| Set the last block number of the block range list. It | |
| removes all the blocks after the Last. MTFTP initialize the | |
| block range to the maximum possible range, such as [0, 0xffff] | |
| for WRQ. When it gets the last block number, it calls | |
| this function to set the last block number. | |
| @param[in] Head The block range list. | |
| @param[in] Last The last block number. | |
| **/ | |
| VOID | |
| Mtftp6SetLastBlockNum ( | |
| IN LIST_ENTRY *Head, | |
| IN UINT16 Last | |
| ); | |
| /** | |
| Remove the block number from the block range list. | |
| @param[in] Head The block range list to remove from. | |
| @param[in] Num The block number to remove. | |
| @param[in] Completed Whether Num is the last block number | |
| @param[out] TotalBlock The continuous block number in all | |
| @retval EFI_NOT_FOUND The block number isn't in the block range list. | |
| @retval EFI_SUCCESS The block number has been removed from the list. | |
| @retval EFI_OUT_OF_RESOURCES Failed to allocate resources. | |
| **/ | |
| EFI_STATUS | |
| Mtftp6RemoveBlockNum ( | |
| IN LIST_ENTRY *Head, | |
| IN UINT16 Num, | |
| IN BOOLEAN Completed, | |
| OUT UINT64 *TotalBlock | |
| ); | |
| /** | |
| Build and transmit the request packet for the Mtftp6 instance. | |
| @param[in] Instance The pointer to the Mtftp6 instance. | |
| @param[in] Operation The operation code of this packet. | |
| @retval EFI_OUT_OF_RESOURCES Failed to allocate memory for the request. | |
| @retval EFI_SUCCESS The request was built and sent. | |
| @retval Others Failed to transmit the packet. | |
| **/ | |
| EFI_STATUS | |
| Mtftp6SendRequest ( | |
| IN MTFTP6_INSTANCE *Instance, | |
| IN UINT16 Operation | |
| ); | |
| /** | |
| Build and send an error packet. | |
| @param[in] Instance The pointer to the Mtftp6 instance. | |
| @param[in] ErrCode The error code in the packet. | |
| @param[in] ErrInfo The error message in the packet. | |
| @retval EFI_OUT_OF_RESOURCES Failed to allocate memory for the error packet. | |
| @retval EFI_SUCCESS The error packet was transmitted. | |
| @retval Others Failed to transmit the packet. | |
| **/ | |
| EFI_STATUS | |
| Mtftp6SendError ( | |
| IN MTFTP6_INSTANCE *Instance, | |
| IN UINT16 ErrCode, | |
| IN UINT8* ErrInfo | |
| ); | |
| /** | |
| Send the packet for the Mtftp6 instance. | |
| @param[in] Instance The pointer to the Mtftp6 instance. | |
| @param[in] Packet The pointer to the packet to be sent. | |
| @retval EFI_SUCCESS The packet was sent out | |
| @retval Others Failed to transmit the packet. | |
| **/ | |
| EFI_STATUS | |
| Mtftp6TransmitPacket ( | |
| IN MTFTP6_INSTANCE *Instance, | |
| IN NET_BUF *Packet | |
| ); | |
| /** | |
| Check packet for GetInfo callback routine. | |
| @param[in] This The pointer to the Mtftp6 protocol. | |
| @param[in] Token The pointer to the Mtftp6 token. | |
| @param[in] PacketLen The length of the packet | |
| @param[in] Packet The pointer to the received packet. | |
| @retval EFI_SUCCESS The check process passed successfully. | |
| @retval EFI_ABORTED Abort the Mtftp6 operation. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| Mtftp6CheckPacket ( | |
| IN EFI_MTFTP6_PROTOCOL *This, | |
| IN EFI_MTFTP6_TOKEN *Token, | |
| IN UINT16 PacketLen, | |
| IN EFI_MTFTP6_PACKET *Packet | |
| ); | |
| /** | |
| The dummy configure routine for create a new Udp6 Io. | |
| @param[in] UdpIo The pointer to the Udp6 Io. | |
| @param[in] Context The pointer to the context. | |
| @retval EFI_SUCCESS The value is always returned. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| Mtftp6ConfigDummyUdpIo ( | |
| IN UDP_IO *UdpIo, | |
| IN VOID *Context | |
| ); | |
| /** | |
| The configure routine for the Mtftp6 instance to transmit/receive. | |
| @param[in] UdpIo The pointer to the Udp6 Io. | |
| @param[in] ServerIp The pointer to the server address. | |
| @param[in] ServerPort The pointer to the server port. | |
| @param[in] LocalIp The pointer to the local address. | |
| @param[in] LocalPort The pointer to the local port. | |
| @retval EFI_SUCCESS Configure the Udp6 Io for Mtftp6 successfully. | |
| @retval EFI_NO_MAPPING The corresponding Ip6 instance has not been | |
| configured yet. | |
| **/ | |
| EFI_STATUS | |
| Mtftp6ConfigUdpIo ( | |
| IN UDP_IO *UdpIo, | |
| IN EFI_IPv6_ADDRESS *ServerIp, | |
| IN UINT16 ServerPort, | |
| IN EFI_IPv6_ADDRESS *LocalIp, | |
| IN UINT16 LocalPort | |
| ); | |
| /** | |
| Clean up the current Mtftp6 operation. | |
| @param[in] Instance The pointer to the Mtftp6 instance. | |
| @param[in] Result The result to be returned to the user. | |
| **/ | |
| VOID | |
| Mtftp6OperationClean ( | |
| IN MTFTP6_INSTANCE *Instance, | |
| IN EFI_STATUS Result | |
| ); | |
| /** | |
| Start the Mtftp6 instance to perform the operation, such as read file, | |
| write file, and read directory. | |
| @param[in] This The MTFTP session | |
| @param[in] Token The token that encapsulates the user's request. | |
| @param[in] OpCode The operation to perform. | |
| @retval EFI_INVALID_PARAMETER Some of the parameters are invalid. | |
| @retval EFI_NOT_STARTED The MTFTP session hasn't been configured. | |
| @retval EFI_ALREADY_STARTED There is pending operation for the session. | |
| @retval EFI_SUCCESS The operation was successfully started. | |
| **/ | |
| EFI_STATUS | |
| Mtftp6OperationStart ( | |
| IN EFI_MTFTP6_PROTOCOL *This, | |
| IN EFI_MTFTP6_TOKEN *Token, | |
| IN UINT16 OpCode | |
| ); | |
| /** | |
| The timer ticking routine for the Mtftp6 instance. | |
| @param[in] Event The pointer to the ticking event. | |
| @param[in] Context The pointer to the context. | |
| **/ | |
| VOID | |
| EFIAPI | |
| Mtftp6OnTimerTick ( | |
| IN EFI_EVENT Event, | |
| IN VOID *Context | |
| ); | |
| /** | |
| The packet process callback for Mtftp6 upload. | |
| @param[in] UdpPacket The pointer to the packet received. | |
| @param[in] UdpEpt The pointer to the Udp6 access point. | |
| @param[in] IoStatus The status from the Udp6 instance. | |
| @param[in] Context The pointer to the context. | |
| **/ | |
| VOID | |
| EFIAPI | |
| Mtftp6WrqInput ( | |
| IN NET_BUF *UdpPacket, | |
| IN UDP_END_POINT *UdpEpt, | |
| IN EFI_STATUS IoStatus, | |
| IN VOID *Context | |
| ); | |
| /** | |
| Start the Mtftp6 instance to upload. It will first init some states, | |
| then send the WRQ request packet, and start to receive the packet. | |
| @param[in] Instance The pointer to the Mtftp6 instance. | |
| @param[in] Operation The operation code of current packet. | |
| @retval EFI_SUCCESS The Mtftp6 was started to upload. | |
| @retval Others Failed to start to upload. | |
| **/ | |
| EFI_STATUS | |
| Mtftp6WrqStart ( | |
| IN MTFTP6_INSTANCE *Instance, | |
| IN UINT16 Operation | |
| ); | |
| /** | |
| The packet process callback for Mtftp6 download. | |
| @param[in] UdpPacket The pointer to the packet received. | |
| @param[in] UdpEpt The pointer to the Udp6 access point. | |
| @param[in] IoStatus The status from Udp6 instance. | |
| @param[in] Context The pointer to the context. | |
| **/ | |
| VOID | |
| EFIAPI | |
| Mtftp6RrqInput ( | |
| IN NET_BUF *UdpPacket, | |
| IN UDP_END_POINT *UdpEpt, | |
| IN EFI_STATUS IoStatus, | |
| IN VOID *Context | |
| ); | |
| /** | |
| Start the Mtftp6 instance to download. It first initializes some | |
| of the internal states then builds and sends an RRQ reqeuest packet. | |
| Finally, it starts receive for the downloading. | |
| @param[in] Instance The pointer to the Mtftp6 instance. | |
| @param[in] Operation The operation code of current packet. | |
| @retval EFI_SUCCESS The Mtftp6 was started to download. | |
| @retval Others Failed to start to download. | |
| **/ | |
| EFI_STATUS | |
| Mtftp6RrqStart ( | |
| IN MTFTP6_INSTANCE *Instance, | |
| IN UINT16 Operation | |
| ); | |
| #endif |