Home | History | Annotate | Download | only in Mtftp4Dxe
      1 /** @file
      2   Support routines for MTFTP.
      3 
      4 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php<BR>
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #ifndef __EFI_MTFTP4_SUPPORT_H__
     16 #define __EFI_MTFTP4_SUPPORT_H__
     17 
     18 //
     19 // The structure representing a range of block numbers, [Start, End].
     20 // It is used to remember the holes in the MTFTP block space. If all
     21 // the holes are filled in, then the download or upload has completed.
     22 //
     23 typedef struct {
     24   LIST_ENTRY                Link;
     25   INTN                      Start;
     26   INTN                      End;
     27   INTN                      Round;
     28   INTN                      Bound;
     29 } MTFTP4_BLOCK_RANGE;
     30 
     31 
     32 /**
     33   Initialize the block range for either RRQ or WRQ.
     34 
     35   RRQ and WRQ have different requirements for Start and End.
     36   For example, during start up, WRQ initializes its whole valid block range
     37   to [0, 0xffff]. This is bacause the server will send us a ACK0 to inform us
     38   to start the upload. When the client received ACK0, it will remove 0 from the
     39   range, 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 in
     41   response to the client's RRQ. When received BLOCK1, the client will remove
     42   it from the block range and send an ACK. It also works if there is option
     43   negotiation.
     44 
     45   @param  Head                  The block range head to initialize
     46   @param  Start                 The Start block number.
     47   @param  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 **/
     53 EFI_STATUS
     54 Mtftp4InitBlockRange (
     55   IN LIST_ENTRY             *Head,
     56   IN UINT16                 Start,
     57   IN UINT16                 End
     58   );
     59 
     60 /**
     61   Get the first valid block number on the range list.
     62 
     63   @param  Head                  The block range head
     64 
     65   @return The first valid block number, -1 if the block range is empty.
     66 
     67 **/
     68 INTN
     69 Mtftp4GetNextBlockNum (
     70   IN LIST_ENTRY             *Head
     71   );
     72 
     73 /**
     74   Set the last block number of the block range list.
     75 
     76   It will remove all the blocks after the Last. MTFTP initialize the block range
     77   to the maximum possible range, such as [0, 0xffff] for WRQ. When it gets the
     78   last block number, it will call this function to set the last block number.
     79 
     80   @param  Head                  The block range list
     81   @param  Last                  The last block number
     82 
     83 **/
     84 VOID
     85 Mtftp4SetLastBlockNum (
     86   IN LIST_ENTRY             *Head,
     87   IN UINT16                 Last
     88   );
     89 
     90 /**
     91   Remove the block number from the block range list.
     92 
     93   @param  Head                  The block range list to remove from
     94   @param  Num                   The block number to remove
     95   @param  Completed             Wether Num is the last block number
     96   @param  TotalBlock            The continuous block number in all
     97 
     98   @retval EFI_NOT_FOUND         The block number isn't in the block range list
     99   @retval EFI_SUCCESS           The block number has been removed from the list
    100   @retval EFI_OUT_OF_RESOURCES  Failed to allocate resource
    101 
    102 **/
    103 EFI_STATUS
    104 Mtftp4RemoveBlockNum (
    105   IN LIST_ENTRY             *Head,
    106   IN UINT16                 Num,
    107   IN BOOLEAN                Completed,
    108   OUT UINT64                *TotalBlock
    109   );
    110 
    111 /**
    112   Set the timeout for the instance. User a longer time for passive instances.
    113 
    114   @param  Instance              The Mtftp session to set time out
    115 
    116 **/
    117 VOID
    118 Mtftp4SetTimeout (
    119   IN OUT MTFTP4_PROTOCOL        *Instance
    120   );
    121 
    122 /**
    123   Send the packet for the instance.
    124 
    125   It will first save a reference to the packet for later retransmission.
    126   Then determine the destination port, listen port for requests, and connected
    127   port for others. At last, send the packet out.
    128 
    129   @param  Instance              The Mtftp instance
    130   @param  Packet                The packet to send
    131 
    132   @retval EFI_SUCCESS           The packet is sent out
    133   @retval Others                Failed to transmit the packet.
    134 
    135 **/
    136 EFI_STATUS
    137 Mtftp4SendPacket (
    138   IN OUT MTFTP4_PROTOCOL        *Instance,
    139   IN OUT NET_BUF                *Packet
    140   );
    141 
    142 /**
    143   Build then transmit the request packet for the MTFTP session.
    144 
    145   @param  Instance              The Mtftp session
    146 
    147   @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory for the request
    148   @retval EFI_SUCCESS           The request is built and sent
    149   @retval Others                Failed to transmit the packet.
    150 
    151 **/
    152 EFI_STATUS
    153 Mtftp4SendRequest (
    154   IN MTFTP4_PROTOCOL        *Instance
    155   );
    156 
    157 /**
    158   Build then send an error message.
    159 
    160   @param  Instance              The MTFTP session
    161   @param  ErrCode               The error code
    162   @param  ErrInfo               The error message
    163 
    164   @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory for the error packet
    165   @retval EFI_SUCCESS           The error packet is transmitted.
    166   @retval Others                Failed to transmit the packet.
    167 
    168 **/
    169 EFI_STATUS
    170 Mtftp4SendError (
    171   IN MTFTP4_PROTOCOL        *Instance,
    172   IN UINT16                 ErrCode,
    173   IN UINT8                  *ErrInfo
    174   );
    175 
    176 /**
    177   Retransmit the last packet for the instance.
    178 
    179   @param  Instance              The Mtftp instance
    180 
    181   @retval EFI_SUCCESS           The last packet is retransmitted.
    182   @retval Others                Failed to retransmit.
    183 
    184 **/
    185 EFI_STATUS
    186 Mtftp4Retransmit (
    187   IN MTFTP4_PROTOCOL        *Instance
    188   );
    189 
    190 /**
    191   The timer ticking function for the Mtftp service instance.
    192 
    193   @param  Event                 The ticking event
    194   @param  Context               The Mtftp service instance
    195 
    196 **/
    197 VOID
    198 EFIAPI
    199 Mtftp4OnTimerTick (
    200   IN EFI_EVENT              Event,
    201   IN VOID                   *Context
    202   );
    203 #endif
    204