/** @file\r
- \r
+\r
Mtftp4 Implementation.\r
- \r
+\r
Mtftp4 Implementation, it supports the following RFCs:\r
RFC1350 - THE TFTP PROTOCOL (REVISION 2)\r
RFC2090 - TFTP Multicast Option\r
RFC2347 - TFTP Option Extension\r
RFC2348 - TFTP Blocksize Option\r
RFC2349 - TFTP Timeout Interval and Transfer Size Options\r
- \r
-Copyright (c) 2006 - 2007, Intel Corporation<BR>\r
-All rights reserved. This program and the accompanying materials\r
+ RFC7440 - TFTP Windowsize Option\r
+\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
http://opensource.org/licenses/bsd-license.php<BR>\r
#include <Protocol/Mtftp4.h>\r
\r
#include <Library/DebugLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
#include <Library/UefiBootServicesTableLib.h>\r
#include <Library/UdpIoLib.h>\r
+#include <Library/PrintLib.h>\r
\r
extern EFI_MTFTP4_PROTOCOL gMtftp4ProtocolTemplate;\r
\r
///\r
/// Some constant value of Mtftp service.\r
///\r
-typedef enum {\r
- MTFTP4_SERVICE_SIGNATURE = SIGNATURE_32 ('T', 'F', 'T', 'P'),\r
- MTFTP4_PROTOCOL_SIGNATURE = SIGNATURE_32 ('t', 'f', 't', 'p'),\r
+#define MTFTP4_SERVICE_SIGNATURE SIGNATURE_32 ('T', 'F', 'T', 'P')\r
+#define MTFTP4_PROTOCOL_SIGNATURE SIGNATURE_32 ('t', 'f', 't', 'p')\r
\r
- MTFTP4_DEFAULT_SERVER_PORT = 69,\r
- MTFTP4_DEFAULT_TIMEOUT = 3,\r
- MTFTP4_DEFAULT_RETRY = 5,\r
- MTFTP4_DEFAULT_BLKSIZE = 512,\r
- MTFTP4_TIME_TO_GETMAP = 5,\r
+#define MTFTP4_DEFAULT_SERVER_PORT 69\r
+#define MTFTP4_DEFAULT_TIMEOUT 3\r
+#define MTFTP4_DEFAULT_RETRY 5\r
+#define MTFTP4_DEFAULT_BLKSIZE 512\r
+#define MTFTP4_DEFAULT_WINDOWSIZE 1\r
+#define MTFTP4_TIME_TO_GETMAP 5\r
\r
- MTFTP4_STATE_UNCONFIGED = 0,\r
- MTFTP4_STATE_CONFIGED,\r
- MTFTP4_STATE_DESTORY\r
-} MTFTP4_SERVICE_CONST_VALUE;\r
+#define MTFTP4_STATE_UNCONFIGED 0\r
+#define MTFTP4_STATE_CONFIGED 1\r
+#define MTFTP4_STATE_DESTROY 2\r
\r
///\r
/// Mtftp service block\r
UINT32 Signature;\r
EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;\r
\r
- BOOLEAN InDestory;\r
-\r
UINT16 ChildrenNum;\r
LIST_ENTRY Children;\r
\r
- EFI_EVENT Timer; ///< Ticking timer for all the MTFTP clients\r
+ EFI_EVENT Timer; ///< Ticking timer for all the MTFTP clients to handle the packet timeout case.\r
+ EFI_EVENT TimerNotifyLevel; ///< Ticking timer for all the MTFTP clients to calculate the packet live time.\r
EFI_EVENT TimerToGetMap;\r
\r
EFI_HANDLE Controller;\r
// This UDP child is used to keep the connection between the UDP\r
// and MTFTP, so MTFTP will be notified when UDP is uninstalled.\r
//\r
- UDP_IO_PORT *ConnectUdp;\r
+ UDP_IO *ConnectUdp;\r
};\r
\r
\r
EFI_MTFTP4_PROTOCOL Mtftp4;\r
\r
INTN State;\r
- BOOLEAN InDestory;\r
+ BOOLEAN InDestroy;\r
\r
MTFTP4_SERVICE *Service;\r
EFI_HANDLE Handle;\r
UINT16 LastBlock;\r
LIST_ENTRY Blocks;\r
\r
+ UINT16 WindowSize;\r
+\r
+ //\r
+ // Record the total received block number and the already acked block number.\r
+ //\r
+ UINT64 TotalBlock;\r
+ UINT64 AckedBlock;\r
+\r
//\r
// The server's communication end point: IP and two ports. one for\r
// initial request, one for its selected port.\r
UINT16 ListeningPort;\r
UINT16 ConnectedPort;\r
IP4_ADDR Gateway;\r
- UDP_IO_PORT *UnicastPort;\r
+ UDP_IO *UnicastPort;\r
\r
//\r
// Timeout and retransmit status\r
//\r
NET_BUF *LastPacket;\r
UINT32 PacketToLive;\r
+ BOOLEAN HasTimeout;\r
UINT32 CurRetry;\r
UINT32 MaxRetry;\r
UINT32 Timeout;\r
IP4_ADDR McastIp;\r
UINT16 McastPort;\r
BOOLEAN Master;\r
- UDP_IO_PORT *McastUdpPort;\r
-\r
- MTFTP4_GETINFO_STATE GetInfoState;\r
+ UDP_IO *McastUdpPort;\r
};\r
\r
+typedef struct {\r
+ EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;\r
+ UINTN NumberOfChildren;\r
+ EFI_HANDLE *ChildHandleBuffer;\r
+} MTFTP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT;\r
+\r
/**\r
Clean up the MTFTP session to get ready for new operation.\r
\r
\r
/**\r
Start the MTFTP session for upload.\r
- \r
- It will first init some states, then send the WRQ request packet, \r
+\r
+ It will first init some states, then send the WRQ request packet,\r
and start receiving the packet.\r
\r
@param Instance The MTFTP session\r
);\r
\r
/**\r
- Start the MTFTP session to download. \r
- \r
- It will first initialize some of the internal states then build and send a RRQ \r
+ Start the MTFTP session to download.\r
+\r
+ It will first initialize some of the internal states then build and send a RRQ\r
reqeuest packet, at last, it will start receive for the downloading.\r
\r
@param Instance The Mtftp session\r