14684b66f261ffb74fa7575ed10df43cc0645a42fdarylm/** @file
24684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  Definitions for the TFTP server.
34684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
4f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  Copyright (c) 2011, 2012, Intel Corporation
54684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  All rights reserved. This program and the accompanying materials
64684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  are licensed and made available under the terms and conditions of the BSD License
74684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  which accompanies this distribution.  The full text of the license may be found at
84684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  http://opensource.org/licenses/bsd-license.php
94684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
104684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
114684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
124684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
134684b66f261ffb74fa7575ed10df43cc0645a42fdarylm**/
144684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
154684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#ifndef _TFTP_SERVER_H_
164684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define _TFTP_SERVER_H_
174684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
184684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#include <errno.h>
19f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#include <stdio.h>
204684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#include <stdlib.h>
214684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#include <string.h>
224684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#include <Uefi.h>
234684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
244684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#include <Guid/EventGroup.h>
254684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
264684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#include <Library/BaseMemoryLib.h>
274684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#include <Library/DebugLib.h>
28f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#include <Library/MemoryAllocationLib.h>
294684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#include <Library/PcdLib.h>
30f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#include <Library/TimerLib.h>
314684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#include <Library/UefiApplicationEntryPoint.h>
324684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#include <Library/UefiBootServicesTableLib.h>
334684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#include <Library/UefiLib.h>
344684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#include <Protocol/BlockIo.h>
354684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
364684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#include <netinet/in.h>
37f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#include <netinet6/in6.h>
384684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
394684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#include <sys/EfiSysCall.h>
404684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#include <sys/poll.h>
414684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#include <sys/socket.h>
42460f337bc035b61dec3819f4b62a7181e3631b3fDaryl McDaniel#include <sys/stat.h>
434684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
444684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//------------------------------------------------------------------------------
454684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//  Macros
464684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//------------------------------------------------------------------------------
474684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
484684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#if defined(_MSC_VER)           /* Handle Microsoft VC++ compiler specifics. */
49f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DBG_ENTER()             DEBUG (( DEBUG_ENTER_EXIT, "Entering " __FUNCTION__ "\n" )) ///<  Display routine entry
50f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DBG_EXIT()              DEBUG (( DEBUG_ENTER_EXIT, "Exiting " __FUNCTION__ "\n" ))  ///<  Display routine exit
51f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DBG_EXIT_DEC(Status)    DEBUG (( DEBUG_ENTER_EXIT, "Exiting " __FUNCTION__ ", Status: %d\n", Status ))      ///<  Display routine exit with decimal value
52f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DBG_EXIT_HEX(Status)    DEBUG (( DEBUG_ENTER_EXIT, "Exiting " __FUNCTION__ ", Status: 0x%08x\n", Status ))  ///<  Display routine exit with hex value
53f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DBG_EXIT_STATUS(Status) DEBUG (( DEBUG_ENTER_EXIT, "Exiting " __FUNCTION__ ", Status: %r\n", Status ))      ///<  Display routine exit with status value
54f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DBG_EXIT_TF(Status)     DEBUG (( DEBUG_ENTER_EXIT, "Exiting " __FUNCTION__ ", returning %s\n", (FALSE == Status) ? L"FALSE" : L"TRUE" ))  ///<  Display routine with TRUE/FALSE value
554684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#else   //  _MSC_VER
564684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define DBG_ENTER()
574684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define DBG_EXIT()
584684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define DBG_EXIT_DEC(Status)
594684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define DBG_EXIT_HEX(Status)
604684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define DBG_EXIT_STATUS(Status)
614684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define DBG_EXIT_TF(Status)
624684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#endif  //  _MSC_VER
634684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
644684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define DIM(x)    ( sizeof ( x ) / sizeof ( x[0] ))   ///<  Compute the number of entries in an array
654684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
664684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//------------------------------------------------------------------------------
674684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//  Constants
684684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//------------------------------------------------------------------------------
694684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
70f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define ACK_SHIFT               4           ///<  Number of samples in ACK average
71f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
72f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DEBUG_WINDOW            0x00000001  ///<  Display the window messages
73f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DEBUG_TX_PACKET         0x00000002  ///<  Display the transmit packet messages
74f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DEBUG_FILE_BUFFER       0x00000004  ///<  Display the file buffer messages
75f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DEBUG_SERVER_TIMER      0x00000008  ///<  Display the socket poll messages
76f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DEBUG_TFTP_REQUEST      0x00000010  ///<  Display the TFTP request messages
77f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DEBUG_PORT_WORK         0x00000020  ///<  Display the port work messages
78f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DEBUG_SOCKET_POLL       0x00000040  ///<  Display the socket poll messages
79f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DEBUG_TFTP_PORT         0x00000080  ///<  Display the TFTP port messages
80f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DEBUG_TX                0x00000100  ///<  Display transmit messages
81f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DEBUG_RX                0x00000200  ///<  Display receive messages
82f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DEBUG_TFTP_ACK          0x00000400  ///<  Display the TFTP ACK messages
83f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define DEBUG_ENTER_EXIT        0x00000800  ///<  Display entry and exit messages
84f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
85f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define MAX_PACKETS             8           ///<  Maximum number of packets in the window
864684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
874684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define TFTP_PORT_POLL_DELAY  ( 2 * 1000 )  ///<  Delay in milliseconds for attempts to open the TFTP port
884684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define CLIENT_POLL_DELAY     50            ///<  Delay in milliseconds between client polls
894684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
904684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define TPL_TFTP_SERVER        TPL_CALLBACK ///<  TPL for routine synchronization
914684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
924684b66f261ffb74fa7575ed10df43cc0645a42fdarylm/**
934684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  Verify new TPL value
944684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
954684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  This macro which is enabled when debug is enabled verifies that
964684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  the new TPL value is >= the current TPL value.
974684b66f261ffb74fa7575ed10df43cc0645a42fdarylm**/
984684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#ifdef VERIFY_TPL
994684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#undef VERIFY_TPL
1004684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#endif  //  VERIFY_TPL
1014684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
1024684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#if !defined(MDEPKG_NDEBUG)
1034684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
1044684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define VERIFY_TPL(tpl)                           \
1054684b66f261ffb74fa7575ed10df43cc0645a42fdarylm{                                                 \
1064684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  EFI_TPL PreviousTpl;                            \
1074684b66f261ffb74fa7575ed10df43cc0645a42fdarylm                                                  \
1084684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  PreviousTpl = gBS->RaiseTPL ( TPL_HIGH_LEVEL ); \
1094684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  gBS->RestoreTPL ( PreviousTpl );                \
1104684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  if ( PreviousTpl > tpl ) {                      \
1114684b66f261ffb74fa7575ed10df43cc0645a42fdarylm    DEBUG (( DEBUG_ERROR, "Current TPL: %d, New TPL: %d\r\n", PreviousTpl, tpl ));  \
1124684b66f261ffb74fa7575ed10df43cc0645a42fdarylm    ASSERT ( PreviousTpl <= tpl );                \
1134684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  }                                               \
1144684b66f261ffb74fa7575ed10df43cc0645a42fdarylm}
1154684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
1164684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#else   //  MDEPKG_NDEBUG
1174684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
1184684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define VERIFY_TPL(tpl)
1194684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
1204684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#endif  //  MDEPKG_NDEBUG
1214684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
1224684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define TFTP_SERVER_SIGNATURE       SIGNATURE_32('T','F','T','P') ///<  TSDT_TFTP_SERVER memory signature
1234684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
1244684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//
1254684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//  See: http://www.rfc-editor.org/rfc/pdfrfc/rfc1350.txt.pdf
1264684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//
1274684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//  TFTP Operations
1284684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//
1294684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
1304684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define TFTP_OP_READ_REQUEST      1     ///<  Read request, zero terminated file name, zero terminated mode
1314684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define TFTP_OP_WRITE_REQUEST     2     ///<  Write request, zero terminated file name, zero terminated mode
1324684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define TFTP_OP_DATA              3     ///<  Data block, end-of-file indicated by short block
1334684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define TFTP_OP_ACK               4     ///<  ACK block number
1344684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define TFTP_OP_ERROR             5     ///<  Error number and explaination
1354684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define TFTP_OP_OACK              6     ///<  ACK the options
1364684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
1374684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#define TFTP_MAX_BLOCK_SIZE       4096  ///<  Maximum block size
1384684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
139f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define TFTP_ERROR_SEE_MSG          0   ///<  See the error message
140f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define TFTP_ERROR_NOT_FOUND        1   ///<  File not found
141f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define TFTP_ERROR_ACCESS_VIOLATION 2   ///<  Access violation
142f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define TFTP_ERROR_DISK_FULL        3   ///<  Disk full
143f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define TFTP_ERROR_ILLEGAL_OP       4   ///<  Illegal operation
144f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define TFTP_ERROR_UNKNOWN_XFER_ID  5   ///<  Unknown transfer ID
145f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define TFTP_ERROR_FILE_EXISTS      6   ///<  File already exists
146f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy#define TFTP_ERROR_NO_SUCH_USER     7   ///<  No such user
147f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
1484684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//------------------------------------------------------------------------------
1494684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//  Data Types
1504684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//------------------------------------------------------------------------------
1514684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
1524684b66f261ffb74fa7575ed10df43cc0645a42fdarylm/**
153f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  Packet structure
154f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy**/
155f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahytypedef struct _TFTP_PACKET TFTP_PACKET;
156f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahytypedef struct _TFTP_PACKET {
157f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  TFTP_PACKET * pNext;          ///<  Next packet in list
158f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT64    TxTime;             ///<  Time the transmit was performed
159f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  ssize_t   TxBytes;            ///<  Bytes in the TX buffer
160f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT32    RetryCount;         ///<  Number of transmissions
161f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT16    BlockNumber;        ///<  Block number of this packet
162f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT8     TxBuffer[ 2 + 2 + TFTP_MAX_BLOCK_SIZE ];  ///<  Transmit buffer
163f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy} GCC_TFTP_PACKET;
164f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
165f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy/**
1664684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  Port control structure
1674684b66f261ffb74fa7575ed10df43cc0645a42fdarylm**/
1684684b66f261ffb74fa7575ed10df43cc0645a42fdarylmtypedef struct _TSDT_CONNECTION_CONTEXT TSDT_CONNECTION_CONTEXT;
1694684b66f261ffb74fa7575ed10df43cc0645a42fdarylmtypedef struct _TSDT_CONNECTION_CONTEXT {
1704684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //
1714684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //  Remote connection management
1724684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //
173f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  TSDT_CONNECTION_CONTEXT * pNext;    ///<  Next context in the connection list
174f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  struct sockaddr_in6 RemoteAddress;  ///<  Remote address
175f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  int SocketFd;                       ///<  Socket file descriptor
1764684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
1774684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //
1784684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //  File management parameters
1794684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //
180f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  FILE * File;                  ///<  NULL while file is closed
1814684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  UINT64 LengthInBytes;         ///<  Size of the file
182f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT64 BytesRemaining;        ///<  Number of bytes remaining to be sent
183f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT64 BytesToSend;           ///<  Number of bytes to send
184f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT64 ValidBytes;            ///<  Number of valid bytes in the buffer
1854684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  BOOLEAN bEofSent;             ///<  End of file sent
186f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT8 * pFill;                ///<  Next portion of the buffer to fill
1874684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  UINT8 * pBuffer;              ///<  Pointer into the file data
1884684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  UINT8 * pEnd;                 ///<  End of the file data
189f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT8 FileData[ 2 * MAX_PACKETS * TFTP_MAX_BLOCK_SIZE ];  ///<  File data to send
190f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT64 TimeStart;             ///<  Start of file transfer
191f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
192f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  //
193f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  //  TFTP management parameters
194f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  //
195f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT16 BlockNumber;           ///<  Next block to be transmitted
196f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT32 BlockSize;             ///<  Negotiated block size
197f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
198f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  //
199f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  //  Window management
200f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  //
201f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT32 AckCount;              ///<  Number of ACKs to receive before increasing the window
202f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT32 PacketsInWindow;       ///<  Number of packets in the window
203f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT32 Threshold;             ///<  Size of window when ACK count becomes logrithmic
204f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT32 WindowSize;            ///<  Size of the transmit window
205f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT64 MaxTimeout;            ///<  Maximum number of seconds to wait before retransmission
206f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT64 Rtt2x;                 ///<  Twice the average round trip time in nanoseconds
2074684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
2084684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //
2094684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //  Buffer management
2104684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //
211f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  TFTP_PACKET * pFreeList;      ///<  List of free packets
212f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  TFTP_PACKET * pTxHead;        ///<  First packet in the list of packets for transmission
213f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  TFTP_PACKET * pTxTail;        ///<  Last packet in the list of packets for transmission
214f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  TFTP_PACKET ErrorPacket;      ///<  Error packet
215f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  TFTP_PACKET Tx[ MAX_PACKETS ];///<  Transmit packets
2164684b66f261ffb74fa7575ed10df43cc0645a42fdarylm}GCC_TSDT_CONNECTION_CONTEXT;
2174684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
2184684b66f261ffb74fa7575ed10df43cc0645a42fdarylm/**
2194684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  TFTP server control structure
2204684b66f261ffb74fa7575ed10df43cc0645a42fdarylm**/
2214684b66f261ffb74fa7575ed10df43cc0645a42fdarylmtypedef struct {
2224684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  UINTN Signature;              ///<  Structure identification
2234684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
2244684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //
2254684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //  Image attributes
2264684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //
2274684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  EFI_HANDLE ImageHandle;       ///<  Image handle
2284684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
2294684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //
230f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  //  Performance management
231f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  //
232f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT64 ClockFrequency;        ///<  Frequency of the clock
233f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT64 Time1;                 ///<  Clock value after rollover
234f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT64 Time2;                 ///<  Clock value before rollover
235f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT64 RxTime;                ///<  Time when the packet was recevied
236f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
237f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  //
2384684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //  TFTP port management
2394684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //
2404684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  EFI_EVENT TimerEvent;         ///<  Timer to open TFTP port
241f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  int Udpv4Index;               ///<  Entry for UDPv4
242f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  int Udpv6Index;               ///<  Entry for UDPv6
243f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  int Entries;                  ///<  Number of TFTP ports
244f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  struct pollfd TftpPort [ 2 ]; ///<  Poll descriptor for the TFTP ports (UDP4, UDP6)
2454684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
2464684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //
2474684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //  Request management
2484684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //
249f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  union {
250f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy    struct sockaddr_in v4;      ///<  UDP4 address
251f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy    struct sockaddr_in6 v6;     ///<  UDP6 address
252f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  } RemoteAddress;              ///<  Remote address
253f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  ssize_t RxBytes;              ///<  Receive data length in bytes
254f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  UINT8 RxBuffer[ 2 + 2 + TFTP_MAX_BLOCK_SIZE ];  ///<  Receive buffer
2554684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
2564684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //
2574684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //  Client port management
2584684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  //
2594684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  TSDT_CONNECTION_CONTEXT * pContextList; ///<  List of connection context structures
2604684b66f261ffb74fa7575ed10df43cc0645a42fdarylm} TSDT_TFTP_SERVER;
2614684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
2624684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//#define SERVER_FROM_SERVICE(a) CR(a, TSDT_TFTP_SERVER, ServiceBinding, TFTP_SERVER_SIGNATURE) ///< Locate DT_LAYER from service binding
2634684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
2644684b66f261ffb74fa7575ed10df43cc0645a42fdarylmextern TSDT_TFTP_SERVER mTftpServer;
2654684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
2664684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//------------------------------------------------------------------------------
2674684b66f261ffb74fa7575ed10df43cc0645a42fdarylm// Support routines
2684684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//------------------------------------------------------------------------------
2694684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
2704684b66f261ffb74fa7575ed10df43cc0645a42fdarylm/**
271f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  Queue data packets for transmission
2724684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
273f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pContext    Connection context structure address
2744684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
275f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @retval TRUE if a read error occurred
2764684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
2774684b66f261ffb74fa7575ed10df43cc0645a42fdarylm**/
278f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyBOOLEAN
279f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyPacketFill (
280f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN TSDT_CONNECTION_CONTEXT * pContext
2814684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  );
2824684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
2834684b66f261ffb74fa7575ed10df43cc0645a42fdarylm/**
284f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  Free the packet
2854684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
286f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pContext    Address of a ::TSDT_CONNECTION_CONTEXT structure
287f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pPacket     Address of a ::TFTP_PACKET structure
2884684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
2894684b66f261ffb74fa7575ed10df43cc0645a42fdarylm**/
2904684b66f261ffb74fa7575ed10df43cc0645a42fdarylmVOID
291f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyPacketFree(
292f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN TSDT_CONNECTION_CONTEXT * pContext,
293f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN TFTP_PACKET * pPacket
294f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  );
295f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
296f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy/**
297f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  Get a packet for transmission
298f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
299f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pContext    Address of a ::TSDT_CONNECTION_CONTEXT structure
300f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
301f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @retval Address of a ::TFTP_PACKET structure
302f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
303f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy**/
304f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyTFTP_PACKET *
305f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyPacketGet (
3064684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  IN TSDT_CONNECTION_CONTEXT * pContext
3074684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  );
3084684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
3094684b66f261ffb74fa7575ed10df43cc0645a42fdarylm/**
310f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  Queue the packet for transmission
311f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
312f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pContext    Address of a ::TSDT_CONNECTION_CONTEXT structure
313f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pPacket     Address of a ::TFTP_PACKET structure
314f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
315f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @retval TRUE if a transmission error has occurred
316f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
317f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy**/
318f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyBOOLEAN
319f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyPacketQueue (
320f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN TSDT_CONNECTION_CONTEXT * pContext,
321f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN TFTP_PACKET * pPacket
322f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  );
323f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
324f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy/**
325f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  Transmit the packet
326f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
327f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pContext    Address of a ::TSDT_CONNECTION_CONTEXT structure
328f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pPacket     Address of a ::TFTP_PACKET structure
329f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
330f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @retval EFI_SUCCESS   Message processed successfully
331f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
332f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy**/
333f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyEFI_STATUS
334f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyPacketTx (
335f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN TSDT_CONNECTION_CONTEXT * pContext,
336f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN TFTP_PACKET * pPacket
337f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  );
338f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy
339f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy/**
3404684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  Build and send an error packet
3414684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
3424684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  @param [in] pContext    The context structure address.
3434684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  @param [in] Error       Error number for the packet
3444684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  @param [in] pError      Zero terminated error string address
3454684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
3464684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  @retval EFI_SUCCESS     Message processed successfully
3474684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
3484684b66f261ffb74fa7575ed10df43cc0645a42fdarylm**/
3494684b66f261ffb74fa7575ed10df43cc0645a42fdarylmEFI_STATUS
350f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahySendError (
3514684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  IN TSDT_CONNECTION_CONTEXT * pContext,
3524684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  IN UINT16 Error,
3534684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  IN UINT8 * pError
3544684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  );
3554684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
3564684b66f261ffb74fa7575ed10df43cc0645a42fdarylm/**
357f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  Process the TFTP request
3584684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
359f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pOption   Address of the first zero terminated option string
360f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pValue    Address to receive the value
3614684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
362f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @retval EFI_SUCCESS   Option translated into a value
3634684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
3644684b66f261ffb74fa7575ed10df43cc0645a42fdarylm**/
3654684b66f261ffb74fa7575ed10df43cc0645a42fdarylmEFI_STATUS
366f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyTftpOptionValue (
367f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN UINT8 * pOption,
368f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN INT32 * pValue
3694684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  );
3704684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
3714684b66f261ffb74fa7575ed10df43cc0645a42fdarylm/**
372f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  Process the TFTP request
3734684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
374f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pTftpServer The TFTP server control structure address.
375f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pContext    Connection context structure address
376f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] SocketFd    Socket file descriptor
3774684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
3784684b66f261ffb74fa7575ed10df43cc0645a42fdarylm**/
3794684b66f261ffb74fa7575ed10df43cc0645a42fdarylmVOID
380f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyTftpProcessRequest (
381f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN TSDT_TFTP_SERVER * pTftpServer,
382f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN TSDT_CONNECTION_CONTEXT * pContext,
383f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN int SocketFd
3844684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  );
3854684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
3864684b66f261ffb74fa7575ed10df43cc0645a42fdarylm/**
387f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  Process the read request
3884684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
389f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pTftpServer Address of the ::TSDT_TFTP_SERVER structure
390f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pContext    Connection context structure address
391f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] SocketFd    Socket file descriptor
3924684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
393f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @retval TRUE if the context should be closed
3944684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
3954684b66f261ffb74fa7575ed10df43cc0645a42fdarylm**/
396f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyBOOLEAN
397f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyTftpRead (
398f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN TSDT_TFTP_SERVER * pTftpServer,
399f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN TSDT_CONNECTION_CONTEXT * pContext,
400f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN int SocketFd
4014684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  );
4024684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
4034684b66f261ffb74fa7575ed10df43cc0645a42fdarylm/**
404f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  Update the window due to the ACK
4054684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
406f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pTftpServer Address of the ::TSDT_TFTP_SERVER structure
407f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pContext    Address of a ::TSDT_CONNECTION_CONTEXT structure
408f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pPacket     Address of a ::TFTP_PACKET structure
4094684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
4104684b66f261ffb74fa7575ed10df43cc0645a42fdarylm**/
411f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyVOID
412f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyWindowAck (
413f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN TSDT_TFTP_SERVER * pTftpServer,
414f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN TSDT_CONNECTION_CONTEXT * pContext,
415f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  IN TFTP_PACKET * pPacket
4164684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  );
4174684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
4184684b66f261ffb74fa7575ed10df43cc0645a42fdarylm/**
419f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  A timeout has occurred, close the window
4204684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
421f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahy  @param [in] pContext    Address of a ::TSDT_CONNECTION_CONTEXT structure
4224684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
4234684b66f261ffb74fa7575ed10df43cc0645a42fdarylm**/
424f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyVOID
425f6e5cdd5cfa100e777db38e5f7b26b7ffcf41330lpleahyWindowTimeout (
4264684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  IN TSDT_CONNECTION_CONTEXT * pContext
4274684b66f261ffb74fa7575ed10df43cc0645a42fdarylm  );
4284684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
4294684b66f261ffb74fa7575ed10df43cc0645a42fdarylm//------------------------------------------------------------------------------
4304684b66f261ffb74fa7575ed10df43cc0645a42fdarylm
4314684b66f261ffb74fa7575ed10df43cc0645a42fdarylm#endif  //  _TFTP_SERVER_H_
432