/** @file
  EFI Multicast Trivial File Transfer Protocol Definition

Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This Protocol is introduced in UEFI Specification 2.0

**/

#ifndef __EFI_MTFTP4_PROTOCOL_H__
#define __EFI_MTFTP4_PROTOCOL_H__

#define EFI_MTFTP4_SERVICE_BINDING_PROTOCOL_GUID \
  { \
    0x2FE800BE, 0x8F01, 0x4aa6, {0x94, 0x6B, 0xD7, 0x13, 0x88, 0xE1, 0x83, 0x3F } \
  }

#define EFI_MTFTP4_PROTOCOL_GUID \
  { \
    0x78247c57, 0x63db, 0x4708, {0x99, 0xc2, 0xa8, 0xb4, 0xa9, 0xa6, 0x1f, 0x6b } \
  }

typedef struct _EFI_MTFTP4_PROTOCOL  EFI_MTFTP4_PROTOCOL;
typedef struct _EFI_MTFTP4_TOKEN     EFI_MTFTP4_TOKEN;

//
// MTFTP4 packet opcode definition
//
#define EFI_MTFTP4_OPCODE_RRQ    1
#define EFI_MTFTP4_OPCODE_WRQ    2
#define EFI_MTFTP4_OPCODE_DATA   3
#define EFI_MTFTP4_OPCODE_ACK    4
#define EFI_MTFTP4_OPCODE_ERROR  5
#define EFI_MTFTP4_OPCODE_OACK   6
#define EFI_MTFTP4_OPCODE_DIR    7
#define EFI_MTFTP4_OPCODE_DATA8  8
#define EFI_MTFTP4_OPCODE_ACK8   9

//
// MTFTP4 error code definition
//
#define EFI_MTFTP4_ERRORCODE_NOT_DEFINED          0
#define EFI_MTFTP4_ERRORCODE_FILE_NOT_FOUND       1
#define EFI_MTFTP4_ERRORCODE_ACCESS_VIOLATION     2
#define EFI_MTFTP4_ERRORCODE_DISK_FULL            3
#define EFI_MTFTP4_ERRORCODE_ILLEGAL_OPERATION    4
#define EFI_MTFTP4_ERRORCODE_UNKNOWN_TRANSFER_ID  5
#define EFI_MTFTP4_ERRORCODE_FILE_ALREADY_EXISTS  6
#define EFI_MTFTP4_ERRORCODE_NO_SUCH_USER         7
#define EFI_MTFTP4_ERRORCODE_REQUEST_DENIED       8

//
// MTFTP4 pacekt definitions
//
#pragma pack(1)

typedef struct {
  UINT16    OpCode;
  UINT8     Filename[1];
} EFI_MTFTP4_REQ_HEADER;

typedef struct {
  UINT16    OpCode;
  UINT8     Data[1];
} EFI_MTFTP4_OACK_HEADER;

typedef struct {
  UINT16    OpCode;
  UINT16    Block;
  UINT8     Data[1];
} EFI_MTFTP4_DATA_HEADER;

typedef struct {
  UINT16    OpCode;
  UINT16    Block[1];
} EFI_MTFTP4_ACK_HEADER;

typedef struct {
  UINT16    OpCode;
  UINT64    Block;
  UINT8     Data[1];
} EFI_MTFTP4_DATA8_HEADER;

typedef struct {
  UINT16    OpCode;
  UINT64    Block[1];
} EFI_MTFTP4_ACK8_HEADER;

typedef struct {
  UINT16    OpCode;
  UINT16    ErrorCode;
  UINT8     ErrorMessage[1];
} EFI_MTFTP4_ERROR_HEADER;

