Files

319 lines
9.9 KiB
C

/**
* @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 <jingquanxu@asrmicro.com>
*
*/
#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