/** * @file * ftp client headfile for LwIP * */ /* * Copyright (c) ASRMicro.com * All rights reserved. * * This file is part of the lwIP TCP/IP stack. * * Author: jingquanxu * */ #ifndef _FTP_CLIENT_H #define _FTP_CLIENT_H #include "opt.h" #include "sockets.h" #include "sys.h" #include "arch.h" #include "sys_arch.h" #include "netdb.h" #include "mem.h" #include "memp.h" #include "sockets.h" #include "lwip_customer.h" /*No matter LWIP_FTP_CLIENT setting*/ /*follow function need defined*/ int api_ftp_put_data_process(void * parg); int api_ftp_query_config(char *name, char *result); void api_ftp_reset_init(void); void api_ftp_send_msgq(void * parg); #if LWIP_FTP_CLIENT #ifdef __cplusplus extern "C" { #endif #define FTP_LOG_MODE_SHELL (0) #define FTP_LOG_MODE_UART (1) #define FTP_LOG_MODE_SET (FTP_LOG_MODE_UART) /*0: shell mode; 1: uart mode*/ #define FTP_DATA_COM_PORT (1) #define FTP_DATA_MEM_BUFFER (2) #define FTP_DATA_RAM_FILE (3) #define FTP_DATA_TEST_DEBUG (4) #define FTP_GET_DATA_BLOCK_LEN_IN_BUFFER(_start,_end,_cycle) ((_start<=_end)?(_end-_start):(_end+_cycle - _start) ) #define FTP_MOD_BUFF_LEN(_val, _length) ((_val) & (_length-1)) #define FTP_GET_TIMEOUT_DUR (360) #define FTP_DEFAULT_BUFSIZE (1024) #define FTP_MAX_FILE_LIMIT (1024 * 8) #define FTP_MAX_FILE_UNLIMIT (0x7FFFFFFF) /*set to max value for s32*/ #define FTP_DEFAULT_STRING_SIZE (256) #define FTP_MAX_USR_CMD_SIZE (FTP_DEFAULT_STRING_SIZE * 2) #define FTP_DEFAULT_PORT (21) #define FTP_MODE_PORT (0) #define FTP_MODE_PASV (1) #define FTP_TYPE_BINARY (0) #define FTP_TYPE_ASCII (1) #define FTP_INVALID_SOCKET (-1) #define FTP_NEED_REST_CMD (1) #define FTP_NO_REST_CMD (0) #define FTP_DATA_TRANSFER_TIMEOUT_VERSION_FLAG (1) typedef enum MI_PRIM MI_PRIM_e; typedef enum { /*match cmux_api.h miRequestMsg define*/ FTP_MI_REQUEST_MSG, FTP_MI_RESPONSE_MSG, FTP_FOTA_REQUEST_MSG, FTP_FOTA_RESPONSE_MSG, FTP_FTPA_REQUEST_MSG, FTP_FTPA_RESPONSE_MSG, FTP_SHELL_REQUEST_MSG = 0x80, FTP_SHELL_RESPONSE_MSG, FTP_TIMER_OUT_MSG = 0x90, FTP_REQUEST_MSG_END }ftp_RequestMsg_e; typedef enum { #if 0 /*for ftp self-using*/ FTP_RESULT_OK = 0, FTP_RESULT_INPROGRESS, FTP_RESULT_LOGGED, FTP_RESULT_DO_NOTHING, FTP_RESULT_ERR_UNKNOWN, /** Unknown error */ FTP_RESULT_ERR_ARGUMENT, /** Wrong argument */ FTP_RESULT_ERR_MEMORY, /** Out of memory */ FTP_RESULT_ERR_CONNECT, /** Connection to server failed; */ FTP_RESULT_ERR_TIMEOUT, /** Connection timed out (server didn't respond in time) */ FTP_RESULT_ERR_PORT, /** Failed to resolve server port */ FTP_RESULT_ERR_HOSTNAME, /** Failed to resolve server hostname */ FTP_RESULT_ERR_CLOSED, /** Connection unexpectedly closed by remote server */ FTP_RESULT_ERR_SRVR_RESP, /** Server responded with an unknown response code */ FTP_RESULT_ERR_INTERNAL, /** Internal network stack error */ FTP_RESULT_ERR_LOCAL, /** Local storage error */ FTP_RESULT_ERR_FILENAME, /** Remote host could not find file */ FTP_RESULT_ERR_STATUS, /** ftp status is not in right or not match need*/ FTP_RESULT_ERR_END, #endif /*error codes define for guowang project*/ /*for return to AT cmder modul*/ /*ftp_err_e define part refer to enum MIRC MiReturnCode*/ FTP_MIRC_SUCCESS = 0, FTP_MIRC_PDP_REJECT = 900, FTP_MIRC_PDP_UNACTIVE, FTP_MIRC_PDP_ALREADY_ACTIVE, FTP_MIRC_TCP_CONN_REJECT = 910, FTP_MIRC_TCP_CONN_TIMEOUT, FTP_MIRC_SOCKET_EXIST, FTP_MIRC_SOCKET_NOT_EXIST, FTP_MIRC_SEND_BUF_FULL, FTP_MIRC_SEND_TIMEOUT, FTP_MIRC_DOMAIN_NOT_EXIST, FTP_MIRC_DOMAIN_TIMEOUT, FTP_MIRC_DOMAIN_UNKNOWN, FTP_MIRC_PARAM_INVALID = 980, FTP_MIRC_FAIL = 981, FTP_MIRC_ERROR_END, /*error codes define for qijun project*/ /*use it as ftp default error code design*/ /*for return to AT cmder modul*/ /*ftp_err_e define part refer to enum MIRC MiReturnCode*/ FTPA_SUCCESS = 0, FTPA_DO_NOTHING, FTPA_UNKNOWN_ERROR = 601, FTPA_SERVICE_BLOCK = 602, FTPA_SERVICE_BUSY = 603, FTPA_DNS_PARSE_FAIL = 604, FTPA_NETWORK_ERROR = 605, FTPA_CONTROL_CLOSED = 606, FTPA_DATACONN_CLOSED = 607, FTPA_CLOSED_BY_PEER = 608, FTPA_TIMEOUT_ERROR = 609, FTPA_INVALID_PARAMETER = 610, FTPA_OPEN_FILE_FAIL = 611, FTPA_WRITE_FILE_FAIL = 612, FTPA_FILE_ERROR = 613, FTPA_SERVICE_NOT_AVAILABLE = 614, FTPA_OPEN_DATACONN_FAILS = 615, FTPA_TRANSFER_ABORTED = 616, FTPA_FILE_ACTION_NOT_TAKEN = 617, FTPA_ACTION_ABORTED_LOCAL_ERROR = 618, FTPA_ACTION_NOT_TAKEN_LACK_STORAGE = 619, FTPA_SYNTAX_CMD_UNRECOGNIZED = 620, FTPA_SYNTAX_CMD_PARAMETERS = 621, FTPA_COMMAND_NOT_IMPLEMENTED = 622, FTPA_BAD_SEQUENCE_BAD_CMD = 623, FTPA_CMD_PARAMETER_NOT_IMPLEMENTED = 624, FTPA_NOT_LOGGED_IN = 625, FTPA_NEED_FILE_ACCOUNT = 626, FTPA_ACTION_NOT_TAKEN = 627, FTPA_ACTION_ABORTED_PAGETYPE_UNKNOWN = 628, FTPA_FILE_ACTION_ABORTED = 629, FTPA_FILE_NAME_INVALID = 630, FTPA_SSL_AUTH_FAIL = 631, FTPA_ERROR_END }ftp_err_e; /** FTP control connection state */ typedef enum { /*the define used for at+qftpstat response*/ FTPA_STAT_OPENING_FTP = 0, /*match to: FTP_CONNECTED*/ FTPA_STAT_FTP_IDLE, /*match to: FTP_IDLE*/ FTPA_STAT_TRANSFERING, /*match to: FTP_XFERING*/ FTPA_STAT_CLOSING_FTP, /*match to: FTP_CLOSED*/ FTPA_STAT_FTP_CLOSED, /*match to: FTP_CLOSED*/ FTPA_STAT_END, /*the define used for default ftp status check*/ FTP_CLOSED = 0x80, FTP_CONNECTED, FTP_USER_SENT, FTP_PASS_SENT, FTP_LOGGED, FTP_IDLE, FTP_CONFIG_READY, FTP_DATA_SOCKET, FTP_TYPE_SENT, FTP_PASV_SENT, FTP_RETR_SENT, FTP_STOR_SENT, FTP_XFERING, FTP_DATAEND } ftp_status_e; typedef enum { FTP_CONNECT = 1, FTP_USER, FTP_PASS, FTP_SIZE, FTP_TYPE, FTP_MODE, FTP_REST, FTP_PASV, FTP_RETR, #if 0 FTP_RETR_CONN, FTP_RETR_DATA, #endif FTP_LIST, FTP_NLST, FTP_MLSD, FTP_CWD, FTP_PWD, FTP_DEL, FTP_MKDIR, FTP_RMDIR, FTP_MDTM, FTP_RENAME, FTP_DATA_TRANSFER, FTP_STOR, FTP_STOR_CONN, FTP_STOR_DATA, FTP_ABOR, FTP_PORT, FTP_HELP, FTP_QUIT }ftp_command_e; #if 0 /*The interface is adapter to AT cmder*/ typedef struct { u32_t msgID; void *pArgs; }ftp_msgq_msg_t; #endif typedef struct lwip_thread_msgq_msg_st ftp_msgq_msg_t; /** FTP client session structure */ typedef struct { ip_addr_t server_ip; ip_addr_t local_ip; /*for control and data socket, local_ip setings*/ u16_t server_port; u16_t local_port; /*for control socket, local_port setings*/ u8_t mode; /** ftp mode, 0 is PORT, 1 is PASV; Now only support PASV; default set to 1*/ u8_t type; /** ftp type, 0 binary mode; 1 ASCii mode ;defatult set to 0 */ u8_t pcid; /** pdp context id, use pcid to check which netif_pdp will use */ u8_t ssl_type; /* ssl type, 0, ftp client; 1, ftps client; not support now */ u8_t ssl_pcid; /* ssl pdp context id, use pcid to assign, not support now */ u8_t list_cmd; /*0: LIST , 1: NLST , 2: MLSD */ /** #define FTP_DATA_COM_PORT (1) #define FTP_DATA_MEM_BUFFER (2) #define FTP_DATA_RAM_FILE (3) #define FTP_DATA_TEST_DEBUG (4) **/ u8_t data_src; /*data src denote*/ u8_t resrv; u32_t request_msg; /*assign value to ftp_RequestMsg_e, according this, judge shell mode or at mode*/ u32_t primary_id; /*assign value to MI_PRIM, store the at config primary msg id*/ s32_t timeout; /*set timeout for cmder execute, unit is second, default set to 90s */ s32_t tout_max; /*set tout_max for ftp timer out max size restore*/ s32_t tout_cnt; /*set tout_cnt for ftp timer out counter*/ s32_t recv_tout; /*set received timeout value for socket*/ u32_t req_handler; /*match to at cmder config reqHandler*/ ftp_err_e ftp_error; ftp_status_e ftp_status; ftp_command_e ftp_command; s32_t data_offset; s32_t data_lenset; s32_t rest_cmd_flg; /*0, no need REST cmd; 1, need REST cmd*/ s32_t data_max_len; char* dl_payload; s32_t dl_payload_len; char* ul_payload; s32_t ul_payload_len; s32_t latest_data_transfer; char latest_data_cmd [FTP_DEFAULT_STRING_SIZE]; /*have data transfer, such as: list, put, get*/ char user [FTP_DEFAULT_STRING_SIZE]; /** ftp user*/ char passwd [FTP_DEFAULT_STRING_SIZE]; /** ftp passwd */ char remote_file_name [FTP_DEFAULT_STRING_SIZE]; char local_file_name [FTP_DEFAULT_STRING_SIZE]; //char remote_path [FTP_DEFAULT_STRING_SIZE]; char protocol_ret [FTP_DEFAULT_STRING_SIZE]; /*record the protocol error code return*/ struct sockaddr_in ftp_server_ctrl; struct sockaddr_in ftp_server_data; struct sockaddr_in ftp_local_host; int sock_control; int sock_data; int sock_listen; } ftp_session_t; ftp_err_e ftp_init(void); ftp_err_e ftp_close(void); ftp_err_e ftp_reset(void); void ftp_client_init(void); #ifdef __cplusplus } #endif #endif #endif