typedef union {
  ///
  /// Type of packets as defined by the MTFTPv4 packet opcodes.
  ///
  UINT16                     OpCode;
  ///
  /// Read request packet header.
  ///
  EFI_MTFTP4_REQ_HEADER      Rrq;
  ///
  /// Write request packet header.
  ///
  EFI_MTFTP4_REQ_HEADER      Wrq;
  ///
  /// Option acknowledge packet header.
  ///
  EFI_MTFTP4_OACK_HEADER     Oack;
  ///
  /// Data packet header.
  ///
  EFI_MTFTP4_DATA_HEADER     Data;
  ///
  /// Acknowledgement packet header.
  ///
  EFI_MTFTP4_ACK_HEADER      Ack;
  ///
  /// Data packet header with big block number.
  ///
  EFI_MTFTP4_DATA8_HEADER    Data8;
  ///
  /// Acknowledgement header with big block num.
  ///
  EFI_MTFTP4_ACK8_HEADER     Ack8;
  ///
  /// Error packet header.
  ///
  EFI_MTFTP4_ERROR_HEADER    Error;
} EFI_MTFTP4_PACKET;

#pragma pack()

///
/// MTFTP4 option definition.
///
typedef struct {
  UINT8    *OptionStr;
  UINT8    *ValueStr;
} EFI_MTFTP4_OPTION;

typedef struct {
  BOOLEAN             UseDefaultSetting;
  EFI_IPv4_ADDRESS    StationIp;
  EFI_IPv4_ADDRESS    SubnetMask;
  UINT16              LocalPort;
  EFI_IPv4_ADDRESS    GatewayIp;
  EFI_IPv4_ADDRESS    ServerIp;
  UINT16              InitialServerPort;
  UINT16              TryCount;
  UINT16              TimeoutValue;
} EFI_MTFTP4_CONFIG_DATA;

typedef struct {
  EFI_MTFTP4_CONFIG_DATA    ConfigData;
  UINT8                     SupportedOptionCount;
  UINT8                     **SupportedOptoins;
  UINT8                     UnsupportedOptionCount;
  UINT8                     **UnsupportedOptoins;
} EFI_MTFTP4_MODE_DATA;

typedef struct {
  EFI_IPv4_ADDRESS    GatewayIp;
  EFI_IPv4_ADDRESS    ServerIp;
  UINT16              ServerPort;
  UINT16              TryCount;
  UINT16              TimeoutValue;
} EFI_MTFTP4_OVERRIDE_DATA;

//
// Protocol interfaces definition
//

