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