319 lines
9.9 KiB
C
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
|