123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- /** @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
|