/* | |
* FreeRTOS+TCP Labs Build 160919 (C) 2016 Real Time Engineers ltd. | |
* Authors include Hein Tibosch and Richard Barry | |
* | |
******************************************************************************* | |
***** NOTE ******* NOTE ******* NOTE ******* NOTE ******* NOTE ******* NOTE *** | |
*** *** | |
*** *** | |
*** FREERTOS+TCP IS STILL IN THE LAB (mainly because the FTP and HTTP *** | |
*** demos have a dependency on FreeRTOS+FAT, which is only in the Labs *** | |
*** download): *** | |
*** *** | |
*** FreeRTOS+TCP is functional and has been used in commercial products *** | |
*** for some time. Be aware however that we are still refining its *** | |
*** design, the source code does not yet quite conform to the strict *** | |
*** coding and style standards mandated by Real Time Engineers ltd., and *** | |
*** the documentation and testing is not necessarily complete. *** | |
*** *** | |
*** PLEASE REPORT EXPERIENCES USING THE SUPPORT RESOURCES FOUND ON THE *** | |
*** URL: http://www.FreeRTOS.org/contact Active early adopters may, at *** | |
*** the sole discretion of Real Time Engineers Ltd., be offered versions *** | |
*** under a license other than that described below. *** | |
*** *** | |
*** *** | |
***** NOTE ******* NOTE ******* NOTE ******* NOTE ******* NOTE ******* NOTE *** | |
******************************************************************************* | |
* | |
* FreeRTOS+TCP can be used under two different free open source licenses. The | |
* license that applies is dependent on the processor on which FreeRTOS+TCP is | |
* executed, as follows: | |
* | |
* If FreeRTOS+TCP is executed on one of the processors listed under the Special | |
* License Arrangements heading of the FreeRTOS+TCP license information web | |
* page, then it can be used under the terms of the FreeRTOS Open Source | |
* License. If FreeRTOS+TCP is used on any other processor, then it can be used | |
* under the terms of the GNU General Public License V2. Links to the relevant | |
* licenses follow: | |
* | |
* The FreeRTOS+TCP License Information Page: http://www.FreeRTOS.org/tcp_license | |
* The FreeRTOS Open Source License: http://www.FreeRTOS.org/license | |
* The GNU General Public License Version 2: http://www.FreeRTOS.org/gpl-2.0.txt | |
* | |
* FreeRTOS+TCP is distributed in the hope that it will be useful. You cannot | |
* use FreeRTOS+TCP unless you agree that you use the software 'as is'. | |
* FreeRTOS+TCP is provided WITHOUT ANY WARRANTY; without even the implied | |
* warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR | |
* PURPOSE. Real Time Engineers Ltd. disclaims all conditions and terms, be they | |
* implied, expressed, or statutory. | |
* | |
* 1 tab == 4 spaces! | |
* | |
* http://www.FreeRTOS.org | |
* http://www.FreeRTOS.org/plus | |
* http://www.FreeRTOS.org/labs | |
* | |
*/ | |
/* | |
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 */ |