Home | History | Annotate | Download | only in Mtftp6Dxe
      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 //
     24 typedef 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 **/
     53 EFI_STATUS
     54 Mtftp6InitBlockRange (
     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 **/
     70 INTN
     71 Mtftp6GetNextBlockNum (
     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 **/
     87 VOID
     88 Mtftp6SetLastBlockNum (
     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 **/
    107 EFI_STATUS
    108 Mtftp6RemoveBlockNum (
    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 **/
    127 EFI_STATUS
    128 Mtftp6SendRequest (
    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 **/
    146 EFI_STATUS
    147 Mtftp6SendError (
    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 **/
    164 EFI_STATUS
    165 Mtftp6TransmitPacket (
    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 **/
    183 EFI_STATUS
    184 EFIAPI
    185 Mtftp6CheckPacket (
    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 **/
    202 EFI_STATUS
    203 EFIAPI
    204 Mtftp6ConfigDummyUdpIo (
    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 **/
    224 EFI_STATUS
    225 Mtftp6ConfigUdpIo (
    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 **/
    241 VOID
    242 Mtftp6OperationClean (
    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 **/
    262 EFI_STATUS
    263 Mtftp6OperationStart (
    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 **/
    277 VOID
    278 EFIAPI
    279 Mtftp6OnTimerTick (
    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 **/
    294 VOID
    295 EFIAPI
    296 Mtftp6WrqInput (
    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 **/
    315 EFI_STATUS
    316 Mtftp6WrqStart (
    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 **/
    331 VOID
    332 EFIAPI
    333 Mtftp6RrqInput (
    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 **/
    353 EFI_STATUS
    354 Mtftp6RrqStart (
    355   IN MTFTP6_INSTANCE        *Instance,
    356   IN UINT16                 Operation
    357   );
    358 
    359 #endif
    360