You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
186 lines
5.7 KiB
C
186 lines
5.7 KiB
C
/*
|
|
* FreeRTOS+TCP V2.0.3
|
|
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
* this software and associated documentation files (the "Software"), to deal in
|
|
* the Software without restriction, including without limitation the rights to
|
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
|
* subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in all
|
|
* copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*
|
|
* http://aws.amazon.com/freertos
|
|
* http://www.FreeRTOS.org
|
|
*/
|
|
|
|
/*
|
|
Some code which is common to TCP servers like HTTP and FTP
|
|
*/
|
|
|
|
#ifndef FREERTOS_SERVER_PRIVATE_H
|
|
#define FREERTOS_SERVER_PRIVATE_H
|
|
|
|
#define FREERTOS_NO_SOCKET NULL
|
|
|
|
/* FreeRTOS+FAT */
|
|
#include "ff_stdio.h"
|
|
|
|
/* Each HTTP server has 1, at most 2 sockets */
|
|
#define HTTP_SOCKET_COUNT 2
|
|
|
|
/*
|
|
* ipconfigTCP_COMMAND_BUFFER_SIZE sets the size of:
|
|
* pcCommandBuffer': a buffer to receive and send TCP commands
|
|
*
|
|
* ipconfigTCP_FILE_BUFFER_SIZE sets the size of:
|
|
* pcFileBuffer' : a buffer to access the file system: read or write data.
|
|
*
|
|
* The buffers are both used for FTP as well as HTTP.
|
|
*/
|
|
|
|
#ifndef ipconfigTCP_COMMAND_BUFFER_SIZE
|
|
#define ipconfigTCP_COMMAND_BUFFER_SIZE ( 2048 )
|
|
#endif
|
|
|
|
#ifndef ipconfigTCP_FILE_BUFFER_SIZE
|
|
#define ipconfigTCP_FILE_BUFFER_SIZE ( 2048 )
|
|
#endif
|
|
|
|
struct xTCP_CLIENT;
|
|
|
|
typedef BaseType_t ( * FTCPWorkFunction ) ( struct xTCP_CLIENT * /* pxClient */ );
|
|
typedef void ( * FTCPDeleteFunction ) ( struct xTCP_CLIENT * /* pxClient */ );
|
|
|
|
#define TCP_CLIENT_FIELDS \
|
|
enum eSERVER_TYPE eType; \
|
|
struct xTCP_SERVER *pxParent; \
|
|
Socket_t xSocket; \
|
|
const char *pcRootDir; \
|
|
FTCPWorkFunction fWorkFunction; \
|
|
FTCPDeleteFunction fDeleteFunction; \
|
|
struct xTCP_CLIENT *pxNextClient
|
|
|
|
typedef struct xTCP_CLIENT
|
|
{
|
|
/* This define contains fields which must come first within each of the client structs */
|
|
TCP_CLIENT_FIELDS;
|
|
/* --- Keep at the top --- */
|
|
|
|
} TCPClient_t;
|
|
|
|
struct xHTTP_CLIENT
|
|
{
|
|
/* This define contains fields which must come first within each of the client structs */
|
|
TCP_CLIENT_FIELDS;
|
|
/* --- Keep at the top --- */
|
|
|
|
const char *pcUrlData;
|
|
const char *pcRestData;
|
|
char pcCurrentFilename[ ffconfigMAX_FILENAME ];
|
|
size_t uxBytesLeft;
|
|
FF_FILE *pxFileHandle;
|
|
union {
|
|
struct {
|
|
uint32_t
|
|
bReplySent : 1;
|
|
};
|
|
uint32_t ulFlags;
|
|
} bits;
|
|
};
|
|
|
|
typedef struct xHTTP_CLIENT HTTPClient_t;
|
|
|
|
struct xFTP_CLIENT
|
|
{
|
|
/* This define contains fields which must come first within each of the client structs */
|
|
TCP_CLIENT_FIELDS;
|
|
/* --- Keep at the top --- */
|
|
|
|
uint32_t ulRestartOffset;
|
|
uint32_t ulRecvBytes;
|
|
size_t uxBytesLeft; /* Bytes left to send */
|
|
uint32_t ulClientIP;
|
|
TickType_t xStartTime;
|
|
uint16_t usClientPort;
|
|
Socket_t xTransferSocket;
|
|
BaseType_t xTransType;
|
|
BaseType_t xDirCount;
|
|
FF_FindData_t xFindData;
|
|
FF_FILE *pxReadHandle;
|
|
FF_FILE *pxWriteHandle;
|
|
char pcCurrentDir[ ffconfigMAX_FILENAME ];
|
|
char pcFileName[ ffconfigMAX_FILENAME ];
|
|
char pcConnectionAck[ 128 ];
|
|
char pcClientAck[ 128 ];
|
|
union {
|
|
struct {
|
|
uint32_t
|
|
bHelloSent : 1,
|
|
bLoggedIn : 1,
|
|
bStatusUser : 1,
|
|
bInRename : 1,
|
|
bReadOnly : 1;
|
|
};
|
|
uint32_t ulFTPFlags;
|
|
} bits;
|
|
union {
|
|
struct {
|
|
uint32_t
|
|
bIsListen : 1, /* pdTRUE for passive data connections (using list()). */
|
|
bDirHasEntry : 1, /* pdTRUE if ff_findfirst() was successful. */
|
|
bClientConnected : 1, /* pdTRUE after connect() or accept() has succeeded. */
|
|
bEmptyFile : 1, /* pdTRUE if a connection-without-data was received. */
|
|
bHadError : 1; /* pdTRUE if a transfer got aborted because of an error. */
|
|
};
|
|
uint32_t ulConnFlags;
|
|
} bits1;
|
|
};
|
|
|
|
typedef struct xFTP_CLIENT FTPClient_t;
|
|
|
|
BaseType_t xHTTPClientWork( TCPClient_t *pxClient );
|
|
BaseType_t xFTPClientWork( TCPClient_t *pxClient );
|
|
|
|
void vHTTPClientDelete( TCPClient_t *pxClient );
|
|
void vFTPClientDelete( TCPClient_t *pxClient );
|
|
|
|
BaseType_t xMakeAbsolute( struct xFTP_CLIENT *pxClient, char *pcBuffer, BaseType_t xBufferLength, const char *pcFileName );
|
|
BaseType_t xMakeRelative( FTPClient_t *pxClient, char *pcBuffer, BaseType_t xBufferLength, const char *pcFileName );
|
|
|
|
struct xTCP_SERVER
|
|
{
|
|
SocketSet_t xSocketSet;
|
|
/* A buffer to receive and send TCP commands, either HTTP of FTP. */
|
|
char pcCommandBuffer[ ipconfigTCP_COMMAND_BUFFER_SIZE ];
|
|
/* A buffer to access the file system: read or write data. */
|
|
char pcFileBuffer[ ipconfigTCP_FILE_BUFFER_SIZE ];
|
|
|
|
#if( ipconfigUSE_FTP != 0 )
|
|
char pcNewDir[ ffconfigMAX_FILENAME ];
|
|
#endif
|
|
#if( ipconfigUSE_HTTP != 0 )
|
|
char pcContentsType[40]; /* Space for the msg: "text/javascript" */
|
|
char pcExtraContents[40]; /* Space for the msg: "Content-Length: 346500" */
|
|
#endif
|
|
BaseType_t xServerCount;
|
|
TCPClient_t *pxClients;
|
|
struct xSERVER
|
|
{
|
|
enum eSERVER_TYPE eType; /* eSERVER_HTTP | eSERVER_FTP */
|
|
const char *pcRootDir;
|
|
Socket_t xSocket;
|
|
} xServers[ 1 ];
|
|
};
|
|
|
|
#endif /* FREERTOS_SERVER_PRIVATE_H */
|