+/** \r
+ Used to perform TFTP and MTFTP services.\r
+\r
+ This function is used to perform TFTP and MTFTP services. This includes the\r
+ TFTP operations to get the size of a file, read a directory, read a file, and\r
+ write a file. It also includes the MTFTP operations to get the size of a file,\r
+ read a directory, and read a file. The type of operation is specified by Operation.\r
+ If the callback function that is invoked during the TFTP/MTFTP operation does\r
+ not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE, then EFI_ABORTED will\r
+ be returned.\r
+ For read operations, the return data will be placed in the buffer specified by\r
+ BufferPtr. If BufferSize is too small to contain the entire downloaded file,\r
+ then EFI_BUFFER_TOO_SMALL will be returned and BufferSize will be set to zero\r
+ or the size of the requested file (the size of the requested file is only returned\r
+ if the TFTP server supports TFTP options). If BufferSize is large enough for the\r
+ read operation, then BufferSize will be set to the size of the downloaded file,\r
+ and EFI_SUCCESS will be returned. Applications using the PxeBc.Mtftp() services\r
+ should use the get-file-size operations to determine the size of the downloaded\r
+ file prior to using the read-file operations-especially when downloading large\r
+ (greater than 64 MB) files-instead of making two calls to the read-file operation.\r
+ Following this recommendation will save time if the file is larger than expected\r
+ and the TFTP server does not support TFTP option extensions. Without TFTP option\r
+ extension support, the client has to download the entire file, counting and discarding\r
+ the received packets, to determine the file size.\r
+ For write operations, the data to be sent is in the buffer specified by BufferPtr.\r
+ BufferSize specifies the number of bytes to send. If the write operation completes\r
+ successfully, then EFI_SUCCESS will be returned.\r
+ For TFTP "get file size" operations, the size of the requested file or directory\r
+ is returned in BufferSize, and EFI_SUCCESS will be returned. If the TFTP server\r
+ does not support options, the file will be downloaded into a bit bucket and the\r
+ length of the downloaded file will be returned. For MTFTP "get file size" operations,\r
+ if the MTFTP server does not support the "get file size" option, EFI_UNSUPPORTED\r
+ will be returned.\r
+ This function can take up to 10 seconds to timeout and return control to the caller.\r
+ If the TFTP sequence does not complete, EFI_TIMEOUT will be returned.\r
+ If the Callback Protocol does not return EFI_PXE_BASE_CODE_CALLBACK_STATUS_CONTINUE,\r
+ then the TFTP sequence is stopped and EFI_ABORTED will be returned.\r
+ The format of the data returned from a TFTP read directory operation is a null-terminated\r
+ filename followed by a null-terminated information string, of the form\r
+ "size year-month-day hour:minute:second" (i.e. %d %d-%d-%d %d:%d:%f - note that\r
+ the seconds field can be a decimal number), where the date and time are UTC. For\r
+ an MTFTP read directory command, there is additionally a null-terminated multicast\r
+ IP address preceding the filename of the form %d.%d.%d.%d for IP v4. The final\r
+ entry is itself null-terminated, so that the final information string is terminated\r
+ with two null octets.\r
+ \r
+ @param This Pointer to the EFI_PXE_BASE_CODE_PROTOCOL instance.\r
+ @param Operation The type of operation to perform.\r
+ @param BufferPtr A pointer to the data buffer. \r
+ @param Overwrite Only used on write file operations. TRUE if a file on a remote server can\r
+ be overwritten. \r
+ @param BufferSize For get-file-size operations, *BufferSize returns the size of the\r
+ requested file. \r
+ @param BlockSize The requested block size to be used during a TFTP transfer.\r
+ @param ServerIp The TFTP / MTFTP server IP address.\r
+ @param Filename A Null-terminated ASCII string that specifies a directory name or a file\r
+ name. \r
+ @param Info Pointer to the MTFTP information.\r
+ @param DontUseBuffer Set to FALSE for normal TFTP and MTFTP read file operation. \r
+ \r
+ @retval EFI_SUCCESS The TFTP/MTFTP operation was completed.\r
+ @retval EFI_NOT_STARTED The PXE Base Code Protocol is in the stopped state.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid. \r
+ @retval EFI_DEVICE_ERROR The network device encountered an error during this operation. \r
+ @retval EFI_BUFFER_TOO_SMALL The buffer is not large enough to complete the read operation. \r
+ @retval EFI_ABORTED The callback function aborted the TFTP/MTFTP operation.\r
+ @retval EFI_TIMEOUT The TFTP/MTFTP operation timed out.\r
+ @retval EFI_ICMP_ERROR An ICMP error packet was received during the MTFTP session.\r
+ @retval EFI_TFTP_ERROR A TFTP error packet was received during the MTFTP session.\r
+ \r