mirror of
https://github.com/azure-rtos/netx.git
synced 2023-08-10 07:57:54 +08:00
290 lines
17 KiB
C
290 lines
17 KiB
C
/**************************************************************************/
|
|
/* */
|
|
/* Copyright (c) Microsoft Corporation. All rights reserved. */
|
|
/* */
|
|
/* This software is licensed under the Microsoft Software License */
|
|
/* Terms for Microsoft Azure RTOS. Full text of the license can be */
|
|
/* found in the LICENSE file at https://aka.ms/AzureRTOS_EULA */
|
|
/* and in the root directory of this software. */
|
|
/* */
|
|
/**************************************************************************/
|
|
|
|
|
|
/**************************************************************************/
|
|
/**************************************************************************/
|
|
/** */
|
|
/** NetX Component */
|
|
/** */
|
|
/** Trivial File Transfer Protocol (TFTP) Client */
|
|
/** */
|
|
/** */
|
|
/**************************************************************************/
|
|
/**************************************************************************/
|
|
|
|
|
|
/**************************************************************************/
|
|
/* */
|
|
/* APPLICATION INTERFACE DEFINITION RELEASE */
|
|
/* */
|
|
/* nx_tftp_client.h PORTABLE C */
|
|
/* 6.1 */
|
|
/* AUTHOR */
|
|
/* */
|
|
/* Yuxin Zhou, Microsoft Corporation */
|
|
/* */
|
|
/* DESCRIPTION */
|
|
/* */
|
|
/* This file defines the NetX Trivial File Transfer Protocol (TFTP) */
|
|
/* Client component, including all data types and external references */
|
|
/* It is assumed that nx_api.h and nx_port.h have already been */
|
|
/* included, along with fx_api.h and fx_port.h. */
|
|
/* */
|
|
/* RELEASE HISTORY */
|
|
/* */
|
|
/* DATE NAME DESCRIPTION */
|
|
/* */
|
|
/* 05-19-2020 Yuxin Zhou Initial Version 6.0 */
|
|
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
|
|
/* resulting in version 6.1 */
|
|
/* */
|
|
/**************************************************************************/
|
|
|
|
#ifndef NX_TFTP_CLIENT_H
|
|
#define NX_TFTP_CLIENT_H
|
|
|
|
/* Determine if a C++ compiler is being used. If so, ensure that standard
|
|
C is used to process the API information. */
|
|
|
|
#ifdef __cplusplus
|
|
|
|
/* Yes, C++ compiler is present. Use standard C. */
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
/* Define the NetX TFTP CLIENT ID. */
|
|
|
|
#define NX_TFTP_CLIENT_ID 0x54465460UL
|
|
|
|
|
|
/* Define TFTP maximum error string. */
|
|
|
|
#ifndef NX_TFTP_ERROR_STRING_MAX
|
|
#define NX_TFTP_ERROR_STRING_MAX 64 /* Maximum error sting size */
|
|
#endif
|
|
|
|
/* Define TFTP UDP socket create options. */
|
|
|
|
#ifndef NX_TFTP_TYPE_OF_SERVICE
|
|
#define NX_TFTP_TYPE_OF_SERVICE NX_IP_NORMAL
|
|
#endif
|
|
|
|
#ifndef NX_TFTP_FRAGMENT_OPTION
|
|
#define NX_TFTP_FRAGMENT_OPTION NX_DONT_FRAGMENT
|
|
#endif
|
|
|
|
#ifndef NX_TFTP_TIME_TO_LIVE
|
|
#define NX_TFTP_TIME_TO_LIVE 0x80
|
|
#endif
|
|
|
|
|
|
/* If the host application wishes to specify a source port, define it here. The default is to let
|
|
NetX choose the TFTP Client source port. */
|
|
#ifndef NX_TFTP_SOURCE_PORT
|
|
#define NX_TFTP_SOURCE_PORT NX_ANY_PORT
|
|
#endif
|
|
|
|
#define NX_TFTP_QUEUE_DEPTH 5
|
|
|
|
#define NX_TFTP_FILE_TRANSFER_MAX 512 /* 512 byte maximum file transfer */
|
|
|
|
|
|
/* Define open types. */
|
|
|
|
#define NX_TFTP_OPEN_FOR_READ 0x01 /* TFTP open for reading */
|
|
#define NX_TFTP_OPEN_FOR_WRITE 0x02 /* TFTP open for writing */
|
|
|
|
|
|
/* Define TFTP message codes. */
|
|
|
|
#define NX_TFTP_CODE_READ 0x01 /* TFTP read file request */
|
|
#define NX_TFTP_CODE_WRITE 0x02 /* TFTP write file request */
|
|
#define NX_TFTP_CODE_DATA 0x03 /* TFTP data packet */
|
|
#define NX_TFTP_CODE_ACK 0x04 /* TFTP command/data acknowledgement */
|
|
#define NX_TFTP_CODE_ERROR 0x05 /* TFTP error message */
|
|
|
|
|
|
/* Define TFTP error code constants. */
|
|
|
|
#define NX_TFTP_ERROR_NOT_DEFINED 0x00 /* TFTP not defined error code, see error string */
|
|
#define NX_TFTP_ERROR_FILE_NOT_FOUND 0x01 /* TFTP file not found error code */
|
|
#define NX_TFTP_ERROR_ACCESS_VIOLATION 0x02 /* TFTP file access violation error code */
|
|
#define NX_TFTP_ERROR_DISK_FULL 0x03 /* TFTP disk full error code */
|
|
#define NX_TFTP_ERROR_ILLEGAL_OPERATION 0x04 /* TFTP illegal operation error code */
|
|
#define NX_TFTP_CODE_ERROR 0x05 /* TFTP client request received error code from server */
|
|
#define NX_TFTP_ERROR_FILE_EXISTS 0x06 /* TFTP file already exists error code */
|
|
#define NX_TFTP_ERROR_NO_SUCH_USER 0x07 /* TFTP no such user error code */
|
|
#define NX_TFTP_INVALID_SERVER_ADDRESS 0x08 /* Invalid TFTP server IP extracted from received packet*/
|
|
#define NX_TFTP_NO_ACK_RECEIVED 0x09 /* Did not receive TFTP server ACK response */
|
|
#define NX_TFTP_INVALID_BLOCK_NUMBER 0x0A /* Invalid block number received from Server response */
|
|
#define NX_TFTP_INVALID_INTERFACE 0x0B /* Invalid interface for TFTP Client */
|
|
/* (or multihome not supported) */
|
|
#define NX_TFTP_INVALID_IP_VERSION 0x0C /* Invalid or unsupported IP version specified */
|
|
|
|
|
|
/* Define offsets into the TFTP message buffer. */
|
|
|
|
#define NX_TFTP_CODE_OFFSET 0 /* Offset to TFTP code in buffer */
|
|
#define NX_TFTP_FILENAME_OFFSET 2 /* Offset to TFTP filename in message */
|
|
#define NX_TFTP_BLOCK_NUMBER_OFFSET 2 /* Offset to TFTP block number in buffer */
|
|
#define NX_TFTP_DATA_OFFSET 4 /* Offset to TFTP data in buffer */
|
|
#define NX_TFTP_ERROR_CODE_OFFSET 2 /* Offset to TFTP error code */
|
|
#define NX_TFTP_ERROR_STRING_OFFSET 4 /* Offset to TFPT error string */
|
|
|
|
|
|
/* Define return code constants. */
|
|
|
|
#define NX_TFTP_ERROR 0xC0 /* TFTP internal error */
|
|
#define NX_TFTP_TIMEOUT 0xC1 /* TFTP timeout occurred */
|
|
#define NX_TFTP_FAILED 0xC2 /* TFTP error */
|
|
#define NX_TFTP_NOT_OPEN 0xC3 /* TFTP not opened error */
|
|
#define NX_TFTP_NOT_CLOSED 0xC4 /* TFTP not closed error */
|
|
#define NX_TFTP_END_OF_FILE 0xC5 /* TFTP end of file error */
|
|
#define NX_TFTP_POOL_ERROR 0xC6 /* TFTP packet pool size error - less than 560 bytes */
|
|
|
|
|
|
/* Define TFTP connection states. */
|
|
|
|
#define NX_TFTP_STATE_NOT_OPEN 0 /* TFTP connection not open */
|
|
#define NX_TFTP_STATE_OPEN 1 /* TFTP connection open */
|
|
#define NX_TFTP_STATE_WRITE_OPEN 2 /* TFTP connection open for writing */
|
|
#define NX_TFTP_STATE_END_OF_FILE 3 /* TFTP connection at end of file */
|
|
#define NX_TFTP_STATE_ERROR 4 /* TFTP error condition */
|
|
#define NX_TFTP_STATE_FINISHED 5 /* TFTP finished writing condition */
|
|
|
|
|
|
/* Define the TFTP Server UDP port number */
|
|
|
|
#define NX_TFTP_SERVER_PORT 69 /* Port for TFTP server */
|
|
|
|
|
|
/* Define the basic TFTP Client data structure. */
|
|
|
|
typedef struct NX_TFTP_CLIENT_STRUCT
|
|
{
|
|
ULONG nx_tftp_client_id; /* TFTP Client ID */
|
|
CHAR *nx_tftp_client_name; /* Name of this TFTP client */
|
|
UINT nx_tftp_client_interface_index; /* Index specifying network interface */
|
|
NX_IP *nx_tftp_client_ip_ptr; /* Pointer to associated IP structure */
|
|
NX_PACKET_POOL *nx_tftp_client_packet_pool_ptr; /* Pointer to TFTP client packet pool */
|
|
ULONG nx_tftp_client_server_ip; /* Server's IP address */
|
|
UINT nx_tftp_client_server_port; /* Server's port number (69 originally) */
|
|
UINT nx_tftp_client_state; /* State of TFTP client */
|
|
USHORT nx_tftp_client_block_number; /* Block number in file transfer */
|
|
USHORT nx_tftp_client_reserved; /* Reserved for future use */
|
|
UINT nx_tftp_client_error_code; /* Error code received */
|
|
CHAR nx_tftp_client_error_string[NX_TFTP_ERROR_STRING_MAX + 1];
|
|
NX_UDP_SOCKET nx_tftp_client_socket; /* TFTP Socket */
|
|
|
|
} NX_TFTP_CLIENT;
|
|
|
|
|
|
|
|
#ifndef NX_TFTP_SOURCE_CODE
|
|
|
|
/* Application caller is present, perform API mapping. */
|
|
|
|
/* Determine if error checking is desired. If so, map API functions
|
|
to the appropriate error checking front-ends. Otherwise, map API
|
|
functions to the core functions that actually perform the work.
|
|
Note: error checking is enabled by default. */
|
|
|
|
#ifdef NX_DISABLE_ERROR_CHECKING
|
|
|
|
/******************* Services without error checking. ***********************/
|
|
|
|
/* NetX (IPv4 supported only) services */
|
|
#define nx_tftp_client_file_open _nx_tftp_client_file_open
|
|
|
|
|
|
/* For NetX TFTP service. */
|
|
#define nx_tftp_client_create _nx_tftp_client_create
|
|
#define nx_tftp_client_packet_allocate _nx_tftp_client_packet_allocate
|
|
#define nx_tftp_client_delete _nx_tftp_client_delete
|
|
#define nx_tftp_client_error_info_get _nx_tftp_client_error_info_get
|
|
#define nx_tftp_client_file_close _nx_tftp_client_file_close
|
|
#define nx_tftp_client_file_read _nx_tftp_client_file_read
|
|
#define nx_tftp_client_file_write _nx_tftp_client_file_write
|
|
#define nx_tftp_client_set_interface _nx_tftp_client_set_interface
|
|
|
|
#else
|
|
|
|
/*************** Services with error checking. ******************/
|
|
|
|
/* NetX (IPv4 supported only) services */
|
|
#define nx_tftp_client_file_open _nxe_tftp_client_file_open
|
|
|
|
/* For NetX TFTP service. */
|
|
#define nx_tftp_client_create _nxe_tftp_client_create
|
|
#define nx_tftp_client_packet_allocate _nxe_tftp_client_packet_allocate
|
|
#define nx_tftp_client_delete _nxe_tftp_client_delete
|
|
#define nx_tftp_client_error_info_get _nxe_tftp_client_error_info_get
|
|
#define nx_tftp_client_file_close _nxe_tftp_client_file_close
|
|
#define nx_tftp_client_file_read _nxe_tftp_client_file_read
|
|
#define nx_tftp_client_file_write _nxe_tftp_client_file_write
|
|
#define nx_tftp_client_set_interface _nxe_tftp_client_set_interface
|
|
|
|
#endif /* NX_DISABLE_ERROR_CHECKING */
|
|
|
|
/* Define the prototypes accessible to the application software. */
|
|
|
|
UINT nx_tftp_client_file_open(NX_TFTP_CLIENT *tftp_client_ptr, CHAR *file_name, ULONG server_ip_address, UINT open_type, ULONG wait_option);
|
|
|
|
UINT nx_tftp_client_create(NX_TFTP_CLIENT *tftp_client_ptr, CHAR *tftp_client_name, NX_IP *ip_ptr, NX_PACKET_POOL *pool_ptr);
|
|
UINT nx_tftp_client_delete(NX_TFTP_CLIENT *tftp_client_ptr);
|
|
UINT nx_tftp_client_error_info_get(NX_TFTP_CLIENT *tftp_client_ptr, UINT *error_code, CHAR **error_string);
|
|
UINT nx_tftp_client_file_close(NX_TFTP_CLIENT *tftp_client_ptr);
|
|
UINT nx_tftp_client_file_read(NX_TFTP_CLIENT *tftp_client_ptr, NX_PACKET **packet_ptr, ULONG wait_option);
|
|
UINT nx_tftp_client_file_write(NX_TFTP_CLIENT *tftp_client_ptr, NX_PACKET *packet_ptr, ULONG wait_option);
|
|
UINT nx_tftp_client_packet_allocate(NX_PACKET_POOL *pool_ptr, NX_PACKET **packet_ptr, ULONG wait_option);
|
|
UINT nx_tftp_client_set_interface(NX_TFTP_CLIENT *tftp_client_ptr, UINT if_index);
|
|
|
|
#else
|
|
|
|
/* TFTP source code is being compiled, do not perform any API mapping. */
|
|
|
|
UINT _nxe_tftp_client_file_open(NX_TFTP_CLIENT *tftp_client_ptr, CHAR *file_name, ULONG server_ip_address, UINT open_type, ULONG wait_option);
|
|
UINT _nx_tftp_client_file_open(NX_TFTP_CLIENT *tftp_client_ptr, CHAR *file_name, ULONG server_ip_address, UINT open_type, ULONG wait_option);
|
|
|
|
UINT _nxe_tftp_client_create(NX_TFTP_CLIENT *tftp_client_ptr, CHAR *tftp_client_name, NX_IP *ip_ptr, NX_PACKET_POOL *pool_ptr);
|
|
UINT _nx_tftp_client_create(NX_TFTP_CLIENT *tftp_client_ptr, CHAR *tftp_client_name, NX_IP *ip_ptr, NX_PACKET_POOL *pool_ptr);
|
|
UINT _nxe_tftp_client_delete(NX_TFTP_CLIENT *tftp_client_ptr);
|
|
UINT _nx_tftp_client_delete(NX_TFTP_CLIENT *tftp_client_ptr);
|
|
UINT _nxe_tftp_client_error_info_get(NX_TFTP_CLIENT *tftp_client_ptr, UINT *error_code, CHAR **error_string);
|
|
UINT _nx_tftp_client_error_info_get(NX_TFTP_CLIENT *tftp_client_ptr, UINT *error_code, CHAR **error_string);
|
|
UINT _nxe_tftp_client_file_close(NX_TFTP_CLIENT *tftp_client_ptr);
|
|
UINT _nx_tftp_client_file_close(NX_TFTP_CLIENT *tftp_client_ptr);
|
|
UINT _nxe_tftp_client_file_read(NX_TFTP_CLIENT *tftp_client_ptr, NX_PACKET **packet_ptr, ULONG wait_option);
|
|
UINT _nx_tftp_client_file_read(NX_TFTP_CLIENT *tftp_client_ptr, NX_PACKET **packet_ptr, ULONG wait_option);
|
|
UINT _nxe_tftp_client_file_write(NX_TFTP_CLIENT *tftp_client_ptr, NX_PACKET *packet_ptr, ULONG wait_option);
|
|
UINT _nx_tftp_client_file_write(NX_TFTP_CLIENT *tftp_client_ptr, NX_PACKET *packet_ptr, ULONG wait_option);
|
|
UINT _nxe_tftp_client_packet_allocate(NX_PACKET_POOL *pool_ptr, NX_PACKET **packet_ptr, ULONG wait_option);
|
|
UINT _nx_tftp_client_packet_allocate(NX_PACKET_POOL *pool_ptr, NX_PACKET **packet_ptr, ULONG wait_option);
|
|
UINT _nxe_tftp_client_set_interface(NX_TFTP_CLIENT *tftp_client_ptr, UINT if_index);
|
|
UINT _nx_tftp_client_set_interface(NX_TFTP_CLIENT *tftp_client_ptr, UINT if_index);
|
|
|
|
|
|
#endif /* NX_TFTP_SOURCE_CODE */
|
|
|
|
/* Internal functions. */
|
|
UINT _nx_tftp_client_file_open_internal(NX_TFTP_CLIENT *tftp_client_ptr, CHAR *file_name, ULONG server_ip_address, UINT open_type, ULONG wait_option);
|
|
|
|
|
|
/* Determine if a C++ compiler is being used. If so, complete the standard
|
|
C conditional started above. */
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* NX_TFTP_CLIENT_H */
|