/**
  A callback function that is provided by the caller to intercept
  the EFI_MTFTP4_OPCODE_DATA or EFI_MTFTP4_OPCODE_DATA8 packets processed in the
  EFI_MTFTP4_PROTOCOL.ReadFile() function, and alternatively to intercept
  EFI_MTFTP4_OPCODE_OACK or EFI_MTFTP4_OPCODE_ERROR packets during a call to
  EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile() or ReadDirectory().

  @param  This        The pointer to the EFI_MTFTP4_PROTOCOL instance.
  @param  Token       The token that the caller provided in the
                      EFI_MTFTP4_PROTOCOL.ReadFile(), WriteFile()
                      or ReadDirectory() function.
  @param  PacketLen   Indicates the length of the packet.
  @param  Packet      The pointer to an MTFTPv4 packet.

  @retval EFI_SUCCESS The operation was successful.
  @retval Others      Aborts the transfer process.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_MTFTP4_CHECK_PACKET)(
  IN EFI_MTFTP4_PROTOCOL  *This,
  IN EFI_MTFTP4_TOKEN     *Token,
  IN UINT16               PacketLen,
  IN EFI_MTFTP4_PACKET    *Paket
  );

/**
  Timeout callback function.

  @param  This           The pointer to the EFI_MTFTP4_PROTOCOL instance.
  @param  Token          The token that is provided in the
                         EFI_MTFTP4_PROTOCOL.ReadFile() or
                         EFI_MTFTP4_PROTOCOL.WriteFile() or
                         EFI_MTFTP4_PROTOCOL.ReadDirectory() functions
                         by the caller.

  @retval EFI_SUCCESS   The operation was successful.
  @retval Others        Aborts download process.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_MTFTP4_TIMEOUT_CALLBACK)(
  IN EFI_MTFTP4_PROTOCOL  *This,
  IN EFI_MTFTP4_TOKEN     *Token
  );

/**
  A callback function that the caller provides to feed data to the
  EFI_MTFTP4_PROTOCOL.WriteFile() function.

  @param  This   The pointer to the EFI_MTFTP4_PROTOCOL instance.
  @param  Token  The token provided in the
                 EFI_MTFTP4_PROTOCOL.WriteFile() by the caller.
  @param  Length Indicates the length of the raw data wanted on input, and the
                 length the data available on output.
  @param  Buffer The pointer to the buffer where the data is stored.

  @retval EFI_SUCCESS The operation was successful.
  @retval Others      Aborts session.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_MTFTP4_PACKET_NEEDED)(
  IN  EFI_MTFTP4_PROTOCOL *This,
  IN  EFI_MTFTP4_TOKEN    *Token,
  IN  OUT UINT16          *Length,
  OUT VOID                **Buffer
  );

/**
  Submits an asynchronous interrupt transfer to an interrupt endpoint of a USB device.

  @param  This     The pointer to the EFI_MTFTP4_PROTOCOL instance.
  @param  ModeData The pointer to storage for the EFI MTFTPv4 Protocol driver mode data.

  @retval EFI_SUCCESS           The configuration data was successfully returned.
  @retval EFI_OUT_OF_RESOURCES  The required mode data could not be allocated.
  @retval EFI_INVALID_PARAMETER This is NULL or ModeData is NULL.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_MTFTP4_GET_MODE_DATA)(
  IN  EFI_MTFTP4_PROTOCOL     *This,
  OUT EFI_MTFTP4_MODE_DATA    *ModeData
  );

/**
  Initializes, changes, or resets the default operational setting for this
  EFI MTFTPv4 Protocol driver instance.

  @param  This            The pointer to the EFI_MTFTP4_PROTOCOL instance.
  @param  MtftpConfigData The pointer to the configuration data structure.

  @retval EFI_SUCCESS           The EFI MTFTPv4 Protocol driver was configured successfully.
  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
  @retval EFI_ACCESS_DENIED     The EFI configuration could not be changed at this time because
                                there is one MTFTP background operation in progress.
  @retval EFI_NO_MAPPING        When using a default address, configuration (DHCP, BOOTP,
                                RARP, etc.) has not finished yet.
  @retval EFI_UNSUPPORTED       A configuration protocol (DHCP, BOOTP, RARP, etc.) could not
                                be located when clients choose to use the default address
                                settings.
  @retval EFI_OUT_OF_RESOURCES  The EFI MTFTPv4 Protocol driver instance data could not be
                                allocated.
  @retval EFI_DEVICE_ERROR      An unexpected system or network error occurred. The EFI
                                 MTFTPv4 Protocol driver instance is not configured.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_MTFTP4_CONFIGURE)(
  IN EFI_MTFTP4_PROTOCOL       *This,
  IN EFI_MTFTP4_CONFIG_DATA    *MtftpConfigData OPTIONAL
  );

/**
  Gets information about a file from an MTFTPv4 server.

  @param  This         The pointer to the EFI_MTFTP4_PROTOCOL instance.
  @param  OverrideData Data that is used to override the existing parameters. If NULL,
                       the default parameters that were set in the
                       EFI_MTFTP4_PROTOCOL.Configure() function are used.
  @param  Filename     The pointer to null-terminated ASCII file name string.
  @param  ModeStr      The pointer to null-terminated ASCII mode string. If NULL, "octet" will be used.
  @param  OptionCount  Number of option/value string pairs in OptionList.
  @param  OptionList   The pointer to array of option/value string pairs. Ignored if
                       OptionCount is zero.
  @param  PacketLength The number of bytes in the returned packet.
  @param  Packet       The pointer to the received packet. This buffer must be freed by
                       the caller.

  @retval EFI_SUCCESS              An MTFTPv4 OACK packet was received and is in the Packet.
  @retval EFI_INVALID_PARAMETER    One or more of the following conditions is TRUE:
                                   - This is NULL.
                                   - Filename is NULL.
                                   - OptionCount is not zero and OptionList is NULL.
                                   - One or more options in OptionList have wrong format.
                                   - PacketLength is NULL.
                                   - One or more IPv4 addresses in OverrideData are not valid
                                     unicast IPv4 addresses if OverrideData is not NULL.
  @retval EFI_UNSUPPORTED          One or more options in the OptionList are in the
                                   unsupported list of structure EFI_MTFTP4_MODE_DATA.
  @retval EFI_NOT_STARTED          The EFI MTFTPv4 Protocol driver has not been started.
  @retval EFI_NO_MAPPING           When using a default address, configuration (DHCP, BOOTP,
                                   RARP, etc.) has not finished yet.
  @retval EFI_ACCESS_DENIED        The previous operation has not completed yet.
  @retval EFI_OUT_OF_RESOURCES     Required system resources could not be allocated.
  @retval EFI_TFTP_ERROR           An MTFTPv4 ERROR packet was received and is in the Packet.
  @retval EFI_NETWORK_UNREACHABLE  An ICMP network unreachable error packet was received and the Packet is set to NULL.
  @retval EFI_HOST_UNREACHABLE     An ICMP host unreachable error packet was received and the Packet is set to NULL.
  @retval EFI_PROTOCOL_UNREACHABLE An ICMP protocol unreachable error packet was received and the Packet is set to NULL.
  @retval EFI_PORT_UNREACHABLE     An ICMP port unreachable error packet was received and the Packet is set to NULL.
  @retval EFI_ICMP_ERROR           Some other ICMP ERROR packet was received and is in the Buffer.
  @retval EFI_PROTOCOL_ERROR       An unexpected MTFTPv4 packet was received and is in the Packet.
  @retval EFI_TIMEOUT              No responses were received from the MTFTPv4 server.
  @retval EFI_DEVICE_ERROR         An unexpected network error or system error occurred.
  @retval EFI_NO_MEDIA             There was a media error.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_MTFTP4_GET_INFO)(
  IN  EFI_MTFTP4_PROTOCOL      *This,
  IN  EFI_MTFTP4_OVERRIDE_DATA *OverrideData   OPTIONAL,
  IN  UINT8                    *Filename,
  IN  UINT8                    *ModeStr        OPTIONAL,
  IN  UINT8                    OptionCount,
  IN  EFI_MTFTP4_OPTION        *OptionList,
  OUT UINT32                   *PacketLength,
  OUT EFI_MTFTP4_PACKET        **Packet        OPTIONAL
  );

/**
  Parses the options in an MTFTPv4 OACK packet.

  @param  This         The pointer to the EFI_MTFTP4_PROTOCOL instance.
  @param  PacketLen    Length of the OACK packet to be parsed.
  @param  Packet       The pointer to the OACK packet to be parsed.
  @param  OptionCount  The pointer to the number of options in following OptionList.
  @param  OptionList   The pointer to EFI_MTFTP4_OPTION storage. Call the EFI Boot
                       Service FreePool() to release the OptionList if the options
                       in this OptionList are not needed any more.

  @retval EFI_SUCCESS           The OACK packet was valid and the OptionCount and
                                OptionList parameters have been updated.
  @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
                                - PacketLen is 0.
                                - Packet is NULL or Packet is not a valid MTFTPv4 packet.
                                - OptionCount is NULL.
  @retval EFI_NOT_FOUND         No options were found in the OACK packet.
  @retval EFI_OUT_OF_RESOURCES  Storage for the OptionList array cannot be allocated.
  @retval EFI_PROTOCOL_ERROR    One or more of the option fields is invalid.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_MTFTP4_PARSE_OPTIONS)(
  IN  EFI_MTFTP4_PROTOCOL      *This,
  IN  UINT32                   PacketLen,
  IN  EFI_MTFTP4_PACKET        *Packet,
  OUT UINT32                   *OptionCount,
  OUT EFI_MTFTP4_OPTION        **OptionList OPTIONAL
  );

/**
  Downloads a file from an MTFTPv4 server.

  @param  This  The pointer to the EFI_MTFTP4_PROTOCOL instance.
  @param  Token The pointer to the token structure to provide the parameters that are
                used in this operation.

  @retval EFI_SUCCESS              The data file has been transferred successfully.
  @retval EFI_OUT_OF_RESOURCES     Required system resources could not be allocated.
  @retval EFI_BUFFER_TOO_SMALL     BufferSize is not zero but not large enough to hold the
                                   downloaded data in downloading process.
  @retval EFI_ABORTED              Current operation is aborted by user.
  @retval EFI_NETWORK_UNREACHABLE  An ICMP network unreachable error packet was received.
  @retval EFI_HOST_UNREACHABLE     An ICMP host unreachable error packet was received.
  @retval EFI_PROTOCOL_UNREACHABLE An ICMP protocol unreachable error packet was received.
  @retval EFI_PORT_UNREACHABLE     An ICMP port unreachable error packet was received.
  @retval EFI_ICMP_ERROR           Some other  ICMP ERROR packet was received.
  @retval EFI_TIMEOUT              No responses were received from the MTFTPv4 server.
  @retval EFI_TFTP_ERROR           An MTFTPv4 ERROR packet was received.
  @retval EFI_DEVICE_ERROR         An unexpected network error or system error occurred.
  @retval EFI_NO_MEDIA             There was a media error.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_MTFTP4_READ_FILE)(
  IN EFI_MTFTP4_PROTOCOL       *This,
  IN EFI_MTFTP4_TOKEN          *Token
  );

/**
  Sends a file to an MTFTPv4 server.

  @param  This  The pointer to the EFI_MTFTP4_PROTOCOL instance.
  @param  Token The pointer to the token structure to provide the parameters that are
                used in this operation.

  @retval EFI_SUCCESS           The upload session has started.
  @retval EFI_UNSUPPORTED       The operation is not supported by this implementation.
  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
  @retval EFI_UNSUPPORTED       One or more options in the Token.OptionList are in
                                the unsupported list of structure EFI_MTFTP4_MODE_DATA.
  @retval EFI_NOT_STARTED       The EFI MTFTPv4 Protocol driver has not been started.
  @retval EFI_NO_MAPPING        When using a default address, configuration (DHCP, BOOTP,
                                RARP, etc.) is not finished yet.
  @retval EFI_ALREADY_STARTED   This Token is already being used in another MTFTPv4 session.
  @retval EFI_OUT_OF_RESOURCES  Required system resources could not be allocated.
  @retval EFI_ACCESS_DENIED     The previous operation has not completed yet.
  @retval EFI_DEVICE_ERROR      An unexpected network error or system error occurred.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_MTFTP4_WRITE_FILE)(
  IN EFI_MTFTP4_PROTOCOL       *This,
  IN EFI_MTFTP4_TOKEN          *Token
  );

/**
  Downloads a data file "directory" from an MTFTPv4 server. May be unsupported in some EFI
  implementations.

  @param  This  The pointer to the EFI_MTFTP4_PROTOCOL instance.
  @param  Token The pointer to the token structure to provide the parameters that are
                used in this operation.

  @retval EFI_SUCCESS           The MTFTPv4 related file "directory" has been downloaded.
  @retval EFI_UNSUPPORTED       The operation is not supported by this implementation.
  @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
  @retval EFI_UNSUPPORTED       One or more options in the Token.OptionList are in
                                the unsupported list of structure EFI_MTFTP4_MODE_DATA.
  @retval EFI_NOT_STARTED       The EFI MTFTPv4 Protocol driver has not been started.
  @retval EFI_NO_MAPPING        When using a default address, configuration (DHCP, BOOTP,
                                RARP, etc.) is not finished yet.
  @retval EFI_ALREADY_STARTED   This Token is already being used in another MTFTPv4 session.
  @retval EFI_OUT_OF_RESOURCES  Required system resources could not be allocated.
  @retval EFI_ACCESS_DENIED     The previous operation has not completed yet.
  @retval EFI_DEVICE_ERROR      An unexpected network error or system error occurred.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_MTFTP4_READ_DIRECTORY)(
  IN EFI_MTFTP4_PROTOCOL       *This,
  IN EFI_MTFTP4_TOKEN          *Token
  );

/**
  Polls for incoming data packets and processes outgoing data packets.

  @param  This The pointer to the EFI_MTFTP4_PROTOCOL instance.

  @retval  EFI_SUCCESS           Incoming or outgoing data was processed.
  @retval  EFI_NOT_STARTED       This EFI MTFTPv4 Protocol instance has not been started.
  @retval  EFI_NO_MAPPING        When using a default address, configuration (DHCP, BOOTP,
                                 RARP, etc.) is not finished yet.
  @retval  EFI_INVALID_PARAMETER This is NULL.
  @retval  EFI_DEVICE_ERROR      An unexpected system or network error occurred.
  @retval  EFI_TIMEOUT           Data was dropped out of the transmit and/or receive queue.
                                 Consider increasing the polling rate.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_MTFTP4_POLL)(
  IN EFI_MTFTP4_PROTOCOL       *This
  );

///
/// The EFI_MTFTP4_PROTOCOL is designed to be used by UEFI drivers and applications
/// to transmit and receive data files. The EFI MTFTPv4 Protocol driver uses
/// the underlying EFI UDPv4 Protocol driver and EFI IPv4 Protocol driver.
///
struct _EFI_MTFTP4_PROTOCOL {
  EFI_MTFTP4_GET_MODE_DATA     GetModeData;
  EFI_MTFTP4_CONFIGURE         Configure;
  EFI_MTFTP4_GET_INFO          GetInfo;
  EFI_MTFTP4_PARSE_OPTIONS     ParseOptions;
  EFI_MTFTP4_READ_FILE         ReadFile;
  EFI_MTFTP4_WRITE_FILE        WriteFile;
  EFI_MTFTP4_READ_DIRECTORY    ReadDirectory;
  EFI_MTFTP4_POLL              Poll;
};

struct _EFI_MTFTP4_TOKEN {
  ///
  /// The status that is returned to the caller at the end of the operation
  /// to indicate whether this operation completed successfully.
  ///
  EFI_STATUS                     Status;
  ///
  /// The event that will be signaled when the operation completes. If
  /// set to NULL, the corresponding function will wait until the read or
  /// write operation finishes. The type of Event must be
  /// EVT_NOTIFY_SIGNAL. The Task Priority Level (TPL) of
  /// Event must be lower than or equal to TPL_CALLBACK.
  ///
  EFI_EVENT                      Event;
  ///
  /// If not NULL, the data that will be used to override the existing configure data.
  ///
  EFI_MTFTP4_OVERRIDE_DATA       *OverrideData;
  ///
  /// The pointer to the null-terminated ASCII file name string.
  ///
  UINT8                          *Filename;
  ///
  /// The pointer to the null-terminated ASCII mode string. If NULL, "octet" is used.
  ///
  UINT8                          *ModeStr;
  ///
  /// Number of option/value string pairs.
  ///
  UINT32                         OptionCount;
  ///
  /// The pointer to an array of option/value string pairs. Ignored if OptionCount is zero.
  ///
  EFI_MTFTP4_OPTION              *OptionList;
  ///
  /// The size of the data buffer.
  ///
  UINT64                         BufferSize;
  ///
  /// The pointer to the data buffer. Data that is downloaded from the
  /// MTFTPv4 server is stored here. Data that is uploaded to the
  /// MTFTPv4 server is read from here. Ignored if BufferSize is zero.
  ///
  VOID                           *Buffer;
  ///
  /// The pointer to the context that will be used by CheckPacket,
  /// TimeoutCallback and PacketNeeded.
  ///
  VOID                           *Context;
  ///
  /// The pointer to the callback function to check the contents of the received packet.
  ///
  EFI_MTFTP4_CHECK_PACKET        CheckPacket;
  ///
  /// The pointer to the function to be called when a timeout occurs.
  ///
  EFI_MTFTP4_TIMEOUT_CALLBACK    TimeoutCallback;
  ///
  /// The pointer to the function to provide the needed packet contents.
  ///
  EFI_MTFTP4_PACKET_NEEDED       PacketNeeded;
};

extern EFI_GUID  gEfiMtftp4ServiceBindingProtocolGuid;
extern EFI_GUID  gEfiMtftp4ProtocolGuid;

#endif
