git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10619 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			204 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Support routines for MTFTP.
 | |
|   
 | |
| Copyright (c) 2006 - 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<BR>
 | |
| 
 | |
| 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_MTFTP4_SUPPORT_H__
 | |
| #define __EFI_MTFTP4_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;
 | |
| } MTFTP4_BLOCK_RANGE;
 | |
| 
 | |
| 
 | |
| /**
 | |
|   Initialize the block range for either RRQ or WRQ. 
 | |
|   
 | |
|   RRQ and WRQ have different requirements for Start and End. 
 | |
|   For example, during start up, WRQ initializes its whole valid block range 
 | |
|   to [0, 0xffff]. This is bacause the server will send us a ACK0 to inform us 
 | |
|   to start the upload. When the client received 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 received BLOCK1, the client will remove 
 | |
|   it from the block range and send an ACK. It also works if there is option 
 | |
|   negotiation.
 | |
| 
 | |
|   @param  Head                  The block range head to initialize
 | |
|   @param  Start                 The Start block number.
 | |
|   @param  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
 | |
| Mtftp4InitBlockRange (
 | |
|   IN LIST_ENTRY             *Head,
 | |
|   IN UINT16                 Start,
 | |
|   IN UINT16                 End
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Get the first valid block number on the range list.
 | |
| 
 | |
|   @param  Head                  The block range head
 | |
| 
 | |
|   @return The first valid block number, -1 if the block range is empty. 
 | |
| 
 | |
| **/
 | |
| INTN
 | |
| Mtftp4GetNextBlockNum (
 | |
|   IN LIST_ENTRY             *Head
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Set the last block number of the block range list. 
 | |
|   
 | |
|   It will remove 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 will call this function to set the last block number.
 | |
| 
 | |
|   @param  Head                  The block range list
 | |
|   @param  Last                  The last block number
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| Mtftp4SetLastBlockNum (
 | |
|   IN LIST_ENTRY             *Head,
 | |
|   IN UINT16                 Last
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Remove the block number from the block range list.
 | |
| 
 | |
|   @param  Head                  The block range list to remove from
 | |
|   @param  Num                   The block number to remove
 | |
|   @param  Completed             Wether Num is the last block number
 | |
|   @param  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 resource
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| Mtftp4RemoveBlockNum (
 | |
|   IN LIST_ENTRY             *Head,
 | |
|   IN UINT16                 Num,
 | |
|   IN BOOLEAN                Completed,
 | |
|   OUT UINT64                *TotalBlock
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Set the timeout for the instance. User a longer time for passive instances.
 | |
| 
 | |
|   @param  Instance              The Mtftp session to set time out
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| Mtftp4SetTimeout (
 | |
|   IN OUT MTFTP4_PROTOCOL        *Instance
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Send the packet for the instance. 
 | |
|   
 | |
|   It will first save a reference to the packet for later retransmission. 
 | |
|   Then determine the destination port, listen port for requests, and connected 
 | |
|   port for others. At last, send the packet out.
 | |
| 
 | |
|   @param  Instance              The Mtftp instance
 | |
|   @param  Packet                The packet to send
 | |
| 
 | |
|   @retval EFI_SUCCESS           The packet is sent out
 | |
|   @retval Others                Failed to transmit the packet.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| Mtftp4SendPacket (
 | |
|   IN OUT MTFTP4_PROTOCOL        *Instance,
 | |
|   IN OUT NET_BUF                *Packet
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Build then transmit the request packet for the MTFTP session.
 | |
| 
 | |
|   @param  Instance              The Mtftp session
 | |
| 
 | |
|   @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory for the request
 | |
|   @retval EFI_SUCCESS           The request is built and sent
 | |
|   @retval Others                Failed to transmit the packet.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| Mtftp4SendRequest (
 | |
|   IN MTFTP4_PROTOCOL        *Instance
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Build then send an error message.
 | |
| 
 | |
|   @param  Instance              The MTFTP session
 | |
|   @param  ErrCode               The error code  
 | |
|   @param  ErrInfo               The error message
 | |
| 
 | |
|   @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory for the error packet
 | |
|   @retval EFI_SUCCESS           The error packet is transmitted.
 | |
|   @retval Others                Failed to transmit the packet.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| Mtftp4SendError (
 | |
|   IN MTFTP4_PROTOCOL        *Instance,
 | |
|   IN UINT16                 ErrCode,
 | |
|   IN UINT8                  *ErrInfo
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   Retransmit the last packet for the instance.
 | |
| 
 | |
|   @param  Instance              The Mtftp instance
 | |
| 
 | |
|   @retval EFI_SUCCESS           The last packet is retransmitted.
 | |
|   @retval Others                Failed to retransmit.
 | |
| 
 | |
| **/
 | |
| EFI_STATUS
 | |
| Mtftp4Retransmit (
 | |
|   IN MTFTP4_PROTOCOL        *Instance
 | |
|   );
 | |
| 
 | |
| /**
 | |
|   The timer ticking function for the Mtftp service instance.
 | |
| 
 | |
|   @param  Event                 The ticking event
 | |
|   @param  Context               The Mtftp service instance
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| EFIAPI
 | |
| Mtftp4OnTimerTick (
 | |
|   IN EFI_EVENT              Event,
 | |
|   IN VOID                   *Context
 | |
|   );
 | |
| #endif
 |