| /** @file | |
| Mtftp4 Implementation. | |
| Mtftp4 Implementation, it supports the following RFCs: | |
| RFC1350 - THE TFTP PROTOCOL (REVISION 2) | |
| RFC2090 - TFTP Multicast Option | |
| RFC2347 - TFTP Option Extension | |
| RFC2348 - TFTP Blocksize Option | |
| RFC2349 - TFTP Timeout Interval and Transfer Size Options | |
| RFC7440 - TFTP Windowsize Option | |
| Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #ifndef __EFI_MTFTP4_IMPL_H__ | |
| #define __EFI_MTFTP4_IMPL_H__ | |
| #include <Uefi.h> | |
| #include <Protocol/Udp4.h> | |
| #include <Protocol/Mtftp4.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/BaseMemoryLib.h> | |
| #include <Library/MemoryAllocationLib.h> | |
| #include <Library/UefiBootServicesTableLib.h> | |
| #include <Library/UdpIoLib.h> | |
| #include <Library/PrintLib.h> | |
| extern EFI_MTFTP4_PROTOCOL gMtftp4ProtocolTemplate; | |
| typedef struct _MTFTP4_SERVICE MTFTP4_SERVICE; | |
| typedef struct _MTFTP4_PROTOCOL MTFTP4_PROTOCOL; | |
| #include "Mtftp4Driver.h" | |
| #include "Mtftp4Option.h" | |
| #include "Mtftp4Support.h" | |
| /// | |
| /// Some constant value of Mtftp service. | |
| /// | |
| #define MTFTP4_SERVICE_SIGNATURE SIGNATURE_32 ('T', 'F', 'T', 'P') | |
| #define MTFTP4_PROTOCOL_SIGNATURE SIGNATURE_32 ('t', 'f', 't', 'p') | |
| #define MTFTP4_DEFAULT_SERVER_PORT 69 | |
| #define MTFTP4_DEFAULT_TIMEOUT 3 | |
| #define MTFTP4_DEFAULT_RETRY 5 | |
| #define MTFTP4_DEFAULT_BLKSIZE 512 | |
| #define MTFTP4_DEFAULT_WINDOWSIZE 1 | |
| #define MTFTP4_TIME_TO_GETMAP 5 | |
| #define MTFTP4_STATE_UNCONFIGED 0 | |
| #define MTFTP4_STATE_CONFIGED 1 | |
| #define MTFTP4_STATE_DESTROY 2 | |
| /// | |
| /// Mtftp service block | |
| /// | |
| struct _MTFTP4_SERVICE { | |
| UINT32 Signature; | |
| EFI_SERVICE_BINDING_PROTOCOL ServiceBinding; | |
| UINT16 ChildrenNum; | |
| LIST_ENTRY Children; | |
| EFI_EVENT Timer; ///< Ticking timer for all the MTFTP clients to handle the packet timeout case. | |
| EFI_EVENT TimerNotifyLevel; ///< Ticking timer for all the MTFTP clients to calculate the packet live time. | |
| EFI_EVENT TimerToGetMap; | |
| EFI_HANDLE Controller; | |
| EFI_HANDLE Image; | |
| // | |
| // This UDP child is used to keep the connection between the UDP | |
| // and MTFTP, so MTFTP will be notified when UDP is uninstalled. | |
| // | |
| UDP_IO *ConnectUdp; | |
| }; | |
| typedef struct { | |
| EFI_MTFTP4_PACKET **Packet; | |
| UINT32 *PacketLen; | |
| EFI_STATUS Status; | |
| } MTFTP4_GETINFO_STATE; | |
| struct _MTFTP4_PROTOCOL { | |
| UINT32 Signature; | |
| LIST_ENTRY Link; | |
| EFI_MTFTP4_PROTOCOL Mtftp4; | |
| INTN State; | |
| BOOLEAN InDestroy; | |
| MTFTP4_SERVICE *Service; | |
| EFI_HANDLE Handle; | |
| EFI_MTFTP4_CONFIG_DATA Config; | |
| // | |
| // Operation parameters: token and requested options. | |
| // | |
| EFI_MTFTP4_TOKEN *Token; | |
| MTFTP4_OPTION RequestOption; | |
| UINT16 Operation; | |
| // | |
| // Blocks is a list of MTFTP4_BLOCK_RANGE which contains | |
| // holes in the file | |
| // | |
| UINT16 BlkSize; | |
| UINT16 LastBlock; | |
| LIST_ENTRY Blocks; | |
| UINT16 WindowSize; | |
| // | |
| // Record the total received and saved block number. | |
| // | |
| UINT64 TotalBlock; | |
| // | |
| // Record the acked block number. | |
| // | |
| UINT64 AckedBlock; | |
| // | |
| // The server's communication end point: IP and two ports. one for | |
| // initial request, one for its selected port. | |
| // | |
| IP4_ADDR ServerIp; | |
| UINT16 ListeningPort; | |
| UINT16 ConnectedPort; | |
| IP4_ADDR Gateway; | |
| UDP_IO *UnicastPort; | |
| // | |
| // Timeout and retransmit status | |
| // | |
| NET_BUF *LastPacket; | |
| UINT32 PacketToLive; | |
| BOOLEAN HasTimeout; | |
| UINT32 CurRetry; | |
| UINT32 MaxRetry; | |
| UINT32 Timeout; | |
| // | |
| // Parameter used by RRQ's multicast download. | |
| // | |
| IP4_ADDR McastIp; | |
| UINT16 McastPort; | |
| BOOLEAN Master; | |
| UDP_IO *McastUdpPort; | |
| }; | |
| typedef struct { | |
| EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; | |
| UINTN NumberOfChildren; | |
| EFI_HANDLE *ChildHandleBuffer; | |
| } MTFTP4_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT; | |
| /** | |
| Clean up the MTFTP session to get ready for new operation. | |
| @param Instance The MTFTP session to clean up | |
| @param Result The result to return to the caller who initiated | |
| the operation. | |
| **/ | |
| VOID | |
| Mtftp4CleanOperation ( | |
| IN OUT MTFTP4_PROTOCOL *Instance, | |
| IN EFI_STATUS Result | |
| ); | |
| /** | |
| Start the MTFTP session for upload. | |
| It will first init some states, then send the WRQ request packet, | |
| and start receiving the packet. | |
| @param Instance The MTFTP session | |
| @param Operation Redundant parameter, which is always | |
| EFI_MTFTP4_OPCODE_WRQ here. | |
| @retval EFI_SUCCESS The upload process has been started. | |
| @retval Others Failed to start the upload. | |
| **/ | |
| EFI_STATUS | |
| Mtftp4WrqStart ( | |
| IN MTFTP4_PROTOCOL *Instance, | |
| IN UINT16 Operation | |
| ); | |
| /** | |
| Start the MTFTP session to download. | |
| It will first initialize some of the internal states then build and send a RRQ | |
| request packet, at last, it will start receive for the downloading. | |
| @param Instance The Mtftp session | |
| @param Operation The MTFTP opcode, it may be a EFI_MTFTP4_OPCODE_RRQ | |
| or EFI_MTFTP4_OPCODE_DIR. | |
| @retval EFI_SUCCESS The mtftp download session is started. | |
| @retval Others Failed to start downloading. | |
| **/ | |
| EFI_STATUS | |
| Mtftp4RrqStart ( | |
| IN MTFTP4_PROTOCOL *Instance, | |
| IN UINT16 Operation | |
| ); | |
| #define MTFTP4_SERVICE_FROM_THIS(a) \ | |
| CR (a, MTFTP4_SERVICE, ServiceBinding, MTFTP4_SERVICE_SIGNATURE) | |
| #define MTFTP4_PROTOCOL_FROM_THIS(a) \ | |
| CR (a, MTFTP4_PROTOCOL, Mtftp4, MTFTP4_PROTOCOL_SIGNATURE) | |
| #endif |