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