diff options
Diffstat (limited to 'src/VBox/Devices/EFI/Firmware/NetworkPkg/Mtftp4Dxe/Mtftp4Impl.h')
-rw-r--r-- | src/VBox/Devices/EFI/Firmware/NetworkPkg/Mtftp4Dxe/Mtftp4Impl.h | 226 |
1 files changed, 226 insertions, 0 deletions
diff --git a/src/VBox/Devices/EFI/Firmware/NetworkPkg/Mtftp4Dxe/Mtftp4Impl.h b/src/VBox/Devices/EFI/Firmware/NetworkPkg/Mtftp4Dxe/Mtftp4Impl.h new file mode 100644 index 00000000..f97922ca --- /dev/null +++ b/src/VBox/Devices/EFI/Firmware/NetworkPkg/Mtftp4Dxe/Mtftp4Impl.h @@ -0,0 +1,226 @@ +/** @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 |