Initial version
This commit is contained in:
		| @@ -0,0 +1,5 @@ | ||||
| [{000214A0-0000-0000-C000-000000000046}] | ||||
| Prop3=19,2 | ||||
| [InternetShortcut] | ||||
| URL=http://www.freertos.org/labs | ||||
| IDList= | ||||
| @@ -0,0 +1,353 @@ | ||||
| /* | ||||
|  * 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 | ||||
|  */ | ||||
|  | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
|  | ||||
| /* FreeRTOS+TCP includes. */ | ||||
| #include "FreeRTOS_IP.h" | ||||
| #include "FreeRTOS_Sockets.h" | ||||
| #include "FreeRTOS_TCP_server.h" | ||||
| #include "FreeRTOS_server_private.h" | ||||
|  | ||||
| /* Remove the entire file if TCP is not being used. */ | ||||
| #if( ipconfigUSE_TCP == 1 ) && ( ( ipconfigUSE_HTTP == 1 ) || ( ipconfigUSE_FTP == 1 ) ) | ||||
|  | ||||
| #if !defined( ARRAY_SIZE ) | ||||
| 	#define ARRAY_SIZE(x) ( BaseType_t ) (sizeof( x ) / sizeof( x )[ 0 ] ) | ||||
| #endif | ||||
|  | ||||
|  | ||||
| static void prvReceiveNewClient( TCPServer_t *pxServer, BaseType_t xIndex, Socket_t xNexSocket ); | ||||
| static char *strnew( const char *pcString ); | ||||
| /* Remove slashes at the end of a path. */ | ||||
| static void prvRemoveSlash( char *pcDir ); | ||||
|  | ||||
| TCPServer_t *FreeRTOS_CreateTCPServer( const struct xSERVER_CONFIG *pxConfigs, BaseType_t xCount ) | ||||
| { | ||||
| TCPServer_t *pxServer; | ||||
| SocketSet_t xSocketSet; | ||||
|  | ||||
| 	/* Create a new server. | ||||
| 	xPort / xPortAlt : Make the service available on 1 or 2 public port numbers. */ | ||||
| 	xSocketSet = FreeRTOS_CreateSocketSet(); | ||||
|  | ||||
| 	if( xSocketSet != NULL ) | ||||
| 	{ | ||||
| 	BaseType_t xSize; | ||||
|  | ||||
| 		xSize = sizeof( *pxServer ) - sizeof( pxServer->xServers ) + xCount * sizeof( pxServer->xServers[ 0 ] ); | ||||
|  | ||||
| 		pxServer = ( TCPServer_t * ) pvPortMallocLarge( xSize ); | ||||
| 		if( pxServer != NULL ) | ||||
| 		{ | ||||
| 		struct freertos_sockaddr xAddress; | ||||
| 		BaseType_t xNoTimeout = 0; | ||||
| 		BaseType_t xIndex; | ||||
|  | ||||
| 			memset( pxServer, '\0', xSize ); | ||||
| 			pxServer->xServerCount = xCount; | ||||
| 			pxServer->xSocketSet = xSocketSet; | ||||
|  | ||||
| 			for( xIndex = 0; xIndex < xCount; xIndex++ ) | ||||
| 			{ | ||||
| 			BaseType_t xPortNumber = pxConfigs[ xIndex ].xPortNumber; | ||||
|  | ||||
| 				if( xPortNumber > 0 ) | ||||
| 				{ | ||||
| 				Socket_t xSocket; | ||||
|  | ||||
| 					xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP ); | ||||
| 					FreeRTOS_printf( ( "TCP socket on port %d\n", ( int )xPortNumber ) ); | ||||
|  | ||||
| 					if( xSocket != FREERTOS_NO_SOCKET ) | ||||
| 					{ | ||||
| 						xAddress.sin_addr = FreeRTOS_GetIPAddress(); // Single NIC, currently not used | ||||
| 						xAddress.sin_port = FreeRTOS_htons( xPortNumber ); | ||||
|  | ||||
| 						FreeRTOS_bind( xSocket, &xAddress, sizeof( xAddress ) ); | ||||
| 						FreeRTOS_listen( xSocket, pxConfigs[ xIndex ].xBackLog ); | ||||
|  | ||||
| 						FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, ( void * ) &xNoTimeout, sizeof( BaseType_t ) ); | ||||
| 						FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SNDTIMEO, ( void * ) &xNoTimeout, sizeof( BaseType_t ) ); | ||||
|  | ||||
| 						#if( ipconfigHTTP_RX_BUFSIZE > 0 ) | ||||
| 						{ | ||||
| 							if( pxConfigs[ xIndex ].eType == eSERVER_HTTP ) | ||||
| 							{ | ||||
| 							WinProperties_t xWinProps; | ||||
|  | ||||
| 								memset( &xWinProps, '\0', sizeof( xWinProps ) ); | ||||
| 								/* The parent socket itself won't get connected.  The properties below | ||||
| 								will be inherited by each new child socket. */ | ||||
| 								xWinProps.lTxBufSize = ipconfigHTTP_TX_BUFSIZE; | ||||
| 								xWinProps.lTxWinSize = ipconfigHTTP_TX_WINSIZE; | ||||
| 								xWinProps.lRxBufSize = ipconfigHTTP_RX_BUFSIZE; | ||||
| 								xWinProps.lRxWinSize = ipconfigHTTP_RX_WINSIZE; | ||||
|  | ||||
| 								/* Set the window and buffer sizes. */ | ||||
| 								FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_WIN_PROPERTIES, ( void * ) &xWinProps,	sizeof( xWinProps ) ); | ||||
| 							} | ||||
| 						} | ||||
| 						#endif | ||||
|  | ||||
| 						FreeRTOS_FD_SET( xSocket, xSocketSet, eSELECT_READ|eSELECT_EXCEPT ); | ||||
| 						pxServer->xServers[ xIndex ].xSocket = xSocket; | ||||
| 						pxServer->xServers[ xIndex ].eType = pxConfigs[ xIndex ].eType; | ||||
| 						pxServer->xServers[ xIndex ].pcRootDir = strnew( pxConfigs[ xIndex ].pcRootDir ); | ||||
| 						prvRemoveSlash( ( char * ) pxServer->xServers[ xIndex ].pcRootDir ); | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* Could not allocate the server, delete the socket set */ | ||||
| 			FreeRTOS_DeleteSocketSet( xSocketSet ); | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* Could not create a socket set, return NULL */ | ||||
| 		pxServer = NULL; | ||||
| 	} | ||||
|  | ||||
| 	return pxServer; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvReceiveNewClient( TCPServer_t *pxServer, BaseType_t xIndex, Socket_t xNexSocket ) | ||||
| { | ||||
| TCPClient_t *pxClient = NULL; | ||||
| BaseType_t xSize = 0; | ||||
| FTCPWorkFunction fWorkFunc = NULL; | ||||
| FTCPDeleteFunction fDeleteFunc = NULL; | ||||
| const char *pcType = "Unknown"; | ||||
|  | ||||
| 	/*_RB_ Can the work and delete functions be part of the xSERVER_CONFIG structure | ||||
| 	becomes generic, with no pre-processing required? */ | ||||
| 	#if( ipconfigUSE_HTTP != 0 ) | ||||
| 	{ | ||||
| 		if( pxServer->xServers[ xIndex ].eType == eSERVER_HTTP ) | ||||
| 		{ | ||||
| 			xSize = sizeof( HTTPClient_t ); | ||||
| 			fWorkFunc = xHTTPClientWork; | ||||
| 			fDeleteFunc = vHTTPClientDelete; | ||||
| 			pcType = "HTTP"; | ||||
| 		} | ||||
| 	} | ||||
| 	#endif /* ipconfigUSE_HTTP != 0 */ | ||||
|  | ||||
| 	#if( ipconfigUSE_FTP != 0 ) | ||||
| 	{ | ||||
| 		if( pxServer->xServers[ xIndex ].eType == eSERVER_FTP ) | ||||
| 		{ | ||||
| 			xSize = sizeof( FTPClient_t ); | ||||
| 			fWorkFunc = xFTPClientWork; | ||||
| 			fDeleteFunc = vFTPClientDelete; | ||||
| 			pcType = "FTP"; | ||||
| 		} | ||||
| 	} | ||||
| 	#endif /* ipconfigUSE_FTP != 0 */ | ||||
|  | ||||
| 	/* Malloc enough space for a new HTTP-client */ | ||||
| 	if( xSize ) | ||||
| 	{ | ||||
| 		pxClient = ( TCPClient_t* ) pvPortMallocLarge( xSize ); | ||||
| 	} | ||||
|  | ||||
| 	if( pxClient != NULL ) | ||||
| 	{ | ||||
| 		memset( pxClient, '\0', xSize ); | ||||
|  | ||||
| 		/* Put the new client in front of the list. */ | ||||
| 		pxClient->eType = pxServer->xServers[ xIndex ].eType; | ||||
| 		pxClient->pcRootDir = pxServer->xServers[ xIndex ].pcRootDir; | ||||
| 		pxClient->pxParent = pxServer; | ||||
| 		pxClient->xSocket = xNexSocket; | ||||
| 		pxClient->pxNextClient = pxServer->pxClients; | ||||
| 		pxClient->fWorkFunction = fWorkFunc; | ||||
| 		pxClient->fDeleteFunction = fDeleteFunc; | ||||
| 		pxServer->pxClients = pxClient; | ||||
|  | ||||
| 		FreeRTOS_FD_SET( xNexSocket, pxServer->xSocketSet, eSELECT_READ|eSELECT_EXCEPT ); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		pcType = "closed"; | ||||
| 		FreeRTOS_closesocket( xNexSocket ); | ||||
| 	} | ||||
| 	{ | ||||
| 	struct freertos_sockaddr xRemoteAddress; | ||||
| 		FreeRTOS_GetRemoteAddress( pxClient->xSocket, &xRemoteAddress ); | ||||
| 		FreeRTOS_printf( ( "TPC-server: new %s client %xip\n", pcType, (unsigned)FreeRTOS_ntohl( xRemoteAddress.sin_addr ) ) ); | ||||
| 	} | ||||
|  | ||||
| 	/* Remove compiler warnings in case FreeRTOS_printf() is not used. */ | ||||
| 	( void ) pcType; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void FreeRTOS_TCPServerWork( TCPServer_t *pxServer, TickType_t xBlockingTime ) | ||||
| { | ||||
| TCPClient_t **ppxClient; | ||||
| BaseType_t xIndex; | ||||
| BaseType_t xRc; | ||||
|  | ||||
| 	/* Let the server do one working cycle */ | ||||
| 	xRc = FreeRTOS_select( pxServer->xSocketSet, xBlockingTime ); | ||||
|  | ||||
| 	if( xRc != 0 ) | ||||
| 	{ | ||||
| 		for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ ) | ||||
| 		{ | ||||
| 		struct freertos_sockaddr xAddress; | ||||
| 		Socket_t xNexSocket; | ||||
| 		socklen_t xSocketLength; | ||||
|  | ||||
| 			if( pxServer->xServers[ xIndex ].xSocket == FREERTOS_NO_SOCKET ) | ||||
| 			{ | ||||
| 				continue; | ||||
| 			} | ||||
|  | ||||
| 			xSocketLength = sizeof( xAddress ); | ||||
| 			xNexSocket = FreeRTOS_accept( pxServer->xServers[ xIndex ].xSocket, &xAddress, &xSocketLength); | ||||
|  | ||||
| 			if( ( xNexSocket != FREERTOS_NO_SOCKET ) && ( xNexSocket != FREERTOS_INVALID_SOCKET ) ) | ||||
| 			{ | ||||
| 				prvReceiveNewClient( pxServer, xIndex, xNexSocket ); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	ppxClient = &pxServer->pxClients; | ||||
|  | ||||
| 	while( ( * ppxClient ) != NULL ) | ||||
| 	{ | ||||
| 	TCPClient_t *pxThis = *ppxClient; | ||||
|  | ||||
| 		/* Almost C++ */ | ||||
| 		xRc = pxThis->fWorkFunction( pxThis ); | ||||
|  | ||||
| 		if (xRc < 0 ) | ||||
| 		{ | ||||
| 			*ppxClient = pxThis->pxNextClient; | ||||
| 			/* Close handles, resources */ | ||||
| 			pxThis->fDeleteFunction( pxThis ); | ||||
| 			/* Free the space */ | ||||
| 			vPortFreeLarge( pxThis ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			ppxClient = &( pxThis->pxNextClient ); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static char *strnew( const char *pcString ) | ||||
| { | ||||
| BaseType_t xLength; | ||||
| char *pxBuffer; | ||||
|  | ||||
| 	xLength = strlen( pcString ) + 1; | ||||
| 	pxBuffer = ( char * ) pvPortMalloc( xLength ); | ||||
| 	if( pxBuffer != NULL ) | ||||
| 	{ | ||||
| 		memcpy( pxBuffer, pcString, xLength ); | ||||
| 	} | ||||
|  | ||||
| 	return pxBuffer; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvRemoveSlash( char *pcDir ) | ||||
| { | ||||
| BaseType_t xLength = strlen( pcDir ); | ||||
|  | ||||
| 	while( ( xLength > 0 ) && ( pcDir[ xLength - 1 ] == '/' ) ) | ||||
| 	{ | ||||
| 		pcDir[ --xLength ] = '\0'; | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if( ipconfigSUPPORT_SIGNALS != 0 ) | ||||
|  | ||||
| 	/* FreeRTOS_TCPServerWork() calls select(). | ||||
| 	The two functions below provide a possibility to interrupt | ||||
| 	the call to select(). After the interruption, resume | ||||
| 	by calling FreeRTOS_TCPServerWork() again. */ | ||||
| 	BaseType_t FreeRTOS_TCPServerSignal( TCPServer_t *pxServer ) | ||||
| 	{ | ||||
| 	BaseType_t xIndex; | ||||
| 	BaseType_t xResult = pdFALSE; | ||||
| 		for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ ) | ||||
| 		{ | ||||
| 			if( pxServer->xServers[ xIndex ].xSocket != FREERTOS_NO_SOCKET ) | ||||
| 			{ | ||||
| 				FreeRTOS_SignalSocket( pxServer->xServers[ xIndex ].xSocket ); | ||||
| 				xResult = pdTRUE; | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return xResult; | ||||
| 	} | ||||
|  | ||||
| #endif /* ipconfigSUPPORT_SIGNALS */ | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if( ipconfigSUPPORT_SIGNALS != 0 ) | ||||
|  | ||||
| 	/* Same as above: this function may be called from an ISR, | ||||
| 	for instance a GPIO interrupt. */ | ||||
| 	BaseType_t FreeRTOS_TCPServerSignalFromISR( TCPServer_t *pxServer, BaseType_t *pxHigherPriorityTaskWoken ) | ||||
| 	{ | ||||
| 	BaseType_t xIndex; | ||||
| 	BaseType_t xResult = pdFALSE; | ||||
| 		for( xIndex = 0; xIndex < pxServer->xServerCount; xIndex++ ) | ||||
| 		{ | ||||
| 			if( pxServer->xServers[ xIndex ].xSocket != FREERTOS_NO_SOCKET ) | ||||
| 			{ | ||||
| 				FreeRTOS_SignalSocketFromISR( pxServer->xServers[ xIndex ].xSocket, pxHigherPriorityTaskWoken ); | ||||
| 				xResult = pdTRUE; | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return xResult; | ||||
| 	} | ||||
| #endif /* ipconfigSUPPORT_SIGNALS */ | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #endif /* ( ipconfigUSE_TCP == 1 ) && ( ( ipconfigUSE_HTTP == 1 ) || ( ipconfigUSE_FTP == 1 ) ) */ | ||||
| @@ -0,0 +1,74 @@ | ||||
| /* | ||||
|  * 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 | ||||
|  */ | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
|  | ||||
| /* FreeRTOS+TCP includes. */ | ||||
| #include "FreeRTOS_FTP_commands.h" | ||||
|  | ||||
| const FTPCommand_t xFTPCommands[ FTP_CMD_COUNT ] = | ||||
| { | ||||
| /* cmdLen cmdName[7]    cmdType  checkLogin checkNullArg */ | ||||
| 	{ 4, "USER",		ECMD_USER, pdFALSE, pdFALSE }, | ||||
| 	{ 4, "PASS",		ECMD_PASS, pdFALSE, pdFALSE }, | ||||
| 	{ 4, "ACCT",		ECMD_ACCT,	pdTRUE, pdFALSE }, | ||||
| 	{ 3,  "CWD",		ECMD_CWD,	pdTRUE, pdTRUE }, | ||||
| 	{ 4, "CDUP",		ECMD_CDUP,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "SMNT",		ECMD_SMNT,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "QUIT",		ECMD_QUIT,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "REIN",		ECMD_REIN,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "PORT",		ECMD_PORT,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "PASV",		ECMD_PASV,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "TYPE",		ECMD_TYPE,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "STRU",		ECMD_STRU,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "MODE",		ECMD_MODE,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "RETR",		ECMD_RETR,	pdTRUE, pdTRUE }, | ||||
| 	{ 4, "STOR",		ECMD_STOR,	pdTRUE, pdTRUE }, | ||||
| 	{ 4, "STOU",		ECMD_STOU,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "APPE",		ECMD_APPE,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "ALLO",		ECMD_ALLO,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "REST",		ECMD_REST,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "RNFR",		ECMD_RNFR,	pdTRUE, pdTRUE }, | ||||
| 	{ 4, "RNTO",		ECMD_RNTO,	pdTRUE, pdTRUE }, | ||||
| 	{ 4, "ABOR",		ECMD_ABOR,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "SIZE",		ECMD_SIZE,	pdTRUE, pdTRUE }, | ||||
| 	{ 4, "MDTM",		ECMD_MDTM,	pdTRUE, pdTRUE }, | ||||
| 	{ 4, "DELE",		ECMD_DELE,	pdTRUE, pdTRUE }, | ||||
| 	{ 3,  "RMD",		ECMD_RMD,	pdTRUE, pdTRUE }, | ||||
| 	{ 3,  "MKD",		ECMD_MKD,	pdTRUE, pdTRUE }, | ||||
| 	{ 3,  "PWD",		ECMD_PWD,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "LIST",		ECMD_LIST,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "NLST",		ECMD_NLST,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "SITE",		ECMD_SITE,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "SYST",		ECMD_SYST,	pdFALSE, pdFALSE }, | ||||
| 	{ 4, "FEAT",		ECMD_FEAT,	pdFALSE, pdFALSE }, | ||||
| 	{ 4, "STAT",		ECMD_STAT,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "HELP",		ECMD_HELP,	pdFALSE, pdFALSE }, | ||||
| 	{ 4, "NOOP",		ECMD_NOOP,	pdFALSE, pdFALSE }, | ||||
| 	{ 4, "EMPT",		ECMD_EMPTY,	pdFALSE, pdFALSE }, | ||||
| 	{ 4, "CLOS",		ECMD_CLOSE,	pdTRUE, pdFALSE }, | ||||
| 	{ 4, "UNKN",		ECMD_UNKNOWN, pdFALSE, pdFALSE }, | ||||
| }; | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,71 @@ | ||||
| /* | ||||
|  * 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 | ||||
|  */ | ||||
|  | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
|  | ||||
| #include "FreeRTOS_HTTP_commands.h" | ||||
|  | ||||
| const struct xWEB_COMMAND xWebCommands[ WEB_CMD_COUNT ] = | ||||
| { | ||||
| 	{	3,     "GET",		ECMD_GET }, | ||||
| 	{	4,    "HEAD",		ECMD_HEAD }, | ||||
| 	{	4,    "POST",		ECMD_POST }, | ||||
| 	{	3,     "PUT",		ECMD_PUT }, | ||||
| 	{	6,  "DELETE",		ECMD_DELETE }, | ||||
| 	{	5,   "TRACE",		ECMD_TRACE }, | ||||
| 	{	7, "OPTIONS",		ECMD_OPTIONS }, | ||||
| 	{	7, "CONNECT",		ECMD_CONNECT }, | ||||
| 	{	5,   "PATCH",		ECMD_PATCH }, | ||||
| 	{	4,    "UNKN",		ECMD_UNK }, | ||||
| }; | ||||
|  | ||||
| const char *webCodename (int aCode) | ||||
| { | ||||
| 	switch (aCode) { | ||||
| 	case WEB_REPLY_OK:	//  = 200, | ||||
| 		return "OK"; | ||||
| 	case WEB_NO_CONTENT:    // 204 | ||||
| 		return "No content"; | ||||
| 	case WEB_BAD_REQUEST:	//  = 400, | ||||
| 		return "Bad request"; | ||||
| 	case WEB_UNAUTHORIZED:	//  = 401, | ||||
| 		return "Authorization Required"; | ||||
| 	case WEB_NOT_FOUND:	//  = 404, | ||||
| 		return "Not Found"; | ||||
| 	case WEB_GONE:	//  = 410, | ||||
| 		return "Done"; | ||||
| 	case WEB_PRECONDITION_FAILED:	//  = 412, | ||||
| 		return "Precondition Failed"; | ||||
| 	case WEB_INTERNAL_SERVER_ERROR:	//  = 500, | ||||
| 		return "Internal Server Error"; | ||||
| 	} | ||||
| 	return "Unknown"; | ||||
| } | ||||
| @@ -0,0 +1,428 @@ | ||||
| /* | ||||
|  * 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 | ||||
|  */ | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
|  | ||||
| /* FreeRTOS+TCP includes. */ | ||||
| #include "FreeRTOS_IP.h" | ||||
| #include "FreeRTOS_Sockets.h" | ||||
|  | ||||
| /* FreeRTOS Protocol includes. */ | ||||
| #include "FreeRTOS_HTTP_commands.h" | ||||
| #include "FreeRTOS_TCP_server.h" | ||||
| #include "FreeRTOS_server_private.h" | ||||
|  | ||||
| /* Remove the whole file if HTTP is not supported. */ | ||||
| #if( ipconfigUSE_HTTP == 1 ) | ||||
|  | ||||
| /* FreeRTOS+FAT includes. */ | ||||
| #include "ff_stdio.h" | ||||
|  | ||||
| #ifndef HTTP_SERVER_BACKLOG | ||||
| 	#define HTTP_SERVER_BACKLOG			( 12 ) | ||||
| #endif | ||||
|  | ||||
| #ifndef USE_HTML_CHUNKS | ||||
| 	#define USE_HTML_CHUNKS				( 0 ) | ||||
| #endif | ||||
|  | ||||
| #if !defined( ARRAY_SIZE ) | ||||
| 	#define ARRAY_SIZE(x) ( BaseType_t ) (sizeof( x ) / sizeof( x )[ 0 ] ) | ||||
| #endif | ||||
|  | ||||
| /* Some defines to make the code more readbale */ | ||||
| #define pcCOMMAND_BUFFER	pxClient->pxParent->pcCommandBuffer | ||||
| #define pcNEW_DIR			pxClient->pxParent->pcNewDir | ||||
| #define pcFILE_BUFFER		pxClient->pxParent->pcFileBuffer | ||||
|  | ||||
| #ifndef ipconfigHTTP_REQUEST_CHARACTER | ||||
| 	#define ipconfigHTTP_REQUEST_CHARACTER		'?' | ||||
| #endif | ||||
|  | ||||
| /*_RB_ Need comment block, although fairly self evident. */ | ||||
| static void prvFileClose( HTTPClient_t *pxClient ); | ||||
| static BaseType_t prvProcessCmd( HTTPClient_t *pxClient, BaseType_t xIndex ); | ||||
| static const char *pcGetContentsType( const char *apFname ); | ||||
| static BaseType_t prvOpenURL( HTTPClient_t *pxClient ); | ||||
| static BaseType_t prvSendFile( HTTPClient_t *pxClient ); | ||||
| static BaseType_t prvSendReply( HTTPClient_t *pxClient, BaseType_t xCode ); | ||||
|  | ||||
| static const char pcEmptyString[1] = { '\0' }; | ||||
|  | ||||
| typedef struct xTYPE_COUPLE | ||||
| { | ||||
| 	const char *pcExtension; | ||||
| 	const char *pcType; | ||||
| } TypeCouple_t; | ||||
|  | ||||
| static TypeCouple_t pxTypeCouples[ ] = | ||||
| { | ||||
| 	{ "html", "text/html" }, | ||||
| 	{ "css",  "text/css" }, | ||||
| 	{ "js",   "text/javascript" }, | ||||
| 	{ "png",  "image/png" }, | ||||
| 	{ "jpg",  "image/jpeg" }, | ||||
| 	{ "gif",  "image/gif" }, | ||||
| 	{ "txt",  "text/plain" }, | ||||
| 	{ "mp3",  "audio/mpeg3" }, | ||||
| 	{ "wav",  "audio/wav" }, | ||||
| 	{ "flac", "audio/ogg" }, | ||||
| 	{ "pdf",  "application/pdf" }, | ||||
| 	{ "ttf",  "application/x-font-ttf" }, | ||||
| 	{ "ttc",  "application/x-font-ttf" } | ||||
| }; | ||||
|  | ||||
| void vHTTPClientDelete( TCPClient_t *pxTCPClient ) | ||||
| { | ||||
| HTTPClient_t *pxClient = ( HTTPClient_t * ) pxTCPClient; | ||||
|  | ||||
| 	/* This HTTP client stops, close / release all resources. */ | ||||
| 	if( pxClient->xSocket != FREERTOS_NO_SOCKET ) | ||||
| 	{ | ||||
| 		FreeRTOS_FD_CLR( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_ALL ); | ||||
| 		FreeRTOS_closesocket( pxClient->xSocket ); | ||||
| 		pxClient->xSocket = FREERTOS_NO_SOCKET; | ||||
| 	} | ||||
| 	prvFileClose( pxClient ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvFileClose( HTTPClient_t *pxClient ) | ||||
| { | ||||
| 	if( pxClient->pxFileHandle != NULL ) | ||||
| 	{ | ||||
| 		FreeRTOS_printf( ( "Closing file: %s\n", pxClient->pcCurrentFilename ) ); | ||||
| 		ff_fclose( pxClient->pxFileHandle ); | ||||
| 		pxClient->pxFileHandle = NULL; | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvSendReply( HTTPClient_t *pxClient, BaseType_t xCode ) | ||||
| { | ||||
| struct xTCP_SERVER *pxParent = pxClient->pxParent; | ||||
| BaseType_t xRc; | ||||
|  | ||||
| 	/* A normal command reply on the main socket (port 21). */ | ||||
| 	char *pcBuffer = pxParent->pcFileBuffer; | ||||
|  | ||||
| 	xRc = snprintf( pcBuffer, sizeof( pxParent->pcFileBuffer ), | ||||
| 		"HTTP/1.1 %d %s\r\n" | ||||
| #if	USE_HTML_CHUNKS | ||||
| 		"Transfer-Encoding: chunked\r\n" | ||||
| #endif | ||||
| 		"Content-Type: %s\r\n" | ||||
| 		"Connection: keep-alive\r\n" | ||||
| 		"%s\r\n", | ||||
| 		( int ) xCode, | ||||
| 		webCodename (xCode), | ||||
| 		pxParent->pcContentsType[0] ? pxParent->pcContentsType : "text/html", | ||||
| 		pxParent->pcExtraContents ); | ||||
|  | ||||
| 	pxParent->pcContentsType[0] = '\0'; | ||||
| 	pxParent->pcExtraContents[0] = '\0'; | ||||
|  | ||||
| 	xRc = FreeRTOS_send( pxClient->xSocket, ( const void * ) pcBuffer, xRc, 0 ); | ||||
| 	pxClient->bits.bReplySent = pdTRUE_UNSIGNED; | ||||
|  | ||||
| 	return xRc; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvSendFile( HTTPClient_t *pxClient ) | ||||
| { | ||||
| size_t uxSpace; | ||||
| size_t uxCount; | ||||
| BaseType_t xRc = 0; | ||||
|  | ||||
| 	if( pxClient->bits.bReplySent == pdFALSE_UNSIGNED ) | ||||
| 	{ | ||||
| 		pxClient->bits.bReplySent = pdTRUE_UNSIGNED; | ||||
|  | ||||
| 		strcpy( pxClient->pxParent->pcContentsType, pcGetContentsType( pxClient->pcCurrentFilename ) ); | ||||
| 		snprintf( pxClient->pxParent->pcExtraContents, sizeof( pxClient->pxParent->pcExtraContents ), | ||||
| 			"Content-Length: %d\r\n", ( int ) pxClient->uxBytesLeft ); | ||||
|  | ||||
| 		/* "Requested file action OK". */ | ||||
| 		xRc = prvSendReply( pxClient, WEB_REPLY_OK ); | ||||
| 	} | ||||
|  | ||||
| 	if( xRc >= 0 ) do | ||||
| 	{ | ||||
| 		uxSpace = FreeRTOS_tx_space( pxClient->xSocket ); | ||||
|  | ||||
| 		if( pxClient->uxBytesLeft < uxSpace ) | ||||
| 		{ | ||||
| 			uxCount = pxClient->uxBytesLeft; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			uxCount = uxSpace; | ||||
| 		} | ||||
|  | ||||
| 		if( uxCount > 0u ) | ||||
| 		{ | ||||
| 			if( uxCount > sizeof( pxClient->pxParent->pcFileBuffer ) ) | ||||
| 			{ | ||||
| 				uxCount = sizeof( pxClient->pxParent->pcFileBuffer ); | ||||
| 			} | ||||
| 			ff_fread( pxClient->pxParent->pcFileBuffer, 1, uxCount, pxClient->pxFileHandle ); | ||||
| 			pxClient->uxBytesLeft -= uxCount; | ||||
|  | ||||
| 			xRc = FreeRTOS_send( pxClient->xSocket, pxClient->pxParent->pcFileBuffer, uxCount, 0 ); | ||||
| 			if( xRc < 0 ) | ||||
| 			{ | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 	} while( uxCount > 0u ); | ||||
|  | ||||
| 	if( pxClient->uxBytesLeft == 0u ) | ||||
| 	{ | ||||
| 		/* Writing is ready, no need for further 'eSELECT_WRITE' events. */ | ||||
| 		FreeRTOS_FD_CLR( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE ); | ||||
| 		prvFileClose( pxClient ); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* Wake up the TCP task as soon as this socket may be written to. */ | ||||
| 		FreeRTOS_FD_SET( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE ); | ||||
| 	} | ||||
|  | ||||
| 	return xRc; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvOpenURL( HTTPClient_t *pxClient ) | ||||
| { | ||||
| BaseType_t xRc; | ||||
| char pcSlash[ 2 ]; | ||||
|  | ||||
| 	pxClient->bits.ulFlags = 0; | ||||
|  | ||||
| 	#if( ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK != 0 ) | ||||
| 	{ | ||||
| 		if( strchr( pxClient->pcUrlData, ipconfigHTTP_REQUEST_CHARACTER ) != NULL ) | ||||
| 		{ | ||||
| 		size_t xResult; | ||||
|  | ||||
| 			xResult = uxApplicationHTTPHandleRequestHook( pxClient->pcUrlData, pxClient->pcCurrentFilename, sizeof( pxClient->pcCurrentFilename ) ); | ||||
| 			if( xResult > 0 ) | ||||
| 			{ | ||||
| 				strcpy( pxClient->pxParent->pcContentsType, "text/html" ); | ||||
| 				snprintf( pxClient->pxParent->pcExtraContents, sizeof( pxClient->pxParent->pcExtraContents ), | ||||
| 					"Content-Length: %d\r\n", ( int ) xResult ); | ||||
| 				xRc = prvSendReply( pxClient, WEB_REPLY_OK );	/* "Requested file action OK" */ | ||||
| 				if( xRc > 0 ) | ||||
| 				{ | ||||
| 					xRc = FreeRTOS_send( pxClient->xSocket, pxClient->pcCurrentFilename, xResult, 0 ); | ||||
| 				} | ||||
| 				/* Although against the coding standard of FreeRTOS, a return is | ||||
| 				done here  to simplify this conditional code. */ | ||||
| 				return xRc; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	#endif /* ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK */ | ||||
|  | ||||
| 	if( pxClient->pcUrlData[ 0 ] != '/' ) | ||||
| 	{ | ||||
| 		/* Insert a slash before the file name. */ | ||||
| 		pcSlash[ 0 ] = '/'; | ||||
| 		pcSlash[ 1 ] = '\0'; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* The browser provided a starting '/' already. */ | ||||
| 		pcSlash[ 0 ] = '\0'; | ||||
| 	} | ||||
| 	snprintf( pxClient->pcCurrentFilename, sizeof( pxClient->pcCurrentFilename ), "%s%s%s", | ||||
| 		pxClient->pcRootDir, | ||||
| 		pcSlash, | ||||
| 		pxClient->pcUrlData); | ||||
|  | ||||
| 	pxClient->pxFileHandle = ff_fopen( pxClient->pcCurrentFilename, "rb" ); | ||||
|  | ||||
| 	FreeRTOS_printf( ( "Open file '%s': %s\n", pxClient->pcCurrentFilename, | ||||
| 		pxClient->pxFileHandle != NULL ? "Ok" : strerror( stdioGET_ERRNO() ) ) ); | ||||
|  | ||||
| 	if( pxClient->pxFileHandle == NULL ) | ||||
| 	{ | ||||
| 		/* "404 File not found". */ | ||||
| 		xRc = prvSendReply( pxClient, WEB_NOT_FOUND ); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		pxClient->uxBytesLeft = ( size_t ) pxClient->pxFileHandle->ulFileSize; | ||||
| 		xRc = prvSendFile( pxClient ); | ||||
| 	} | ||||
|  | ||||
| 	return xRc; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvProcessCmd( HTTPClient_t *pxClient, BaseType_t xIndex ) | ||||
| { | ||||
| BaseType_t xResult = 0; | ||||
|  | ||||
| 	/* A new command has been received. Process it. */ | ||||
| 	switch( xIndex ) | ||||
| 	{ | ||||
| 	case ECMD_GET: | ||||
| 		xResult = prvOpenURL( pxClient ); | ||||
| 		break; | ||||
|  | ||||
| 	case ECMD_HEAD: | ||||
| 	case ECMD_POST: | ||||
| 	case ECMD_PUT: | ||||
| 	case ECMD_DELETE: | ||||
| 	case ECMD_TRACE: | ||||
| 	case ECMD_OPTIONS: | ||||
| 	case ECMD_CONNECT: | ||||
| 	case ECMD_PATCH: | ||||
| 	case ECMD_UNK: | ||||
| 		{ | ||||
| 			FreeRTOS_printf( ( "prvProcessCmd: Not implemented: %s\n", | ||||
| 				xWebCommands[xIndex].pcCommandName ) ); | ||||
| 		} | ||||
| 		break; | ||||
| 	} | ||||
|  | ||||
| 	return xResult; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| BaseType_t xHTTPClientWork( TCPClient_t *pxTCPClient ) | ||||
| { | ||||
| BaseType_t xRc; | ||||
| HTTPClient_t *pxClient = ( HTTPClient_t * ) pxTCPClient; | ||||
|  | ||||
| 	if( pxClient->pxFileHandle != NULL ) | ||||
| 	{ | ||||
| 		prvSendFile( pxClient ); | ||||
| 	} | ||||
|  | ||||
| 	xRc = FreeRTOS_recv( pxClient->xSocket, ( void * )pcCOMMAND_BUFFER, sizeof( pcCOMMAND_BUFFER ), 0 ); | ||||
|  | ||||
| 	if( xRc > 0 ) | ||||
| 	{ | ||||
| 	BaseType_t xIndex; | ||||
| 	const char *pcEndOfCmd; | ||||
| 	const struct xWEB_COMMAND *curCmd; | ||||
| 	char *pcBuffer = pcCOMMAND_BUFFER; | ||||
|  | ||||
| 		if( xRc < ( BaseType_t ) sizeof( pcCOMMAND_BUFFER ) ) | ||||
| 		{ | ||||
| 			pcBuffer[ xRc ] = '\0'; | ||||
| 		} | ||||
| 		while( xRc && ( pcBuffer[ xRc - 1 ] == 13 || pcBuffer[ xRc - 1 ] == 10 ) ) | ||||
| 		{ | ||||
| 			pcBuffer[ --xRc ] = '\0'; | ||||
| 		} | ||||
| 		pcEndOfCmd = pcBuffer + xRc; | ||||
|  | ||||
| 		curCmd = xWebCommands; | ||||
|  | ||||
| 		/* Pointing to "/index.html HTTP/1.1". */ | ||||
| 		pxClient->pcUrlData = pcBuffer; | ||||
|  | ||||
| 		/* Pointing to "HTTP/1.1". */ | ||||
| 		pxClient->pcRestData = pcEmptyString; | ||||
|  | ||||
| 		/* Last entry is "ECMD_UNK". */ | ||||
| 		for( xIndex = 0; xIndex < WEB_CMD_COUNT - 1; xIndex++, curCmd++ ) | ||||
| 		{ | ||||
| 		BaseType_t xLength; | ||||
|  | ||||
| 			xLength = curCmd->xCommandLength; | ||||
| 			if( ( xRc >= xLength ) && ( memcmp( curCmd->pcCommandName, pcBuffer, xLength ) == 0 ) ) | ||||
| 			{ | ||||
| 			char *pcLastPtr; | ||||
|  | ||||
| 				pxClient->pcUrlData += xLength + 1; | ||||
| 				for( pcLastPtr = (char *)pxClient->pcUrlData; pcLastPtr < pcEndOfCmd; pcLastPtr++ ) | ||||
| 				{ | ||||
| 					char ch = *pcLastPtr; | ||||
| 					if( ( ch == '\0' ) || ( strchr( "\n\r \t", ch ) != NULL ) ) | ||||
| 					{ | ||||
| 						*pcLastPtr = '\0'; | ||||
| 						pxClient->pcRestData = pcLastPtr + 1; | ||||
| 						break; | ||||
| 					} | ||||
| 				} | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if( xIndex < ( WEB_CMD_COUNT - 1 ) ) | ||||
| 		{ | ||||
| 			xRc = prvProcessCmd( pxClient, xIndex ); | ||||
| 		} | ||||
| 	} | ||||
| 	else if( xRc < 0 ) | ||||
| 	{ | ||||
| 		/* The connection will be closed and the client will be deleted. */ | ||||
| 		FreeRTOS_printf( ( "xHTTPClientWork: rc = %ld\n", xRc ) ); | ||||
| 	} | ||||
| 	return xRc; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static const char *pcGetContentsType (const char *apFname) | ||||
| { | ||||
| 	const char *slash = NULL; | ||||
| 	const char *dot = NULL; | ||||
| 	const char *ptr; | ||||
| 	const char *pcResult = "text/html"; | ||||
| 	BaseType_t x; | ||||
|  | ||||
| 	for( ptr = apFname; *ptr; ptr++ ) | ||||
| 	{ | ||||
| 		if (*ptr == '.') dot = ptr; | ||||
| 		if (*ptr == '/') slash = ptr; | ||||
| 	} | ||||
| 	if( dot > slash ) | ||||
| 	{ | ||||
| 		dot++; | ||||
| 		for( x = 0; x < ARRAY_SIZE( pxTypeCouples ); x++ ) | ||||
| 		{ | ||||
| 			if( strcasecmp( dot, pxTypeCouples[ x ].pcExtension ) == 0 ) | ||||
| 			{ | ||||
| 				pcResult = pxTypeCouples[ x ].pcType; | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return pcResult; | ||||
| } | ||||
|  | ||||
| #endif /* ipconfigUSE_HTTP */ | ||||
|  | ||||
| @@ -0,0 +1,440 @@ | ||||
| /* | ||||
|  * 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 | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * NTPDemo.c | ||||
|  * | ||||
|  * An example of how to lookup a domain using DNS | ||||
|  * And also how to send and receive UDP messages to get the NTP time | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <time.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
| #include "semphr.h" | ||||
|  | ||||
| /* FreeRTOS+TCP includes. */ | ||||
| #include "FreeRTOS_IP.h" | ||||
| #include "FreeRTOS_Sockets.h" | ||||
| #include "FreeRTOS_DNS.h" | ||||
| #include "FreeRTOS_Stream_Buffer.h" | ||||
|  | ||||
| /* Use the date & time functions from +FAT. */ | ||||
| #include "ff_time.h" | ||||
|  | ||||
| #include "NTPDemo.h" | ||||
| #include "ntpClient.h" | ||||
|  | ||||
| #include "date_and_time.h" | ||||
|  | ||||
| enum EStatus { | ||||
| 	EStatusLookup, | ||||
| 	EStatusAsking, | ||||
| 	EStatusPause, | ||||
| 	EStatusFailed, | ||||
| }; | ||||
|  | ||||
| static struct SNtpPacket xNTPPacket; | ||||
|  | ||||
| #if( ipconfigUSE_CALLBACKS == 0 ) | ||||
| 	static char cRecvBuffer[ sizeof( struct SNtpPacket ) + 64 ]; | ||||
| #endif | ||||
|  | ||||
| static enum EStatus xStatus = EStatusLookup; | ||||
|  | ||||
| static const char *pcTimeServers[] = { | ||||
| 	"0.asia.pool.ntp.org", | ||||
| 	"0.europe.pool.ntp.org", | ||||
| 	"0.id.pool.ntp.org", | ||||
| 	"0.south-america.pool.ntp.org", | ||||
| 	"0.oceania.pool.ntp.org", | ||||
| 	"0.north-america.pool.ntp.org" | ||||
| }; | ||||
|  | ||||
| static SemaphoreHandle_t xNTPWakeupSem = NULL; | ||||
| static uint32_t ulIPAddressFound; | ||||
| static Socket_t xUDPSocket = NULL; | ||||
| static TaskHandle_t xNTPTaskhandle = NULL; | ||||
| static TickType_t uxSendTime; | ||||
|  | ||||
| static void prvNTPTask( void *pvParameters ); | ||||
|  | ||||
| static void vSignalTask( void ) | ||||
| { | ||||
| 	#if( ipconfigUSE_CALLBACKS == 0 ) | ||||
| 	if( xUDPSocket != NULL ) | ||||
| 	{ | ||||
| 		/* Send a signal to the socket so that the | ||||
| 		FreeRTOS_recvfrom will get interrupted. */ | ||||
| 		FreeRTOS_SignalSocket( xUDPSocket ); | ||||
| 	} | ||||
| 	else | ||||
| 	#endif | ||||
| 	if( xNTPWakeupSem != NULL ) | ||||
| 	{ | ||||
| 		xSemaphoreGive( xNTPWakeupSem ); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void vStartNTPTask( uint16_t usTaskStackSize, UBaseType_t uxTaskPriority ) | ||||
| { | ||||
| 	/* The only public function in this module: start a task to contact | ||||
| 	some NTP server. */ | ||||
|  | ||||
| 	if( xNTPTaskhandle != NULL ) | ||||
| 	{ | ||||
| 		switch( xStatus ) | ||||
| 		{ | ||||
| 		case EStatusPause: | ||||
| 			xStatus = EStatusAsking; | ||||
| 			vSignalTask(); | ||||
| 			break; | ||||
| 		case EStatusLookup: | ||||
| 			FreeRTOS_printf( ( "NTP looking up server\n" ) ); | ||||
| 			break; | ||||
| 		case EStatusAsking: | ||||
| 			FreeRTOS_printf( ( "NTP still asking\n" ) ); | ||||
| 			break; | ||||
| 		case EStatusFailed: | ||||
| 			FreeRTOS_printf( ( "NTP failed somehow\n" ) ); | ||||
| 			ulIPAddressFound = 0ul; | ||||
| 			xStatus = EStatusLookup; | ||||
| 			vSignalTask(); | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		xUDPSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP ); | ||||
| 		if( xUDPSocket != NULL ) | ||||
| 		{ | ||||
| 		struct freertos_sockaddr xAddress; | ||||
| 		#if( ipconfigUSE_CALLBACKS != 0 ) | ||||
| 			BaseType_t xReceiveTimeOut = pdMS_TO_TICKS( 0 ); | ||||
| 		#else | ||||
| 			BaseType_t xReceiveTimeOut = pdMS_TO_TICKS( 5000 ); | ||||
| 		#endif | ||||
|  | ||||
| 			xAddress.sin_addr = 0ul; | ||||
| 			xAddress.sin_port = FreeRTOS_htons( NTP_PORT ); | ||||
|  | ||||
| 			FreeRTOS_bind( xUDPSocket, &xAddress, sizeof( xAddress ) ); | ||||
| 			FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) ); | ||||
| 			xTaskCreate( 	prvNTPTask,						/* The function that implements the task. */ | ||||
| 							( const char * ) "NTP client",	/* Just a text name for the task to aid debugging. */ | ||||
| 							usTaskStackSize,				/* The stack size is defined in FreeRTOSIPConfig.h. */ | ||||
| 							NULL,							/* The task parameter, not used in this case. */ | ||||
| 							uxTaskPriority,					/* The priority assigned to the task is defined in FreeRTOSConfig.h. */ | ||||
| 							&xNTPTaskhandle );				/* The task handle. */ | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			FreeRTOS_printf( ( "Creating socket failed\n" ) ); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void vDNS_callback( const char *pcName, void *pvSearchID, uint32_t ulIPAddress ) | ||||
| { | ||||
| char pcBuf[16]; | ||||
|  | ||||
| 	/* The DNS lookup has a result, or it has reached the time-out. */ | ||||
| 	FreeRTOS_inet_ntoa( ulIPAddress, pcBuf ); | ||||
| 	FreeRTOS_printf( ( "IP address of %s found: %s\n", pcName, pcBuf ) ); | ||||
| 	if( ulIPAddressFound == 0ul ) | ||||
| 	{ | ||||
| 		ulIPAddressFound = ulIPAddress; | ||||
| 	} | ||||
| 	/* For testing: in case DNS doen't respond, still try some NTP server | ||||
| 	with a known IP-address. */ | ||||
| 	if( ulIPAddressFound == 0ul ) | ||||
| 	{ | ||||
| 		ulIPAddressFound = FreeRTOS_inet_addr_quick( 184, 105, 182, 7 ); | ||||
| /*		ulIPAddressFound = FreeRTOS_inet_addr_quick( 103, 242,  70, 4 );	*/ | ||||
| 	} | ||||
| 	xStatus = EStatusAsking; | ||||
|  | ||||
| 	vSignalTask(); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvSwapFields( struct SNtpPacket *pxPacket) | ||||
| { | ||||
| 	/* NTP messages are big-endian */ | ||||
| 	pxPacket->rootDelay = FreeRTOS_htonl( pxPacket->rootDelay ); | ||||
| 	pxPacket->rootDispersion = FreeRTOS_htonl( pxPacket->rootDispersion ); | ||||
|  | ||||
| 	pxPacket->referenceTimestamp.seconds = FreeRTOS_htonl( pxPacket->referenceTimestamp.seconds ); | ||||
| 	pxPacket->referenceTimestamp.fraction = FreeRTOS_htonl( pxPacket->referenceTimestamp.fraction ); | ||||
|  | ||||
| 	pxPacket->originateTimestamp.seconds = FreeRTOS_htonl( pxPacket->originateTimestamp.seconds ); | ||||
| 	pxPacket->originateTimestamp.fraction = FreeRTOS_htonl( pxPacket->originateTimestamp.fraction ); | ||||
|  | ||||
| 	pxPacket->receiveTimestamp.seconds = FreeRTOS_htonl( pxPacket->receiveTimestamp.seconds ); | ||||
| 	pxPacket->receiveTimestamp.fraction = FreeRTOS_htonl( pxPacket->receiveTimestamp.fraction ); | ||||
|  | ||||
| 	pxPacket->transmitTimestamp.seconds = FreeRTOS_htonl( pxPacket->transmitTimestamp.seconds ); | ||||
| 	pxPacket->transmitTimestamp.fraction = FreeRTOS_htonl( pxPacket->transmitTimestamp.fraction ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvNTPPacketInit( ) | ||||
| { | ||||
| 	memset (&xNTPPacket, '\0', sizeof( xNTPPacket ) ); | ||||
|  | ||||
| 	xNTPPacket.flags = 0xDB;				/* value 0xDB : mode 3 (client), version 3, leap indicator unknown 3 */ | ||||
| 	xNTPPacket.poll = 10;					/* 10 means 1 << 10 = 1024 seconds */ | ||||
| 	xNTPPacket.precision = 0xFA;			/* = 250 = 0.015625 seconds */ | ||||
| 	xNTPPacket.rootDelay = 0x5D2E;			/* 0x5D2E = 23854 or (23854/65535)= 0.3640 sec */ | ||||
| 	xNTPPacket.rootDispersion = 0x0008CAC8;	/* 0x0008CAC8 = 8.7912  seconds */ | ||||
|  | ||||
| 	/* use the recorded NTP time */ | ||||
| 	time_t uxSecs = FreeRTOS_time( NULL );/* apTime may be NULL, returns seconds */ | ||||
|  | ||||
| 	xNTPPacket.referenceTimestamp.seconds = uxSecs;	/* Current time */ | ||||
| 	xNTPPacket.transmitTimestamp.seconds = uxSecs + 3; | ||||
|  | ||||
| 	/* Transform the contents of the fields from native to big endian. */ | ||||
| 	prvSwapFields( &xNTPPacket ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvReadTime( struct SNtpPacket * pxPacket ) | ||||
| { | ||||
| 	FF_TimeStruct_t xTimeStruct; | ||||
| 	time_t uxPreviousSeconds; | ||||
| 	time_t uxPreviousMS; | ||||
|  | ||||
| 	time_t uxCurrentSeconds; | ||||
| 	time_t uxCurrentMS; | ||||
|  | ||||
| 	const char *pcTimeUnit; | ||||
| 	int32_t ilDiff; | ||||
| 	TickType_t uxTravelTime; | ||||
|  | ||||
| 	uxTravelTime = xTaskGetTickCount() - uxSendTime; | ||||
|  | ||||
| 	/* Transform the contents of the fields from big to native endian. */ | ||||
| 	prvSwapFields( pxPacket ); | ||||
|  | ||||
| 	uxCurrentSeconds = pxPacket->receiveTimestamp.seconds - TIME1970; | ||||
| 	uxCurrentMS = pxPacket->receiveTimestamp.fraction / 4294967; | ||||
| 	uxCurrentSeconds += uxCurrentMS / 1000; | ||||
| 	uxCurrentMS = uxCurrentMS % 1000; | ||||
|  | ||||
| 	// Get the last time recorded | ||||
| 	uxPreviousSeconds = FreeRTOS_get_secs_msec( &uxPreviousMS ); | ||||
|  | ||||
| 	// Set the new time with precision in msec. */ | ||||
| 	FreeRTOS_set_secs_msec( &uxCurrentSeconds, &uxCurrentMS ); | ||||
|  | ||||
| 	if( uxCurrentSeconds >= uxPreviousSeconds ) | ||||
| 	{ | ||||
| 		ilDiff = ( int32_t ) ( uxCurrentSeconds - uxPreviousSeconds ); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		ilDiff = 0 - ( int32_t ) ( uxPreviousSeconds - uxCurrentSeconds ); | ||||
| 	} | ||||
|  | ||||
| 	if( ( ilDiff < -5 ) || ( ilDiff > 5 ) ) | ||||
| 	{ | ||||
| 		/* More than 5 seconds difference. */ | ||||
| 		pcTimeUnit = "sec"; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* Less than or equal to 5 second difference. */ | ||||
| 		pcTimeUnit = "ms"; | ||||
| 		uint32_t ulLowest = ( uxCurrentSeconds <= uxPreviousSeconds ) ? uxCurrentSeconds : uxPreviousSeconds; | ||||
| 		int32_t iCurMS = 1000 * ( uxCurrentSeconds - ulLowest ) + uxCurrentMS; | ||||
| 		int32_t iPrevMS = 1000 * ( uxPreviousSeconds - ulLowest ) + uxPreviousMS; | ||||
| 		ilDiff = iCurMS - iPrevMS; | ||||
| 	} | ||||
| 	uxCurrentSeconds -= iTimeZone; | ||||
|  | ||||
| 	FreeRTOS_gmtime_r( &uxCurrentSeconds, &xTimeStruct ); | ||||
|  | ||||
| 	/* | ||||
| 		378.067 [NTP client] NTP time: 9/11/2015 16:11:19.559 Diff -20 ms (289 ms) | ||||
| 		379.441 [NTP client] NTP time: 9/11/2015 16:11:20.933 Diff 0 ms (263 ms) | ||||
| 	*/ | ||||
|  | ||||
| 	FreeRTOS_printf( ("NTP time: %d/%d/%02d %2d:%02d:%02d.%03u Diff %d %s (%lu ms)\n", | ||||
| 		xTimeStruct.tm_mday, | ||||
| 		xTimeStruct.tm_mon + 1, | ||||
| 		xTimeStruct.tm_year + 1900, | ||||
| 		xTimeStruct.tm_hour, | ||||
| 		xTimeStruct.tm_min, | ||||
| 		xTimeStruct.tm_sec, | ||||
| 		( unsigned )uxCurrentMS, | ||||
| 		( unsigned )ilDiff, | ||||
| 		pcTimeUnit, | ||||
| 		uxTravelTime ) ); | ||||
|  | ||||
| 	/* Remove compiler warnings in case FreeRTOS_printf() is not used. */ | ||||
| 	( void ) pcTimeUnit; | ||||
| 	( void ) uxTravelTime; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if( ipconfigUSE_CALLBACKS != 0 ) | ||||
|  | ||||
| 	static BaseType_t xOnUDPReceive( Socket_t xSocket, void * pvData, size_t xLength, | ||||
| 		const struct freertos_sockaddr *pxFrom, const struct freertos_sockaddr *pxDest ) | ||||
| 	{ | ||||
| 		if( xLength >= sizeof( xNTPPacket ) ) | ||||
| 		{ | ||||
| 			prvReadTime( ( struct SNtpPacket *)pvData ); | ||||
| 			if( xStatus != EStatusPause ) | ||||
| 			{ | ||||
| 				xStatus = EStatusPause; | ||||
| 			} | ||||
| 		} | ||||
| 		vSignalTask(); | ||||
| 		/* Tell the driver not to store the RX data */ | ||||
| 		return 1; | ||||
| 	} | ||||
| 	/*-----------------------------------------------------------*/ | ||||
|  | ||||
| #endif	/* ipconfigUSE_CALLBACKS != 0 */ | ||||
|  | ||||
| static void prvNTPTask( void *pvParameters ) | ||||
| { | ||||
| BaseType_t xServerIndex = 3; | ||||
| struct freertos_sockaddr xAddress; | ||||
| #if( ipconfigUSE_CALLBACKS != 0 ) | ||||
| 	F_TCP_UDP_Handler_t xHandler; | ||||
| #endif /* ipconfigUSE_CALLBACKS != 0 */ | ||||
|  | ||||
| 	xStatus = EStatusLookup; | ||||
| 	#if( ipconfigSOCKET_HAS_USER_SEMAPHORE != 0 ) || ( ipconfigUSE_CALLBACKS != 0 ) | ||||
| 	{ | ||||
| 		xNTPWakeupSem = xSemaphoreCreateBinary(); | ||||
| 	} | ||||
| 	#endif | ||||
|  | ||||
| 	#if( ipconfigUSE_CALLBACKS != 0 ) | ||||
| 	{ | ||||
| 		memset( &xHandler, '\0', sizeof( xHandler ) ); | ||||
| 		xHandler.pxOnUDPReceive = xOnUDPReceive; | ||||
| 		FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_UDP_RECV_HANDLER, ( void * ) &xHandler, sizeof( xHandler ) ); | ||||
| 	} | ||||
| 	#endif | ||||
| 	#if( ipconfigSOCKET_HAS_USER_SEMAPHORE != 0 ) | ||||
| 	{ | ||||
| 		FreeRTOS_setsockopt( xUDPSocket, 0, FREERTOS_SO_SET_SEMAPHORE, ( void * ) &xNTPWakeupSem, sizeof( xNTPWakeupSem ) ); | ||||
| 	} | ||||
| 	#endif | ||||
| 	for( ; ; ) | ||||
| 	{ | ||||
| 		switch( xStatus ) | ||||
| 		{ | ||||
| 		case EStatusLookup: | ||||
| 			if( ( ulIPAddressFound == 0ul ) || ( ulIPAddressFound == ~0ul ) ) | ||||
| 			{ | ||||
| 				if( ++xServerIndex == sizeof( pcTimeServers ) / sizeof( pcTimeServers[ 0 ] ) ) | ||||
| 				{ | ||||
| 					xServerIndex = 0; | ||||
| 				} | ||||
| 				FreeRTOS_printf( ( "Looking up server '%s'\n", pcTimeServers[ xServerIndex ] ) ); | ||||
| 				FreeRTOS_gethostbyname_a( pcTimeServers[ xServerIndex ], vDNS_callback, (void *)NULL, 1200 ); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				xStatus = EStatusAsking; | ||||
| 			} | ||||
| 			break; | ||||
|  | ||||
| 		case EStatusAsking: | ||||
| 			{ | ||||
| 			char pcBuf[16]; | ||||
|  | ||||
| 				prvNTPPacketInit( ); | ||||
| 				xAddress.sin_addr = ulIPAddressFound; | ||||
| 				xAddress.sin_port = FreeRTOS_htons( NTP_PORT ); | ||||
|  | ||||
| 				FreeRTOS_inet_ntoa( xAddress.sin_addr, pcBuf ); | ||||
| 				FreeRTOS_printf( ( "Sending UDP message to %s:%u\n", | ||||
| 					pcBuf, | ||||
| 					FreeRTOS_ntohs( xAddress.sin_port ) ) ); | ||||
|  | ||||
| 				uxSendTime = xTaskGetTickCount( ); | ||||
| 				FreeRTOS_sendto( xUDPSocket, ( void * )&xNTPPacket, sizeof( xNTPPacket ), 0, &xAddress, sizeof( xAddress ) ); | ||||
| 			} | ||||
| 			break; | ||||
|  | ||||
| 		case EStatusPause: | ||||
| 			break; | ||||
|  | ||||
| 		case EStatusFailed: | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		#if( ipconfigUSE_CALLBACKS != 0 ) | ||||
| 		{ | ||||
| 			xSemaphoreTake( xNTPWakeupSem, 5000 ); | ||||
| 		} | ||||
| 		#else | ||||
| 		{ | ||||
| 		uint32_t xAddressSize; | ||||
| 		BaseType_t xReturned; | ||||
|  | ||||
| 			xAddressSize = sizeof( xAddress ); | ||||
| 			xReturned = FreeRTOS_recvfrom( xUDPSocket, ( void * ) cRecvBuffer, sizeof( cRecvBuffer ), 0, &xAddress, &xAddressSize ); | ||||
| 			switch( xReturned ) | ||||
| 			{ | ||||
| 			case 0: | ||||
| 			case -pdFREERTOS_ERRNO_EAGAIN: | ||||
| 			case -pdFREERTOS_ERRNO_EINTR: | ||||
| 				break; | ||||
| 			default: | ||||
| 				if( xReturned < sizeof( xNTPPacket ) ) | ||||
| 				{ | ||||
| 					FreeRTOS_printf( ( "FreeRTOS_recvfrom: returns %ld\n", xReturned ) ); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					prvReadTime( ( struct SNtpPacket *)cRecvBuffer ); | ||||
| 					if( xStatus != EStatusPause ) | ||||
| 					{ | ||||
| 						xStatus = EStatusPause; | ||||
| 					} | ||||
| 				} | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 		#endif | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
| @@ -0,0 +1,133 @@ | ||||
| /* | ||||
|  * FreeRTOS+TCP V2.0.1 | ||||
|  * 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 | ||||
|  */ | ||||
|  | ||||
| #ifndef	__FTPCMD_H__ | ||||
|  | ||||
| #define	__FTPCMD_H__ | ||||
|  | ||||
| #define REPL_110 "110 Restart marker reply.\r\n" | ||||
| #define REPL_120 "120 Try again in 2 minutes.\r\n" | ||||
| #define REPL_125 "125 Data connection already open; transfer starting.\r\n" | ||||
| #define REPL_150 "150 File status okay; about to open data connection.\r\n" | ||||
| #define REPL_200 "200 NOOP command successful.\r\n" | ||||
| #define REPL_200_PROGRESS "200 NOOP: data transfer in progress.\r\n" | ||||
| #define REPL_202 "202 Command not implemented, superfluous at this site.\r\n" | ||||
| #define REPL_211 "221 System status, or system help reply.\r\n" | ||||
| #define REPL_211_STATUS "221-status of %s.\r\n" | ||||
| #define REPL_211_END "221 End of status.\r\n" | ||||
| #define REPL_212 "212 Directory status.\r\n" | ||||
| #define REPL_213 "213 File status.\r\n" | ||||
| #define REPL_214 "214 Help message.\r\n" | ||||
| #define REPL_214_END "214 End Help message.\r\n" | ||||
| #define REPL_215 "215 %s system type.\r\n" | ||||
| #define REPL_220 "220 Service ready for new user.\r\n" | ||||
| #define REPL_221 "221 Service closing control connection.\r\n" | ||||
| #define REPL_225 "225 Data connection open; no transfer in progress.\r\n" | ||||
| #define REPL_226 "226 Closing data connection.\r\n" | ||||
| #define REPL_227 "227 Entering Passive Mode (%s,%s,%s,%s,%s,%s).\r\n" | ||||
| #define REPL_227_D "227 Entering Passive Mode (%u,%u,%u,%u,%u,%u).\r\n" | ||||
| #define REPL_230 "230 User logged in, proceed.\r\n" | ||||
| #define REPL_250 "250 Requested file action okay, completed.\r\n" | ||||
| #define REPL_257 "257 %s created.\r\n" | ||||
| //	#define REPL_257_PWD "257 \"%s\" is current working dir.\r\n" | ||||
| #define REPL_257_PWD "257 \"%s\"\r\n" | ||||
| #define REPL_331 "331 Only anonymous user is accepted.\r\n" | ||||
| #define REPL_331_ANON "331 Anonymous login okay\r\n" | ||||
| #define REPL_332 "332 Need account for login.\r\n" | ||||
| #define REPL_350 "350 Requested file action pending further information.\r\n" | ||||
| #define REPL_421 "421 Service not available, closing control connection.\r\n" | ||||
| #define REPL_425 "425 Can't open data connection.\r\n" | ||||
| #define REPL_426 "426 Connection closed; transfer aborted.\r\n" | ||||
| #define REPL_450 "450 Requested file action not taken.\r\n" | ||||
| #define REPL_451 "451 Requested action aborted. Local error in processing.\r\n" | ||||
| #define REPL_452 "452 Requested action not taken.\r\n" | ||||
| #define REPL_500 "500 Syntax error, command unrecognized.\r\n" | ||||
| #define REPL_501 "501 Syntax error in parameters or arguments.\r\n" | ||||
| #define REPL_502 "502 Command not implemented.\r\n" | ||||
| #define REPL_503 "503 Bad sequence of commands.\r\n" | ||||
| #define REPL_504 "504 Command not implemented for that parameter.\r\n" | ||||
| #define REPL_530 "530 Not logged in.\r\n" | ||||
| #define REPL_532 "532 Need account for storing files.\r\n" | ||||
| #define REPL_550 "550 Requested action not taken.\r\n" | ||||
| #define REPL_551 "551 Requested action aborted. Page type unknown.\r\n" | ||||
| #define REPL_552 "552 Requested file action aborted.\r\n" | ||||
| #define REPL_553 "553 Requested action not taken.\r\n" | ||||
| #define REPL_553_READ_ONLY "553 Read-only file-system.\r\n" | ||||
|  | ||||
| enum EFTPCommand { | ||||
| 	ECMD_USER, | ||||
| 	ECMD_PASS, | ||||
| 	ECMD_ACCT, | ||||
| 	ECMD_CWD, | ||||
| 	ECMD_CDUP, | ||||
| 	ECMD_SMNT, | ||||
| 	ECMD_QUIT, | ||||
| 	ECMD_REIN, | ||||
| 	ECMD_PORT, | ||||
| 	ECMD_PASV, | ||||
| 	ECMD_TYPE, | ||||
| 	ECMD_STRU, | ||||
| 	ECMD_MODE, | ||||
| 	ECMD_RETR, | ||||
| 	ECMD_STOR, | ||||
| 	ECMD_STOU, | ||||
| 	ECMD_APPE, | ||||
| 	ECMD_ALLO, | ||||
| 	ECMD_REST, | ||||
| 	ECMD_RNFR, | ||||
| 	ECMD_RNTO, | ||||
| 	ECMD_ABOR, | ||||
| 	ECMD_SIZE, | ||||
| 	ECMD_MDTM, | ||||
| 	ECMD_DELE, | ||||
| 	ECMD_RMD, | ||||
| 	ECMD_MKD, | ||||
| 	ECMD_PWD, | ||||
| 	ECMD_LIST, | ||||
| 	ECMD_NLST, | ||||
| 	ECMD_SITE, | ||||
| 	ECMD_SYST, | ||||
| 	ECMD_FEAT, | ||||
| 	ECMD_STAT, | ||||
| 	ECMD_HELP, | ||||
| 	ECMD_NOOP, | ||||
| 	ECMD_EMPTY, | ||||
| 	ECMD_CLOSE, | ||||
| 	ECMD_UNKNOWN, | ||||
| }; | ||||
|  | ||||
| typedef struct xFTP_COMMAND { | ||||
| 	BaseType_t xCommandLength; | ||||
| 	const char pcCommandName[7]; | ||||
| 	const unsigned char ucCommandType; | ||||
| 	const unsigned char checkLogin; | ||||
| 	const unsigned char checkNullArg; | ||||
| } FTPCommand_t; | ||||
|  | ||||
| #define	FTP_CMD_COUNT	(ECMD_UNKNOWN+1) | ||||
|  | ||||
| extern const FTPCommand_t xFTPCommands[ FTP_CMD_COUNT ]; | ||||
|  | ||||
| #endif	// __FTPCMD_H__ | ||||
| @@ -0,0 +1,67 @@ | ||||
| /* | ||||
|  * 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 | ||||
|  */ | ||||
| #ifndef FREERTOS_HTTP_COMMANDS_H | ||||
| #define	FREERTOS_HTTP_COMMANDS_H | ||||
|  | ||||
| enum { | ||||
| 	WEB_REPLY_OK = 200, | ||||
| 	WEB_NO_CONTENT = 204, | ||||
| 	WEB_BAD_REQUEST = 400, | ||||
| 	WEB_UNAUTHORIZED = 401, | ||||
| 	WEB_NOT_FOUND = 404, | ||||
| 	WEB_GONE = 410, | ||||
| 	WEB_PRECONDITION_FAILED = 412, | ||||
| 	WEB_INTERNAL_SERVER_ERROR = 500, | ||||
| }; | ||||
|  | ||||
| enum EWebCommand { | ||||
| 	ECMD_GET, | ||||
| 	ECMD_HEAD, | ||||
| 	ECMD_POST, | ||||
| 	ECMD_PUT, | ||||
| 	ECMD_DELETE, | ||||
| 	ECMD_TRACE, | ||||
| 	ECMD_OPTIONS, | ||||
| 	ECMD_CONNECT, | ||||
| 	ECMD_PATCH, | ||||
| 	ECMD_UNK, | ||||
| }; | ||||
|  | ||||
| struct xWEB_COMMAND | ||||
| { | ||||
| 	BaseType_t xCommandLength; | ||||
| 	const char *pcCommandName; | ||||
| 	const unsigned char ucCommandType; | ||||
| }; | ||||
|  | ||||
| #define	WEB_CMD_COUNT	(ECMD_UNK+1) | ||||
|  | ||||
| extern const struct xWEB_COMMAND xWebCommands[WEB_CMD_COUNT]; | ||||
|  | ||||
| extern const char *webCodename (int aCode); | ||||
|  | ||||
| #endif	/* FREERTOS_HTTP_COMMANDS_H */ | ||||
|  | ||||
|  | ||||
| @@ -0,0 +1,125 @@ | ||||
| /* | ||||
|  * 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 en FTP | ||||
| */ | ||||
|  | ||||
| #ifndef FREERTOS_TCP_SERVER_H | ||||
| #define	FREERTOS_TCP_SERVER_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #ifndef	FTP_SERVER_USES_RELATIVE_DIRECTORY | ||||
| 	#define	FTP_SERVER_USES_RELATIVE_DIRECTORY		0 | ||||
| #endif | ||||
|  | ||||
| enum eSERVER_TYPE | ||||
| { | ||||
| 	eSERVER_NONE, | ||||
| 	eSERVER_HTTP, | ||||
| 	eSERVER_FTP, | ||||
| }; | ||||
|  | ||||
| struct xFTP_CLIENT; | ||||
|  | ||||
| #if( ipconfigFTP_HAS_RECEIVED_HOOK != 0 ) | ||||
| 	extern void vApplicationFTPReceivedHook( const char *pcFileName, uint32_t ulSize, struct xFTP_CLIENT *pxFTPClient ); | ||||
| 	extern void vFTPReplyMessage( struct xFTP_CLIENT *pxFTPClient, const char *pcMessage ); | ||||
| #endif /* ipconfigFTP_HAS_RECEIVED_HOOK != 0 */ | ||||
|  | ||||
| #if( ipconfigFTP_HAS_USER_PASSWORD_HOOK != 0 ) | ||||
| 	/* | ||||
| 	 * Function is called when a user name has been submitted. | ||||
| 	 * The function may return a string such as: "331 Please enter your password" | ||||
| 	 * or return NULL to use the default reply. | ||||
| 	 */ | ||||
| 	extern const char *pcApplicationFTPUserHook( const char *pcUserName ); | ||||
| #endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */ | ||||
|  | ||||
| #if( ipconfigFTP_HAS_USER_PASSWORD_HOOK != 0 ) | ||||
| 	/* | ||||
| 	 * Function is called when a password was received. | ||||
| 	 * Return positive value to allow the user | ||||
| 	 */ | ||||
| 	extern BaseType_t xApplicationFTPPasswordHook( const char *pcUserName, const char *pcPassword ); | ||||
| #endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */ | ||||
|  | ||||
| #if( ipconfigFTP_HAS_USER_PROPERTIES_HOOK != 0 ) | ||||
| 	/* | ||||
| 	 * The FTP server is asking for user-specific properties | ||||
| 	 */ | ||||
| 	typedef struct | ||||
| 	{ | ||||
| 		uint16_t usPortNumber;	/* For reference only. Host-endian. */ | ||||
| 		const char *pcRootDir; | ||||
| 		BaseType_t xReadOnly; | ||||
| 	} | ||||
| 	FTPUserProperties_t; | ||||
| 	extern void vApplicationFTPUserPropertiesHook( const char *pcUserName, FTPUserProperties_t *pxProperties ); | ||||
| #endif /* ipconfigFTP_HAS_USER_PASSWORD_HOOK */ | ||||
|  | ||||
| #if( ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK != 0 ) | ||||
| 	/* | ||||
| 	 * A GET request is received containing a special character, | ||||
| 	 * usually a question mark. | ||||
| 	 * const char *pcURLData;	// A request, e.g. "/request?limit=75" | ||||
| 	 * char *pcBuffer;			// Here the answer can be written | ||||
| 	 * size_t uxBufferLength;	// Size of the buffer | ||||
| 	 * | ||||
| 	 */ | ||||
| 	extern size_t uxApplicationHTTPHandleRequestHook( const char *pcURLData, char *pcBuffer, size_t uxBufferLength ); | ||||
| #endif /* ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK */ | ||||
|  | ||||
| struct xSERVER_CONFIG | ||||
| { | ||||
| 	enum eSERVER_TYPE eType;		/* eSERVER_HTTP | eSERVER_FTP */ | ||||
| 	BaseType_t xPortNumber;			/* e.g. 80, 8080, 21 */ | ||||
| 	BaseType_t xBackLog;			/* e.g. 10, maximum number of connected TCP clients */ | ||||
| 	const char * const pcRootDir;	/* Treat this directory as the root directory */ | ||||
| }; | ||||
|  | ||||
| struct xTCP_SERVER; | ||||
| typedef struct xTCP_SERVER TCPServer_t; | ||||
|  | ||||
| TCPServer_t *FreeRTOS_CreateTCPServer( const struct xSERVER_CONFIG *pxConfigs, BaseType_t xCount ); | ||||
| void FreeRTOS_TCPServerWork( TCPServer_t *pxServer, TickType_t xBlockingTime ); | ||||
|  | ||||
| #if( ipconfigSUPPORT_SIGNALS != 0 ) | ||||
| 	/* FreeRTOS_TCPServerWork() calls select(). | ||||
| 	The two functions below provide a possibility to interrupt | ||||
| 	the call to select(). After the interruption, resume | ||||
| 	by calling FreeRTOS_TCPServerWork() again. */ | ||||
| 	BaseType_t FreeRTOS_TCPServerSignal( TCPServer_t *pxServer ); | ||||
| 	BaseType_t FreeRTOS_TCPServerSignalFromISR( TCPServer_t *pxServer, BaseType_t *pxHigherPriorityTaskWoken ); | ||||
| #endif | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } /* extern "C" */ | ||||
| #endif | ||||
|  | ||||
| #endif /* FREERTOS_TCP_SERVER_H */ | ||||
| @@ -0,0 +1,185 @@ | ||||
| /* | ||||
|  * 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 */ | ||||
| @@ -0,0 +1,71 @@ | ||||
| // | ||||
| //	ntpClient.h | ||||
| // | ||||
|  | ||||
| #ifndef	__NTPCLIENT_H__ | ||||
|  | ||||
| #define __NTPCLIENT_H__ | ||||
|  | ||||
| #define NTP_PORT	123 | ||||
|  | ||||
| typedef uint32_t quint32; | ||||
| typedef int32_t qint32; | ||||
| typedef uint8_t quint8; | ||||
| typedef int8_t qint8; | ||||
|  | ||||
| typedef union _SNtpFlags  SNtpFlags; | ||||
|  | ||||
| /** | ||||
|  * 64-bit NTP timestamp. | ||||
|  */ | ||||
| struct __attribute__ ((__packed__)) _SNtpTimestamp { | ||||
|   /** Number of seconds passed since Jan 1 1900, in big-endian format. */ | ||||
|   quint32 seconds; | ||||
|  | ||||
|   /** Fractional time part, in <tt>1/0xFFFFFFFF</tt>s of a second. */ | ||||
|   quint32 fraction; | ||||
| }; | ||||
|  | ||||
| typedef struct _SNtpTimestamp SNtpTimestamp; | ||||
| /** | ||||
|  * Mandatory part of an NTP packet | ||||
|  */ | ||||
| struct SNtpPacket { | ||||
|   /** Flags. */ | ||||
|   unsigned char flags;  // value 0xDB : mode 3 (client), version 3, leap indicator unknown 3 | ||||
|  | ||||
|   /** Stratum of the clock. */ | ||||
|   quint8 stratum;  // value 0 : unspecified | ||||
|  | ||||
|   /** Maximum interval between successive messages, in log2 seconds. Note that the value is signed. */ | ||||
|   qint8 poll;  // 10 means 1 << 10 = 1024 seconds | ||||
|  | ||||
|   /** Precision of the clock, in log2 seconds. Note that the value is signed. */ | ||||
|   qint8 precision; // 0xFA = 250 = 0.015625 seconds | ||||
|  | ||||
|   /** Round trip time to the primary reference source, in NTP short format. */ | ||||
|   qint32 rootDelay; // 0x5D2E = 23854 or (23854/65535)= 0.3640 sec | ||||
|  | ||||
|   /** Nominal error relative to the primary reference source. */ | ||||
|   qint32 rootDispersion; // 0x0008 CAC8 = 8.7912  seconds | ||||
|  | ||||
|   /** Reference identifier (either a 4 character string or an IP address). */ | ||||
|   qint8 referenceID[4]; // or just 0000 | ||||
|  | ||||
|   /** The time at which the clock was last set or corrected. */ | ||||
|   SNtpTimestamp referenceTimestamp; // Current time | ||||
|  | ||||
|   /** The time at which the request departed the client for the server. */ | ||||
|   SNtpTimestamp originateTimestamp; // Keep 0 | ||||
|  | ||||
|   /** The time at which the request arrived at the server. */ | ||||
|   SNtpTimestamp receiveTimestamp; // Keep 0 | ||||
|  | ||||
|   /** The time at which the reply departed the server for client. */ | ||||
|   SNtpTimestamp transmitTimestamp; | ||||
| }; | ||||
|  | ||||
| /* Add this number to get secs since 1-1-1900 */ | ||||
| #define TIME1970 2208988800UL | ||||
|  | ||||
| #endif // __NTPCLIENT_H__ | ||||
| @@ -0,0 +1,11 @@ | ||||
| /* | ||||
|  * A simple demo for NTP using FreeRTOS+TCP | ||||
|  */ | ||||
|  | ||||
| #ifndef NTPDEMO_H | ||||
|  | ||||
| #define NTPDEMO_H | ||||
|  | ||||
| void vStartNTPTask( uint16_t usTaskStackSize, UBaseType_t uxTaskPriority ); | ||||
|  | ||||
| #endif | ||||
| @@ -0,0 +1,530 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| /* FreeRTOS+CLI includes. */ | ||||
| #include "FreeRTOS_CLI.h" | ||||
|  | ||||
| /* File system includes. */ | ||||
| #include "fat_sl.h" | ||||
| #include "api_mdriver_ram.h" | ||||
|  | ||||
| #ifdef _WINDOWS_ | ||||
| 	#define snprintf _snprintf | ||||
| #endif | ||||
|  | ||||
| #define cliNEW_LINE		"\r\n" | ||||
|  | ||||
| /******************************************************************************* | ||||
|  * See the URL in the comments within main.c for the location of the online | ||||
|  * documentation. | ||||
|  ******************************************************************************/ | ||||
|  | ||||
| /* | ||||
|  * Print out information on a single file. | ||||
|  */ | ||||
| static void prvCreateFileInfoString( char *pcBuffer, F_FIND *pxFindStruct ); | ||||
|  | ||||
| /* | ||||
|  * Copies an existing file into a newly created file. | ||||
|  */ | ||||
| static BaseType_t prvPerformCopy( const char *pcSourceFile, | ||||
| 									int32_t lSourceFileLength, | ||||
| 									const char *pcDestinationFile, | ||||
| 									char *pxWriteBuffer, | ||||
| 									size_t xWriteBufferLen ); | ||||
|  | ||||
| /* | ||||
|  * Implements the DIR command. | ||||
|  */ | ||||
| static BaseType_t prvDIRCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Implements the CD command. | ||||
|  */ | ||||
| static BaseType_t prvCDCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Implements the DEL command. | ||||
|  */ | ||||
| static BaseType_t prvDELCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Implements the TYPE command. | ||||
|  */ | ||||
| static BaseType_t prvTYPECommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Implements the COPY command. | ||||
|  */ | ||||
| static BaseType_t prvCOPYCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* Structure that defines the DIR command line command, which lists all the | ||||
| files in the current directory. */ | ||||
| static const CLI_Command_Definition_t xDIR = | ||||
| { | ||||
| 	"dir", /* The command string to type. */ | ||||
| 	"\r\ndir:\r\n Lists the files in the current directory\r\n", | ||||
| 	prvDIRCommand, /* The function to run. */ | ||||
| 	0 /* No parameters are expected. */ | ||||
| }; | ||||
|  | ||||
| /* Structure that defines the CD command line command, which changes the | ||||
| working directory. */ | ||||
| static const CLI_Command_Definition_t xCD = | ||||
| { | ||||
| 	"cd", /* The command string to type. */ | ||||
| 	"\r\ncd <dir name>:\r\n Changes the working directory\r\n", | ||||
| 	prvCDCommand, /* The function to run. */ | ||||
| 	1 /* One parameter is expected. */ | ||||
| }; | ||||
|  | ||||
| /* Structure that defines the TYPE command line command, which prints the | ||||
| contents of a file to the console. */ | ||||
| static const CLI_Command_Definition_t xTYPE = | ||||
| { | ||||
| 	"type", /* The command string to type. */ | ||||
| 	"\r\ntype <filename>:\r\n Prints file contents to the terminal\r\n", | ||||
| 	prvTYPECommand, /* The function to run. */ | ||||
| 	1 /* One parameter is expected. */ | ||||
| }; | ||||
|  | ||||
| /* Structure that defines the DEL command line command, which deletes a file. */ | ||||
| static const CLI_Command_Definition_t xDEL = | ||||
| { | ||||
| 	"del", /* The command string to type. */ | ||||
| 	"\r\ndel <filename>:\r\n deletes a file or directory\r\n", | ||||
| 	prvDELCommand, /* The function to run. */ | ||||
| 	1 /* One parameter is expected. */ | ||||
| }; | ||||
|  | ||||
| /* Structure that defines the COPY command line command, which deletes a file. */ | ||||
| static const CLI_Command_Definition_t xCOPY = | ||||
| { | ||||
| 	"copy", /* The command string to type. */ | ||||
| 	"\r\ncopy <source file> <dest file>:\r\n Copies <source file> to <dest file>\r\n", | ||||
| 	prvCOPYCommand, /* The function to run. */ | ||||
| 	2 /* Two parameters are expected. */ | ||||
| }; | ||||
|  | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vRegisterFileSystemCLICommands( void ) | ||||
| { | ||||
| 	/* Register all the command line commands defined immediately above. */ | ||||
| 	FreeRTOS_CLIRegisterCommand( &xDIR ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xCD ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xTYPE ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xDEL ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xCOPY ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvTYPECommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char *pcParameter; | ||||
| BaseType_t xParameterStringLength, xReturn = pdTRUE; | ||||
| static F_FILE *pxFile = NULL; | ||||
| int iChar; | ||||
| size_t xByte; | ||||
| size_t xColumns = 50U; | ||||
|  | ||||
| 	/* Ensure there is always a null terminator after each character written. */ | ||||
| 	memset( pcWriteBuffer, 0x00, xWriteBufferLen ); | ||||
|  | ||||
| 	/* Ensure the buffer leaves space for the \r\n. */ | ||||
| 	configASSERT( xWriteBufferLen > ( strlen( cliNEW_LINE ) * 2 ) ); | ||||
| 	xWriteBufferLen -= strlen( cliNEW_LINE ); | ||||
|  | ||||
| 	if( xWriteBufferLen < xColumns ) | ||||
| 	{ | ||||
| 		/* Ensure the loop that uses xColumns as an end condition does not | ||||
| 		write off the end of the buffer. */ | ||||
| 		xColumns = xWriteBufferLen; | ||||
| 	} | ||||
|  | ||||
| 	if( pxFile == NULL ) | ||||
| 	{ | ||||
| 		/* The file has not been opened yet.  Find the file name. */ | ||||
| 		pcParameter = FreeRTOS_CLIGetParameter | ||||
| 						( | ||||
| 							pcCommandString,		/* The command string itself. */ | ||||
| 							1,						/* Return the first parameter. */ | ||||
| 							&xParameterStringLength	/* Store the parameter string length. */ | ||||
| 						); | ||||
|  | ||||
| 		/* Sanity check something was returned. */ | ||||
| 		configASSERT( pcParameter ); | ||||
|  | ||||
| 		/* Attempt to open the requested file. */ | ||||
| 		pxFile = f_open( pcParameter, "r" ); | ||||
| 	} | ||||
|  | ||||
| 	if( pxFile != NULL ) | ||||
| 	{ | ||||
| 		/* Read the next chunk of data from the file. */ | ||||
| 		for( xByte = 0; xByte < xColumns; xByte++ ) | ||||
| 		{ | ||||
| 			iChar = f_getc( pxFile ); | ||||
|  | ||||
| 			if( iChar == -1 ) | ||||
| 			{ | ||||
| 				/* No more characters to return. */ | ||||
| 				f_close( pxFile ); | ||||
| 				pxFile = NULL; | ||||
| 				break; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				pcWriteBuffer[ xByte ] = ( char ) iChar; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if( pxFile == NULL ) | ||||
| 	{ | ||||
| 		/* Either the file was not opened, or all the data from the file has | ||||
| 		been returned and the file is now closed. */ | ||||
| 		xReturn = pdFALSE; | ||||
| 	} | ||||
|  | ||||
| 	strcat( pcWriteBuffer, cliNEW_LINE ); | ||||
|  | ||||
| 	return xReturn; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvCDCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char *pcParameter; | ||||
| BaseType_t xParameterStringLength; | ||||
| unsigned char ucReturned; | ||||
| size_t xStringLength; | ||||
|  | ||||
| 	/* Obtain the parameter string. */ | ||||
| 	pcParameter = FreeRTOS_CLIGetParameter | ||||
| 					( | ||||
| 						pcCommandString,		/* The command string itself. */ | ||||
| 						1,						/* Return the first parameter. */ | ||||
| 						&xParameterStringLength	/* Store the parameter string length. */ | ||||
| 					); | ||||
|  | ||||
| 	/* Sanity check something was returned. */ | ||||
| 	configASSERT( pcParameter ); | ||||
|  | ||||
| 	/* Attempt to move to the requested directory. */ | ||||
| 	ucReturned = f_chdir( pcParameter ); | ||||
|  | ||||
| 	if( ucReturned == F_NO_ERROR ) | ||||
| 	{ | ||||
| 		sprintf( pcWriteBuffer, "In: " ); | ||||
| 		xStringLength = strlen( pcWriteBuffer ); | ||||
| 		f_getcwd( &( pcWriteBuffer[ xStringLength ] ), ( unsigned char ) ( xWriteBufferLen - xStringLength ) ); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		sprintf( pcWriteBuffer, "Error" ); | ||||
| 	} | ||||
|  | ||||
| 	strcat( pcWriteBuffer, cliNEW_LINE ); | ||||
|  | ||||
| 	return pdFALSE; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvDIRCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| static F_FIND *pxFindStruct = NULL; | ||||
| unsigned char ucReturned; | ||||
| BaseType_t xReturn = pdFALSE; | ||||
|  | ||||
| 	/* This assumes pcWriteBuffer is long enough. */ | ||||
| 	( void ) pcCommandString; | ||||
|  | ||||
| 	/* Ensure the buffer leaves space for the \r\n. */ | ||||
| 	configASSERT( xWriteBufferLen > ( strlen( cliNEW_LINE ) * 2 ) ); | ||||
| 	xWriteBufferLen -= strlen( cliNEW_LINE ); | ||||
|  | ||||
| 	if( pxFindStruct == NULL ) | ||||
| 	{ | ||||
| 		/* This is the first time this function has been executed since the Dir | ||||
| 		command was run.  Create the find structure. */ | ||||
| 		pxFindStruct = ( F_FIND * ) pvPortMalloc( sizeof( F_FIND ) ); | ||||
|  | ||||
| 		if( pxFindStruct != NULL ) | ||||
| 		{ | ||||
| 			ucReturned = f_findfirst( "*.*", pxFindStruct ); | ||||
|  | ||||
| 			if( ucReturned == F_NO_ERROR ) | ||||
| 			{ | ||||
| 				prvCreateFileInfoString( pcWriteBuffer, pxFindStruct ); | ||||
| 				xReturn = pdPASS; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				snprintf( pcWriteBuffer, xWriteBufferLen, "Error: f_findfirst() failed." ); | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			snprintf( pcWriteBuffer, xWriteBufferLen, "Failed to allocate RAM (using heap_4.c will prevent fragmentation)." ); | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* The find struct has already been created.  Find the next file in | ||||
| 		the directory. */ | ||||
| 		ucReturned = f_findnext( pxFindStruct ); | ||||
|  | ||||
| 		if( ucReturned == F_NO_ERROR ) | ||||
| 		{ | ||||
| 			prvCreateFileInfoString( pcWriteBuffer, pxFindStruct ); | ||||
| 			xReturn = pdPASS; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* There are no more files.  Free the find structure. */ | ||||
| 			vPortFree( pxFindStruct ); | ||||
| 			pxFindStruct = NULL; | ||||
|  | ||||
| 			/* No string to return. */ | ||||
| 			pcWriteBuffer[ 0 ] = 0x00; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	strcat( pcWriteBuffer, cliNEW_LINE ); | ||||
|  | ||||
| 	return xReturn; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvDELCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char *pcParameter; | ||||
| BaseType_t xParameterStringLength; | ||||
| unsigned char ucReturned; | ||||
|  | ||||
| 	/* This function assumes xWriteBufferLen is large enough! */ | ||||
| 	( void ) xWriteBufferLen; | ||||
|  | ||||
| 	/* Obtain the parameter string. */ | ||||
| 	pcParameter = FreeRTOS_CLIGetParameter | ||||
| 					( | ||||
| 						pcCommandString,		/* The command string itself. */ | ||||
| 						1,						/* Return the first parameter. */ | ||||
| 						&xParameterStringLength	/* Store the parameter string length. */ | ||||
| 					); | ||||
|  | ||||
| 	/* Sanity check something was returned. */ | ||||
| 	configASSERT( pcParameter ); | ||||
|  | ||||
| 	/* Attempt to delete the file. */ | ||||
| 	ucReturned = f_delete( pcParameter ); | ||||
|  | ||||
| 	if( ucReturned == F_NO_ERROR ) | ||||
| 	{ | ||||
| 		sprintf( pcWriteBuffer, "%s was deleted", pcParameter ); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		sprintf( pcWriteBuffer, "Error" ); | ||||
| 	} | ||||
|  | ||||
| 	strcat( pcWriteBuffer, cliNEW_LINE ); | ||||
|  | ||||
| 	return pdFALSE; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvCOPYCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| char *pcSourceFile, *pcDestinationFile; | ||||
| BaseType_t xParameterStringLength; | ||||
| long lSourceLength, lDestinationLength = 0; | ||||
|  | ||||
| 	/* Obtain the name of the destination file. */ | ||||
| 	pcDestinationFile = ( char * ) FreeRTOS_CLIGetParameter | ||||
| 									( | ||||
| 										pcCommandString,		/* The command string itself. */ | ||||
| 										2,						/* Return the second parameter. */ | ||||
| 										&xParameterStringLength	/* Store the parameter string length. */ | ||||
| 									); | ||||
|  | ||||
| 	/* Sanity check something was returned. */ | ||||
| 	configASSERT( pcDestinationFile ); | ||||
|  | ||||
| 	/* Obtain the name of the source file. */ | ||||
| 	pcSourceFile = ( char * ) FreeRTOS_CLIGetParameter | ||||
| 								( | ||||
| 									pcCommandString,		/* The command string itself. */ | ||||
| 									1,						/* Return the first parameter. */ | ||||
| 									&xParameterStringLength	/* Store the parameter string length. */ | ||||
| 								); | ||||
|  | ||||
| 	/* Sanity check something was returned. */ | ||||
| 	configASSERT( pcSourceFile ); | ||||
|  | ||||
| 	/* Terminate the string. */ | ||||
| 	pcSourceFile[ xParameterStringLength ] = 0x00; | ||||
|  | ||||
| 	/* See if the source file exists, obtain its length if it does. */ | ||||
| 	lSourceLength = f_filelength( pcSourceFile ); | ||||
|  | ||||
| 	if( lSourceLength == 0 ) | ||||
| 	{ | ||||
| 		sprintf( pcWriteBuffer, "Source file does not exist" ); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* See if the destination file exists. */ | ||||
| 		lDestinationLength = f_filelength( pcDestinationFile ); | ||||
|  | ||||
| 		if( lDestinationLength != 0 ) | ||||
| 		{ | ||||
| 			sprintf( pcWriteBuffer, "Error: Destination file already exists" ); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* Continue only if the source file exists and the destination file does | ||||
| 	not exist. */ | ||||
| 	if( ( lSourceLength != 0 ) && ( lDestinationLength == 0 ) ) | ||||
| 	{ | ||||
| 		if( prvPerformCopy( pcSourceFile, lSourceLength, pcDestinationFile, pcWriteBuffer, xWriteBufferLen ) == pdPASS ) | ||||
| 		{ | ||||
| 			sprintf( pcWriteBuffer, "Copy made" ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			sprintf( pcWriteBuffer, "Error during copy" ); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	strcat( pcWriteBuffer, cliNEW_LINE ); | ||||
|  | ||||
| 	return pdFALSE; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvPerformCopy( const char *pcSourceFile, | ||||
| 									int32_t lSourceFileLength, | ||||
| 									const char *pcDestinationFile, | ||||
| 									char *pxWriteBuffer, | ||||
| 									size_t xWriteBufferLen ) | ||||
| { | ||||
| int32_t lBytesRead = 0, lBytesToRead, lBytesRemaining; | ||||
| F_FILE *pxFile; | ||||
| BaseType_t xReturn = pdPASS; | ||||
|  | ||||
| 	/* NOTE:  Error handling has been omitted for clarity. */ | ||||
|  | ||||
| 	while( lBytesRead < lSourceFileLength ) | ||||
| 	{ | ||||
| 		/* How many bytes are left? */ | ||||
| 		lBytesRemaining = lSourceFileLength - lBytesRead; | ||||
|  | ||||
| 		/* How many bytes should be read this time around the loop.  Can't | ||||
| 		read more bytes than will fit into the buffer. */ | ||||
| 		if( lBytesRemaining > ( long ) xWriteBufferLen ) | ||||
| 		{ | ||||
| 			lBytesToRead = ( long ) xWriteBufferLen; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			lBytesToRead = lBytesRemaining; | ||||
| 		} | ||||
|  | ||||
| 		/* Open the source file, seek past the data that has already been | ||||
| 		read from the file, read the next block of data, then close the | ||||
| 		file again so the destination file can be opened. */ | ||||
| 		pxFile = f_open( pcSourceFile, "r" ); | ||||
| 		if( pxFile != NULL ) | ||||
| 		{ | ||||
| 			f_seek( pxFile, lBytesRead, F_SEEK_SET ); | ||||
| 			f_read( pxWriteBuffer, lBytesToRead, 1, pxFile ); | ||||
| 			f_close( pxFile ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			xReturn = pdFAIL; | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		/* Open the destination file and write the block of data to the end of | ||||
| 		the file. */ | ||||
| 		pxFile = f_open( pcDestinationFile, "a" ); | ||||
| 		if( pxFile != NULL ) | ||||
| 		{ | ||||
| 			f_write( pxWriteBuffer, lBytesToRead, 1, pxFile ); | ||||
| 			f_close( pxFile ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			xReturn = pdFAIL; | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		lBytesRead += lBytesToRead; | ||||
| 	} | ||||
|  | ||||
| 	return xReturn; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvCreateFileInfoString( char *pcBuffer, F_FIND *pxFindStruct ) | ||||
| { | ||||
| const char *pcWritableFile = "writable file", *pcReadOnlyFile = "read only file", *pcDirectory = "directory"; | ||||
| const char * pcAttrib; | ||||
|  | ||||
| 	/* Point pcAttrib to a string that describes the file. */ | ||||
| 	if( ( pxFindStruct->attr & F_ATTR_DIR ) != 0 ) | ||||
| 	{ | ||||
| 		pcAttrib = pcDirectory; | ||||
| 	} | ||||
| 	else if( pxFindStruct->attr & F_ATTR_READONLY ) | ||||
| 	{ | ||||
| 		pcAttrib = pcReadOnlyFile; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		pcAttrib = pcWritableFile; | ||||
| 	} | ||||
|  | ||||
| 	/* Create a string that includes the file name, the file size and the | ||||
| 	attributes string. */ | ||||
| 	sprintf( pcBuffer, "%s [%s] [size=%d]", pxFindStruct->filename, pcAttrib, ( int ) pxFindStruct->filesize ); | ||||
| } | ||||
| @@ -0,0 +1,480 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
|  | ||||
|  /****************************************************************************** | ||||
|  * | ||||
|  * http://www.FreeRTOS.org/cli | ||||
|  * | ||||
|  ******************************************************************************/ | ||||
|  | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| /* FreeRTOS+CLI includes. */ | ||||
| #include "FreeRTOS_CLI.h" | ||||
|  | ||||
| #ifndef  configINCLUDE_TRACE_RELATED_CLI_COMMANDS | ||||
| 	#define configINCLUDE_TRACE_RELATED_CLI_COMMANDS 0 | ||||
| #endif | ||||
|  | ||||
| #ifndef configINCLUDE_QUERY_HEAP_COMMAND | ||||
| 	#define configINCLUDE_QUERY_HEAP_COMMAND 0 | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * The function that registers the commands that are defined within this file. | ||||
|  */ | ||||
| void vRegisterSampleCLICommands( void ); | ||||
|  | ||||
| /* | ||||
|  * Implements the task-stats command. | ||||
|  */ | ||||
| static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Implements the run-time-stats command. | ||||
|  */ | ||||
| #if( configGENERATE_RUN_TIME_STATS == 1 ) | ||||
| 	static BaseType_t prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
| #endif /* configGENERATE_RUN_TIME_STATS */ | ||||
|  | ||||
| /* | ||||
|  * Implements the echo-three-parameters command. | ||||
|  */ | ||||
| static BaseType_t prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Implements the echo-parameters command. | ||||
|  */ | ||||
| static BaseType_t prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Implements the "query heap" command. | ||||
|  */ | ||||
| #if( configINCLUDE_QUERY_HEAP_COMMAND == 1 ) | ||||
| 	static BaseType_t prvQueryHeapCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Implements the "trace start" and "trace stop" commands; | ||||
|  */ | ||||
| #if( configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 ) | ||||
| 	static BaseType_t prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
| #endif | ||||
|  | ||||
| /* Structure that defines the "task-stats" command line command.  This generates | ||||
| a table that gives information on each task in the system. */ | ||||
| static const CLI_Command_Definition_t xTaskStats = | ||||
| { | ||||
| 	"task-stats", /* The command string to type. */ | ||||
| 	"\r\ntask-stats:\r\n Displays a table showing the state of each FreeRTOS task\r\n", | ||||
| 	prvTaskStatsCommand, /* The function to run. */ | ||||
| 	0 /* No parameters are expected. */ | ||||
| }; | ||||
|  | ||||
| /* Structure that defines the "echo_3_parameters" command line command.  This | ||||
| takes exactly three parameters that the command simply echos back one at a | ||||
| time. */ | ||||
| static const CLI_Command_Definition_t xThreeParameterEcho = | ||||
| { | ||||
| 	"echo-3-parameters", | ||||
| 	"\r\necho-3-parameters <param1> <param2> <param3>:\r\n Expects three parameters, echos each in turn\r\n", | ||||
| 	prvThreeParameterEchoCommand, /* The function to run. */ | ||||
| 	3 /* Three parameters are expected, which can take any value. */ | ||||
| }; | ||||
|  | ||||
| /* Structure that defines the "echo_parameters" command line command.  This | ||||
| takes a variable number of parameters that the command simply echos back one at | ||||
| a time. */ | ||||
| static const CLI_Command_Definition_t xParameterEcho = | ||||
| { | ||||
| 	"echo-parameters", | ||||
| 	"\r\necho-parameters <...>:\r\n Take variable number of parameters, echos each in turn\r\n", | ||||
| 	prvParameterEchoCommand, /* The function to run. */ | ||||
| 	-1 /* The user can enter any number of commands. */ | ||||
| }; | ||||
|  | ||||
| #if( configGENERATE_RUN_TIME_STATS == 1 ) | ||||
| 	/* Structure that defines the "run-time-stats" command line command.   This | ||||
| 	generates a table that shows how much run time each task has */ | ||||
| 	static const CLI_Command_Definition_t xRunTimeStats = | ||||
| 	{ | ||||
| 		"run-time-stats", /* The command string to type. */ | ||||
| 		"\r\nrun-time-stats:\r\n Displays a table showing how much processing time each FreeRTOS task has used\r\n", | ||||
| 		prvRunTimeStatsCommand, /* The function to run. */ | ||||
| 		0 /* No parameters are expected. */ | ||||
| 	}; | ||||
| #endif /* configGENERATE_RUN_TIME_STATS */ | ||||
|  | ||||
| #if( configINCLUDE_QUERY_HEAP_COMMAND == 1 ) | ||||
| 	/* Structure that defines the "query_heap" command line command. */ | ||||
| 	static const CLI_Command_Definition_t xQueryHeap = | ||||
| 	{ | ||||
| 		"query-heap", | ||||
| 		"\r\nquery-heap:\r\n Displays the free heap space, and minimum ever free heap space.\r\n", | ||||
| 		prvQueryHeapCommand, /* The function to run. */ | ||||
| 		0 /* The user can enter any number of commands. */ | ||||
| 	}; | ||||
| #endif /* configQUERY_HEAP_COMMAND */ | ||||
|  | ||||
| #if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 | ||||
| 	/* Structure that defines the "trace" command line command.  This takes a single | ||||
| 	parameter, which can be either "start" or "stop". */ | ||||
| 	static const CLI_Command_Definition_t xStartStopTrace = | ||||
| 	{ | ||||
| 		"trace", | ||||
| 		"\r\ntrace [start | stop]:\r\n Starts or stops a trace recording for viewing in FreeRTOS+Trace\r\n", | ||||
| 		prvStartStopTraceCommand, /* The function to run. */ | ||||
| 		1 /* One parameter is expected.  Valid values are "start" and "stop". */ | ||||
| 	}; | ||||
| #endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */ | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vRegisterSampleCLICommands( void ) | ||||
| { | ||||
| 	/* Register all the command line commands defined immediately above. */ | ||||
| 	FreeRTOS_CLIRegisterCommand( &xTaskStats );	 | ||||
| 	FreeRTOS_CLIRegisterCommand( &xThreeParameterEcho ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xParameterEcho ); | ||||
|  | ||||
| 	#if( configGENERATE_RUN_TIME_STATS == 1 ) | ||||
| 	{ | ||||
| 		FreeRTOS_CLIRegisterCommand( &xRunTimeStats ); | ||||
| 	} | ||||
| 	#endif | ||||
| 	 | ||||
| 	#if( configINCLUDE_QUERY_HEAP_COMMAND == 1 ) | ||||
| 	{ | ||||
| 		FreeRTOS_CLIRegisterCommand( &xQueryHeap ); | ||||
| 	} | ||||
| 	#endif | ||||
|  | ||||
| 	#if( configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 ) | ||||
| 	{ | ||||
| 		FreeRTOS_CLIRegisterCommand( &xStartStopTrace ); | ||||
| 	} | ||||
| 	#endif | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char *const pcHeader = "     State   Priority  Stack    #\r\n************************************************\r\n"; | ||||
| BaseType_t xSpacePadding; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	/* Generate a table of task stats. */ | ||||
| 	strcpy( pcWriteBuffer, "Task" ); | ||||
| 	pcWriteBuffer += strlen( pcWriteBuffer ); | ||||
|  | ||||
| 	/* Minus three for the null terminator and half the number of characters in | ||||
| 	"Task" so the column lines up with the centre of the heading. */ | ||||
| 	configASSERT( configMAX_TASK_NAME_LEN > 3 ); | ||||
| 	for( xSpacePadding = strlen( "Task" ); xSpacePadding < ( configMAX_TASK_NAME_LEN - 3 ); xSpacePadding++ ) | ||||
| 	{ | ||||
| 		/* Add a space to align columns after the task's name. */ | ||||
| 		*pcWriteBuffer = ' '; | ||||
| 		pcWriteBuffer++; | ||||
|  | ||||
| 		/* Ensure always terminated. */ | ||||
| 		*pcWriteBuffer = 0x00; | ||||
| 	} | ||||
| 	strcpy( pcWriteBuffer, pcHeader ); | ||||
| 	vTaskList( pcWriteBuffer + strlen( pcHeader ) ); | ||||
|  | ||||
| 	/* There is no more data to return after this single string, so return | ||||
| 	pdFALSE. */ | ||||
| 	return pdFALSE; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if( configINCLUDE_QUERY_HEAP_COMMAND == 1 ) | ||||
|  | ||||
| 	static BaseType_t prvQueryHeapCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| 	{ | ||||
| 		/* Remove compile time warnings about unused parameters, and check the | ||||
| 		write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 		write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 		( void ) pcCommandString; | ||||
| 		( void ) xWriteBufferLen; | ||||
| 		configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 		sprintf( pcWriteBuffer, "Current free heap %d bytes, minimum ever free heap %d bytes\r\n", ( int ) xPortGetFreeHeapSize(), ( int ) xPortGetMinimumEverFreeHeapSize() ); | ||||
|  | ||||
| 		/* There is no more data to return after this single string, so return | ||||
| 		pdFALSE. */ | ||||
| 		return pdFALSE; | ||||
| 	} | ||||
|  | ||||
| #endif /* configINCLUDE_QUERY_HEAP */ | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if( configGENERATE_RUN_TIME_STATS == 1 ) | ||||
| 	 | ||||
| 	static BaseType_t prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| 	{ | ||||
| 	const char * const pcHeader = "  Abs Time      % Time\r\n****************************************\r\n"; | ||||
| 	BaseType_t xSpacePadding; | ||||
|  | ||||
| 		/* Remove compile time warnings about unused parameters, and check the | ||||
| 		write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 		write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 		( void ) pcCommandString; | ||||
| 		( void ) xWriteBufferLen; | ||||
| 		configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 		/* Generate a table of task stats. */ | ||||
| 		strcpy( pcWriteBuffer, "Task" ); | ||||
| 		pcWriteBuffer += strlen( pcWriteBuffer ); | ||||
|  | ||||
| 		/* Pad the string "task" with however many bytes necessary to make it the | ||||
| 		length of a task name.  Minus three for the null terminator and half the | ||||
| 		number of characters in	"Task" so the column lines up with the centre of | ||||
| 		the heading. */ | ||||
| 		for( xSpacePadding = strlen( "Task" ); xSpacePadding < ( configMAX_TASK_NAME_LEN - 3 ); xSpacePadding++ ) | ||||
| 		{ | ||||
| 			/* Add a space to align columns after the task's name. */ | ||||
| 			*pcWriteBuffer = ' '; | ||||
| 			pcWriteBuffer++; | ||||
|  | ||||
| 			/* Ensure always terminated. */ | ||||
| 			*pcWriteBuffer = 0x00; | ||||
| 		} | ||||
|  | ||||
| 		strcpy( pcWriteBuffer, pcHeader ); | ||||
| 		vTaskGetRunTimeStats( pcWriteBuffer + strlen( pcHeader ) ); | ||||
|  | ||||
| 		/* There is no more data to return after this single string, so return | ||||
| 		pdFALSE. */ | ||||
| 		return pdFALSE; | ||||
| 	} | ||||
| 	 | ||||
| #endif /* configGENERATE_RUN_TIME_STATS */ | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char *pcParameter; | ||||
| BaseType_t xParameterStringLength, xReturn; | ||||
| static UBaseType_t uxParameterNumber = 0; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	if( uxParameterNumber == 0 ) | ||||
| 	{ | ||||
| 		/* The first time the function is called after the command has been | ||||
| 		entered just a header string is returned. */ | ||||
| 		sprintf( pcWriteBuffer, "The three parameters were:\r\n" ); | ||||
|  | ||||
| 		/* Next time the function is called the first parameter will be echoed | ||||
| 		back. */ | ||||
| 		uxParameterNumber = 1U; | ||||
|  | ||||
| 		/* There is more data to be returned as no parameters have been echoed | ||||
| 		back yet. */ | ||||
| 		xReturn = pdPASS; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* Obtain the parameter string. */ | ||||
| 		pcParameter = FreeRTOS_CLIGetParameter | ||||
| 						( | ||||
| 							pcCommandString,		/* The command string itself. */ | ||||
| 							uxParameterNumber,		/* Return the next parameter. */ | ||||
| 							&xParameterStringLength	/* Store the parameter string length. */ | ||||
| 						); | ||||
|  | ||||
| 		/* Sanity check something was returned. */ | ||||
| 		configASSERT( pcParameter ); | ||||
|  | ||||
| 		/* Return the parameter string. */ | ||||
| 		memset( pcWriteBuffer, 0x00, xWriteBufferLen ); | ||||
| 		sprintf( pcWriteBuffer, "%d: ", ( int ) uxParameterNumber ); | ||||
| 		strncat( pcWriteBuffer, pcParameter, ( size_t ) xParameterStringLength ); | ||||
| 		strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) ); | ||||
|  | ||||
| 		/* If this is the last of the three parameters then there are no more | ||||
| 		strings to return after this one. */ | ||||
| 		if( uxParameterNumber == 3U ) | ||||
| 		{ | ||||
| 			/* If this is the last of the three parameters then there are no more | ||||
| 			strings to return after this one. */ | ||||
| 			xReturn = pdFALSE; | ||||
| 			uxParameterNumber = 0; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* There are more parameters to return after this one. */ | ||||
| 			xReturn = pdTRUE; | ||||
| 			uxParameterNumber++; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return xReturn; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char *pcParameter; | ||||
| BaseType_t xParameterStringLength, xReturn; | ||||
| static UBaseType_t uxParameterNumber = 0; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	if( uxParameterNumber == 0 ) | ||||
| 	{ | ||||
| 		/* The first time the function is called after the command has been | ||||
| 		entered just a header string is returned. */ | ||||
| 		sprintf( pcWriteBuffer, "The parameters were:\r\n" ); | ||||
|  | ||||
| 		/* Next time the function is called the first parameter will be echoed | ||||
| 		back. */ | ||||
| 		uxParameterNumber = 1U; | ||||
|  | ||||
| 		/* There is more data to be returned as no parameters have been echoed | ||||
| 		back yet. */ | ||||
| 		xReturn = pdPASS; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* Obtain the parameter string. */ | ||||
| 		pcParameter = FreeRTOS_CLIGetParameter | ||||
| 						( | ||||
| 							pcCommandString,		/* The command string itself. */ | ||||
| 							uxParameterNumber,		/* Return the next parameter. */ | ||||
| 							&xParameterStringLength	/* Store the parameter string length. */ | ||||
| 						); | ||||
|  | ||||
| 		if( pcParameter != NULL ) | ||||
| 		{ | ||||
| 			/* Return the parameter string. */ | ||||
| 			memset( pcWriteBuffer, 0x00, xWriteBufferLen ); | ||||
| 			sprintf( pcWriteBuffer, "%d: ", ( int ) uxParameterNumber ); | ||||
| 			strncat( pcWriteBuffer, ( char * ) pcParameter, ( size_t ) xParameterStringLength ); | ||||
| 			strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) ); | ||||
|  | ||||
| 			/* There might be more parameters to return after this one. */ | ||||
| 			xReturn = pdTRUE; | ||||
| 			uxParameterNumber++; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* No more parameters were found.  Make sure the write buffer does | ||||
| 			not contain a valid string. */ | ||||
| 			pcWriteBuffer[ 0 ] = 0x00; | ||||
|  | ||||
| 			/* No more data to return. */ | ||||
| 			xReturn = pdFALSE; | ||||
|  | ||||
| 			/* Start over the next time this command is executed. */ | ||||
| 			uxParameterNumber = 0; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return xReturn; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 | ||||
|  | ||||
| 	static BaseType_t prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| 	{ | ||||
| 	const char *pcParameter; | ||||
| 	BaseType_t lParameterStringLength; | ||||
|  | ||||
| 		/* Remove compile time warnings about unused parameters, and check the | ||||
| 		write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 		write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 		( void ) pcCommandString; | ||||
| 		( void ) xWriteBufferLen; | ||||
| 		configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 		/* Obtain the parameter string. */ | ||||
| 		pcParameter = FreeRTOS_CLIGetParameter | ||||
| 						( | ||||
| 							pcCommandString,		/* The command string itself. */ | ||||
| 							1,						/* Return the first parameter. */ | ||||
| 							&lParameterStringLength	/* Store the parameter string length. */ | ||||
| 						); | ||||
|  | ||||
| 		/* Sanity check something was returned. */ | ||||
| 		configASSERT( pcParameter ); | ||||
|  | ||||
| 		/* There are only two valid parameter values. */ | ||||
| 		if( strncmp( pcParameter, "start", strlen( "start" ) ) == 0 ) | ||||
| 		{ | ||||
| 			/* Start or restart the trace. */ | ||||
| 			vTraceStop(); | ||||
| 			vTraceClear(); | ||||
| 			vTraceStart(); | ||||
|  | ||||
| 			sprintf( pcWriteBuffer, "Trace recording (re)started.\r\n" ); | ||||
| 		} | ||||
| 		else if( strncmp( pcParameter, "stop", strlen( "stop" ) ) == 0 ) | ||||
| 		{ | ||||
| 			/* End the trace, if one is running. */ | ||||
| 			vTraceStop(); | ||||
| 			sprintf( pcWriteBuffer, "Stopping trace recording.\r\n" ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			sprintf( pcWriteBuffer, "Valid parameters are 'start' and 'stop'.\r\n" ); | ||||
| 		} | ||||
|  | ||||
| 		/* There is no more data to return after this single string, so return | ||||
| 		pdFALSE. */ | ||||
| 		return pdFALSE; | ||||
| 	} | ||||
|  | ||||
| #endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */ | ||||
| @@ -0,0 +1,226 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * NOTE:  This file uses a third party USB CDC driver. | ||||
|  */ | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include "string.h" | ||||
| #include "stdio.h" | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
| #include "semphr.h" | ||||
|  | ||||
| /* Example includes. */ | ||||
| #include "FreeRTOS_CLI.h" | ||||
|  | ||||
| /* Demo application includes. */ | ||||
| #include "serial.h" | ||||
|  | ||||
| /* Dimensions the buffer into which input characters are placed. */ | ||||
| #define cmdMAX_INPUT_SIZE		50 | ||||
|  | ||||
| /* Dimentions a buffer to be used by the UART driver, if the UART driver uses a | ||||
| buffer at all. */ | ||||
| #define cmdQUEUE_LENGTH			25 | ||||
|  | ||||
| /* DEL acts as a backspace. */ | ||||
| #define cmdASCII_DEL		( 0x7F ) | ||||
|  | ||||
| /* The maximum time to wait for the mutex that guards the UART to become | ||||
| available. */ | ||||
| #define cmdMAX_MUTEX_WAIT		pdMS_TO_TICKS( 300 ) | ||||
|  | ||||
| #ifndef configCLI_BAUD_RATE | ||||
| 	#define configCLI_BAUD_RATE	115200 | ||||
| #endif | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* | ||||
|  * The task that implements the command console processing. | ||||
|  */ | ||||
| static void prvUARTCommandConsoleTask( void *pvParameters ); | ||||
| void vUARTCommandConsoleStart( uint16_t usStackSize, UBaseType_t uxPriority ); | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* Const messages output by the command console. */ | ||||
| static const char * const pcWelcomeMessage = "FreeRTOS command server.\r\nType Help to view a list of registered commands.\r\n\r\n>"; | ||||
| static const char * const pcEndOfOutputMessage = "\r\n[Press ENTER to execute the previous command again]\r\n>"; | ||||
| static const char * const pcNewLine = "\r\n"; | ||||
|  | ||||
| /* Used to guard access to the UART in case messages are sent to the UART from | ||||
| more than one task. */ | ||||
| static SemaphoreHandle_t xTxMutex = NULL; | ||||
|  | ||||
| /* The handle to the UART port, which is not used by all ports. */ | ||||
| static xComPortHandle xPort = 0; | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vUARTCommandConsoleStart( uint16_t usStackSize, UBaseType_t uxPriority ) | ||||
| { | ||||
| 	/* Create the semaphore used to access the UART Tx. */ | ||||
| 	xTxMutex = xSemaphoreCreateMutex(); | ||||
| 	configASSERT( xTxMutex ); | ||||
|  | ||||
| 	/* Create that task that handles the console itself. */ | ||||
| 	xTaskCreate( 	prvUARTCommandConsoleTask,	/* The task that implements the command console. */ | ||||
| 					"CLI",						/* Text name assigned to the task.  This is just to assist debugging.  The kernel does not use this name itself. */ | ||||
| 					usStackSize,				/* The size of the stack allocated to the task. */ | ||||
| 					NULL,						/* The parameter is not used, so NULL is passed. */ | ||||
| 					uxPriority,					/* The priority allocated to the task. */ | ||||
| 					NULL );						/* A handle is not required, so just pass NULL. */ | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvUARTCommandConsoleTask( void *pvParameters ) | ||||
| { | ||||
| signed char cRxedChar; | ||||
| uint8_t ucInputIndex = 0; | ||||
| char *pcOutputString; | ||||
| static char cInputString[ cmdMAX_INPUT_SIZE ], cLastInputString[ cmdMAX_INPUT_SIZE ]; | ||||
| BaseType_t xReturned; | ||||
| xComPortHandle xPort; | ||||
|  | ||||
| 	( void ) pvParameters; | ||||
|  | ||||
| 	/* Obtain the address of the output buffer.  Note there is no mutual | ||||
| 	exclusion on this buffer as it is assumed only one command console interface | ||||
| 	will be used at any one time. */ | ||||
| 	pcOutputString = FreeRTOS_CLIGetOutputBuffer(); | ||||
|  | ||||
| 	/* Initialise the UART. */ | ||||
| 	xPort = xSerialPortInitMinimal( configCLI_BAUD_RATE, cmdQUEUE_LENGTH ); | ||||
|  | ||||
| 	/* Send the welcome message. */ | ||||
| 	vSerialPutString( xPort, ( signed char * ) pcWelcomeMessage, ( unsigned short ) strlen( pcWelcomeMessage ) ); | ||||
|  | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		/* Wait for the next character.  The while loop is used in case | ||||
| 		INCLUDE_vTaskSuspend is not set to 1 - in which case portMAX_DELAY will | ||||
| 		be a genuine block time rather than an infinite block time. */ | ||||
| 		while( xSerialGetChar( xPort, &cRxedChar, portMAX_DELAY ) != pdPASS ); | ||||
|  | ||||
| 		/* Ensure exclusive access to the UART Tx. */ | ||||
| 		if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS ) | ||||
| 		{ | ||||
| 			/* Echo the character back. */ | ||||
| 			xSerialPutChar( xPort, cRxedChar, portMAX_DELAY ); | ||||
|  | ||||
| 			/* Was it the end of the line? */ | ||||
| 			if( cRxedChar == '\n' || cRxedChar == '\r' ) | ||||
| 			{ | ||||
| 				/* Just to space the output from the input. */ | ||||
| 				vSerialPutString( xPort, ( signed char * ) pcNewLine, ( unsigned short ) strlen( pcNewLine ) ); | ||||
|  | ||||
| 				/* See if the command is empty, indicating that the last command | ||||
| 				is to be executed again. */ | ||||
| 				if( ucInputIndex == 0 ) | ||||
| 				{ | ||||
| 					/* Copy the last command back into the input string. */ | ||||
| 					strcpy( cInputString, cLastInputString ); | ||||
| 				} | ||||
|  | ||||
| 				/* Pass the received command to the command interpreter.  The | ||||
| 				command interpreter is called repeatedly until it returns | ||||
| 				pdFALSE	(indicating there is no more output) as it might | ||||
| 				generate more than one string. */ | ||||
| 				do | ||||
| 				{ | ||||
| 					/* Get the next output string from the command interpreter. */ | ||||
| 					xReturned = FreeRTOS_CLIProcessCommand( cInputString, pcOutputString, configCOMMAND_INT_MAX_OUTPUT_SIZE ); | ||||
|  | ||||
| 					/* Write the generated string to the UART. */ | ||||
| 					vSerialPutString( xPort, ( signed char * ) pcOutputString, ( unsigned short ) strlen( pcOutputString ) ); | ||||
|  | ||||
| 				} while( xReturned != pdFALSE ); | ||||
|  | ||||
| 				/* All the strings generated by the input command have been | ||||
| 				sent.  Clear the input string ready to receive the next command. | ||||
| 				Remember the command that was just processed first in case it is | ||||
| 				to be processed again. */ | ||||
| 				strcpy( cLastInputString, cInputString ); | ||||
| 				ucInputIndex = 0; | ||||
| 				memset( cInputString, 0x00, cmdMAX_INPUT_SIZE ); | ||||
|  | ||||
| 				vSerialPutString( xPort, ( signed char * ) pcEndOfOutputMessage, ( unsigned short ) strlen( pcEndOfOutputMessage ) ); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				if( cRxedChar == '\r' ) | ||||
| 				{ | ||||
| 					/* Ignore the character. */ | ||||
| 				} | ||||
| 				else if( ( cRxedChar == '\b' ) || ( cRxedChar == cmdASCII_DEL ) ) | ||||
| 				{ | ||||
| 					/* Backspace was pressed.  Erase the last character in the | ||||
| 					string - if any. */ | ||||
| 					if( ucInputIndex > 0 ) | ||||
| 					{ | ||||
| 						ucInputIndex--; | ||||
| 						cInputString[ ucInputIndex ] = '\0'; | ||||
| 					} | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					/* A character was entered.  Add it to the string entered so | ||||
| 					far.  When a \n is entered the complete	string will be | ||||
| 					passed to the command interpreter. */ | ||||
| 					if( ( cRxedChar >= ' ' ) && ( cRxedChar <= '~' ) ) | ||||
| 					{ | ||||
| 						if( ucInputIndex < cmdMAX_INPUT_SIZE ) | ||||
| 						{ | ||||
| 							cInputString[ ucInputIndex ] = cRxedChar; | ||||
| 							ucInputIndex++; | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			/* Must ensure to give the mutex back. */ | ||||
| 			xSemaphoreGive( xTxMutex ); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vOutputString( const char * const pcMessage ) | ||||
| { | ||||
| 	if( xSemaphoreTake( xTxMutex, cmdMAX_MUTEX_WAIT ) == pdPASS ) | ||||
| 	{ | ||||
| 		vSerialPutString( xPort, ( signed char * ) pcMessage, ( unsigned short ) strlen( pcMessage ) ); | ||||
| 		xSemaphoreGive( xTxMutex ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| @@ -0,0 +1,313 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
|  /****************************************************************************** | ||||
|  * | ||||
|  * See the following URL for information on the commands defined in this file: | ||||
|  * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/Ethernet_Related_CLI_Commands.shtml | ||||
|  * | ||||
|  ******************************************************************************/ | ||||
|  | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| /* FreeRTOS+CLI includes. */ | ||||
| #include "FreeRTOS_CLI.h" | ||||
|  | ||||
| /* FreeRTOS+UDP includes, just to make the stats available to the CLI | ||||
| commands. */ | ||||
| #include "FreeRTOS_UDP_IP.h" | ||||
| #include "FreeRTOS_Sockets.h" | ||||
|  | ||||
| /* | ||||
|  * Defines a command that prints out IP address information. | ||||
|  */ | ||||
| static BaseType_t prvDisplayIPConfig( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Defines a command that prints out the gathered demo debug stats. | ||||
|  */ | ||||
| static BaseType_t prvDisplayIPDebugStats( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Defines a command that sends an ICMP ping request to an IP address. | ||||
|  */ | ||||
| static BaseType_t prvPingCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* Structure that defines the "ip-config" command line command. */ | ||||
| static const CLI_Command_Definition_t xIPConfig = | ||||
| { | ||||
| 	"ip-config", | ||||
| 	"ip-config:\r\n Displays IP address configuration\r\n\r\n", | ||||
| 	prvDisplayIPConfig, | ||||
| 	0 | ||||
| }; | ||||
|  | ||||
| #if configINCLUDE_DEMO_DEBUG_STATS != 0 | ||||
| 	/* Structure that defines the "ip-debug-stats" command line command. */ | ||||
| 	static const CLI_Command_Definition_t xIPDebugStats = | ||||
| 	{ | ||||
| 		"ip-debug-stats", /* The command string to type. */ | ||||
| 		"ip-debug-stats:\r\n Shows some IP stack stats useful for debug - an example only.\r\n\r\n", | ||||
| 		prvDisplayIPDebugStats, /* The function to run. */ | ||||
| 		0 /* No parameters are expected. */ | ||||
| 	}; | ||||
| #endif /* configINCLUDE_DEMO_DEBUG_STATS */ | ||||
|  | ||||
| #if ipconfigSUPPORT_OUTGOING_PINGS == 1 | ||||
|  | ||||
| 	/* Structure that defines the "ping" command line command.  This takes an IP | ||||
| 	address or host name and (optionally) the number of bytes to ping as | ||||
| 	parameters. */ | ||||
| 	static const CLI_Command_Definition_t xPing = | ||||
| 	{ | ||||
| 		"ping", | ||||
| 		"ping <ipaddress> <optional:bytes to send>:\r\n for example, ping 192.168.0.3 8, or ping www.example.com\r\n\r\n", | ||||
| 		prvPingCommand, /* The function to run. */ | ||||
| 		-1 /* Ping can take either one or two parameter, so the number of parameters has to be determined by the ping command implementation. */ | ||||
| 	}; | ||||
|  | ||||
| #endif /* ipconfigSUPPORT_OUTGOING_PINGS */ | ||||
|  | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vRegisterUDPCLICommands( void ) | ||||
| { | ||||
| 	/* Register all the command line commands defined immediately above. */ | ||||
| 	FreeRTOS_CLIRegisterCommand( &xIPConfig ); | ||||
|  | ||||
| 	#if configINCLUDE_DEMO_DEBUG_STATS == 1 | ||||
| 	{ | ||||
| 		FreeRTOS_CLIRegisterCommand( &xIPDebugStats ); | ||||
| 	} | ||||
| 	#endif /* configINCLUDE_DEMO_DEBUG_STATS */ | ||||
|  | ||||
| 	#if ipconfigSUPPORT_OUTGOING_PINGS == 1 | ||||
| 	{ | ||||
| 		FreeRTOS_CLIRegisterCommand( &xPing ); | ||||
| 	} | ||||
| 	#endif /* ipconfigSUPPORT_OUTGOING_PINGS */ | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if ipconfigSUPPORT_OUTGOING_PINGS == 1 | ||||
|  | ||||
| 	static BaseType_t prvPingCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| 	{ | ||||
| 	char * pcParameter; | ||||
| 	BaseType_t lParameterStringLength, xReturn; | ||||
| 	uint32_t ulIPAddress, ulBytesToPing; | ||||
| 	const uint32_t ulDefaultBytesToPing = 8UL; | ||||
| 	char cBuffer[ 16 ]; | ||||
|  | ||||
| 		/* Remove compile time warnings about unused parameters, and check the | ||||
| 		write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 		write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 		( void ) pcCommandString; | ||||
| 		( void ) xWriteBufferLen; | ||||
| 		configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 		/* Start with an empty string. */ | ||||
| 		pcWriteBuffer[ 0 ] = 0x00; | ||||
|  | ||||
| 		/* Obtain the number of bytes to ping. */ | ||||
| 		pcParameter = ( char * ) FreeRTOS_CLIGetParameter | ||||
| 								( | ||||
| 									pcCommandString,		/* The command string itself. */ | ||||
| 									2,						/* Return the second parameter. */ | ||||
| 									&lParameterStringLength	/* Store the parameter string length. */ | ||||
| 								); | ||||
|  | ||||
| 		if( pcParameter == NULL ) | ||||
| 		{ | ||||
| 			/* The number of bytes was not specified, so default it. */ | ||||
| 			ulBytesToPing = ulDefaultBytesToPing; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			ulBytesToPing = atol( pcParameter ); | ||||
| 		} | ||||
|  | ||||
| 		/* Obtain the IP address string. */ | ||||
| 		pcParameter = ( char * ) FreeRTOS_CLIGetParameter | ||||
| 								( | ||||
| 									pcCommandString,		/* The command string itself. */ | ||||
| 									1,						/* Return the first parameter. */ | ||||
| 									&lParameterStringLength	/* Store the parameter string length. */ | ||||
| 								); | ||||
|  | ||||
| 		/* Sanity check something was returned. */ | ||||
| 		configASSERT( pcParameter ); | ||||
|  | ||||
| 		/* Attempt to obtain the IP address.   If the first character is not a | ||||
| 		digit, assume the host name has been passed in. */ | ||||
| 		if( ( *pcParameter >= '0' ) && ( *pcParameter <= '9' ) ) | ||||
| 		{ | ||||
| 			ulIPAddress = FreeRTOS_inet_addr( pcParameter ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* Terminate the host name. */ | ||||
| 			pcParameter[ lParameterStringLength ] = 0x00; | ||||
|  | ||||
| 			/* Attempt to resolve host. */ | ||||
| 			ulIPAddress = FreeRTOS_gethostbyname( pcParameter ); | ||||
| 		} | ||||
|  | ||||
| 		/* Convert IP address, which may have come from a DNS lookup, to string. */ | ||||
| 		FreeRTOS_inet_ntoa( ulIPAddress, cBuffer ); | ||||
|  | ||||
| 		if( ulIPAddress != 0 ) | ||||
| 		{ | ||||
| 			xReturn = FreeRTOS_SendPingRequest( ulIPAddress, ( uint16_t ) ulBytesToPing, portMAX_DELAY ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			xReturn = pdFALSE; | ||||
| 		} | ||||
|  | ||||
| 		if( xReturn == pdFALSE ) | ||||
| 		{ | ||||
| 			sprintf( pcWriteBuffer, "%s", "Could not send ping request\r\n" ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			sprintf( pcWriteBuffer, "Ping sent to %s with identifier %d\r\n", cBuffer, ( int ) xReturn ); | ||||
| 		} | ||||
|  | ||||
| 		return pdFALSE; | ||||
| 	} | ||||
| 	/*-----------------------------------------------------------*/ | ||||
|  | ||||
| #endif /* ipconfigSUPPORT_OUTGOING_PINGS */ | ||||
|  | ||||
| #if configINCLUDE_DEMO_DEBUG_STATS != 0 | ||||
|  | ||||
| 	static BaseType_t prvDisplayIPDebugStats( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| 	{ | ||||
| 	static BaseType_t xIndex = -1; | ||||
| 	extern xExampleDebugStatEntry_t xIPTraceValues[]; | ||||
| 	BaseType_t xReturn; | ||||
|  | ||||
| 		/* Remove compile time warnings about unused parameters, and check the | ||||
| 		write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 		write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 		( void ) pcCommandString; | ||||
| 		( void ) xWriteBufferLen; | ||||
| 		configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 		xIndex++; | ||||
|  | ||||
| 		if( xIndex < xExampleDebugStatEntries() ) | ||||
| 		{ | ||||
| 			sprintf( pcWriteBuffer, "%s %d\r\n", ( char * ) xIPTraceValues[ xIndex ].pucDescription, ( int ) xIPTraceValues[ xIndex ].ulData ); | ||||
| 			xReturn = pdPASS; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* Reset the index for the next time it is called. */ | ||||
| 			xIndex = -1; | ||||
|  | ||||
| 			/* Ensure nothing remains in the write buffer. */ | ||||
| 			pcWriteBuffer[ 0 ] = 0x00; | ||||
| 			xReturn = pdFALSE; | ||||
| 		} | ||||
|  | ||||
| 		return xReturn; | ||||
| 	} | ||||
| 	/*-----------------------------------------------------------*/ | ||||
|  | ||||
| #endif /* configINCLUDE_DEMO_DEBUG_STATS */ | ||||
|  | ||||
| static BaseType_t prvDisplayIPConfig( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| static BaseType_t xIndex = 0; | ||||
| BaseType_t xReturn; | ||||
| uint32_t ulAddress; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	switch( xIndex ) | ||||
| 	{ | ||||
| 		case 0 : | ||||
| 			FreeRTOS_GetAddressConfiguration( &ulAddress, NULL, NULL, NULL ); | ||||
| 			sprintf( pcWriteBuffer, "\r\nIP address " ); | ||||
| 			xReturn = pdTRUE; | ||||
| 			xIndex++; | ||||
| 			break; | ||||
|  | ||||
| 		case 1 : | ||||
| 			FreeRTOS_GetAddressConfiguration( NULL, &ulAddress, NULL, NULL ); | ||||
| 			sprintf( pcWriteBuffer, "\r\nNet mask " ); | ||||
| 			xReturn = pdTRUE; | ||||
| 			xIndex++; | ||||
| 			break; | ||||
|  | ||||
| 		case 2 : | ||||
| 			FreeRTOS_GetAddressConfiguration( NULL, NULL, &ulAddress, NULL ); | ||||
| 			sprintf( pcWriteBuffer, "\r\nGateway address " ); | ||||
| 			xReturn = pdTRUE; | ||||
| 			xIndex++; | ||||
| 			break; | ||||
|  | ||||
| 		case 3 : | ||||
| 			FreeRTOS_GetAddressConfiguration( NULL, NULL, NULL, &ulAddress ); | ||||
| 			sprintf( pcWriteBuffer, "\r\nDNS server address " ); | ||||
| 			xReturn = pdTRUE; | ||||
| 			xIndex++; | ||||
| 			break; | ||||
|  | ||||
| 		default : | ||||
| 			ulAddress = 0; | ||||
| 			sprintf( pcWriteBuffer, "\r\n\r\n" ); | ||||
| 			xReturn = pdFALSE; | ||||
| 			xIndex = 0; | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| 	if( ulAddress != 0 ) | ||||
| 	{ | ||||
| 		FreeRTOS_inet_ntoa( ulAddress, ( &( pcWriteBuffer[ strlen( pcWriteBuffer ) ] ) ) ); | ||||
| 	} | ||||
|  | ||||
| 	return xReturn; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| @@ -0,0 +1,321 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /******************************************************************************* | ||||
|  * See the URL in the comments within main.c for the location of the online | ||||
|  * documentation. | ||||
|  ******************************************************************************/ | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
|  | ||||
| /* File system includes. */ | ||||
| #include "fat_sl.h" | ||||
| #include "api_mdriver_ram.h" | ||||
|  | ||||
| /* 8.3 format, plus null terminator. */ | ||||
| #define fsMAX_FILE_NAME_LEN				13 | ||||
|  | ||||
| /* The number of bytes read/written to the example files at a time. */ | ||||
| #define fsRAM_BUFFER_SIZE 				200 | ||||
|  | ||||
| /* The number of bytes written to the file that uses f_putc() and f_getc(). */ | ||||
| #define fsPUTC_FILE_SIZE				100 | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* | ||||
|  * Creates and verifies different files on the volume, demonstrating the use of | ||||
|  * various different API functions. | ||||
|  */ | ||||
| void vCreateAndVerifySampleFiles( void ); | ||||
|  | ||||
| /* | ||||
|  * Create a set of example files in the root directory of the volume using | ||||
|  * f_write(). | ||||
|  */ | ||||
| static void prvCreateDemoFilesUsing_f_write( void ); | ||||
|  | ||||
| /* | ||||
|  * Use f_read() to read back and verify the files that were created by | ||||
|  * prvCreateDemoFilesUsing_f_write(). | ||||
|  */ | ||||
| static void prvVerifyDemoFileUsing_f_read( void ); | ||||
|  | ||||
| /* | ||||
|  * Create an example file in a sub-directory using f_putc(). | ||||
|  */ | ||||
| static void prvCreateDemoFileUsing_f_putc( void ); | ||||
|  | ||||
| /* | ||||
|  * Use f_getc() to read back and verify the file that was created by | ||||
|  * prvCreateDemoFileUsing_f_putc(). | ||||
|  */ | ||||
| static void prvVerifyDemoFileUsing_f_getc( void ); | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* A buffer used to both create content to write to disk, and read content back | ||||
| from a disk.  Note there is no mutual exclusion on this buffer. */ | ||||
| static char cRAMBuffer[ fsRAM_BUFFER_SIZE ]; | ||||
|  | ||||
| /* Names of directories that are created. */ | ||||
| static const char *pcRoot = "/", *pcDirectory1 = "SUB1", *pcDirectory2 = "SUB2", *pcFullPath = "/SUB1/SUB2"; | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vCreateAndVerifySampleFiles( void ) | ||||
| { | ||||
| unsigned char ucStatus; | ||||
|  | ||||
| 	/* First create the volume. */ | ||||
| 	ucStatus = f_initvolume( ram_initfunc ); | ||||
|  | ||||
| 	/* It is expected that the volume is not formatted. */ | ||||
| 	if( ucStatus == F_ERR_NOTFORMATTED ) | ||||
| 	{ | ||||
| 		/* Format the created volume. */ | ||||
| 		ucStatus = f_format( F_FAT12_MEDIA ); | ||||
| 	} | ||||
|  | ||||
| 	if( ucStatus == F_NO_ERROR ) | ||||
| 	{ | ||||
| 		/* Create a set of files using f_write(). */ | ||||
| 		prvCreateDemoFilesUsing_f_write(); | ||||
|  | ||||
| 		/* Read back and verify the files that were created using f_write(). */ | ||||
| 		prvVerifyDemoFileUsing_f_read(); | ||||
|  | ||||
| 		/* Create sub directories two deep then create a file using putc. */ | ||||
| 		prvCreateDemoFileUsing_f_putc(); | ||||
|  | ||||
| 		/* Read back and verify the file created by | ||||
| 		prvCreateDemoFileUsing_f_putc(). */ | ||||
| 		prvVerifyDemoFileUsing_f_getc(); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvCreateDemoFilesUsing_f_write( void ) | ||||
| { | ||||
| BaseType_t xFileNumber, xWriteNumber; | ||||
| char cFileName[ fsMAX_FILE_NAME_LEN ]; | ||||
| const BaseType_t xMaxFiles = 5; | ||||
| long lItemsWritten; | ||||
| F_FILE *pxFile; | ||||
|  | ||||
| 	/* Create xMaxFiles files.  Each created file will be | ||||
| 	( xFileNumber * fsRAM_BUFFER_SIZE ) bytes in length, and filled | ||||
| 	with a different repeating character. */ | ||||
| 	for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ ) | ||||
| 	{ | ||||
| 		/* Generate a file name. */ | ||||
| 		sprintf( cFileName, "root%03d.txt", ( int ) xFileNumber ); | ||||
|  | ||||
| 		/* Obtain the current working directory and print out the file name and | ||||
| 		the	directory into which the file is being written. */ | ||||
| 		f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE ); | ||||
|  | ||||
| 		/* Open the file, creating the file if it does not already exist. */ | ||||
| 		pxFile = f_open( cFileName, "w" ); | ||||
| 		configASSERT( pxFile ); | ||||
|  | ||||
| 		/* Fill the RAM buffer with data that will be written to the file.  This | ||||
| 		is just a repeating ascii character that indicates the file number. */ | ||||
| 		memset( cRAMBuffer, ( int ) ( '0' + xFileNumber ), fsRAM_BUFFER_SIZE ); | ||||
|  | ||||
| 		/* Write the RAM buffer to the opened file a number of times.  The | ||||
| 		number of times the RAM buffer is written to the file depends on the | ||||
| 		file number, so the length of each created file will be different. */ | ||||
| 		for( xWriteNumber = 0; xWriteNumber < xFileNumber; xWriteNumber++ ) | ||||
| 		{ | ||||
| 			lItemsWritten = f_write( cRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile ); | ||||
| 			configASSERT( lItemsWritten == 1 ); | ||||
| 		} | ||||
|  | ||||
| 		/* Close the file so another file can be created. */ | ||||
| 		f_close( pxFile ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvVerifyDemoFileUsing_f_read( void ) | ||||
| { | ||||
| BaseType_t xFileNumber, xReadNumber; | ||||
| char cFileName[ fsMAX_FILE_NAME_LEN ]; | ||||
| const BaseType_t xMaxFiles = 5; | ||||
| long lItemsRead, lChar; | ||||
| F_FILE *pxFile; | ||||
|  | ||||
| 	/* Read back the files that were created by | ||||
| 	prvCreateDemoFilesUsing_f_write(). */ | ||||
| 	for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ ) | ||||
| 	{ | ||||
| 		/* Generate the file name. */ | ||||
| 		sprintf( cFileName, "root%03d.txt", ( int ) xFileNumber ); | ||||
|  | ||||
| 		/* Obtain the current working directory and print out the file name and | ||||
| 		the	directory from which the file is being read. */ | ||||
| 		f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE ); | ||||
|  | ||||
| 		/* Open the file for reading. */ | ||||
| 		pxFile = f_open( cFileName, "r" ); | ||||
| 		configASSERT( pxFile ); | ||||
|  | ||||
| 		/* Read the file into the RAM buffer, checking the file contents are as | ||||
| 		expected.  The size of the file depends on the file number. */ | ||||
| 		for( xReadNumber = 0; xReadNumber < xFileNumber; xReadNumber++ ) | ||||
| 		{ | ||||
| 			/* Start with the RAM buffer clear. */ | ||||
| 			memset( cRAMBuffer, 0x00, fsRAM_BUFFER_SIZE ); | ||||
|  | ||||
| 			lItemsRead = f_read( cRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile ); | ||||
| 			configASSERT( lItemsRead == 1 ); | ||||
|  | ||||
| 			/* Check the RAM buffer is filled with the expected data.  Each | ||||
| 			file contains a different repeating ascii character that indicates | ||||
| 			the number of the file. */ | ||||
| 			for( lChar = 0; lChar < fsRAM_BUFFER_SIZE; lChar++ ) | ||||
| 			{ | ||||
| 				configASSERT( cRAMBuffer[ lChar ] == ( '0' + ( char ) xFileNumber ) ); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		/* Close the file. */ | ||||
| 		f_close( pxFile ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvCreateDemoFileUsing_f_putc( void ) | ||||
| { | ||||
| unsigned char ucReturn; | ||||
| int iByte, iReturned; | ||||
| F_FILE *pxFile; | ||||
| char cFileName[ fsMAX_FILE_NAME_LEN ]; | ||||
|  | ||||
| 	/* Obtain and print out the working directory. */ | ||||
| 	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE ); | ||||
|  | ||||
| 	/* Create a sub directory. */ | ||||
| 	ucReturn = f_mkdir( pcDirectory1 ); | ||||
| 	configASSERT( ucReturn == F_NO_ERROR ); | ||||
|  | ||||
| 	/* Move into the created sub-directory. */ | ||||
| 	ucReturn = f_chdir( pcDirectory1 ); | ||||
| 	configASSERT( ucReturn == F_NO_ERROR ); | ||||
|  | ||||
| 	/* Obtain and print out the working directory. */ | ||||
| 	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE ); | ||||
|  | ||||
| 	/* Create a subdirectory in the new directory. */ | ||||
| 	ucReturn = f_mkdir( pcDirectory2 ); | ||||
| 	configASSERT( ucReturn == F_NO_ERROR ); | ||||
|  | ||||
| 	/* Move into the directory just created - now two directories down from | ||||
| 	the root. */ | ||||
| 	ucReturn = f_chdir( pcDirectory2 ); | ||||
| 	configASSERT( ucReturn == F_NO_ERROR ); | ||||
|  | ||||
| 	/* Obtain and print out the working directory. */ | ||||
| 	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE ); | ||||
| 	configASSERT( strcmp( cRAMBuffer, pcFullPath ) == 0 ); | ||||
|  | ||||
| 	/* Generate the file name. */ | ||||
| 	sprintf( cFileName, "%s.txt", pcDirectory2 ); | ||||
|  | ||||
| 	/* Print out the file name and the directory into which the file is being | ||||
| 	written. */ | ||||
| 	pxFile = f_open( cFileName, "w" ); | ||||
|  | ||||
| 	/* Create a file 1 byte at a time.  The file is filled with incrementing | ||||
| 	ascii characters starting from '0'. */ | ||||
| 	for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ ) | ||||
| 	{ | ||||
| 		iReturned = f_putc( ( ( int ) '0' + iByte ), pxFile ); | ||||
| 		configASSERT( iReturned ==  ( ( int ) '0' + iByte ) ); | ||||
| 	} | ||||
|  | ||||
| 	/* Finished so close the file. */ | ||||
| 	f_close( pxFile ); | ||||
|  | ||||
| 	/* Move back to the root directory. */ | ||||
| 	ucReturn = f_chdir( "../.." ); | ||||
| 	configASSERT( ucReturn == F_NO_ERROR ); | ||||
|  | ||||
| 	/* Obtain and print out the working directory. */ | ||||
| 	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE ); | ||||
| 	configASSERT( strcmp( cRAMBuffer, pcRoot ) == 0 ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvVerifyDemoFileUsing_f_getc( void ) | ||||
| { | ||||
| unsigned char ucReturn; | ||||
| int iByte, iReturned; | ||||
| F_FILE *pxFile; | ||||
| char cFileName[ fsMAX_FILE_NAME_LEN ]; | ||||
|  | ||||
| 	/* Move into the directory in which the file was created. */ | ||||
| 	ucReturn = f_chdir( pcFullPath ); | ||||
| 	configASSERT( ucReturn == F_NO_ERROR ); | ||||
|  | ||||
| 	/* Obtain and print out the working directory. */ | ||||
| 	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE ); | ||||
| 	configASSERT( strcmp( cRAMBuffer, pcFullPath ) == 0 ); | ||||
|  | ||||
| 	/* Generate the file name. */ | ||||
| 	sprintf( cFileName, "%s.txt", pcDirectory2 ); | ||||
|  | ||||
| 	/* This time the file is opened for reading. */ | ||||
| 	pxFile = f_open( cFileName, "r" ); | ||||
|  | ||||
| 	/* Read the file 1 byte at a time. */ | ||||
| 	for( iByte = 0; iByte < fsPUTC_FILE_SIZE; iByte++ ) | ||||
| 	{ | ||||
| 		iReturned = f_getc( pxFile ); | ||||
| 		configASSERT( iReturned ==  ( ( int ) '0' + iByte ) ); | ||||
| 	} | ||||
|  | ||||
| 	/* Finished so close the file. */ | ||||
| 	f_close( pxFile ); | ||||
|  | ||||
| 	/* Move back to the root directory. */ | ||||
| 	ucReturn = f_chdir( "../.." ); | ||||
| 	configASSERT( ucReturn == F_NO_ERROR ); | ||||
|  | ||||
| 	/* Obtain and print out the working directory. */ | ||||
| 	f_getcwd( cRAMBuffer, fsRAM_BUFFER_SIZE ); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -0,0 +1,664 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
|  /****************************************************************************** | ||||
|  * | ||||
|  * See the following URL for information on the commands defined in this file: | ||||
|  * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/Ethernet_Related_CLI_Commands.shtml | ||||
|  * | ||||
|  ******************************************************************************/ | ||||
|  | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| /* FreeRTOS+CLI includes. */ | ||||
| #include "FreeRTOS_CLI.h" | ||||
|  | ||||
| /* FreeRTOS+UDP includes, just to make the stats available to the CLI | ||||
| commands. */ | ||||
| #include "FreeRTOS_UDP_IP.h" | ||||
| #include "FreeRTOS_Sockets.h" | ||||
|  | ||||
| #ifndef  configINCLUDE_TRACE_RELATED_CLI_COMMANDS | ||||
| 	#define configINCLUDE_TRACE_RELATED_CLI_COMMANDS 0 | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Implements the run-time-stats command. | ||||
|  */ | ||||
| static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Implements the task-stats command. | ||||
|  */ | ||||
| static BaseType_t prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Implements the echo-three-parameters command. | ||||
|  */ | ||||
| static BaseType_t prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Implements the echo-parameters command. | ||||
|  */ | ||||
| static BaseType_t prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Defines a command that prints out IP address information. | ||||
|  */ | ||||
| static BaseType_t prvDisplayIPConfig( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Defines a command that prints out the gathered demo debug stats. | ||||
|  */ | ||||
| static BaseType_t prvDisplayIPDebugStats( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Defines a command that sends an ICMP ping request to an IP address. | ||||
|  */ | ||||
| static BaseType_t prvPingCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Implements the "trace start" and "trace stop" commands; | ||||
|  */ | ||||
| #if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 | ||||
| 	static BaseType_t prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
| #endif | ||||
|  | ||||
| /* Structure that defines the "ip-config" command line command. */ | ||||
| static const CLI_Command_Definition_t xIPConfig = | ||||
| { | ||||
| 	"ip-config", | ||||
| 	"ip-config:\r\n Displays IP address configuration\r\n\r\n", | ||||
| 	prvDisplayIPConfig, | ||||
| 	0 | ||||
| }; | ||||
|  | ||||
| #if configINCLUDE_DEMO_DEBUG_STATS != 0 | ||||
| 	/* Structure that defines the "ip-debug-stats" command line command. */ | ||||
| 	static const CLI_Command_Definition_t xIPDebugStats = | ||||
| 	{ | ||||
| 		"ip-debug-stats", /* The command string to type. */ | ||||
| 		"ip-debug-stats:\r\n Shows some IP stack stats useful for debug - an example only.\r\n\r\n", | ||||
| 		prvDisplayIPDebugStats, /* The function to run. */ | ||||
| 		0 /* No parameters are expected. */ | ||||
| 	}; | ||||
| #endif /* configINCLUDE_DEMO_DEBUG_STATS */ | ||||
|  | ||||
| /* Structure that defines the "run-time-stats" command line command.   This | ||||
| generates a table that shows how much run time each task has */ | ||||
| static const CLI_Command_Definition_t xRunTimeStats = | ||||
| { | ||||
| 	"run-time-stats", /* The command string to type. */ | ||||
| 	"run-time-stats:\r\n Displays a table showing how much processing time each FreeRTOS task has used\r\n\r\n", | ||||
| 	prvRunTimeStatsCommand, /* The function to run. */ | ||||
| 	0 /* No parameters are expected. */ | ||||
| }; | ||||
|  | ||||
| /* Structure that defines the "task-stats" command line command.  This generates | ||||
| a table that gives information on each task in the system. */ | ||||
| static const CLI_Command_Definition_t xTaskStats = | ||||
| { | ||||
| 	"task-stats", /* The command string to type. */ | ||||
| 	"task-stats:\r\n Displays a table showing the state of each FreeRTOS task\r\n\r\n", | ||||
| 	prvTaskStatsCommand, /* The function to run. */ | ||||
| 	0 /* No parameters are expected. */ | ||||
| }; | ||||
|  | ||||
| /* Structure that defines the "echo_3_parameters" command line command.  This | ||||
| takes exactly three parameters that the command simply echos back one at a | ||||
| time. */ | ||||
| static const CLI_Command_Definition_t xThreeParameterEcho = | ||||
| { | ||||
| 	"echo-3-parameters", | ||||
| 	"echo-3-parameters <param1> <param2> <param3>:\r\n Expects three parameters, echos each in turn\r\n\r\n", | ||||
| 	prvThreeParameterEchoCommand, /* The function to run. */ | ||||
| 	3 /* Three parameters are expected, which can take any value. */ | ||||
| }; | ||||
|  | ||||
| /* Structure that defines the "echo_parameters" command line command.  This | ||||
| takes a variable number of parameters that the command simply echos back one at | ||||
| a time. */ | ||||
| static const CLI_Command_Definition_t xParameterEcho = | ||||
| { | ||||
| 	"echo-parameters", | ||||
| 	"echo-parameters <...>:\r\n Take variable number of parameters, echos each in turn\r\n\r\n", | ||||
| 	prvParameterEchoCommand, /* The function to run. */ | ||||
| 	-1 /* The user can enter any number of commands. */ | ||||
| }; | ||||
|  | ||||
| #if ipconfigSUPPORT_OUTGOING_PINGS == 1 | ||||
|  | ||||
| 	/* Structure that defines the "ping" command line command.  This takes an IP | ||||
| 	address or host name and (optionally) the number of bytes to ping as | ||||
| 	parameters. */ | ||||
| 	static const CLI_Command_Definition_t xPing = | ||||
| 	{ | ||||
| 		"ping", | ||||
| 		"ping <ipaddress> <optional:bytes to send>:\r\n for example, ping 192.168.0.3 8, or ping www.example.com\r\n\r\n", | ||||
| 		prvPingCommand, /* The function to run. */ | ||||
| 		-1 /* Ping can take either one or two parameter, so the number of parameters has to be determined by the ping command implementation. */ | ||||
| 	}; | ||||
|  | ||||
| #endif /* ipconfigSUPPORT_OUTGOING_PINGS */ | ||||
|  | ||||
| #if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 | ||||
| 	/* Structure that defines the "trace" command line command.  This takes a single | ||||
| 	parameter, which can be either "start" or "stop". */ | ||||
| 	static const CLI_Command_Definition_t xStartStopTrace = | ||||
| 	{ | ||||
| 		"trace", | ||||
| 		"trace [start | stop]:\r\n Starts or stops a trace recording for viewing in FreeRTOS+Trace\r\n\r\n", | ||||
| 		prvStartStopTraceCommand, /* The function to run. */ | ||||
| 		1 /* One parameter is expected.  Valid values are "start" and "stop". */ | ||||
| 	}; | ||||
| #endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */ | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vRegisterCLICommands( void ) | ||||
| { | ||||
| 	/* Register all the command line commands defined immediately above. */ | ||||
| 	FreeRTOS_CLIRegisterCommand( &xTaskStats ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xRunTimeStats ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xThreeParameterEcho ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xParameterEcho ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xIPDebugStats ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xIPConfig ); | ||||
|  | ||||
| 	#if ipconfigSUPPORT_OUTGOING_PINGS == 1 | ||||
| 	{ | ||||
| 		FreeRTOS_CLIRegisterCommand( &xPing ); | ||||
| 	} | ||||
| 	#endif /* ipconfigSUPPORT_OUTGOING_PINGS */ | ||||
|  | ||||
| 	#if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 | ||||
| 		FreeRTOS_CLIRegisterCommand( & xStartStopTrace ); | ||||
| 	#endif | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char *const pcHeader = "  State\tPriority\tStack\t#\r\n************************************************\r\n"; | ||||
| BaseType_t xSpacePadding; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	/* Generate a table of task stats. */ | ||||
| 	strcpy( pcWriteBuffer, "Task" ); | ||||
| 	pcWriteBuffer += strlen( pcWriteBuffer ); | ||||
|  | ||||
| 	/* Pad the string "task" with however many bytes necessary to make it the | ||||
| 	length of a task name.  Minus three for the null terminator and half the  | ||||
| 	number of characters in	"Task" so the column lines up with the centre of  | ||||
| 	the heading. */ | ||||
| 	for( xSpacePadding = strlen( "Task" ); xSpacePadding < ( configMAX_TASK_NAME_LEN - 3 ); xSpacePadding++ ) | ||||
| 	{ | ||||
| 		/* Add a space to align columns after the task's name. */ | ||||
| 		*pcWriteBuffer = ' '; | ||||
| 		pcWriteBuffer++; | ||||
|  | ||||
| 		/* Ensure always terminated. */ | ||||
| 		*pcWriteBuffer = 0x00; | ||||
| 	} | ||||
| 	strcpy( pcWriteBuffer, pcHeader ); | ||||
| 	vTaskList( pcWriteBuffer + strlen( pcHeader ) ); | ||||
|  | ||||
| 	/* There is no more data to return after this single string, so return | ||||
| 	pdFALSE. */ | ||||
| 	return pdFALSE; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char * const pcHeader = "  Abs Time      % Time\r\n****************************************\r\n"; | ||||
| BaseType_t xSpacePadding; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	/* Generate a table of task stats. */ | ||||
| 	strcpy( pcWriteBuffer, "Task" ); | ||||
| 	pcWriteBuffer += strlen( pcWriteBuffer ); | ||||
|  | ||||
| 	/* Pad the string "task" with however many bytes necessary to make it the | ||||
| 	length of a task name.  Minus three for the null terminator and half the  | ||||
| 	number of characters in	"Task" so the column lines up with the centre of  | ||||
| 	the heading. */ | ||||
| 	for( xSpacePadding = strlen( "Task" ); xSpacePadding < ( configMAX_TASK_NAME_LEN - 3 ); xSpacePadding++ ) | ||||
| 	{ | ||||
| 		/* Add a space to align columns after the task's name. */ | ||||
| 		*pcWriteBuffer = ' '; | ||||
| 		pcWriteBuffer++; | ||||
|  | ||||
| 		/* Ensure always terminated. */ | ||||
| 		*pcWriteBuffer = 0x00; | ||||
| 	} | ||||
|  | ||||
| 	strcpy( pcWriteBuffer, pcHeader ); | ||||
| 	vTaskGetRunTimeStats( pcWriteBuffer + strlen( pcHeader ) ); | ||||
|  | ||||
| 	/* There is no more data to return after this single string, so return | ||||
| 	pdFALSE. */ | ||||
| 	return pdFALSE; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char *pcParameter; | ||||
| BaseType_t xParameterStringLength, xReturn; | ||||
| static BaseType_t lParameterNumber = 0; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	if( lParameterNumber == 0 ) | ||||
| 	{ | ||||
| 		/* The first time the function is called after the command has been | ||||
| 		entered just a header string is returned. */ | ||||
| 		sprintf( pcWriteBuffer, "The three parameters were:\r\n" ); | ||||
|  | ||||
| 		/* Next time the function is called the first parameter will be echoed | ||||
| 		back. */ | ||||
| 		lParameterNumber = 1L; | ||||
|  | ||||
| 		/* There is more data to be returned as no parameters have been echoed | ||||
| 		back yet. */ | ||||
| 		xReturn = pdPASS; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* Obtain the parameter string. */ | ||||
| 		pcParameter = FreeRTOS_CLIGetParameter | ||||
| 						( | ||||
| 							pcCommandString,		/* The command string itself. */ | ||||
| 							lParameterNumber,		/* Return the next parameter. */ | ||||
| 							&xParameterStringLength	/* Store the parameter string length. */ | ||||
| 						); | ||||
|  | ||||
| 		/* Sanity check something was returned. */ | ||||
| 		configASSERT( pcParameter ); | ||||
|  | ||||
| 		/* Return the parameter string. */ | ||||
| 		memset( pcWriteBuffer, 0x00, xWriteBufferLen ); | ||||
| 		sprintf( pcWriteBuffer, "%d: ", ( int ) lParameterNumber ); | ||||
| 		strncat( pcWriteBuffer, pcParameter, xParameterStringLength ); | ||||
| 		strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) ); | ||||
|  | ||||
| 		/* If this is the last of the three parameters then there are no more | ||||
| 		strings to return after this one. */ | ||||
| 		if( lParameterNumber == 3L ) | ||||
| 		{ | ||||
| 			/* If this is the last of the three parameters then there are no more | ||||
| 			strings to return after this one. */ | ||||
| 			xReturn = pdFALSE; | ||||
| 			lParameterNumber = 0L; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* There are more parameters to return after this one. */ | ||||
| 			xReturn = pdTRUE; | ||||
| 			lParameterNumber++; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return xReturn; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char *pcParameter; | ||||
| BaseType_t xParameterStringLength, xReturn; | ||||
| static BaseType_t lParameterNumber = 0; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	if( lParameterNumber == 0 ) | ||||
| 	{ | ||||
| 		/* The first time the function is called after the command has been | ||||
| 		entered just a header string is returned. */ | ||||
| 		sprintf( pcWriteBuffer, "The parameters were:\r\n" ); | ||||
|  | ||||
| 		/* Next time the function is called the first parameter will be echoed | ||||
| 		back. */ | ||||
| 		lParameterNumber = 1L; | ||||
|  | ||||
| 		/* There is more data to be returned as no parameters have been echoed | ||||
| 		back yet. */ | ||||
| 		xReturn = pdPASS; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* Obtain the parameter string. */ | ||||
| 		pcParameter = FreeRTOS_CLIGetParameter | ||||
| 						( | ||||
| 							pcCommandString,		/* The command string itself. */ | ||||
| 							lParameterNumber,		/* Return the next parameter. */ | ||||
| 							&xParameterStringLength	/* Store the parameter string length. */ | ||||
| 						); | ||||
|  | ||||
| 		if( pcParameter != NULL ) | ||||
| 		{ | ||||
| 			/* Return the parameter string. */ | ||||
| 			memset( pcWriteBuffer, 0x00, xWriteBufferLen ); | ||||
| 			sprintf( pcWriteBuffer, "%d: ", ( int ) lParameterNumber ); | ||||
| 			strncat( pcWriteBuffer, pcParameter, xParameterStringLength ); | ||||
| 			strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) ); | ||||
|  | ||||
| 			/* There might be more parameters to return after this one. */ | ||||
| 			xReturn = pdTRUE; | ||||
| 			lParameterNumber++; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* No more parameters were found.  Make sure the write buffer does | ||||
| 			not contain a valid string. */ | ||||
| 			pcWriteBuffer[ 0 ] = 0x00; | ||||
|  | ||||
| 			/* No more data to return. */ | ||||
| 			xReturn = pdFALSE; | ||||
|  | ||||
| 			/* Start over the next time this command is executed. */ | ||||
| 			lParameterNumber = 0; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return xReturn; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if ipconfigSUPPORT_OUTGOING_PINGS == 1 | ||||
|  | ||||
| 	static BaseType_t prvPingCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| 	{ | ||||
| 	char * pcParameter; | ||||
| 	BaseType_t lParameterStringLength, xReturn; | ||||
| 	uint32_t ulIPAddress, ulBytesToPing; | ||||
| 	const uint32_t ulDefaultBytesToPing = 8UL; | ||||
| 	char cBuffer[ 16 ]; | ||||
|  | ||||
| 		/* Remove compile time warnings about unused parameters, and check the | ||||
| 		write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 		write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 		( void ) pcCommandString; | ||||
| 		( void ) xWriteBufferLen; | ||||
| 		configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 		/* Start with an empty string. */ | ||||
| 		pcWriteBuffer[ 0 ] = 0x00; | ||||
|  | ||||
| 		/* Obtain the number of bytes to ping. */ | ||||
| 		pcParameter = ( char * ) FreeRTOS_CLIGetParameter | ||||
| 								( | ||||
| 									pcCommandString,		/* The command string itself. */ | ||||
| 									2,						/* Return the second parameter. */ | ||||
| 									&lParameterStringLength	/* Store the parameter string length. */ | ||||
| 								); | ||||
|  | ||||
| 		if( pcParameter == NULL ) | ||||
| 		{ | ||||
| 			/* The number of bytes was not specified, so default it. */ | ||||
| 			ulBytesToPing = ulDefaultBytesToPing; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			ulBytesToPing = atol( pcParameter ); | ||||
| 		} | ||||
|  | ||||
| 		/* Obtain the IP address string. */ | ||||
| 		pcParameter = ( char * ) FreeRTOS_CLIGetParameter | ||||
| 								( | ||||
| 									pcCommandString,		/* The command string itself. */ | ||||
| 									1,						/* Return the first parameter. */ | ||||
| 									&lParameterStringLength	/* Store the parameter string length. */ | ||||
| 								); | ||||
|  | ||||
| 		/* Sanity check something was returned. */ | ||||
| 		configASSERT( pcParameter ); | ||||
|  | ||||
| 		/* Attempt to obtain the IP address.   If the first character is not a | ||||
| 		digit, assume the host name has been passed in. */ | ||||
| 		if( ( *pcParameter >= '0' ) && ( *pcParameter <= '9' ) ) | ||||
| 		{ | ||||
| 			ulIPAddress = FreeRTOS_inet_addr( pcParameter ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* Terminate the host name. */ | ||||
| 			pcParameter[ lParameterStringLength ] = 0x00; | ||||
|  | ||||
| 			/* Attempt to resolve host. */ | ||||
| 			ulIPAddress = FreeRTOS_gethostbyname( pcParameter ); | ||||
| 		} | ||||
|  | ||||
| 		/* Convert IP address, which may have come from a DNS lookup, to string. */ | ||||
| 		FreeRTOS_inet_ntoa( ulIPAddress, cBuffer ); | ||||
|  | ||||
| 		if( ulIPAddress != 0 ) | ||||
| 		{ | ||||
| 			xReturn = FreeRTOS_SendPingRequest( ulIPAddress, ( uint16_t ) ulBytesToPing, portMAX_DELAY ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			xReturn = pdFALSE; | ||||
| 		} | ||||
|  | ||||
| 		if( xReturn == pdFALSE ) | ||||
| 		{ | ||||
| 			sprintf( pcWriteBuffer, "%s", "Could not send ping request\r\n" ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			sprintf( pcWriteBuffer, "Ping sent to %s with identifier %d\r\n", cBuffer, xReturn ); | ||||
| 		} | ||||
|  | ||||
| 		return pdFALSE; | ||||
| 	} | ||||
| 	/*-----------------------------------------------------------*/ | ||||
|  | ||||
| #endif /* ipconfigSUPPORT_OUTGOING_PINGS */ | ||||
|  | ||||
| #if configINCLUDE_DEMO_DEBUG_STATS != 0 | ||||
|  | ||||
| 	static BaseType_t prvDisplayIPDebugStats( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| 	{ | ||||
| 	static BaseType_t xIndex = -1; | ||||
| 	extern xExampleDebugStatEntry_t xIPTraceValues[]; | ||||
| 	BaseType_t xReturn; | ||||
|  | ||||
| 		/* Remove compile time warnings about unused parameters, and check the | ||||
| 		write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 		write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 		( void ) pcCommandString; | ||||
| 		( void ) xWriteBufferLen; | ||||
| 		configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 		xIndex++; | ||||
|  | ||||
| 		if( xIndex < xExampleDebugStatEntries() ) | ||||
| 		{ | ||||
| 			sprintf( pcWriteBuffer, "%s %d\r\n", xIPTraceValues[ xIndex ].pucDescription, ( int ) xIPTraceValues[ xIndex ].ulData ); | ||||
| 			xReturn = pdPASS; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* Reset the index for the next time it is called. */ | ||||
| 			xIndex = -1; | ||||
|  | ||||
| 			/* Ensure nothing remains in the write buffer. */ | ||||
| 			pcWriteBuffer[ 0 ] = 0x00; | ||||
| 			xReturn = pdFALSE; | ||||
| 		} | ||||
|  | ||||
| 		return xReturn; | ||||
| 	} | ||||
| 	/*-----------------------------------------------------------*/ | ||||
|  | ||||
| #endif /* configINCLUDE_DEMO_DEBUG_STATS */ | ||||
|  | ||||
| static BaseType_t prvDisplayIPConfig( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| static BaseType_t xIndex = 0; | ||||
| BaseType_t xReturn; | ||||
| uint32_t ulAddress; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	switch( xIndex ) | ||||
| 	{ | ||||
| 		case 0 : | ||||
| 			FreeRTOS_GetAddressConfiguration( &ulAddress, NULL, NULL, NULL ); | ||||
| 			sprintf( pcWriteBuffer, "\r\nIP address " ); | ||||
| 			xReturn = pdTRUE; | ||||
| 			xIndex++; | ||||
| 			break; | ||||
|  | ||||
| 		case 1 : | ||||
| 			FreeRTOS_GetAddressConfiguration( NULL, &ulAddress, NULL, NULL ); | ||||
| 			sprintf( pcWriteBuffer, "\r\nNet mask " ); | ||||
| 			xReturn = pdTRUE; | ||||
| 			xIndex++; | ||||
| 			break; | ||||
|  | ||||
| 		case 2 : | ||||
| 			FreeRTOS_GetAddressConfiguration( NULL, NULL, &ulAddress, NULL ); | ||||
| 			sprintf( pcWriteBuffer, "\r\nGateway address " ); | ||||
| 			xReturn = pdTRUE; | ||||
| 			xIndex++; | ||||
| 			break; | ||||
|  | ||||
| 		case 3 : | ||||
| 			FreeRTOS_GetAddressConfiguration( NULL, NULL, NULL, &ulAddress ); | ||||
| 			sprintf( pcWriteBuffer, "\r\nDNS server address " ); | ||||
| 			xReturn = pdTRUE; | ||||
| 			xIndex++; | ||||
| 			break; | ||||
|  | ||||
| 		default : | ||||
| 			ulAddress = 0; | ||||
| 			sprintf( pcWriteBuffer, "\r\n\r\n" ); | ||||
| 			xReturn = pdFALSE; | ||||
| 			xIndex = 0; | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| 	if( ulAddress != 0 ) | ||||
| 	{ | ||||
| 		FreeRTOS_inet_ntoa( ulAddress,  &( pcWriteBuffer[ strlen( pcWriteBuffer ) ] ) ); | ||||
| 	} | ||||
|  | ||||
| 	return xReturn; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 | ||||
|  | ||||
| 	static BaseType_t prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| 	{ | ||||
| 	const char *pcParameter; | ||||
| 	BaseType_t lParameterStringLength; | ||||
|  | ||||
| 		/* Remove compile time warnings about unused parameters, and check the | ||||
| 		write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 		write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 		( void ) pcCommandString; | ||||
| 		( void ) xWriteBufferLen; | ||||
| 		configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 		/* Obtain the parameter string. */ | ||||
| 		pcParameter = FreeRTOS_CLIGetParameter | ||||
| 						( | ||||
| 							pcCommandString,		/* The command string itself. */ | ||||
| 							1,						/* Return the first parameter. */ | ||||
| 							&lParameterStringLength	/* Store the parameter string length. */ | ||||
| 						); | ||||
|  | ||||
| 		/* Sanity check something was returned. */ | ||||
| 		configASSERT( pcParameter ); | ||||
|  | ||||
| 		/* There are only two valid parameter values. */ | ||||
| 		if( strncmp( pcParameter, "start", strlen( "start" ) ) == 0 ) | ||||
| 		{ | ||||
| 			/* Start or restart the trace. */ | ||||
| 			vTraceStop(); | ||||
| 			vTraceClear(); | ||||
| 			vTraceStart(); | ||||
|  | ||||
| 			sprintf( pcWriteBuffer, "Trace recording (re)started.\r\n" ); | ||||
| 		} | ||||
| 		else if( strncmp( pcParameter, "stop", strlen( "stop" ) ) == 0 ) | ||||
| 		{ | ||||
| 			/* End the trace, if one is running. */ | ||||
| 			vTraceStop(); | ||||
| 			sprintf( pcWriteBuffer, "Stopping trace recording.\r\n" ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			sprintf( pcWriteBuffer, "Valid parameters are 'start' and 'stop'.\r\n" ); | ||||
| 		} | ||||
|  | ||||
| 		/* There is no more data to return after this single string, so return | ||||
| 		pdFALSE. */ | ||||
| 		return pdFALSE; | ||||
| 	} | ||||
|  | ||||
| #endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */ | ||||
| @@ -0,0 +1,33 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| #ifndef UDP_COMMAND_INTERPRETER_H | ||||
| #define UDP_COMMAND_INTERPRETER_H | ||||
|  | ||||
| void vStartUDPCommandInterpreterTask( uint16_t usStackSize, uint32_t ulPort, UBaseType_t uxPriority ); | ||||
|  | ||||
| #endif /* UDP_COMMAND_INTERPRETER_H */ | ||||
| @@ -0,0 +1,206 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
|  | ||||
| /* FreeRTOS+CLI includes. */ | ||||
| #include "FreeRTOS_CLI.h" | ||||
|  | ||||
| /* FreeRTOS+UDP includes. */ | ||||
| #include "FreeRTOS_UDP_IP.h" | ||||
| #include "FreeRTOS_Sockets.h" | ||||
|  | ||||
| /* Demo app includes. */ | ||||
| #include "UDPCommandInterpreter.h" | ||||
|  | ||||
| /* Dimensions the buffer into which input characters are placed. */ | ||||
| #define cmdMAX_INPUT_SIZE	60 | ||||
|  | ||||
| /* Dimensions the buffer into which string outputs can be placed. */ | ||||
| #define cmdMAX_OUTPUT_SIZE	1250 | ||||
|  | ||||
| /* Dimensions the buffer passed to the recvfrom() call. */ | ||||
| #define cmdSOCKET_INPUT_BUFFER_SIZE 60 | ||||
|  | ||||
| /* | ||||
|  * The task that runs FreeRTOS+CLI. | ||||
|  */ | ||||
| void vUDPCommandInterpreterTask( void *pvParameters ); | ||||
|  | ||||
| /* | ||||
|  * Open and configure the UDP socket. | ||||
|  */ | ||||
| static xSocket_t prvOpenUDPServerSocket( uint16_t usPort ); | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vStartUDPCommandInterpreterTask( uint16_t usStackSize, uint32_t ulPort, UBaseType_t uxPriority ) | ||||
| { | ||||
| 	xTaskCreate( vUDPCommandInterpreterTask, "CLI", usStackSize, ( void * ) ulPort, uxPriority, NULL ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* | ||||
|  * Task that provides the input and output for the FreeRTOS+CLI command | ||||
|  * interpreter.  In this case a UDP port is used.  See the URL in the comments | ||||
|  * within main.c for the location of the online documentation. | ||||
|  */ | ||||
| void vUDPCommandInterpreterTask( void *pvParameters ) | ||||
| { | ||||
| long lBytes, lByte; | ||||
| signed char cInChar, cInputIndex = 0; | ||||
| static char cInputString[ cmdMAX_INPUT_SIZE ], cOutputString[ cmdMAX_OUTPUT_SIZE ], cLocalBuffer[ cmdSOCKET_INPUT_BUFFER_SIZE ]; | ||||
| BaseType_t xMoreDataToFollow; | ||||
| struct freertos_sockaddr xClient; | ||||
| socklen_t xClientAddressLength = 0; /* This is required as a parameter to maintain the sendto() Berkeley sockets API - but it is not actually used so can take any value. */ | ||||
| xSocket_t xSocket; | ||||
|  | ||||
| 	/* Just to prevent compiler warnings. */ | ||||
| 	( void ) pvParameters; | ||||
|  | ||||
| 	/* Attempt to open the socket.  The port number is passed in the task | ||||
| 	parameter.  The strange casting is to remove compiler warnings on 32-bit | ||||
| 	machines. */ | ||||
| 	xSocket = prvOpenUDPServerSocket( ( uint16_t ) ( ( uint32_t ) pvParameters ) & 0xffffUL ); | ||||
|  | ||||
| 	if( xSocket != FREERTOS_INVALID_SOCKET ) | ||||
| 	{ | ||||
| 		for( ;; ) | ||||
| 		{ | ||||
| 			/* Wait for incoming data on the opened socket. */ | ||||
| 			lBytes = FreeRTOS_recvfrom( xSocket, ( void * ) cLocalBuffer, sizeof( cLocalBuffer ), 0, &xClient, &xClientAddressLength ); | ||||
|  | ||||
| 			if( lBytes != FREERTOS_SOCKET_ERROR ) | ||||
| 			{ | ||||
| 				/* Process each received byte in turn. */ | ||||
| 				lByte = 0; | ||||
| 				while( lByte < lBytes ) | ||||
| 				{ | ||||
| 					/* The next character in the input buffer. */ | ||||
| 					cInChar = cLocalBuffer[ lByte ]; | ||||
| 					lByte++; | ||||
|  | ||||
| 					/* Newline characters are taken as the end of the command | ||||
| 					string. */ | ||||
| 					if( cInChar == '\n' ) | ||||
| 					{ | ||||
| 						/* Process the input string received prior to the | ||||
| 						newline. */ | ||||
| 						do | ||||
| 						{ | ||||
| 							/* Pass the string to FreeRTOS+CLI. */ | ||||
| 							xMoreDataToFollow = FreeRTOS_CLIProcessCommand( cInputString, cOutputString, cmdMAX_OUTPUT_SIZE ); | ||||
|  | ||||
| 							/* Send the output generated by the command's | ||||
| 							implementation. */ | ||||
| 							FreeRTOS_sendto( xSocket, cOutputString,  strlen( cOutputString ), 0, &xClient, xClientAddressLength ); | ||||
|  | ||||
| 						} while( xMoreDataToFollow != pdFALSE ); /* Until the command does not generate any more output. */ | ||||
|  | ||||
| 						/* All the strings generated by the command processing | ||||
| 						have been sent.  Clear the input string ready to receive | ||||
| 						the next command. */ | ||||
| 						cInputIndex = 0; | ||||
| 						memset( cInputString, 0x00, cmdMAX_INPUT_SIZE ); | ||||
|  | ||||
| 						/* Transmit a spacer, just to make the command console | ||||
| 						easier to read. */ | ||||
| 						FreeRTOS_sendto( xSocket, "\r\n",  strlen( "\r\n" ), 0, &xClient, xClientAddressLength ); | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
| 						if( cInChar == '\r' ) | ||||
| 						{ | ||||
| 							/* Ignore the character.  Newlines are used to | ||||
| 							detect the end of the input string. */ | ||||
| 						} | ||||
| 						else if( cInChar == '\b' ) | ||||
| 						{ | ||||
| 							/* Backspace was pressed.  Erase the last character | ||||
| 							in the string - if any. */ | ||||
| 							if( cInputIndex > 0 ) | ||||
| 							{ | ||||
| 								cInputIndex--; | ||||
| 								cInputString[ cInputIndex ] = '\0'; | ||||
| 							} | ||||
| 						} | ||||
| 						else | ||||
| 						{ | ||||
| 							/* A character was entered.  Add it to the string | ||||
| 							entered so far.  When a \n is entered the complete | ||||
| 							string will be passed to the command interpreter. */ | ||||
| 							if( cInputIndex < cmdMAX_INPUT_SIZE ) | ||||
| 							{ | ||||
| 								cInputString[ cInputIndex ] = cInChar; | ||||
| 								cInputIndex++; | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* The socket could not be opened. */ | ||||
| 		vTaskDelete( NULL ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static xSocket_t prvOpenUDPServerSocket( uint16_t usPort ) | ||||
| { | ||||
| struct freertos_sockaddr xServer; | ||||
| xSocket_t xSocket = FREERTOS_INVALID_SOCKET; | ||||
|  | ||||
| 	xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP ); | ||||
| 	if( xSocket != FREERTOS_INVALID_SOCKET) | ||||
| 	{ | ||||
| 		/* Zero out the server structure. */ | ||||
| 		memset( ( void * ) &xServer, 0x00, sizeof( xServer ) ); | ||||
|  | ||||
| 		/* Set family and port. */ | ||||
| 		xServer.sin_port = FreeRTOS_htons( usPort ); | ||||
|  | ||||
| 		/* Bind the address to the socket. */ | ||||
| 		if( FreeRTOS_bind( xSocket, &xServer, sizeof( xServer ) ) == -1 ) | ||||
| 		{ | ||||
| 			FreeRTOS_closesocket( xSocket ); | ||||
| 			xSocket = FREERTOS_INVALID_SOCKET; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return xSocket; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -0,0 +1,359 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
|  * | ||||
|  * See the following web page for essential TwoEchoClient.c usage and | ||||
|  * configuration details: | ||||
|  * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/Common_Echo_Clients.shtml | ||||
|  * | ||||
|  ******************************************************************************/ | ||||
|  | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
|  | ||||
| /* FreeRTOS+UDP includes. */ | ||||
| #include "FreeRTOS_UDP_IP.h" | ||||
| #include "FreeRTOS_Sockets.h" | ||||
|  | ||||
| /* Small delay used between attempts to obtain a zero copy buffer. */ | ||||
| #define echoTINY_DELAY	( ( TickType_t ) 2 ) | ||||
|  | ||||
| /* The echo tasks create a socket, send out a number of echo requests | ||||
| (listening for each echo reply), then close the socket again before | ||||
| starting over.  This delay is used between each iteration to ensure the | ||||
| network does not get too congested. */ | ||||
| #define echoLOOP_DELAY	( ( TickType_t ) 250 / portTICK_RATE_MS ) | ||||
|  | ||||
| #if ipconfigINCLUDE_EXAMPLE_FREERTOS_PLUS_TRACE_CALLS == 1 | ||||
| 	/* When the trace recorder code is included user events are generated to | ||||
| 	mark the sending and receiving of the echoed data (only in the zero copy | ||||
| 	task. */ | ||||
| 	#define echoMARK_SEND_IN_TRACE_BUFFER( x ) vTraceUserEvent( x ) | ||||
| 	traceLabel xZeroCopySendEvent, xZeroCopyReceiveEvent; | ||||
|  | ||||
| #else | ||||
| 	/* When the trace recorder code is not included just #define away the call | ||||
| 	to post the user event. */ | ||||
| 	#define echoMARK_SEND_IN_TRACE_BUFFER( x ) | ||||
| 	#define xZeroCopySendEvent 0 | ||||
| 	#define xZeroCopyReceiveEvent 0 | ||||
| #endif | ||||
|  | ||||
| /* The echo server is assumed to be on port 7, which is the standard echo | ||||
| protocol port. */ | ||||
| #define echoECHO_PORT	( 7 ) | ||||
|  | ||||
| /* | ||||
|  * Uses a socket to send data to, then receive data from, the standard echo | ||||
|  * port number 7.  prvEchoClientTask() uses the standard interface. | ||||
|  * prvZeroCopyEchoClientTask() uses the zero copy interface. | ||||
|  */ | ||||
| static void prvEchoClientTask( void *pvParameters ); | ||||
| static void prvZeroCopyEchoClientTask( void *pvParameters ); | ||||
|  | ||||
| /* The receive timeout is set shorter when the windows simulator is used | ||||
| because simulated time is slower than real time. */ | ||||
| #ifdef _WINDOWS_ | ||||
| 	const TickType_t xReceiveTimeOut = 50 / portTICK_RATE_MS; | ||||
| #else | ||||
| 	const TickType_t xReceiveTimeOut = 500 / portTICK_RATE_MS; | ||||
| #endif | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vStartEchoClientTasks( uint16_t usTaskStackSize, UBaseType_t uxTaskPriority ) | ||||
| { | ||||
| 	/* Create the echo client task that does not use the zero copy interface. */ | ||||
| 	xTaskCreate( 	prvEchoClientTask,	/* The function that implements the task. */ | ||||
| 					"Echo0",			/* Just a text name for the task to aid debugging. */ | ||||
| 					usTaskStackSize,	/* The stack size is defined in FreeRTOSIPConfig.h. */ | ||||
| 					NULL,				/* The task parameter, not used in this case. */ | ||||
| 					uxTaskPriority,		/* The priority assigned to the task is defined in FreeRTOSConfig.h. */ | ||||
| 					NULL );				/* The task handle is not used. */ | ||||
|  | ||||
| 	/* Create the echo client task that does use the zero copy interface. */ | ||||
| 	xTaskCreate( 	prvZeroCopyEchoClientTask,	/* The function that implements the task. */ | ||||
| 					"Echo1",					/* Just a text name for the task to aid debugging. */ | ||||
| 					usTaskStackSize,			/* The stack size is defined in FreeRTOSIPConfig.h. */ | ||||
| 					NULL,						/* The task parameter, not used in this case. */ | ||||
| 					uxTaskPriority,				/* The priority assigned to the task is defined in FreeRTOSConfig.h. */ | ||||
| 					NULL );						/* The task handle is not used. */ | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvEchoClientTask( void *pvParameters ) | ||||
| { | ||||
| xSocket_t xSocket; | ||||
| struct freertos_sockaddr xEchoServerAddress; | ||||
| char cTxString[ 25 ], cRxString[ 25 ]; /* Make sure the stack is large enough to hold these.  Turn on stack overflow checking during debug to be sure. */ | ||||
| int32_t lLoopCount = 0UL; | ||||
| const int32_t lMaxLoopCount = 50; | ||||
| volatile uint32_t ulRxCount = 0UL, ulTxCount = 0UL; | ||||
| uint32_t xAddressLength = sizeof( xEchoServerAddress ); | ||||
|  | ||||
| 	/* Remove compiler warning about unused parameters. */ | ||||
| 	( void ) pvParameters; | ||||
|  | ||||
| 	/* Echo requests are sent to the echo server.  The address of the echo | ||||
| 	server is configured by the constants configECHO_SERVER_ADDR0 to | ||||
| 	configECHO_SERVER_ADDR3 in FreeRTOSConfig.h. */ | ||||
| 	xEchoServerAddress.sin_port = FreeRTOS_htons( echoECHO_PORT ); | ||||
| 	xEchoServerAddress.sin_addr = FreeRTOS_inet_addr_quick( configECHO_SERVER_ADDR0, | ||||
| 															configECHO_SERVER_ADDR1, | ||||
| 															configECHO_SERVER_ADDR2, | ||||
| 															configECHO_SERVER_ADDR3 ); | ||||
|  | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		/* Create a socket. */ | ||||
| 		xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP ); | ||||
| 		configASSERT( xSocket != FREERTOS_INVALID_SOCKET ); | ||||
|  | ||||
| 		/* Set a time out so a missing reply does not cause the task to block | ||||
| 		indefinitely. */ | ||||
| 		FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) ); | ||||
|  | ||||
| 		/* Send a number of echo requests. */ | ||||
| 		for( lLoopCount = 0; lLoopCount < lMaxLoopCount; lLoopCount++ ) | ||||
| 		{ | ||||
| 			/* Create the string that is sent to the echo server. */ | ||||
| 			sprintf( cTxString, "Message number %u\r\n", ( unsigned int ) ulTxCount ); | ||||
|  | ||||
| 			/* Send the string to the socket.  ulFlags is set to 0, so the zero | ||||
| 			copy interface is not used.  That means the data from cTxString is | ||||
| 			copied into a network buffer inside FreeRTOS_sendto(), and cTxString | ||||
| 			can be reused as soon as FreeRTOS_sendto() has returned.  1 is added | ||||
| 			to ensure the NULL string terminator is sent as part of the message. */ | ||||
| 			FreeRTOS_sendto( xSocket,				/* The socket being sent to. */ | ||||
| 							( void * ) cTxString,	/* The data being sent. */ | ||||
| 							strlen( cTxString ) + 1,/* The length of the data being sent. */ | ||||
| 							0,						/* ulFlags with the FREERTOS_ZERO_COPY bit clear. */ | ||||
| 							&xEchoServerAddress,	/* The destination address. */ | ||||
| 							sizeof( xEchoServerAddress ) ); | ||||
|  | ||||
| 			/* Keep a count of how many echo requests have been transmitted so | ||||
| 			it can be compared to the number of echo replies received.  It would | ||||
| 			be expected to loose at least one to an ARP message the first time | ||||
| 			the	connection is created. */ | ||||
| 			ulTxCount++; | ||||
|  | ||||
| 			/* Receive data echoed back to the socket.  ulFlags is zero, so the | ||||
| 			zero copy option is not being used and the received data will be | ||||
| 			copied into the buffer pointed to by cRxString.  xAddressLength is | ||||
| 			not actually used (at the time of writing this comment, anyway) by | ||||
| 			FreeRTOS_recvfrom(), but is set appropriately in case future | ||||
| 			versions do use it. */ | ||||
| 			memset( ( void * ) cRxString, 0x00, sizeof( cRxString ) ); | ||||
| 			FreeRTOS_recvfrom(	xSocket,				/* The socket being received from. */ | ||||
| 								cRxString,				/* The buffer into which the received data will be written. */ | ||||
| 								sizeof( cRxString ),	/* The size of the buffer provided to receive the data. */ | ||||
| 								0,						/* ulFlags with the FREERTOS_ZERO_COPY bit clear. */ | ||||
| 								&xEchoServerAddress,	/* The address from where the data was sent (the source address). */ | ||||
| 								&xAddressLength ); | ||||
|  | ||||
| 			/* Compare the transmitted string to the received string. */ | ||||
| 			if( strcmp( cRxString, cTxString ) == 0 ) | ||||
| 			{ | ||||
| 				/* The echo reply was received without error. */ | ||||
| 				ulRxCount++; | ||||
| 			} | ||||
| 		}; | ||||
|  | ||||
| 		/* Pause for a short while to ensure the network is not too | ||||
| 		congested. */ | ||||
| 		vTaskDelay( echoLOOP_DELAY ); | ||||
|  | ||||
| 		/* Close this socket before looping back to create another. */ | ||||
| 		FreeRTOS_closesocket( xSocket ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvZeroCopyEchoClientTask( void *pvParameters ) | ||||
| { | ||||
| xSocket_t xSocket; | ||||
| struct freertos_sockaddr xEchoServerAddress; | ||||
| static char cTxString[ 40 ]; | ||||
| int32_t lLoopCount = 0UL; | ||||
| volatile uint32_t ulRxCount = 0UL, ulTxCount = 0UL; | ||||
| uint32_t xAddressLength = sizeof( xEchoServerAddress ); | ||||
| int32_t lReturned; | ||||
| uint8_t *pucUDPPayloadBuffer; | ||||
|  | ||||
| const int32_t lMaxLoopCount = 50; | ||||
| const char * const pcStringToSend = "Zero copy message number"; | ||||
| /* The buffer is large enough to hold the string, a number, and the string terminator. */ | ||||
| const size_t xBufferLength = strlen( pcStringToSend ) + 15; | ||||
|  | ||||
| 	#if ipconfigINCLUDE_EXAMPLE_FREERTOS_PLUS_TRACE_CALLS == 1 | ||||
| 	{ | ||||
| 		/* When the trace recorder code is included user events are generated to | ||||
| 		mark the sending and receiving of the echoed data (only in the zero copy | ||||
| 		task). */ | ||||
| 		xZeroCopySendEvent = xTraceOpenLabel( "ZeroCopyTx" ); | ||||
| 		xZeroCopyReceiveEvent = xTraceOpenLabel( "ZeroCopyRx" ); | ||||
| 	} | ||||
| 	#endif /* ipconfigINCLUDE_EXAMPLE_FREERTOS_PLUS_TRACE_CALLS */ | ||||
|  | ||||
| 	/* Remove compiler warning about unused parameters. */ | ||||
| 	( void ) pvParameters; | ||||
|  | ||||
| 	/* Delay for a little while to ensure the task is out of synch with the | ||||
| 	other echo task implemented above. */ | ||||
| 	vTaskDelay( echoLOOP_DELAY >> 1 ); | ||||
|  | ||||
| 	/* Echo requests are sent to the echo server.  The address of the echo | ||||
| 	server is configured by the constants configECHO_SERVER_ADDR0 to | ||||
| 	configECHO_SERVER_ADDR3 in FreeRTOSConfig.h. */ | ||||
| 	xEchoServerAddress.sin_port = FreeRTOS_htons( echoECHO_PORT ); | ||||
| 	xEchoServerAddress.sin_addr = FreeRTOS_inet_addr_quick( configECHO_SERVER_ADDR0, | ||||
| 															configECHO_SERVER_ADDR1, | ||||
| 															configECHO_SERVER_ADDR2, | ||||
| 															configECHO_SERVER_ADDR3 ); | ||||
|  | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		/* Create a socket. */ | ||||
| 		xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP ); | ||||
| 		configASSERT( xSocket != FREERTOS_INVALID_SOCKET ); | ||||
|  | ||||
| 		/* Set a time out so a missing reply does not cause the task to block | ||||
| 		indefinitely. */ | ||||
| 		FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) ); | ||||
|  | ||||
| 		/* Send a number of echo requests. */ | ||||
| 		for( lLoopCount = 0; lLoopCount < lMaxLoopCount; lLoopCount++ ) | ||||
| 		{ | ||||
| 			/* This task is going to send using the zero copy interface.  The | ||||
| 			data being sent is therefore written directly into a buffer that is | ||||
| 			passed by reference into the FreeRTOS_sendto() function.  First | ||||
| 			obtain a buffer of adequate size from the IP stack.  Although a max | ||||
| 			delay is used, the actual delay will be capped to | ||||
| 			ipconfigMAX_SEND_BLOCK_TIME_TICKS, hence the test to ensure a buffer | ||||
| 			was actually obtained. */ | ||||
| 			pucUDPPayloadBuffer = ( uint8_t * ) FreeRTOS_GetUDPPayloadBuffer( xBufferLength, portMAX_DELAY ); | ||||
|  | ||||
| 			if( pucUDPPayloadBuffer != NULL ) | ||||
| 			{ | ||||
| 				/* A buffer was successfully obtained.  Create the string that is | ||||
| 				sent to the echo server.  Note the string is written directly | ||||
| 				into the buffer obtained from the IP stack. */ | ||||
| 				sprintf( ( char * ) pucUDPPayloadBuffer, "%s %u\r\n", "Zero copy message number", ( unsigned int ) ulTxCount ); | ||||
|  | ||||
| 				/* Also copy the string into a local buffer so it can be compared | ||||
| 				with the string that is later received back from the echo server. */ | ||||
| 				strcpy( cTxString, ( char * ) pucUDPPayloadBuffer ); | ||||
|  | ||||
| 				/* Pass the buffer into the send function.  ulFlags has the | ||||
| 				FREERTOS_ZERO_COPY bit set so the IP stack will take control of | ||||
| 				the	buffer, rather than copy data out of the buffer. */ | ||||
| 				echoMARK_SEND_IN_TRACE_BUFFER( xZeroCopySendEvent ); | ||||
| 				lReturned = FreeRTOS_sendto( 	xSocket,					/* The socket being sent to. */ | ||||
| 												( void * ) pucUDPPayloadBuffer,	/* The buffer being passed into the IP stack. */ | ||||
| 												strlen( cTxString ) + 1, 	/* The length of the data being sent.  Plus 1 to ensure the null terminator is part of the data. */ | ||||
| 												FREERTOS_ZERO_COPY,			/* ulFlags with the zero copy bit is set. */ | ||||
| 												&xEchoServerAddress,		/* Where the data is being sent. */ | ||||
| 												sizeof( xEchoServerAddress ) ); | ||||
|  | ||||
| 				if( lReturned == 0 ) | ||||
| 				{ | ||||
| 					/* The send operation failed, so this task is still | ||||
| 					responsible	for the buffer obtained from the IP stack.  To | ||||
| 					ensure the buffer is not lost it must either be used again, | ||||
| 					or, as in this case, returned to the IP stack using | ||||
| 					FreeRTOS_ReleaseUDPPayloadBuffer().  pucUDPPayloadBuffer can | ||||
| 					be safely re-used to receive from the socket below once the | ||||
| 					buffer has been returned to the stack. */ | ||||
| 					FreeRTOS_ReleaseUDPPayloadBuffer( ( void * ) pucUDPPayloadBuffer ); | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					/* The send was successful so the IP stack is now managing | ||||
| 					the	buffer pointed to by pucUDPPayloadBuffer, and the IP | ||||
| 					stack will return the buffer once it has been sent. | ||||
| 					pucUDPPayloadBuffer can	be safely re-used to receive from | ||||
| 					the socket below. */ | ||||
| 				} | ||||
|  | ||||
| 				/* Keep a count of how many echo requests have been transmitted | ||||
| 				so it can be compared to the number of echo replies received. | ||||
| 				It would be expected to loose at least one to an ARP message the | ||||
| 				first time the connection is created. */ | ||||
| 				ulTxCount++; | ||||
|  | ||||
| 				/* Receive data on the socket.  ulFlags has the zero copy bit set | ||||
| 				(FREERTOS_ZERO_COPY) indicating to the stack that a reference to | ||||
| 				the	received data should be passed out to this task using the | ||||
| 				second parameter to the FreeRTOS_recvfrom() call.  When this is | ||||
| 				done the IP stack is no longer responsible for releasing the | ||||
| 				buffer, and	the task *must* return the buffer to the stack when | ||||
| 				it is no longer	needed.  By default the receive block time is | ||||
| 				portMAX_DELAY. */ | ||||
| 				echoMARK_SEND_IN_TRACE_BUFFER( xZeroCopyReceiveEvent ); | ||||
| 				lReturned = FreeRTOS_recvfrom(	xSocket,					/* The socket to receive from. */ | ||||
| 												( void * ) &pucUDPPayloadBuffer,  /* pucUDPPayloadBuffer will be set to point to the buffer that already contains the received data. */ | ||||
| 												0,							/* Ignored because the zero copy interface is being used. */ | ||||
| 												FREERTOS_ZERO_COPY,			/* ulFlags with the FREERTOS_ZERO_COPY bit set. */ | ||||
| 												&xEchoServerAddress,		/* The address from which the data was sent. */ | ||||
| 												&xAddressLength ); | ||||
|  | ||||
| 				if( lReturned > 0 ) | ||||
| 				{ | ||||
| 					/* Compare the string sent to the echo server with the string | ||||
| 					received back from the echo server. */ | ||||
| 					if( strcmp( ( char * ) pucUDPPayloadBuffer, cTxString ) == 0 ) | ||||
| 					{ | ||||
| 						/* The strings matched. */ | ||||
| 						ulRxCount++; | ||||
| 					} | ||||
|  | ||||
| 					/* The buffer that contains the data passed out of the stack | ||||
| 					*must* be returned to the stack. */ | ||||
| 					FreeRTOS_ReleaseUDPPayloadBuffer( pucUDPPayloadBuffer ); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		/* Pause for a short while to ensure the network is not too | ||||
| 		congested. */ | ||||
| 		vTaskDelay( echoLOOP_DELAY ); | ||||
|  | ||||
| 		/* Close this socket before looping back to create another. */ | ||||
| 		FreeRTOS_closesocket( xSocket ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| @@ -0,0 +1,38 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| #ifndef TWO_ECHO_CLIENTS_H | ||||
| #define TWO_ECHO_CLIENTS_H | ||||
|  | ||||
| /* | ||||
|  * Create the two UDP echo client tasks.  One task uses the standard interface | ||||
|  * to send to and receive from an echo server.  The other task uses the zero | ||||
|  * copy interface to send to and receive from an echo server. | ||||
|  */ | ||||
| void vStartEchoClientTasks( uint16_t usTaskStackSize, UBaseType_t uxTaskPriority ); | ||||
|  | ||||
| #endif /* TWO_ECHO_CLIENTS_H */ | ||||
| @@ -0,0 +1,150 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /*  | ||||
|  * This file, along with DemoIPTrace.h, provides a basic example use of the | ||||
|  * FreeRTOS+UDP trace macros.  The statistics gathered here can be viewed in | ||||
|  * the command line interface. | ||||
|  * See http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/UDP_IP_Trace.shtml | ||||
|  */ | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdint.h> | ||||
|  | ||||
| /* FreeRTOS includes. */  | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
|  | ||||
| /* FreeRTOS+UDP includes. */ | ||||
| #include "FreeRTOS_UDP_IP.h" | ||||
| #include "DemoIPTrace.h" | ||||
|  | ||||
| /* It is possible to remove the trace macros using the  | ||||
| configINCLUDE_DEMO_DEBUG_STATS setting in FreeRTOSIPConfig.h. */ | ||||
| #if configINCLUDE_DEMO_DEBUG_STATS == 1 | ||||
|  | ||||
| /* | ||||
|  * Each row in the xIPTraceValues[] table contains a pointer to a function that | ||||
|  * updates the value for that row.  Rows that latch the lowest value point to | ||||
|  * this function (for example, this function can be used to latch the lowest | ||||
|  * number of network buffers that were available during the execution of the | ||||
|  * stack). | ||||
|  */ | ||||
| static void prvStoreLowest( uint32_t *pulCurrentValue, uint32_t ulCount ); | ||||
|  | ||||
| /* | ||||
|  * Each row in the xIPTraceValues[] table contains a pointer to a function that | ||||
|  * updates the value for that row.  Rows that simply increment an event count | ||||
|  * point to this function. | ||||
|  */ | ||||
| static void prvIncrementEventCount( uint32_t *pulCurrentValue, uint32_t ulCount ); | ||||
|  | ||||
|  | ||||
| xExampleDebugStatEntry_t xIPTraceValues[] = | ||||
| { | ||||
| 	/* Comment out array entries to remove individual trace items. */ | ||||
|  | ||||
| 	{ iptraceID_NETWORK_INTERFACE_RECEIVE,			( const uint8_t * const ) "Packets received by the network interface",			prvIncrementEventCount, 0 }, | ||||
| 	{ iptraceID_NETWORK_INTERFACE_TRANSMIT,			( const uint8_t * const ) "Count of transmitted packets",						prvIncrementEventCount, 0 }, | ||||
| 	{ iptraceID_PACKET_DROPPED_TO_GENERATE_ARP,		( const uint8_t * const ) "Count of packets dropped to generate ARP",			prvIncrementEventCount, 0 }, | ||||
| 	{ iptraceID_NETWORK_BUFFER_OBTAINED,			( const uint8_t * const ) "Lowest ever available network buffers",				prvStoreLowest, 0xffffUL }, | ||||
| 	{ iptraceID_NETWORK_EVENT_RECEIVED,				( const uint8_t * const ) "Lowest ever free space in network event queue",		prvStoreLowest, 0xffffUL }, | ||||
| 	{ iptraceID_FAILED_TO_OBTAIN_NETWORK_BUFFER,	( const uint8_t * const ) "Count of failed attempts to obtain a network buffer",prvIncrementEventCount, 0 }, | ||||
| 	{ iptraceID_ARP_TABLE_ENTRY_EXPIRED,			( const uint8_t * const ) "Count of expired ARP entries",						prvIncrementEventCount, 0 }, | ||||
| 	{ iptraceID_FAILED_TO_CREATE_SOCKET,			( const uint8_t * const ) "Count of failures to create a socket",				prvIncrementEventCount, 0 }, | ||||
| 	{ iptraceID_RECVFROM_DISCARDING_BYTES,			( const uint8_t * const ) "Count of times recvfrom() has discarding bytes",		prvIncrementEventCount, 0 }, | ||||
| 	{ iptraceID_ETHERNET_RX_EVENT_LOST,				( const uint8_t * const ) "Count of lost Ethenret Rx events (event queue full?)",prvIncrementEventCount, 0 }, | ||||
| 	{ iptraceID_STACK_TX_EVENT_LOST,				( const uint8_t * const ) "Count of lost IP stack events (event queue full?)",	prvIncrementEventCount, 0 }, | ||||
| 	{ ipconfigID_BIND_FAILED,						( const uint8_t * const ) "Count of failed calls to bind()",					prvIncrementEventCount, 0 }, | ||||
| 	{ iptraceID_RECVFROM_TIMEOUT,					( const uint8_t * const ) "Count of receive timeouts",							prvIncrementEventCount, 0 }, | ||||
| 	{ iptraceID_SENDTO_DATA_TOO_LONG,				( const uint8_t * const ) "Count of failed sends due to oversized payload",		prvIncrementEventCount, 0 }, | ||||
| 	{ iptraceID_SENDTO_SOCKET_NOT_BOUND,			( const uint8_t * const ) "Count of failed sends due to unbound socket",		prvIncrementEventCount, 0 }, | ||||
| 	{ iptraceID_NO_BUFFER_FOR_SENDTO,				( const uint8_t * const ) "Count of failed transmits due to timeout",			prvIncrementEventCount, 0 }, | ||||
| 	{ iptraceID_WAIT_FOR_TX_DMA_DESCRIPTOR,			( const uint8_t * const ) "Number of times task had to wait to obtain a DMA Tx descriptor", prvIncrementEventCount, 0 }, | ||||
| 	{ iptraceID_FAILED_TO_NOTIFY_SELECT_GROUP,		( const uint8_t * const ) "Failed to notify select group",						prvIncrementEventCount, 0 } | ||||
| }; | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| BaseType_t xExampleDebugStatEntries( void ) | ||||
| { | ||||
| 	/* Return the number of entries in the xIPTraceValues[] table. */ | ||||
| 	return ( BaseType_t ) ( sizeof( xIPTraceValues ) / sizeof( xExampleDebugStatEntry_t ) ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vExampleDebugStatUpdate( uint8_t ucIdentifier, uint32_t ulValue ) | ||||
| { | ||||
| BaseType_t xIndex; | ||||
| const BaseType_t xEntries = sizeof( xIPTraceValues ) / sizeof( xExampleDebugStatEntry_t ); | ||||
|  | ||||
| 	/* Update an entry in the xIPTraceValues[] table.  Each row in the table | ||||
| 	includes a pointer to a function that performs the actual update.  This | ||||
| 	function just executes the update function from that table row. */ | ||||
| 	for( xIndex = 0; xIndex < xEntries; xIndex++ ) | ||||
| 	{ | ||||
| 		if( xIPTraceValues[ xIndex ].ucIdentifier == ucIdentifier ) | ||||
| 		{ | ||||
| 			xIPTraceValues[ xIndex ].vPerformAction( &( xIPTraceValues[ xIndex ].ulData ), ulValue ); | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	configASSERT( xIndex != xEntries ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvIncrementEventCount( uint32_t *pulCurrentValue, uint32_t ulCount ) | ||||
| { | ||||
| 	/* Each row in the xIPTraceValues[] table contains a pointer to a function | ||||
| 	that updates the value for that row.  Rows that simply increment an event | ||||
| 	count point to this function. */ | ||||
| 	( void ) ulCount; | ||||
| 	( *pulCurrentValue )++; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvStoreLowest( uint32_t *pulCurrentValue, uint32_t ulCount ) | ||||
| { | ||||
| 	/* Each row in the xIPTraceValues[] table contains a pointer to a function | ||||
| 	that updates the value for that row.  Rows that latch the lowest value | ||||
| 	point to this function (for example, this function can be used to latch | ||||
| 	the lowest number of network buffers that were available during the | ||||
| 	execution of the stack). */ | ||||
| 	if( ulCount < *pulCurrentValue ) | ||||
| 	{ | ||||
| 		*pulCurrentValue = ulCount; | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
|  | ||||
| #endif /* configINCLUDE_DEMO_DEBUG_STATS == 1 */ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -0,0 +1,121 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * This file, along with DemoIPTrace.h, provides a basic example use of the | ||||
|  * FreeRTOS+UDP trace macros.  The statistics gathered here can be viewed in | ||||
|  * the command line interface. | ||||
|  * See http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/UDP_IP_Trace.shtml | ||||
|  */ | ||||
|  | ||||
| #ifndef DEMO_IP_TRACE_MACROS_H | ||||
| #define DEMO_IP_TRACE_MACROS_H | ||||
|  | ||||
| typedef void ( *vTraceAction_t )( uint32_t *, uint32_t ); | ||||
|  | ||||
| /* Type that defines each statistic being gathered. */ | ||||
| typedef struct ExampleDebugStatEntry | ||||
| { | ||||
| 	uint8_t ucIdentifier;					/* Unique identifier for statistic. */ | ||||
| 	const uint8_t * const pucDescription;	/* Text description for the statistic. */ | ||||
| 	vTraceAction_t vPerformAction;			/* Action to perform when the statistic is updated (increment counter, store minimum value, store maximum value, etc. */ | ||||
| 	uint32_t ulData; 						/* The meaning of this data is dependent on the trace macro ID. */ | ||||
| } xExampleDebugStatEntry_t; | ||||
|  | ||||
| /* Unique identifiers used to locate the entry for each trace macro in the | ||||
| xIPTraceValues[] table defined in DemoIPTrace.c. */ | ||||
| #define iptraceID_NETWORK_INTERFACE_RECEIVE					0 | ||||
| #define iptraceID_NETWORK_INTERFACE_TRANSMIT				1 | ||||
| #define iptraceID_PACKET_DROPPED_TO_GENERATE_ARP			2 | ||||
| /* Do not change IDs above this line as the ID is shared with a FreeRTOS+Nabto | ||||
| demo. */ | ||||
| #define iptraceID_NETWORK_BUFFER_OBTAINED					3 | ||||
| #define iptraceID_NETWORK_BUFFER_OBTAINED_FROM_ISR			4 | ||||
| #define iptraceID_NETWORK_EVENT_RECEIVED					5 | ||||
| #define iptraceID_FAILED_TO_OBTAIN_NETWORK_BUFFER			6 | ||||
| #define iptraceID_ARP_TABLE_ENTRY_EXPIRED					7 | ||||
| #define iptraceID_FAILED_TO_CREATE_SOCKET					8 | ||||
| #define iptraceID_RECVFROM_DISCARDING_BYTES					9 | ||||
| #define iptraceID_ETHERNET_RX_EVENT_LOST					10 | ||||
| #define iptraceID_STACK_TX_EVENT_LOST						11 | ||||
| #define ipconfigID_BIND_FAILED								12 | ||||
| #define iptraceID_RECVFROM_TIMEOUT							13 | ||||
| #define iptraceID_SENDTO_DATA_TOO_LONG						14 | ||||
| #define iptraceID_SENDTO_SOCKET_NOT_BOUND					15 | ||||
| #define iptraceID_NO_BUFFER_FOR_SENDTO						16 | ||||
| #define iptraceID_WAIT_FOR_TX_DMA_DESCRIPTOR				17 | ||||
| #define iptraceID_FAILED_TO_NOTIFY_SELECT_GROUP				18 | ||||
|  | ||||
| /* It is possible to remove the trace macros using the | ||||
| configINCLUDE_DEMO_DEBUG_STATS setting in FreeRTOSIPConfig.h. */ | ||||
| #if configINCLUDE_DEMO_DEBUG_STATS == 1 | ||||
|  | ||||
| 	/* The trace macro definitions themselves.  Any trace macros left undefined | ||||
| 	will default to be empty macros. */ | ||||
| 	#define iptraceNETWORK_BUFFER_OBTAINED( pxBufferAddress ) vExampleDebugStatUpdate( iptraceID_NETWORK_BUFFER_OBTAINED, uxQueueMessagesWaiting( ( xQueueHandle ) xNetworkBufferSemaphore ) ) | ||||
| 	#define iptraceNETWORK_BUFFER_OBTAINED_FROM_ISR( pxBufferAddress ) vExampleDebugStatUpdate( iptraceID_NETWORK_BUFFER_OBTAINED, uxQueueMessagesWaiting( ( xQueueHandle ) xNetworkBufferSemaphore ) ) | ||||
|  | ||||
| 	#define iptraceNETWORK_EVENT_RECEIVED( eEvent )	{																				\ | ||||
| 														uint16_t usSpace;															\ | ||||
| 															usSpace = ( uint16_t ) uxQueueMessagesWaiting( xNetworkEventQueue );	\ | ||||
| 															/* Minus one as an event was removed before the space was queried. */	\ | ||||
| 															usSpace = ( ipconfigEVENT_QUEUE_LENGTH - usSpace ) - 1;					\ | ||||
| 															vExampleDebugStatUpdate( iptraceID_NETWORK_EVENT_RECEIVED, usSpace );	\ | ||||
| 														} | ||||
|  | ||||
| 	#define iptraceFAILED_TO_OBTAIN_NETWORK_BUFFER()					vExampleDebugStatUpdate( iptraceID_FAILED_TO_OBTAIN_NETWORK_BUFFER, 0 ) | ||||
| 	#define iptraceARP_TABLE_ENTRY_EXPIRED( ulIPAddress )				vExampleDebugStatUpdate( iptraceID_ARP_TABLE_ENTRY_EXPIRED, 0 ) | ||||
| 	#define iptracePACKET_DROPPED_TO_GENERATE_ARP( ulIPAddress )		vExampleDebugStatUpdate( iptraceID_PACKET_DROPPED_TO_GENERATE_ARP, 0 ) | ||||
| 	#define iptraceFAILED_TO_CREATE_SOCKET()							vExampleDebugStatUpdate( iptraceID_FAILED_TO_CREATE_SOCKET, 0 ) | ||||
| 	#define iptraceRECVFROM_DISCARDING_BYTES( xNumberOfBytesDiscarded )	vExampleDebugStatUpdate( iptraceID_RECVFROM_DISCARDING_BYTES, 0 ) | ||||
| 	#define iptraceETHERNET_RX_EVENT_LOST()								vExampleDebugStatUpdate( iptraceID_ETHERNET_RX_EVENT_LOST, 0 ) | ||||
| 	#define iptraceSTACK_TX_EVENT_LOST( xEvent )						vExampleDebugStatUpdate( iptraceID_STACK_TX_EVENT_LOST, 0 ) | ||||
| 	#define iptraceBIND_FAILED( xSocket, usPort )						vExampleDebugStatUpdate( ipconfigID_BIND_FAILED, 0 ) | ||||
| 	#define iptraceNETWORK_INTERFACE_TRANSMIT()							vExampleDebugStatUpdate( iptraceID_NETWORK_INTERFACE_TRANSMIT, 0 ) | ||||
| 	#define iptraceRECVFROM_TIMEOUT()									vExampleDebugStatUpdate( iptraceID_RECVFROM_TIMEOUT, 0 ) | ||||
| 	#define iptraceSENDTO_DATA_TOO_LONG()								vExampleDebugStatUpdate( iptraceID_SENDTO_DATA_TOO_LONG, 0 ) | ||||
| 	#define iptraceSENDTO_SOCKET_NOT_BOUND()							vExampleDebugStatUpdate( iptraceID_SENDTO_SOCKET_NOT_BOUND, 0 ) | ||||
| 	#define iptraceNO_BUFFER_FOR_SENDTO()								vExampleDebugStatUpdate( iptraceID_NO_BUFFER_FOR_SENDTO, 0 ) | ||||
| 	#define iptraceWAITING_FOR_TX_DMA_DESCRIPTOR()						vExampleDebugStatUpdate( iptraceID_WAIT_FOR_TX_DMA_DESCRIPTOR, 0 ) | ||||
| 	#define iptraceFAILED_TO_NOTIFY_SELECT_GROUP( xSocket )				vExampleDebugStatUpdate( iptraceID_FAILED_TO_NOTIFY_SELECT_GROUP, 0 ) | ||||
| 	#define iptraceNETWORK_INTERFACE_RECEIVE()							vExampleDebugStatUpdate( iptraceID_NETWORK_INTERFACE_RECEIVE, 0 ) | ||||
|  | ||||
| 	/* | ||||
| 	 * The function that updates a line in the xIPTraceValues table. | ||||
| 	 */ | ||||
| 	void vExampleDebugStatUpdate( uint8_t ucIdentifier, uint32_t ulValue ); | ||||
|  | ||||
| 	/* | ||||
| 	 * Returns the number of entries in the xIPTraceValues table. | ||||
| 	 */ | ||||
| 	BaseType_t xExampleDebugStatEntries( void ); | ||||
|  | ||||
| #endif /* configINCLUDE_DEMO_DEBUG_STATS == 1 */ | ||||
|  | ||||
|  | ||||
| #endif /* DEMO_IP_TRACE_MACROS_H */ | ||||
|  | ||||
| @@ -0,0 +1,378 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
|  | ||||
| /* FreeRTOS+CLI includes. */ | ||||
| #include "FreeRTOS_CLI.h" | ||||
|  | ||||
| /* | ||||
|  * Writes trace data to a disk file when the trace recording is stopped. | ||||
|  * This function will simply overwrite any trace files that already exist. | ||||
|  */ | ||||
| static void prvSaveTraceFile( void ); | ||||
|  | ||||
| /* | ||||
|  * Defines a command that returns a table showing the state of each task at the | ||||
|  * time the command is called. | ||||
|  */ | ||||
| static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Defines a command that returns a table showing how much time each task has | ||||
|  * spent in the Running state. | ||||
|  */ | ||||
| static BaseType_t prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Defines a command that expects exactly three parameters.  Each of the three | ||||
|  * parameter are echoed back one at a time. | ||||
|  */ | ||||
| static BaseType_t prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Defines a command that can take a variable number of parameters.  Each | ||||
|  * parameter is echoes back one at a time. | ||||
|  */ | ||||
| static BaseType_t prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Defines a command that starts/stops events being recorded for offline viewing | ||||
|  * in FreeRTOS+Trace. | ||||
|  */ | ||||
| static BaseType_t prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* Structure that defines the "run-time-stats" command line command. */ | ||||
| static const CLI_Command_Definition_t xRunTimeStats = | ||||
| { | ||||
| 	"run-time-stats", /* The command string to type. */ | ||||
| 	"\r\nrun-time-stats:\r\n Displays a table showing how much processing time each FreeRTOS task has used\r\n\r\n", | ||||
| 	prvRunTimeStatsCommand, /* The function to run. */ | ||||
| 	0 /* No parameters are expected. */ | ||||
| }; | ||||
|  | ||||
| /* Structure that defines the "task-stats" command line command. */ | ||||
| static const CLI_Command_Definition_t xTaskStats = | ||||
| { | ||||
| 	"task-stats", /* The command string to type. */ | ||||
| 	"\r\ntask-stats:\r\n Displays a table showing the state of each FreeRTOS task\r\n\r\n", | ||||
| 	prvTaskStatsCommand, /* The function to run. */ | ||||
| 	0 /* No parameters are expected. */ | ||||
| }; | ||||
|  | ||||
| /* Structure that defines the "echo_3_parameters" command line command.  This | ||||
| takes exactly three parameters that the command simply echos back one at a | ||||
| time. */ | ||||
| static const CLI_Command_Definition_t xThreeParameterEcho = | ||||
| { | ||||
| 	"echo_3_parameters", | ||||
| 	"\r\necho_3_parameters <param1> <param2> <param3>:\r\n Expects three parameters, echos each in turn\r\n\r\n", | ||||
| 	prvThreeParameterEchoCommand, /* The function to run. */ | ||||
| 	3 /* Three parameters are expected, which can take any value. */ | ||||
| }; | ||||
|  | ||||
| /* Structure that defines the "echo_parameters" command line command.  This | ||||
| takes a variable number of parameters that the command simply echos back one at | ||||
| a time. */ | ||||
| static const CLI_Command_Definition_t xParameterEcho = | ||||
| { | ||||
| 	"echo_parameters", | ||||
| 	"\r\necho_parameters <...>:\r\n Take variable number of parameters, echos each in turn\r\n\r\n", | ||||
| 	prvParameterEchoCommand, /* The function to run. */ | ||||
| 	-1 /* The user can enter any number of commands. */ | ||||
| }; | ||||
|  | ||||
| /* Structure that defines the "trace" command line command.  This takes a single | ||||
| parameter, which can be either "start" or "stop". */ | ||||
| static const CLI_Command_Definition_t xStartTrace = | ||||
| { | ||||
| 	"trace", | ||||
| 	"\r\ntrace [start | stop]:\r\n Starts or stops a trace recording for viewing in FreeRTOS+Trace\r\n\r\n", | ||||
| 	prvStartStopTraceCommand, /* The function to run. */ | ||||
| 	1 /* One parameter is expected.  Valid values are "start" and "stop". */ | ||||
| }; | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vRegisterCLICommands( void ) | ||||
| { | ||||
| 	/* Register all the command line commands defined immediately above. */ | ||||
| 	FreeRTOS_CLIRegisterCommand( &xTaskStats ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xRunTimeStats ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xThreeParameterEcho ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xParameterEcho ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xStartTrace ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char *const pcHeader = "Task          State  Priority  Stack	#\r\n************************************************\r\n"; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	/* Generate a table of task stats. */ | ||||
| 	strcpy( pcWriteBuffer, pcHeader ); | ||||
| 	vTaskList( pcWriteBuffer + strlen( pcHeader ) ); | ||||
|  | ||||
| 	/* There is no more data to return after this single string, so return | ||||
| 	pdFALSE. */ | ||||
| 	return pdFALSE; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char * const pcHeader = "Task            Abs Time      % Time\r\n****************************************\r\n"; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	/* Generate a table of task stats. */ | ||||
| 	strcpy( pcWriteBuffer, pcHeader ); | ||||
| 	vTaskGetRunTimeStats( pcWriteBuffer + strlen( pcHeader ) ); | ||||
|  | ||||
| 	/* There is no more data to return after this single string, so return | ||||
| 	pdFALSE. */ | ||||
| 	return pdFALSE; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char *pcParameter; | ||||
| BaseType_t lParameterStringLength, xReturn; | ||||
| static BaseType_t lParameterNumber = 0; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	if( lParameterNumber == 0 ) | ||||
| 	{ | ||||
| 		/* The first time the function is called after the command has been | ||||
| 		entered just a header string is returned. */ | ||||
| 		sprintf( pcWriteBuffer, "The three parameters were:\r\n" ); | ||||
|  | ||||
| 		/* Next time the function is called the first parameter will be echoed | ||||
| 		back. */ | ||||
| 		lParameterNumber = 1L; | ||||
|  | ||||
| 		/* There is more data to be returned as no parameters have been echoed | ||||
| 		back yet. */ | ||||
| 		xReturn = pdPASS; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* Obtain the parameter string. */ | ||||
| 		pcParameter = FreeRTOS_CLIGetParameter | ||||
| 						( | ||||
| 							pcCommandString,		/* The command string itself. */ | ||||
| 							lParameterNumber,		/* Return the next parameter. */ | ||||
| 							&lParameterStringLength	/* Store the parameter string length. */ | ||||
| 						); | ||||
|  | ||||
| 		/* Sanity check something was returned. */ | ||||
| 		configASSERT( pcParameter ); | ||||
|  | ||||
| 		/* Return the parameter string. */ | ||||
| 		memset( pcWriteBuffer, 0x00, xWriteBufferLen ); | ||||
| 		sprintf( pcWriteBuffer, "%d: ", lParameterNumber ); | ||||
| 		strncat( pcWriteBuffer, pcParameter, lParameterStringLength ); | ||||
| 		strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) ); | ||||
|  | ||||
| 		/* If this is the last of the three parameters then there are no more | ||||
| 		strings to return after this one. */ | ||||
| 		if( lParameterNumber == 3L ) | ||||
| 		{ | ||||
| 			/* If this is the last of the three parameters then there are no more | ||||
| 			strings to return after this one. */ | ||||
| 			xReturn = pdFALSE; | ||||
| 			lParameterNumber = 0L; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* There are more parameters to return after this one. */ | ||||
| 			xReturn = pdTRUE; | ||||
| 			lParameterNumber++; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return xReturn; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char *pcParameter; | ||||
| BaseType_t lParameterStringLength, xReturn; | ||||
| static BaseType_t lParameterNumber = 0; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	if( lParameterNumber == 0 ) | ||||
| 	{ | ||||
| 		/* The first time the function is called after the command has been | ||||
| 		entered just a header string is returned. */ | ||||
| 		sprintf( pcWriteBuffer, "The parameters were:\r\n" ); | ||||
|  | ||||
| 		/* Next time the function is called the first parameter will be echoed | ||||
| 		back. */ | ||||
| 		lParameterNumber = 1L; | ||||
|  | ||||
| 		/* There is more data to be returned as no parameters have been echoed | ||||
| 		back yet. */ | ||||
| 		xReturn = pdPASS; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* Obtain the parameter string. */ | ||||
| 		pcParameter = FreeRTOS_CLIGetParameter | ||||
| 						( | ||||
| 							pcCommandString,		/* The command string itself. */ | ||||
| 							lParameterNumber,		/* Return the next parameter. */ | ||||
| 							&lParameterStringLength	/* Store the parameter string length. */ | ||||
| 						); | ||||
|  | ||||
| 		if( pcParameter != NULL ) | ||||
| 		{ | ||||
| 			/* Return the parameter string. */ | ||||
| 			memset( pcWriteBuffer, 0x00, xWriteBufferLen ); | ||||
| 			sprintf( pcWriteBuffer, "%d: ", lParameterNumber ); | ||||
| 			strncat( pcWriteBuffer, pcParameter, lParameterStringLength ); | ||||
| 			strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) ); | ||||
|  | ||||
| 			/* There might be more parameters to return after this one. */ | ||||
| 			xReturn = pdTRUE; | ||||
| 			lParameterNumber++; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* No more parameters were found.  Make sure the write buffer does | ||||
| 			not contain a valid string. */ | ||||
| 			pcWriteBuffer[ 0 ] = 0x00; | ||||
|  | ||||
| 			/* No more data to return. */ | ||||
| 			xReturn = pdFALSE; | ||||
|  | ||||
| 			/* Start over the next time this command is executed. */ | ||||
| 			lParameterNumber = 0; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return xReturn; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char *pcParameter; | ||||
| BaseType_t lParameterStringLength; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	/* Obtain the parameter string. */ | ||||
| 	pcParameter = FreeRTOS_CLIGetParameter | ||||
| 					( | ||||
| 						pcCommandString,		/* The command string itself. */ | ||||
| 						1,						/* Return the first parameter. */ | ||||
| 						&lParameterStringLength	/* Store the parameter string length. */ | ||||
| 					); | ||||
|  | ||||
| 	/* Sanity check something was returned. */ | ||||
| 	configASSERT( pcParameter ); | ||||
|  | ||||
| 	/* There are only two valid parameter values. */ | ||||
| 	if( strncmp( pcParameter, "start", strlen( "start" ) ) == 0 ) | ||||
| 	{ | ||||
| 		/* Start or restart the trace. */ | ||||
| 		vTraceStop(); | ||||
| 		vTraceClear(); | ||||
| 		uiTraceStart(); | ||||
|  | ||||
| 		sprintf( pcWriteBuffer, "Trace recording (re)started.\r\n" ); | ||||
| 	} | ||||
| 	else if( strncmp( pcParameter, "stop", strlen( "stop" ) ) == 0 ) | ||||
| 	{ | ||||
| 		/* End the trace, if one is running. */ | ||||
| 		vTraceStop(); | ||||
| 		sprintf( pcWriteBuffer, "Stopping trace recording and dumping log to disk.\r\n" ); | ||||
| 		prvSaveTraceFile(); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		sprintf( pcWriteBuffer, "Valid parameters are 'start' and 'stop'.\r\n" ); | ||||
| 	} | ||||
|  | ||||
| 	/* There is no more data to return after this single string, so return | ||||
| 	pdFALSE. */ | ||||
| 	return pdFALSE; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvSaveTraceFile( void ) | ||||
| { | ||||
| FILE* pxOutputFile; | ||||
|  | ||||
| 	fopen_s( &pxOutputFile, "Trace.dump", "wb"); | ||||
|  | ||||
| 	if( pxOutputFile != NULL ) | ||||
| 	{ | ||||
| 		fwrite( RecorderDataPtr, sizeof( RecorderDataType ), 1, pxOutputFile ); | ||||
| 		fclose( pxOutputFile ); | ||||
| 		printf( "\r\nTrace output saved to Trace.dump\r\n" ); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		printf( "\r\nFailed to create trace dump file\r\n" ); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -0,0 +1,124 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef FREERTOS_CONFIG_H | ||||
| #define FREERTOS_CONFIG_H | ||||
|  | ||||
| #include <stdint.h> | ||||
|  | ||||
| /*----------------------------------------------------------- | ||||
|  * Application specific definitions. | ||||
|  * | ||||
|  * These definitions should be adjusted for your particular hardware and | ||||
|  * application requirements. | ||||
|  * | ||||
|  * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE | ||||
|  * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. | ||||
|  * http://www.freertos.org/a00110.html | ||||
|  *----------------------------------------------------------*/ | ||||
|  | ||||
| #define configUSE_PREEMPTION			1 | ||||
| #define configUSE_IDLE_HOOK				1 | ||||
| #define configUSE_TICK_HOOK				0 | ||||
| #define configTICK_RATE_HZ				( 1000 ) /* In this non-real time simulated environment the tick frequency has to be at least a multiple of the Win32 tick frequency, and therefore very slow. */ | ||||
| #define configMINIMAL_STACK_SIZE		( ( unsigned short ) 60 ) /* In this simulated case, the stack only has to hold one small structure as the real stack is part of the Win32 thread. */ | ||||
| #define configTOTAL_HEAP_SIZE			( ( size_t ) 0 ) /* This parameter has no effect when heap_3.c is included in the project. */ | ||||
| #define configMAX_TASK_NAME_LEN			( 7 ) | ||||
| #define configUSE_TRACE_FACILITY		1 | ||||
| #define configUSE_16_BIT_TICKS			0 | ||||
| #define configIDLE_SHOULD_YIELD			1 | ||||
| #define configUSE_CO_ROUTINES 			0 | ||||
| #define configUSE_MUTEXES				1 | ||||
| #define configCHECK_FOR_STACK_OVERFLOW	0 /* Not applicable to the Win32 port. */ | ||||
| #define configUSE_RECURSIVE_MUTEXES		1 | ||||
| #define configQUEUE_REGISTRY_SIZE		0 | ||||
| #define configUSE_MALLOC_FAILED_HOOK	0 | ||||
| #define configUSE_APPLICATION_TASK_TAG	0 | ||||
| #define configUSE_COUNTING_SEMAPHORES	1 | ||||
| #define configUSE_ALTERNATIVE_API		0 | ||||
|  | ||||
| #define configUSE_TIMERS				1 | ||||
| #define configTIMER_TASK_PRIORITY		2 | ||||
| #define configTIMER_QUEUE_LENGTH		20 | ||||
| #define configTIMER_TASK_STACK_DEPTH	( configMINIMAL_STACK_SIZE * 2 ) | ||||
|  | ||||
| #define configMAX_PRIORITIES			( 7 ) | ||||
| #define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) | ||||
|  | ||||
|  | ||||
| /* Co-routine definitions. */ | ||||
| #define configUSE_CO_ROUTINES 			0 | ||||
| #define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) | ||||
|  | ||||
| /* Set the following definitions to 1 to include the API function, or zero | ||||
| to exclude the API function. */ | ||||
|  | ||||
| #define INCLUDE_vTaskPrioritySet			1 | ||||
| #define INCLUDE_uxTaskPriorityGet			1 | ||||
| #define INCLUDE_vTaskDelete					1 | ||||
| #define INCLUDE_vTaskCleanUpResources		0 | ||||
| #define INCLUDE_vTaskSuspend				1 | ||||
| #define INCLUDE_vTaskDelayUntil				1 | ||||
| #define INCLUDE_vTaskDelay					1 | ||||
| #define INCLUDE_uxTaskGetStackHighWaterMark	1 | ||||
| #define INCLUDE_xTaskGetSchedulerState		1 | ||||
|  | ||||
| /* This demo makes use of one or more example stats formatting functions.  These | ||||
| format the raw data provided by the uxTaskGetSystemState() function in to human | ||||
| readable ASCII form.  See the notes in the implementation of vTaskList() within | ||||
| FreeRTOS/Source/tasks.c for limitations. */ | ||||
| #define configUSE_STATS_FORMATTING_FUNCTIONS	1 | ||||
|  | ||||
| /* Run time stats gathering definitions. */ | ||||
| unsigned long ulGetRunTimeCounterValue( void ); | ||||
| void vConfigureTimerForRunTimeStats( void ); | ||||
| #define configGENERATE_RUN_TIME_STATS	1 | ||||
| #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vConfigureTimerForRunTimeStats() | ||||
| #define portGET_RUN_TIME_COUNTER_VALUE() ulGetRunTimeCounterValue() | ||||
|  | ||||
| extern void vAssertCalled( void ); | ||||
| #define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled() | ||||
|  | ||||
| /* The UDP port to use for incoming command inputs.  The outgoing port is | ||||
| set to ( configUDP_CLI_PORT_NUMBER + 1 ). */ | ||||
| #define configUDP_CLI_PORT_NUMBER	5001 | ||||
|  | ||||
| /* The size of the global output buffer that is available for use when there | ||||
| are multiple command interpreters running at once (for example, one on a UART | ||||
| and one on TCP/IP).  This is done to prevent an output buffer being defined by | ||||
| each implementation - which would waste RAM.  In this case, there is only one | ||||
| command interpreter running, and it has its own local output buffer, so the | ||||
| global buffer is just set to be one byte long as it is not used and should not | ||||
| take up unnecessary RAM. */ | ||||
| #define configCOMMAND_INT_MAX_OUTPUT_SIZE 1 | ||||
|  | ||||
|  | ||||
| /* Include the FreeRTOS+Trace FreeRTOS trace macro definitions. */ | ||||
| #include "trcRecorder.h" | ||||
|  | ||||
| #endif /* FREERTOS_CONFIG_H */ | ||||
| @@ -0,0 +1,22 @@ | ||||
|  | ||||
| Microsoft Visual Studio Solution File, Format Version 12.00 | ||||
| # Visual Studio 14 | ||||
| VisualStudioVersion = 14.0.25420.1 | ||||
| MinimumVisualStudioVersion = 10.0.40219.1 | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RTOSDemo", "WIN32.vcxproj", "{C686325E-3261-42F7-AEB1-DDE5280E1CEB}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		Debug|Win32 = Debug|Win32 | ||||
| 		Release|Win32 = Release|Win32 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||
| 		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.ActiveCfg = Debug|Win32 | ||||
| 		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.Build.0 = Debug|Win32 | ||||
| 		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Release|Win32.ActiveCfg = Release|Win32 | ||||
| 		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Release|Win32.Build.0 = Release|Win32 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(SolutionProperties) = preSolution | ||||
| 		HideSolutionNode = FALSE | ||||
| 	EndGlobalSection | ||||
| EndGlobal | ||||
| @@ -0,0 +1,5 @@ | ||||
| [InternetShortcut] | ||||
| URL=http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_Trace/Free_RTOS_Plus_Trace_CLI_Example.shtml | ||||
| IDList= | ||||
| [{000214A0-0000-0000-C000-000000000046}] | ||||
| Prop3=19,2 | ||||
| @@ -0,0 +1,100 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * Utility functions required to gather run time statistics.  See: | ||||
|  * http://www.freertos.org/rtos-run-time-stats.html | ||||
|  * | ||||
|  * Note that this is a simulated port, where simulated time is a lot slower than | ||||
|  * real time, therefore the run time counter values have no real meaningful | ||||
|  * units. | ||||
|  * | ||||
|  * Also note that it is assumed this demo is going to be used for short periods | ||||
|  * of time only, and therefore timer overflows are not handled. | ||||
| */ | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include <FreeRTOS.h> | ||||
|  | ||||
| /* Variables used in the creation of the run time stats time base.  Run time | ||||
| stats record how much time each task spends in the Running state. */ | ||||
| static long long llInitialRunTimeCounterValue = 0LL, llTicksPerHundedthMillisecond = 0LL; | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vConfigureTimerForRunTimeStats( void ) | ||||
| { | ||||
| LARGE_INTEGER liPerformanceCounterFrequency, liInitialRunTimeValue; | ||||
|  | ||||
| 	/* Initialise the variables used to create the run time stats time base. | ||||
| 	Run time stats record how much time each task spends in the Running | ||||
| 	state. */ | ||||
|  | ||||
| 	if( QueryPerformanceFrequency( &liPerformanceCounterFrequency ) == 0 ) | ||||
| 	{ | ||||
| 		llTicksPerHundedthMillisecond = 1; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* How many times does the performance counter increment in 1/100th | ||||
| 		millisecond. */ | ||||
| 		llTicksPerHundedthMillisecond = liPerformanceCounterFrequency.QuadPart / 100000LL; | ||||
|  | ||||
| 		/* What is the performance counter value now, this will be subtracted | ||||
| 		from readings taken at run time. */ | ||||
| 		QueryPerformanceCounter( &liInitialRunTimeValue ); | ||||
| 		llInitialRunTimeCounterValue = liInitialRunTimeValue.QuadPart; | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| unsigned long ulGetRunTimeCounterValue( void ) | ||||
| { | ||||
| LARGE_INTEGER liCurrentCount; | ||||
| unsigned long ulReturn; | ||||
|  | ||||
| 	/* What is the performance counter value now? */ | ||||
| 	QueryPerformanceCounter( &liCurrentCount ); | ||||
|  | ||||
| 	/* Subtract the performance counter value reading taken when the | ||||
| 	application started to get a count from that reference point, then | ||||
| 	scale to (simulated) 1/100ths of a millisecond. */ | ||||
| 	if( llTicksPerHundedthMillisecond == 0 ) | ||||
| 	{ | ||||
| 		/* The trace macros can call this function before the kernel has been | ||||
| 		started, in which case llTicksPerHundedthMillisecond will not have been | ||||
| 		initialised. */ | ||||
| 		ulReturn = 0; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		ulReturn = ( unsigned long ) ( ( liCurrentCount.QuadPart - llInitialRunTimeCounterValue ) / llTicksPerHundedthMillisecond ); | ||||
| 	} | ||||
|  | ||||
| 	return ulReturn; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
| @@ -0,0 +1,300 @@ | ||||
| /******************************************************************************* | ||||
|  * Trace Recorder Library for Tracealyzer v4.1.4 | ||||
|  * Percepio AB, www.percepio.com | ||||
|  * | ||||
|  * trcConfig.h | ||||
|  * | ||||
|  * Main configuration parameters for the trace recorder library. | ||||
|  * More settings can be found in trcStreamingConfig.h and trcSnapshotConfig.h. | ||||
|  * | ||||
|  * Read more at http://percepio.com/2016/10/05/rtos-tracing/ | ||||
|  * | ||||
|  * Terms of Use | ||||
|  * This file is part of the trace recorder library (RECORDER), which is the | ||||
|  * intellectual property of Percepio AB (PERCEPIO) and provided under a | ||||
|  * license as follows. | ||||
|  * The RECORDER may be used free of charge for the purpose of recording data | ||||
|  * intended for analysis in PERCEPIO products. It may not be used or modified | ||||
|  * for other purposes without explicit permission from PERCEPIO. | ||||
|  * You may distribute the RECORDER in its original source code form, assuming | ||||
|  * this text (terms of use, disclaimer, copyright notice) is unchanged. You are | ||||
|  * allowed to distribute the RECORDER with minor modifications intended for | ||||
|  * configuration or porting of the RECORDER, e.g., to allow using it on a | ||||
|  * specific processor, processor family or with a specific communication | ||||
|  * interface. Any such modifications should be documented directly below | ||||
|  * this comment block. | ||||
|  * | ||||
|  * Disclaimer | ||||
|  * The RECORDER is being delivered to you AS IS and PERCEPIO makes no warranty | ||||
|  * as to its use or performance. PERCEPIO does not and cannot warrant the | ||||
|  * performance or results you may obtain by using the RECORDER or documentation. | ||||
|  * PERCEPIO make no warranties, express or implied, as to noninfringement of | ||||
|  * third party rights, merchantability, or fitness for any particular purpose. | ||||
|  * In no event will PERCEPIO, its technology partners, or distributors be liable | ||||
|  * to you for any consequential, incidental or special damages, including any | ||||
|  * lost profits or lost savings, even if a representative of PERCEPIO has been | ||||
|  * advised of the possibility of such damages, or for any claim by any third | ||||
|  * party. Some jurisdictions do not allow the exclusion or limitation of | ||||
|  * incidental, consequential or special damages, or the exclusion of implied | ||||
|  * warranties or limitations on how long an implied warranty may last, so the | ||||
|  * above limitations may not apply to you. | ||||
|  * | ||||
|  * Tabs are used for indent in this file (1 tab = 4 spaces) | ||||
|  * | ||||
|  * Copyright Percepio AB, 2018. | ||||
|  * www.percepio.com | ||||
|  ******************************************************************************/ | ||||
|  | ||||
| #ifndef TRC_CONFIG_H | ||||
| #define TRC_CONFIG_H | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #include "trcPortDefines.h" | ||||
|  | ||||
| /****************************************************************************** | ||||
|  * Include of processor header file | ||||
|  * | ||||
|  * Here you may need to include the header file for your processor. This is | ||||
|  * required at least for the ARM Cortex-M port, that uses the ARM CMSIS API. | ||||
|  * Try that in case of build problems. Otherwise, remove the #error line below. | ||||
|  *****************************************************************************/ | ||||
| //#error "Trace Recorder: Please include your processor's header file here and remove this line." | ||||
|  | ||||
| /******************************************************************************* | ||||
|  * Configuration Macro: TRC_CFG_HARDWARE_PORT | ||||
|  * | ||||
|  * Specify what hardware port to use (i.e., the "timestamping driver"). | ||||
|  * | ||||
|  * All ARM Cortex-M MCUs are supported by "TRC_HARDWARE_PORT_ARM_Cortex_M". | ||||
|  * This port uses the DWT cycle counter for Cortex-M3/M4/M7 devices, which is | ||||
|  * available on most such devices. In case your device don't have DWT support, | ||||
|  * you will get an error message opening the trace. In that case, you may | ||||
|  * force the recorder to use SysTick timestamping instead, using this define: | ||||
|  * | ||||
|  * #define TRC_CFG_ARM_CM_USE_SYSTICK | ||||
|  * | ||||
|  * For ARM Cortex-M0/M0+ devices, SysTick mode is used automatically. | ||||
|  * | ||||
|  * See trcHardwarePort.h for available ports and information on how to | ||||
|  * define your own port, if not already present. | ||||
|  ******************************************************************************/ | ||||
| #define TRC_CFG_HARDWARE_PORT TRC_HARDWARE_PORT_Win32 | ||||
|  | ||||
| /******************************************************************************* | ||||
|  * Configuration Macro: TRC_CFG_RECORDER_MODE | ||||
|  * | ||||
|  * Specify what recording mode to use. Snapshot means that the data is saved in | ||||
|  * an internal RAM buffer, for later upload. Streaming means that the data is | ||||
|  * transferred continuously to the host PC. | ||||
|  * | ||||
|  * For more information, see http://percepio.com/2016/10/05/rtos-tracing/ | ||||
|  * and the Tracealyzer User Manual. | ||||
|  * | ||||
|  * Values: | ||||
|  * TRC_RECORDER_MODE_SNAPSHOT | ||||
|  * TRC_RECORDER_MODE_STREAMING | ||||
|  ******************************************************************************/ | ||||
| #define TRC_CFG_RECORDER_MODE TRC_RECORDER_MODE_SNAPSHOT | ||||
| /****************************************************************************** | ||||
|  * TRC_CFG_FREERTOS_VERSION | ||||
|  * | ||||
|  * Specify what version of FreeRTOS that is used (don't change unless using the | ||||
|  * trace recorder library with an older version of FreeRTOS). | ||||
|  * | ||||
|  * TRC_FREERTOS_VERSION_7_3						If using FreeRTOS v7.3.x | ||||
|  * TRC_FREERTOS_VERSION_7_4						If using FreeRTOS v7.4.x | ||||
|  * TRC_FREERTOS_VERSION_7_5_OR_7_6				If using FreeRTOS v7.5.0 - v7.6.0 | ||||
|  * TRC_FREERTOS_VERSION_8_X						If using FreeRTOS v8.X.X | ||||
|  * TRC_FREERTOS_VERSION_9_0_0					If using FreeRTOS v9.0.0 | ||||
|  * TRC_FREERTOS_VERSION_9_0_1					If using FreeRTOS v9.0.1 | ||||
|  * TRC_FREERTOS_VERSION_9_0_2					If using FreeRTOS v9.0.2 | ||||
|  * TRC_FREERTOS_VERSION_10_0_0					If using FreeRTOS v10.0.0 or later | ||||
|  *****************************************************************************/ | ||||
| #define TRC_CFG_FREERTOS_VERSION TRC_FREERTOS_VERSION_10_0_0 | ||||
|  | ||||
| /******************************************************************************* | ||||
|  * TRC_CFG_SCHEDULING_ONLY | ||||
|  * | ||||
|  * Macro which should be defined as an integer value. | ||||
|  * | ||||
|  * If this setting is enabled (= 1), only scheduling events are recorded. | ||||
|  * If disabled (= 0), all events are recorded (unless filtered in other ways). | ||||
|  * | ||||
|  * Default value is 0 (= include additional events). | ||||
|  ******************************************************************************/ | ||||
| #define TRC_CFG_SCHEDULING_ONLY 0 | ||||
|  | ||||
|  /****************************************************************************** | ||||
|  * TRC_CFG_INCLUDE_MEMMANG_EVENTS | ||||
|  * | ||||
|  * Macro which should be defined as either zero (0) or one (1). | ||||
|  * | ||||
|  * This controls if malloc and free calls should be traced. Set this to zero (0) | ||||
|  * to exclude malloc/free calls, or one (1) to include such events in the trace. | ||||
|  * | ||||
|  * Default value is 1. | ||||
|  *****************************************************************************/ | ||||
| #define TRC_CFG_INCLUDE_MEMMANG_EVENTS 1 | ||||
|  | ||||
|  /****************************************************************************** | ||||
|  * TRC_CFG_INCLUDE_USER_EVENTS | ||||
|  * | ||||
|  * Macro which should be defined as either zero (0) or one (1). | ||||
|  * | ||||
|  * If this is zero (0), all code related to User Events is excluded in order | ||||
|  * to reduce code size. Any attempts of storing User Events are then silently | ||||
|  * ignored. | ||||
|  * | ||||
|  * User Events are application-generated events, like "printf" but for the | ||||
|  * trace log, generated using vTracePrint and vTracePrintF. | ||||
|  * The formatting is done on host-side, by Tracealyzer. User Events are | ||||
|  * therefore much faster than a console printf and can often be used | ||||
|  * in timing critical code without problems. | ||||
|  * | ||||
|  * Note: In streaming mode, User Events are used to provide error messages | ||||
|  * and warnings from the recorder (in case of incorrect configuration) for | ||||
|  * display in Tracealyzer. Disabling user events will also disable these | ||||
|  * warnings. You can however still catch them by calling xTraceGetLastError | ||||
|  * or by putting breakpoints in prvTraceError and prvTraceWarning. | ||||
|  * | ||||
|  * Default value is 1. | ||||
|  *****************************************************************************/ | ||||
| #define TRC_CFG_INCLUDE_USER_EVENTS 1 | ||||
|  | ||||
|  /***************************************************************************** | ||||
|  * TRC_CFG_INCLUDE_ISR_TRACING | ||||
|  * | ||||
|  * Macro which should be defined as either zero (0) or one (1). | ||||
|  * | ||||
|  * If this is zero (0), the code for recording Interrupt Service Routines is | ||||
|  * excluded, in order to reduce code size. | ||||
|  * | ||||
|  * Default value is 1. | ||||
|  * | ||||
|  * Note: tracing ISRs requires that you insert calls to vTraceStoreISRBegin | ||||
|  * and vTraceStoreISREnd in your interrupt handlers. | ||||
|  *****************************************************************************/ | ||||
| #define TRC_CFG_INCLUDE_ISR_TRACING 1 | ||||
|  | ||||
|  /***************************************************************************** | ||||
|  * TRC_CFG_INCLUDE_READY_EVENTS | ||||
|  * | ||||
|  * Macro which should be defined as either zero (0) or one (1). | ||||
|  * | ||||
|  * If one (1), events are recorded when tasks enter scheduling state "ready". | ||||
|  * This allows Tracealyzer to show the initial pending time before tasks enter | ||||
|  * the execution state, and present accurate response times. | ||||
|  * If zero (0), "ready events" are not created, which allows for recording | ||||
|  * longer traces in the same amount of RAM. | ||||
|  * | ||||
|  * Default value is 1. | ||||
|  *****************************************************************************/ | ||||
| #define TRC_CFG_INCLUDE_READY_EVENTS 1 | ||||
|  | ||||
|  /***************************************************************************** | ||||
|  * TRC_CFG_INCLUDE_OSTICK_EVENTS | ||||
|  * | ||||
|  * Macro which should be defined as either zero (0) or one (1). | ||||
|  * | ||||
|  * If this is one (1), events will be generated whenever the OS clock is | ||||
|  * increased. If zero (0), OS tick events are not generated, which allows for | ||||
|  * recording longer traces in the same amount of RAM. | ||||
|  * | ||||
|  * Default value is 1. | ||||
|  *****************************************************************************/ | ||||
| #define TRC_CFG_INCLUDE_OSTICK_EVENTS 1 | ||||
|  | ||||
|  /***************************************************************************** | ||||
|  * TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS | ||||
|  * | ||||
|  * Macro which should be defined as either zero (0) or one (1). | ||||
|  * | ||||
|  * If this is zero (0), the trace will exclude any "event group" events. | ||||
|  * | ||||
|  * Default value is 0 (excluded) since dependent on event_groups.c | ||||
|  *****************************************************************************/ | ||||
| #define TRC_CFG_INCLUDE_EVENT_GROUP_EVENTS 0 | ||||
|  | ||||
|  /***************************************************************************** | ||||
|  * TRC_CFG_INCLUDE_TIMER_EVENTS | ||||
|  * | ||||
|  * Macro which should be defined as either zero (0) or one (1). | ||||
|  * | ||||
|  * If this is zero (0), the trace will exclude any Timer events. | ||||
|  * | ||||
|  * Default value is 0 since dependent on timers.c | ||||
|  *****************************************************************************/ | ||||
| #define TRC_CFG_INCLUDE_TIMER_EVENTS 1 | ||||
|  | ||||
|  /***************************************************************************** | ||||
|  * TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS | ||||
|  * | ||||
|  * Macro which should be defined as either zero (0) or one (1). | ||||
|  * | ||||
|  * If this is zero (0), the trace will exclude any "pending function call" | ||||
|  * events, such as xTimerPendFunctionCall(). | ||||
|  * | ||||
|  * Default value is 0 since dependent on timers.c | ||||
|  *****************************************************************************/ | ||||
| #define TRC_CFG_INCLUDE_PEND_FUNC_CALL_EVENTS 1 | ||||
|  | ||||
| /******************************************************************************* | ||||
|  * Configuration Macro: TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS | ||||
|  * | ||||
|  * Macro which should be defined as either zero (0) or one (1). | ||||
|  * | ||||
|  * If this is zero (0), the trace will exclude any stream buffer or message | ||||
|  * buffer events. | ||||
|  * | ||||
|  * Default value is 0 since dependent on stream_buffer.c (new in FreeRTOS v10) | ||||
|  ******************************************************************************/ | ||||
| #define TRC_CFG_INCLUDE_STREAM_BUFFER_EVENTS 0 | ||||
|  | ||||
| /******************************************************************************* | ||||
|  * Configuration Macro: TRC_CFG_RECORDER_BUFFER_ALLOCATION | ||||
|  * | ||||
|  * Specifies how the recorder buffer is allocated (also in case of streaming, in | ||||
|  * port using the recorder's internal temporary buffer) | ||||
|  * | ||||
|  * Values: | ||||
|  * TRC_RECORDER_BUFFER_ALLOCATION_STATIC  - Static allocation (internal) | ||||
|  * TRC_RECORDER_BUFFER_ALLOCATION_DYNAMIC - Malloc in vTraceEnable | ||||
|  * TRC_RECORDER_BUFFER_ALLOCATION_CUSTOM  - Use vTraceSetRecorderDataBuffer | ||||
|  * | ||||
|  * Static and dynamic mode does the allocation for you, either in compile time | ||||
|  * (static) or in runtime (malloc). | ||||
|  * The custom mode allows you to control how and where the allocation is made, | ||||
|  * for details see TRC_ALLOC_CUSTOM_BUFFER and vTraceSetRecorderDataBuffer(). | ||||
|  ******************************************************************************/ | ||||
| #define TRC_CFG_RECORDER_BUFFER_ALLOCATION TRC_RECORDER_BUFFER_ALLOCATION_STATIC | ||||
|  | ||||
| /****************************************************************************** | ||||
|  * TRC_CFG_MAX_ISR_NESTING | ||||
|  * | ||||
|  * Defines how many levels of interrupt nesting the recorder can handle, in | ||||
|  * case multiple ISRs are traced and ISR nesting is possible. If this | ||||
|  * is exceeded, the particular ISR will not be traced and the recorder then | ||||
|  * logs an error message. This setting is used to allocate an internal stack | ||||
|  * for keeping track of the previous execution context (4 byte per entry). | ||||
|  * | ||||
|  * This value must be a non-zero positive constant, at least 1. | ||||
|  * | ||||
|  * Default value: 8 | ||||
|  *****************************************************************************/ | ||||
| #define TRC_CFG_MAX_ISR_NESTING 8 | ||||
|  | ||||
| /* Specific configuration, depending on Streaming/Snapshot mode */ | ||||
| #if (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_SNAPSHOT) | ||||
| #include "trcSnapshotConfig.h" | ||||
| #elif (TRC_CFG_RECORDER_MODE == TRC_RECORDER_MODE_STREAMING) | ||||
| #include "trcStreamingConfig.h" | ||||
| #endif | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif /* _TRC_CONFIG_H */ | ||||
| @@ -0,0 +1,378 @@ | ||||
| /******************************************************************************* | ||||
|  * Trace Recorder Library for Tracealyzer v4.1.4 | ||||
|  * Percepio AB, www.percepio.com | ||||
|  * | ||||
|  * trcSnapshotConfig.h | ||||
|  * | ||||
|  * Configuration parameters for trace recorder library in snapshot mode. | ||||
|  * Read more at http://percepio.com/2016/10/05/rtos-tracing/ | ||||
|  * | ||||
|  * Terms of Use | ||||
|  * This file is part of the trace recorder library (RECORDER), which is the | ||||
|  * intellectual property of Percepio AB (PERCEPIO) and provided under a | ||||
|  * license as follows. | ||||
|  * The RECORDER may be used free of charge for the purpose of recording data | ||||
|  * intended for analysis in PERCEPIO products. It may not be used or modified | ||||
|  * for other purposes without explicit permission from PERCEPIO. | ||||
|  * You may distribute the RECORDER in its original source code form, assuming | ||||
|  * this text (terms of use, disclaimer, copyright notice) is unchanged. You are | ||||
|  * allowed to distribute the RECORDER with minor modifications intended for | ||||
|  * configuration or porting of the RECORDER, e.g., to allow using it on a | ||||
|  * specific processor, processor family or with a specific communication | ||||
|  * interface. Any such modifications should be documented directly below | ||||
|  * this comment block. | ||||
|  * | ||||
|  * Disclaimer | ||||
|  * The RECORDER is being delivered to you AS IS and PERCEPIO makes no warranty | ||||
|  * as to its use or performance. PERCEPIO does not and cannot warrant the | ||||
|  * performance or results you may obtain by using the RECORDER or documentation. | ||||
|  * PERCEPIO make no warranties, express or implied, as to noninfringement of | ||||
|  * third party rights, merchantability, or fitness for any particular purpose. | ||||
|  * In no event will PERCEPIO, its technology partners, or distributors be liable | ||||
|  * to you for any consequential, incidental or special damages, including any | ||||
|  * lost profits or lost savings, even if a representative of PERCEPIO has been | ||||
|  * advised of the possibility of such damages, or for any claim by any third | ||||
|  * party. Some jurisdictions do not allow the exclusion or limitation of | ||||
|  * incidental, consequential or special damages, or the exclusion of implied | ||||
|  * warranties or limitations on how long an implied warranty may last, so the | ||||
|  * above limitations may not apply to you. | ||||
|  * | ||||
|  * Tabs are used for indent in this file (1 tab = 4 spaces) | ||||
|  * | ||||
|  * Copyright Percepio AB, 2018. | ||||
|  * www.percepio.com | ||||
|  ******************************************************************************/ | ||||
|  | ||||
| #ifndef TRC_SNAPSHOT_CONFIG_H | ||||
| #define TRC_SNAPSHOT_CONFIG_H | ||||
|  | ||||
| #define TRC_SNAPSHOT_MODE_RING_BUFFER		(0x01) | ||||
| #define TRC_SNAPSHOT_MODE_STOP_WHEN_FULL	(0x02) | ||||
|  | ||||
| /****************************************************************************** | ||||
|  * TRC_CFG_SNAPSHOT_MODE | ||||
|  * | ||||
|  * Macro which should be defined as one of: | ||||
|  * - TRC_SNAPSHOT_MODE_RING_BUFFER | ||||
|  * - TRC_SNAPSHOT_MODE_STOP_WHEN_FULL | ||||
|  * Default is TRC_SNAPSHOT_MODE_RING_BUFFER. | ||||
|  * | ||||
|  * With TRC_CFG_SNAPSHOT_MODE set to TRC_SNAPSHOT_MODE_RING_BUFFER, the | ||||
|  * events are stored in a ring buffer, i.e., where the oldest events are | ||||
|  * overwritten when the buffer becomes full. This allows you to get the last | ||||
|  * events leading up to an interesting state, e.g., an error, without having | ||||
|  * to store the whole run since startup. | ||||
|  * | ||||
|  * When TRC_CFG_SNAPSHOT_MODE is TRC_SNAPSHOT_MODE_STOP_WHEN_FULL, the | ||||
|  * recording is stopped when the buffer becomes full. This is useful for | ||||
|  * recording events following a specific state, e.g., the startup sequence. | ||||
|  *****************************************************************************/ | ||||
| #define TRC_CFG_SNAPSHOT_MODE TRC_SNAPSHOT_MODE_RING_BUFFER | ||||
|  | ||||
| /******************************************************************************* | ||||
|  * TRC_CFG_EVENT_BUFFER_SIZE | ||||
|  * | ||||
|  * Macro which should be defined as an integer value. | ||||
|  * | ||||
|  * This defines the capacity of the event buffer, i.e., the number of records | ||||
|  * it may store. Most events use one record (4 byte), although some events | ||||
|  * require multiple 4-byte records. You should adjust this to the amount of RAM | ||||
|  * available in the target system. | ||||
|  * | ||||
|  * Default value is 1000, which means that 4000 bytes is allocated for the | ||||
|  * event buffer. | ||||
|  ******************************************************************************/ | ||||
| #define TRC_CFG_EVENT_BUFFER_SIZE 15000 | ||||
|  | ||||
| /******************************************************************************* | ||||
|  * TRC_CFG_NTASK, TRC_CFG_NISR, TRC_CFG_NQUEUE, TRC_CFG_NSEMAPHORE... | ||||
|  * | ||||
|  * A group of macros which should be defined as integer values, zero or larger. | ||||
|  * | ||||
|  * These define the capacity of the Object Property Table, i.e., the maximum | ||||
|  * number of objects active at any given point, within each object class (e.g., | ||||
|  * task, queue, semaphore, ...). | ||||
|  * | ||||
|  * If tasks or other objects are deleted in your system, this | ||||
|  * setting does not limit the total amount of objects created, only the number | ||||
|  * of objects that have been successfully created but not yet deleted. | ||||
|  * | ||||
|  * Using too small values will cause vTraceError to be called, which stores an | ||||
|  * error message in the trace that is shown when opening the trace file. The | ||||
|  * error message can also be retrieved using xTraceGetLastError. | ||||
|  * | ||||
|  * It can be wise to start with large values for these constants, | ||||
|  * unless you are very confident on these numbers. Then do a recording and | ||||
|  * check the actual usage by selecting View menu -> Trace Details -> | ||||
|  * Resource Usage -> Object Table. | ||||
|  ******************************************************************************/ | ||||
| #define TRC_CFG_NTASK			150 | ||||
| #define TRC_CFG_NISR			90 | ||||
| #define TRC_CFG_NQUEUE			90 | ||||
| #define TRC_CFG_NSEMAPHORE		90 | ||||
| #define TRC_CFG_NMUTEX			90 | ||||
| #define TRC_CFG_NTIMER			250 | ||||
| #define TRC_CFG_NEVENTGROUP		90 | ||||
| #define TRC_CFG_NSTREAMBUFFER	50 | ||||
| #define TRC_CFG_NMESSAGEBUFFER	50 | ||||
|  | ||||
|  | ||||
| /****************************************************************************** | ||||
|  * TRC_CFG_INCLUDE_FLOAT_SUPPORT | ||||
|  * | ||||
|  * Macro which should be defined as either zero (0) or one (1). | ||||
|  * | ||||
|  * If this is zero (0), the support for logging floating point values in | ||||
|  * vTracePrintF is stripped out, in case floating point values are not used or | ||||
|  * supported by the platform used. | ||||
|  * | ||||
|  * Floating point values are only used in vTracePrintF and its subroutines, to | ||||
|  * allow for storing float (%f) or double (%lf) arguments. | ||||
|  * | ||||
|  * vTracePrintF can be used with integer and string arguments in either case. | ||||
|  * | ||||
|  * Default value is 0. | ||||
|  *****************************************************************************/ | ||||
| #define TRC_CFG_INCLUDE_FLOAT_SUPPORT 0 | ||||
|  | ||||
| /******************************************************************************* | ||||
|  * TRC_CFG_SYMBOL_TABLE_SIZE | ||||
|  * | ||||
|  * Macro which should be defined as an integer value. | ||||
|  * | ||||
|  * This defines the capacity of the symbol table, in bytes. This symbol table | ||||
|  * stores User Events labels and names of deleted tasks, queues, or other kernel | ||||
|  * objects. If you don't use User Events or delete any kernel | ||||
|  * objects you set this to a very low value. The minimum recommended value is 4. | ||||
|  * A size of zero (0) is not allowed since a zero-sized array may result in a | ||||
|  * 32-bit pointer, i.e., using 4 bytes rather than 0. | ||||
|  * | ||||
|  * Default value is 800. | ||||
|  ******************************************************************************/ | ||||
| #define TRC_CFG_SYMBOL_TABLE_SIZE 5000 | ||||
|  | ||||
| #if (TRC_CFG_SYMBOL_TABLE_SIZE == 0) | ||||
| #error "TRC_CFG_SYMBOL_TABLE_SIZE may not be zero!" | ||||
| #endif | ||||
|  | ||||
| /****************************************************************************** | ||||
|  * TRC_CFG_NAME_LEN_TASK, TRC_CFG_NAME_LEN_QUEUE, ... | ||||
|  * | ||||
|  * Macros that specify the maximum lengths (number of characters) for names of | ||||
|  * kernel objects, such as tasks and queues. If longer names are used, they will | ||||
|  * be truncated when stored in the recorder. | ||||
|  *****************************************************************************/ | ||||
| #define TRC_CFG_NAME_LEN_TASK			15 | ||||
| #define TRC_CFG_NAME_LEN_ISR			15 | ||||
| #define TRC_CFG_NAME_LEN_QUEUE			15 | ||||
| #define TRC_CFG_NAME_LEN_SEMAPHORE		15 | ||||
| #define TRC_CFG_NAME_LEN_MUTEX			15 | ||||
| #define TRC_CFG_NAME_LEN_TIMER			15 | ||||
| #define TRC_CFG_NAME_LEN_EVENTGROUP 	15 | ||||
| #define TRC_CFG_NAME_LEN_STREAMBUFFER 	15 | ||||
| #define TRC_CFG_NAME_LEN_MESSAGEBUFFER 	15 | ||||
|  | ||||
| /****************************************************************************** | ||||
|  *** ADVANCED SETTINGS ******************************************************** | ||||
|  ****************************************************************************** | ||||
|  * The remaining settings are not necessary to modify but allows for optimizing | ||||
|  * the recorder setup for your specific needs, e.g., to exclude events that you | ||||
|  * are not interested in, in order to get longer traces. | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| /****************************************************************************** | ||||
| * TRC_CFG_HEAP_SIZE_BELOW_16M | ||||
| * | ||||
| * An integer constant that can be used to reduce the buffer usage of memory | ||||
| * allocation events (malloc/free). This value should be 1 if the heap size is | ||||
| * below 16 MB (2^24 byte), and you can live with reported addresses showing the | ||||
| * lower 24 bits only. If 0, you get the full 32-bit addresses. | ||||
| * | ||||
| * Default value is 0. | ||||
| ******************************************************************************/ | ||||
| #define TRC_CFG_HEAP_SIZE_BELOW_16M 0 | ||||
|  | ||||
| /****************************************************************************** | ||||
|  * TRC_CFG_USE_IMPLICIT_IFE_RULES | ||||
|  * | ||||
|  * Macro which should be defined as either zero (0) or one (1). | ||||
|  * Default is 1. | ||||
|  * | ||||
|  * Tracealyzer groups the events into "instances" based on Instance Finish | ||||
|  * Events (IFEs), produced either by default rules or calls to the recorder | ||||
|  * functions vTraceInstanceFinishedNow and vTraceInstanceFinishedNext. | ||||
|  * | ||||
|  * If TRC_CFG_USE_IMPLICIT_IFE_RULES is one (1), the default IFE rules is | ||||
|  * used, resulting in a "typical" grouping of events into instances. | ||||
|  * If these rules don't give appropriate instances in your case, you can | ||||
|  * override the default rules using vTraceInstanceFinishedNow/Next for one | ||||
|  * or several tasks. The default IFE rules are then disabled for those tasks. | ||||
|  * | ||||
|  * If TRC_CFG_USE_IMPLICIT_IFE_RULES is zero (0), the implicit IFE rules are | ||||
|  * disabled globally. You must then call vTraceInstanceFinishedNow or | ||||
|  * vTraceInstanceFinishedNext to manually group the events into instances, | ||||
|  * otherwise the tasks will appear a single long instance. | ||||
|  * | ||||
|  * The default IFE rules count the following events as "instance finished": | ||||
|  * - Task delay, delay until | ||||
|  * - Task suspend | ||||
|  * - Blocking on "input" operations, i.e., when the task is waiting for the | ||||
|  *   next a message/signal/event. But only if this event is blocking. | ||||
|  * | ||||
|  * For details, see trcSnapshotKernelPort.h and look for references to the | ||||
|  * macro trcKERNEL_HOOKS_SET_TASK_INSTANCE_FINISHED. | ||||
|  *****************************************************************************/ | ||||
| #define TRC_CFG_USE_IMPLICIT_IFE_RULES 1 | ||||
|  | ||||
| /****************************************************************************** | ||||
|  * TRC_CFG_USE_16BIT_OBJECT_HANDLES | ||||
|  * | ||||
|  * Macro which should be defined as either zero (0) or one (1). | ||||
|  * | ||||
|  * If set to 0 (zero), the recorder uses 8-bit handles to identify kernel | ||||
|  * objects such as tasks and queues. This limits the supported number of | ||||
|  * concurrently active objects to 255 of each type (tasks, queues, mutexes, | ||||
|  * etc.) Note: 255, not 256, since handle 0 is reserved. | ||||
|  * | ||||
|  * If set to 1 (one), the recorder uses 16-bit handles to identify kernel | ||||
|  * objects such as tasks and queues. This limits the supported number of | ||||
|  * concurrent objects to 65535 of each type (object class). However, since the | ||||
|  * object property table is limited to 64 KB, the practical limit is about | ||||
|  * 3000 objects in total. | ||||
|  * | ||||
|  * Default is 0 (8-bit handles) | ||||
|  * | ||||
|  * NOTE: An object with handle above 255 will use an extra 4-byte record in | ||||
|  * the event buffer whenever the object is referenced. Moreover, some internal | ||||
|  * tables in the recorder gets slightly larger when using 16-bit handles. | ||||
|  *****************************************************************************/ | ||||
| #define TRC_CFG_USE_16BIT_OBJECT_HANDLES 0 | ||||
|  | ||||
| /****************************************************************************** | ||||
|  * TRC_CFG_USE_TRACE_ASSERT | ||||
|  * | ||||
|  * Macro which should be defined as either zero (0) or one (1). | ||||
|  * Default is 1. | ||||
|  * | ||||
|  * If this is one (1), the TRACE_ASSERT macro (used at various locations in the | ||||
|  * trace recorder) will verify that a relevant condition is true. | ||||
|  * If the condition is false, prvTraceError() will be called, which stops the | ||||
|  * recording and stores an error message that is displayed when opening the | ||||
|  * trace in Tracealyzer. | ||||
|  * | ||||
|  * This is used on several places in the recorder code for sanity checks on | ||||
|  * parameters. Can be switched off to reduce the footprint of the tracing, but | ||||
|  * we recommend to have it enabled initially. | ||||
|  *****************************************************************************/ | ||||
| #define TRC_CFG_USE_TRACE_ASSERT 1 | ||||
|  | ||||
| /******************************************************************************* | ||||
|  * TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER | ||||
|  * | ||||
|  * Macro which should be defined as an integer value. | ||||
|  * | ||||
|  * Set TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER to 1 to enable the | ||||
|  * separate user event buffer (UB). | ||||
|  * In this mode, user events are stored separately from other events, | ||||
|  * e.g., RTOS events. Thereby you can get a much longer history of | ||||
|  * user events as they don't need to share the buffer space with more | ||||
|  * frequent events. | ||||
|  * | ||||
|  * The UB is typically used with the snapshot ring-buffer mode, so the | ||||
|  * recording can continue when the main buffer gets full. And since the | ||||
|  * main buffer then overwrites the earliest events, Tracealyzer displays | ||||
|  * "Unknown Actor" instead of task scheduling for periods with UB data only. | ||||
|  * | ||||
|  * In UB mode, user events are structured as UB channels, which contains | ||||
|  * a channel name and a default format string. Register a UB channel using | ||||
|  * xTraceRegisterUBChannel. | ||||
|  * | ||||
|  * Events and data arguments are written using vTraceUBEvent and | ||||
|  * vTraceUBData. They are designed to provide efficient logging of | ||||
|  * repeating events, using the same format string within each channel. | ||||
|  * | ||||
|  * Examples: | ||||
|  * | ||||
|  *  traceString chn1 = xTraceRegisterString("Channel 1"); | ||||
|  *  traceString fmt1 = xTraceRegisterString("Event!"); | ||||
|  *  traceUBChannel UBCh1 = xTraceRegisterUBChannel(chn1, fmt1); | ||||
|  * | ||||
|  *  traceString chn2 = xTraceRegisterString("Channel 2"); | ||||
|  *  traceString fmt2 = xTraceRegisterString("X: %d, Y: %d"); | ||||
|  *	traceUBChannel UBCh2 = xTraceRegisterUBChannel(chn2, fmt2); | ||||
|  * | ||||
|  *  // Result in "[Channel 1] Event!" | ||||
|  *	vTraceUBEvent(UBCh1); | ||||
|  * | ||||
|  *  // Result in "[Channel 2] X: 23, Y: 19" | ||||
|  *	vTraceUBData(UBCh2, 23, 19); | ||||
|  * | ||||
|  * You can also use the other user event functions, like vTracePrintF. | ||||
|  * as they are then rerouted to the UB instead of the main event buffer. | ||||
|  * vTracePrintF then looks up the correct UB channel based on the | ||||
|  * provided channel name and format string, or creates a new UB channel | ||||
|  * if no match is found. The format string should therefore not contain | ||||
|  * "random" messages but mainly format specifiers. Random strings should | ||||
|  * be stored using %s and with the string as an argument. | ||||
|  * | ||||
|  *  // Creates a new UB channel ("Channel 2", "%Z: %d") | ||||
|  *  vTracePrintF(chn2, "%Z: %d", value1); | ||||
|  * | ||||
|  *  // Finds the existing UB channel | ||||
|  *  vTracePrintF(chn2, "%Z: %d", value2); | ||||
|  | ||||
|  ******************************************************************************/ | ||||
| #define TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER 0 | ||||
|  | ||||
| /******************************************************************************* | ||||
|  * TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE | ||||
|  * | ||||
|  * Macro which should be defined as an integer value. | ||||
|  * | ||||
|  * This defines the capacity of the user event buffer (UB), in number of slots. | ||||
|  * A single user event can use multiple slots, depending on the arguments. | ||||
|  * | ||||
|  * Only applicable if TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER is 1. | ||||
|  ******************************************************************************/ | ||||
| #define TRC_CFG_SEPARATE_USER_EVENT_BUFFER_SIZE 200 | ||||
|  | ||||
| /******************************************************************************* | ||||
|  * TRC_CFG_UB_CHANNELS | ||||
|  * | ||||
|  * Macro which should be defined as an integer value. | ||||
|  * | ||||
|  * This defines the number of User Event Buffer Channels (UB channels). | ||||
|  * These are used to structure the events when using the separate user | ||||
|  * event buffer, and contains both a User Event Channel (the name) and | ||||
|  * a default format string for the channel. | ||||
|  * | ||||
|  * Only applicable if TRC_CFG_USE_SEPARATE_USER_EVENT_BUFFER is 1. | ||||
|  ******************************************************************************/ | ||||
| #define TRC_CFG_UB_CHANNELS 32 | ||||
|  | ||||
| /******************************************************************************* | ||||
|  * TRC_CFG_ISR_TAILCHAINING_THRESHOLD | ||||
|  * | ||||
|  * Macro which should be defined as an integer value. | ||||
|  * | ||||
|  * If tracing multiple ISRs, this setting allows for accurate display of the | ||||
|  * context-switching also in cases when the ISRs execute in direct sequence. | ||||
|  * | ||||
|  * vTraceStoreISREnd normally assumes that the ISR returns to the previous | ||||
|  * context, i.e., a task or a preempted ISR. But if another traced ISR | ||||
|  * executes in direct sequence, Tracealyzer may incorrectly display a minimal | ||||
|  * fragment of the previous context in between the ISRs. | ||||
|  * | ||||
|  * By using TRC_CFG_ISR_TAILCHAINING_THRESHOLD you can avoid this. This is | ||||
|  * however a threshold value that must be measured for your specific setup. | ||||
|  * See http://percepio.com/2014/03/21/isr_tailchaining_threshold/ | ||||
|  * | ||||
|  * The default setting is 0, meaning "disabled" and that you may get an | ||||
|  * extra fragments of the previous context in between tail-chained ISRs. | ||||
|  * | ||||
|  * Note: This setting has separate definitions in trcSnapshotConfig.h and | ||||
|  * trcStreamingConfig.h, since it is affected by the recorder mode. | ||||
|  ******************************************************************************/ | ||||
| #define TRC_CFG_ISR_TAILCHAINING_THRESHOLD 0 | ||||
|  | ||||
| #endif /*TRC_SNAPSHOT_CONFIG_H*/ | ||||
| @@ -0,0 +1,221 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| #pragma comment( lib, "ws2_32.lib" ) | ||||
|  | ||||
| /* Win32 includes. */ | ||||
| #include <WinSock2.h> | ||||
| #include <stdio.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
|  | ||||
| /* FreeRTOS+CLI includes. */ | ||||
| #include "FreeRTOS_CLI.h" | ||||
|  | ||||
| /* Dimensions the buffer into which input characters are placed. */ | ||||
| #define cmdMAX_INPUT_SIZE	60 | ||||
|  | ||||
| /* Dimensions the buffer into which string outputs can be placed. */ | ||||
| #define cmdMAX_OUTPUT_SIZE	1024 | ||||
|  | ||||
| /* Dimensions the buffer passed to the recvfrom() call. */ | ||||
| #define cmdSOCKET_INPUT_BUFFER_SIZE 60 | ||||
|  | ||||
| /* | ||||
|  * Open and configure the UDP socket. | ||||
|  */ | ||||
| static SOCKET prvOpenUDPSocket( void ); | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* | ||||
|  * Task that provides the input and output for the FreeRTOS+CLI command | ||||
|  * interpreter.  In this case a UDP port is used.  See the URL in the comments | ||||
|  * within main.c for the location of the online documentation. | ||||
|  */ | ||||
| void vUDPCommandInterpreterTask( void *pvParameters ) | ||||
| { | ||||
| long lBytes, lByte; | ||||
| signed char cInChar, cInputIndex = 0; | ||||
| static signed char cInputString[ cmdMAX_INPUT_SIZE ], cOutputString[ cmdMAX_OUTPUT_SIZE ], cLocalBuffer[ cmdSOCKET_INPUT_BUFFER_SIZE ]; | ||||
| BaseType_t xMoreDataToFollow; | ||||
| volatile int iErrorCode = 0; | ||||
| struct sockaddr_in xClient; | ||||
| int xClientAddressLength = sizeof( struct sockaddr_in ); | ||||
| SOCKET xSocket; | ||||
|  | ||||
| 	/* Just to prevent compiler warnings. */ | ||||
| 	( void ) pvParameters; | ||||
|  | ||||
| 	/* Attempt to open the socket. */ | ||||
| 	xSocket = prvOpenUDPSocket(); | ||||
|  | ||||
| 	if( xSocket != INVALID_SOCKET ) | ||||
| 	{ | ||||
| 		for( ;; ) | ||||
| 		{ | ||||
| 			/* Wait for incoming data on the opened socket. */ | ||||
| 			lBytes = recvfrom( xSocket, cLocalBuffer, sizeof( cLocalBuffer ), 0, ( struct sockaddr * ) &xClient, &xClientAddressLength ); | ||||
|  | ||||
| 			if( lBytes == SOCKET_ERROR ) | ||||
| 			{ | ||||
| 				/* Something went wrong, but it is not handled by this simple | ||||
| 				example. */ | ||||
| 				iErrorCode = WSAGetLastError(); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				/* Process each received byte in turn. */ | ||||
| 				lByte = 0; | ||||
| 				while( lByte < lBytes ) | ||||
| 				{ | ||||
| 					/* The next character in the input buffer. */ | ||||
| 					cInChar = cLocalBuffer[ lByte ]; | ||||
| 					lByte++; | ||||
|  | ||||
| 					/* Newline characters are taken as the end of the command | ||||
| 					string. */ | ||||
| 					if( cInChar == '\n' ) | ||||
| 					{ | ||||
| 						/* Process the input string received prior to the | ||||
| 						newline. */ | ||||
| 						do | ||||
| 						{ | ||||
| 							/* Pass the string to FreeRTOS+CLI. */ | ||||
| 							xMoreDataToFollow = FreeRTOS_CLIProcessCommand( cInputString, cOutputString, cmdMAX_OUTPUT_SIZE ); | ||||
|  | ||||
| 							/* Send the output generated by the command's | ||||
| 							implementation. */ | ||||
| 							sendto( xSocket, cOutputString,  strlen( cOutputString ), 0, ( SOCKADDR * ) &xClient, xClientAddressLength ); | ||||
|  | ||||
| 						} while( xMoreDataToFollow != pdFALSE ); /* Until the command does not generate any more output. */ | ||||
|  | ||||
| 						/* All the strings generated by the command processing | ||||
| 						have been sent.  Clear the input string ready to receive | ||||
| 						the next command. */ | ||||
| 						cInputIndex = 0; | ||||
| 						memset( cInputString, 0x00, cmdMAX_INPUT_SIZE ); | ||||
|  | ||||
| 						/* Transmit a spacer, just to make the command console | ||||
| 						easier to read. */ | ||||
| 						sendto( xSocket, "\r\n",  strlen( "\r\n" ), 0, ( SOCKADDR * ) &xClient, xClientAddressLength ); | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
| 						if( cInChar == '\r' ) | ||||
| 						{ | ||||
| 							/* Ignore the character.  Newlines are used to | ||||
| 							detect the end of the input string. */ | ||||
| 						} | ||||
| 						else if( cInChar == '\b' ) | ||||
| 						{ | ||||
| 							/* Backspace was pressed.  Erase the last character | ||||
| 							in the string - if any. */ | ||||
| 							if( cInputIndex > 0 ) | ||||
| 							{ | ||||
| 								cInputIndex--; | ||||
| 								cInputString[ cInputIndex ] = '\0'; | ||||
| 							} | ||||
| 						} | ||||
| 						else | ||||
| 						{ | ||||
| 							/* A character was entered.  Add it to the string | ||||
| 							entered so far.  When a \n is entered the complete | ||||
| 							string will be passed to the command interpreter. */ | ||||
| 							if( cInputIndex < cmdMAX_INPUT_SIZE ) | ||||
| 							{ | ||||
| 								cInputString[ cInputIndex ] = cInChar; | ||||
| 								cInputIndex++; | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* The socket could not be opened. */ | ||||
| 		vTaskDelete( NULL ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static SOCKET prvOpenUDPSocket( void ) | ||||
| { | ||||
| WSADATA xWSAData; | ||||
| WORD wVersionRequested; | ||||
| struct sockaddr_in xServer; | ||||
| SOCKET xSocket = INVALID_SOCKET; | ||||
|  | ||||
| 	wVersionRequested = MAKEWORD( 2, 2 ); | ||||
|  | ||||
| 	/* Prepare to use WinSock. */ | ||||
| 	if( WSAStartup( wVersionRequested, &xWSAData ) != 0 ) | ||||
| 	{ | ||||
| 		fprintf( stderr, "Could not open Windows connection.\n" ); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		xSocket = socket( AF_INET, SOCK_DGRAM, 0 ); | ||||
| 		if( xSocket == INVALID_SOCKET) | ||||
| 		{ | ||||
| 			fprintf( stderr, "Could not create socket.\n" ); | ||||
| 			WSACleanup(); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* Zero out the server structure. */ | ||||
| 			memset( ( void * ) &xServer, 0x00, sizeof( struct sockaddr_in ) ); | ||||
|  | ||||
| 			/* Set family and port. */ | ||||
| 			xServer.sin_family = AF_INET; | ||||
| 			xServer.sin_port = htons( configUDP_CLI_PORT_NUMBER ); | ||||
|  | ||||
| 			/* Assign the loopback address */ | ||||
| 			xServer.sin_addr.S_un.S_un_b.s_b1 = 127; | ||||
| 			xServer.sin_addr.S_un.S_un_b.s_b2 = 0; | ||||
| 			xServer.sin_addr.S_un.S_un_b.s_b3 = 0; | ||||
| 			xServer.sin_addr.S_un.S_un_b.s_b4 = 1; | ||||
|  | ||||
| 			/* Bind the address to the socket. */ | ||||
| 			if( bind( xSocket, ( struct sockaddr * ) &xServer, sizeof( struct sockaddr_in ) ) == -1 ) | ||||
| 			{ | ||||
| 				fprintf( stderr, "Could not socket to port %d.\n", configUDP_CLI_PORT_NUMBER ); | ||||
| 				closesocket( xSocket ); | ||||
| 				xSocket = INVALID_SOCKET; | ||||
| 				WSACleanup(); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return xSocket; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -0,0 +1,160 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
|   <ItemGroup Label="ProjectConfigurations"> | ||||
|     <ProjectConfiguration Include="Debug|Win32"> | ||||
|       <Configuration>Debug</Configuration> | ||||
|       <Platform>Win32</Platform> | ||||
|     </ProjectConfiguration> | ||||
|     <ProjectConfiguration Include="Release|Win32"> | ||||
|       <Configuration>Release</Configuration> | ||||
|       <Platform>Win32</Platform> | ||||
|     </ProjectConfiguration> | ||||
|   </ItemGroup> | ||||
|   <PropertyGroup Label="Globals"> | ||||
|     <ProjectGuid>{C686325E-3261-42F7-AEB1-DDE5280E1CEB}</ProjectGuid> | ||||
|     <ProjectName>RTOSDemo</ProjectName> | ||||
|   </PropertyGroup> | ||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> | ||||
|     <ConfigurationType>Application</ConfigurationType> | ||||
|     <UseOfMfc>false</UseOfMfc> | ||||
|     <CharacterSet>MultiByte</CharacterSet> | ||||
|     <PlatformToolset>v140</PlatformToolset> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> | ||||
|     <ConfigurationType>Application</ConfigurationType> | ||||
|     <UseOfMfc>false</UseOfMfc> | ||||
|     <CharacterSet>MultiByte</CharacterSet> | ||||
|     <PlatformToolset>v140</PlatformToolset> | ||||
|   </PropertyGroup> | ||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | ||||
|   <ImportGroup Label="ExtensionSettings"> | ||||
|   </ImportGroup> | ||||
|   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> | ||||
|     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||
|     <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> | ||||
|   </ImportGroup> | ||||
|   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> | ||||
|     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||
|     <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> | ||||
|   </ImportGroup> | ||||
|   <PropertyGroup Label="UserMacros" /> | ||||
|   <PropertyGroup> | ||||
|     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> | ||||
|     <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</OutDir> | ||||
|     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</IntDir> | ||||
|     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental> | ||||
|     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</OutDir> | ||||
|     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</IntDir> | ||||
|     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental> | ||||
|   </PropertyGroup> | ||||
|   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||||
|     <Midl> | ||||
|       <TypeLibraryName>.\Debug/WIN32.tlb</TypeLibraryName> | ||||
|       <HeaderFileName> | ||||
|       </HeaderFileName> | ||||
|     </Midl> | ||||
|     <ClCompile> | ||||
|       <Optimization>Disabled</Optimization> | ||||
|       <AdditionalIncludeDirectories>..\..\Source\FreeRTOS-Plus-Trace\Include;..\..\..\FreeRTOS\Source\include;..\..\..\FreeRTOS\Source\portable\MSVC-MingW;..\..\Source\FreeRTOS-Plus-CLI;.\Trace_Recorder_Configuration;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
|       <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;WINVER=0x400;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <MinimalRebuild>true</MinimalRebuild> | ||||
|       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> | ||||
|       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> | ||||
|       <PrecompiledHeaderOutputFile>.\Debug/WIN32.pch</PrecompiledHeaderOutputFile> | ||||
|       <AssemblerListingLocation>.\Debug/</AssemblerListingLocation> | ||||
|       <ObjectFileName>.\Debug/</ObjectFileName> | ||||
|       <ProgramDataBaseFileName>.\Debug/</ProgramDataBaseFileName> | ||||
|       <WarningLevel>Level4</WarningLevel> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <DisableLanguageExtensions>false</DisableLanguageExtensions> | ||||
|       <DebugInformationFormat>EditAndContinue</DebugInformationFormat> | ||||
|     </ClCompile> | ||||
|     <ResourceCompile> | ||||
|       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <Culture>0x0c09</Culture> | ||||
|     </ResourceCompile> | ||||
|     <Link> | ||||
|       <OutputFile>.\Debug/RTOSDemo.exe</OutputFile> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <GenerateDebugInformation>true</GenerateDebugInformation> | ||||
|       <ProgramDatabaseFile>.\Debug/WIN32.pdb</ProgramDatabaseFile> | ||||
|       <SubSystem>Console</SubSystem> | ||||
|       <TargetMachine>MachineX86</TargetMachine> | ||||
|       <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies> | ||||
|       <AdditionalLibraryDirectories> | ||||
|       </AdditionalLibraryDirectories> | ||||
|     </Link> | ||||
|     <Bscmake> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <OutputFile>.\Debug/WIN32.bsc</OutputFile> | ||||
|     </Bscmake> | ||||
|   </ItemDefinitionGroup> | ||||
|   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||||
|     <Midl> | ||||
|       <TypeLibraryName>.\Release/WIN32.tlb</TypeLibraryName> | ||||
|       <HeaderFileName> | ||||
|       </HeaderFileName> | ||||
|     </Midl> | ||||
|     <ClCompile> | ||||
|       <Optimization>MaxSpeed</Optimization> | ||||
|       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion> | ||||
|       <PreprocessorDefinitions>_WINSOCKAPI_;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <StringPooling>true</StringPooling> | ||||
|       <RuntimeLibrary>MultiThreaded</RuntimeLibrary> | ||||
|       <FunctionLevelLinking>true</FunctionLevelLinking> | ||||
|       <PrecompiledHeaderOutputFile>.\Release/WIN32.pch</PrecompiledHeaderOutputFile> | ||||
|       <AssemblerListingLocation>.\Release/</AssemblerListingLocation> | ||||
|       <ObjectFileName>.\Release/</ObjectFileName> | ||||
|       <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName> | ||||
|       <WarningLevel>Level3</WarningLevel> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <AdditionalIncludeDirectories>..\Common\Utils;..\Common\ethernet\lwip-1.4.0\ports\win32\WinPCap;..\Common\ethernet\lwip-1.4.0\src\include\ipv4;..\Common\ethernet\lwip-1.4.0\src\include;..\..\Source\include;..\..\Source\portable\MSVC-MingW;..\Common\ethernet\lwip-1.4.0\ports\win32\include;..\Common\Include;.\lwIP_Apps;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
|     </ClCompile> | ||||
|     <ResourceCompile> | ||||
|       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <Culture>0x0c09</Culture> | ||||
|     </ResourceCompile> | ||||
|     <Link> | ||||
|       <OutputFile>.\Release/RTOSDemo.exe</OutputFile> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <ProgramDatabaseFile>.\Release/WIN32.pdb</ProgramDatabaseFile> | ||||
|       <SubSystem>Console</SubSystem> | ||||
|       <TargetMachine>MachineX86</TargetMachine> | ||||
|       <AdditionalLibraryDirectories>..\Common\ethernet\lwip-1.4.0\ports\win32\WinPCap</AdditionalLibraryDirectories> | ||||
|       <AdditionalDependencies>wpcap.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||||
|     </Link> | ||||
|     <Bscmake> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <OutputFile>.\Release/WIN32.bsc</OutputFile> | ||||
|     </Bscmake> | ||||
|   </ItemDefinitionGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\list.c" /> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MemMang\heap_3.c" /> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MSVC-MingW\port.c" /> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\queue.c" /> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\tasks.c" /> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\timers.c" /> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-CLI\FreeRTOS_CLI.c" /> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-Trace\trcKernelPort.c" /> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-Trace\trcSnapshotRecorder.c" /> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-Trace\trcStreamingRecorder.c" /> | ||||
|     <ClCompile Include="CLI-commands.c" /> | ||||
|     <ClCompile Include="main.c"> | ||||
|       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
|       <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="Run-time-stats-utils.c" /> | ||||
|     <ClCompile Include="UDPCommandServer.c" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="FreeRTOSConfig.h" /> | ||||
|     <ClInclude Include="Trace_Recorder_Configuration\trcConfig.h" /> | ||||
|     <ClInclude Include="Trace_Recorder_Configuration\trcSnapshotConfig.h" /> | ||||
|   </ItemGroup> | ||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||||
|   <ImportGroup Label="ExtensionTargets"> | ||||
|   </ImportGroup> | ||||
| </Project> | ||||
| @@ -0,0 +1,95 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
|   <ItemGroup> | ||||
|     <Filter Include="Resource Files"> | ||||
|       <UniqueIdentifier>{38712199-cebf-4124-bf15-398f7c3419ea}</UniqueIdentifier> | ||||
|       <Extensions>ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions> | ||||
|     </Filter> | ||||
|     <Filter Include="Demo App Source"> | ||||
|       <UniqueIdentifier>{34567deb-d5ab-4a56-8640-0aaec609521a}</UniqueIdentifier> | ||||
|       <Extensions>cpp;c;cxx;rc;def;r;odl;idl;hpj;bat</Extensions> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS"> | ||||
|       <UniqueIdentifier>{af3445a1-4908-4170-89ed-39345d90d30c}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS\Source"> | ||||
|       <UniqueIdentifier>{f32be356-4763-4cae-9020-974a2638cb08}</UniqueIdentifier> | ||||
|       <Extensions>*.c</Extensions> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS\Source\Portable"> | ||||
|       <UniqueIdentifier>{88f409e6-d396-4ac5-94bd-7a99c914be46}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS+"> | ||||
|       <UniqueIdentifier>{e5ad4ec7-23dc-4295-8add-2acaee488f5a}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS+\FreeRTOS+Trace"> | ||||
|       <UniqueIdentifier>{629e761f-e8a8-430e-b44e-f38d83292b54}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS\Configuration Files"> | ||||
|       <UniqueIdentifier>{19ff1a34-36de-4c48-9d10-3fb1fa0d1fa4}</UniqueIdentifier> | ||||
|       <Extensions> | ||||
|       </Extensions> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS+\FreeRTOS+CLI"> | ||||
|       <UniqueIdentifier>{fd43c0ed-fdbc-437f-a5a3-c50399690bd7}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="Demo App Source\Trace Recorder Configuration"> | ||||
|       <UniqueIdentifier>{91dffc7b-279b-44f6-a2b2-f5d2e132a85d}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="main.c"> | ||||
|       <Filter>Demo App Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MSVC-MingW\port.c"> | ||||
|       <Filter>FreeRTOS\Source\Portable</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MemMang\heap_3.c"> | ||||
|       <Filter>FreeRTOS\Source\Portable</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\timers.c"> | ||||
|       <Filter>FreeRTOS\Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\list.c"> | ||||
|       <Filter>FreeRTOS\Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\queue.c"> | ||||
|       <Filter>FreeRTOS\Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\tasks.c"> | ||||
|       <Filter>FreeRTOS\Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="UDPCommandServer.c"> | ||||
|       <Filter>Demo App Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="CLI-commands.c"> | ||||
|       <Filter>Demo App Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="Run-time-stats-utils.c"> | ||||
|       <Filter>Demo App Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-CLI\FreeRTOS_CLI.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+CLI</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-Trace\trcKernelPort.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Trace</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-Trace\trcSnapshotRecorder.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Trace</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-Trace\trcStreamingRecorder.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Trace</Filter> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="FreeRTOSConfig.h"> | ||||
|       <Filter>FreeRTOS\Configuration Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="Trace_Recorder_Configuration\trcConfig.h"> | ||||
|       <Filter>Demo App Source\Trace Recorder Configuration</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="Trace_Recorder_Configuration\trcSnapshotConfig.h"> | ||||
|       <Filter>Demo App Source\Trace Recorder Configuration</Filter> | ||||
|     </ClInclude> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -0,0 +1,3 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
| </Project> | ||||
| @@ -0,0 +1,246 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  ****************************************************************************** | ||||
|  * -NOTE- The Win32 port is a simulation (or is that emulation?) only!  Do not | ||||
|  * expect to get real time behaviour from the Win32 port or this demo | ||||
|  * application.  It is provided as a convenient development and demonstration | ||||
|  * test bed only.  This was tested using Windows XP on a dual core laptop. | ||||
|  * | ||||
|  * Windows will not be running the FreeRTOS simulator threads continuously, so | ||||
|  * the timing information in the FreeRTOS+Trace logs have no meaningful units. | ||||
|  * See the documentation page for the Windows simulator for an explanation of | ||||
|  * the slow timing: | ||||
|  * http://www.freertos.org/FreeRTOS-Windows-Simulator-Emulator-for-Visual-Studio-and-Eclipse-MingW.html | ||||
|  * - READ THE WEB DOCUMENTATION FOR THIS PORT FOR MORE INFORMATION ON USING IT - | ||||
|  * | ||||
|  * Documentation for this demo can be found on: | ||||
|  * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_Trace/Free_RTOS_Plus_Trace_CLI_Example.shtml | ||||
|  ****************************************************************************** | ||||
|  * | ||||
|  * This is a simple FreeRTOS Windows simulator project that makes it easy to | ||||
|  * evaluate FreeRTOS+CLI and FreeRTOS+Trace on a standard desktop PC, without | ||||
|  * any external hardware or interfaces being required. | ||||
|  * | ||||
|  * To keep everything as simple as possible, the command line interface is | ||||
|  * accessed through a UDP socket on the default Windows loopback IP address of | ||||
|  * 127.0.0.1.  Full instructions are provided on the documentation page | ||||
|  * referenced above. | ||||
|  * | ||||
|  * Commands are provided to both start and stop a FreeRTOS+Trace recording. | ||||
|  * Stopping a recording will result in the recorded data being saved to the | ||||
|  * hard disk, ready for viewing in the FreeRTOS+Trace graphical user interface. | ||||
|  * Again, full instructions are provided on the documentation page referenced | ||||
|  * above. | ||||
|  * | ||||
|  * A queue send task and a queue receive task are defined in this file.  The | ||||
|  * queue receive task spends most of its time blocked on the queue waiting for | ||||
|  * messages to arrive.  The queue send task periodically sends a message to the | ||||
|  * queue, causing the queue receive task to exit the Blocked state.  The | ||||
|  * priority of the queue receive task is above that of the queue send task, so | ||||
|  * it pre-empts the queue send task as soon as it leaves the Blocked state.  It | ||||
|  * then consumes the message from the queue and prints "message received" to | ||||
|  * the screen before returning to block on the queue once again.  This | ||||
|  * sequencing is clearly visible in the recorded FreeRTOS+Trace data. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdio.h> | ||||
| #include <stdint.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include <FreeRTOS.h> | ||||
| #include "task.h" | ||||
| #include "queue.h" | ||||
|  | ||||
| /* Priorities at which the tasks are created. */ | ||||
| #define mainQUEUE_RECEIVE_TASK_PRIORITY		( tskIDLE_PRIORITY + 2 ) | ||||
| #define	mainQUEUE_SEND_TASK_PRIORITY		( tskIDLE_PRIORITY + 1 ) | ||||
| #define mainUDP_CLI_TASK_PRIORITY			( tskIDLE_PRIORITY ) | ||||
|  | ||||
| /* The rate at which data is sent to the queue.  The (simulated) 250ms value is | ||||
| converted to ticks using the portTICK_RATE_MS constant. */ | ||||
| #define mainQUEUE_SEND_FREQUENCY_MS			( 250 / portTICK_RATE_MS ) | ||||
|  | ||||
| /* The number of items the queue can hold.  This is 1 as the receive task | ||||
| will remove items as they are added, meaning the send task should always find | ||||
| the queue empty. */ | ||||
| #define mainQUEUE_LENGTH					( 1 ) | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* | ||||
|  * The queue send and receive tasks as described in the comments at the top of | ||||
|  * this file. | ||||
|  */ | ||||
| static void prvQueueReceiveTask( void *pvParameters ); | ||||
| static void prvQueueSendTask( void *pvParameters ); | ||||
|  | ||||
| /* | ||||
|  * The task that implements the UDP command interpreter using FreeRTOS+CLI. | ||||
|  */ | ||||
| extern void vUDPCommandInterpreterTask( void *pvParameters ); | ||||
|  | ||||
| /* | ||||
|  * Register commands that can be used with FreeRTOS+CLI through the UDP socket. | ||||
|  * The commands are defined in CLI-commands.c. | ||||
|  */ | ||||
| extern void vRegisterCLICommands( void ); | ||||
|  | ||||
| /* The queue used by both tasks. */ | ||||
| static xQueueHandle xQueue = NULL; | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| int main( void ) | ||||
| { | ||||
| const uint32_t ulLongTime_ms = 250UL; | ||||
|  | ||||
| 	/* Initialise the trace recorder and create the label used to post user | ||||
| 	events to the trace recording on each tick interrupt. */ | ||||
| 	vTraceEnable( TRC_START ); | ||||
|  | ||||
| 	/* Create the queue used to pass messages from the queue send task to the | ||||
| 	queue receive task. */ | ||||
| 	xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( unsigned long ) ); | ||||
|  | ||||
| 	/* Give the queue a name for the FreeRTOS+Trace log. */ | ||||
| 	vTraceSetQueueName( xQueue, "DemoQ" ); | ||||
|  | ||||
| 	/* Start the two tasks as described in the comments at the top of this | ||||
| 	file. */ | ||||
| 	xTaskCreate( prvQueueReceiveTask,				/* The function that implements the task. */ | ||||
| 				"Rx", 								/* The text name assigned to the task - for debug only as it is not used by the kernel. */ | ||||
| 				configMINIMAL_STACK_SIZE, 			/* The size of the stack to allocate to the task.  Not actually used as a stack in the Win32 simulator port. */ | ||||
| 				NULL,								/* The parameter passed to the task - not used in this example. */ | ||||
| 				mainQUEUE_RECEIVE_TASK_PRIORITY, 	/* The priority assigned to the task. */ | ||||
| 				NULL );								/* The task handle is not required, so NULL is passed. */ | ||||
|  | ||||
| 	xTaskCreate( prvQueueSendTask, "TX", configMINIMAL_STACK_SIZE, NULL, mainQUEUE_SEND_TASK_PRIORITY, NULL ); | ||||
|  | ||||
| 	/* Create the task that handles the CLI on a UDP port.  The port number | ||||
| 	is set using the configUDP_CLI_PORT_NUMBER setting in FreeRTOSConfig.h. */ | ||||
| 	xTaskCreate( vUDPCommandInterpreterTask, "CLI", configMINIMAL_STACK_SIZE, NULL, mainUDP_CLI_TASK_PRIORITY, NULL ); | ||||
|  | ||||
| 	/* Register commands with the FreeRTOS+CLI command interpreter. */ | ||||
| 	vRegisterCLICommands(); | ||||
|  | ||||
| 	/* Start the tasks and timer running. */ | ||||
| 	vTaskStartScheduler(); | ||||
|  | ||||
| 	/* If all is well, the scheduler will now be running, and the following | ||||
| 	line will never be reached.  If the following line does execute, then | ||||
| 	there was insufficient FreeRTOS heap memory available for the idle and/or | ||||
| 	timer tasks	to be created.  See the memory management section on the | ||||
| 	FreeRTOS web site for more details (this is standard text that is not | ||||
| 	really applicable to the Win32 simulator port). */ | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		Sleep( ulLongTime_ms ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvQueueSendTask( void *pvParameters ) | ||||
| { | ||||
| TickType_t xNextWakeTime; | ||||
| const unsigned long ulValueToSend = 100UL; | ||||
|  | ||||
| 	/* Remove warning about unused parameters. */ | ||||
| 	( void ) pvParameters; | ||||
|  | ||||
| 	/* Initialise xNextWakeTime - this only needs to be done once. */ | ||||
| 	xNextWakeTime = xTaskGetTickCount(); | ||||
|  | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		/* Place this task in the blocked state until it is time to run again. | ||||
| 		While in the Blocked state this task will not consume any CPU time. */ | ||||
| 		vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS ); | ||||
|  | ||||
| 		/* Send to the queue - causing the queue receive task to unblock and | ||||
| 		write a message to the display.  0 is used as the block time so the | ||||
| 		sending operation will not block - it shouldn't need to block as the | ||||
| 		queue should always	be empty at this point in the code, and it is an | ||||
| 		error if it is not. */ | ||||
| 		xQueueSend( xQueue, &ulValueToSend, 0U ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvQueueReceiveTask( void *pvParameters ) | ||||
| { | ||||
| unsigned long ulReceivedValue; | ||||
|  | ||||
| 	/* Remove warning about unused parameters. */ | ||||
| 	( void ) pvParameters; | ||||
|  | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		/* Wait until something arrives in the queue - this task will block | ||||
| 		indefinitely provided INCLUDE_vTaskSuspend is set to 1 in | ||||
| 		FreeRTOSConfig.h. */ | ||||
| 		xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY ); | ||||
|  | ||||
| 		/*  To get here something must have been received from the queue, but | ||||
| 		is it the expected value?  If it is, write the message to the | ||||
| 		display before looping back to block on the queue again. */ | ||||
| 		if( ulReceivedValue == 100UL ) | ||||
| 		{ | ||||
| 			printf( "Message received!\r\n" ); | ||||
| 			ulReceivedValue = 0U; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vApplicationIdleHook( void ) | ||||
| { | ||||
| const unsigned long ulMSToSleep = 5; | ||||
|  | ||||
| 	/* This function is called on each cycle of the idle task if | ||||
| 	configUSE_IDLE_HOOK is set to 1 in FreeRTOSConfig.h.  Sleep to reduce CPU | ||||
| 	load. */ | ||||
| 	Sleep( ulMSToSleep ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vAssertCalled( void ) | ||||
| { | ||||
| const unsigned long ulLongSleep = 1000UL; | ||||
|  | ||||
| 	taskDISABLE_INTERRUPTS(); | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		Sleep( ulLongSleep ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
|  | ||||
| @@ -0,0 +1,7 @@ | ||||
| Directories: | ||||
|  | ||||
| + FreeRTOS-Plus/Demo_Projects_Using_FreeRTOS_Simulator/FreeRTOS_Plus_CLI_with_Trace | ||||
|   contains a FreeRTOS windows simulator demo project for both FreeRTOS+CLI and | ||||
|   FreeRTOS+Trace.  See http://www.FreeRTOS.org/trace for information on using | ||||
|   the project. | ||||
|    | ||||
| @@ -0,0 +1,7 @@ | ||||
| This demo was removed in FreeRTOS V10.0.0 as FreeRTOS+FAT SL was not distributed | ||||
| in that release.  The full FreeRTOS+FAT product (as opposed to the 'SL' Super | ||||
| Lean product) is still available.  Previous versions of FreeRTOS can be | ||||
| downloaded from http://sourceforge.net/projects/freertos/files/FreeRTOS/ | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -0,0 +1,131 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| #ifndef FREERTOS_CONFIG_H | ||||
| #define FREERTOS_CONFIG_H | ||||
|  | ||||
| /*----------------------------------------------------------- | ||||
|  * Application specific definitions. | ||||
|  * | ||||
|  * These definitions should be adjusted for your particular hardware and | ||||
|  * application requirements. | ||||
|  * | ||||
|  * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE | ||||
|  * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. | ||||
|  * http://www.freertos.org/a00110.html | ||||
|  * | ||||
|  * The bottom of this file contains some constants specific to running the UDP | ||||
|  * stack in this demo.  Constants specific to FreeRTOS+UDP itself (rather than | ||||
|  * the demo) are contained in FreeRTOSIPConfig.h. | ||||
|  *----------------------------------------------------------*/ | ||||
|  | ||||
| #define configUSE_PREEMPTION			1 | ||||
| #define configMAX_PRIORITIES			( 7 ) | ||||
| #define configTICK_RATE_HZ				( 1000 ) /* In this non-real time simulated environment the tick frequency has to be at least a multiple of the Win32 tick frequency, and therefore very slow. */ | ||||
| #define configMINIMAL_STACK_SIZE		( ( unsigned short ) 60 ) /* In this simulated case, the stack only has to hold one small structure as the real stack is part of the Win32 thread. */ | ||||
| #define configTOTAL_HEAP_SIZE			( ( size_t ) ( 32U * 1024U ) ) | ||||
| #define configMAX_TASK_NAME_LEN			( 7 ) | ||||
| #define configUSE_TRACE_FACILITY		1 | ||||
| #define configUSE_16_BIT_TICKS			0 | ||||
| #define configIDLE_SHOULD_YIELD			1 | ||||
| #define configUSE_CO_ROUTINES 			0 | ||||
| #define configUSE_MUTEXES				1 | ||||
| #define configUSE_RECURSIVE_MUTEXES		1 | ||||
| #define configQUEUE_REGISTRY_SIZE		0 | ||||
| #define configUSE_APPLICATION_TASK_TAG	0 | ||||
| #define configUSE_COUNTING_SEMAPHORES	1 | ||||
| #define configUSE_ALTERNATIVE_API		0 | ||||
|  | ||||
| /* Hook function related definitions. */ | ||||
| #define configUSE_TICK_HOOK				0 | ||||
| #define configUSE_IDLE_HOOK				1 | ||||
| #define configUSE_MALLOC_FAILED_HOOK	1 | ||||
| #define configCHECK_FOR_STACK_OVERFLOW	0 /* Not applicable to the Win32 port. */ | ||||
|  | ||||
| /* Software timer related definitions. */ | ||||
| #define configUSE_TIMERS				1 | ||||
| #define configTIMER_TASK_PRIORITY		( configMAX_PRIORITIES - 1 ) | ||||
| #define configTIMER_QUEUE_LENGTH		5 | ||||
| #define configTIMER_TASK_STACK_DEPTH	( configMINIMAL_STACK_SIZE * 2 ) | ||||
|  | ||||
| /* Run time stats gathering definitions. */ | ||||
| unsigned long ulGetRunTimeCounterValue( void ); | ||||
| void vConfigureTimerForRunTimeStats( void ); | ||||
| #define configGENERATE_RUN_TIME_STATS	1 | ||||
| #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vConfigureTimerForRunTimeStats() | ||||
| #define portGET_RUN_TIME_COUNTER_VALUE() ulGetRunTimeCounterValue() | ||||
|  | ||||
| /* Co-routine definitions. */ | ||||
| #define configUSE_CO_ROUTINES 			0 | ||||
| #define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) | ||||
|  | ||||
| /* Set the following definitions to 1 to include the API function, or zero | ||||
| to exclude the API function. */ | ||||
| #define INCLUDE_vTaskPrioritySet			1 | ||||
| #define INCLUDE_uxTaskPriorityGet			1 | ||||
| #define INCLUDE_vTaskDelete					1 | ||||
| #define INCLUDE_vTaskCleanUpResources		0 | ||||
| #define INCLUDE_vTaskSuspend				1 | ||||
| #define INCLUDE_vTaskDelayUntil				1 | ||||
| #define INCLUDE_vTaskDelay					1 | ||||
| #define INCLUDE_uxTaskGetStackHighWaterMark	1 | ||||
| #define INCLUDE_xTaskGetSchedulerState		1 | ||||
| #define INCLUDE_xTimerGetTimerTaskHandle	0 | ||||
| #define INCLUDE_xTaskGetIdleTaskHandle		0 | ||||
| #define INCLUDE_xQueueGetMutexHolder		1 | ||||
| #define INCLUDE_xTaskGetCurrentTaskHandle	1 | ||||
|  | ||||
| /* This demo makes use of one or more example stats formatting functions.  These | ||||
| format the raw data provided by the uxTaskGetSystemState() function in to human | ||||
| readable ASCII form.  See the notes in the implementation of vTaskList() within  | ||||
| FreeRTOS/Source/tasks.c for limitations. */ | ||||
| #define configUSE_STATS_FORMATTING_FUNCTIONS	1 | ||||
|  | ||||
| /* Assert call defined for debug builds. */ | ||||
| #ifdef _DEBUG | ||||
| 	extern void vAssertCalled( const char *pcFile, unsigned long ulLine ); | ||||
| 	#define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ ) | ||||
| #endif /* _DEBUG */ | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Application specific definitions follow. **********************************/ | ||||
|  | ||||
| /* The UDP port to use for incoming command inputs.  The outgoing port is | ||||
| set to ( configUDP_CLI_PORT_NUMBER + 1 ). */ | ||||
| #define configUDP_CLI_PORT_NUMBER	5001 | ||||
|  | ||||
| /* The size of the global output buffer that is available for use when there | ||||
| are multiple command interpreters running at once (for example, one on a UART | ||||
| and one on TCP/IP).  This is done to prevent an output buffer being defined by | ||||
| each implementation - which would waste RAM.  In this case, there is only one | ||||
| command interpreter running, and it has its own local output buffer, so the | ||||
| global buffer is just set to be one byte long as it is not used and should not | ||||
| take up unnecessary RAM. */ | ||||
| #define configCOMMAND_INT_MAX_OUTPUT_SIZE 1 | ||||
|  | ||||
| #endif /* FREERTOS_CONFIG_H */ | ||||
| @@ -0,0 +1,17 @@ | ||||
| /*  THIS FILE WAS GENERATED BY THE DATALIGHT RELIANCE EDGE CONFIGURATION | ||||
|     UTILITY.  DO NOT MODIFY. | ||||
|  | ||||
|     Generated by configuration utility version 2.0 | ||||
| */ | ||||
| /** @file | ||||
| */ | ||||
| #include <redconf.h> | ||||
| #include <redtypes.h> | ||||
| #include <redmacs.h> | ||||
| #include <redvolume.h> | ||||
|  | ||||
|  | ||||
| const VOLCONF gaRedVolConf[REDCONF_VOLUME_COUNT] = | ||||
| { | ||||
|     { 512U, 65536U, false, 256U, 0U, "" } | ||||
| }; | ||||
| @@ -0,0 +1,112 @@ | ||||
| /*  THIS FILE WAS GENERATED BY THE DATALIGHT RELIANCE EDGE CONFIGURATION | ||||
|     UTILITY.  DO NOT MODIFY. | ||||
|  | ||||
|     Generated by configuration utility version 2.0 | ||||
| */ | ||||
| /** @file | ||||
| */ | ||||
| #ifndef REDCONF_H | ||||
| #define REDCONF_H | ||||
|  | ||||
|  | ||||
| #include <string.h> | ||||
|  | ||||
| #define REDCONF_READ_ONLY 0 | ||||
|  | ||||
| #define REDCONF_API_POSIX 1 | ||||
|  | ||||
| #define REDCONF_API_FSE 0 | ||||
|  | ||||
| #define REDCONF_API_POSIX_FORMAT 1 | ||||
|  | ||||
| #define REDCONF_API_POSIX_LINK 1 | ||||
|  | ||||
| #define REDCONF_API_POSIX_UNLINK 1 | ||||
|  | ||||
| #define REDCONF_API_POSIX_MKDIR 1 | ||||
|  | ||||
| #define REDCONF_API_POSIX_RMDIR 1 | ||||
|  | ||||
| #define REDCONF_API_POSIX_RENAME 1 | ||||
|  | ||||
| #define REDCONF_RENAME_ATOMIC 1 | ||||
|  | ||||
| #define REDCONF_API_POSIX_FTRUNCATE 1 | ||||
|  | ||||
| #define REDCONF_API_POSIX_READDIR 1 | ||||
|  | ||||
| #define REDCONF_NAME_MAX 28U | ||||
|  | ||||
| #define REDCONF_PATH_SEPARATOR '/' | ||||
|  | ||||
| #define REDCONF_TASK_COUNT 10U | ||||
|  | ||||
| #define REDCONF_HANDLE_COUNT 10U | ||||
|  | ||||
| #define REDCONF_API_FSE_FORMAT 0 | ||||
|  | ||||
| #define REDCONF_API_FSE_TRUNCATE 0 | ||||
|  | ||||
| #define REDCONF_API_FSE_TRANSMASKGET 0 | ||||
|  | ||||
| #define REDCONF_API_FSE_TRANSMASKSET 0 | ||||
|  | ||||
| #define REDCONF_OUTPUT 1 | ||||
|  | ||||
| #define REDCONF_ASSERTS 1 | ||||
|  | ||||
| #define REDCONF_BLOCK_SIZE 512U | ||||
|  | ||||
| #define REDCONF_VOLUME_COUNT 1U | ||||
|  | ||||
| #define REDCONF_ENDIAN_BIG 0 | ||||
|  | ||||
| #define REDCONF_ALIGNMENT_SIZE 4U | ||||
|  | ||||
| #define REDCONF_CRC_ALGORITHM CRC_SLICEBY8 | ||||
|  | ||||
| #define REDCONF_INODE_BLOCKS 1 | ||||
|  | ||||
| #define REDCONF_INODE_TIMESTAMPS 1 | ||||
|  | ||||
| #define REDCONF_ATIME 0 | ||||
|  | ||||
| #define REDCONF_DIRECT_POINTERS 4U | ||||
|  | ||||
| #define REDCONF_INDIRECT_POINTERS 32U | ||||
|  | ||||
| #define REDCONF_BUFFER_COUNT 12U | ||||
|  | ||||
| #define RedMemCpyUnchecked memcpy | ||||
|  | ||||
| #define RedMemMoveUnchecked memmove | ||||
|  | ||||
| #define RedMemSetUnchecked memset | ||||
|  | ||||
| #define RedMemCmpUnchecked memcmp | ||||
|  | ||||
| #define RedStrLenUnchecked strlen | ||||
|  | ||||
| #define RedStrCmpUnchecked strcmp | ||||
|  | ||||
| #define RedStrNCmpUnchecked strncmp | ||||
|  | ||||
| #define RedStrNCpyUnchecked strncpy | ||||
|  | ||||
| #define REDCONF_TRANSACT_DEFAULT (( RED_TRANSACT_CREAT | RED_TRANSACT_MKDIR | RED_TRANSACT_RENAME | RED_TRANSACT_LINK | RED_TRANSACT_UNLINK | RED_TRANSACT_FSYNC | RED_TRANSACT_CLOSE | RED_TRANSACT_VOLFULL | RED_TRANSACT_UMOUNT ) & RED_TRANSACT_MASK) | ||||
|  | ||||
| #define REDCONF_IMAP_INLINE 0 | ||||
|  | ||||
| #define REDCONF_IMAP_EXTERNAL 1 | ||||
|  | ||||
| #define REDCONF_DISCARDS 0 | ||||
|  | ||||
| #define REDCONF_IMAGE_BUILDER 0 | ||||
|  | ||||
| #define REDCONF_CHECKER 0 | ||||
|  | ||||
| #define RED_CONFIG_UTILITY_VERSION 0x2000000U | ||||
|  | ||||
| #define RED_CONFIG_MINCOMPAT_VER 0x1000200U | ||||
|  | ||||
| #endif | ||||
| @@ -0,0 +1,110 @@ | ||||
| /*             ----> DO NOT REMOVE THE FOLLOWING NOTICE <---- | ||||
|  | ||||
|                    Copyright (c) 2014-2015 Datalight, Inc. | ||||
|                        All Rights Reserved Worldwide. | ||||
|  | ||||
|     This program is free software; you can redistribute it and/or modify | ||||
|     it under the terms of the GNU General Public License as published by | ||||
|     the Free Software Foundation; use version 2 of the License. | ||||
|  | ||||
|     This program is distributed in the hope that it will be useful, | ||||
|     but "AS-IS," WITHOUT ANY WARRANTY; without even the implied warranty | ||||
|     of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|     GNU General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU General Public License along | ||||
|     with this program; if not, write to the Free Software Foundation, Inc., | ||||
|     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||
| */ | ||||
| /*  Businesses and individuals that for commercial or other reasons cannot | ||||
|     comply with the terms of the GPLv2 license may obtain a commercial license | ||||
|     before incorporating Reliance Edge into proprietary software for | ||||
|     distribution in any form.  Visit http://www.datalight.com/reliance-edge for | ||||
|     more information. | ||||
| */ | ||||
| /** @file | ||||
|     @brief Defines basic types used by Reliance Edge. | ||||
|  | ||||
|     The following types *must* be defined by this header, either directly (using | ||||
|     typedef) or indirectly (by including other headers, such as the C99 headers | ||||
|     stdint.h and stdbool.h): | ||||
|  | ||||
|     - bool: Boolean type, capable of storing true (1) or false (0) | ||||
|     - uint8_t: Unsigned 8-bit integer | ||||
|     - int8_t: Signed 8-bit integer | ||||
|     - uint16_t: Unsigned 16-bit integer | ||||
|     - int16_t: Signed 16-bit integer | ||||
|     - uint32_t: Unsigned 32-bit integer | ||||
|     - int32_t: Signed 32-bit integer | ||||
|     - uint64_t: Unsigned 64-bit integer | ||||
|     - int64_t: Signed 64-bit integer | ||||
|     - uintptr_t: Unsigned integer capable of storing a pointer, preferably the | ||||
|       same size as pointers themselves. | ||||
|  | ||||
|     These types deliberately use the same names as the standard C99 types, so | ||||
|     that if the C99 headers stdint.h and stdbool.h are available, they may be | ||||
|     included here. | ||||
|  | ||||
|     If the user application defines similar types, those may be reused.  For | ||||
|     example, suppose there is an application header apptypes.h which defines | ||||
|     types with a similar purpose but different names.  That header could be | ||||
|     reused to define the types Reliance Edge needs: | ||||
|  | ||||
|     ~~~{.c} | ||||
|     #include <apptypes.h> | ||||
|  | ||||
|     typedef BOOL bool; | ||||
|     typedef BYTE uint8_t; | ||||
|     typedef INT8 int8_t; | ||||
|     // And so on... | ||||
|     ~~~ | ||||
|  | ||||
|     If there are neither C99 headers nor suitable types in application headers, | ||||
|     this header should be populated with typedefs that define the required types | ||||
|     in terms of the standard C types.  This requires knowledge of the size of | ||||
|     the C types on the target hardware (e.g., how big is an "int" or a pointer). | ||||
|     Below is an example which assumes the target has 8-bit chars, 16-bit shorts, | ||||
|     32-bit ints, 32-bit pointers, and 64-bit long longs: | ||||
|  | ||||
|     ~~~{.c} | ||||
|     typedef int bool; | ||||
|     typedef unsigned char uint8_t; | ||||
|     typedef signed char int8_t; | ||||
|     typedef unsigned short uint16_t; | ||||
|     typedef short int16_t; | ||||
|     typedef unsigned int uint32_t; | ||||
|     typedef int int32_t; | ||||
|     typedef unsigned long long uint64_t; | ||||
|     typedef long long int64_t; | ||||
|     typedef uint32_t uintptr_t; | ||||
|     ~~~ | ||||
| */ | ||||
| #ifndef REDTYPES_H | ||||
| #define REDTYPES_H | ||||
|  | ||||
|  | ||||
| typedef int bool;                   /**< @brief Boolean type; either true or false. */ | ||||
|  | ||||
| typedef unsigned __int8 uint8_t;    /**< @brief Unsigned 8-bit integer. */ | ||||
| typedef          __int8 int8_t;     /**< @brief Signed 8-bit integer. */ | ||||
|  | ||||
| typedef unsigned __int16 uint16_t;  /**< @brief Unsigned 16-bit integer. */ | ||||
| typedef          __int16 int16_t;   /**< @brief Signed 16-bit integer. */ | ||||
|  | ||||
| typedef unsigned __int32 uint32_t;  /**< @brief Unsigned 32-bit integer. */ | ||||
| typedef          __int32 int32_t;   /**< @brief Signed 32-bit integer. */ | ||||
|  | ||||
| typedef unsigned __int64 uint64_t;  /**< @brief Unsigned 64-bit integer. */ | ||||
| typedef          __int64 int64_t;   /**< @brief Signed 64-bit integer. */ | ||||
|  | ||||
| /** @brief Unsigned integer capable of storing a pointer. | ||||
| */ | ||||
| #ifdef _WIN64 | ||||
| typedef uint64_t uintptr_t; | ||||
| #else | ||||
| typedef uint32_t uintptr_t; | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #endif | ||||
|  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,289 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /******************************************************************************* | ||||
|  * See the URL in the comments within main.c for the location of the online | ||||
|  * documentation. | ||||
|  ******************************************************************************/ | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdio.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
|  | ||||
| /* File system includes. */ | ||||
| #include <redposix.h> | ||||
|  | ||||
| /* The number of bytes read/written to the example files at a time. */ | ||||
| #define fsRAM_BUFFER_SIZE	200 | ||||
|  | ||||
| /* The volume prefix is an empty string, for convenience since there is only one | ||||
| volume in this demo. | ||||
| */ | ||||
| #define fsVOLUME_NAME		"" | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* | ||||
|  * Creates and verifies different files on the volume, demonstrating the use of | ||||
|  * various different API functions. | ||||
|  */ | ||||
| void vCreateAndVerifySampleFiles( void ); | ||||
|  | ||||
| /* | ||||
|  * Create a set of example files in the root directory of the volume using | ||||
|  * f_write(). | ||||
|  */ | ||||
| static void prvCreateDemoFiles( void ); | ||||
|  | ||||
| /* | ||||
|  * Use f_read() to read back and verify the files that were created by | ||||
|  * prvCreateDemoFiles(). | ||||
|  */ | ||||
| static void prvVerifyDemoFiles( void ); | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* A buffer used to both create content to write to disk, and read content back | ||||
| from a disk.  Note there is no mutual exclusion on this buffer. */ | ||||
| static char cRAMBuffer[ fsRAM_BUFFER_SIZE ]; | ||||
|  | ||||
| /* Names of directories that are created. */ | ||||
| static const char *pcDirectory1 = "/SUB1", *pcDirectory2 = "/SUB1/SUB2"; | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vCreateAndVerifySampleFiles( void ) | ||||
| { | ||||
| int32_t lStatus; | ||||
|  | ||||
| 	/* First initialize the Reliance Edge driver. */ | ||||
| 	lStatus = red_init(); | ||||
|  | ||||
| 	/* Format the volume. */ | ||||
| 	if( lStatus == 0 ) | ||||
| 	{ | ||||
| 		lStatus = red_format( fsVOLUME_NAME ); | ||||
| 	} | ||||
|  | ||||
| 	/* Mount the volume. */ | ||||
| 	if( lStatus == 0 ) | ||||
| 	{ | ||||
| 		lStatus = red_mount( fsVOLUME_NAME ); | ||||
| 	} | ||||
|  | ||||
| 	if( lStatus == 0 ) | ||||
| 	{ | ||||
| 		/* Create a set of files using red_write(). */ | ||||
| 		prvCreateDemoFiles(); | ||||
|  | ||||
| 		/* Read back and verify the files that were created using red_write(). */ | ||||
| 		prvVerifyDemoFiles(); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvCreateDemoFiles( void ) | ||||
| { | ||||
| BaseType_t xFileNumber, xWriteNumber; | ||||
| char cFilePath[ 64 ]; | ||||
| const BaseType_t xMaxFiles = 5; | ||||
| uint32_t ulEventMask; | ||||
| int32_t lBytesWritten, lFildes, lStatus; | ||||
| int iByte; | ||||
|  | ||||
| 	/* Save the current transaction point settings. */ | ||||
| 	lStatus = red_gettransmask( fsVOLUME_NAME, &ulEventMask ); | ||||
| 	configASSERT( lStatus == 0 ); | ||||
|  | ||||
| 	/* Disable automatic transaction points so that all of the files can be | ||||
| 	created in one atomic operation. */ | ||||
| 	lStatus = red_settransmask( fsVOLUME_NAME, RED_TRANSACT_MANUAL ); | ||||
| 	configASSERT( lStatus == 0 ); | ||||
|  | ||||
| 	/* Create xMaxFiles files.  Each created file will be | ||||
| 	( xFileNumber * fsRAM_BUFFER_SIZE ) bytes in length, and filled | ||||
| 	with a different repeating character. */ | ||||
| 	for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ ) | ||||
| 	{ | ||||
| 		/* Generate a file name. */ | ||||
| 		sprintf( cFilePath, "/root%03d.txt", xFileNumber ); | ||||
|  | ||||
| 		/* Print out the file name and the directory into which the file is | ||||
| 		being written. */ | ||||
| 		printf( "Creating file %s\r\n", cFilePath ); | ||||
|  | ||||
| 		/* Open the file, creating the file if it does not already exist. */ | ||||
| 		lFildes = red_open( cFilePath, RED_O_CREAT|RED_O_TRUNC|RED_O_WRONLY ); | ||||
| 		configASSERT( lFildes != -1 ); | ||||
|  | ||||
| 		/* Fill the RAM buffer with data that will be written to the file.  This | ||||
| 		is just a repeating ascii character that indicates the file number. */ | ||||
| 		memset( cRAMBuffer, ( int ) ( '0' + xFileNumber ), fsRAM_BUFFER_SIZE ); | ||||
|  | ||||
| 		/* Write the RAM buffer to the opened file a number of times.  The | ||||
| 		number of times the RAM buffer is written to the file depends on the | ||||
| 		file number, so the length of each created file will be different. */ | ||||
| 		for( xWriteNumber = 0; xWriteNumber < xFileNumber; xWriteNumber++ ) | ||||
| 		{ | ||||
| 			lBytesWritten = red_write( lFildes, cRAMBuffer, fsRAM_BUFFER_SIZE ); | ||||
| 			configASSERT( lBytesWritten == fsRAM_BUFFER_SIZE ); | ||||
| 		} | ||||
|  | ||||
| 		/* Close the file so another file can be created. */ | ||||
| 		lStatus = red_close( lFildes ); | ||||
| 		configASSERT( lStatus == 0 ); | ||||
| 	} | ||||
|  | ||||
| 	/* Commit a transaction point, atomically adding the set of files to the | ||||
| 	transacted state. */ | ||||
| 	lStatus = red_transact( fsVOLUME_NAME ); | ||||
| 	configASSERT( lStatus == 0 ); | ||||
|  | ||||
| 	/* Create a sub directory. */ | ||||
| 	printf( "Creating directory %s\r\n", pcDirectory1 ); | ||||
|  | ||||
| 	lStatus = red_mkdir( pcDirectory1 ); | ||||
| 	configASSERT( lStatus == 0 ); | ||||
|  | ||||
| 	/* Create a subdirectory in the new directory. */ | ||||
| 	printf( "Creating directory %s\r\n", pcDirectory2 ); | ||||
|  | ||||
| 	lStatus = red_mkdir( pcDirectory2 ); | ||||
| 	configASSERT( lStatus == 0 ); | ||||
|  | ||||
| 	/* Generate the file name. */ | ||||
| 	sprintf( cFilePath, "%s/file.txt", pcDirectory2 ); | ||||
|  | ||||
| 	/* Print out the file name and the directory into which the file is being | ||||
| 	written. */ | ||||
| 	printf( "Writing file %s\r\n", cFilePath ); | ||||
|  | ||||
| 	lFildes = red_open( cFilePath, RED_O_CREAT|RED_O_TRUNC|RED_O_WRONLY ); | ||||
|  | ||||
| 	/* Write the file.  It is filled with incrementing ascii characters starting | ||||
| 	from '0'. */ | ||||
| 	for( iByte = 0; iByte < fsRAM_BUFFER_SIZE; iByte++ ) | ||||
| 	{ | ||||
| 		cRAMBuffer[ iByte ] = ( char ) ( ( int ) '0' + iByte ); | ||||
| 	} | ||||
|  | ||||
| 	lBytesWritten = red_write( lFildes, cRAMBuffer, fsRAM_BUFFER_SIZE ); | ||||
| 	configASSERT( lBytesWritten == fsRAM_BUFFER_SIZE ); | ||||
|  | ||||
| 	/* Finished so close the file. */ | ||||
| 	lStatus = red_close( lFildes ); | ||||
| 	configASSERT( lStatus == 0 ); | ||||
|  | ||||
| 	/* Commit a transaction point, atomically adding the set of files and | ||||
| 	directories to the transacted state. */ | ||||
| 	lStatus = red_transact( fsVOLUME_NAME ); | ||||
| 	configASSERT( lStatus == 0 ); | ||||
|  | ||||
| 	/* Restore previous transaction point settings. */ | ||||
| 	lStatus = red_settransmask( fsVOLUME_NAME, ulEventMask ); | ||||
| 	configASSERT( lStatus == 0 ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvVerifyDemoFiles( void ) | ||||
| { | ||||
| BaseType_t xFileNumber, xReadNumber; | ||||
| char cFilePath[ 64 ]; | ||||
| const BaseType_t xMaxFiles = 5; | ||||
| long lChar; | ||||
| int32_t lBytesRead, lFildes, lStatus; | ||||
| int iByte; | ||||
|  | ||||
| 	/* Read back the files that were created by prvCreateDemoFiles(). */ | ||||
| 	for( xFileNumber = 1; xFileNumber <= xMaxFiles; xFileNumber++ ) | ||||
| 	{ | ||||
| 		/* Generate the file name. */ | ||||
| 		sprintf( cFilePath, "/root%03d.txt", xFileNumber ); | ||||
|  | ||||
| 		/* Print out the file name and the directory from which the file is | ||||
| 		being read. */ | ||||
| 		printf( "Reading file %s\r\n", cFilePath ); | ||||
|  | ||||
| 		/* Open the file for reading. */ | ||||
| 		lFildes = red_open( cFilePath, RED_O_RDONLY ); | ||||
| 		configASSERT( lFildes != -1 ); | ||||
|  | ||||
| 		/* Read the file into the RAM buffer, checking the file contents are as | ||||
| 		expected.  The size of the file depends on the file number. */ | ||||
| 		for( xReadNumber = 0; xReadNumber < xFileNumber; xReadNumber++ ) | ||||
| 		{ | ||||
| 			/* Start with the RAM buffer clear. */ | ||||
| 			memset( cRAMBuffer, 0x00, fsRAM_BUFFER_SIZE ); | ||||
|  | ||||
| 			lBytesRead = red_read( lFildes, cRAMBuffer, fsRAM_BUFFER_SIZE ); | ||||
| 			configASSERT( lBytesRead == fsRAM_BUFFER_SIZE ); | ||||
|  | ||||
| 			/* Check the RAM buffer is filled with the expected data.  Each | ||||
| 			file contains a different repeating ascii character that indicates | ||||
| 			the number of the file. */ | ||||
| 			for( lChar = 0; lChar < fsRAM_BUFFER_SIZE; lChar++ ) | ||||
| 			{ | ||||
| 				configASSERT( cRAMBuffer[ lChar ] == ( '0' + ( char ) xFileNumber ) ); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		/* Close the file. */ | ||||
| 		lStatus = red_close( lFildes ); | ||||
| 		configASSERT( lStatus == 0 ); | ||||
| 	} | ||||
|  | ||||
| 	/* Generate the file name. */ | ||||
| 	sprintf( cFilePath, "%s/file.txt", pcDirectory2 ); | ||||
|  | ||||
| 	/* Print out the file name and the directory from which the file is being | ||||
| 	read. */ | ||||
| 	printf( "Reading file %s\r\n", cFilePath ); | ||||
|  | ||||
| 	/* This time the file is opened for reading. */ | ||||
| 	lFildes = red_open( cFilePath, RED_O_RDONLY ); | ||||
| 	configASSERT( lFildes != -1 ); | ||||
|  | ||||
| 	/* Read the file. */ | ||||
| 	lBytesRead = red_read( lFildes, cRAMBuffer, fsRAM_BUFFER_SIZE ); | ||||
| 	configASSERT( lBytesRead == fsRAM_BUFFER_SIZE ); | ||||
|  | ||||
| 	/* Verify the file 1 byte at a time. */ | ||||
| 	for( iByte = 0; iByte < fsRAM_BUFFER_SIZE; iByte++ ) | ||||
| 	{ | ||||
| 		configASSERT( cRAMBuffer[ iByte ] == ( char ) ( ( int ) '0' + iByte ) ); | ||||
| 	} | ||||
|  | ||||
| 	/* Finished so close the file. */ | ||||
| 	lStatus = red_close( lFildes ); | ||||
| 	configASSERT( lStatus == 0 ); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -0,0 +1,20 @@ | ||||
|  | ||||
| Microsoft Visual Studio Solution File, Format Version 11.00 | ||||
| # Visual C++ Express 2010 | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WIN32", "WIN32.vcxproj", "{C686325E-3261-42F7-AEB1-DDE5280E1CEB}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		Debug|Win32 = Debug|Win32 | ||||
| 		Release|Win32 = Release|Win32 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||
| 		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.ActiveCfg = Debug|Win32 | ||||
| 		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.Build.0 = Debug|Win32 | ||||
| 		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Release|Win32.ActiveCfg = Release|Win32 | ||||
| 		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Release|Win32.Build.0 = Release|Win32 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(SolutionProperties) = preSolution | ||||
| 		HideSolutionNode = FALSE | ||||
| 	EndGlobalSection | ||||
| EndGlobal | ||||
| @@ -0,0 +1,6 @@ | ||||
| [{000214A0-0000-0000-C000-000000000046}] | ||||
| Prop3=19,2 | ||||
| [InternetShortcut] | ||||
| URL=http://www.freertos.org/FreeRTOS-Plus/Fail_Safe_File_System/Fail_Safe_Embedded_File_System_demo.shtml | ||||
| IDList= | ||||
| HotKey=0 | ||||
| @@ -0,0 +1,90 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * Utility functions required to gather run time statistics.  See: | ||||
|  * http://www.freertos.org/rtos-run-time-stats.html | ||||
|  * | ||||
|  * Note that this is a simulated port, where simulated time is a lot slower than | ||||
|  * real time, therefore the run time counter values have no real meaningful | ||||
|  * units. | ||||
|  * | ||||
|  * Also note that it is assumed this demo is going to be used for short periods | ||||
|  * of time only, and therefore timer overflows are not handled. | ||||
| */ | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include <FreeRTOS.h> | ||||
|  | ||||
| /* Variables used in the creation of the run time stats time base.  Run time  | ||||
| stats record how much time each task spends in the Running state. */ | ||||
| static long long llInitialRunTimeCounterValue = 0LL, llTicksPerHundedthMillisecond = 0LL; | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vConfigureTimerForRunTimeStats( void ) | ||||
| { | ||||
| LARGE_INTEGER liPerformanceCounterFrequency, liInitialRunTimeValue; | ||||
|  | ||||
| 	/* Initialise the variables used to create the run time stats time base. | ||||
| 	Run time stats record how much time each task spends in the Running  | ||||
| 	state. */ | ||||
|  | ||||
| 	if( QueryPerformanceFrequency( &liPerformanceCounterFrequency ) == 0 ) | ||||
| 	{ | ||||
| 		llTicksPerHundedthMillisecond = 1; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* How many times does the performance counter increment in 1/100th | ||||
| 		millisecond. */ | ||||
| 		llTicksPerHundedthMillisecond = liPerformanceCounterFrequency.QuadPart / 100000LL; | ||||
|  | ||||
| 		/* What is the performance counter value now, this will be subtracted | ||||
| 		from readings taken at run time. */ | ||||
| 		QueryPerformanceCounter( &liInitialRunTimeValue ); | ||||
| 		llInitialRunTimeCounterValue = liInitialRunTimeValue.QuadPart; | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| unsigned long ulGetRunTimeCounterValue( void ) | ||||
| { | ||||
| LARGE_INTEGER liCurrentCount; | ||||
| unsigned long ulReturn; | ||||
|  | ||||
| 	/* What is the performance counter value now? */ | ||||
| 	QueryPerformanceCounter( &liCurrentCount ); | ||||
|  | ||||
| 	/* Subtract the performance counter value reading taken when the  | ||||
| 	application started to get a count from that reference point, then | ||||
| 	scale to (simulated) 1/100ths of a millisecond. */ | ||||
| 	ulReturn = ( unsigned long ) ( ( liCurrentCount.QuadPart - llInitialRunTimeCounterValue ) / llTicksPerHundedthMillisecond ); | ||||
|  | ||||
| 	return ulReturn; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
| @@ -0,0 +1,379 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
|  /****************************************************************************** | ||||
|  * | ||||
|  * See the following URL for information on the commands defined in this file: | ||||
|  * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/Embedded_Ethernet_Examples/Ethernet_Related_CLI_Commands.shtml | ||||
|  * | ||||
|  ******************************************************************************/ | ||||
|  | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| /* FreeRTOS+CLI includes. */ | ||||
| #include "FreeRTOS_CLI.h" | ||||
|  | ||||
| #ifndef  configINCLUDE_TRACE_RELATED_CLI_COMMANDS | ||||
| 	#define configINCLUDE_TRACE_RELATED_CLI_COMMANDS 0 | ||||
| #endif | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Implements the run-time-stats command. | ||||
|  */ | ||||
| static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Implements the task-stats command. | ||||
|  */ | ||||
| static BaseType_t prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Implements the echo-three-parameters command. | ||||
|  */ | ||||
| static BaseType_t prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Implements the echo-parameters command. | ||||
|  */ | ||||
| static BaseType_t prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
|  | ||||
| /* | ||||
|  * Implements the "trace start" and "trace stop" commands; | ||||
|  */ | ||||
| #if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 | ||||
| 	static BaseType_t prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ); | ||||
| #endif | ||||
|  | ||||
| /* Structure that defines the "run-time-stats" command line command.   This | ||||
| generates a table that shows how much run time each task has */ | ||||
| static const CLI_Command_Definition_t xRunTimeStats = | ||||
| { | ||||
| 	"run-time-stats", /* The command string to type. */ | ||||
| 	"\r\nrun-time-stats:\r\n Displays a table showing how much processing time each FreeRTOS task has used\r\n", | ||||
| 	prvRunTimeStatsCommand, /* The function to run. */ | ||||
| 	0 /* No parameters are expected. */ | ||||
| }; | ||||
|  | ||||
| /* Structure that defines the "task-stats" command line command.  This generates | ||||
| a table that gives information on each task in the system. */ | ||||
| static const CLI_Command_Definition_t xTaskStats = | ||||
| { | ||||
| 	"task-stats", /* The command string to type. */ | ||||
| 	"\r\ntask-stats:\r\n Displays a table showing the state of each FreeRTOS task\r\n", | ||||
| 	prvTaskStatsCommand, /* The function to run. */ | ||||
| 	0 /* No parameters are expected. */ | ||||
| }; | ||||
|  | ||||
| /* Structure that defines the "echo_3_parameters" command line command.  This | ||||
| takes exactly three parameters that the command simply echos back one at a | ||||
| time. */ | ||||
| static const CLI_Command_Definition_t xThreeParameterEcho = | ||||
| { | ||||
| 	"echo-3-parameters", | ||||
| 	"\r\necho-3-parameters <param1> <param2> <param3>:\r\n Expects three parameters, echos each in turn\r\n", | ||||
| 	prvThreeParameterEchoCommand, /* The function to run. */ | ||||
| 	3 /* Three parameters are expected, which can take any value. */ | ||||
| }; | ||||
|  | ||||
| /* Structure that defines the "echo_parameters" command line command.  This | ||||
| takes a variable number of parameters that the command simply echos back one at | ||||
| a time. */ | ||||
| static const CLI_Command_Definition_t xParameterEcho = | ||||
| { | ||||
| 	"echo-parameters", | ||||
| 	"\r\necho-parameters <...>:\r\n Take variable number of parameters, echos each in turn\r\n", | ||||
| 	prvParameterEchoCommand, /* The function to run. */ | ||||
| 	-1 /* The user can enter any number of commands. */ | ||||
| }; | ||||
|  | ||||
| #if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 | ||||
| 	/* Structure that defines the "trace" command line command.  This takes a single | ||||
| 	parameter, which can be either "start" or "stop". */ | ||||
| 	static const CLI_Command_Definition_t xStartStopTrace = | ||||
| 	{ | ||||
| 		"trace", | ||||
| 		"\r\ntrace [start | stop]:\r\n Starts or stops a trace recording for viewing in FreeRTOS+Trace\r\n", | ||||
| 		prvStartStopTraceCommand, /* The function to run. */ | ||||
| 		1 /* One parameter is expected.  Valid values are "start" and "stop". */ | ||||
| 	}; | ||||
| #endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */ | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vRegisterSampleCLICommands( void ) | ||||
| { | ||||
| 	/* Register all the command line commands defined immediately above. */ | ||||
| 	FreeRTOS_CLIRegisterCommand( &xTaskStats ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xRunTimeStats ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xThreeParameterEcho ); | ||||
| 	FreeRTOS_CLIRegisterCommand( &xParameterEcho ); | ||||
|  | ||||
| 	#if( configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 ) | ||||
| 	{ | ||||
| 		FreeRTOS_CLIRegisterCommand( & xStartStopTrace ); | ||||
| 	} | ||||
| 	#endif | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvTaskStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char *const pcHeader = "Task          State  Priority  Stack	#\r\n************************************************\r\n"; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	/* Generate a table of task stats. */ | ||||
| 	strcpy( pcWriteBuffer, pcHeader ); | ||||
| 	vTaskList( pcWriteBuffer + strlen( pcHeader ) ); | ||||
|  | ||||
| 	/* There is no more data to return after this single string, so return | ||||
| 	pdFALSE. */ | ||||
| 	return pdFALSE; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvRunTimeStatsCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char * const pcHeader = "Task            Abs Time      % Time\r\n****************************************\r\n"; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	/* Generate a table of task stats. */ | ||||
| 	strcpy( pcWriteBuffer, pcHeader ); | ||||
| 	vTaskGetRunTimeStats( pcWriteBuffer + strlen( pcHeader ) ); | ||||
|  | ||||
| 	/* There is no more data to return after this single string, so return | ||||
| 	pdFALSE. */ | ||||
| 	return pdFALSE; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvThreeParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char *pcParameter; | ||||
| BaseType_t xParameterStringLength, xReturn; | ||||
| static BaseType_t lParameterNumber = 0; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	if( lParameterNumber == 0 ) | ||||
| 	{ | ||||
| 		/* The first time the function is called after the command has been | ||||
| 		entered just a header string is returned. */ | ||||
| 		sprintf( pcWriteBuffer, "The three parameters were:\r\n" ); | ||||
|  | ||||
| 		/* Next time the function is called the first parameter will be echoed | ||||
| 		back. */ | ||||
| 		lParameterNumber = 1L; | ||||
|  | ||||
| 		/* There is more data to be returned as no parameters have been echoed | ||||
| 		back yet. */ | ||||
| 		xReturn = pdPASS; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* Obtain the parameter string. */ | ||||
| 		pcParameter = FreeRTOS_CLIGetParameter | ||||
| 						( | ||||
| 							pcCommandString,		/* The command string itself. */ | ||||
| 							lParameterNumber,		/* Return the next parameter. */ | ||||
| 							&xParameterStringLength	/* Store the parameter string length. */ | ||||
| 						); | ||||
|  | ||||
| 		/* Sanity check something was returned. */ | ||||
| 		configASSERT( pcParameter ); | ||||
|  | ||||
| 		/* Return the parameter string. */ | ||||
| 		memset( pcWriteBuffer, 0x00, xWriteBufferLen ); | ||||
| 		sprintf( pcWriteBuffer, "%d: ", ( int ) lParameterNumber ); | ||||
| 		strncat( pcWriteBuffer, pcParameter, xParameterStringLength ); | ||||
| 		strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) ); | ||||
|  | ||||
| 		/* If this is the last of the three parameters then there are no more | ||||
| 		strings to return after this one. */ | ||||
| 		if( lParameterNumber == 3L ) | ||||
| 		{ | ||||
| 			/* If this is the last of the three parameters then there are no more | ||||
| 			strings to return after this one. */ | ||||
| 			xReturn = pdFALSE; | ||||
| 			lParameterNumber = 0L; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* There are more parameters to return after this one. */ | ||||
| 			xReturn = pdTRUE; | ||||
| 			lParameterNumber++; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return xReturn; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvParameterEchoCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| { | ||||
| const char *pcParameter; | ||||
| BaseType_t xParameterStringLength, xReturn; | ||||
| static BaseType_t lParameterNumber = 0; | ||||
|  | ||||
| 	/* Remove compile time warnings about unused parameters, and check the | ||||
| 	write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 	write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 	( void ) pcCommandString; | ||||
| 	( void ) xWriteBufferLen; | ||||
| 	configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 	if( lParameterNumber == 0 ) | ||||
| 	{ | ||||
| 		/* The first time the function is called after the command has been | ||||
| 		entered just a header string is returned. */ | ||||
| 		sprintf( pcWriteBuffer, "The parameters were:\r\n" ); | ||||
|  | ||||
| 		/* Next time the function is called the first parameter will be echoed | ||||
| 		back. */ | ||||
| 		lParameterNumber = 1L; | ||||
|  | ||||
| 		/* There is more data to be returned as no parameters have been echoed | ||||
| 		back yet. */ | ||||
| 		xReturn = pdPASS; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* Obtain the parameter string. */ | ||||
| 		pcParameter = FreeRTOS_CLIGetParameter | ||||
| 						( | ||||
| 							pcCommandString,		/* The command string itself. */ | ||||
| 							lParameterNumber,		/* Return the next parameter. */ | ||||
| 							&xParameterStringLength	/* Store the parameter string length. */ | ||||
| 						); | ||||
|  | ||||
| 		if( pcParameter != NULL ) | ||||
| 		{ | ||||
| 			/* Return the parameter string. */ | ||||
| 			memset( pcWriteBuffer, 0x00, xWriteBufferLen ); | ||||
| 			sprintf( pcWriteBuffer, "%d: ", ( int ) lParameterNumber ); | ||||
| 			strncat( pcWriteBuffer, pcParameter, xParameterStringLength ); | ||||
| 			strncat( pcWriteBuffer, "\r\n", strlen( "\r\n" ) ); | ||||
|  | ||||
| 			/* There might be more parameters to return after this one. */ | ||||
| 			xReturn = pdTRUE; | ||||
| 			lParameterNumber++; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* No more parameters were found.  Make sure the write buffer does | ||||
| 			not contain a valid string. */ | ||||
| 			pcWriteBuffer[ 0 ] = 0x00; | ||||
|  | ||||
| 			/* No more data to return. */ | ||||
| 			xReturn = pdFALSE; | ||||
|  | ||||
| 			/* Start over the next time this command is executed. */ | ||||
| 			lParameterNumber = 0; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return xReturn; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if configINCLUDE_TRACE_RELATED_CLI_COMMANDS == 1 | ||||
|  | ||||
| 	static BaseType_t prvStartStopTraceCommand( char *pcWriteBuffer, size_t xWriteBufferLen, const char *pcCommandString ) | ||||
| 	{ | ||||
| 	const char *pcParameter; | ||||
| 	BaseType_t lParameterStringLength; | ||||
|  | ||||
| 		/* Remove compile time warnings about unused parameters, and check the | ||||
| 		write buffer is not NULL.  NOTE - for simplicity, this example assumes the | ||||
| 		write buffer length is adequate, so does not check for buffer overflows. */ | ||||
| 		( void ) pcCommandString; | ||||
| 		( void ) xWriteBufferLen; | ||||
| 		configASSERT( pcWriteBuffer ); | ||||
|  | ||||
| 		/* Obtain the parameter string. */ | ||||
| 		pcParameter = FreeRTOS_CLIGetParameter | ||||
| 						( | ||||
| 							pcCommandString,		/* The command string itself. */ | ||||
| 							1,						/* Return the first parameter. */ | ||||
| 							&lParameterStringLength	/* Store the parameter string length. */ | ||||
| 						); | ||||
|  | ||||
| 		/* Sanity check something was returned. */ | ||||
| 		configASSERT( pcParameter ); | ||||
|  | ||||
| 		/* There are only two valid parameter values. */ | ||||
| 		if( strncmp( pcParameter, "start", strlen( "start" ) ) == 0 ) | ||||
| 		{ | ||||
| 			/* Start or restart the trace. */ | ||||
| 			vTraceStop(); | ||||
| 			vTraceClear(); | ||||
| 			vTraceStart(); | ||||
|  | ||||
| 			sprintf( pcWriteBuffer, "Trace recording (re)started.\r\n" ); | ||||
| 		} | ||||
| 		else if( strncmp( pcParameter, "stop", strlen( "stop" ) ) == 0 ) | ||||
| 		{ | ||||
| 			/* End the trace, if one is running. */ | ||||
| 			vTraceStop(); | ||||
| 			sprintf( pcWriteBuffer, "Stopping trace recording.\r\n" ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			sprintf( pcWriteBuffer, "Valid parameters are 'start' and 'stop'.\r\n" ); | ||||
| 		} | ||||
|  | ||||
| 		/* There is no more data to return after this single string, so return | ||||
| 		pdFALSE. */ | ||||
| 		return pdFALSE; | ||||
| 	} | ||||
|  | ||||
| #endif /* configINCLUDE_TRACE_RELATED_CLI_COMMANDS */ | ||||
| @@ -0,0 +1,229 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #pragma comment( lib, "ws2_32.lib" ) | ||||
|  | ||||
| /* Win32 includes. */ | ||||
| #include <WinSock2.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
|  | ||||
| /* FreeRTOS+CLI includes. */ | ||||
| #include "FreeRTOS_CLI.h" | ||||
|  | ||||
| /* Dimensions the buffer into which input characters are placed. */ | ||||
| #define cmdMAX_INPUT_SIZE	60 | ||||
|  | ||||
| /* Dimensions the buffer into which string outputs can be placed. */ | ||||
| #define cmdMAX_OUTPUT_SIZE	1024 | ||||
|  | ||||
| /* Dimensions the buffer passed to the recvfrom() call. */ | ||||
| #define cmdSOCKET_INPUT_BUFFER_SIZE 60 | ||||
|  | ||||
| /* DEL acts as a backspace. */ | ||||
| #define cmdASCII_DEL		( 0x7F ) | ||||
|  | ||||
| /* | ||||
|  * Open and configure the UDP socket. | ||||
|  */ | ||||
| static SOCKET prvOpenUDPSocket( void ); | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* | ||||
|  * Task that provides the input and output for the FreeRTOS+CLI command | ||||
|  * interpreter.  In this case a WinSock UDP port is used for convenience as this | ||||
|  * demo runs in a simulated environment on a Windows PC.  See the URL in the | ||||
|  * comments within main.c for the location of the online documentation. | ||||
|  */ | ||||
| void vUDPCommandInterpreterTask( void *pvParameters ) | ||||
| { | ||||
| long lBytes, lByte; | ||||
| signed char cInChar, cInputIndex = 0; | ||||
| static signed char cInputString[ cmdMAX_INPUT_SIZE ], cOutputString[ cmdMAX_OUTPUT_SIZE ], cLocalBuffer[ cmdSOCKET_INPUT_BUFFER_SIZE ]; | ||||
| BaseType_t xMoreDataToFollow; | ||||
| volatile int iErrorCode = 0; | ||||
| struct sockaddr_in xClient; | ||||
| int xClientAddressLength = sizeof( struct sockaddr_in ); | ||||
| SOCKET xSocket; | ||||
|  | ||||
| 	/* Just to prevent compiler warnings. */ | ||||
| 	( void ) pvParameters; | ||||
|  | ||||
| 	/* Attempt to open the socket. */ | ||||
| 	xSocket = prvOpenUDPSocket(); | ||||
|  | ||||
| 	if( xSocket != INVALID_SOCKET ) | ||||
| 	{ | ||||
| 		for( ;; ) | ||||
| 		{ | ||||
| 			/* Wait for incoming data on the opened socket. */ | ||||
| 			lBytes = recvfrom( xSocket, cLocalBuffer, sizeof( cLocalBuffer ), 0, ( struct sockaddr * ) &xClient, &xClientAddressLength ); | ||||
|  | ||||
| 			if( lBytes == SOCKET_ERROR ) | ||||
| 			{ | ||||
| 				/* Something went wrong, but it is not handled by this simple | ||||
| 				example. */ | ||||
| 				iErrorCode = WSAGetLastError(); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				/* Process each received byte in turn. */ | ||||
| 				lByte = 0; | ||||
| 				while( lByte < lBytes ) | ||||
| 				{ | ||||
| 					/* The next character in the input buffer. */ | ||||
| 					cInChar = cLocalBuffer[ lByte ]; | ||||
| 					lByte++; | ||||
|  | ||||
| 					/* Newline characters are taken as the end of the command | ||||
| 					string. */ | ||||
| 					if( cInChar == '\n' ) | ||||
| 					{ | ||||
| 						/* Process the input string received prior to the | ||||
| 						newline. */ | ||||
| 						do | ||||
| 						{ | ||||
| 							/* Pass the string to FreeRTOS+CLI. */ | ||||
| 							xMoreDataToFollow = FreeRTOS_CLIProcessCommand( cInputString, cOutputString, cmdMAX_OUTPUT_SIZE ); | ||||
|  | ||||
| 							/* Send the output generated by the command's | ||||
| 							implementation. */ | ||||
| 							sendto( xSocket, cOutputString,  strlen( cOutputString ), 0, ( SOCKADDR * ) &xClient, xClientAddressLength ); | ||||
|  | ||||
| 						} while( xMoreDataToFollow != pdFALSE ); /* Until the command does not generate any more output. */ | ||||
|  | ||||
| 						/* All the strings generated by the command processing | ||||
| 						have been sent.  Clear the input string ready to receive | ||||
| 						the next command. */ | ||||
| 						cInputIndex = 0; | ||||
| 						memset( cInputString, 0x00, cmdMAX_INPUT_SIZE ); | ||||
|  | ||||
| 						/* Transmit a spacer, just to make the command console | ||||
| 						easier to read. */ | ||||
| 						sendto( xSocket, "\r\n",  strlen( "\r\n" ), 0, ( SOCKADDR * ) &xClient, xClientAddressLength ); | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
| 						if( cInChar == '\r' ) | ||||
| 						{ | ||||
| 							/* Ignore the character.  Newlines are used to | ||||
| 							detect the end of the input string. */ | ||||
| 						} | ||||
| 						else if( ( cInChar == '\b' ) || ( cInChar == cmdASCII_DEL ) ) | ||||
| 						{ | ||||
| 							/* Backspace was pressed.  Erase the last character | ||||
| 							in the string - if any. */ | ||||
| 							if( cInputIndex > 0 ) | ||||
| 							{ | ||||
| 								cInputIndex--; | ||||
| 								cInputString[ cInputIndex ] = '\0'; | ||||
| 							} | ||||
| 						} | ||||
| 						else | ||||
| 						{ | ||||
| 							/* A character was entered.  Add it to the string | ||||
| 							entered so far.  When a \n is entered the complete | ||||
| 							string will be passed to the command interpreter. */ | ||||
| 							if( cInputIndex < cmdMAX_INPUT_SIZE ) | ||||
| 							{ | ||||
| 								cInputString[ cInputIndex ] = cInChar; | ||||
| 								cInputIndex++; | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		/* The socket could not be opened. */ | ||||
| 		vTaskDelete( NULL ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static SOCKET prvOpenUDPSocket( void ) | ||||
| { | ||||
| WSADATA xWSAData; | ||||
| WORD wVersionRequested; | ||||
| struct sockaddr_in xServer; | ||||
| SOCKET xSocket = INVALID_SOCKET; | ||||
|  | ||||
| 	wVersionRequested = MAKEWORD( 2, 2 ); | ||||
|  | ||||
| 	/* Prepare to use WinSock. */ | ||||
| 	if( WSAStartup( wVersionRequested, &xWSAData ) != 0 ) | ||||
| 	{ | ||||
| 		fprintf( stderr, "Could not open Windows connection.\n" ); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		xSocket = socket( AF_INET, SOCK_DGRAM, 0 ); | ||||
| 		if( xSocket == INVALID_SOCKET) | ||||
| 		{ | ||||
| 			fprintf( stderr, "Could not create socket.\n" ); | ||||
| 			WSACleanup(); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* Zero out the server structure. */ | ||||
| 			memset( ( void * ) &xServer, 0x00, sizeof( struct sockaddr_in ) ); | ||||
|  | ||||
| 			/* Set family and port. */ | ||||
| 			xServer.sin_family = AF_INET; | ||||
| 			xServer.sin_port = htons( configUDP_CLI_PORT_NUMBER ); | ||||
|  | ||||
| 			/* Assign the loopback address */ | ||||
| 			xServer.sin_addr.S_un.S_un_b.s_b1 = 127; | ||||
| 			xServer.sin_addr.S_un.S_un_b.s_b2 = 0; | ||||
| 			xServer.sin_addr.S_un.S_un_b.s_b3 = 0; | ||||
| 			xServer.sin_addr.S_un.S_un_b.s_b4 = 1; | ||||
|  | ||||
| 			/* Bind the address to the socket. */ | ||||
| 			if( bind( xSocket, ( struct sockaddr * ) &xServer, sizeof( struct sockaddr_in ) ) == -1 ) | ||||
| 			{ | ||||
| 				fprintf( stderr, "Could not socket to port %d.\n", configUDP_CLI_PORT_NUMBER ); | ||||
| 				closesocket( xSocket ); | ||||
| 				xSocket = INVALID_SOCKET; | ||||
| 				WSACleanup(); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return xSocket; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -0,0 +1,199 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
|   <ItemGroup Label="ProjectConfigurations"> | ||||
|     <ProjectConfiguration Include="Debug|Win32"> | ||||
|       <Configuration>Debug</Configuration> | ||||
|       <Platform>Win32</Platform> | ||||
|     </ProjectConfiguration> | ||||
|     <ProjectConfiguration Include="Release|Win32"> | ||||
|       <Configuration>Release</Configuration> | ||||
|       <Platform>Win32</Platform> | ||||
|     </ProjectConfiguration> | ||||
|   </ItemGroup> | ||||
|   <PropertyGroup Label="Globals"> | ||||
|     <ProjectGuid>{C686325E-3261-42F7-AEB1-DDE5280E1CEB}</ProjectGuid> | ||||
|     <ProjectName>RTOSDemo</ProjectName> | ||||
|   </PropertyGroup> | ||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> | ||||
|     <ConfigurationType>Application</ConfigurationType> | ||||
|     <UseOfMfc>false</UseOfMfc> | ||||
|     <CharacterSet>MultiByte</CharacterSet> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> | ||||
|     <ConfigurationType>Application</ConfigurationType> | ||||
|     <UseOfMfc>false</UseOfMfc> | ||||
|     <CharacterSet>MultiByte</CharacterSet> | ||||
|   </PropertyGroup> | ||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | ||||
|   <ImportGroup Label="ExtensionSettings"> | ||||
|   </ImportGroup> | ||||
|   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> | ||||
|     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||
|     <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> | ||||
|   </ImportGroup> | ||||
|   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> | ||||
|     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||
|     <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> | ||||
|   </ImportGroup> | ||||
|   <PropertyGroup Label="UserMacros" /> | ||||
|   <PropertyGroup> | ||||
|     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> | ||||
|     <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</OutDir> | ||||
|     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</IntDir> | ||||
|     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental> | ||||
|     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</OutDir> | ||||
|     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</IntDir> | ||||
|     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental> | ||||
|   </PropertyGroup> | ||||
|   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||||
|     <Midl> | ||||
|       <TypeLibraryName>.\Debug/WIN32.tlb</TypeLibraryName> | ||||
|       <HeaderFileName> | ||||
|       </HeaderFileName> | ||||
|     </Midl> | ||||
|     <ClCompile> | ||||
|       <Optimization>Disabled</Optimization> | ||||
|       <AdditionalIncludeDirectories>..\..\Source\Reliance-Edge\os\freertos\include;..\..\Source\Reliance-Edge\projects\freertos\win32-demo;..\..\Source\Reliance-Edge\core\include;..\..\Source\Reliance-Edge\include;..\..\..\FreeRTOS\Source\include;..\..\..\FreeRTOS\Source\portable\MSVC-MingW;..\..\Source\FreeRTOS-Plus-CLI;.;.\ConfigurationFiles;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
|       <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;WINVER=0x400;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <MinimalRebuild>true</MinimalRebuild> | ||||
|       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> | ||||
|       <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> | ||||
|       <PrecompiledHeaderOutputFile>.\Debug/WIN32.pch</PrecompiledHeaderOutputFile> | ||||
|       <AssemblerListingLocation>.\Debug/</AssemblerListingLocation> | ||||
|       <ObjectFileName>.\Debug/</ObjectFileName> | ||||
|       <ProgramDataBaseFileName>.\Debug/</ProgramDataBaseFileName> | ||||
|       <WarningLevel>Level4</WarningLevel> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <DisableLanguageExtensions>false</DisableLanguageExtensions> | ||||
|       <DebugInformationFormat>EditAndContinue</DebugInformationFormat> | ||||
|     </ClCompile> | ||||
|     <ResourceCompile> | ||||
|       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <Culture>0x0c09</Culture> | ||||
|     </ResourceCompile> | ||||
|     <Link> | ||||
|       <OutputFile>.\Debug/RTOSDemo.exe</OutputFile> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <GenerateDebugInformation>true</GenerateDebugInformation> | ||||
|       <ProgramDatabaseFile>.\Debug/WIN32.pdb</ProgramDatabaseFile> | ||||
|       <SubSystem>Console</SubSystem> | ||||
|       <TargetMachine>MachineX86</TargetMachine> | ||||
|       <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies> | ||||
|       <AdditionalLibraryDirectories>.\WinPCap</AdditionalLibraryDirectories> | ||||
|     </Link> | ||||
|     <Bscmake> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <OutputFile>.\Debug/WIN32.bsc</OutputFile> | ||||
|     </Bscmake> | ||||
|   </ItemDefinitionGroup> | ||||
|   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||||
|     <Midl> | ||||
|       <TypeLibraryName>.\Release/WIN32.tlb</TypeLibraryName> | ||||
|       <HeaderFileName> | ||||
|       </HeaderFileName> | ||||
|     </Midl> | ||||
|     <ClCompile> | ||||
|       <Optimization>MaxSpeed</Optimization> | ||||
|       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion> | ||||
|       <PreprocessorDefinitions>_WINSOCKAPI_;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <StringPooling>true</StringPooling> | ||||
|       <RuntimeLibrary>MultiThreaded</RuntimeLibrary> | ||||
|       <FunctionLevelLinking>true</FunctionLevelLinking> | ||||
|       <PrecompiledHeaderOutputFile>.\Release/WIN32.pch</PrecompiledHeaderOutputFile> | ||||
|       <AssemblerListingLocation>.\Release/</AssemblerListingLocation> | ||||
|       <ObjectFileName>.\Release/</ObjectFileName> | ||||
|       <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName> | ||||
|       <WarningLevel>Level3</WarningLevel> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <AdditionalIncludeDirectories>..\Common\Utils;..\Common\ethernet\lwip-1.4.0\ports\win32\WinPCap;..\Common\ethernet\lwip-1.4.0\src\include\ipv4;..\Common\ethernet\lwip-1.4.0\src\include;..\..\Source\include;..\..\Source\portable\MSVC-MingW;..\Common\ethernet\lwip-1.4.0\ports\win32\include;..\Common\Include;.\lwIP_Apps;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
|     </ClCompile> | ||||
|     <ResourceCompile> | ||||
|       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <Culture>0x0c09</Culture> | ||||
|     </ResourceCompile> | ||||
|     <Link> | ||||
|       <OutputFile>.\Release/RTOSDemo.exe</OutputFile> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <ProgramDatabaseFile>.\Release/WIN32.pdb</ProgramDatabaseFile> | ||||
|       <SubSystem>Console</SubSystem> | ||||
|       <TargetMachine>MachineX86</TargetMachine> | ||||
|       <AdditionalLibraryDirectories>..\Common\ethernet\lwip-1.4.0\ports\win32\WinPCap</AdditionalLibraryDirectories> | ||||
|       <AdditionalDependencies>wpcap.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||||
|     </Link> | ||||
|     <Bscmake> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <OutputFile>.\Release/WIN32.bsc</OutputFile> | ||||
|     </Bscmake> | ||||
|   </ItemDefinitionGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MemMang\heap_4.c" /> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\list.c" /> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MSVC-MingW\port.c" /> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\queue.c" /> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\tasks.c" /> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\timers.c" /> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-CLI\FreeRTOS_CLI.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\blockio.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\buffer.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\core.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\dir.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\format.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\imap.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\imapextern.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\imapinline.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\inode.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\inodedata.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\volume.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\fse\fse.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\os\freertos\services\osassert.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\os\freertos\services\osbdev.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\os\freertos\services\osclock.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\os\freertos\services\osmutex.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\os\freertos\services\osoutput.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\os\freertos\services\ostask.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\os\freertos\services\ostimestamp.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\posix\path.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\posix\posix.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\tests\posix\fsstress.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\tests\util\atoi.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\tests\util\math.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\tests\util\printf.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\tests\util\rand.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\toolcmn\getopt.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\toolcmn\toolcmn.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\util\bitmap.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\util\crc.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\util\endian.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\util\memory.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\util\namelen.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\util\sign.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\util\string.c" /> | ||||
|     <ClCompile Include="ConfigurationFiles\redconf.c" /> | ||||
|     <ClCompile Include="File-Related-CLI-commands.c" /> | ||||
|     <ClCompile Include="File-system-demo.c" /> | ||||
|     <ClCompile Include="main.c"> | ||||
|       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
|       <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="Run-time-stats-utils.c" /> | ||||
|     <ClCompile Include="Sample-CLI-commands.c" /> | ||||
|     <ClCompile Include="UDPCommandServer.c" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\FreeRTOS.h" /> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\projdefs.h" /> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\queue.h" /> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\semphr.h" /> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\task.h" /> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\timers.h" /> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-CLI\FreeRTOS_CLI.h" /> | ||||
|     <ClInclude Include="ConfigurationFiles\FreeRTOSConfig.h" /> | ||||
|     <ClInclude Include="ConfigurationFiles\redconf.h" /> | ||||
|     <ClInclude Include="ConfigurationFiles\redtypes.h" /> | ||||
|   </ItemGroup> | ||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||||
|   <ImportGroup Label="ExtensionTargets"> | ||||
|   </ImportGroup> | ||||
| </Project> | ||||
| @@ -0,0 +1,219 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
|   <ItemGroup> | ||||
|     <Filter Include="Resource Files"> | ||||
|       <UniqueIdentifier>{38712199-cebf-4124-bf15-398f7c3419ea}</UniqueIdentifier> | ||||
|       <Extensions>ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS"> | ||||
|       <UniqueIdentifier>{af3445a1-4908-4170-89ed-39345d90d30c}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS\Source"> | ||||
|       <UniqueIdentifier>{f32be356-4763-4cae-9020-974a2638cb08}</UniqueIdentifier> | ||||
|       <Extensions>*.c</Extensions> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS\Source\Portable"> | ||||
|       <UniqueIdentifier>{88f409e6-d396-4ac5-94bd-7a99c914be46}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS+"> | ||||
|       <UniqueIdentifier>{e5ad4ec7-23dc-4295-8add-2acaee488f5a}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS+\FreeRTOS+CLI"> | ||||
|       <UniqueIdentifier>{fd43c0ed-fdbc-437f-a5a3-c50399690bd7}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS+\FreeRTOS+CLI\include"> | ||||
|       <UniqueIdentifier>{c5889fe2-af0f-4cea-927f-6a6935ec5e14}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="Configuration Files"> | ||||
|       <UniqueIdentifier>{19ff1a34-36de-4c48-9d10-3fb1fa0d1fa4}</UniqueIdentifier> | ||||
|       <Extensions>h;hpp;hxx;hm;inl</Extensions> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS\Source\include"> | ||||
|       <UniqueIdentifier>{ab23827c-126c-4e5a-bc99-8efa44d8a8bd}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS+\FreeRTOS+Reliance Edge"> | ||||
|       <UniqueIdentifier>{9c9c3b2d-6958-407d-b742-23fbf73678ed}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS+\FreeRTOS+Reliance Edge\test"> | ||||
|       <UniqueIdentifier>{e47b8f1d-1582-4e56-9c2f-ca2cdbea1b86}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS+\FreeRTOS+Reliance Edge\port"> | ||||
|       <UniqueIdentifier>{9ecfe142-5bd2-472b-9568-243fa6169874}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS+\FreeRTOS+Reliance Edge\driver"> | ||||
|       <UniqueIdentifier>{28ee3d7e-231b-4094-8a10-ad89fc82f705}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS+\FreeRTOS+Reliance Edge\util"> | ||||
|       <UniqueIdentifier>{a955d01e-1f95-4c34-9558-14c52b75576f}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MSVC-MingW\port.c"> | ||||
|       <Filter>FreeRTOS\Source\Portable</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\timers.c"> | ||||
|       <Filter>FreeRTOS\Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\list.c"> | ||||
|       <Filter>FreeRTOS\Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\queue.c"> | ||||
|       <Filter>FreeRTOS\Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\tasks.c"> | ||||
|       <Filter>FreeRTOS\Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MemMang\heap_4.c"> | ||||
|       <Filter>FreeRTOS\Source\Portable</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-CLI\FreeRTOS_CLI.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+CLI</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="UDPCommandServer.c" /> | ||||
|     <ClCompile Include="File-system-demo.c" /> | ||||
|     <ClCompile Include="main.c" /> | ||||
|     <ClCompile Include="Run-time-stats-utils.c" /> | ||||
|     <ClCompile Include="Sample-CLI-commands.c" /> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\tests\util\printf.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\test</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\tests\util\rand.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\test</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\tests\posix\fsstress.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\test</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\os\freertos\services\ostimestamp.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\port</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\os\freertos\services\osassert.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\port</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\os\freertos\services\osbdev.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\port</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\os\freertos\services\osclock.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\port</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\os\freertos\services\osmutex.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\port</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\os\freertos\services\osoutput.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\port</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\os\freertos\services\ostask.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\port</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\volume.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\driver</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\blockio.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\driver</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\buffer.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\driver</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\core.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\driver</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\dir.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\driver</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\format.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\driver</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\fse\fse.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\driver</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\imap.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\driver</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\imapextern.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\driver</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\imapinline.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\driver</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\inode.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\driver</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\core\driver\inodedata.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\driver</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\posix\path.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\driver</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\posix\posix.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\driver</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\util\bitmap.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\util</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\util\string.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\util</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\util\crc.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\util</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\util\endian.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\util</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\util\memory.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\util</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\util\namelen.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\util</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\util\sign.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\util</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="File-Related-CLI-commands.c" /> | ||||
|     <ClCompile Include="ConfigurationFiles\redconf.c"> | ||||
|       <Filter>Configuration Files</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\tests\util\atoi.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\test</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\tests\util\math.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\test</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\toolcmn\getopt.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\test</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\Reliance-Edge\toolcmn\toolcmn.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+Reliance Edge\test</Filter> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-CLI\FreeRTOS_CLI.h"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+CLI\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\timers.h"> | ||||
|       <Filter>FreeRTOS\Source\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\FreeRTOS.h"> | ||||
|       <Filter>FreeRTOS\Source\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\projdefs.h"> | ||||
|       <Filter>FreeRTOS\Source\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\queue.h"> | ||||
|       <Filter>FreeRTOS\Source\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\semphr.h"> | ||||
|       <Filter>FreeRTOS\Source\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\task.h"> | ||||
|       <Filter>FreeRTOS\Source\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="ConfigurationFiles\FreeRTOSConfig.h"> | ||||
|       <Filter>Configuration Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="ConfigurationFiles\redconf.h"> | ||||
|       <Filter>Configuration Files</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="ConfigurationFiles\redtypes.h"> | ||||
|       <Filter>Configuration Files</Filter> | ||||
|     </ClInclude> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -0,0 +1,3 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
| </Project> | ||||
| @@ -0,0 +1,165 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /****************************************************************************** | ||||
|  * | ||||
|  * This demo is described on the following web page: | ||||
|  * TODO: This link describes the FAT version of this demo. | ||||
|  * http://www.freertos.org/FreeRTOS-Plus/Fail_Safe_File_System/Fail_Safe_Embedded_File_System_demo.shtml | ||||
|  * | ||||
|  ******************************************************************************/ | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdio.h> | ||||
| #include <stdint.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include <FreeRTOS.h> | ||||
| #include "task.h" | ||||
| #include "queue.h" | ||||
| #include "semphr.h" | ||||
|  | ||||
| /* Priorities at which the tasks are created. */ | ||||
| #define mainUDP_CLI_TASK_PRIORITY			( tskIDLE_PRIORITY ) | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* | ||||
|  * Register the generic commands that can be used with FreeRTOS+CLI. | ||||
|  */ | ||||
| extern void vRegisterSampleCLICommands( void ); | ||||
|  | ||||
| /* | ||||
|  * Register the file system commands that can be used with FreeRTOS+CLI. | ||||
|  */ | ||||
| extern void vRegisterFileSystemCLICommands( void ); | ||||
|  | ||||
| /* | ||||
|  * The task that implements the UDP command interpreter using FreeRTOS+CLI. | ||||
|  */ | ||||
| extern void vUDPCommandInterpreterTask( void *pvParameters ); | ||||
|  | ||||
| /* | ||||
|  * Creates and verifies different files on the volume, demonstrating the use of | ||||
|  * various different API functions. | ||||
|  */ | ||||
| extern void vCreateAndVerifySampleFiles( void ); | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* See http://www.freertos.org/FreeRTOS-Plus/Fail_Safe_File_System/Fail_Safe_Embedded_File_System_demo.shtml | ||||
| for instructions. */ | ||||
|  | ||||
| int main( void ) | ||||
| { | ||||
| const uint32_t ulLongTime_ms = 250UL; | ||||
|  | ||||
| 	/* Initialise the drive and file system, then create a few example | ||||
| 	files.  The output from this function just goes to the stdout window, | ||||
| 	allowing the output to be viewed when the UDP command console is not | ||||
| 	connected. */ | ||||
| 	vCreateAndVerifySampleFiles(); | ||||
|  | ||||
| 	/* Register generic commands with the FreeRTOS+CLI command interpreter. */ | ||||
| 	vRegisterSampleCLICommands(); | ||||
|  | ||||
| 	/* Register file system related commands with the FreeRTOS+CLI command | ||||
| 	interpreter. */ | ||||
| 	vRegisterFileSystemCLICommands(); | ||||
|  | ||||
| 	/* Create the task that handles the CLI on a UDP port.  The port number | ||||
| 	is set using the configUDP_CLI_PORT_NUMBER setting in FreeRTOSConfig.h. */ | ||||
| 	xTaskCreate( vUDPCommandInterpreterTask, 	/* The function that implements the command interpreter IO handling. */ | ||||
| 				"CLI", 							/* The name of the task - just to assist debugging. */ | ||||
| 				configMINIMAL_STACK_SIZE, NULL, /* The size of the stack allocated to the task. */ | ||||
| 				mainUDP_CLI_TASK_PRIORITY, 		/* The priority at which the task will run. */ | ||||
| 				NULL );							/* A handle to the task is not required, so NULL is passed. */ | ||||
|  | ||||
| 	/* Start the RTOS scheduler. */ | ||||
| 	vTaskStartScheduler(); | ||||
|  | ||||
| 	/* If all is well, the scheduler will now be running, and the following | ||||
| 	line will never be reached.  If the following line does execute, then | ||||
| 	there was insufficient FreeRTOS heap memory available for the idle and/or | ||||
| 	timer tasks	to be created.  See the memory management section on the | ||||
| 	FreeRTOS web site for more details (this is standard text that is not | ||||
| 	really applicable to the Win32 simulator port). */ | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		Sleep( ulLongTime_ms ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vApplicationIdleHook( void ) | ||||
| { | ||||
| const unsigned long ulMSToSleep = 5; | ||||
|  | ||||
| 	/* This function is called on each cycle of the idle task if | ||||
| 	configUSE_IDLE_HOOK is set to 1 in FreeRTOSConfig.h.  Sleep to reduce CPU | ||||
| 	load. */ | ||||
| 	Sleep( ulMSToSleep ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vAssertCalled( const char *pcFile, unsigned long ulLine ) | ||||
| { | ||||
| volatile uint32_t ulSetToNonZeroToExitLoop = 0; | ||||
|  | ||||
| 	printf( "ASSERT FAILED: File %s, line %u\r\n", pcFile, ulLine ); | ||||
|  | ||||
| 	taskENTER_CRITICAL(); | ||||
| 	{ | ||||
| 		while( ulSetToNonZeroToExitLoop == 0 ) | ||||
| 		{ | ||||
| 			/* Do not leave the assert function unless the debugger is used to | ||||
| 			set ulSetToNonZeroToExitLoop to a non-zero value. */ | ||||
| 		} | ||||
| 	} | ||||
| 	taskEXIT_CRITICAL(); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vApplicationMallocFailedHook( void ) | ||||
| { | ||||
| 	/* vApplicationMallocFailedHook() will only be called if | ||||
| 	configUSE_MALLOC_FAILED_HOOK is set to 1 in FreeRTOSConfig.h.  It is a hook | ||||
| 	function that will get called if a call to pvPortMalloc() fails. | ||||
| 	pvPortMalloc() is called internally by the kernel whenever a task, queue, | ||||
| 	timer or semaphore is created.  It is also called by various parts of the | ||||
| 	demo application.  If heap_1.c, heap_2.c or heap_4.c are used, then the | ||||
| 	size of the heap available to pvPortMalloc() is defined by | ||||
| 	configTOTAL_HEAP_SIZE in FreeRTOSConfig.h, and the xPortGetFreeHeapSize() | ||||
| 	API function can be used to query the size of free heap space that remains | ||||
| 	(although it does not provide information on how the remaining heap might | ||||
| 	be fragmented). */ | ||||
| 	taskDISABLE_INTERRUPTS(); | ||||
| 	for( ;; ); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| @@ -0,0 +1,288 @@ | ||||
| /* | ||||
|     FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. | ||||
|     All rights reserved | ||||
|  | ||||
|     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. | ||||
|  | ||||
|     This file is part of the FreeRTOS distribution. | ||||
|  | ||||
|     FreeRTOS is free software; you can redistribute it and/or modify it under | ||||
|     the terms of the GNU General Public License (version 2) as published by the | ||||
|     Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. | ||||
|  | ||||
|     *************************************************************************** | ||||
|     >>!   NOTE: The modification to the GPL is included to allow you to     !<< | ||||
|     >>!   distribute a combined work that includes FreeRTOS without being   !<< | ||||
|     >>!   obliged to provide the source code for proprietary components     !<< | ||||
|     >>!   outside of the FreeRTOS kernel.                                   !<< | ||||
|     *************************************************************************** | ||||
|  | ||||
|     FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY | ||||
|     WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | ||||
|     FOR A PARTICULAR PURPOSE.  Full license text is available on the following | ||||
|     link: http://www.freertos.org/a00114.html | ||||
|  | ||||
|     *************************************************************************** | ||||
|      *                                                                       * | ||||
|      *    FreeRTOS provides completely free yet professionally developed,    * | ||||
|      *    robust, strictly quality controlled, supported, and cross          * | ||||
|      *    platform software that is more than just the market leader, it     * | ||||
|      *    is the industry's de facto standard.                               * | ||||
|      *                                                                       * | ||||
|      *    Help yourself get started quickly while simultaneously helping     * | ||||
|      *    to support the FreeRTOS project by purchasing a FreeRTOS           * | ||||
|      *    tutorial book, reference manual, or both:                          * | ||||
|      *    http://www.FreeRTOS.org/Documentation                              * | ||||
|      *                                                                       * | ||||
|     *************************************************************************** | ||||
|  | ||||
|     http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading | ||||
|     the FAQ page "My application does not run, what could be wrong?".  Have you | ||||
|     defined configASSERT()? | ||||
|  | ||||
|     http://www.FreeRTOS.org/support - In return for receiving this top quality | ||||
|     embedded software for free we request you assist our global community by | ||||
|     participating in the support forum. | ||||
|  | ||||
|     http://www.FreeRTOS.org/training - Investing in training allows your team to | ||||
|     be as productive as possible as early as possible.  Now you can receive | ||||
|     FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers | ||||
|     Ltd, and the world's leading authority on the world's leading RTOS. | ||||
|  | ||||
|     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, | ||||
|     including FreeRTOS+Trace - an indispensable productivity tool, a DOS | ||||
|     compatible FAT file system, and our tiny thread aware UDP/IP stack. | ||||
|  | ||||
|     http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. | ||||
|     Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. | ||||
|  | ||||
|     http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High | ||||
|     Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS | ||||
|     licenses offer ticketed support, indemnification and commercial middleware. | ||||
|  | ||||
|     http://www.SafeRTOS.com - High Integrity Systems also provide a safety | ||||
|     engineered and independently SIL3 certified version for use in safety and | ||||
|     mission critical applications that require provable dependability. | ||||
|  | ||||
|     1 tab == 4 spaces! | ||||
| */ | ||||
|  | ||||
| /* | ||||
|  * FreeRTOS tasks are used with FreeRTOS+TCP to create a TCP echo server on the | ||||
|  * standard echo port number (7). | ||||
|  * | ||||
|  * See the following web page for essential demo usage and configuration | ||||
|  * details: | ||||
|  * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/TCP_Echo_Server.html | ||||
|  */ | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
| #include "semphr.h" | ||||
|  | ||||
| /* FreeRTOS+TCP includes. */ | ||||
| #include "FreeRTOS_IP.h" | ||||
| #include "FreeRTOS_Sockets.h" | ||||
|  | ||||
| /* Remove the whole file if FreeRTOSIPConfig.h is set to exclude TCP. */ | ||||
| #if( ipconfigUSE_TCP == 1 ) | ||||
|  | ||||
| /* The maximum time to wait for a closing socket to close. */ | ||||
| #define tcpechoSHUTDOWN_DELAY	( pdMS_TO_TICKS( 5000 ) ) | ||||
|  | ||||
| /* The standard echo port number. */ | ||||
| #define tcpechoPORT_NUMBER		7 | ||||
|  | ||||
| /* If ipconfigUSE_TCP_WIN is 1 then the Tx sockets will use a buffer size set by | ||||
| ipconfigTCP_TX_BUFFER_LENGTH, and the Tx window size will be | ||||
| configECHO_SERVER_TX_WINDOW_SIZE times the buffer size.  Note | ||||
| ipconfigTCP_TX_BUFFER_LENGTH is set in FreeRTOSIPConfig.h as it is a standard TCP/IP | ||||
| stack constant, whereas configECHO_SERVER_TX_WINDOW_SIZE is set in | ||||
| FreeRTOSConfig.h as it is a demo application constant. */ | ||||
| #ifndef configECHO_SERVER_TX_WINDOW_SIZE | ||||
| 	#define configECHO_SERVER_TX_WINDOW_SIZE	2 | ||||
| #endif | ||||
|  | ||||
| /* If ipconfigUSE_TCP_WIN is 1 then the Rx sockets will use a buffer size set by | ||||
| ipconfigTCP_RX_BUFFER_LENGTH, and the Rx window size will be | ||||
| configECHO_SERVER_RX_WINDOW_SIZE times the buffer size.  Note | ||||
| ipconfigTCP_RX_BUFFER_LENGTH is set in FreeRTOSIPConfig.h as it is a standard TCP/IP | ||||
| stack constant, whereas configECHO_SERVER_RX_WINDOW_SIZE is set in | ||||
| FreeRTOSConfig.h as it is a demo application constant. */ | ||||
| #ifndef configECHO_SERVER_RX_WINDOW_SIZE | ||||
| 	#define configECHO_SERVER_RX_WINDOW_SIZE	2 | ||||
| #endif | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* | ||||
|  * Uses FreeRTOS+TCP to listen for incoming echo connections, creating a task | ||||
|  * to handle each connection. | ||||
|  */ | ||||
| static void prvConnectionListeningTask( void *pvParameters ); | ||||
|  | ||||
| /* | ||||
|  * Created by the connection listening task to handle a single connection. | ||||
|  */ | ||||
| static void prvServerConnectionInstance( void *pvParameters ); | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* Stores the stack size passed into vStartSimpleTCPServerTasks() so it can be | ||||
| reused when the server listening task creates tasks to handle connections. */ | ||||
| static uint16_t usUsedStackSize = 0; | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vStartSimpleTCPServerTasks( uint16_t usStackSize, UBaseType_t uxPriority ) | ||||
| { | ||||
| 	/* Create the TCP echo server. */ | ||||
| 	xTaskCreate( prvConnectionListeningTask, "ServerListener", usStackSize, NULL, uxPriority + 1, NULL ); | ||||
|  | ||||
| 	/* Remember the requested stack size so it can be re-used by the server | ||||
| 	listening task when it creates tasks to handle connections. */ | ||||
| 	usUsedStackSize = usStackSize; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvConnectionListeningTask( void *pvParameters ) | ||||
| { | ||||
| struct freertos_sockaddr xClient, xBindAddress; | ||||
| Socket_t xListeningSocket, xConnectedSocket; | ||||
| socklen_t xSize = sizeof( xClient ); | ||||
| static const TickType_t xReceiveTimeOut = portMAX_DELAY; | ||||
| const BaseType_t xBacklog = 20; | ||||
|  | ||||
| #if( ipconfigUSE_TCP_WIN == 1 ) | ||||
| 	WinProperties_t xWinProps; | ||||
|  | ||||
| 	/* Fill in the buffer and window sizes that will be used by the socket. */ | ||||
| 	xWinProps.lTxBufSize = ipconfigTCP_TX_BUFFER_LENGTH; | ||||
| 	xWinProps.lTxWinSize = configECHO_SERVER_TX_WINDOW_SIZE; | ||||
| 	xWinProps.lRxBufSize = ipconfigTCP_RX_BUFFER_LENGTH; | ||||
| 	xWinProps.lRxWinSize = configECHO_SERVER_RX_WINDOW_SIZE; | ||||
| #endif /* ipconfigUSE_TCP_WIN */ | ||||
|  | ||||
| 	/* Just to prevent compiler warnings. */ | ||||
| 	( void ) pvParameters; | ||||
|  | ||||
| 	/* Attempt to open the socket. */ | ||||
| 	xListeningSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP ); | ||||
| 	configASSERT( xListeningSocket != FREERTOS_INVALID_SOCKET ); | ||||
|  | ||||
| 	/* Set a time out so accept() will just wait for a connection. */ | ||||
| 	FreeRTOS_setsockopt( xListeningSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) ); | ||||
|  | ||||
| 	/* Set the window and buffer sizes. */ | ||||
| 	#if( ipconfigUSE_TCP_WIN == 1 ) | ||||
| 	{ | ||||
| 		FreeRTOS_setsockopt( xListeningSocket, 0, FREERTOS_SO_WIN_PROPERTIES, ( void * ) &xWinProps, sizeof( xWinProps ) ); | ||||
| 	} | ||||
| 	#endif /* ipconfigUSE_TCP_WIN */ | ||||
|  | ||||
| 	/* Bind the socket to the port that the client task will send to, then | ||||
| 	listen for incoming connections. */ | ||||
| 	xBindAddress.sin_port = tcpechoPORT_NUMBER; | ||||
| 	xBindAddress.sin_port = FreeRTOS_htons( xBindAddress.sin_port ); | ||||
| 	FreeRTOS_bind( xListeningSocket, &xBindAddress, sizeof( xBindAddress ) ); | ||||
| 	FreeRTOS_listen( xListeningSocket, xBacklog ); | ||||
|  | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		/* Wait for a client to connect. */ | ||||
| 		xConnectedSocket = FreeRTOS_accept( xListeningSocket, &xClient, &xSize ); | ||||
| 		configASSERT( xConnectedSocket != FREERTOS_INVALID_SOCKET ); | ||||
|  | ||||
| 		/* Spawn a task to handle the connection. */ | ||||
| 		xTaskCreate( prvServerConnectionInstance, "EchoServer", usUsedStackSize, ( void * ) xConnectedSocket, tskIDLE_PRIORITY, NULL ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvServerConnectionInstance( void *pvParameters ) | ||||
| { | ||||
| int32_t lBytes, lSent, lTotalSent; | ||||
| Socket_t xConnectedSocket; | ||||
| static const TickType_t xReceiveTimeOut = pdMS_TO_TICKS( 5000 ); | ||||
| static const TickType_t xSendTimeOut = pdMS_TO_TICKS( 5000 ); | ||||
| TickType_t xTimeOnShutdown; | ||||
| uint8_t *pucRxBuffer; | ||||
|  | ||||
| 	xConnectedSocket = ( Socket_t ) pvParameters; | ||||
|  | ||||
| 	/* Attempt to create the buffer used to receive the string to be echoed | ||||
| 	back.  This could be avoided using a zero copy interface that just returned | ||||
| 	the same buffer. */ | ||||
| 	pucRxBuffer = ( uint8_t * ) pvPortMalloc( ipconfigTCP_MSS ); | ||||
|  | ||||
| 	if( pucRxBuffer != NULL ) | ||||
| 	{ | ||||
| 		FreeRTOS_setsockopt( xConnectedSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) ); | ||||
| 		FreeRTOS_setsockopt( xConnectedSocket, 0, FREERTOS_SO_SNDTIMEO, &xSendTimeOut, sizeof( xReceiveTimeOut ) ); | ||||
|  | ||||
| 		for( ;; ) | ||||
| 		{ | ||||
| 			/* Zero out the receive array so there is NULL at the end of the string | ||||
| 			when it is printed out. */ | ||||
| 			memset( pucRxBuffer, 0x00, ipconfigTCP_MSS ); | ||||
|  | ||||
| 			/* Receive data on the socket. */ | ||||
| 			lBytes = FreeRTOS_recv( xConnectedSocket, pucRxBuffer, ipconfigTCP_MSS, 0 ); | ||||
|  | ||||
| 			/* If data was received, echo it back. */ | ||||
| 			if( lBytes >= 0 ) | ||||
| 			{ | ||||
| 				lSent = 0; | ||||
| 				lTotalSent = 0; | ||||
|  | ||||
| 				/* Call send() until all the data has been sent. */ | ||||
| 				while( ( lSent >= 0 ) && ( lTotalSent < lBytes ) ) | ||||
| 				{ | ||||
| 					lSent = FreeRTOS_send( xConnectedSocket, pucRxBuffer, lBytes - lTotalSent, 0 ); | ||||
| 					lTotalSent += lSent; | ||||
| 				} | ||||
|  | ||||
| 				if( lSent < 0 ) | ||||
| 				{ | ||||
| 					/* Socket closed? */ | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				/* Socket closed? */ | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* Initiate a shutdown in case it has not already been initiated. */ | ||||
| 	FreeRTOS_shutdown( xConnectedSocket, FREERTOS_SHUT_RDWR ); | ||||
|  | ||||
| 	/* Wait for the shutdown to take effect, indicated by FreeRTOS_recv() | ||||
| 	returning an error. */ | ||||
| 	xTimeOnShutdown = xTaskGetTickCount(); | ||||
| 	do | ||||
| 	{ | ||||
| 		if( FreeRTOS_recv( xConnectedSocket, pucRxBuffer, ipconfigTCP_MSS, 0 ) < 0 ) | ||||
| 		{ | ||||
| 			break; | ||||
| 		} | ||||
| 	} while( ( xTaskGetTickCount() - xTimeOnShutdown ) < tcpechoSHUTDOWN_DELAY ); | ||||
|  | ||||
| 	/* Finished with the socket, buffer, the task. */ | ||||
| 	vPortFree( pucRxBuffer ); | ||||
| 	FreeRTOS_closesocket( xConnectedSocket ); | ||||
|  | ||||
| 	vTaskDelete( NULL ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* The whole file is excluded if TCP is not compiled in. */ | ||||
| #endif /* ipconfigUSE_TCP */ | ||||
|  | ||||
| @@ -0,0 +1,355 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * Creates two transmitting tasks and two receiving tasks.  The transmitting | ||||
|  * tasks send values that are received by the receiving tasks.  One set of tasks | ||||
|  * uses the standard API.  The other set of tasks uses the zero copy API. | ||||
|  * | ||||
|  * See the following web page for essential demo usage and configuration | ||||
|  * details: | ||||
|  * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html | ||||
|  */ | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
|  | ||||
| /* FreeRTOS+TCP includes. */ | ||||
| #include "FreeRTOS_IP.h" | ||||
| #include "FreeRTOS_Sockets.h" | ||||
|  | ||||
| #define simpTINY_DELAY	( ( TickType_t ) 2 ) | ||||
|  | ||||
| /* | ||||
|  * Uses a socket to send data without using the zero copy option. | ||||
|  * prvSimpleServerTask() will receive the data. | ||||
|  */ | ||||
| static void prvSimpleClientTask( void *pvParameters ); | ||||
|  | ||||
| /* | ||||
|  * Uses a socket to receive the data sent by the prvSimpleClientTask() task. | ||||
|  * Does not use the zero copy option. | ||||
|  */ | ||||
| static void prvSimpleServerTask( void *pvParameters ); | ||||
|  | ||||
| /* | ||||
|  * Uses a socket to send data using the zero copy option. | ||||
|  * prvSimpleZeroCopyServerTask() will receive the data. | ||||
|  */ | ||||
| static void prvSimpleZeroCopyUDPClientTask( void *pvParameters ); | ||||
|  | ||||
| /* | ||||
|  * Uses a socket to receive the data sent by the prvSimpleZeroCopyUDPClientTask() | ||||
|  * task.  Uses the zero copy option. | ||||
|  */ | ||||
| static void prvSimpleZeroCopyServerTask( void *pvParameters ); | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vStartSimpleUDPClientServerTasks( uint16_t usStackSize, uint32_t ulPort, UBaseType_t uxPriority ) | ||||
| { | ||||
| 	/* Create the client and server tasks that do not use the zero copy | ||||
| 	interface. */ | ||||
| 	xTaskCreate( prvSimpleClientTask, "SimpCpyClnt", usStackSize, ( void * ) ulPort, uxPriority, NULL ); | ||||
| 	xTaskCreate( prvSimpleServerTask, "SimpCpySrv", usStackSize, ( void * ) ulPort, uxPriority + 1, NULL ); | ||||
|  | ||||
| 	/* Create the client and server tasks that do use the zero copy interface. */ | ||||
| 	xTaskCreate( prvSimpleZeroCopyUDPClientTask, "SimpZCpyClnt", usStackSize, ( void * ) ( ulPort + 1 ), uxPriority, NULL ); | ||||
| 	xTaskCreate( prvSimpleZeroCopyServerTask, "SimpZCpySrv", usStackSize, ( void * ) ( ulPort + 1 ), uxPriority + 1, NULL ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvSimpleClientTask( void *pvParameters ) | ||||
| { | ||||
| Socket_t xClientSocket; | ||||
| struct freertos_sockaddr xDestinationAddress; | ||||
| uint8_t cString[ 50 ]; | ||||
| BaseType_t lReturned; | ||||
| uint32_t ulCount = 0UL, ulIPAddress; | ||||
| const uint32_t ulLoopsPerSocket = 10UL; | ||||
| const TickType_t x150ms = 150UL / portTICK_PERIOD_MS; | ||||
|  | ||||
| 	/* Remove compiler warning about unused parameters. */ | ||||
| 	( void ) pvParameters; | ||||
|  | ||||
| 	/* It is assumed that this task is not created until the network is up, | ||||
| 	so the IP address can be obtained immediately.  store the IP address being | ||||
| 	used in ulIPAddress.  This is done so the socket can send to a different | ||||
| 	port on the same IP address. */ | ||||
| 	FreeRTOS_GetAddressConfiguration( &ulIPAddress, NULL, NULL, NULL ); | ||||
|  | ||||
| 	/* This test sends to itself, so data sent from here is received by a server | ||||
| 	socket on the same IP address.  Setup the freertos_sockaddr structure with | ||||
| 	this nodes IP address, and the port number being sent to.  The strange | ||||
| 	casting is to try and remove compiler warnings on 32 bit machines. */ | ||||
| 	xDestinationAddress.sin_addr = ulIPAddress; | ||||
| 	xDestinationAddress.sin_port = ( uint16_t ) ( ( uint32_t ) pvParameters ) & 0xffffUL; | ||||
| 	xDestinationAddress.sin_port = FreeRTOS_htons( xDestinationAddress.sin_port ); | ||||
|  | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		/* Create the socket. */ | ||||
| 		xClientSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP ); | ||||
| 		configASSERT( xClientSocket != FREERTOS_INVALID_SOCKET ); | ||||
|  | ||||
| 		/* The count is used to differentiate between different messages sent to | ||||
| 		the server, and to break out of the do while loop below. */ | ||||
| 		ulCount = 0UL; | ||||
|  | ||||
| 		do | ||||
| 		{ | ||||
| 			/* Create the string that is sent to the server. */ | ||||
| 			sprintf( ( char * ) cString, "Server received (not zero copy): Message number %lu\r\n", ulCount ); | ||||
|  | ||||
| 			/* Send the string to the socket.  ulFlags is set to 0, so the zero | ||||
| 			copy option is not selected.  That means the data from cString[] is | ||||
| 			copied into a network buffer inside FreeRTOS_sendto(), and cString[] | ||||
| 			can be reused as soon as FreeRTOS_sendto() has returned. */ | ||||
| 			lReturned = FreeRTOS_sendto( xClientSocket, ( void * ) cString, strlen( ( const char * ) cString ), 0, &xDestinationAddress, sizeof( xDestinationAddress ) ); | ||||
|  | ||||
| 			ulCount++; | ||||
|  | ||||
| 		} while( ( lReturned != FREERTOS_SOCKET_ERROR ) && ( ulCount < ulLoopsPerSocket ) ); | ||||
|  | ||||
| 		FreeRTOS_closesocket( xClientSocket ); | ||||
|  | ||||
| 		/* A short delay to prevent the messages printed by the server task | ||||
| 		scrolling off the screen too quickly, and to prevent reduce the network | ||||
| 		loading. */ | ||||
| 		vTaskDelay( x150ms ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvSimpleServerTask( void *pvParameters ) | ||||
| { | ||||
| int32_t lBytes; | ||||
| uint8_t cReceivedString[ 60 ]; | ||||
| struct freertos_sockaddr xClient, xBindAddress; | ||||
| uint32_t xClientLength = sizeof( xClient ); | ||||
| Socket_t xListeningSocket; | ||||
|  | ||||
| 	/* Just to prevent compiler warnings. */ | ||||
| 	( void ) pvParameters; | ||||
|  | ||||
| 	/* Attempt to open the socket. */ | ||||
| 	xListeningSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP ); | ||||
| 	configASSERT( xListeningSocket != FREERTOS_INVALID_SOCKET ); | ||||
|  | ||||
| 	/* This test receives data sent from a different port on the same IP | ||||
| 	address.  Configure the freertos_sockaddr structure with the address being | ||||
| 	bound to.  The strange casting is to try and remove	compiler warnings on 32 | ||||
| 	bit machines.  Note that this task is only created after the network is up, | ||||
| 	so the IP address is valid here. */ | ||||
| 	xBindAddress.sin_port = ( uint16_t ) ( ( uint32_t ) pvParameters ) & 0xffffUL; | ||||
| 	xBindAddress.sin_port = FreeRTOS_htons( xBindAddress.sin_port ); | ||||
|  | ||||
| 	/* Bind the socket to the port that the client task will send to. */ | ||||
| 	FreeRTOS_bind( xListeningSocket, &xBindAddress, sizeof( xBindAddress ) ); | ||||
|  | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		/* Zero out the receive array so there is NULL at the end of the string | ||||
| 		when it is printed out. */ | ||||
| 		memset( cReceivedString, 0x00, sizeof( cReceivedString ) ); | ||||
|  | ||||
| 		/* Receive data on the socket.  ulFlags is zero, so the zero copy option | ||||
| 		is not set and the received data is copied into the buffer pointed to by | ||||
| 		cReceivedString.  By default the block time is portMAX_DELAY. | ||||
| 		xClientLength is not actually used by FreeRTOS_recvfrom(), but is set | ||||
| 		appropriately in case future versions do use it. */ | ||||
| 		lBytes = FreeRTOS_recvfrom( xListeningSocket, cReceivedString, sizeof( cReceivedString ), 0, &xClient, &xClientLength ); | ||||
|  | ||||
| 		/* Error check. */ | ||||
| 		configASSERT( lBytes == ( BaseType_t ) strlen( ( const char * ) cReceivedString ) ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvSimpleZeroCopyUDPClientTask( void *pvParameters ) | ||||
| { | ||||
| Socket_t xClientSocket; | ||||
| uint8_t *pucUDPPayloadBuffer; | ||||
| struct freertos_sockaddr xDestinationAddress; | ||||
| BaseType_t lReturned; | ||||
| uint32_t ulCount = 0UL, ulIPAddress; | ||||
| const uint32_t ulLoopsPerSocket = 10UL; | ||||
| const char *pcStringToSend = "Server received (using zero copy): Message number "; | ||||
| const TickType_t x150ms = 150UL / portTICK_PERIOD_MS; | ||||
| /* 15 is added to ensure the number, \r\n and terminating zero fit. */ | ||||
| const size_t xStringLength = strlen( pcStringToSend ) + 15; | ||||
|  | ||||
| 	/* Remove compiler warning about unused parameters. */ | ||||
| 	( void ) pvParameters; | ||||
|  | ||||
| 	/* It is assumed that this task is not created until the network is up, | ||||
| 	so the IP address can be obtained immediately.  store the IP address being | ||||
| 	used in ulIPAddress.  This is done so the socket can send to a different | ||||
| 	port on the same IP address. */ | ||||
| 	FreeRTOS_GetAddressConfiguration( &ulIPAddress, NULL, NULL, NULL ); | ||||
|  | ||||
| 	/* This test sends to itself, so data sent from here is received by a server | ||||
| 	socket on the same IP address.  Setup the freertos_sockaddr structure with | ||||
| 	this nodes IP address, and the port number being sent to.  The strange | ||||
| 	casting is to try and remove compiler warnings on 32 bit machines. */ | ||||
| 	xDestinationAddress.sin_addr = ulIPAddress; | ||||
| 	xDestinationAddress.sin_port = ( uint16_t ) ( ( uint32_t ) pvParameters ) & 0xffffUL; | ||||
| 	xDestinationAddress.sin_port = FreeRTOS_htons( xDestinationAddress.sin_port ); | ||||
|  | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		/* Create the socket. */ | ||||
| 		xClientSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP ); | ||||
| 		configASSERT( xClientSocket != FREERTOS_INVALID_SOCKET ); | ||||
|  | ||||
| 		/* The count is used to differentiate between different messages sent to | ||||
| 		the server, and to break out of the do while loop below. */ | ||||
| 		ulCount = 0UL; | ||||
|  | ||||
| 		do | ||||
| 		{ | ||||
| 			/* This task is going to send using the zero copy interface.  The | ||||
| 			data being sent is therefore written directly into a buffer that is | ||||
| 			passed into, rather than copied into, the FreeRTOS_sendto() | ||||
| 			function. | ||||
|  | ||||
| 			First obtain a buffer of adequate length from the IP stack into which | ||||
| 			the string will be written.  Although a max delay is used, the actual | ||||
| 			delay will be capped to ipconfigMAX_SEND_BLOCK_TIME_TICKS, hence | ||||
| 			the do while loop is used to ensure a buffer is obtained. */ | ||||
| 			do | ||||
| 			{ | ||||
| 			} while( ( pucUDPPayloadBuffer = ( uint8_t * ) FreeRTOS_GetUDPPayloadBuffer( xStringLength, portMAX_DELAY ) ) == NULL ); | ||||
|  | ||||
| 			/* A buffer was successfully obtained.  Create the string that is | ||||
| 			sent to the server.  First the string is filled with zeros as this will | ||||
| 			effectively be the null terminator when the string is received at the other | ||||
| 			end.  Note that the string is being written directly into the buffer | ||||
| 			obtained from the IP stack above. */ | ||||
| 			memset( ( void * ) pucUDPPayloadBuffer, 0x00, xStringLength ); | ||||
| 			sprintf( ( char * ) pucUDPPayloadBuffer, "%s%lu\r\n", pcStringToSend, ulCount ); | ||||
|  | ||||
| 			/* Pass the buffer into the send function.  ulFlags has the | ||||
| 			FREERTOS_ZERO_COPY bit set so the IP stack will take control of the | ||||
| 			buffer rather than copy data out of the buffer. */ | ||||
| 			lReturned = FreeRTOS_sendto( xClientSocket,  				/* The socket being sent to. */ | ||||
| 										( void * ) pucUDPPayloadBuffer, /* A pointer to the the data being sent. */ | ||||
| 										strlen( ( const char * ) pucUDPPayloadBuffer ) + 1, /* The length of the data being sent - including the string's null terminator. */ | ||||
| 										FREERTOS_ZERO_COPY, 			/* ulFlags with the FREERTOS_ZERO_COPY bit set. */ | ||||
| 										&xDestinationAddress, 			/* Where the data is being sent. */ | ||||
| 										sizeof( xDestinationAddress ) ); | ||||
|  | ||||
| 			if( lReturned == 0 ) | ||||
| 			{ | ||||
| 				/* The send operation failed, so this task is still responsible | ||||
| 				for the buffer obtained from the IP stack.  To ensure the buffer | ||||
| 				is not lost it must either be used again, or, as in this case, | ||||
| 				returned to the IP stack using FreeRTOS_ReleaseUDPPayloadBuffer(). | ||||
| 				pucUDPPayloadBuffer can be safely re-used after this call. */ | ||||
| 				FreeRTOS_ReleaseUDPPayloadBuffer( ( void * ) pucUDPPayloadBuffer ); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				/* The send was successful so the IP stack is now managing the | ||||
| 				buffer pointed to by pucUDPPayloadBuffer, and the IP stack will | ||||
| 				return the buffer once it has been sent.  pucUDPPayloadBuffer can | ||||
| 				be safely re-used. */ | ||||
| 			} | ||||
|  | ||||
| 			ulCount++; | ||||
|  | ||||
| 		} while( ( lReturned != FREERTOS_SOCKET_ERROR ) && ( ulCount < ulLoopsPerSocket ) ); | ||||
|  | ||||
| 		FreeRTOS_closesocket( xClientSocket ); | ||||
|  | ||||
| 		/* A short delay to prevent the messages scrolling off the screen too | ||||
| 		quickly. */ | ||||
| 		vTaskDelay( x150ms ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvSimpleZeroCopyServerTask( void *pvParameters ) | ||||
| { | ||||
| int32_t lBytes; | ||||
| uint8_t *pucUDPPayloadBuffer; | ||||
| struct freertos_sockaddr xClient, xBindAddress; | ||||
| uint32_t xClientLength = sizeof( xClient ), ulIPAddress; | ||||
| Socket_t xListeningSocket; | ||||
|  | ||||
| 	/* Just to prevent compiler warnings. */ | ||||
| 	( void ) pvParameters; | ||||
|  | ||||
| 	/* Attempt to open the socket. */ | ||||
| 	xListeningSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP ); | ||||
| 	configASSERT( xListeningSocket != FREERTOS_INVALID_SOCKET ); | ||||
|  | ||||
| 	/* This test receives data sent from a different port on the same IP address. | ||||
| 	Obtain the nodes IP address.  Configure the freertos_sockaddr structure with | ||||
| 	the address being bound to.  The strange casting is to try and remove | ||||
| 	compiler warnings on 32 bit machines.  Note that this task is only created | ||||
| 	after the network is up, so the IP address is valid here. */ | ||||
| 	FreeRTOS_GetAddressConfiguration( &ulIPAddress, NULL, NULL, NULL ); | ||||
| 	xBindAddress.sin_addr = ulIPAddress; | ||||
| 	xBindAddress.sin_port = ( uint16_t ) ( ( uint32_t ) pvParameters ) & 0xffffUL; | ||||
| 	xBindAddress.sin_port = FreeRTOS_htons( xBindAddress.sin_port ); | ||||
|  | ||||
| 	/* Bind the socket to the port that the client task will send to. */ | ||||
| 	FreeRTOS_bind( xListeningSocket, &xBindAddress, sizeof( xBindAddress ) ); | ||||
|  | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		/* Receive data on the socket.  ulFlags has the zero copy bit set | ||||
| 		(FREERTOS_ZERO_COPY) indicating to the stack that a reference to the | ||||
| 		received data should be passed out to this task using the second | ||||
| 		parameter to the FreeRTOS_recvfrom() call.  When this is done the | ||||
| 		IP stack is no longer responsible for releasing the buffer, and | ||||
| 		the task *must* return the buffer to the stack when it is no longer | ||||
| 		needed.  By default the block time is portMAX_DELAY. */ | ||||
| 		lBytes = FreeRTOS_recvfrom( xListeningSocket, ( void * ) &pucUDPPayloadBuffer, 0, FREERTOS_ZERO_COPY, &xClient, &xClientLength ); | ||||
|  | ||||
| 		/* Print the received characters. */ | ||||
| 		if( lBytes > 0 ) | ||||
| 		{ | ||||
| 			/* It is expected to receive one more byte than the string length as | ||||
| 			the NULL terminator is also transmitted. */ | ||||
| 			configASSERT( lBytes == ( ( BaseType_t ) strlen( ( const char * ) pucUDPPayloadBuffer ) + 1 ) ); | ||||
| 		} | ||||
|  | ||||
| 		if( lBytes >= 0 ) | ||||
| 		{ | ||||
| 			/* The buffer *must* be freed once it is no longer needed. */ | ||||
| 			FreeRTOS_ReleaseUDPPayloadBuffer( pucUDPPayloadBuffer ); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -0,0 +1,358 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * A set of tasks are created that send TCP echo requests to the standard echo | ||||
|  * port (port 7) on the IP address set by the configECHO_SERVER_ADDR0 to | ||||
|  * configECHO_SERVER_ADDR3 constants, then wait for and verify the reply | ||||
|  * (another demo is avilable that demonstrates the reception being performed in | ||||
|  * a task other than that from with the request was made). | ||||
|  * | ||||
|  * See the following web page for essential demo usage and configuration | ||||
|  * details: | ||||
|  * http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html | ||||
|  */ | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdint.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
| #include "queue.h" | ||||
|  | ||||
| /* FreeRTOS+TCP includes. */ | ||||
| #include "FreeRTOS_IP.h" | ||||
| #include "FreeRTOS_Sockets.h" | ||||
|  | ||||
| /* Exclude the whole file if FreeRTOSIPConfig.h is configured to use UDP only. */ | ||||
| #if( ipconfigUSE_TCP == 1 ) | ||||
|  | ||||
| /* The echo tasks create a socket, send out a number of echo requests, listen | ||||
| for the echo reply, then close the socket again before starting over.  This | ||||
| delay is used between each iteration to ensure the network does not get too | ||||
| congested. */ | ||||
| #define echoLOOP_DELAY	( ( TickType_t ) 150 / portTICK_PERIOD_MS ) | ||||
|  | ||||
| /* The echo server is assumed to be on port 7, which is the standard echo | ||||
| protocol port. */ | ||||
| #define echoECHO_PORT	( 7 ) | ||||
|  | ||||
| /* The size of the buffers is a multiple of the MSS - the length of the data | ||||
| sent is a pseudo random size between 20 and echoBUFFER_SIZES. */ | ||||
| #define echoBUFFER_SIZE_MULTIPLIER	( 3 ) | ||||
| #define echoBUFFER_SIZES			( ipconfigTCP_MSS * echoBUFFER_SIZE_MULTIPLIER ) | ||||
|  | ||||
| /* The number of instances of the echo client task to create. */ | ||||
| #define echoNUM_ECHO_CLIENTS		( 5 ) | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* | ||||
|  * Uses a socket to send data to, then receive data from, the standard echo | ||||
|  * port number 7. | ||||
|  */ | ||||
| static void prvEchoClientTask( void *pvParameters ); | ||||
|  | ||||
| /* | ||||
|  * Creates a pseudo random sized buffer of data to send to the echo server. | ||||
|  */ | ||||
| static BaseType_t prvCreateTxData( char *ucBuffer, uint32_t ulBufferLength ); | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* Rx and Tx time outs are used to ensure the sockets do not wait too long for | ||||
| missing data. */ | ||||
| static const TickType_t xReceiveTimeOut = pdMS_TO_TICKS( 4000 ); | ||||
| static const TickType_t xSendTimeOut = pdMS_TO_TICKS( 2000 ); | ||||
|  | ||||
| /* Counters for each created task - for inspection only. */ | ||||
| static uint32_t ulTxRxCycles[ echoNUM_ECHO_CLIENTS ]  = { 0 }, | ||||
| 				ulTxRxFailures[ echoNUM_ECHO_CLIENTS ] = { 0 }, | ||||
| 				ulConnections[ echoNUM_ECHO_CLIENTS ] = { 0 }; | ||||
|  | ||||
| /* Rx and Tx buffers for each created task. */ | ||||
| static char cTxBuffers[ echoNUM_ECHO_CLIENTS ][ echoBUFFER_SIZES ], | ||||
| 			cRxBuffers[ echoNUM_ECHO_CLIENTS ][ echoBUFFER_SIZES ]; | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vStartTCPEchoClientTasks_SingleTasks( uint16_t usTaskStackSize, UBaseType_t uxTaskPriority ) | ||||
| { | ||||
| BaseType_t x; | ||||
|  | ||||
| 	/* Create the echo client tasks. */ | ||||
| 	for( x = 0; x < echoNUM_ECHO_CLIENTS; x++ ) | ||||
| 	{ | ||||
| 		xTaskCreate( 	prvEchoClientTask,	/* The function that implements the task. */ | ||||
| 						"Echo0",			/* Just a text name for the task to aid debugging. */ | ||||
| 						usTaskStackSize,	/* The stack size is defined in FreeRTOSIPConfig.h. */ | ||||
| 						( void * ) x,		/* The task parameter, not used in this case. */ | ||||
| 						uxTaskPriority,		/* The priority assigned to the task is defined in FreeRTOSConfig.h. */ | ||||
| 						NULL );				/* The task handle is not used. */ | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvEchoClientTask( void *pvParameters ) | ||||
| { | ||||
| Socket_t xSocket; | ||||
| struct freertos_sockaddr xEchoServerAddress; | ||||
| int32_t lLoopCount = 0UL; | ||||
| const int32_t lMaxLoopCount = 1; | ||||
| volatile uint32_t ulTxCount = 0UL; | ||||
| BaseType_t xReceivedBytes, xReturned, xInstance; | ||||
| BaseType_t lTransmitted, lStringLength; | ||||
| char *pcTransmittedString, *pcReceivedString; | ||||
| WinProperties_t xWinProps; | ||||
| TickType_t xTimeOnEntering; | ||||
|  | ||||
| 	/* Fill in the buffer and window sizes that will be used by the socket. */ | ||||
| 	xWinProps.lTxBufSize = 6 * ipconfigTCP_MSS; | ||||
| 	xWinProps.lTxWinSize = 3; | ||||
| 	xWinProps.lRxBufSize = 6 * ipconfigTCP_MSS; | ||||
| 	xWinProps.lRxWinSize = 3; | ||||
|  | ||||
| 	/* This task can be created a number of times.  Each instance is numbered | ||||
| 	to enable each instance to use a different Rx and Tx buffer.  The number is | ||||
| 	passed in as the task's parameter. */ | ||||
| 	xInstance = ( BaseType_t ) pvParameters; | ||||
|  | ||||
| 	/* Point to the buffers to be used by this instance of this task. */ | ||||
| 	pcTransmittedString = &( cTxBuffers[ xInstance ][ 0 ] ); | ||||
| 	pcReceivedString = &( cRxBuffers[ xInstance ][ 0 ] ); | ||||
|  | ||||
| 	/* Echo requests are sent to the echo server.  The address of the echo | ||||
| 	server is configured by the constants configECHO_SERVER_ADDR0 to | ||||
| 	configECHO_SERVER_ADDR3 in FreeRTOSConfig.h. */ | ||||
| 	xEchoServerAddress.sin_port = FreeRTOS_htons( echoECHO_PORT ); | ||||
| 	xEchoServerAddress.sin_addr = FreeRTOS_inet_addr_quick( configECHO_SERVER_ADDR0, | ||||
| 															configECHO_SERVER_ADDR1, | ||||
| 															configECHO_SERVER_ADDR2, | ||||
| 															configECHO_SERVER_ADDR3 ); | ||||
|  | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		/* Create a TCP socket. */ | ||||
| 		xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP ); | ||||
| 		configASSERT( xSocket != FREERTOS_INVALID_SOCKET ); | ||||
|  | ||||
| 		/* Set a time out so a missing reply does not cause the task to block | ||||
| 		indefinitely. */ | ||||
| 		FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_RCVTIMEO, &xReceiveTimeOut, sizeof( xReceiveTimeOut ) ); | ||||
| 		FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SNDTIMEO, &xSendTimeOut, sizeof( xSendTimeOut ) ); | ||||
|  | ||||
| 		/* Set the window and buffer sizes. */ | ||||
| 		FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_WIN_PROPERTIES, ( void * ) &xWinProps,	sizeof( xWinProps ) ); | ||||
|  | ||||
| 		/* Connect to the echo server. */ | ||||
| 		if( FreeRTOS_connect( xSocket, &xEchoServerAddress, sizeof( xEchoServerAddress ) ) == 0 ) | ||||
| 		{ | ||||
| 			ulConnections[ xInstance ]++; | ||||
|  | ||||
| 			/* Send a number of echo requests. */ | ||||
| 			for( lLoopCount = 0; lLoopCount < lMaxLoopCount; lLoopCount++ ) | ||||
| 			{ | ||||
| 				/* Create the string that is sent to the echo server. */ | ||||
| 				lStringLength = prvCreateTxData( pcTransmittedString, echoBUFFER_SIZES ); | ||||
|  | ||||
| 				/* Add in some unique text at the front of the string. */ | ||||
| 				sprintf( pcTransmittedString, "TxRx message number %u", ulTxCount ); | ||||
| 				ulTxCount++; | ||||
|  | ||||
| 				/* Send the string to the socket. */ | ||||
| 				lTransmitted = FreeRTOS_send(	xSocket,						/* The socket being sent to. */ | ||||
| 												( void * ) pcTransmittedString,	/* The data being sent. */ | ||||
| 												lStringLength,					/* The length of the data being sent. */ | ||||
| 												0 );							/* No flags. */ | ||||
|  | ||||
| 				if( lTransmitted < 0 ) | ||||
| 				{ | ||||
| 					/* Error? */ | ||||
| 					break; | ||||
| 				} | ||||
|  | ||||
| 				/* Clear the buffer into which the echoed string will be | ||||
| 				placed. */ | ||||
| 				memset( ( void * ) pcReceivedString, 0x00, echoBUFFER_SIZES ); | ||||
| 				xReceivedBytes = 0; | ||||
|  | ||||
| 				/* Receive data echoed back to the socket. */ | ||||
| 				while( xReceivedBytes < lTransmitted ) | ||||
| 				{ | ||||
| 					xReturned = FreeRTOS_recv( xSocket,								/* The socket being received from. */ | ||||
| 											&( pcReceivedString[ xReceivedBytes ] ),/* The buffer into which the received data will be written. */ | ||||
| 											 lStringLength - xReceivedBytes,		/* The size of the buffer provided to receive the data. */ | ||||
| 											 0 );									/* No flags. */ | ||||
|  | ||||
| 					if( xReturned < 0 ) | ||||
| 					{ | ||||
| 						/* Error occurred.  Latch it so it can be detected | ||||
| 						below. */ | ||||
| 						xReceivedBytes = xReturned; | ||||
| 						break; | ||||
| 					} | ||||
| 					else if( xReturned == 0 ) | ||||
| 					{ | ||||
| 						/* Timed out. */ | ||||
| 						break; | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
| 						/* Keep a count of the bytes received so far. */ | ||||
| 						xReceivedBytes += xReturned; | ||||
| 					} | ||||
| 				} | ||||
|  | ||||
| 				/* If an error occurred it will be latched in xReceivedBytes, | ||||
| 				otherwise xReceived bytes will be just that - the number of | ||||
| 				bytes received from the echo server. */ | ||||
| 				if( xReceivedBytes > 0 ) | ||||
| 				{ | ||||
| 					/* Compare the transmitted string to the received string. */ | ||||
| 					configASSERT( strncmp( pcReceivedString, pcTransmittedString, lTransmitted ) == 0 ); | ||||
| 					if( strncmp( pcReceivedString, pcTransmittedString, lTransmitted ) == 0 ) | ||||
| 					{ | ||||
| 						/* The echo reply was received without error. */ | ||||
| 						ulTxRxCycles[ xInstance ]++; | ||||
| 					} | ||||
| 					else | ||||
| 					{ | ||||
| 						/* The received string did not match the transmitted | ||||
| 						string. */ | ||||
| 						ulTxRxFailures[ xInstance ]++; | ||||
| 						break; | ||||
| 					} | ||||
| 				} | ||||
| 				else if( xReceivedBytes < 0 ) | ||||
| 				{ | ||||
| 					/* FreeRTOS_recv() returned an error. */ | ||||
| 					break; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					/* Timed out without receiving anything? */ | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			/* Finished using the connected socket, initiate a graceful close: | ||||
| 			FIN, FIN+ACK, ACK. */ | ||||
| 			FreeRTOS_shutdown( xSocket, FREERTOS_SHUT_RDWR ); | ||||
|  | ||||
| 			/* Expect FreeRTOS_recv() to return an error once the shutdown is | ||||
| 			complete. */ | ||||
| 			xTimeOnEntering = xTaskGetTickCount(); | ||||
| 			do | ||||
| 			{ | ||||
| 				xReturned = FreeRTOS_recv( xSocket,	/* The socket being received from. */ | ||||
| 					&( pcReceivedString[ 0 ] ),		/* The buffer into which the received data will be written. */ | ||||
| 					echoBUFFER_SIZES,				/* The size of the buffer provided to receive the data. */ | ||||
| 					0 ); | ||||
|  | ||||
| 				if( xReturned < 0 ) | ||||
| 				{ | ||||
| 					break; | ||||
| 				} | ||||
|  | ||||
| 			} while( ( xTaskGetTickCount() - xTimeOnEntering ) < xReceiveTimeOut ); | ||||
| 		} | ||||
|  | ||||
| 		/* Close this socket before looping back to create another. */ | ||||
| 		FreeRTOS_closesocket( xSocket ); | ||||
|  | ||||
| 		/* Pause for a short while to ensure the network is not too | ||||
| 		congested. */ | ||||
| 		vTaskDelay( echoLOOP_DELAY ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prvCreateTxData( char *cBuffer, uint32_t ulBufferLength ) | ||||
| { | ||||
| BaseType_t lCharactersToAdd, lCharacter; | ||||
| char cChar = '0'; | ||||
| const BaseType_t lMinimumLength = 60; | ||||
|  | ||||
| 	/* Randomise the number of characters that will be sent in the echo | ||||
| 	request. */ | ||||
| 	do | ||||
| 	{ | ||||
| 		lCharactersToAdd = ipconfigRAND32() % ( ulBufferLength - 20UL ); | ||||
| 	} while ( ( lCharactersToAdd == 0 ) || ( lCharactersToAdd < lMinimumLength ) ); /* Must be at least enough to add the unique text to the start of the string later. */ | ||||
|  | ||||
| 	/* Fill the buffer. */ | ||||
| 	for( lCharacter = 0; lCharacter < lCharactersToAdd; lCharacter++ ) | ||||
| 	{ | ||||
| 		cBuffer[ lCharacter ] = cChar; | ||||
| 		cChar++; | ||||
|  | ||||
| 		if( cChar > '~' ) | ||||
| 		{ | ||||
| 			cChar = '0'; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return lCharactersToAdd; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| BaseType_t xAreSingleTaskTCPEchoClientsStillRunning( void ) | ||||
| { | ||||
| static uint32_t ulLastEchoSocketCount[ echoNUM_ECHO_CLIENTS ] = { 0 }, ulLastConnections[ echoNUM_ECHO_CLIENTS ] = { 0 }; | ||||
| BaseType_t xReturn = pdPASS, x; | ||||
|  | ||||
| 	/* Return fail is the number of cycles does not increment between | ||||
| 	consecutive calls. */ | ||||
| 	for( x = 0; x < echoNUM_ECHO_CLIENTS; x++ ) | ||||
| 	{ | ||||
| 		if( ulTxRxCycles[ x ] == ulLastEchoSocketCount[ x ] ) | ||||
| 		{ | ||||
| 			xReturn = pdFAIL; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			ulLastEchoSocketCount[ x ] = ulTxRxCycles[ x ]; | ||||
| 		} | ||||
|  | ||||
| 		if( ulConnections[ x ] == ulLastConnections[ x ] ) | ||||
| 		{ | ||||
| 			xReturn = pdFAIL; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			ulConnections[ x ] = ulLastConnections[ x ]; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return xReturn; | ||||
| } | ||||
|  | ||||
| #endif /* ipconfigUSE_TCP */ | ||||
|  | ||||
| @@ -0,0 +1,76 @@ | ||||
| /* | ||||
|     FreeRTOS V9.0.0 - Copyright (C) 2016 Real Time Engineers Ltd. | ||||
|     All rights reserved | ||||
|  | ||||
|     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. | ||||
|  | ||||
|     This file is part of the FreeRTOS distribution. | ||||
|  | ||||
|     FreeRTOS is free software; you can redistribute it and/or modify it under | ||||
|     the terms of the GNU General Public License (version 2) as published by the | ||||
|     Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. | ||||
|  | ||||
|     *************************************************************************** | ||||
|     >>!   NOTE: The modification to the GPL is included to allow you to     !<< | ||||
|     >>!   distribute a combined work that includes FreeRTOS without being   !<< | ||||
|     >>!   obliged to provide the source code for proprietary components     !<< | ||||
|     >>!   outside of the FreeRTOS kernel.                                   !<< | ||||
|     *************************************************************************** | ||||
|  | ||||
|     FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY | ||||
|     WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | ||||
|     FOR A PARTICULAR PURPOSE.  Full license text is available on the following | ||||
|     link: http://www.freertos.org/a00114.html | ||||
|  | ||||
|     *************************************************************************** | ||||
|      *                                                                       * | ||||
|      *    FreeRTOS provides completely free yet professionally developed,    * | ||||
|      *    robust, strictly quality controlled, supported, and cross          * | ||||
|      *    platform software that is more than just the market leader, it     * | ||||
|      *    is the industry's de facto standard.                               * | ||||
|      *                                                                       * | ||||
|      *    Help yourself get started quickly while simultaneously helping     * | ||||
|      *    to support the FreeRTOS project by purchasing a FreeRTOS           * | ||||
|      *    tutorial book, reference manual, or both:                          * | ||||
|      *    http://www.FreeRTOS.org/Documentation                              * | ||||
|      *                                                                       * | ||||
|     *************************************************************************** | ||||
|  | ||||
|     http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading | ||||
|     the FAQ page "My application does not run, what could be wrong?".  Have you | ||||
|     defined configASSERT()? | ||||
|  | ||||
|     http://www.FreeRTOS.org/support - In return for receiving this top quality | ||||
|     embedded software for free we request you assist our global community by | ||||
|     participating in the support forum. | ||||
|  | ||||
|     http://www.FreeRTOS.org/training - Investing in training allows your team to | ||||
|     be as productive as possible as early as possible.  Now you can receive | ||||
|     FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers | ||||
|     Ltd, and the world's leading authority on the world's leading RTOS. | ||||
|  | ||||
|     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, | ||||
|     including FreeRTOS+Trace - an indispensable productivity tool, a DOS | ||||
|     compatible FAT file system, and our tiny thread aware UDP/IP stack. | ||||
|  | ||||
|     http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate. | ||||
|     Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS. | ||||
|  | ||||
|     http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High | ||||
|     Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS | ||||
|     licenses offer ticketed support, indemnification and commercial middleware. | ||||
|  | ||||
|     http://www.SafeRTOS.com - High Integrity Systems also provide a safety | ||||
|     engineered and independently SIL3 certified version for use in safety and | ||||
|     mission critical applications that require provable dependability. | ||||
|  | ||||
|     1 tab == 4 spaces! | ||||
| */ | ||||
|  | ||||
| #ifndef SIMPLE_TCP_ECHO_SERVER_H | ||||
| #define SIMPLE_TCP_ECHO_SERVER_H | ||||
|  | ||||
| void vStartSimpleTCPServerTasks( uint16_t usStackSize, BaseType_t uxPriority ); | ||||
| BaseType_t xAreTCPEchoServersStillRunning( void ); | ||||
|  | ||||
| #endif /* SIMPLE_TCP_ECHO_SERVER_H */ | ||||
| @@ -0,0 +1,33 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| #ifndef SIMPLE_UDP_CLIENT_AND_SERVER_H | ||||
| #define SIMPLE_UDPCLIENT_AND_SERVER_H | ||||
|  | ||||
| void vStartSimpleUDPClientServerTasks( uint16_t usStackSize, uint32_t ulsPort, UBaseType_t uxPriority ); | ||||
|  | ||||
| #endif /* SIMPLE_UDPCLIENT_AND_SERVER_H */ | ||||
| @@ -0,0 +1,40 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| #ifndef SINGLE_TASK_TCP_ECHO_CLIENTS_H | ||||
| #define SINGLE_TASK_TCP_ECHO_CLIENTS_H | ||||
|  | ||||
| /* | ||||
|  * Create the TCP echo client tasks.  This is the version where an echo request | ||||
|  * is made from the same task that listens for the echo reply. | ||||
|  */ | ||||
| void vStartTCPEchoClientTasks_SingleTasks( uint16_t usTaskStackSize, UBaseType_t uxTaskPriority ); | ||||
| BaseType_t xAreSingleTaskTCPEchoClientsStillRunning( void ); | ||||
|  | ||||
| #endif /* SINGLE_TASK_TCP_ECHO_CLIENTS_H */ | ||||
|  | ||||
|  | ||||
| @@ -0,0 +1,219 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| #ifndef FREERTOS_CONFIG_H | ||||
| #define FREERTOS_CONFIG_H | ||||
|  | ||||
| /*----------------------------------------------------------- | ||||
|  * Application specific definitions. | ||||
|  * | ||||
|  * These definitions should be adjusted for your particular hardware and | ||||
|  * application requirements. | ||||
|  * | ||||
|  * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE | ||||
|  * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. | ||||
|  * http://www.freertos.org/a00110.html | ||||
|  * | ||||
|  * The bottom of this file contains some constants specific to running the UDP | ||||
|  * stack in this demo.  Constants specific to FreeRTOS+TCP itself (rather than | ||||
|  * the demo) are contained in FreeRTOSIPConfig.h. | ||||
|  *----------------------------------------------------------*/ | ||||
| #define configENABLE_BACKWARD_COMPATIBILITY		1 | ||||
| #define configUSE_PREEMPTION					1 | ||||
| #define configUSE_PORT_OPTIMISED_TASK_SELECTION	1 | ||||
| #define configMAX_PRIORITIES					( 7 ) | ||||
| #define configTICK_RATE_HZ						( 1000 ) /* In this non-real time simulated environment the tick frequency has to be at least a multiple of the Win32 tick frequency, and therefore very slow. */ | ||||
| #define configMINIMAL_STACK_SIZE				( ( unsigned short ) 60 ) /* In this simulated case, the stack only has to hold one small structure as the real stack is part of the Win32 thread. */ | ||||
| #define configTOTAL_HEAP_SIZE					( ( size_t ) ( 2048U * 1024U ) ) | ||||
| #define configMAX_TASK_NAME_LEN					( 15 ) | ||||
| #define configUSE_TRACE_FACILITY				1 | ||||
| #define configUSE_16_BIT_TICKS					0 | ||||
| #define configIDLE_SHOULD_YIELD					1 | ||||
| #define configUSE_CO_ROUTINES 					0 | ||||
| #define configUSE_MUTEXES						1 | ||||
| #define configUSE_RECURSIVE_MUTEXES				1 | ||||
| #define configQUEUE_REGISTRY_SIZE				0 | ||||
| #define configUSE_APPLICATION_TASK_TAG			0 | ||||
| #define configUSE_COUNTING_SEMAPHORES			1 | ||||
| #define configUSE_ALTERNATIVE_API				0 | ||||
| #define configNUM_THREAD_LOCAL_STORAGE_POINTERS	3 /* FreeRTOS+FAT requires 2 pointers if a CWD is supported. */ | ||||
|  | ||||
| /* Hook function related definitions. */ | ||||
| #define configUSE_TICK_HOOK				0 | ||||
| #define configUSE_IDLE_HOOK				1 | ||||
| #define configUSE_MALLOC_FAILED_HOOK	1 | ||||
| #define configCHECK_FOR_STACK_OVERFLOW	0 /* Not applicable to the Win32 port. */ | ||||
|  | ||||
| /* Software timer related definitions. */ | ||||
| #define configUSE_TIMERS				1 | ||||
| #define configTIMER_TASK_PRIORITY		( configMAX_PRIORITIES - 1 ) | ||||
| #define configTIMER_QUEUE_LENGTH		5 | ||||
| #define configTIMER_TASK_STACK_DEPTH	( configMINIMAL_STACK_SIZE * 2 ) | ||||
|  | ||||
| /* Event group related definitions. */ | ||||
| #define configUSE_EVENT_GROUPS			1 | ||||
|  | ||||
| /* Run time stats gathering definitions. */ | ||||
| #define configGENERATE_RUN_TIME_STATS	0 | ||||
|  | ||||
| /* Co-routine definitions. */ | ||||
| #define configUSE_CO_ROUTINES 			0 | ||||
| #define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) | ||||
|  | ||||
| /* Set the following definitions to 1 to include the API function, or zero | ||||
| to exclude the API function. */ | ||||
| #define INCLUDE_vTaskPrioritySet				1 | ||||
| #define INCLUDE_uxTaskPriorityGet				1 | ||||
| #define INCLUDE_vTaskDelete						1 | ||||
| #define INCLUDE_vTaskCleanUpResources			0 | ||||
| #define INCLUDE_vTaskSuspend					1 | ||||
| #define INCLUDE_vTaskDelayUntil					1 | ||||
| #define INCLUDE_vTaskDelay						1 | ||||
| #define INCLUDE_uxTaskGetStackHighWaterMark		1 | ||||
| #define INCLUDE_xTaskGetSchedulerState			1 | ||||
| #define INCLUDE_xTimerGetTimerTaskHandle		0 | ||||
| #define INCLUDE_xTaskGetIdleTaskHandle			0 | ||||
| #define INCLUDE_xQueueGetMutexHolder			1 | ||||
| #define INCLUDE_eTaskGetState					1 | ||||
| #define INCLUDE_xEventGroupSetBitsFromISR		1 | ||||
| #define INCLUDE_xTimerPendFunctionCall			1 | ||||
| #define INCLUDE_pcTaskGetTaskName				1 | ||||
|  | ||||
| /* This demo makes use of one or more example stats formatting functions.  These | ||||
| format the raw data provided by the uxTaskGetSystemState() function in to human | ||||
| readable ASCII form.  See the notes in the implementation of vTaskList() within | ||||
| FreeRTOS/Source/tasks.c for limitations.  configUSE_STATS_FORMATTING_FUNCTIONS | ||||
| is set to 2 so the formatting functions are included without the stdio.h being | ||||
| included in tasks.c.  That is because this project defines its own sprintf() | ||||
| functions. */ | ||||
| #define configUSE_STATS_FORMATTING_FUNCTIONS	1 | ||||
|  | ||||
| /* Assert call defined for debug builds. */ | ||||
| #ifdef _DEBUG | ||||
| 	extern void vAssertCalled( const char *pcFile, uint32_t ulLine ); | ||||
| 	#define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ ) | ||||
| #endif /* _DEBUG */ | ||||
|  | ||||
|  | ||||
|  | ||||
| /* Application specific definitions follow. **********************************/ | ||||
|  | ||||
| /* If configINCLUDE_DEMO_DEBUG_STATS is set to one, then a few basic IP trace | ||||
| macros are defined to gather some UDP stack statistics that can then be viewed | ||||
| through the CLI interface. */ | ||||
| #define configINCLUDE_DEMO_DEBUG_STATS 1 | ||||
|  | ||||
| /* The size of the global output buffer that is available for use when there | ||||
| are multiple command interpreters running at once (for example, one on a UART | ||||
| and one on TCP/IP).  This is done to prevent an output buffer being defined by | ||||
| each implementation - which would waste RAM.  In this case, there is only one | ||||
| command interpreter running, and it has its own local output buffer, so the | ||||
| global buffer is just set to be one byte long as it is not used and should not | ||||
| take up unnecessary RAM. */ | ||||
| #define configCOMMAND_INT_MAX_OUTPUT_SIZE 1 | ||||
|  | ||||
| /* Only used when running in the FreeRTOS Windows simulator.  Defines the | ||||
| priority of the task used to simulate Ethernet interrupts. */ | ||||
| #define configMAC_ISR_SIMULATOR_PRIORITY	( configMAX_PRIORITIES - 1 ) | ||||
|  | ||||
| /* This demo creates a virtual network connection by accessing the raw Ethernet | ||||
| or WiFi data to and from a real network connection.  Many computers have more | ||||
| than one real network port, and configNETWORK_INTERFACE_TO_USE is used to tell | ||||
| the demo which real port should be used to create the virtual port.  The ports | ||||
| available are displayed on the console when the application is executed.  For | ||||
| example, on my development laptop setting configNETWORK_INTERFACE_TO_USE to 4 | ||||
| results in the wired network being used, while setting | ||||
| configNETWORK_INTERFACE_TO_USE to 2 results in the wireless network being | ||||
| used. */ | ||||
| #define configNETWORK_INTERFACE_TO_USE 2L | ||||
|  | ||||
| /* The address of an echo server that will be used by the two demo echo client | ||||
| tasks. | ||||
| http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/TCP_Echo_Clients.html | ||||
| http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/UDP_Echo_Clients.html */ | ||||
| #define configECHO_SERVER_ADDR0	192 | ||||
| #define configECHO_SERVER_ADDR1 168 | ||||
| #define configECHO_SERVER_ADDR2 0 | ||||
| #define configECHO_SERVER_ADDR3 11 | ||||
|  | ||||
| /* Default MAC address configuration.  The demo creates a virtual network | ||||
| connection that uses this MAC address by accessing the raw Ethernet/WiFi data | ||||
| to and from a real network connection on the host PC.  See the | ||||
| configNETWORK_INTERFACE_TO_USE definition above for information on how to | ||||
| configure the real network connection to use. */ | ||||
| #define configMAC_ADDR0		0x00 | ||||
| #define configMAC_ADDR1		0x11 | ||||
| #define configMAC_ADDR2		0x22 | ||||
| #define configMAC_ADDR3		0x33 | ||||
| #define configMAC_ADDR4		0x44 | ||||
| #define configMAC_ADDR5		0x41 | ||||
|  | ||||
| /* Default IP address configuration.  Used in ipconfigUSE_DNS is set to 0, or | ||||
| ipconfigUSE_DNS is set to 1 but a DNS server cannot be contacted. */ | ||||
| #define configIP_ADDR0		10 | ||||
| #define configIP_ADDR1		10 | ||||
| #define configIP_ADDR2		10 | ||||
| #define configIP_ADDR3		200 | ||||
|  | ||||
| /* Default gateway IP address configuration.  Used in ipconfigUSE_DNS is set to | ||||
| 0, or ipconfigUSE_DNS is set to 1 but a DNS server cannot be contacted. */ | ||||
| #define configGATEWAY_ADDR0	10 | ||||
| #define configGATEWAY_ADDR1	10 | ||||
| #define configGATEWAY_ADDR2	10 | ||||
| #define configGATEWAY_ADDR3	1 | ||||
|  | ||||
| /* Default DNS server configuration.  OpenDNS addresses are 208.67.222.222 and | ||||
| 208.67.220.220.  Used in ipconfigUSE_DNS is set to 0, or ipconfigUSE_DNS is set | ||||
| to 1 but a DNS server cannot be contacted.*/ | ||||
| #define configDNS_SERVER_ADDR0 	208 | ||||
| #define configDNS_SERVER_ADDR1 	67 | ||||
| #define configDNS_SERVER_ADDR2 	222 | ||||
| #define configDNS_SERVER_ADDR3 	222 | ||||
|  | ||||
| /* Default netmask configuration.  Used in ipconfigUSE_DNS is set to 0, or | ||||
| ipconfigUSE_DNS is set to 1 but a DNS server cannot be contacted. */ | ||||
| #define configNET_MASK0		255 | ||||
| #define configNET_MASK1		0 | ||||
| #define configNET_MASK2		0 | ||||
| #define configNET_MASK3		0 | ||||
|  | ||||
| /* The UDP port to which print messages are sent. */ | ||||
| #define configPRINT_PORT	( 15000 ) | ||||
|  | ||||
| #if( defined( _MSC_VER ) && ( _MSC_VER <= 1600 ) && !defined( snprintf ) ) | ||||
| 	/* Map to Windows names. */ | ||||
| 	#define snprintf	_snprintf | ||||
| 	#define vsnprintf	_vsnprintf | ||||
| #endif | ||||
|  | ||||
| /* Visual studio does not have an implementation of strcasecmp(). */ | ||||
| #define strcasecmp _stricmp | ||||
| #define strncasecmp _strnicmp | ||||
| #define strcmpi _strcmpi | ||||
|  | ||||
| #endif /* FREERTOS_CONFIG_H */ | ||||
|  | ||||
| @@ -0,0 +1,307 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
|  | ||||
| /***************************************************************************** | ||||
|  * | ||||
|  * See the following URL for configuration information. | ||||
|  * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/TCP_IP_Configuration.html | ||||
|  * | ||||
|  *****************************************************************************/ | ||||
|  | ||||
| #ifndef FREERTOS_IP_CONFIG_H | ||||
| #define FREERTOS_IP_CONFIG_H | ||||
|  | ||||
| /* Prototype for the function used to print out.  In this case it prints to the | ||||
| console before the network is connected then a UDP port after the network has | ||||
| connected. */ | ||||
| extern void vLoggingPrintf( const char *pcFormatString, ... ); | ||||
|  | ||||
| /* Set to 1 to print out debug messages.  If ipconfigHAS_DEBUG_PRINTF is set to | ||||
| 1 then FreeRTOS_debug_printf should be defined to the function used to print | ||||
| out the debugging messages. */ | ||||
| #define ipconfigHAS_DEBUG_PRINTF	0 | ||||
| #if( ipconfigHAS_DEBUG_PRINTF == 1 ) | ||||
| 	#define FreeRTOS_debug_printf(X)	vLoggingPrintf X | ||||
| #endif | ||||
|  | ||||
| /* Set to 1 to print out non debugging messages, for example the output of the | ||||
| FreeRTOS_netstat() command, and ping replies.  If ipconfigHAS_PRINTF is set to 1 | ||||
| then FreeRTOS_printf should be set to the function used to print out the | ||||
| messages. */ | ||||
| #define ipconfigHAS_PRINTF			1 | ||||
| #if( ipconfigHAS_PRINTF == 1 ) | ||||
| 	#define FreeRTOS_printf(X)			vLoggingPrintf X | ||||
| #endif | ||||
|  | ||||
| /* Define the byte order of the target MCU (the MCU FreeRTOS+TCP is executing | ||||
| on).  Valid options are pdFREERTOS_BIG_ENDIAN and pdFREERTOS_LITTLE_ENDIAN. */ | ||||
| #define ipconfigBYTE_ORDER pdFREERTOS_LITTLE_ENDIAN | ||||
|  | ||||
| /* If the network card/driver includes checksum offloading (IP/TCP/UDP checksums) | ||||
| then set ipconfigDRIVER_INCLUDED_RX_IP_CHECKSUM to 1 to prevent the software | ||||
| stack repeating the checksum calculations. */ | ||||
| #define ipconfigDRIVER_INCLUDED_RX_IP_CHECKSUM   1 | ||||
|  | ||||
| /* Several API's will block until the result is known, or the action has been | ||||
| performed, for example FreeRTOS_send() and FreeRTOS_recv().  The timeouts can be | ||||
| set per socket, using setsockopt().  If not set, the times below will be | ||||
| used as defaults. */ | ||||
| #define ipconfigSOCK_DEFAULT_RECEIVE_BLOCK_TIME	( 5000 ) | ||||
| #define	ipconfigSOCK_DEFAULT_SEND_BLOCK_TIME	( 5000 ) | ||||
|  | ||||
| /* Include support for LLMNR: Link-local Multicast Name Resolution | ||||
| (non-Microsoft) */ | ||||
| #define ipconfigUSE_LLMNR					( 1 ) | ||||
|  | ||||
| /* Include support for NBNS: NetBIOS Name Service (Microsoft) */ | ||||
| #define ipconfigUSE_NBNS					( 1 ) | ||||
|  | ||||
| /* Include support for DNS caching.  For TCP, having a small DNS cache is very | ||||
| useful.  When a cache is present, ipconfigDNS_REQUEST_ATTEMPTS can be kept low | ||||
| and also DNS may use small timeouts.  If a DNS reply comes in after the DNS | ||||
| socket has been destroyed, the result will be stored into the cache.  The next | ||||
| call to FreeRTOS_gethostbyname() will return immediately, without even creating | ||||
| a socket. */ | ||||
| #define ipconfigUSE_DNS_CACHE				( 1 ) | ||||
| #define ipconfigDNS_CACHE_NAME_LENGTH		( 16 ) | ||||
| #define ipconfigDNS_CACHE_ENTRIES			( 4 ) | ||||
| #define ipconfigDNS_REQUEST_ATTEMPTS		( 2 ) | ||||
|  | ||||
| /* The IP stack executes it its own task (although any application task can make | ||||
| use of its services through the published sockets API). ipconfigUDP_TASK_PRIORITY | ||||
| sets the priority of the task that executes the IP stack.  The priority is a | ||||
| standard FreeRTOS task priority so can take any value from 0 (the lowest | ||||
| priority) to (configMAX_PRIORITIES - 1) (the highest priority). | ||||
| configMAX_PRIORITIES is a standard FreeRTOS configuration parameter defined in | ||||
| FreeRTOSConfig.h, not FreeRTOSIPConfig.h. Consideration needs to be given as to | ||||
| the priority assigned to the task executing the IP stack relative to the | ||||
| priority assigned to tasks that use the IP stack. */ | ||||
| #define ipconfigIP_TASK_PRIORITY			( configMAX_PRIORITIES - 2 ) | ||||
|  | ||||
| /* The size, in words (not bytes), of the stack allocated to the FreeRTOS+TCP | ||||
| task.  This setting is less important when the FreeRTOS Win32 simulator is used | ||||
| as the Win32 simulator only stores a fixed amount of information on the task | ||||
| stack.  FreeRTOS includes optional stack overflow detection, see: | ||||
| http://www.freertos.org/Stacks-and-stack-overflow-checking.html */ | ||||
| #define ipconfigIP_TASK_STACK_SIZE_WORDS	( configMINIMAL_STACK_SIZE * 5 ) | ||||
|  | ||||
| /* ipconfigRAND32() is called by the IP stack to generate random numbers for | ||||
| things such as a DHCP transaction number or initial sequence number.  Random | ||||
| number generation is performed via this macro to allow applications to use their | ||||
| own random number generation method.  For example, it might be possible to | ||||
| generate a random number by sampling noise on an analogue input. */ | ||||
| extern UBaseType_t uxRand(); | ||||
| #define ipconfigRAND32()	uxRand() | ||||
|  | ||||
| /* If ipconfigUSE_NETWORK_EVENT_HOOK is set to 1 then FreeRTOS+TCP will call the | ||||
| network event hook at the appropriate times.  If ipconfigUSE_NETWORK_EVENT_HOOK | ||||
| is not set to 1 then the network event hook will never be called.  See | ||||
| http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_UDP/API/vApplicationIPNetworkEventHook.shtml | ||||
| */ | ||||
| #define ipconfigUSE_NETWORK_EVENT_HOOK 1 | ||||
|  | ||||
| /* Sockets have a send block time attribute.  If FreeRTOS_sendto() is called but | ||||
| a network buffer cannot be obtained then the calling task is held in the Blocked | ||||
| state (so other tasks can continue to executed) until either a network buffer | ||||
| becomes available or the send block time expires.  If the send block time expires | ||||
| then the send operation is aborted.  The maximum allowable send block time is | ||||
| capped to the value set by ipconfigMAX_SEND_BLOCK_TIME_TICKS.  Capping the | ||||
| maximum allowable send block time prevents prevents a deadlock occurring when | ||||
| all the network buffers are in use and the tasks that process (and subsequently | ||||
| free) the network buffers are themselves blocked waiting for a network buffer. | ||||
| ipconfigMAX_SEND_BLOCK_TIME_TICKS is specified in RTOS ticks.  A time in | ||||
| milliseconds can be converted to a time in ticks by dividing the time in | ||||
| milliseconds by portTICK_PERIOD_MS. */ | ||||
| #define ipconfigUDP_MAX_SEND_BLOCK_TIME_TICKS ( 5000 / portTICK_PERIOD_MS ) | ||||
|  | ||||
| /* If ipconfigUSE_DHCP is 1 then FreeRTOS+TCP will attempt to retrieve an IP | ||||
| address, netmask, DNS server address and gateway address from a DHCP server.  If | ||||
| ipconfigUSE_DHCP is 0 then FreeRTOS+TCP will use a static IP address.  The | ||||
| stack will revert to using the static IP address even when ipconfigUSE_DHCP is | ||||
| set to 1 if a valid configuration cannot be obtained from a DHCP server for any | ||||
| reason.  The static configuration used is that passed into the stack by the | ||||
| FreeRTOS_IPInit() function call. */ | ||||
| #define ipconfigUSE_DHCP	1 | ||||
|  | ||||
| /* When ipconfigUSE_DHCP is set to 1, DHCP requests will be sent out at | ||||
| increasing time intervals until either a reply is received from a DHCP server | ||||
| and accepted, or the interval between transmissions reaches | ||||
| ipconfigMAXIMUM_DISCOVER_TX_PERIOD.  The IP stack will revert to using the | ||||
| static IP address passed as a parameter to FreeRTOS_IPInit() if the | ||||
| re-transmission time interval reaches ipconfigMAXIMUM_DISCOVER_TX_PERIOD without | ||||
| a DHCP reply being received. */ | ||||
| #define ipconfigMAXIMUM_DISCOVER_TX_PERIOD		( 120000 / portTICK_PERIOD_MS ) | ||||
|  | ||||
| /* The ARP cache is a table that maps IP addresses to MAC addresses.  The IP | ||||
| stack can only send a UDP message to a remove IP address if it knowns the MAC | ||||
| address associated with the IP address, or the MAC address of the router used to | ||||
| contact the remote IP address.  When a UDP message is received from a remote IP | ||||
| address the MAC address and IP address are added to the ARP cache.  When a UDP | ||||
| message is sent to a remote IP address that does not already appear in the ARP | ||||
| cache then the UDP message is replaced by a ARP message that solicits the | ||||
| required MAC address information.  ipconfigARP_CACHE_ENTRIES defines the maximum | ||||
| number of entries that can exist in the ARP table at any one time. */ | ||||
| #define ipconfigARP_CACHE_ENTRIES		6 | ||||
|  | ||||
| /* ARP requests that do not result in an ARP response will be re-transmitted a | ||||
| maximum of ipconfigMAX_ARP_RETRANSMISSIONS times before the ARP request is | ||||
| aborted. */ | ||||
| #define ipconfigMAX_ARP_RETRANSMISSIONS ( 5 ) | ||||
|  | ||||
| /* ipconfigMAX_ARP_AGE defines the maximum time between an entry in the ARP | ||||
| table being created or refreshed and the entry being removed because it is stale. | ||||
| New ARP requests are sent for ARP cache entries that are nearing their maximum | ||||
| age.  ipconfigMAX_ARP_AGE is specified in tens of seconds, so a value of 150 is | ||||
| equal to 1500 seconds (or 25 minutes). */ | ||||
| #define ipconfigMAX_ARP_AGE			150 | ||||
|  | ||||
| /* Implementing FreeRTOS_inet_addr() necessitates the use of string handling | ||||
| routines, which are relatively large.  To save code space the full | ||||
| FreeRTOS_inet_addr() implementation is made optional, and a smaller and faster | ||||
| alternative called FreeRTOS_inet_addr_quick() is provided.  FreeRTOS_inet_addr() | ||||
| takes an IP in decimal dot format (for example, "192.168.0.1") as its parameter. | ||||
| FreeRTOS_inet_addr_quick() takes an IP address as four separate numerical octets | ||||
| (for example, 192, 168, 0, 1) as its parameters.  If | ||||
| ipconfigINCLUDE_FULL_INET_ADDR is set to 1 then both FreeRTOS_inet_addr() and | ||||
| FreeRTOS_indet_addr_quick() are available.  If ipconfigINCLUDE_FULL_INET_ADDR is | ||||
| not set to 1 then only FreeRTOS_indet_addr_quick() is available. */ | ||||
| #define ipconfigINCLUDE_FULL_INET_ADDR	1 | ||||
|  | ||||
| /* ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS defines the total number of network buffer that | ||||
| are available to the IP stack.  The total number of network buffers is limited | ||||
| to ensure the total amount of RAM that can be consumed by the IP stack is capped | ||||
| to a pre-determinable value. */ | ||||
| #define ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS		60 | ||||
|  | ||||
| /* A FreeRTOS queue is used to send events from application tasks to the IP | ||||
| stack.  ipconfigEVENT_QUEUE_LENGTH sets the maximum number of events that can | ||||
| be queued for processing at any one time.  The event queue must be a minimum of | ||||
| 5 greater than the total number of network buffers. */ | ||||
| #define ipconfigEVENT_QUEUE_LENGTH		( ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS + 5 ) | ||||
|  | ||||
| /* The address of a socket is the combination of its IP address and its port | ||||
| number.  FreeRTOS_bind() is used to manually allocate a port number to a socket | ||||
| (to 'bind' the socket to a port), but manual binding is not normally necessary | ||||
| for client sockets (those sockets that initiate outgoing connections rather than | ||||
| wait for incoming connections on a known port number).  If | ||||
| ipconfigALLOW_SOCKET_SEND_WITHOUT_BIND is set to 1 then calling | ||||
| FreeRTOS_sendto() on a socket that has not yet been bound will result in the IP | ||||
| stack automatically binding the socket to a port number from the range | ||||
| socketAUTO_PORT_ALLOCATION_START_NUMBER to 0xffff.  If | ||||
| ipconfigALLOW_SOCKET_SEND_WITHOUT_BIND is set to 0 then calling FreeRTOS_sendto() | ||||
| on a socket that has not yet been bound will result in the send operation being | ||||
| aborted. */ | ||||
| #define ipconfigALLOW_SOCKET_SEND_WITHOUT_BIND 1 | ||||
|  | ||||
| /* Defines the Time To Live (TTL) values used in outgoing UDP packets. */ | ||||
| #define ipconfigUDP_TIME_TO_LIVE		128 | ||||
| #define ipconfigTCP_TIME_TO_LIVE		128 /* also defined in FreeRTOSIPConfigDefaults.h */ | ||||
|  | ||||
| /* USE_TCP: Use TCP and all its features */ | ||||
| #define ipconfigUSE_TCP				( 1 ) | ||||
|  | ||||
| /* USE_WIN: Let TCP use windowing mechanism. */ | ||||
| #define ipconfigUSE_TCP_WIN			( 1 ) | ||||
|  | ||||
| /* The MTU is the maximum number of bytes the payload of a network frame can | ||||
| contain.  For normal Ethernet V2 frames the maximum MTU is 1500.  Setting a | ||||
| lower value can save RAM, depending on the buffer management scheme used.  If | ||||
| ipconfigCAN_FRAGMENT_OUTGOING_PACKETS is 1 then (ipconfigNETWORK_MTU - 28) must | ||||
| be divisible by 8. */ | ||||
| #define ipconfigNETWORK_MTU		1200 | ||||
|  | ||||
| /* Set ipconfigUSE_DNS to 1 to include a basic DNS client/resolver.  DNS is used | ||||
| through the FreeRTOS_gethostbyname() API function. */ | ||||
| #define ipconfigUSE_DNS			1 | ||||
|  | ||||
| /* If ipconfigREPLY_TO_INCOMING_PINGS is set to 1 then the IP stack will | ||||
| generate replies to incoming ICMP echo (ping) requests. */ | ||||
| #define ipconfigREPLY_TO_INCOMING_PINGS				1 | ||||
|  | ||||
| /* If ipconfigSUPPORT_OUTGOING_PINGS is set to 1 then the | ||||
| FreeRTOS_SendPingRequest() API function is available. */ | ||||
| #define ipconfigSUPPORT_OUTGOING_PINGS				0 | ||||
|  | ||||
| /* If ipconfigSUPPORT_SELECT_FUNCTION is set to 1 then the FreeRTOS_select() | ||||
| (and associated) API function is available. */ | ||||
| #define ipconfigSUPPORT_SELECT_FUNCTION				1 | ||||
|  | ||||
| /* If ipconfigFILTER_OUT_NON_ETHERNET_II_FRAMES is set to 1 then Ethernet frames | ||||
| that are not in Ethernet II format will be dropped.  This option is included for | ||||
| potential future IP stack developments. */ | ||||
| #define ipconfigFILTER_OUT_NON_ETHERNET_II_FRAMES  1 | ||||
|  | ||||
| /* If ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES is set to 1 then it is the | ||||
| responsibility of the Ethernet interface to filter out packets that are of no | ||||
| interest.  If the Ethernet interface does not implement this functionality, then | ||||
| set ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES to 0 to have the IP stack | ||||
| perform the filtering instead (it is much less efficient for the stack to do it | ||||
| because the packet will already have been passed into the stack).  If the | ||||
| Ethernet driver does all the necessary filtering in hardware then software | ||||
| filtering can be removed by using a value other than 1 or 0. */ | ||||
| #define ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES	1 | ||||
|  | ||||
| /* The windows simulator cannot really simulate MAC interrupts, and needs to | ||||
| block occasionally to allow other tasks to run. */ | ||||
| #define configWINDOWS_MAC_INTERRUPT_SIMULATOR_DELAY ( 20 / portTICK_PERIOD_MS ) | ||||
|  | ||||
| /* Advanced only: in order to access 32-bit fields in the IP packets with | ||||
| 32-bit memory instructions, all packets will be stored 32-bit-aligned, plus 16-bits. | ||||
| This has to do with the contents of the IP-packets: all 32-bit fields are | ||||
| 32-bit-aligned, plus 16-bit(!) */ | ||||
| #define ipconfigPACKET_FILLER_SIZE 2 | ||||
|  | ||||
| /* Define the size of the pool of TCP window descriptors.  On the average, each | ||||
| TCP socket will use up to 2 x 6 descriptors, meaning that it can have 2 x 6 | ||||
| outstanding packets (for Rx and Tx).  When using up to 10 TP sockets | ||||
| simultaneously, one could define TCP_WIN_SEG_COUNT as 120. */ | ||||
| #define ipconfigTCP_WIN_SEG_COUNT		240 | ||||
|  | ||||
| /* Each TCP socket has a circular buffers for Rx and Tx, which have a fixed | ||||
| maximum size.  Define the size of Rx buffer for TCP sockets. */ | ||||
| #define ipconfigTCP_RX_BUFFER_LENGTH			( 1000 ) | ||||
|  | ||||
| /* Define the size of Tx buffer for TCP sockets. */ | ||||
| #define ipconfigTCP_TX_BUFFER_LENGTH			( 1000 ) | ||||
|  | ||||
| /* When using call-back handlers, the driver may check if the handler points to | ||||
| real program memory (RAM or flash) or just has a random non-zero value. */ | ||||
| #define ipconfigIS_VALID_PROG_ADDRESS(x) ( (x) != NULL ) | ||||
|  | ||||
| /* Include support for TCP hang protection.  All sockets in a connecting or | ||||
| disconnecting stage will timeout after a period of non-activity. */ | ||||
| #define ipconfigTCP_HANG_PROTECTION			( 1 ) | ||||
| #define ipconfigTCP_HANG_PROTECTION_TIME	( 30 ) | ||||
|  | ||||
| /* Include support for TCP keep-alive messages. */ | ||||
| #define ipconfigTCP_KEEP_ALIVE				( 1 ) | ||||
| #define ipconfigTCP_KEEP_ALIVE_INTERVAL		( 20 ) /* in seconds */ | ||||
|  | ||||
| #define portINLINE __inline | ||||
|  | ||||
| #endif /* FREERTOS_IP_CONFIG_H */ | ||||
| @@ -0,0 +1,23 @@ | ||||
|  | ||||
| Microsoft Visual Studio Solution File, Format Version 11.00 | ||||
| # Visual Studio 2010 | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RTOSDemo", "WIN32.vcxproj", "{C686325E-3261-42F7-AEB1-DDE5280E1CEB}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(TestCaseManagementSettings) = postSolution | ||||
| 		CategoryFile = FreeRTOS_Plus_TCP_Minimal.vsmdi | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		Debug|Win32 = Debug|Win32 | ||||
| 		Release|Win32 = Release|Win32 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||
| 		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.ActiveCfg = Debug|Win32 | ||||
| 		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.Build.0 = Debug|Win32 | ||||
| 		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Release|Win32.ActiveCfg = Release|Win32 | ||||
| 		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Release|Win32.Build.0 = Release|Win32 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(SolutionProperties) = preSolution | ||||
| 		HideSolutionNode = FALSE | ||||
| 	EndGlobalSection | ||||
| EndGlobal | ||||
										
											Binary file not shown.
										
									
								
							| @@ -0,0 +1,34 @@ | ||||
| The FreeRTOS+TCP source code and example projects are currently provided in | ||||
| their own .zip file download, but using the directory structure of the official | ||||
| FreeRTOS .zip file download.  This allow the projects to be seamlessly moved | ||||
| from one download to the other, but can seem strange when the files are viewed | ||||
| in isolation. | ||||
|  | ||||
| The minimal FreeRTOS+TCP Visual Studio project file is in the following directory: | ||||
| FreeRTOS-Plus\Demo\FreeRTOS_Plus_TCP_Minimal_Windows_Simulator | ||||
|  | ||||
| The minimal project is a cut down version of the full Windows demo that only | ||||
| includes examples of simple TCP and UDP clients.  The instructions for the full  | ||||
| Windows demo are still relevant though as they describe how to set up the  | ||||
| WinPCap development environment, how to set the IP address, and other such  | ||||
| items.  Note that, as delivered, configUSE_DHCP is set to 0, so a static IP  | ||||
| address is used.  The instructions are provided on the following URL: | ||||
| http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html | ||||
|  | ||||
| The UDP client example included in the minimal project is described on the  | ||||
| following URL: | ||||
| http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/UDP_client_server.html | ||||
|  | ||||
| The TCP client example included in the minimal project is described on the | ||||
| following URL: | ||||
| http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/TCP_Echo_Clients.html | ||||
|  | ||||
| A description of the FreeRTOS+TCP source code directory is provided on the | ||||
| following URL: | ||||
| http://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/TCP_Networking_Tutorial_Source_Code_Organisation.html | ||||
|  | ||||
| A description of the way the main FreeRTOS .zip file download source code is | ||||
| organised is provided on the following URL: | ||||
| http://www.freertos.org/a00017.html | ||||
|  | ||||
|  | ||||
| @@ -0,0 +1,6 @@ | ||||
| [{000214A0-0000-0000-C000-000000000046}] | ||||
| Prop3=19,2 | ||||
| [InternetShortcut] | ||||
| URL=http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html | ||||
| IDList= | ||||
| HotKey=0 | ||||
| @@ -0,0 +1,197 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
|   <ItemGroup Label="ProjectConfigurations"> | ||||
|     <ProjectConfiguration Include="Debug|Win32"> | ||||
|       <Configuration>Debug</Configuration> | ||||
|       <Platform>Win32</Platform> | ||||
|     </ProjectConfiguration> | ||||
|     <ProjectConfiguration Include="Release|Win32"> | ||||
|       <Configuration>Release</Configuration> | ||||
|       <Platform>Win32</Platform> | ||||
|     </ProjectConfiguration> | ||||
|   </ItemGroup> | ||||
|   <PropertyGroup Label="Globals"> | ||||
|     <ProjectGuid>{C686325E-3261-42F7-AEB1-DDE5280E1CEB}</ProjectGuid> | ||||
|     <ProjectName>RTOSDemo</ProjectName> | ||||
|   </PropertyGroup> | ||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> | ||||
|     <ConfigurationType>Application</ConfigurationType> | ||||
|     <UseOfMfc>false</UseOfMfc> | ||||
|     <CharacterSet>MultiByte</CharacterSet> | ||||
|     <PlatformToolset>v140</PlatformToolset> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> | ||||
|     <ConfigurationType>Application</ConfigurationType> | ||||
|     <UseOfMfc>false</UseOfMfc> | ||||
|     <CharacterSet>MultiByte</CharacterSet> | ||||
|     <PlatformToolset>v140</PlatformToolset> | ||||
|   </PropertyGroup> | ||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> | ||||
|   <ImportGroup Label="ExtensionSettings"> | ||||
|   </ImportGroup> | ||||
|   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets"> | ||||
|     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||
|     <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> | ||||
|   </ImportGroup> | ||||
|   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets"> | ||||
|     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> | ||||
|     <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC60.props" /> | ||||
|   </ImportGroup> | ||||
|   <PropertyGroup Label="UserMacros" /> | ||||
|   <PropertyGroup> | ||||
|     <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion> | ||||
|     <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</OutDir> | ||||
|     <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\Debug\</IntDir> | ||||
|     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental> | ||||
|     <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</OutDir> | ||||
|     <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\Release\</IntDir> | ||||
|     <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental> | ||||
|     <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> | ||||
|     <Midl> | ||||
|       <TypeLibraryName>.\Debug/WIN32.tlb</TypeLibraryName> | ||||
|       <HeaderFileName> | ||||
|       </HeaderFileName> | ||||
|     </Midl> | ||||
|     <ClCompile> | ||||
|       <Optimization>Disabled</Optimization> | ||||
|       <AdditionalIncludeDirectories>..\..\Source\FreeRTOS-Plus-FAT\include;..\..\Source\FreeRTOS-Plus-FAT\portable\common;..\..\Source\FreeRTOS-Plus-TCP\protocols\include;..\..\Source\FreeRTOS-Plus-TCP\portable\BufferManagement;.\DemoTasks\include;..\..\Source\FreeRTOS-Plus-TCP\portable\Compiler\MSVC;.\WinPCap;..\..\..\FreeRTOS\Source\include;..\..\..\FreeRTOS\Source\portable\MSVC-MingW;..\..\Source\FreeRTOS-Plus-CLI;.\TraceMacros\Example1;..\..\Source\FreeRTOS-Plus-TCP\include;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
|       <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;_WIN32_WINNT=0x0500;WINVER=0x400;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <MinimalRebuild>true</MinimalRebuild> | ||||
|       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> | ||||
|       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary> | ||||
|       <PrecompiledHeaderOutputFile>.\Debug/WIN32.pch</PrecompiledHeaderOutputFile> | ||||
|       <AssemblerListingLocation>.\Debug/</AssemblerListingLocation> | ||||
|       <ObjectFileName>.\Debug/</ObjectFileName> | ||||
|       <ProgramDataBaseFileName>.\Debug/</ProgramDataBaseFileName> | ||||
|       <WarningLevel>Level4</WarningLevel> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <DisableLanguageExtensions>false</DisableLanguageExtensions> | ||||
|       <DebugInformationFormat>EditAndContinue</DebugInformationFormat> | ||||
|       <AdditionalOptions>/wd4210 /wd4127 /wd4214 /wd4201 /wd4244  /wd4310 %(AdditionalOptions)</AdditionalOptions> | ||||
|       <BrowseInformation>true</BrowseInformation> | ||||
|       <PrecompiledHeader>NotUsing</PrecompiledHeader> | ||||
|       <ExceptionHandling>false</ExceptionHandling> | ||||
|       <CompileAs>CompileAsC</CompileAs> | ||||
|     </ClCompile> | ||||
|     <ResourceCompile> | ||||
|       <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <Culture>0x0c09</Culture> | ||||
|     </ResourceCompile> | ||||
|     <Link> | ||||
|       <OutputFile>.\Debug/RTOSDemo.exe</OutputFile> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <GenerateDebugInformation>true</GenerateDebugInformation> | ||||
|       <ProgramDatabaseFile>.\Debug/WIN32.pdb</ProgramDatabaseFile> | ||||
|       <SubSystem>Console</SubSystem> | ||||
|       <TargetMachine>MachineX86</TargetMachine> | ||||
|       <AdditionalDependencies>wpcap.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||||
|       <AdditionalLibraryDirectories>.\WinPCap</AdditionalLibraryDirectories> | ||||
|       <Profile>false</Profile> | ||||
|     </Link> | ||||
|     <Bscmake> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <OutputFile>.\Debug/WIN32.bsc</OutputFile> | ||||
|     </Bscmake> | ||||
|   </ItemDefinitionGroup> | ||||
|   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> | ||||
|     <Midl> | ||||
|       <TypeLibraryName>.\Release/WIN32.tlb</TypeLibraryName> | ||||
|       <HeaderFileName> | ||||
|       </HeaderFileName> | ||||
|     </Midl> | ||||
|     <ClCompile> | ||||
|       <Optimization>MaxSpeed</Optimization> | ||||
|       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion> | ||||
|       <PreprocessorDefinitions>_WINSOCKAPI_;WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <StringPooling>true</StringPooling> | ||||
|       <RuntimeLibrary>MultiThreaded</RuntimeLibrary> | ||||
|       <FunctionLevelLinking>true</FunctionLevelLinking> | ||||
|       <PrecompiledHeaderOutputFile>.\Release/WIN32.pch</PrecompiledHeaderOutputFile> | ||||
|       <AssemblerListingLocation>.\Release/</AssemblerListingLocation> | ||||
|       <ObjectFileName>.\Release/</ObjectFileName> | ||||
|       <ProgramDataBaseFileName>.\Release/</ProgramDataBaseFileName> | ||||
|       <WarningLevel>Level3</WarningLevel> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <AdditionalIncludeDirectories>..\Common\Utils;..\Common\ethernet\lwip-1.4.0\ports\win32\WinPCap;..\Common\ethernet\lwip-1.4.0\src\include\ipv4;..\Common\ethernet\lwip-1.4.0\src\include;..\..\Source\include;..\..\Source\portable\MSVC-MingW;..\Common\ethernet\lwip-1.4.0\ports\win32\include;..\Common\Include;.\lwIP_Apps;.;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
|     </ClCompile> | ||||
|     <ResourceCompile> | ||||
|       <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <Culture>0x0c09</Culture> | ||||
|     </ResourceCompile> | ||||
|     <Link> | ||||
|       <OutputFile>.\Release/RTOSDemo.exe</OutputFile> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <ProgramDatabaseFile>.\Release/WIN32.pdb</ProgramDatabaseFile> | ||||
|       <SubSystem>Console</SubSystem> | ||||
|       <TargetMachine>MachineX86</TargetMachine> | ||||
|       <AdditionalLibraryDirectories>..\Common\ethernet\lwip-1.4.0\ports\win32\WinPCap</AdditionalLibraryDirectories> | ||||
|       <AdditionalDependencies>wpcap.lib;%(AdditionalDependencies)</AdditionalDependencies> | ||||
|     </Link> | ||||
|     <Bscmake> | ||||
|       <SuppressStartupBanner>true</SuppressStartupBanner> | ||||
|       <OutputFile>.\Release/WIN32.bsc</OutputFile> | ||||
|     </Bscmake> | ||||
|   </ItemDefinitionGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\event_groups.c" /> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\list.c" /> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MemMang\heap_4.c" /> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MSVC-MingW\port.c" /> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\queue.c" /> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\tasks.c" /> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\timers.c" /> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_ARP.c" /> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_DHCP.c" /> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_DNS.c" /> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_IP.c" /> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_Sockets.c" /> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_Stream_Buffer.c" /> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_TCP_IP.c" /> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_TCP_WIN.c" /> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_UDP_IP.c" /> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\portable\BufferManagement\BufferAllocation_2.c" /> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\portable\NetworkInterface\WinPCap\NetworkInterface.c" /> | ||||
|     <ClCompile Include="DemoTasks\SimpleTCPEchoServer.c" /> | ||||
|     <ClCompile Include="DemoTasks\TCPEchoClient_SingleTasks.c" /> | ||||
|     <ClCompile Include="DemoTasks\SimpleUDPClientAndServer.c" /> | ||||
|     <ClCompile Include="demo_logging.c" /> | ||||
|     <ClCompile Include="main.c"> | ||||
|       <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> | ||||
|       <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|       <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\event_groups.h" /> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\FreeRTOS.h" /> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\portable.h" /> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\projdefs.h" /> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\queue.h" /> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\semphr.h" /> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\task.h" /> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\timers.h" /> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\portable\MSVC-MingW\portmacro.h" /> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOSIPConfigDefaults.h" /> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_ARP.h" /> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_DHCP.h" /> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_DNS.h" /> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_IP.h" /> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_IP_Private.h" /> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_Sockets.h" /> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_Stream_Buffer.h" /> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_TCP_IP.h" /> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_TCP_WIN.h" /> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_UDP_IP.h" /> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\IPTraceMacroDefaults.h" /> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\NetworkBufferManagement.h" /> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\NetworkInterface.h" /> | ||||
|     <ClInclude Include="FreeRTOSConfig.h" /> | ||||
|     <ClInclude Include="FreeRTOSIPConfig.h" /> | ||||
|   </ItemGroup> | ||||
|   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> | ||||
|   <ImportGroup Label="ExtensionTargets"> | ||||
|   </ImportGroup> | ||||
| </Project> | ||||
| @@ -0,0 +1,177 @@ | ||||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> | ||||
|   <ItemGroup> | ||||
|     <Filter Include="Resource Files"> | ||||
|       <UniqueIdentifier>{38712199-cebf-4124-bf15-398f7c3419ea}</UniqueIdentifier> | ||||
|       <Extensions>ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS"> | ||||
|       <UniqueIdentifier>{af3445a1-4908-4170-89ed-39345d90d30c}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS\Source"> | ||||
|       <UniqueIdentifier>{f32be356-4763-4cae-9020-974a2638cb08}</UniqueIdentifier> | ||||
|       <Extensions>*.c</Extensions> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS\Source\Portable"> | ||||
|       <UniqueIdentifier>{88f409e6-d396-4ac5-94bd-7a99c914be46}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS+"> | ||||
|       <UniqueIdentifier>{e5ad4ec7-23dc-4295-8add-2acaee488f5a}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS\Source\include"> | ||||
|       <UniqueIdentifier>{d2dcd641-8d91-492b-852f-5563ffadaec6}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS+\FreeRTOS+TCP"> | ||||
|       <UniqueIdentifier>{8672fa26-b119-481f-8b8d-086419c01a3e}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS+\FreeRTOS+TCP\portable"> | ||||
|       <UniqueIdentifier>{4570be11-ec96-4b55-ac58-24b50ada980a}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="FreeRTOS+\FreeRTOS+TCP\include"> | ||||
|       <UniqueIdentifier>{5d93ed51-023a-41ad-9243-8d230165d34b}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|     <Filter Include="DemoTasks"> | ||||
|       <UniqueIdentifier>{b71e974a-9f28-4815-972b-d930ba8a34d0}</UniqueIdentifier> | ||||
|     </Filter> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MSVC-MingW\port.c"> | ||||
|       <Filter>FreeRTOS\Source\Portable</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\timers.c"> | ||||
|       <Filter>FreeRTOS\Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\list.c"> | ||||
|       <Filter>FreeRTOS\Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\queue.c"> | ||||
|       <Filter>FreeRTOS\Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\tasks.c"> | ||||
|       <Filter>FreeRTOS\Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="DemoTasks\SimpleUDPClientAndServer.c"> | ||||
|       <Filter>DemoTasks</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_UDP_IP.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_DHCP.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_DNS.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_Sockets.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\portable\BufferManagement\BufferAllocation_2.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP\portable</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\portable\NetworkInterface\WinPCap\NetworkInterface.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP\portable</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_ARP.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_IP.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_TCP_IP.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_TCP_WIN.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\event_groups.c"> | ||||
|       <Filter>FreeRTOS\Source</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\..\FreeRTOS\Source\portable\MemMang\heap_4.c"> | ||||
|       <Filter>FreeRTOS\Source\Portable</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="main.c" /> | ||||
|     <ClCompile Include="DemoTasks\TCPEchoClient_SingleTasks.c"> | ||||
|       <Filter>DemoTasks</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\..\Source\FreeRTOS-Plus-TCP\FreeRTOS_Stream_Buffer.c"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="demo_logging.c" /> | ||||
|     <ClCompile Include="DemoTasks\SimpleTCPEchoServer.c"> | ||||
|       <Filter>DemoTasks</Filter> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\NetworkInterface.h"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_DNS.h"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_Sockets.h"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_UDP_IP.h"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\timers.h"> | ||||
|       <Filter>FreeRTOS\Source\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\event_groups.h"> | ||||
|       <Filter>FreeRTOS\Source\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\FreeRTOS.h"> | ||||
|       <Filter>FreeRTOS\Source\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\queue.h"> | ||||
|       <Filter>FreeRTOS\Source\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\semphr.h"> | ||||
|       <Filter>FreeRTOS\Source\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\task.h"> | ||||
|       <Filter>FreeRTOS\Source\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\portable\MSVC-MingW\portmacro.h"> | ||||
|       <Filter>FreeRTOS\Source\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_IP_Private.h"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\NetworkBufferManagement.h"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_ARP.h"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_DHCP.h"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_IP.h"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_TCP_IP.h"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_TCP_WIN.h"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOSIPConfigDefaults.h"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\IPTraceMacroDefaults.h"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="FreeRTOSConfig.h" /> | ||||
|     <ClInclude Include="FreeRTOSIPConfig.h" /> | ||||
|     <ClInclude Include="..\..\Source\FreeRTOS-Plus-TCP\include\FreeRTOS_Stream_Buffer.h"> | ||||
|       <Filter>FreeRTOS+\FreeRTOS+TCP\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\portable.h"> | ||||
|       <Filter>FreeRTOS\Source\include</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\..\..\FreeRTOS\Source\include\projdefs.h"> | ||||
|       <Filter>FreeRTOS\Source\include</Filter> | ||||
|     </ClInclude> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @@ -0,0 +1,359 @@ | ||||
| /* | ||||
|  * Copyright (c) 1999 - 2005 NetGroup, Politecnico di Torino (Italy) | ||||
|  * Copyright (c) 2005 - 2007 CACE Technologies, Davis (California) | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  * notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  * notice, this list of conditions and the following disclaimer in the | ||||
|  * documentation and/or other materials provided with the distribution. | ||||
|  * 3. Neither the name of the Politecnico di Torino, CACE Technologies  | ||||
|  * nor the names of its contributors may be used to endorse or promote  | ||||
|  * products derived from this software without specific prior written  | ||||
|  * permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
|  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
|  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
|  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
|  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
|  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
|  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
|  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
|  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
|  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /** @ingroup packetapi | ||||
|  *  @{  | ||||
|  */ | ||||
|  | ||||
| /** @defgroup packet32h Packet.dll definitions and data structures | ||||
|  *  Packet32.h contains the data structures and the definitions used by packet.dll. | ||||
|  *  The file is used both by the Win9x and the WinNTx versions of packet.dll, and can be included | ||||
|  *  by the applications that use the functions of this library | ||||
|  *  @{ | ||||
|  */ | ||||
|  | ||||
| #ifndef __PACKET32 | ||||
| #define __PACKET32 | ||||
|  | ||||
| #include <winsock2.h> | ||||
|  | ||||
| #ifdef HAVE_AIRPCAP_API | ||||
| #include <airpcap.h> | ||||
| #else | ||||
| #if !defined(AIRPCAP_HANDLE__EAE405F5_0171_9592_B3C2_C19EC426AD34__DEFINED_) | ||||
| #define AIRPCAP_HANDLE__EAE405F5_0171_9592_B3C2_C19EC426AD34__DEFINED_ | ||||
| typedef struct _AirpcapHandle *PAirpcapHandle; | ||||
| #endif /* AIRPCAP_HANDLE__EAE405F5_0171_9592_B3C2_C19EC426AD34__DEFINED_ */ | ||||
| #endif /* HAVE_AIRPCAP_API */ | ||||
|  | ||||
| #ifdef HAVE_DAG_API | ||||
| #include <dagc.h> | ||||
| #endif /* HAVE_DAG_API */ | ||||
|  | ||||
| // Working modes | ||||
| #define PACKET_MODE_CAPT 0x0 ///< Capture mode | ||||
| #define PACKET_MODE_STAT 0x1 ///< Statistical mode | ||||
| #define PACKET_MODE_MON 0x2 ///< Monitoring mode | ||||
| #define PACKET_MODE_DUMP 0x10 ///< Dump mode | ||||
| #define PACKET_MODE_STAT_DUMP MODE_DUMP | MODE_STAT ///< Statistical dump Mode | ||||
|  | ||||
|  | ||||
| /// Alignment macro. Defines the alignment size. | ||||
| #define Packet_ALIGNMENT sizeof(int) | ||||
| /// Alignment macro. Rounds up to the next even multiple of Packet_ALIGNMENT.  | ||||
| #define Packet_WORDALIGN(x) (((x)+(Packet_ALIGNMENT-1))&~(Packet_ALIGNMENT-1)) | ||||
|  | ||||
| #define NdisMediumNull	-1		///< Custom linktype: NDIS doesn't provide an equivalent | ||||
| #define NdisMediumCHDLC	-2		///< Custom linktype: NDIS doesn't provide an equivalent | ||||
| #define NdisMediumPPPSerial	-3	///< Custom linktype: NDIS doesn't provide an equivalent | ||||
| #define NdisMediumBare80211	-4	///< Custom linktype: NDIS doesn't provide an equivalent | ||||
| #define NdisMediumRadio80211	-5	///< Custom linktype: NDIS doesn't provide an equivalent | ||||
| #define NdisMediumPpi		-6	///< Custom linktype: NDIS doesn't provide an equivalent | ||||
|  | ||||
| // Loopback behaviour definitions | ||||
| #define NPF_DISABLE_LOOPBACK	1	///< Drop the packets sent by the NPF driver | ||||
| #define NPF_ENABLE_LOOPBACK		2	///< Capture the packets sent by the NPF driver | ||||
|  | ||||
| /*! | ||||
|   \brief Network type structure. | ||||
|  | ||||
|   This structure is used by the PacketGetNetType() function to return information on the current adapter's type and speed. | ||||
| */ | ||||
| typedef struct NetType | ||||
| { | ||||
| 	UINT LinkType;	///< The MAC of the current network adapter (see function PacketGetNetType() for more information) | ||||
| 	ULONGLONG LinkSpeed;	///< The speed of the network in bits per second | ||||
| }NetType; | ||||
|  | ||||
|  | ||||
| //some definitions stolen from libpcap | ||||
|  | ||||
| #ifndef BPF_MAJOR_VERSION | ||||
|  | ||||
| /*! | ||||
|   \brief A BPF pseudo-assembly program. | ||||
|  | ||||
|   The program will be injected in the kernel by the PacketSetBPF() function and applied to every incoming packet.  | ||||
| */ | ||||
| struct bpf_program  | ||||
| { | ||||
| 	UINT bf_len;				///< Indicates the number of instructions of the program, i.e. the number of struct bpf_insn that will follow. | ||||
| 	struct bpf_insn *bf_insns;	///< A pointer to the first instruction of the program. | ||||
| }; | ||||
|  | ||||
| /*! | ||||
|   \brief A single BPF pseudo-instruction. | ||||
|  | ||||
|   bpf_insn contains a single instruction for the BPF register-machine. It is used to send a filter program to the driver. | ||||
| */ | ||||
| struct bpf_insn  | ||||
| { | ||||
| 	USHORT	code;		///< Instruction type and addressing mode. | ||||
| 	UCHAR 	jt;			///< Jump if true | ||||
| 	UCHAR 	jf;			///< Jump if false | ||||
| 	int k;				///< Generic field used for various purposes. | ||||
| }; | ||||
|  | ||||
| /*! | ||||
|   \brief Structure that contains a couple of statistics values on the current capture. | ||||
|  | ||||
|   It is used by packet.dll to return statistics about a capture session. | ||||
| */ | ||||
| struct bpf_stat  | ||||
| { | ||||
| 	UINT bs_recv;		///< Number of packets that the driver received from the network adapter  | ||||
| 						///< from the beginning of the current capture. This value includes the packets  | ||||
| 						///< lost by the driver. | ||||
| 	UINT bs_drop;		///< number of packets that the driver lost from the beginning of a capture.  | ||||
| 						///< Basically, a packet is lost when the the buffer of the driver is full.  | ||||
| 						///< In this situation the packet cannot be stored and the driver rejects it. | ||||
| 	UINT ps_ifdrop;		///< drops by interface. XXX not yet supported | ||||
| 	UINT bs_capt;		///< number of packets that pass the filter, find place in the kernel buffer and | ||||
| 						///< thus reach the application. | ||||
| }; | ||||
|  | ||||
| /*! | ||||
|   \brief Packet header. | ||||
|  | ||||
|   This structure defines the header associated with every packet delivered to the application. | ||||
| */ | ||||
| struct bpf_hdr  | ||||
| { | ||||
| 	struct timeval	bh_tstamp;	///< The timestamp associated with the captured packet.  | ||||
| 								///< It is stored in a TimeVal structure. | ||||
| 	UINT	bh_caplen;			///< Length of captured portion. The captured portion <b>can be different</b> | ||||
| 								///< from the original packet, because it is possible (with a proper filter) | ||||
| 								///< to instruct the driver to capture only a portion of the packets. | ||||
| 	UINT	bh_datalen;			///< Original length of packet | ||||
| 	USHORT		bh_hdrlen;		///< Length of bpf header (this struct plus alignment padding). In some cases, | ||||
| 								///< a padding could be added between the end of this structure and the packet | ||||
| 								///< data for performance reasons. This filed can be used to retrieve the actual data  | ||||
| 								///< of the packet. | ||||
| }; | ||||
|  | ||||
| /*! | ||||
|   \brief Dump packet header. | ||||
|  | ||||
|   This structure defines the header associated with the packets in a buffer to be used with PacketSendPackets(). | ||||
|   It is simpler than the bpf_hdr, because it corresponds to the header associated by WinPcap and libpcap to a | ||||
|   packet in a dump file. This makes straightforward sending WinPcap dump files to the network. | ||||
| */ | ||||
| struct dump_bpf_hdr{ | ||||
|     struct timeval	ts;			///< Time stamp of the packet | ||||
|     UINT			caplen;		///< Length of captured portion. The captured portion can smaller than the  | ||||
| 								///< the original packet, because it is possible (with a proper filter) to  | ||||
| 								///< instruct the driver to capture only a portion of the packets.  | ||||
|     UINT			len;		///< Length of the original packet (off wire). | ||||
| }; | ||||
|  | ||||
|  | ||||
| #endif | ||||
|  | ||||
| struct bpf_stat; | ||||
|  | ||||
| #define        DOSNAMEPREFIX   TEXT("Packet_")	///< Prefix added to the adapters device names to create the WinPcap devices | ||||
| #define        MAX_LINK_NAME_LENGTH	64			//< Maximum length of the devices symbolic links | ||||
| #define        NMAX_PACKET 65535 | ||||
|  | ||||
| /*! | ||||
|   \brief Addresses of a network adapter. | ||||
|  | ||||
|   This structure is used by the PacketGetNetInfoEx() function to return the IP addresses associated with  | ||||
|   an adapter. | ||||
| */ | ||||
| typedef struct npf_if_addr { | ||||
| 	struct sockaddr_storage IPAddress;	///< IP address. | ||||
| 	struct sockaddr_storage SubnetMask;	///< Netmask for that address. | ||||
| 	struct sockaddr_storage Broadcast;	///< Broadcast address. | ||||
| }npf_if_addr; | ||||
|  | ||||
|  | ||||
| #define ADAPTER_NAME_LENGTH 256 + 12	///<  Maximum length for the name of an adapter. The value is the same used by the IP Helper API. | ||||
| #define ADAPTER_DESC_LENGTH 128			///<  Maximum length for the description of an adapter. The value is the same used by the IP Helper API. | ||||
| #define MAX_MAC_ADDR_LENGTH 8			///<  Maximum length for the link layer address of an adapter. The value is the same used by the IP Helper API. | ||||
| #define MAX_NETWORK_ADDRESSES 16		///<  Maximum length for the link layer address of an adapter. The value is the same used by the IP Helper API. | ||||
|  | ||||
|  | ||||
| typedef struct WAN_ADAPTER_INT WAN_ADAPTER; ///< Describes an opened wan (dialup, VPN...) network adapter using the NetMon API | ||||
| typedef WAN_ADAPTER *PWAN_ADAPTER; ///< Describes an opened wan (dialup, VPN...) network adapter using the NetMon API | ||||
|  | ||||
| #define INFO_FLAG_NDIS_ADAPTER		0	///< Flag for ADAPTER_INFO: this is a traditional ndis adapter | ||||
| #define INFO_FLAG_NDISWAN_ADAPTER	1	///< Flag for ADAPTER_INFO: this is a NdisWan adapter, and it's managed by WANPACKET | ||||
| #define INFO_FLAG_DAG_CARD			2	///< Flag for ADAPTER_INFO: this is a DAG card | ||||
| #define INFO_FLAG_DAG_FILE			6	///< Flag for ADAPTER_INFO: this is a DAG file | ||||
| #define INFO_FLAG_DONT_EXPORT		8	///< Flag for ADAPTER_INFO: when this flag is set, the adapter will not be listed or openend by winpcap. This allows to prevent exporting broken network adapters, like for example FireWire ones. | ||||
| #define INFO_FLAG_AIRPCAP_CARD		16	///< Flag for ADAPTER_INFO: this is an airpcap card | ||||
| #define INFO_FLAG_NPFIM_DEVICE		32 | ||||
|  | ||||
| /*! | ||||
|   \brief Describes an opened network adapter. | ||||
|  | ||||
|   This structure is the most important for the functioning of packet.dll, but the great part of its fields | ||||
|   should be ignored by the user, since the library offers functions that avoid to cope with low-level parameters | ||||
| */ | ||||
| typedef struct _ADAPTER  {  | ||||
| 	HANDLE hFile;				///< \internal Handle to an open instance of the NPF driver. | ||||
| 	CHAR  SymbolicLink[MAX_LINK_NAME_LENGTH]; ///< \internal A string containing the name of the network adapter currently opened. | ||||
| 	int NumWrites;				///< \internal Number of times a packets written on this adapter will be repeated  | ||||
| 								///< on the wire. | ||||
| 	HANDLE ReadEvent;			///< A notification event associated with the read calls on the adapter. | ||||
| 								///< It can be passed to standard Win32 functions (like WaitForSingleObject | ||||
| 								///< or WaitForMultipleObjects) to wait until the driver's buffer contains some  | ||||
| 								///< data. It is particularly useful in GUI applications that need to wait  | ||||
| 								///< concurrently on several events. In Windows NT/2000 the PacketSetMinToCopy() | ||||
| 								///< function can be used to define the minimum amount of data in the kernel buffer | ||||
| 								///< that will cause the event to be signalled.  | ||||
| 	 | ||||
| 	UINT ReadTimeOut;			///< \internal The amount of time after which a read on the driver will be released and  | ||||
| 								///< ReadEvent will be signaled, also if no packets were captured | ||||
| 	CHAR Name[ADAPTER_NAME_LENGTH]; | ||||
| 	PWAN_ADAPTER pWanAdapter; | ||||
| 	UINT Flags;					///< Adapter's flags. Tell if this adapter must be treated in a different way, using the Netmon API or the dagc API. | ||||
|  | ||||
| #ifdef HAVE_AIRPCAP_API | ||||
| 	PAirpcapHandle	AirpcapAd; | ||||
| #endif // HAVE_AIRPCAP_API | ||||
|  | ||||
| #ifdef HAVE_NPFIM_API | ||||
| 	void* NpfImHandle; | ||||
| #endif // HAVE_NPFIM_API | ||||
|  | ||||
| #ifdef HAVE_DAG_API | ||||
| 	dagc_t *pDagCard;			///< Pointer to the dagc API adapter descriptor for this adapter | ||||
| 	PCHAR DagBuffer;			///< Pointer to the buffer with the packets that is received from the DAG card | ||||
| 	struct timeval DagReadTimeout;	///< Read timeout. The dagc API requires a timeval structure | ||||
| 	unsigned DagFcsLen;			///< Length of the frame check sequence attached to any packet by the card. Obtained from the registry | ||||
| 	DWORD DagFastProcess;		///< True if the user requests fast capture processing on this card. Higher level applications can use this value to provide a faster but possibly unprecise capture (for example, libpcap doesn't convert the timestamps). | ||||
| #endif // HAVE_DAG_API | ||||
| }  ADAPTER, *LPADAPTER; | ||||
|  | ||||
| /*! | ||||
|   \brief Structure that contains a group of packets coming from the driver. | ||||
|  | ||||
|   This structure defines the header associated with every packet delivered to the application. | ||||
| */ | ||||
| typedef struct _PACKET {   | ||||
| 	HANDLE       hEvent;		///< \deprecated Still present for compatibility with old applications. | ||||
| 	OVERLAPPED   OverLapped;	///< \deprecated Still present for compatibility with old applications. | ||||
| 	PVOID        Buffer;		///< Buffer with containing the packets. See the PacketReceivePacket() for | ||||
| 								///< details about the organization of the data in this buffer | ||||
| 	UINT         Length;		///< Length of the buffer | ||||
| 	DWORD        ulBytesReceived;	///< Number of valid bytes present in the buffer, i.e. amount of data | ||||
| 									///< received by the last call to PacketReceivePacket() | ||||
| 	BOOLEAN      bIoComplete;	///< \deprecated Still present for compatibility with old applications. | ||||
| }  PACKET, *LPPACKET; | ||||
|  | ||||
| /*! | ||||
|   \brief Structure containing an OID request. | ||||
|  | ||||
|   It is used by the PacketRequest() function to send an OID to the interface card driver.  | ||||
|   It can be used, for example, to retrieve the status of the error counters on the adapter, its MAC address,  | ||||
|   the list of the multicast groups defined on it, and so on. | ||||
| */ | ||||
| struct _PACKET_OID_DATA { | ||||
|     ULONG Oid;					///< OID code. See the Microsoft DDK documentation or the file ntddndis.h | ||||
| 								///< for a complete list of valid codes. | ||||
|     ULONG Length;				///< Length of the data field | ||||
|     UCHAR Data[1];				///< variable-lenght field that contains the information passed to or received  | ||||
| 								///< from the adapter. | ||||
| };  | ||||
| typedef struct _PACKET_OID_DATA PACKET_OID_DATA, *PPACKET_OID_DATA; | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|  *  @} | ||||
|  */ | ||||
|  | ||||
| /* | ||||
| BOOLEAN QueryWinPcapRegistryStringA(CHAR *SubKeyName, | ||||
| 								 CHAR *Value, | ||||
| 								 UINT *pValueLen, | ||||
| 								 CHAR *DefaultVal); | ||||
|  | ||||
| BOOLEAN QueryWinPcapRegistryStringW(WCHAR *SubKeyName, | ||||
| 								 WCHAR *Value, | ||||
| 								 UINT *pValueLen, | ||||
| 								 WCHAR *DefaultVal); | ||||
| */ | ||||
| 								  | ||||
| //--------------------------------------------------------------------------- | ||||
| // EXPORTED FUNCTIONS | ||||
| //--------------------------------------------------------------------------- | ||||
|  | ||||
| PCHAR PacketGetVersion(); | ||||
| PCHAR PacketGetDriverVersion(); | ||||
| BOOLEAN PacketSetMinToCopy(LPADAPTER AdapterObject,int nbytes); | ||||
| BOOLEAN PacketSetNumWrites(LPADAPTER AdapterObject,int nwrites); | ||||
| BOOLEAN PacketSetMode(LPADAPTER AdapterObject,int mode); | ||||
| BOOLEAN PacketSetReadTimeout(LPADAPTER AdapterObject,int timeout); | ||||
| BOOLEAN PacketSetBpf(LPADAPTER AdapterObject,struct bpf_program *fp); | ||||
| BOOLEAN PacketSetLoopbackBehavior(LPADAPTER  AdapterObject, UINT LoopbackBehavior); | ||||
| INT PacketSetSnapLen(LPADAPTER AdapterObject,int snaplen); | ||||
| BOOLEAN PacketGetStats(LPADAPTER AdapterObject,struct bpf_stat *s); | ||||
| BOOLEAN PacketGetStatsEx(LPADAPTER AdapterObject,struct bpf_stat *s); | ||||
| BOOLEAN PacketSetBuff(LPADAPTER AdapterObject,int dim); | ||||
| BOOLEAN PacketGetNetType (LPADAPTER AdapterObject,NetType *type); | ||||
| LPADAPTER PacketOpenAdapter(PCHAR AdapterName); | ||||
| BOOLEAN PacketSendPacket(LPADAPTER AdapterObject,LPPACKET pPacket,BOOLEAN Sync); | ||||
| INT PacketSendPackets(LPADAPTER AdapterObject,PVOID PacketBuff,ULONG Size, BOOLEAN Sync); | ||||
| LPPACKET PacketAllocatePacket(void); | ||||
| VOID PacketInitPacket(LPPACKET lpPacket,PVOID  Buffer,UINT  Length); | ||||
| VOID PacketFreePacket(LPPACKET lpPacket); | ||||
| BOOLEAN PacketReceivePacket(LPADAPTER AdapterObject,LPPACKET lpPacket,BOOLEAN Sync); | ||||
| BOOLEAN PacketSetHwFilter(LPADAPTER AdapterObject,ULONG Filter); | ||||
| BOOLEAN PacketGetAdapterNames(PTSTR pStr,PULONG  BufferSize); | ||||
| BOOLEAN PacketGetNetInfoEx(PCHAR AdapterName, npf_if_addr* buffer, PLONG NEntries); | ||||
| BOOLEAN PacketRequest(LPADAPTER  AdapterObject,BOOLEAN Set,PPACKET_OID_DATA  OidData); | ||||
| HANDLE PacketGetReadEvent(LPADAPTER AdapterObject); | ||||
| BOOLEAN PacketSetDumpName(LPADAPTER AdapterObject, void *name, int len); | ||||
| BOOLEAN PacketSetDumpLimits(LPADAPTER AdapterObject, UINT maxfilesize, UINT maxnpacks); | ||||
| BOOLEAN PacketIsDumpEnded(LPADAPTER AdapterObject, BOOLEAN sync); | ||||
| BOOL PacketStopDriver(); | ||||
| VOID PacketCloseAdapter(LPADAPTER lpAdapter); | ||||
| BOOLEAN PacketStartOem(PCHAR errorString, UINT errorStringLength); | ||||
| BOOLEAN PacketStartOemEx(PCHAR errorString, UINT errorStringLength, ULONG flags); | ||||
| PAirpcapHandle PacketGetAirPcapHandle(LPADAPTER AdapterObject); | ||||
|  | ||||
| // | ||||
| // Used by PacketStartOemEx | ||||
| // | ||||
| #define PACKET_START_OEM_NO_NETMON	0x00000001 | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif  | ||||
|  | ||||
| #endif //__PACKET32 | ||||
| @@ -0,0 +1,267 @@ | ||||
| char pkt1[] = { | ||||
| 0x00, 0x01, 0x02, 0x45, 0x09, 0x11, 0x00, 0x14, | ||||
| 0x22, 0xcb, 0x18, 0x2d, 0x08, 0x00, 0x45, 0x00, | ||||
| 0x00, 0x30, 0x09, 0x9c, 0x40, 0x00, 0x80, 0x06, | ||||
| 0x6f, 0x07, 0xc0, 0xa8, 0x00, 0xc8, 0xc0, 0xa8, | ||||
| 0x00, 0x0c, 0x0f, 0xe2, 0x00, 0x50, 0x09, 0xe7, | ||||
| 0xc7, 0x35, 0x00, 0x00, 0x00, 0x00, 0x70, 0x02, | ||||
| 0x40, 0x00, 0xdf, 0xab, 0x00, 0x00, 0x02, 0x04, | ||||
| 0x05, 0xb4, 0x01, 0x01, 0x04, 0x02 }; | ||||
|  | ||||
| char pkt2[] = { | ||||
| 0x00, 0x14, 0x22, 0xcb, 0x18, 0x2d, 0x00, 0x01, | ||||
| 0x02, 0x45, 0x09, 0x11, 0x08, 0x00, 0x45, 0x00, | ||||
| 0x00, 0x2c, 0x00, 0x01, 0x00, 0x00, 0x40, 0x06, | ||||
| 0xf8, 0xa6, 0xc0, 0xa8, 0x00, 0x0c, 0xc0, 0xa8, | ||||
| 0x00, 0xc8, 0x00, 0x50, 0x0f, 0xe2, 0x00, 0x00, | ||||
| 0x06, 0x68, 0x09, 0xe7, 0xc7, 0x36, 0x60, 0x12, | ||||
| 0x05, 0x92, 0x28, 0xca, 0x00, 0x00, 0x02, 0x04, | ||||
| 0x05, 0x92 }; | ||||
|  | ||||
| char pkt3[] = { | ||||
| 0x00, 0x01, 0x02, 0x45, 0x09, 0x11, 0x00, 0x14, | ||||
| 0x22, 0xcb, 0x18, 0x2d, 0x08, 0x00, 0x45, 0x00, | ||||
| 0x00, 0x28, 0x09, 0x9e, 0x40, 0x00, 0x80, 0x06, | ||||
| 0x6f, 0x0d, 0xc0, 0xa8, 0x00, 0xc8, 0xc0, 0xa8, | ||||
| 0x00, 0x0c, 0x0f, 0xe2, 0x00, 0x50, 0x09, 0xe7, | ||||
| 0xc7, 0x36, 0x00, 0x00, 0x06, 0x69, 0x50, 0x10, | ||||
| 0x42, 0xd8, 0x82, 0x3f, 0x00, 0x00 }; | ||||
|  | ||||
| char pkt4[] = { | ||||
| 0x00, 0x01, 0x02, 0x45, 0x09, 0x11, 0x00, 0x14, | ||||
| 0x22, 0xcb, 0x18, 0x2d, 0x08, 0x00, 0x45, 0x00, | ||||
| 0x02, 0x27, 0x09, 0x9f, 0x40, 0x00, 0x80, 0x06, | ||||
| 0x6d, 0x0d, 0xc0, 0xa8, 0x00, 0xc8, 0xc0, 0xa8, | ||||
| 0x00, 0x0c, 0x0f, 0xe2, 0x00, 0x50, 0x09, 0xe7, | ||||
| 0xc7, 0x36, 0x00, 0x00, 0x06, 0x69, 0x50, 0x18, | ||||
| 0x42, 0xd8, 0x84, 0x3e, 0x00, 0x00, 0x47, 0x45, | ||||
| 0x54, 0x20, 0x2f, 0x20, 0x48, 0x54, 0x54, 0x50, | ||||
| 0x2f, 0x31, 0x2e, 0x31, 0x0d, 0x0a, 0x41, 0x63, | ||||
| 0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x69, 0x6d, | ||||
| 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0x2c, | ||||
| 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x78, | ||||
| 0x2d, 0x78, 0x62, 0x69, 0x74, 0x6d, 0x61, 0x70, | ||||
| 0x2c, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, | ||||
| 0x6a, 0x70, 0x65, 0x67, 0x2c, 0x20, 0x69, 0x6d, | ||||
| 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6a, 0x70, 0x65, | ||||
| 0x67, 0x2c, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, | ||||
| 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, | ||||
| 0x6e, 0x64, 0x2e, 0x6d, 0x73, 0x2d, 0x65, 0x78, | ||||
| 0x63, 0x65, 0x6c, 0x2c, 0x20, 0x61, 0x70, 0x70, | ||||
| 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, | ||||
| 0x2f, 0x6d, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2c, | ||||
| 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, | ||||
| 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x6e, 0x64, | ||||
| 0x2e, 0x6d, 0x73, 0x2d, 0x70, 0x6f, 0x77, 0x65, | ||||
| 0x72, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2c, 0x20, | ||||
| 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, | ||||
| 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x2d, 0x6d, 0x73, | ||||
| 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, | ||||
| 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x70, | ||||
| 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, | ||||
| 0x6e, 0x2f, 0x78, 0x2d, 0x6d, 0x73, 0x2d, 0x78, | ||||
| 0x62, 0x61, 0x70, 0x2c, 0x20, 0x61, 0x70, 0x70, | ||||
| 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, | ||||
| 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x6d, 0x73, 0x2d, | ||||
| 0x78, 0x70, 0x73, 0x64, 0x6f, 0x63, 0x75, 0x6d, | ||||
| 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x61, 0x70, 0x70, | ||||
| 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, | ||||
| 0x2f, 0x78, 0x61, 0x6d, 0x6c, 0x2b, 0x78, 0x6d, | ||||
| 0x6c, 0x2c, 0x20, 0x2a, 0x2f, 0x2a, 0x0d, 0x0a, | ||||
| 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x4c, | ||||
| 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a, | ||||
| 0x20, 0x65, 0x6e, 0x2d, 0x67, 0x62, 0x0d, 0x0a, | ||||
| 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x45, | ||||
| 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3a, | ||||
| 0x20, 0x67, 0x7a, 0x69, 0x70, 0x2c, 0x20, 0x64, | ||||
| 0x65, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x0d, 0x0a, | ||||
| 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, 0x67, 0x65, | ||||
| 0x6e, 0x74, 0x3a, 0x20, 0x4d, 0x6f, 0x7a, 0x69, | ||||
| 0x6c, 0x6c, 0x61, 0x2f, 0x34, 0x2e, 0x30, 0x20, | ||||
| 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, | ||||
| 0x62, 0x6c, 0x65, 0x3b, 0x20, 0x4d, 0x53, 0x49, | ||||
| 0x45, 0x20, 0x36, 0x2e, 0x30, 0x3b, 0x20, 0x57, | ||||
| 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x20, 0x4e, | ||||
| 0x54, 0x20, 0x35, 0x2e, 0x31, 0x3b, 0x20, 0x53, | ||||
| 0x56, 0x31, 0x3b, 0x20, 0x47, 0x6f, 0x6f, 0x67, | ||||
| 0x6c, 0x65, 0x54, 0x35, 0x3b, 0x20, 0x2e, 0x4e, | ||||
| 0x45, 0x54, 0x20, 0x43, 0x4c, 0x52, 0x20, 0x32, | ||||
| 0x2e, 0x30, 0x2e, 0x35, 0x30, 0x37, 0x32, 0x37, | ||||
| 0x3b, 0x20, 0x2e, 0x4e, 0x45, 0x54, 0x20, 0x43, | ||||
| 0x4c, 0x52, 0x20, 0x33, 0x2e, 0x30, 0x2e, 0x30, | ||||
| 0x34, 0x35, 0x30, 0x36, 0x2e, 0x36, 0x34, 0x38, | ||||
| 0x3b, 0x20, 0x2e, 0x4e, 0x45, 0x54, 0x20, 0x43, | ||||
| 0x4c, 0x52, 0x20, 0x33, 0x2e, 0x35, 0x2e, 0x32, | ||||
| 0x31, 0x30, 0x32, 0x32, 0x29, 0x0d, 0x0a, 0x48, | ||||
| 0x6f, 0x73, 0x74, 0x3a, 0x20, 0x31, 0x39, 0x32, | ||||
| 0x2e, 0x31, 0x36, 0x38, 0x2e, 0x30, 0x2e, 0x31, | ||||
| 0x32, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x6e, 0x65, | ||||
| 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x4b, | ||||
| 0x65, 0x65, 0x70, 0x2d, 0x41, 0x6c, 0x69, 0x76, | ||||
| 0x65, 0x0d, 0x0a, 0x0d, 0x0a }; | ||||
|  | ||||
| char pkt5[] = { | ||||
| 0x00, 0x14, 0x22, 0xcb, 0x18, 0x2d, 0x00, 0x01, | ||||
| 0x02, 0x45, 0x09, 0x11, 0x08, 0x00, 0x45, 0x00, | ||||
| 0x00, 0x2c, 0x00, 0x02, 0x00, 0x00, 0x40, 0x06, | ||||
| 0xf8, 0xa5, 0xc0, 0xa8, 0x00, 0x0c, 0xc0, 0xa8, | ||||
| 0x00, 0xc8, 0x00, 0x50, 0x0f, 0xe2, 0x00, 0x00, | ||||
| 0x06, 0x68, 0x09, 0xe7, 0xc7, 0x36, 0x60, 0x12, | ||||
| 0x05, 0x92, 0x28, 0xca, 0x00, 0x00, 0x02, 0x04, | ||||
| 0x05, 0x92 }; | ||||
|  | ||||
| char pkt6[] = { | ||||
| 0x00, 0x01, 0x02, 0x45, 0x09, 0x11, 0x00, 0x14, | ||||
| 0x22, 0xcb, 0x18, 0x2d, 0x08, 0x00, 0x45, 0x00, | ||||
| 0x00, 0x28, 0x09, 0xa1, 0x40, 0x00, 0x80, 0x06, | ||||
| 0x6f, 0x0a, 0xc0, 0xa8, 0x00, 0xc8, 0xc0, 0xa8, | ||||
| 0x00, 0x0c, 0x0f, 0xe2, 0x00, 0x50, 0x09, 0xe7, | ||||
| 0xc9, 0x35, 0x00, 0x00, 0x06, 0x69, 0x50, 0x10, | ||||
| 0x42, 0xd8, 0x82, 0x3f, 0x00, 0x00 }; | ||||
|  | ||||
| char pkt7[] = { | ||||
| 0x00, 0x01, 0x02, 0x45, 0x09, 0x11, 0x00, 0x14, | ||||
| 0x22, 0xcb, 0x18, 0x2d, 0x08, 0x00, 0x45, 0x00, | ||||
| 0x02, 0x27, 0x09, 0xa2, 0x40, 0x00, 0x80, 0x06, | ||||
| 0x6d, 0x0a, 0xc0, 0xa8, 0x00, 0xc8, 0xc0, 0xa8, | ||||
| 0x00, 0x0c, 0x0f, 0xe2, 0x00, 0x50, 0x09, 0xe7, | ||||
| 0xc7, 0x36, 0x00, 0x00, 0x06, 0x69, 0x50, 0x18, | ||||
| 0x42, 0xd8, 0x84, 0x3e, 0x00, 0x00, 0x47, 0x45, | ||||
| 0x54, 0x20, 0x2f, 0x20, 0x48, 0x54, 0x54, 0x50, | ||||
| 0x2f, 0x31, 0x2e, 0x31, 0x0d, 0x0a, 0x41, 0x63, | ||||
| 0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x69, 0x6d, | ||||
| 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0x2c, | ||||
| 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x78, | ||||
| 0x2d, 0x78, 0x62, 0x69, 0x74, 0x6d, 0x61, 0x70, | ||||
| 0x2c, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, | ||||
| 0x6a, 0x70, 0x65, 0x67, 0x2c, 0x20, 0x69, 0x6d, | ||||
| 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6a, 0x70, 0x65, | ||||
| 0x67, 0x2c, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, | ||||
| 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, | ||||
| 0x6e, 0x64, 0x2e, 0x6d, 0x73, 0x2d, 0x65, 0x78, | ||||
| 0x63, 0x65, 0x6c, 0x2c, 0x20, 0x61, 0x70, 0x70, | ||||
| 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, | ||||
| 0x2f, 0x6d, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2c, | ||||
| 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, | ||||
| 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x6e, 0x64, | ||||
| 0x2e, 0x6d, 0x73, 0x2d, 0x70, 0x6f, 0x77, 0x65, | ||||
| 0x72, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2c, 0x20, | ||||
| 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, | ||||
| 0x69, 0x6f, 0x6e, 0x2f, 0x78, 0x2d, 0x6d, 0x73, | ||||
| 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, | ||||
| 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x61, 0x70, | ||||
| 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, | ||||
| 0x6e, 0x2f, 0x78, 0x2d, 0x6d, 0x73, 0x2d, 0x78, | ||||
| 0x62, 0x61, 0x70, 0x2c, 0x20, 0x61, 0x70, 0x70, | ||||
| 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, | ||||
| 0x2f, 0x76, 0x6e, 0x64, 0x2e, 0x6d, 0x73, 0x2d, | ||||
| 0x78, 0x70, 0x73, 0x64, 0x6f, 0x63, 0x75, 0x6d, | ||||
| 0x65, 0x6e, 0x74, 0x2c, 0x20, 0x61, 0x70, 0x70, | ||||
| 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, | ||||
| 0x2f, 0x78, 0x61, 0x6d, 0x6c, 0x2b, 0x78, 0x6d, | ||||
| 0x6c, 0x2c, 0x20, 0x2a, 0x2f, 0x2a, 0x0d, 0x0a, | ||||
| 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x4c, | ||||
| 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a, | ||||
| 0x20, 0x65, 0x6e, 0x2d, 0x67, 0x62, 0x0d, 0x0a, | ||||
| 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x45, | ||||
| 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3a, | ||||
| 0x20, 0x67, 0x7a, 0x69, 0x70, 0x2c, 0x20, 0x64, | ||||
| 0x65, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x0d, 0x0a, | ||||
| 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, 0x67, 0x65, | ||||
| 0x6e, 0x74, 0x3a, 0x20, 0x4d, 0x6f, 0x7a, 0x69, | ||||
| 0x6c, 0x6c, 0x61, 0x2f, 0x34, 0x2e, 0x30, 0x20, | ||||
| 0x28, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, | ||||
| 0x62, 0x6c, 0x65, 0x3b, 0x20, 0x4d, 0x53, 0x49, | ||||
| 0x45, 0x20, 0x36, 0x2e, 0x30, 0x3b, 0x20, 0x57, | ||||
| 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x20, 0x4e, | ||||
| 0x54, 0x20, 0x35, 0x2e, 0x31, 0x3b, 0x20, 0x53, | ||||
| 0x56, 0x31, 0x3b, 0x20, 0x47, 0x6f, 0x6f, 0x67, | ||||
| 0x6c, 0x65, 0x54, 0x35, 0x3b, 0x20, 0x2e, 0x4e, | ||||
| 0x45, 0x54, 0x20, 0x43, 0x4c, 0x52, 0x20, 0x32, | ||||
| 0x2e, 0x30, 0x2e, 0x35, 0x30, 0x37, 0x32, 0x37, | ||||
| 0x3b, 0x20, 0x2e, 0x4e, 0x45, 0x54, 0x20, 0x43, | ||||
| 0x4c, 0x52, 0x20, 0x33, 0x2e, 0x30, 0x2e, 0x30, | ||||
| 0x34, 0x35, 0x30, 0x36, 0x2e, 0x36, 0x34, 0x38, | ||||
| 0x3b, 0x20, 0x2e, 0x4e, 0x45, 0x54, 0x20, 0x43, | ||||
| 0x4c, 0x52, 0x20, 0x33, 0x2e, 0x35, 0x2e, 0x32, | ||||
| 0x31, 0x30, 0x32, 0x32, 0x29, 0x0d, 0x0a, 0x48, | ||||
| 0x6f, 0x73, 0x74, 0x3a, 0x20, 0x31, 0x39, 0x32, | ||||
| 0x2e, 0x31, 0x36, 0x38, 0x2e, 0x30, 0x2e, 0x31, | ||||
| 0x32, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x6e, 0x65, | ||||
| 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x4b, | ||||
| 0x65, 0x65, 0x70, 0x2d, 0x41, 0x6c, 0x69, 0x76, | ||||
| 0x65, 0x0d, 0x0a, 0x0d, 0x0a }; | ||||
|  | ||||
| char pkt8[] = { | ||||
| 0x00, 0x14, 0x22, 0xcb, 0x18, 0x2d, 0x00, 0x01, | ||||
| 0x02, 0x45, 0x09, 0x11, 0x08, 0x00, 0x45, 0x00, | ||||
| 0x00, 0x2c, 0x00, 0x03, 0x00, 0x00, 0x40, 0x06, | ||||
| 0xf8, 0xa4, 0xc0, 0xa8, 0x00, 0x0c, 0xc0, 0xa8, | ||||
| 0x00, 0xc8, 0x00, 0x50, 0x0f, 0xe2, 0x00, 0x00, | ||||
| 0x06, 0x68, 0x09, 0xe7, 0xc7, 0x36, 0x60, 0x12, | ||||
| 0x05, 0x92, 0x28, 0xca, 0x00, 0x00, 0x02, 0x04, | ||||
| 0x05, 0x92 }; | ||||
|  | ||||
| char pkt9[] = { | ||||
| 0x00, 0x01, 0x02, 0x45, 0x09, 0x11, 0x00, 0x14, | ||||
| 0x22, 0xcb, 0x18, 0x2d, 0x08, 0x00, 0x45, 0x00, | ||||
| 0x00, 0x28, 0x09, 0xa3, 0x40, 0x00, 0x80, 0x06, | ||||
| 0x6f, 0x08, 0xc0, 0xa8, 0x00, 0xc8, 0xc0, 0xa8, | ||||
| 0x00, 0x0c, 0x0f, 0xe2, 0x00, 0x50, 0x09, 0xe7, | ||||
| 0xc9, 0x35, 0x00, 0x00, 0x06, 0x69, 0x50, 0x10, | ||||
| 0x42, 0xd8, 0x82, 0x3f, 0x00, 0x00 }; | ||||
|  | ||||
| char pkt10[] = { | ||||
| 0x00, 0x14, 0x22, 0xcb, 0x18, 0x2d, 0x00, 0x01, | ||||
| 0x02, 0x45, 0x09, 0x11, 0x08, 0x00, 0x45, 0x00, | ||||
| 0x00, 0x2c, 0x00, 0x04, 0x00, 0x00, 0x40, 0x06, | ||||
| 0xf8, 0xa3, 0xc0, 0xa8, 0x00, 0x0c, 0xc0, 0xa8, | ||||
| 0x00, 0xc8, 0x00, 0x50, 0x0f, 0xe2, 0x00, 0x00, | ||||
| 0x06, 0x68, 0x09, 0xe7, 0xc7, 0x36, 0x60, 0x12, | ||||
| 0x05, 0x92, 0x28, 0xca, 0x00, 0x00, 0x02, 0x04, | ||||
| 0x05, 0x92 }; | ||||
|  | ||||
| char pkt11[] = { | ||||
| 0x00, 0x01, 0x02, 0x45, 0x09, 0x11, 0x00, 0x14, | ||||
| 0x22, 0xcb, 0x18, 0x2d, 0x08, 0x00, 0x45, 0x00, | ||||
| 0x00, 0x28, 0x09, 0xa6, 0x40, 0x00, 0x80, 0x06, | ||||
| 0x6f, 0x05, 0xc0, 0xa8, 0x00, 0xc8, 0xc0, 0xa8, | ||||
| 0x00, 0x0c, 0x0f, 0xe2, 0x00, 0x50, 0x09, 0xe7, | ||||
| 0xc9, 0x35, 0x00, 0x00, 0x06, 0x69, 0x50, 0x10, | ||||
| 0x42, 0xd8, 0x82, 0x3f, 0x00, 0x00 }; | ||||
|  | ||||
| char pkt12[] = { | ||||
| 0x00, 0x01, 0x02, 0x45, 0x09, 0x11, 0x00, 0x14, | ||||
| 0x22, 0xcb, 0x18, 0x2d, 0x08, 0x00, 0x45, 0x00, | ||||
| 0x00, 0x28, 0x09, 0xa7, 0x40, 0x00, 0x80, 0x06, | ||||
| 0x6f, 0x04, 0xc0, 0xa8, 0x00, 0xc8, 0xc0, 0xa8, | ||||
| 0x00, 0x0c, 0x0f, 0xe2, 0x00, 0x50, 0x09, 0xe7, | ||||
| 0xc9, 0x35, 0x00, 0x00, 0x06, 0x69, 0x50, 0x14, | ||||
| 0x00, 0x00, 0x43, 0xf4, 0x00, 0x00 }; | ||||
|  | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
| 	char *pcData; | ||||
| 	int iDataLen; | ||||
| } xPacketData; | ||||
|  | ||||
| xPacketData xAllPackets[] = | ||||
| { | ||||
| 	{ pkt1, sizeof( pkt1 ) }, | ||||
| //	{ pkt2, sizeof( pkt2 ) }, | ||||
| 	{ pkt3, sizeof( pkt3 ) }, | ||||
| 	{ pkt4, sizeof( pkt4 ) }, | ||||
| //	{ pkt5, sizeof( pkt5 ) }, | ||||
| 	{ pkt6, sizeof( pkt6 ) }, | ||||
| 	{ pkt7, sizeof( pkt7 ) }, | ||||
| 	{ pkt8, sizeof( pkt8 ) }, | ||||
| 	{ pkt9, sizeof( pkt9 ) }, | ||||
| 	{ pkt10, sizeof( pkt10 ) }, | ||||
| //	{ pkt11, sizeof( pkt11 ) }, | ||||
| //	{ pkt12, sizeof( pkt12 ) }, | ||||
| //	{ pkt13, sizeof( pkt13 ) }, | ||||
| //	{ pkt14, sizeof( pkt14 ) }, | ||||
| //	{ pkt15, sizeof( pkt15 ) }, | ||||
| //	{ pkt16, sizeof( pkt16 ) }, | ||||
| }; | ||||
| @@ -0,0 +1,114 @@ | ||||
| /* | ||||
|  * Copyright (c) 1999 - 2005 NetGroup, Politecnico di Torino (Italy) | ||||
|  * Copyright (c) 2005 - 2006 CACE Technologies, Davis (California) | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  * notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  * notice, this list of conditions and the following disclaimer in the | ||||
|  * documentation and/or other materials provided with the distribution. | ||||
|  * 3. Neither the name of the Politecnico di Torino, CACE Technologies  | ||||
|  * nor the names of its contributors may be used to endorse or promote  | ||||
|  * products derived from this software without specific prior written  | ||||
|  * permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
|  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
|  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
|  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
|  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
|  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
|  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
|  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
|  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
|  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef __WIN32_EXTENSIONS_H__ | ||||
| #define __WIN32_EXTENSIONS_H__ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* Definitions */ | ||||
|  | ||||
| /*! | ||||
|   \brief A queue of raw packets that will be sent to the network with pcap_sendqueue_transmit(). | ||||
| */ | ||||
| struct pcap_send_queue | ||||
| { | ||||
| 	u_int maxlen;		///< Maximum size of the the queue, in bytes. This variable contains the size of the buffer field. | ||||
| 	u_int len;			///< Current size of the queue, in bytes. | ||||
| 	char *buffer;		///< Buffer containing the packets to be sent. | ||||
| }; | ||||
|  | ||||
| typedef struct pcap_send_queue pcap_send_queue; | ||||
|  | ||||
| /*! | ||||
|   \brief This typedef is a support for the pcap_get_airpcap_handle() function | ||||
| */ | ||||
| #if !defined(AIRPCAP_HANDLE__EAE405F5_0171_9592_B3C2_C19EC426AD34__DEFINED_) | ||||
| #define AIRPCAP_HANDLE__EAE405F5_0171_9592_B3C2_C19EC426AD34__DEFINED_ | ||||
| typedef struct _AirpcapHandle *PAirpcapHandle; | ||||
| #endif | ||||
|  | ||||
| #define		BPF_MEM_EX_IMM	0xc0 | ||||
| #define		BPF_MEM_EX_IND	0xe0 | ||||
|  | ||||
| /*used for ST*/ | ||||
| #define		BPF_MEM_EX		0xc0 | ||||
| #define		BPF_TME					0x08 | ||||
|  | ||||
| #define		BPF_LOOKUP				0x90    | ||||
| #define		BPF_EXECUTE				0xa0 | ||||
| #define		BPF_INIT				0xb0 | ||||
| #define		BPF_VALIDATE			0xc0 | ||||
| #define		BPF_SET_ACTIVE			0xd0 | ||||
| #define		BPF_RESET				0xe0 | ||||
| #define		BPF_SET_MEMORY			0x80 | ||||
| #define		BPF_GET_REGISTER_VALUE	0x70 | ||||
| #define		BPF_SET_REGISTER_VALUE	0x60 | ||||
| #define		BPF_SET_WORKING			0x50 | ||||
| #define		BPF_SET_ACTIVE_READ		0x40 | ||||
| #define		BPF_SET_AUTODELETION	0x30 | ||||
| #define		BPF_SEPARATION			0xff | ||||
|  | ||||
| /* Prototypes */ | ||||
| pcap_send_queue* pcap_sendqueue_alloc(u_int memsize); | ||||
|  | ||||
| void pcap_sendqueue_destroy(pcap_send_queue* queue); | ||||
|  | ||||
| int pcap_sendqueue_queue(pcap_send_queue* queue, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data); | ||||
|  | ||||
| u_int pcap_sendqueue_transmit(pcap_t *p, pcap_send_queue* queue, int sync); | ||||
|  | ||||
| HANDLE pcap_getevent(pcap_t *p); | ||||
|  | ||||
| struct pcap_stat *pcap_stats_ex(pcap_t *p, int *pcap_stat_size); | ||||
|  | ||||
| int pcap_setuserbuffer(pcap_t *p, int size); | ||||
|  | ||||
| int pcap_live_dump(pcap_t *p, char *filename, int maxsize, int maxpacks); | ||||
|  | ||||
| int pcap_live_dump_ended(pcap_t *p, int sync); | ||||
|  | ||||
| int pcap_offline_filter(struct bpf_program *prog, const struct pcap_pkthdr *header, const u_char *pkt_data); | ||||
|  | ||||
| int pcap_start_oem(char* err_str, int flags); | ||||
|  | ||||
| PAirpcapHandle pcap_get_airpcap_handle(pcap_t *p); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif //__WIN32_EXTENSIONS_H__ | ||||
| @@ -0,0 +1,336 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /* WinPCap includes. */ | ||||
| #include "pcap.h" | ||||
| #include "remote-ext.h" | ||||
|  | ||||
| /* uIP includes. */ | ||||
| #include "net/uip.h" | ||||
| #include "net/uip_arp.h" | ||||
| #include "net/clock-arch.h" | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include "FreeRTOS.h" | ||||
| #include "task.h" | ||||
| #include "queue.h" | ||||
|  | ||||
| /* | ||||
|  * Query the computer the simulation is being executed on to find the network | ||||
|  * interfaces it has installed. | ||||
|  */ | ||||
| static pcap_if_t * prvPrintAvailableNetworkInterfaces( void ); | ||||
|  | ||||
| /* | ||||
|  * Open the network interface.  The number of the interface to be opened is set | ||||
|  * by the configNETWORK_INTERFACE_TO_USE constant in FreeRTOSConfig.h. | ||||
|  */ | ||||
| static void prvOpenSelectedNetworkInterface( pcap_if_t *pxAllNetworkInterfaces ); | ||||
|  | ||||
| /* | ||||
|  * Configure the capture filter to allow blocking reads, and to filter out | ||||
|  * packets that are not of interest to this demo. | ||||
|  */ | ||||
| static void prvConfigureCaptureBehaviour( void ); | ||||
|  | ||||
| pcap_t *pxOpenedInterfaceHandle = NULL; | ||||
| LARGE_INTEGER freq, sys_start_time; | ||||
|  | ||||
| #define archNUM_BUFFERS	5 | ||||
| #define archNUM_BUFFER_POINTERS ( archNUM_BUFFERS - 1 ) | ||||
|  | ||||
| static void prvInterruptSimulator( void *pvParameters ); | ||||
|  | ||||
| static unsigned char ucEthernetBuffer[ archNUM_BUFFERS ][ UIP_CONF_BUFFER_SIZE ]; | ||||
| static unsigned char *pucEthernetBufferPointers[ archNUM_BUFFER_POINTERS ]; | ||||
|  | ||||
| static long lLengthOfDataInBuffer[ archNUM_BUFFER_POINTERS ] = { 0 }; | ||||
| static unsigned char ucNextBufferToFill = 0U, ucNextBufferToProcess = 0U; | ||||
|  | ||||
| unsigned char *uip_buf = NULL; | ||||
| char cErrorBuffer[PCAP_ERRBUF_SIZE]; | ||||
|  | ||||
| void vNetifTx( void ) | ||||
| { | ||||
| 	pcap_sendpacket( pxOpenedInterfaceHandle, uip_buf, uip_len ); | ||||
| 	pcap_sendpacket( pxOpenedInterfaceHandle, uip_buf, uip_len ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| UBaseType_t uxNetifRx( void ) | ||||
| { | ||||
| UBaseType_t xDataLen; | ||||
| unsigned char *pucTemp; | ||||
|  | ||||
| 	/* Check there is really data available. */ | ||||
| 	xDataLen = lLengthOfDataInBuffer[ ucNextBufferToProcess ]; | ||||
| 	if( xDataLen != 0L ) | ||||
| 	{ | ||||
|  | ||||
| 		/* The buffer pointed to by uip_buf is going to change.  Remember which | ||||
| 		buffer uip_buf is currently pointing to. */ | ||||
| 		pucTemp = uip_buf; | ||||
|  | ||||
| 		/* Point uip_buf at the next buffer that contains data. */ | ||||
| 		uip_buf = pucEthernetBufferPointers[ ucNextBufferToProcess ]; | ||||
|  | ||||
| 		/* The buffer pointed to by  | ||||
| 		pucEthernetBufferPointeres[ ucNextBufferToProcess ] is now in use by | ||||
| 		uip_buf, but the buffer uip_buf was pointing to on entry to this | ||||
| 		function is free.  Set  | ||||
| 		pucEthernetBufferPointeres[ ucNextBufferToProcess ] to the free  | ||||
| 		buffer. */ | ||||
| 		pucEthernetBufferPointers[ ucNextBufferToProcess ] = pucTemp; | ||||
| 		lLengthOfDataInBuffer[ ucNextBufferToProcess ] = 0L; | ||||
|  | ||||
| 		ucNextBufferToProcess++; | ||||
| 		if( ucNextBufferToProcess >= archNUM_BUFFER_POINTERS ) | ||||
| 		{ | ||||
| 			ucNextBufferToProcess = 0L; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return xDataLen; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| BaseType_t xNetifInit( void ) | ||||
| { | ||||
| BaseType_t x; | ||||
| pcap_if_t *pxAllNetworkInterfaces; | ||||
|  | ||||
| 	/* Allocate a free buffer to each buffer pointer. */ | ||||
| 	for( x = 0; x < sizeof( pucEthernetBufferPointers ) / sizeof( unsigned char * ); x++ ) | ||||
| 	{ | ||||
| 		pucEthernetBufferPointers[ x ] = &( ucEthernetBuffer[ x ][ 0 ] ); | ||||
| 	} | ||||
|  | ||||
| 	/* Start with uip_buf pointing to a buffer that is not referenced from the | ||||
| 	pucEthernetBufferPointers[] array. */ | ||||
| 	uip_buf = &( ucEthernetBuffer[ archNUM_BUFFERS - 1 ][ 0 ] ); | ||||
|  | ||||
| 	/* Query the computer the simulation is being executed on to find the  | ||||
| 	network interfaces it has installed. */ | ||||
| 	pxAllNetworkInterfaces = prvPrintAvailableNetworkInterfaces(); | ||||
| 	 | ||||
| 	/* Open the network interface.  The number of the interface to be opened is  | ||||
| 	set by the configNETWORK_INTERFACE_TO_USE constant in FreeRTOSConfig.h. | ||||
| 	Calling this function will set the pxOpenedInterfaceHandle variable.  If, | ||||
| 	after calling this function, pxOpenedInterfaceHandle is equal to NULL, then | ||||
| 	the interface could not be opened. */ | ||||
| 	if( pxAllNetworkInterfaces != NULL ) | ||||
| 	{ | ||||
| 		prvOpenSelectedNetworkInterface( pxAllNetworkInterfaces ); | ||||
| 	} | ||||
| 	 | ||||
|  | ||||
| 	return x; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static pcap_if_t * prvPrintAvailableNetworkInterfaces( void ) | ||||
| {     | ||||
| pcap_if_t * pxAllNetworkInterfaces = NULL, *xInterface; | ||||
| long lInterfaceNumber = 1; | ||||
|  | ||||
|     if( pcap_findalldevs_ex( PCAP_SRC_IF_STRING, NULL, &pxAllNetworkInterfaces, cErrorBuffer ) == -1 ) | ||||
|     { | ||||
|         printf( "\r\nCould not obtain a list of network interfaces\r\n%s\r\n", cErrorBuffer ); | ||||
|         pxAllNetworkInterfaces = NULL; | ||||
|     } | ||||
|  | ||||
| 	if( pxAllNetworkInterfaces != NULL ) | ||||
| 	{ | ||||
| 		/* Print out the list of network interfaces.  The first in the list | ||||
| 		is interface '1', not interface '0'. */ | ||||
| 		for( xInterface = pxAllNetworkInterfaces; xInterface != NULL; xInterface = xInterface->next ) | ||||
| 		{ | ||||
| 			printf( "%d. %s", lInterfaceNumber, xInterface->name ); | ||||
| 			 | ||||
| 			if( xInterface->description != NULL ) | ||||
| 			{ | ||||
| 				printf( " (%s)\r\n", xInterface->description ); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				printf( " (No description available)\r\n") ; | ||||
| 			} | ||||
| 			 | ||||
| 			lInterfaceNumber++; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|     if( lInterfaceNumber == 1 ) | ||||
|     { | ||||
| 		/* The interface number was never incremented, so the above for() loop | ||||
| 		did not execute meaning no interfaces were found. */ | ||||
|         printf( " \r\nNo network interfaces were found.\r\n" ); | ||||
|         pxAllNetworkInterfaces = NULL; | ||||
|     } | ||||
|  | ||||
| 	printf( "\r\nThe interface that will be opened is set by configNETWORK_INTERFACE_TO_USE which should be defined in FreeRTOSConfig.h\r\n" ); | ||||
| 	printf( "Attempting to open interface number %d.\r\n", configNETWORK_INTERFACE_TO_USE ); | ||||
| 	 | ||||
|     if( ( configNETWORK_INTERFACE_TO_USE < 1L ) || ( configNETWORK_INTERFACE_TO_USE > lInterfaceNumber ) ) | ||||
|     { | ||||
|         printf("\r\nconfigNETWORK_INTERFACE_TO_USE is not in the valid range.\r\n" ); | ||||
| 		 | ||||
| 		if( pxAllNetworkInterfaces != NULL ) | ||||
| 		{ | ||||
| 			/* Free the device list, as no devices are going to be opened. */ | ||||
| 			pcap_freealldevs( pxAllNetworkInterfaces ); | ||||
| 			pxAllNetworkInterfaces = NULL; | ||||
| 		} | ||||
|     } | ||||
|  | ||||
| 	return pxAllNetworkInterfaces; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvOpenSelectedNetworkInterface( pcap_if_t *pxAllNetworkInterfaces ) | ||||
| { | ||||
| pcap_if_t *xInterface; | ||||
| long x; | ||||
|  | ||||
|     /* Walk the list of devices until the selected device is located. */ | ||||
| 	xInterface = pxAllNetworkInterfaces; | ||||
|     for( x = 0L; x < ( configNETWORK_INTERFACE_TO_USE - 1L ); x++ ) | ||||
| 	{ | ||||
| 		xInterface = xInterface->next; | ||||
| 	} | ||||
|  | ||||
|     /* Open the selected interface. */ | ||||
| 	pxOpenedInterfaceHandle = pcap_open(	xInterface->name,          	/* The name of the selected interface. */ | ||||
| 											UIP_CONF_BUFFER_SIZE, 		/* The size of the packet to capture. */ | ||||
| 											PCAP_OPENFLAG_PROMISCUOUS,	/* Open in promiscious mode as the MAC and  | ||||
| 																		IP address is going to be "simulated", and  | ||||
| 																		not be the real MAC and IP address.  This allows | ||||
| 																		trafic to the simulated IP address to be routed | ||||
| 																		to uIP, and trafic to the real IP address to be | ||||
| 																		routed to the Windows TCP/IP stack. */ | ||||
| 											0xfffffffL,             	/* The read time out.  This is going to block | ||||
| 																		until data is available. */ | ||||
| 											NULL,             			/* No authentication is required as this is | ||||
| 																		not a remote capture session. */ | ||||
| 											cErrorBuffer             | ||||
| 									   ); | ||||
| 									    | ||||
|     if ( pxOpenedInterfaceHandle == NULL ) | ||||
|     { | ||||
|         printf( "\r\n%s is not supported by WinPcap and cannot be opened\r\n", xInterface->name ); | ||||
|     } | ||||
| 	else | ||||
| 	{ | ||||
| 		/* Configure the capture filter to allow blocking reads, and to filter  | ||||
| 		out packets that are not of interest to this demo. */ | ||||
| 		prvConfigureCaptureBehaviour(); | ||||
| 	} | ||||
|  | ||||
| 	/* The device list is no longer required. */ | ||||
| 	pcap_freealldevs( pxAllNetworkInterfaces ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvConfigureCaptureBehaviour( void ) | ||||
| { | ||||
| struct bpf_program xFilterCode; | ||||
| const long lMinBytesToCopy = 10L, lBlocking = 0L; | ||||
| unsigned long ulNetMask; | ||||
|  | ||||
| 	/* Unblock a read as soon as anything is received. */ | ||||
| 	pcap_setmintocopy( pxOpenedInterfaceHandle, lMinBytesToCopy ); | ||||
|  | ||||
| 	/* Allow blocking. */ | ||||
| 	pcap_setnonblock( pxOpenedInterfaceHandle, lBlocking, cErrorBuffer ); | ||||
|  | ||||
| 	/* Set up a filter so only the packets of interest are passed to the uIP | ||||
| 	stack.  cErrorBuffer is used for convenience to create the string.  Don't | ||||
| 	confuse this with an error message. */ | ||||
| 	sprintf( cErrorBuffer, "broadcast or multicast or host %d.%d.%d.%d", configIP_ADDR0, configIP_ADDR1, configIP_ADDR2, configIP_ADDR3 ); | ||||
|  | ||||
| 	ulNetMask = ( configNET_MASK3 << 24UL ) | ( configNET_MASK2 << 16UL ) | ( configNET_MASK1 << 8L ) | configNET_MASK0; | ||||
|  | ||||
| 	if( pcap_compile(pxOpenedInterfaceHandle, &xFilterCode, cErrorBuffer, 1, ulNetMask ) < 0 ) | ||||
|     { | ||||
|         printf("\r\nThe packet filter string is invalid\r\n" ); | ||||
|     } | ||||
| 	else | ||||
| 	{     | ||||
| 		if( pcap_setfilter( pxOpenedInterfaceHandle, &xFilterCode ) < 0 ) | ||||
| 		{ | ||||
| 			printf( "\r\nAn error occurred setting the packet filter.\r\n" ); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/* Create a task that simulates an interrupt in a real system.  This will | ||||
| 	block waiting for packets, then send a message to the uIP task when data | ||||
| 	is available. */ | ||||
| 	xTaskCreate( prvInterruptSimulator, ( signed char * ) "MAC_ISR", configMINIMAL_STACK_SIZE, NULL, ( configuIP_TASK_PRIORITY - 1 ), NULL ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvInterruptSimulator( void *pvParameters ) | ||||
| { | ||||
| static struct pcap_pkthdr *pxHeader; | ||||
| const unsigned char *pucPacketData; | ||||
| extern QueueHandle_t xEMACEventQueue; | ||||
| const unsigned long ulRxEvent = uipETHERNET_RX_EVENT; | ||||
| long lResult; | ||||
|  | ||||
| 	/* Just to kill the compiler warning. */ | ||||
| 	( void ) pvParameters; | ||||
|  | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		/* Get the next packet. */ | ||||
| 		lResult = pcap_next_ex( pxOpenedInterfaceHandle, &pxHeader, &pucPacketData ); | ||||
| 		if( lResult ) | ||||
| 		{ | ||||
| 			/* Is the next buffer into which data should be placed free? */ | ||||
| 			if( lLengthOfDataInBuffer[ ucNextBufferToFill ] == 0L ) | ||||
| 			{ | ||||
| 				/* Copy the data from the captured packet into the buffer. */ | ||||
| 				memcpy( pucEthernetBufferPointers[ ucNextBufferToFill ], pucPacketData, pxHeader->len ); | ||||
|  | ||||
| 				/* Note the amount of data that was copied. */ | ||||
| 				lLengthOfDataInBuffer[ ucNextBufferToFill ] = pxHeader->len; | ||||
|  | ||||
| 				/* Move onto the next buffer, wrapping around if necessary. */ | ||||
| 				ucNextBufferToFill++; | ||||
| 				if( ucNextBufferToFill >= archNUM_BUFFER_POINTERS ) | ||||
| 				{ | ||||
| 					ucNextBufferToFill = 0U; | ||||
| 				} | ||||
|  | ||||
| 				/* Data was received and stored.  Send a message to the uIP task | ||||
| 				to let it know. */ | ||||
| 				xQueueSendToBack( xEMACEventQueue, &ulRxEvent, portMAX_DELAY ); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @@ -0,0 +1,137 @@ | ||||
| /* | ||||
|  * Copyright (C) 1999 WIDE Project. | ||||
|  * All rights reserved. | ||||
|  *  | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. Neither the name of the project nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  *  | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  */ | ||||
| #ifndef _BITTYPES_H | ||||
| #define _BITTYPES_H | ||||
|  | ||||
| #ifndef HAVE_U_INT8_T | ||||
|  | ||||
| #if SIZEOF_CHAR == 1 | ||||
| typedef unsigned char u_int8_t; | ||||
| typedef signed char _int8_t; | ||||
| #elif SIZEOF_INT == 1 | ||||
| typedef unsigned int u_int8_t; | ||||
| typedef signed int int8_t; | ||||
| #else  /* XXX */ | ||||
| #error "there's no appropriate type for u_int8_t" | ||||
| #endif | ||||
| #define HAVE_U_INT8_T 1 | ||||
| #define HAVE_INT8_T 1 | ||||
|  | ||||
| #endif /* HAVE_U_INT8_T */ | ||||
|  | ||||
| #ifndef HAVE_U_INT16_T  | ||||
|  | ||||
| #if SIZEOF_SHORT == 2 | ||||
| typedef unsigned short u_int16_t; | ||||
| typedef signed short _int16_t; | ||||
| #elif SIZEOF_INT == 2 | ||||
| typedef unsigned int u_int16_t; | ||||
| typedef signed int int16_t; | ||||
| #elif SIZEOF_CHAR == 2 | ||||
| typedef unsigned char u_int16_t; | ||||
| typedef signed char int16_t; | ||||
| #else  /* XXX */ | ||||
| #error "there's no appropriate type for u_int16_t" | ||||
| #endif | ||||
| #define HAVE_U_INT16_T 1 | ||||
| #define HAVE_INT16_T 1 | ||||
|  | ||||
| #endif /* HAVE_U_INT16_T */ | ||||
|  | ||||
| #ifndef HAVE_U_INT32_T | ||||
|  | ||||
| #if SIZEOF_INT == 4 | ||||
| typedef unsigned int u_int32_t; | ||||
| typedef signed int _int32_t; | ||||
| #elif SIZEOF_LONG == 4 | ||||
| typedef unsigned long u_int32_t; | ||||
| typedef signed long int32_t; | ||||
| #elif SIZEOF_SHORT == 4 | ||||
| typedef unsigned short u_int32_t; | ||||
| typedef signed short int32_t; | ||||
| #else  /* XXX */ | ||||
| #error "there's no appropriate type for u_int32_t" | ||||
| #endif | ||||
| #define HAVE_U_INT32_T 1 | ||||
| #define HAVE_INT32_T 1 | ||||
|  | ||||
| #endif /* HAVE_U_INT32_T */ | ||||
|  | ||||
| #ifndef HAVE_U_INT64_T | ||||
| #if SIZEOF_LONG_LONG == 8 | ||||
| typedef unsigned long long u_int64_t; | ||||
| typedef long long int64_t; | ||||
| #elif defined(_MSC_EXTENSIONS) | ||||
| typedef unsigned _int64 u_int64_t; | ||||
| typedef _int64 int64_t; | ||||
| #elif SIZEOF_INT == 8 | ||||
| typedef unsigned int u_int64_t; | ||||
| #elif SIZEOF_LONG == 8 | ||||
| typedef unsigned long u_int64_t; | ||||
| #elif SIZEOF_SHORT == 8 | ||||
| typedef unsigned short u_int64_t; | ||||
| #else  /* XXX */ | ||||
| #error "there's no appropriate type for u_int64_t" | ||||
| #endif | ||||
|  | ||||
| #endif /* HAVE_U_INT64_T */ | ||||
|  | ||||
| #ifndef PRId64 | ||||
| #ifdef _MSC_EXTENSIONS | ||||
| #define PRId64	"I64d" | ||||
| #else /* _MSC_EXTENSIONS */ | ||||
| #define PRId64	"lld" | ||||
| #endif /* _MSC_EXTENSIONS */ | ||||
| #endif /* PRId64 */ | ||||
|  | ||||
| #ifndef PRIo64 | ||||
| #ifdef _MSC_EXTENSIONS | ||||
| #define PRIo64	"I64o" | ||||
| #else /* _MSC_EXTENSIONS */ | ||||
| #define PRIo64	"llo" | ||||
| #endif /* _MSC_EXTENSIONS */ | ||||
| #endif /* PRIo64 */ | ||||
|  | ||||
| #ifndef PRIx64 | ||||
| #ifdef _MSC_EXTENSIONS | ||||
| #define PRIx64	"I64x" | ||||
| #else /* _MSC_EXTENSIONS */ | ||||
| #define PRIx64	"llx" | ||||
| #endif /* _MSC_EXTENSIONS */ | ||||
| #endif /* PRIx64 */ | ||||
|  | ||||
| #ifndef PRIu64 | ||||
| #ifdef _MSC_EXTENSIONS | ||||
| #define PRIu64	"I64u" | ||||
| #else /* _MSC_EXTENSIONS */ | ||||
| #define PRIu64	"llu" | ||||
| #endif /* _MSC_EXTENSIONS */ | ||||
| #endif /* PRIu64 */ | ||||
|  | ||||
| #endif /* _BITTYPES_H */ | ||||
| @@ -0,0 +1,163 @@ | ||||
| /* | ||||
|  * Copyright (c) 1993, 1994, 1997 | ||||
|  *	The Regents of the University of California.  All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that: (1) source code distributions | ||||
|  * retain the above copyright notice and this paragraph in its entirety, (2) | ||||
|  * distributions including binary code include the above copyright notice and | ||||
|  * this paragraph in its entirety in the documentation or other materials | ||||
|  * provided with the distribution, and (3) all advertising materials mentioning | ||||
|  * features or use of this software display the following acknowledgement: | ||||
|  * ``This product includes software developed by the University of California, | ||||
|  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of | ||||
|  * the University nor the names of its contributors may be used to endorse | ||||
|  * or promote products derived from this software without specific prior | ||||
|  * written permission. | ||||
|  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED | ||||
|  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF | ||||
|  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. | ||||
|  * | ||||
|  * @(#) $Header: /tcpdump/master/libpcap/Win32/Include/ip6_misc.h,v 1.5 2006-01-22 18:02:18 gianluca Exp $ (LBL) | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * This file contains a collage of declarations for IPv6 from FreeBSD not present in Windows | ||||
|  */ | ||||
|  | ||||
| #include <winsock2.h> | ||||
|  | ||||
| #include <ws2tcpip.h> | ||||
|  | ||||
| #ifndef __MINGW32__ | ||||
| #define	IN_MULTICAST(a)		IN_CLASSD(a) | ||||
| #endif | ||||
|  | ||||
| #define	IN_EXPERIMENTAL(a)	((((u_int32_t) (a)) & 0xf0000000) == 0xf0000000) | ||||
|  | ||||
| #define	IN_LOOPBACKNET		127 | ||||
|  | ||||
| #if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF) | ||||
| /* IPv6 address */ | ||||
| struct in6_addr | ||||
|   { | ||||
|     union | ||||
|       { | ||||
| 	u_int8_t		u6_addr8[16]; | ||||
| 	u_int16_t	u6_addr16[8]; | ||||
| 	u_int32_t	u6_addr32[4]; | ||||
|       } in6_u; | ||||
| #define s6_addr			in6_u.u6_addr8 | ||||
| #define s6_addr16		in6_u.u6_addr16 | ||||
| #define s6_addr32		in6_u.u6_addr32 | ||||
| #define s6_addr64		in6_u.u6_addr64 | ||||
|   }; | ||||
|  | ||||
| #define IN6ADDR_ANY_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } | ||||
| #define IN6ADDR_LOOPBACK_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } | ||||
| #endif /* __MINGW32__ */ | ||||
|  | ||||
|  | ||||
| #if (defined _MSC_VER) || (defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF)) | ||||
| typedef unsigned short	sa_family_t; | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF) | ||||
|  | ||||
| #define	__SOCKADDR_COMMON(sa_prefix) \ | ||||
|   sa_family_t sa_prefix##family | ||||
|  | ||||
| /* Ditto, for IPv6.  */ | ||||
| struct sockaddr_in6 | ||||
|   { | ||||
|     __SOCKADDR_COMMON (sin6_); | ||||
|     u_int16_t sin6_port;		/* Transport layer port # */ | ||||
|     u_int32_t sin6_flowinfo;	/* IPv6 flow information */ | ||||
|     struct in6_addr sin6_addr;	/* IPv6 address */ | ||||
|   }; | ||||
|  | ||||
| #define IN6_IS_ADDR_V4MAPPED(a) \ | ||||
| 	((((u_int32_t *) (a))[0] == 0) && (((u_int32_t *) (a))[1] == 0) && \ | ||||
| 	 (((u_int32_t *) (a))[2] == htonl (0xffff))) | ||||
|  | ||||
| #define IN6_IS_ADDR_MULTICAST(a) (((u_int8_t *) (a))[0] == 0xff) | ||||
|  | ||||
| #define IN6_IS_ADDR_LINKLOCAL(a) \ | ||||
| 	((((u_int32_t *) (a))[0] & htonl (0xffc00000)) == htonl (0xfe800000)) | ||||
|  | ||||
| #define IN6_IS_ADDR_LOOPBACK(a) \ | ||||
| 	(((u_int32_t *) (a))[0] == 0 && ((u_int32_t *) (a))[1] == 0 && \ | ||||
| 	 ((u_int32_t *) (a))[2] == 0 && ((u_int32_t *) (a))[3] == htonl (1)) | ||||
| #endif /* __MINGW32__ */ | ||||
|  | ||||
| #define ip6_vfc   ip6_ctlun.ip6_un2_vfc | ||||
| #define ip6_flow  ip6_ctlun.ip6_un1.ip6_un1_flow | ||||
| #define ip6_plen  ip6_ctlun.ip6_un1.ip6_un1_plen | ||||
| #define ip6_nxt   ip6_ctlun.ip6_un1.ip6_un1_nxt | ||||
| #define ip6_hlim  ip6_ctlun.ip6_un1.ip6_un1_hlim | ||||
| #define ip6_hops  ip6_ctlun.ip6_un1.ip6_un1_hlim | ||||
|  | ||||
| #define nd_rd_type               nd_rd_hdr.icmp6_type | ||||
| #define nd_rd_code               nd_rd_hdr.icmp6_code | ||||
| #define nd_rd_cksum              nd_rd_hdr.icmp6_cksum | ||||
| #define nd_rd_reserved           nd_rd_hdr.icmp6_data32[0] | ||||
|  | ||||
| /* | ||||
|  *	IPV6 extension headers | ||||
|  */ | ||||
| #define IPPROTO_HOPOPTS		0	/* IPv6 hop-by-hop options	*/ | ||||
| #define IPPROTO_IPV6		41  /* IPv6 header.  */ | ||||
| #define IPPROTO_ROUTING		43	/* IPv6 routing header		*/ | ||||
| #define IPPROTO_FRAGMENT	44	/* IPv6 fragmentation header	*/ | ||||
| #define IPPROTO_ESP		50	/* encapsulating security payload */ | ||||
| #define IPPROTO_AH		51	/* authentication header	*/ | ||||
| #define IPPROTO_ICMPV6		58	/* ICMPv6			*/ | ||||
| #define IPPROTO_NONE		59	/* IPv6 no next header		*/ | ||||
| #define IPPROTO_DSTOPTS		60	/* IPv6 destination options	*/ | ||||
| #define IPPROTO_PIM			103 /* Protocol Independent Multicast.  */ | ||||
|  | ||||
| #define	 IPV6_RTHDR_TYPE_0 0 | ||||
|  | ||||
| /* Option types and related macros */ | ||||
| #define IP6OPT_PAD1		0x00	/* 00 0 00000 */ | ||||
| #define IP6OPT_PADN		0x01	/* 00 0 00001 */ | ||||
| #define IP6OPT_JUMBO		0xC2	/* 11 0 00010 = 194 */ | ||||
| #define IP6OPT_JUMBO_LEN	6 | ||||
| #define IP6OPT_ROUTER_ALERT	0x05	/* 00 0 00101 */ | ||||
|  | ||||
| #define IP6OPT_RTALERT_LEN	4 | ||||
| #define IP6OPT_RTALERT_MLD	0	/* Datagram contains an MLD message */ | ||||
| #define IP6OPT_RTALERT_RSVP	1	/* Datagram contains an RSVP message */ | ||||
| #define IP6OPT_RTALERT_ACTNET	2 	/* contains an Active Networks msg */ | ||||
| #define IP6OPT_MINLEN		2 | ||||
|  | ||||
| #define IP6OPT_BINDING_UPDATE	0xc6	/* 11 0 00110 */ | ||||
| #define IP6OPT_BINDING_ACK	0x07	/* 00 0 00111 */ | ||||
| #define IP6OPT_BINDING_REQ	0x08	/* 00 0 01000 */ | ||||
| #define IP6OPT_HOME_ADDRESS	0xc9	/* 11 0 01001 */ | ||||
| #define IP6OPT_EID		0x8a	/* 10 0 01010 */ | ||||
|  | ||||
| #define IP6OPT_TYPE(o)		((o) & 0xC0) | ||||
| #define IP6OPT_TYPE_SKIP	0x00 | ||||
| #define IP6OPT_TYPE_DISCARD	0x40 | ||||
| #define IP6OPT_TYPE_FORCEICMP	0x80 | ||||
| #define IP6OPT_TYPE_ICMP	0xC0 | ||||
|  | ||||
| #define IP6OPT_MUTABLE		0x20 | ||||
|  | ||||
|  | ||||
| #if defined(__MINGW32__) && defined(DEFINE_ADDITIONAL_IPV6_STUFF) | ||||
| #ifndef EAI_ADDRFAMILY | ||||
| struct addrinfo { | ||||
| 	int	ai_flags;	/* AI_PASSIVE, AI_CANONNAME */ | ||||
| 	int	ai_family;	/* PF_xxx */ | ||||
| 	int	ai_socktype;	/* SOCK_xxx */ | ||||
| 	int	ai_protocol;	/* 0 or IPPROTO_xxx for IPv4 and IPv6 */ | ||||
| 	size_t	ai_addrlen;	/* length of ai_addr */ | ||||
| 	char	*ai_canonname;	/* canonical name for hostname */ | ||||
| 	struct sockaddr *ai_addr;	/* binary address */ | ||||
| 	struct addrinfo *ai_next;	/* next structure in linked list */ | ||||
| }; | ||||
| #endif | ||||
| #endif /* __MINGW32__ */ | ||||
| @@ -0,0 +1,52 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| #ifndef NET_IF_H | ||||
| #define NET_IF_H | ||||
|  | ||||
| /* | ||||
|  * Send uip_len bytes from uip_buf to the network interface selected by the  | ||||
|  * configNETWORK_INTERFACE_TO_USE constant (defined in FreeRTOSConfig.h).  | ||||
|  */ | ||||
| void vNetifTx( void ); | ||||
|  | ||||
| /* | ||||
|  * Receive bytes from the network interface selected by the  | ||||
|  * configNETWORK_INTERFACE_TO_USE constant (defined in FreeRTOSConfig.h).  The | ||||
|  * bytes are placed in uip_buf.  The number of bytes copied into uip_buf is | ||||
|  * returned. | ||||
|  */ | ||||
| UBaseType_t uxNetifRx( void ); | ||||
|  | ||||
| /* | ||||
|  * Prepare a packet capture session.  This will print out all the network  | ||||
|  * interfaces available, and the one actually used is set by the  | ||||
|  * configNETWORK_INTERFACE_TO_USE constant that is defined in  | ||||
|  * FreeRTOSConfig.h. */ | ||||
| BaseType_t xNetifInit( void ); | ||||
|  | ||||
| #endif /* NET_IF_H */ | ||||
| @@ -0,0 +1,47 @@ | ||||
| /*- | ||||
|  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 | ||||
|  *	The Regents of the University of California.  All rights reserved. | ||||
|  * | ||||
|  * This code is derived from the Stanford/CMU enet packet filter, | ||||
|  * (net/enet.c) distributed as part of 4.3BSD, and code contributed | ||||
|  * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence  | ||||
|  * Berkeley Laboratory. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. All advertising materials mentioning features or use of this software | ||||
|  *    must display the following acknowledgement: | ||||
|  *      This product includes software developed by the University of | ||||
|  *      California, Berkeley and its contributors. | ||||
|  * 4. Neither the name of the University nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  * | ||||
|  * @(#) $Header: /tcpdump/master/libpcap/pcap-bpf.h,v 1.50 2007/04/01 21:43:55 guy Exp $ (LBL) | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * For backwards compatibility. | ||||
|  * | ||||
|  * Note to OS vendors: do NOT get rid of this file!  Some applications | ||||
|  * might expect to be able to include <pcap-bpf.h>. | ||||
|  */ | ||||
| #include <pcap/bpf.h> | ||||
| @@ -0,0 +1,42 @@ | ||||
| /* | ||||
|  * Copyright (c) 1994, 1996 | ||||
|  *	The Regents of the University of California.  All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. All advertising materials mentioning features or use of this software | ||||
|  *    must display the following acknowledgement: | ||||
|  *	This product includes software developed by the Computer Systems | ||||
|  *	Engineering Group at Lawrence Berkeley Laboratory. | ||||
|  * 4. Neither the name of the University nor of the Laboratory may be used | ||||
|  *    to endorse or promote products derived from this software without | ||||
|  *    specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  * | ||||
|  * @(#) $Header: /tcpdump/master/libpcap/pcap-namedb.h,v 1.13 2006/10/04 18:13:32 guy Exp $ (LBL) | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * For backwards compatibility. | ||||
|  * | ||||
|  * Note to OS vendors: do NOT get rid of this file!  Some applications | ||||
|  * might expect to be able to include <pcap-namedb.h>. | ||||
|  */ | ||||
| #include <pcap/namedb.h> | ||||
| @@ -0,0 +1,93 @@ | ||||
| /* | ||||
|  * Copyright (c) 2002 - 2005 NetGroup, Politecnico di Torino (Italy) | ||||
|  * Copyright (c) 2005 - 2009 CACE Technologies, Inc. Davis (California) | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  * notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  * notice, this list of conditions and the following disclaimer in the | ||||
|  * documentation and/or other materials provided with the distribution. | ||||
|  * 3. Neither the name of the Politecnico di Torino nor the names of its | ||||
|  * contributors may be used to endorse or promote products derived from | ||||
|  * this software without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
|  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
|  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
|  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
|  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
|  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
|  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
|  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
|  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
|  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  * | ||||
|  * @(#) $Header: /tcpdump/master/libpcap/pcap-stdinc.h,v 1.10.2.1 2008-10-06 15:38:39 gianluca Exp $ (LBL) | ||||
|  */ | ||||
|  | ||||
| #define SIZEOF_CHAR 1 | ||||
| #define SIZEOF_SHORT 2 | ||||
| #define SIZEOF_INT 4 | ||||
| #ifndef _MSC_EXTENSIONS | ||||
| #define SIZEOF_LONG_LONG 8 | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Avoids a compiler warning in case this was already defined       | ||||
|  * (someone defined _WINSOCKAPI_ when including 'windows.h', in order | ||||
|  * to prevent it from including 'winsock.h') | ||||
|  */ | ||||
| #ifdef _WINSOCKAPI_ | ||||
| #undef _WINSOCKAPI_ | ||||
| #endif | ||||
| #include <winsock2.h> | ||||
|  | ||||
| #include <fcntl.h> | ||||
|  | ||||
| #include "bittypes.h" | ||||
| #include <time.h> | ||||
| #include <io.h> | ||||
|  | ||||
| #ifndef __MINGW32__ | ||||
| #include "IP6_misc.h" | ||||
| #endif | ||||
|  | ||||
| #define caddr_t char* | ||||
|  | ||||
| #if _MSC_VER < 1500 | ||||
| #define snprintf _snprintf | ||||
| #define vsnprintf _vsnprintf | ||||
| #define strdup _strdup | ||||
| #endif | ||||
|  | ||||
| #define inline __inline  | ||||
|  | ||||
| #ifdef __MINGW32__ | ||||
| #include <stdint.h> | ||||
| #else /*__MINGW32__*/ | ||||
| /* MSVC compiler */ | ||||
| #ifndef _UINTPTR_T_DEFINED | ||||
| #ifdef  _WIN64 | ||||
| typedef unsigned __int64    uintptr_t; | ||||
| #else | ||||
| typedef _W64 unsigned int   uintptr_t; | ||||
| #endif | ||||
| #define _UINTPTR_T_DEFINED | ||||
| #endif | ||||
|  | ||||
| #ifndef _INTPTR_T_DEFINED | ||||
| #ifdef  _WIN64 | ||||
| typedef __int64    intptr_t; | ||||
| #else | ||||
| typedef _W64 int   intptr_t; | ||||
| #endif | ||||
| #define _INTPTR_T_DEFINED | ||||
| #endif  | ||||
|  | ||||
| #endif /*__MINGW32__*/ | ||||
| @@ -0,0 +1,45 @@ | ||||
| /* | ||||
|  * Copyright (c) 1993, 1994, 1995, 1996, 1997 | ||||
|  *	The Regents of the University of California.  All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. All advertising materials mentioning features or use of this software | ||||
|  *    must display the following acknowledgement: | ||||
|  *	This product includes software developed by the Computer Systems | ||||
|  *	Engineering Group at Lawrence Berkeley Laboratory. | ||||
|  * 4. Neither the name of the University nor of the Laboratory may be used | ||||
|  *    to endorse or promote products derived from this software without | ||||
|  *    specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  * | ||||
|  * @(#) $Header: /tcpdump/master/libpcap/pcap.h,v 1.59 2006/10/04 18:09:22 guy Exp $ (LBL) | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * For backwards compatibility. | ||||
|  * | ||||
|  * Note to OS vendors: do NOT get rid of this file!  Many applications | ||||
|  * expect to be able to include <pcap.h>, and at least some of them | ||||
|  * go through contortions in their configure scripts to try to detect | ||||
|  * OSes that have "helpfully" moved pcap.h to <pcap/pcap.h> without | ||||
|  * leaving behind a <pcap.h> file. | ||||
|  */ | ||||
| #include <pcap/pcap.h> | ||||
| @@ -0,0 +1,48 @@ | ||||
| /* | ||||
|  * Copyright (c) 2006 Paolo Abeni (Italy) | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  * notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  * notice, this list of conditions and the following disclaimer in the | ||||
|  * documentation and/or other materials provided with the distribution. | ||||
|  * 3. The name of the author may not be used to endorse or promote  | ||||
|  * products derived from this software without specific prior written  | ||||
|  * permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
|  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
|  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
|  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
|  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
|  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
|  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
|  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
|  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
|  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  * | ||||
|  * bluetooth data struct | ||||
|  * By Paolo Abeni <paolo.abeni@email.it> | ||||
|  * | ||||
|  * @(#) $Header: /tcpdump/master/libpcap/pcap/bluetooth.h,v 1.1 2007/09/22 02:10:17 guy Exp $ | ||||
|  */ | ||||
|   | ||||
| #ifndef _PCAP_BLUETOOTH_STRUCTS_H__ | ||||
| #define _PCAP_BLUETOOTH_STRUCTS_H__ | ||||
|  | ||||
| /* | ||||
|  * Header prepended libpcap to each bluetooth h:4 frame. | ||||
|  * fields are in network byte order | ||||
|  */ | ||||
| typedef struct _pcap_bluetooth_h4_header { | ||||
| 	u_int32_t direction; /* if first bit is set direction is incoming */ | ||||
| } pcap_bluetooth_h4_header; | ||||
|  | ||||
|  | ||||
| #endif | ||||
| @@ -0,0 +1,934 @@ | ||||
| /*- | ||||
|  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 | ||||
|  *	The Regents of the University of California.  All rights reserved. | ||||
|  * | ||||
|  * This code is derived from the Stanford/CMU enet packet filter, | ||||
|  * (net/enet.c) distributed as part of 4.3BSD, and code contributed | ||||
|  * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence  | ||||
|  * Berkeley Laboratory. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. All advertising materials mentioning features or use of this software | ||||
|  *    must display the following acknowledgement: | ||||
|  *      This product includes software developed by the University of | ||||
|  *      California, Berkeley and its contributors. | ||||
|  * 4. Neither the name of the University nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  * | ||||
|  *      @(#)bpf.h       7.1 (Berkeley) 5/7/91 | ||||
|  * | ||||
|  * @(#) $Header: /tcpdump/master/libpcap/pcap/bpf.h,v 1.19.2.8 2008-09-22 20:16:01 guy Exp $ (LBL) | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * This is libpcap's cut-down version of bpf.h; it includes only | ||||
|  * the stuff needed for the code generator and the userland BPF | ||||
|  * interpreter, and the libpcap APIs for setting filters, etc.. | ||||
|  * | ||||
|  * "pcap-bpf.c" will include the native OS version, as it deals with | ||||
|  * the OS's BPF implementation. | ||||
|  * | ||||
|  * XXX - should this all just be moved to "pcap.h"? | ||||
|  */ | ||||
|  | ||||
| #ifndef BPF_MAJOR_VERSION | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* BSD style release date */ | ||||
| #define BPF_RELEASE 199606 | ||||
|  | ||||
| #ifdef MSDOS /* must be 32-bit */ | ||||
| typedef long          bpf_int32; | ||||
| typedef unsigned long bpf_u_int32; | ||||
| #else | ||||
| typedef	int bpf_int32; | ||||
| typedef	u_int bpf_u_int32; | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Alignment macros.  BPF_WORDALIGN rounds up to the next  | ||||
|  * even multiple of BPF_ALIGNMENT.  | ||||
|  */ | ||||
| #ifndef __NetBSD__ | ||||
| #define BPF_ALIGNMENT sizeof(bpf_int32) | ||||
| #else | ||||
| #define BPF_ALIGNMENT sizeof(long) | ||||
| #endif | ||||
| #define BPF_WORDALIGN(x) (((x)+(BPF_ALIGNMENT-1))&~(BPF_ALIGNMENT-1)) | ||||
|  | ||||
| #define BPF_MAXBUFSIZE 0x8000 | ||||
| #define BPF_MINBUFSIZE 32 | ||||
|  | ||||
| /* | ||||
|  * Structure for "pcap_compile()", "pcap_setfilter()", etc.. | ||||
|  */ | ||||
| struct bpf_program { | ||||
| 	u_int bf_len; | ||||
| 	struct bpf_insn *bf_insns; | ||||
| }; | ||||
|   | ||||
| /* | ||||
|  * Struct return by BIOCVERSION.  This represents the version number of  | ||||
|  * the filter language described by the instruction encodings below. | ||||
|  * bpf understands a program iff kernel_major == filter_major && | ||||
|  * kernel_minor >= filter_minor, that is, if the value returned by the | ||||
|  * running kernel has the same major number and a minor number equal | ||||
|  * equal to or less than the filter being downloaded.  Otherwise, the | ||||
|  * results are undefined, meaning an error may be returned or packets | ||||
|  * may be accepted haphazardly. | ||||
|  * It has nothing to do with the source code version. | ||||
|  */ | ||||
| struct bpf_version { | ||||
| 	u_short bv_major; | ||||
| 	u_short bv_minor; | ||||
| }; | ||||
| /* Current version number of filter architecture. */ | ||||
| #define BPF_MAJOR_VERSION 1 | ||||
| #define BPF_MINOR_VERSION 1 | ||||
|  | ||||
| /* | ||||
|  * Data-link level type codes. | ||||
|  * | ||||
|  * Do *NOT* add new values to this list without asking | ||||
|  * "tcpdump-workers@lists.tcpdump.org" for a value.  Otherwise, you run | ||||
|  * the risk of using a value that's already being used for some other | ||||
|  * purpose, and of having tools that read libpcap-format captures not | ||||
|  * being able to handle captures with your new DLT_ value, with no hope | ||||
|  * that they will ever be changed to do so (as that would destroy their | ||||
|  * ability to read captures using that value for that other purpose). | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * These are the types that are the same on all platforms, and that | ||||
|  * have been defined by <net/bpf.h> for ages. | ||||
|  */ | ||||
| #define DLT_NULL	0	/* BSD loopback encapsulation */ | ||||
| #define DLT_EN10MB	1	/* Ethernet (10Mb) */ | ||||
| #define DLT_EN3MB	2	/* Experimental Ethernet (3Mb) */ | ||||
| #define DLT_AX25	3	/* Amateur Radio AX.25 */ | ||||
| #define DLT_PRONET	4	/* Proteon ProNET Token Ring */ | ||||
| #define DLT_CHAOS	5	/* Chaos */ | ||||
| #define DLT_IEEE802	6	/* 802.5 Token Ring */ | ||||
| #define DLT_ARCNET	7	/* ARCNET, with BSD-style header */ | ||||
| #define DLT_SLIP	8	/* Serial Line IP */ | ||||
| #define DLT_PPP		9	/* Point-to-point Protocol */ | ||||
| #define DLT_FDDI	10	/* FDDI */ | ||||
|  | ||||
| /* | ||||
|  * These are types that are different on some platforms, and that | ||||
|  * have been defined by <net/bpf.h> for ages.  We use #ifdefs to | ||||
|  * detect the BSDs that define them differently from the traditional | ||||
|  * libpcap <net/bpf.h> | ||||
|  * | ||||
|  * XXX - DLT_ATM_RFC1483 is 13 in BSD/OS, and DLT_RAW is 14 in BSD/OS, | ||||
|  * but I don't know what the right #define is for BSD/OS. | ||||
|  */ | ||||
| #define DLT_ATM_RFC1483	11	/* LLC-encapsulated ATM */ | ||||
|  | ||||
| #ifdef __OpenBSD__ | ||||
| #define DLT_RAW		14	/* raw IP */ | ||||
| #else | ||||
| #define DLT_RAW		12	/* raw IP */ | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Given that the only OS that currently generates BSD/OS SLIP or PPP | ||||
|  * is, well, BSD/OS, arguably everybody should have chosen its values | ||||
|  * for DLT_SLIP_BSDOS and DLT_PPP_BSDOS, which are 15 and 16, but they | ||||
|  * didn't.  So it goes. | ||||
|  */ | ||||
| #if defined(__NetBSD__) || defined(__FreeBSD__) | ||||
| #ifndef DLT_SLIP_BSDOS | ||||
| #define DLT_SLIP_BSDOS	13	/* BSD/OS Serial Line IP */ | ||||
| #define DLT_PPP_BSDOS	14	/* BSD/OS Point-to-point Protocol */ | ||||
| #endif | ||||
| #else | ||||
| #define DLT_SLIP_BSDOS	15	/* BSD/OS Serial Line IP */ | ||||
| #define DLT_PPP_BSDOS	16	/* BSD/OS Point-to-point Protocol */ | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * 17 is used for DLT_OLD_PFLOG in OpenBSD; | ||||
|  *     OBSOLETE: DLT_PFLOG is 117 in OpenBSD now as well. See below. | ||||
|  * 18 is used for DLT_PFSYNC in OpenBSD; don't use it for anything else. | ||||
|  */ | ||||
|  | ||||
| #define DLT_ATM_CLIP	19	/* Linux Classical-IP over ATM */ | ||||
|  | ||||
| /* | ||||
|  * Apparently Redback uses this for its SmartEdge 400/800.  I hope | ||||
|  * nobody else decided to use it, too. | ||||
|  */ | ||||
| #define DLT_REDBACK_SMARTEDGE	32 | ||||
|  | ||||
| /* | ||||
|  * These values are defined by NetBSD; other platforms should refrain from | ||||
|  * using them for other purposes, so that NetBSD savefiles with link | ||||
|  * types of 50 or 51 can be read as this type on all platforms. | ||||
|  */ | ||||
| #define DLT_PPP_SERIAL	50	/* PPP over serial with HDLC encapsulation */ | ||||
| #define DLT_PPP_ETHER	51	/* PPP over Ethernet */ | ||||
|  | ||||
| /* | ||||
|  * The Axent Raptor firewall - now the Symantec Enterprise Firewall - uses | ||||
|  * a link-layer type of 99 for the tcpdump it supplies.  The link-layer | ||||
|  * header has 6 bytes of unknown data, something that appears to be an | ||||
|  * Ethernet type, and 36 bytes that appear to be 0 in at least one capture | ||||
|  * I've seen. | ||||
|  */ | ||||
| #define DLT_SYMANTEC_FIREWALL	99 | ||||
|  | ||||
| /* | ||||
|  * Values between 100 and 103 are used in capture file headers as | ||||
|  * link-layer types corresponding to DLT_ types that differ | ||||
|  * between platforms; don't use those values for new DLT_ new types. | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * This value was defined by libpcap 0.5; platforms that have defined | ||||
|  * it with a different value should define it here with that value - | ||||
|  * a link type of 104 in a save file will be mapped to DLT_C_HDLC, | ||||
|  * whatever value that happens to be, so programs will correctly | ||||
|  * handle files with that link type regardless of the value of | ||||
|  * DLT_C_HDLC. | ||||
|  * | ||||
|  * The name DLT_C_HDLC was used by BSD/OS; we use that name for source | ||||
|  * compatibility with programs written for BSD/OS. | ||||
|  * | ||||
|  * libpcap 0.5 defined it as DLT_CHDLC; we define DLT_CHDLC as well, | ||||
|  * for source compatibility with programs written for libpcap 0.5. | ||||
|  */ | ||||
| #define DLT_C_HDLC	104	/* Cisco HDLC */ | ||||
| #define DLT_CHDLC	DLT_C_HDLC | ||||
|  | ||||
| #define DLT_IEEE802_11	105	/* IEEE 802.11 wireless */ | ||||
|  | ||||
| /* | ||||
|  * 106 is reserved for Linux Classical IP over ATM; it's like DLT_RAW, | ||||
|  * except when it isn't.  (I.e., sometimes it's just raw IP, and | ||||
|  * sometimes it isn't.)  We currently handle it as DLT_LINUX_SLL, | ||||
|  * so that we don't have to worry about the link-layer header.) | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * Frame Relay; BSD/OS has a DLT_FR with a value of 11, but that collides | ||||
|  * with other values. | ||||
|  * DLT_FR and DLT_FRELAY packets start with the Q.922 Frame Relay header | ||||
|  * (DLCI, etc.). | ||||
|  */ | ||||
| #define DLT_FRELAY	107 | ||||
|  | ||||
| /* | ||||
|  * OpenBSD DLT_LOOP, for loopback devices; it's like DLT_NULL, except | ||||
|  * that the AF_ type in the link-layer header is in network byte order. | ||||
|  * | ||||
|  * DLT_LOOP is 12 in OpenBSD, but that's DLT_RAW in other OSes, so | ||||
|  * we don't use 12 for it in OSes other than OpenBSD. | ||||
|  */ | ||||
| #ifdef __OpenBSD__ | ||||
| #define DLT_LOOP	12 | ||||
| #else | ||||
| #define DLT_LOOP	108 | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Encapsulated packets for IPsec; DLT_ENC is 13 in OpenBSD, but that's | ||||
|  * DLT_SLIP_BSDOS in NetBSD, so we don't use 13 for it in OSes other | ||||
|  * than OpenBSD. | ||||
|  */ | ||||
| #ifdef __OpenBSD__ | ||||
| #define DLT_ENC		13 | ||||
| #else | ||||
| #define DLT_ENC		109 | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Values between 110 and 112 are reserved for use in capture file headers | ||||
|  * as link-layer types corresponding to DLT_ types that might differ | ||||
|  * between platforms; don't use those values for new DLT_ types | ||||
|  * other than the corresponding DLT_ types. | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * This is for Linux cooked sockets. | ||||
|  */ | ||||
| #define DLT_LINUX_SLL	113 | ||||
|  | ||||
| /* | ||||
|  * Apple LocalTalk hardware. | ||||
|  */ | ||||
| #define DLT_LTALK	114 | ||||
|  | ||||
| /* | ||||
|  * Acorn Econet. | ||||
|  */ | ||||
| #define DLT_ECONET	115 | ||||
|  | ||||
| /* | ||||
|  * Reserved for use with OpenBSD ipfilter. | ||||
|  */ | ||||
| #define DLT_IPFILTER	116 | ||||
|  | ||||
| /* | ||||
|  * OpenBSD DLT_PFLOG; DLT_PFLOG is 17 in OpenBSD, but that's DLT_LANE8023 | ||||
|  * in SuSE 6.3, so we can't use 17 for it in capture-file headers. | ||||
|  * | ||||
|  * XXX: is there a conflict with DLT_PFSYNC 18 as well? | ||||
|  */ | ||||
| #ifdef __OpenBSD__ | ||||
| #define DLT_OLD_PFLOG	17 | ||||
| #define DLT_PFSYNC	18 | ||||
| #endif | ||||
| #define DLT_PFLOG	117 | ||||
|  | ||||
| /* | ||||
|  * Registered for Cisco-internal use. | ||||
|  */ | ||||
| #define DLT_CISCO_IOS	118 | ||||
|  | ||||
| /* | ||||
|  * For 802.11 cards using the Prism II chips, with a link-layer | ||||
|  * header including Prism monitor mode information plus an 802.11 | ||||
|  * header. | ||||
|  */ | ||||
| #define DLT_PRISM_HEADER	119 | ||||
|  | ||||
| /* | ||||
|  * Reserved for Aironet 802.11 cards, with an Aironet link-layer header | ||||
|  * (see Doug Ambrisko's FreeBSD patches). | ||||
|  */ | ||||
| #define DLT_AIRONET_HEADER	120 | ||||
|  | ||||
| /* | ||||
|  * Reserved for Siemens HiPath HDLC. | ||||
|  */ | ||||
| #define DLT_HHDLC		121 | ||||
|  | ||||
| /* | ||||
|  * This is for RFC 2625 IP-over-Fibre Channel. | ||||
|  * | ||||
|  * This is not for use with raw Fibre Channel, where the link-layer | ||||
|  * header starts with a Fibre Channel frame header; it's for IP-over-FC, | ||||
|  * where the link-layer header starts with an RFC 2625 Network_Header | ||||
|  * field. | ||||
|  */ | ||||
| #define DLT_IP_OVER_FC		122 | ||||
|  | ||||
| /* | ||||
|  * This is for Full Frontal ATM on Solaris with SunATM, with a | ||||
|  * pseudo-header followed by an AALn PDU. | ||||
|  * | ||||
|  * There may be other forms of Full Frontal ATM on other OSes, | ||||
|  * with different pseudo-headers. | ||||
|  * | ||||
|  * If ATM software returns a pseudo-header with VPI/VCI information | ||||
|  * (and, ideally, packet type information, e.g. signalling, ILMI, | ||||
|  * LANE, LLC-multiplexed traffic, etc.), it should not use | ||||
|  * DLT_ATM_RFC1483, but should get a new DLT_ value, so tcpdump | ||||
|  * and the like don't have to infer the presence or absence of a | ||||
|  * pseudo-header and the form of the pseudo-header. | ||||
|  */ | ||||
| #define DLT_SUNATM		123	/* Solaris+SunATM */ | ||||
|  | ||||
| /*  | ||||
|  * Reserved as per request from Kent Dahlgren <kent@praesum.com> | ||||
|  * for private use. | ||||
|  */ | ||||
| #define DLT_RIO                 124     /* RapidIO */ | ||||
| #define DLT_PCI_EXP             125     /* PCI Express */ | ||||
| #define DLT_AURORA              126     /* Xilinx Aurora link layer */ | ||||
|  | ||||
| /* | ||||
|  * Header for 802.11 plus a number of bits of link-layer information | ||||
|  * including radio information, used by some recent BSD drivers as | ||||
|  * well as the madwifi Atheros driver for Linux. | ||||
|  */ | ||||
| #define DLT_IEEE802_11_RADIO	127	/* 802.11 plus radiotap radio header */ | ||||
|  | ||||
| /* | ||||
|  * Reserved for the TZSP encapsulation, as per request from | ||||
|  * Chris Waters <chris.waters@networkchemistry.com> | ||||
|  * TZSP is a generic encapsulation for any other link type, | ||||
|  * which includes a means to include meta-information | ||||
|  * with the packet, e.g. signal strength and channel | ||||
|  * for 802.11 packets. | ||||
|  */ | ||||
| #define DLT_TZSP                128     /* Tazmen Sniffer Protocol */ | ||||
|  | ||||
| /* | ||||
|  * BSD's ARCNET headers have the source host, destination host, | ||||
|  * and type at the beginning of the packet; that's what's handed | ||||
|  * up to userland via BPF. | ||||
|  * | ||||
|  * Linux's ARCNET headers, however, have a 2-byte offset field | ||||
|  * between the host IDs and the type; that's what's handed up | ||||
|  * to userland via PF_PACKET sockets. | ||||
|  * | ||||
|  * We therefore have to have separate DLT_ values for them. | ||||
|  */ | ||||
| #define DLT_ARCNET_LINUX	129	/* ARCNET */ | ||||
|  | ||||
| /* | ||||
|  * Juniper-private data link types, as per request from | ||||
|  * Hannes Gredler <hannes@juniper.net>.  The DLT_s are used | ||||
|  * for passing on chassis-internal metainformation such as | ||||
|  * QOS profiles, etc.. | ||||
|  */ | ||||
| #define DLT_JUNIPER_MLPPP       130 | ||||
| #define DLT_JUNIPER_MLFR        131 | ||||
| #define DLT_JUNIPER_ES          132 | ||||
| #define DLT_JUNIPER_GGSN        133 | ||||
| #define DLT_JUNIPER_MFR         134 | ||||
| #define DLT_JUNIPER_ATM2        135 | ||||
| #define DLT_JUNIPER_SERVICES    136 | ||||
| #define DLT_JUNIPER_ATM1        137 | ||||
|  | ||||
| /* | ||||
|  * Apple IP-over-IEEE 1394, as per a request from Dieter Siegmund | ||||
|  * <dieter@apple.com>.  The header that's presented is an Ethernet-like | ||||
|  * header: | ||||
|  * | ||||
|  *	#define FIREWIRE_EUI64_LEN	8 | ||||
|  *	struct firewire_header { | ||||
|  *		u_char  firewire_dhost[FIREWIRE_EUI64_LEN]; | ||||
|  *		u_char  firewire_shost[FIREWIRE_EUI64_LEN]; | ||||
|  *		u_short firewire_type; | ||||
|  *	}; | ||||
|  * | ||||
|  * with "firewire_type" being an Ethernet type value, rather than, | ||||
|  * for example, raw GASP frames being handed up. | ||||
|  */ | ||||
| #define DLT_APPLE_IP_OVER_IEEE1394	138 | ||||
|  | ||||
| /* | ||||
|  * Various SS7 encapsulations, as per a request from Jeff Morriss | ||||
|  * <jeff.morriss[AT]ulticom.com> and subsequent discussions. | ||||
|  */ | ||||
| #define DLT_MTP2_WITH_PHDR	139	/* pseudo-header with various info, followed by MTP2 */ | ||||
| #define DLT_MTP2		140	/* MTP2, without pseudo-header */ | ||||
| #define DLT_MTP3		141	/* MTP3, without pseudo-header or MTP2 */ | ||||
| #define DLT_SCCP		142	/* SCCP, without pseudo-header or MTP2 or MTP3 */ | ||||
|  | ||||
| /* | ||||
|  * DOCSIS MAC frames. | ||||
|  */ | ||||
| #define DLT_DOCSIS		143 | ||||
|  | ||||
| /* | ||||
|  * Linux-IrDA packets. Protocol defined at http://www.irda.org. | ||||
|  * Those packets include IrLAP headers and above (IrLMP...), but | ||||
|  * don't include Phy framing (SOF/EOF/CRC & byte stuffing), because Phy | ||||
|  * framing can be handled by the hardware and depend on the bitrate. | ||||
|  * This is exactly the format you would get capturing on a Linux-IrDA | ||||
|  * interface (irdaX), but not on a raw serial port. | ||||
|  * Note the capture is done in "Linux-cooked" mode, so each packet include | ||||
|  * a fake packet header (struct sll_header). This is because IrDA packet | ||||
|  * decoding is dependant on the direction of the packet (incomming or | ||||
|  * outgoing). | ||||
|  * When/if other platform implement IrDA capture, we may revisit the | ||||
|  * issue and define a real DLT_IRDA... | ||||
|  * Jean II | ||||
|  */ | ||||
| #define DLT_LINUX_IRDA		144 | ||||
|  | ||||
| /* | ||||
|  * Reserved for IBM SP switch and IBM Next Federation switch. | ||||
|  */ | ||||
| #define DLT_IBM_SP		145 | ||||
| #define DLT_IBM_SN		146 | ||||
|  | ||||
| /* | ||||
|  * Reserved for private use.  If you have some link-layer header type | ||||
|  * that you want to use within your organization, with the capture files | ||||
|  * using that link-layer header type not ever be sent outside your | ||||
|  * organization, you can use these values. | ||||
|  * | ||||
|  * No libpcap release will use these for any purpose, nor will any | ||||
|  * tcpdump release use them, either. | ||||
|  * | ||||
|  * Do *NOT* use these in capture files that you expect anybody not using | ||||
|  * your private versions of capture-file-reading tools to read; in | ||||
|  * particular, do *NOT* use them in products, otherwise you may find that | ||||
|  * people won't be able to use tcpdump, or snort, or Ethereal, or... to | ||||
|  * read capture files from your firewall/intrusion detection/traffic | ||||
|  * monitoring/etc. appliance, or whatever product uses that DLT_ value, | ||||
|  * and you may also find that the developers of those applications will | ||||
|  * not accept patches to let them read those files. | ||||
|  * | ||||
|  * Also, do not use them if somebody might send you a capture using them | ||||
|  * for *their* private type and tools using them for *your* private type | ||||
|  * would have to read them. | ||||
|  * | ||||
|  * Instead, ask "tcpdump-workers@lists.tcpdump.org" for a new DLT_ value, | ||||
|  * as per the comment above, and use the type you're given. | ||||
|  */ | ||||
| #define DLT_USER0		147 | ||||
| #define DLT_USER1		148 | ||||
| #define DLT_USER2		149 | ||||
| #define DLT_USER3		150 | ||||
| #define DLT_USER4		151 | ||||
| #define DLT_USER5		152 | ||||
| #define DLT_USER6		153 | ||||
| #define DLT_USER7		154 | ||||
| #define DLT_USER8		155 | ||||
| #define DLT_USER9		156 | ||||
| #define DLT_USER10		157 | ||||
| #define DLT_USER11		158 | ||||
| #define DLT_USER12		159 | ||||
| #define DLT_USER13		160 | ||||
| #define DLT_USER14		161 | ||||
| #define DLT_USER15		162 | ||||
|  | ||||
| /* | ||||
|  * For future use with 802.11 captures - defined by AbsoluteValue | ||||
|  * Systems to store a number of bits of link-layer information | ||||
|  * including radio information: | ||||
|  * | ||||
|  *	http://www.shaftnet.org/~pizza/software/capturefrm.txt | ||||
|  * | ||||
|  * but it might be used by some non-AVS drivers now or in the | ||||
|  * future. | ||||
|  */ | ||||
| #define DLT_IEEE802_11_RADIO_AVS 163	/* 802.11 plus AVS radio header */ | ||||
|  | ||||
| /* | ||||
|  * Juniper-private data link type, as per request from | ||||
|  * Hannes Gredler <hannes@juniper.net>.  The DLT_s are used | ||||
|  * for passing on chassis-internal metainformation such as | ||||
|  * QOS profiles, etc.. | ||||
|  */ | ||||
| #define DLT_JUNIPER_MONITOR     164 | ||||
|  | ||||
| /* | ||||
|  * Reserved for BACnet MS/TP. | ||||
|  */ | ||||
| #define DLT_BACNET_MS_TP	165 | ||||
|  | ||||
| /* | ||||
|  * Another PPP variant as per request from Karsten Keil <kkeil@suse.de>. | ||||
|  * | ||||
|  * This is used in some OSes to allow a kernel socket filter to distinguish | ||||
|  * between incoming and outgoing packets, on a socket intended to | ||||
|  * supply pppd with outgoing packets so it can do dial-on-demand and | ||||
|  * hangup-on-lack-of-demand; incoming packets are filtered out so they | ||||
|  * don't cause pppd to hold the connection up (you don't want random | ||||
|  * input packets such as port scans, packets from old lost connections, | ||||
|  * etc. to force the connection to stay up). | ||||
|  * | ||||
|  * The first byte of the PPP header (0xff03) is modified to accomodate | ||||
|  * the direction - 0x00 = IN, 0x01 = OUT. | ||||
|  */ | ||||
| #define DLT_PPP_PPPD		166 | ||||
|  | ||||
| /* | ||||
|  * Names for backwards compatibility with older versions of some PPP | ||||
|  * software; new software should use DLT_PPP_PPPD. | ||||
|  */ | ||||
| #define DLT_PPP_WITH_DIRECTION	DLT_PPP_PPPD | ||||
| #define DLT_LINUX_PPP_WITHDIRECTION	DLT_PPP_PPPD | ||||
|  | ||||
| /* | ||||
|  * Juniper-private data link type, as per request from | ||||
|  * Hannes Gredler <hannes@juniper.net>.  The DLT_s are used | ||||
|  * for passing on chassis-internal metainformation such as | ||||
|  * QOS profiles, cookies, etc.. | ||||
|  */ | ||||
| #define DLT_JUNIPER_PPPOE       167 | ||||
| #define DLT_JUNIPER_PPPOE_ATM   168 | ||||
|  | ||||
| #define DLT_GPRS_LLC		169	/* GPRS LLC */ | ||||
| #define DLT_GPF_T		170	/* GPF-T (ITU-T G.7041/Y.1303) */ | ||||
| #define DLT_GPF_F		171	/* GPF-F (ITU-T G.7041/Y.1303) */ | ||||
|  | ||||
| /* | ||||
|  * Requested by Oolan Zimmer <oz@gcom.com> for use in Gcom's T1/E1 line | ||||
|  * monitoring equipment. | ||||
|  */ | ||||
| #define DLT_GCOM_T1E1		172 | ||||
| #define DLT_GCOM_SERIAL		173 | ||||
|  | ||||
| /* | ||||
|  * Juniper-private data link type, as per request from | ||||
|  * Hannes Gredler <hannes@juniper.net>.  The DLT_ is used | ||||
|  * for internal communication to Physical Interface Cards (PIC) | ||||
|  */ | ||||
| #define DLT_JUNIPER_PIC_PEER    174 | ||||
|  | ||||
| /* | ||||
|  * Link types requested by Gregor Maier <gregor@endace.com> of Endace | ||||
|  * Measurement Systems.  They add an ERF header (see | ||||
|  * http://www.endace.com/support/EndaceRecordFormat.pdf) in front of | ||||
|  * the link-layer header. | ||||
|  */ | ||||
| #define DLT_ERF_ETH		175	/* Ethernet */ | ||||
| #define DLT_ERF_POS		176	/* Packet-over-SONET */ | ||||
|  | ||||
| /* | ||||
|  * Requested by Daniele Orlandi <daniele@orlandi.com> for raw LAPD | ||||
|  * for vISDN (http://www.orlandi.com/visdn/).  Its link-layer header | ||||
|  * includes additional information before the LAPD header, so it's | ||||
|  * not necessarily a generic LAPD header. | ||||
|  */ | ||||
| #define DLT_LINUX_LAPD		177 | ||||
|  | ||||
| /* | ||||
|  * Juniper-private data link type, as per request from | ||||
|  * Hannes Gredler <hannes@juniper.net>.  | ||||
|  * The DLT_ are used for prepending meta-information | ||||
|  * like interface index, interface name | ||||
|  * before standard Ethernet, PPP, Frelay & C-HDLC Frames | ||||
|  */ | ||||
| #define DLT_JUNIPER_ETHER       178 | ||||
| #define DLT_JUNIPER_PPP         179 | ||||
| #define DLT_JUNIPER_FRELAY      180 | ||||
| #define DLT_JUNIPER_CHDLC       181 | ||||
|  | ||||
| /* | ||||
|  * Multi Link Frame Relay (FRF.16) | ||||
|  */ | ||||
| #define DLT_MFR                 182 | ||||
|  | ||||
| /* | ||||
|  * Juniper-private data link type, as per request from | ||||
|  * Hannes Gredler <hannes@juniper.net>.  | ||||
|  * The DLT_ is used for internal communication with a | ||||
|  * voice Adapter Card (PIC) | ||||
|  */ | ||||
| #define DLT_JUNIPER_VP          183 | ||||
|  | ||||
| /* | ||||
|  * Arinc 429 frames. | ||||
|  * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>. | ||||
|  * Every frame contains a 32bit A429 label. | ||||
|  * More documentation on Arinc 429 can be found at | ||||
|  * http://www.condoreng.com/support/downloads/tutorials/ARINCTutorial.pdf | ||||
|  */ | ||||
| #define DLT_A429                184 | ||||
|  | ||||
| /* | ||||
|  * Arinc 653 Interpartition Communication messages. | ||||
|  * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>. | ||||
|  * Please refer to the A653-1 standard for more information. | ||||
|  */ | ||||
| #define DLT_A653_ICM            185 | ||||
|  | ||||
| /* | ||||
|  * USB packets, beginning with a USB setup header; requested by | ||||
|  * Paolo Abeni <paolo.abeni@email.it>. | ||||
|  */ | ||||
| #define DLT_USB			186 | ||||
|  | ||||
| /* | ||||
|  * Bluetooth HCI UART transport layer (part H:4); requested by | ||||
|  * Paolo Abeni. | ||||
|  */ | ||||
| #define DLT_BLUETOOTH_HCI_H4	187 | ||||
|  | ||||
| /* | ||||
|  * IEEE 802.16 MAC Common Part Sublayer; requested by Maria Cruz | ||||
|  * <cruz_petagay@bah.com>. | ||||
|  */ | ||||
| #define DLT_IEEE802_16_MAC_CPS	188 | ||||
|  | ||||
| /* | ||||
|  * USB packets, beginning with a Linux USB header; requested by | ||||
|  * Paolo Abeni <paolo.abeni@email.it>. | ||||
|  */ | ||||
| #define DLT_USB_LINUX		189 | ||||
|  | ||||
| /* | ||||
|  * Controller Area Network (CAN) v. 2.0B packets. | ||||
|  * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>. | ||||
|  * Used to dump CAN packets coming from a CAN Vector board. | ||||
|  * More documentation on the CAN v2.0B frames can be found at | ||||
|  * http://www.can-cia.org/downloads/?269 | ||||
|  */ | ||||
| #define DLT_CAN20B              190 | ||||
|  | ||||
| /* | ||||
|  * IEEE 802.15.4, with address fields padded, as is done by Linux | ||||
|  * drivers; requested by Juergen Schimmer. | ||||
|  */ | ||||
| #define DLT_IEEE802_15_4_LINUX	191 | ||||
|  | ||||
| /* | ||||
|  * Per Packet Information encapsulated packets. | ||||
|  * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>. | ||||
|  */ | ||||
| #define DLT_PPI			192 | ||||
|  | ||||
| /* | ||||
|  * Header for 802.16 MAC Common Part Sublayer plus a radiotap radio header; | ||||
|  * requested by Charles Clancy. | ||||
|  */ | ||||
| #define DLT_IEEE802_16_MAC_CPS_RADIO	193 | ||||
|  | ||||
| /* | ||||
|  * Juniper-private data link type, as per request from | ||||
|  * Hannes Gredler <hannes@juniper.net>.  | ||||
|  * The DLT_ is used for internal communication with a | ||||
|  * integrated service module (ISM). | ||||
|  */ | ||||
| #define DLT_JUNIPER_ISM         194 | ||||
|  | ||||
| /* | ||||
|  * IEEE 802.15.4, exactly as it appears in the spec (no padding, no | ||||
|  * nothing); requested by Mikko Saarnivala <mikko.saarnivala@sensinode.com>. | ||||
|  */ | ||||
| #define DLT_IEEE802_15_4	195 | ||||
|  | ||||
| /* | ||||
|  * Various link-layer types, with a pseudo-header, for SITA | ||||
|  * (http://www.sita.aero/); requested by Fulko Hew (fulko.hew@gmail.com). | ||||
|  */ | ||||
| #define DLT_SITA		196 | ||||
|  | ||||
| /* | ||||
|  * Various link-layer types, with a pseudo-header, for Endace DAG cards; | ||||
|  * encapsulates Endace ERF records.  Requested by Stephen Donnelly | ||||
|  * <stephen@endace.com>. | ||||
|  */ | ||||
| #define DLT_ERF			197 | ||||
|  | ||||
| /* | ||||
|  * Special header prepended to Ethernet packets when capturing from a | ||||
|  * u10 Networks board.  Requested by Phil Mulholland | ||||
|  * <phil@u10networks.com>. | ||||
|  */ | ||||
| #define DLT_RAIF1		198 | ||||
|  | ||||
| /* | ||||
|  * IPMB packet for IPMI, beginning with the I2C slave address, followed | ||||
|  * by the netFn and LUN, etc..  Requested by Chanthy Toeung | ||||
|  * <chanthy.toeung@ca.kontron.com>. | ||||
|  */ | ||||
| #define DLT_IPMB		199 | ||||
|  | ||||
| /* | ||||
|  * Juniper-private data link type, as per request from | ||||
|  * Hannes Gredler <hannes@juniper.net>.  | ||||
|  * The DLT_ is used for capturing data on a secure tunnel interface. | ||||
|  */ | ||||
| #define DLT_JUNIPER_ST          200 | ||||
|  | ||||
| /* | ||||
|  * Bluetooth HCI UART transport layer (part H:4), with pseudo-header | ||||
|  * that includes direction information; requested by Paolo Abeni. | ||||
|  */ | ||||
| #define DLT_BLUETOOTH_HCI_H4_WITH_PHDR	201 | ||||
|  | ||||
| /* | ||||
|  * AX.25 packet with a 1-byte KISS header; see | ||||
|  * | ||||
|  *	http://www.ax25.net/kiss.htm | ||||
|  * | ||||
|  * as per Richard Stearn <richard@rns-stearn.demon.co.uk>. | ||||
|  */ | ||||
| #define DLT_AX25_KISS		202 | ||||
|  | ||||
| /* | ||||
|  * LAPD packets from an ISDN channel, starting with the address field, | ||||
|  * with no pseudo-header. | ||||
|  * Requested by Varuna De Silva <varunax@gmail.com>. | ||||
|  */ | ||||
| #define DLT_LAPD		203 | ||||
|  | ||||
| /* | ||||
|  * Variants of various link-layer headers, with a one-byte direction | ||||
|  * pseudo-header prepended - zero means "received by this host", | ||||
|  * non-zero (any non-zero value) means "sent by this host" - as per | ||||
|  * Will Barker <w.barker@zen.co.uk>. | ||||
|  */ | ||||
| #define DLT_PPP_WITH_DIR	204	/* PPP - don't confuse with DLT_PPP_WITH_DIRECTION */ | ||||
| #define DLT_C_HDLC_WITH_DIR	205	/* Cisco HDLC */ | ||||
| #define DLT_FRELAY_WITH_DIR	206	/* Frame Relay */ | ||||
| #define DLT_LAPB_WITH_DIR	207	/* LAPB */ | ||||
|  | ||||
| /* | ||||
|  * 208 is reserved for an as-yet-unspecified proprietary link-layer | ||||
|  * type, as requested by Will Barker. | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * IPMB with a Linux-specific pseudo-header; as requested by Alexey Neyman | ||||
|  * <avn@pigeonpoint.com>. | ||||
|  */ | ||||
| #define DLT_IPMB_LINUX		209 | ||||
|  | ||||
| /* | ||||
|  * FlexRay automotive bus - http://www.flexray.com/ - as requested | ||||
|  * by Hannes Kaelber <hannes.kaelber@x2e.de>. | ||||
|  */ | ||||
| #define DLT_FLEXRAY		210 | ||||
|  | ||||
| /* | ||||
|  * Media Oriented Systems Transport (MOST) bus for multimedia | ||||
|  * transport - http://www.mostcooperation.com/ - as requested | ||||
|  * by Hannes Kaelber <hannes.kaelber@x2e.de>. | ||||
|  */ | ||||
| #define DLT_MOST		211 | ||||
|  | ||||
| /* | ||||
|  * Local Interconnect Network (LIN) bus for vehicle networks - | ||||
|  * http://www.lin-subbus.org/ - as requested by Hannes Kaelber | ||||
|  * <hannes.kaelber@x2e.de>. | ||||
|  */ | ||||
| #define DLT_LIN			212 | ||||
|  | ||||
| /* | ||||
|  * X2E-private data link type used for serial line capture, | ||||
|  * as requested by Hannes Kaelber <hannes.kaelber@x2e.de>. | ||||
|  */ | ||||
| #define DLT_X2E_SERIAL		213 | ||||
|  | ||||
| /* | ||||
|  * X2E-private data link type used for the Xoraya data logger | ||||
|  * family, as requested by Hannes Kaelber <hannes.kaelber@x2e.de>. | ||||
|  */ | ||||
| #define DLT_X2E_XORAYA		214 | ||||
|  | ||||
| /* | ||||
|  * IEEE 802.15.4, exactly as it appears in the spec (no padding, no | ||||
|  * nothing), but with the PHY-level data for non-ASK PHYs (4 octets | ||||
|  * of 0 as preamble, one octet of SFD, one octet of frame length+ | ||||
|  * reserved bit, and then the MAC-layer data, starting with the | ||||
|  * frame control field). | ||||
|  * | ||||
|  * Requested by Max Filippov <jcmvbkbc@gmail.com>. | ||||
|  */ | ||||
| #define DLT_IEEE802_15_4_NONASK_PHY	215 | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * DLT and savefile link type values are split into a class and | ||||
|  * a member of that class.  A class value of 0 indicates a regular | ||||
|  * DLT_/LINKTYPE_ value. | ||||
|  */ | ||||
| #define DLT_CLASS(x)		((x) & 0x03ff0000) | ||||
|  | ||||
| /* | ||||
|  * NetBSD-specific generic "raw" link type.  The class value indicates | ||||
|  * that this is the generic raw type, and the lower 16 bits are the | ||||
|  * address family we're dealing with.  Those values are NetBSD-specific; | ||||
|  * do not assume that they correspond to AF_ values for your operating | ||||
|  * system. | ||||
|  */ | ||||
| #define	DLT_CLASS_NETBSD_RAWAF	0x02240000 | ||||
| #define	DLT_NETBSD_RAWAF(af)	(DLT_CLASS_NETBSD_RAWAF | (af)) | ||||
| #define	DLT_NETBSD_RAWAF_AF(x)	((x) & 0x0000ffff) | ||||
| #define	DLT_IS_NETBSD_RAWAF(x)	(DLT_CLASS(x) == DLT_CLASS_NETBSD_RAWAF) | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * The instruction encodings. | ||||
|  */ | ||||
| /* instruction classes */ | ||||
| #define BPF_CLASS(code) ((code) & 0x07) | ||||
| #define		BPF_LD		0x00 | ||||
| #define		BPF_LDX		0x01 | ||||
| #define		BPF_ST		0x02 | ||||
| #define		BPF_STX		0x03 | ||||
| #define		BPF_ALU		0x04 | ||||
| #define		BPF_JMP		0x05 | ||||
| #define		BPF_RET		0x06 | ||||
| #define		BPF_MISC	0x07 | ||||
|  | ||||
| /* ld/ldx fields */ | ||||
| #define BPF_SIZE(code)	((code) & 0x18) | ||||
| #define		BPF_W		0x00 | ||||
| #define		BPF_H		0x08 | ||||
| #define		BPF_B		0x10 | ||||
| #define BPF_MODE(code)	((code) & 0xe0) | ||||
| #define		BPF_IMM 	0x00 | ||||
| #define		BPF_ABS		0x20 | ||||
| #define		BPF_IND		0x40 | ||||
| #define		BPF_MEM		0x60 | ||||
| #define		BPF_LEN		0x80 | ||||
| #define		BPF_MSH		0xa0 | ||||
|  | ||||
| /* alu/jmp fields */ | ||||
| #define BPF_OP(code)	((code) & 0xf0) | ||||
| #define		BPF_ADD		0x00 | ||||
| #define		BPF_SUB		0x10 | ||||
| #define		BPF_MUL		0x20 | ||||
| #define		BPF_DIV		0x30 | ||||
| #define		BPF_OR		0x40 | ||||
| #define		BPF_AND		0x50 | ||||
| #define		BPF_LSH		0x60 | ||||
| #define		BPF_RSH		0x70 | ||||
| #define		BPF_NEG		0x80 | ||||
| #define		BPF_JA		0x00 | ||||
| #define		BPF_JEQ		0x10 | ||||
| #define		BPF_JGT		0x20 | ||||
| #define		BPF_JGE		0x30 | ||||
| #define		BPF_JSET	0x40 | ||||
| #define BPF_SRC(code)	((code) & 0x08) | ||||
| #define		BPF_K		0x00 | ||||
| #define		BPF_X		0x08 | ||||
|  | ||||
| /* ret - BPF_K and BPF_X also apply */ | ||||
| #define BPF_RVAL(code)	((code) & 0x18) | ||||
| #define		BPF_A		0x10 | ||||
|  | ||||
| /* misc */ | ||||
| #define BPF_MISCOP(code) ((code) & 0xf8) | ||||
| #define		BPF_TAX		0x00 | ||||
| #define		BPF_TXA		0x80 | ||||
|  | ||||
| /* | ||||
|  * The instruction data structure. | ||||
|  */ | ||||
| struct bpf_insn { | ||||
| 	u_short	code; | ||||
| 	u_char 	jt; | ||||
| 	u_char 	jf; | ||||
| 	bpf_u_int32 k; | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * Macros for insn array initializers. | ||||
|  */ | ||||
| #define BPF_STMT(code, k) { (u_short)(code), 0, 0, k } | ||||
| #define BPF_JUMP(code, k, jt, jf) { (u_short)(code), jt, jf, k } | ||||
|  | ||||
| #if __STDC__ || defined(__cplusplus) | ||||
| extern int bpf_validate(const struct bpf_insn *, int); | ||||
| extern u_int bpf_filter(const struct bpf_insn *, const u_char *, u_int, u_int); | ||||
| #else | ||||
| extern int bpf_validate(); | ||||
| extern u_int bpf_filter(); | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Number of scratch memory words (for BPF_LD|BPF_MEM and BPF_ST). | ||||
|  */ | ||||
| #define BPF_MEMWORDS 16 | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
| @@ -0,0 +1,89 @@ | ||||
| /* | ||||
|  * Copyright (c) 1994, 1996 | ||||
|  *	The Regents of the University of California.  All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. All advertising materials mentioning features or use of this software | ||||
|  *    must display the following acknowledgement: | ||||
|  *	This product includes software developed by the Computer Systems | ||||
|  *	Engineering Group at Lawrence Berkeley Laboratory. | ||||
|  * 4. Neither the name of the University nor of the Laboratory may be used | ||||
|  *    to endorse or promote products derived from this software without | ||||
|  *    specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  * | ||||
|  * @(#) $Header: /tcpdump/master/libpcap/pcap/namedb.h,v 1.1 2006/10/04 18:09:22 guy Exp $ (LBL) | ||||
|  */ | ||||
|  | ||||
| #ifndef lib_pcap_namedb_h | ||||
| #define lib_pcap_namedb_h | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * As returned by the pcap_next_etherent() | ||||
|  * XXX this stuff doesn't belong in this interface, but this | ||||
|  * library already must do name to address translation, so | ||||
|  * on systems that don't have support for /etc/ethers, we | ||||
|  * export these hooks since they'll | ||||
|  */ | ||||
| struct pcap_etherent { | ||||
| 	u_char addr[6]; | ||||
| 	char name[122]; | ||||
| }; | ||||
| #ifndef PCAP_ETHERS_FILE | ||||
| #define PCAP_ETHERS_FILE "/etc/ethers" | ||||
| #endif | ||||
| struct	pcap_etherent *pcap_next_etherent(FILE *); | ||||
| u_char *pcap_ether_hostton(const char*); | ||||
| u_char *pcap_ether_aton(const char *); | ||||
|  | ||||
| bpf_u_int32 **pcap_nametoaddr(const char *); | ||||
| #ifdef INET6 | ||||
| struct addrinfo *pcap_nametoaddrinfo(const char *); | ||||
| #endif | ||||
| bpf_u_int32 pcap_nametonetaddr(const char *); | ||||
|  | ||||
| int	pcap_nametoport(const char *, int *, int *); | ||||
| int	pcap_nametoportrange(const char *, int *, int *, int *); | ||||
| int	pcap_nametoproto(const char *); | ||||
| int	pcap_nametoeproto(const char *); | ||||
| int	pcap_nametollc(const char *); | ||||
| /* | ||||
|  * If a protocol is unknown, PROTO_UNDEF is returned. | ||||
|  * Also, pcap_nametoport() returns the protocol along with the port number. | ||||
|  * If there are ambiguous entried in /etc/services (i.e. domain | ||||
|  * can be either tcp or udp) PROTO_UNDEF is returned. | ||||
|  */ | ||||
| #define PROTO_UNDEF		-1 | ||||
|  | ||||
| /* XXX move these to pcap-int.h? */ | ||||
| int __pcap_atodn(const char *, bpf_u_int32 *); | ||||
| int __pcap_atoin(const char *, bpf_u_int32 *); | ||||
| u_short	__pcap_nametodnaddr(const char *); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
| @@ -0,0 +1,407 @@ | ||||
| /* -*- Mode: c; tab-width: 8; indent-tabs-mode: 1; c-basic-offset: 8; -*- */ | ||||
| /* | ||||
|  * Copyright (c) 1993, 1994, 1995, 1996, 1997 | ||||
|  *	The Regents of the University of California.  All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. All advertising materials mentioning features or use of this software | ||||
|  *    must display the following acknowledgement: | ||||
|  *	This product includes software developed by the Computer Systems | ||||
|  *	Engineering Group at Lawrence Berkeley Laboratory. | ||||
|  * 4. Neither the name of the University nor of the Laboratory may be used | ||||
|  *    to endorse or promote products derived from this software without | ||||
|  *    specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  * | ||||
|  * @(#) $Header: /tcpdump/master/libpcap/pcap/pcap.h,v 1.4.2.11 2008-10-06 15:38:39 gianluca Exp $ (LBL) | ||||
|  */ | ||||
|  | ||||
| #ifndef lib_pcap_pcap_h | ||||
| #define lib_pcap_pcap_h | ||||
|  | ||||
| #if defined(WIN32) | ||||
|   #include <pcap-stdinc.h> | ||||
| #elif defined(MSDOS) | ||||
|   #include <sys/types.h> | ||||
|   #include <sys/socket.h>  /* u_int, u_char etc. */ | ||||
| #else /* UN*X */ | ||||
|   #include <sys/types.h> | ||||
|   #include <sys/time.h> | ||||
| #endif /* WIN32/MSDOS/UN*X */ | ||||
|  | ||||
| #ifndef PCAP_DONT_INCLUDE_PCAP_BPF_H | ||||
| #include <pcap/bpf.h> | ||||
| #endif | ||||
|  | ||||
| #include <stdio.h> | ||||
|  | ||||
| #ifdef HAVE_REMOTE | ||||
| 	// We have to define the SOCKET here, although it has been defined in sockutils.h | ||||
| 	// This is to avoid the distribution of the 'sockutils.h' file around | ||||
| 	// (for example in the WinPcap developer's pack) | ||||
| 	#ifndef SOCKET | ||||
| 		#ifdef WIN32 | ||||
| 			#define SOCKET unsigned int | ||||
| 		#else | ||||
| 			#define SOCKET int | ||||
| 		#endif | ||||
| 	#endif | ||||
| #endif | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| #define PCAP_VERSION_MAJOR 2 | ||||
| #define PCAP_VERSION_MINOR 4 | ||||
|  | ||||
| #define PCAP_ERRBUF_SIZE 256 | ||||
|  | ||||
| /* | ||||
|  * Compatibility for systems that have a bpf.h that | ||||
|  * predates the bpf typedefs for 64-bit support. | ||||
|  */ | ||||
| #if BPF_RELEASE - 0 < 199406 | ||||
| typedef	int bpf_int32; | ||||
| typedef	u_int bpf_u_int32; | ||||
| #endif | ||||
|  | ||||
| typedef struct pcap pcap_t; | ||||
| typedef struct pcap_dumper pcap_dumper_t; | ||||
| typedef struct pcap_if pcap_if_t; | ||||
| typedef struct pcap_addr pcap_addr_t; | ||||
|  | ||||
| /* | ||||
|  * The first record in the file contains saved values for some | ||||
|  * of the flags used in the printout phases of tcpdump. | ||||
|  * Many fields here are 32 bit ints so compilers won't insert unwanted | ||||
|  * padding; these files need to be interchangeable across architectures. | ||||
|  * | ||||
|  * Do not change the layout of this structure, in any way (this includes | ||||
|  * changes that only affect the length of fields in this structure). | ||||
|  * | ||||
|  * Also, do not change the interpretation of any of the members of this | ||||
|  * structure, in any way (this includes using values other than | ||||
|  * LINKTYPE_ values, as defined in "savefile.c", in the "linktype" | ||||
|  * field). | ||||
|  * | ||||
|  * Instead: | ||||
|  * | ||||
|  *	introduce a new structure for the new format, if the layout | ||||
|  *	of the structure changed; | ||||
|  * | ||||
|  *	send mail to "tcpdump-workers@lists.tcpdump.org", requesting | ||||
|  *	a new magic number for your new capture file format, and, when | ||||
|  *	you get the new magic number, put it in "savefile.c"; | ||||
|  * | ||||
|  *	use that magic number for save files with the changed file | ||||
|  *	header; | ||||
|  * | ||||
|  *	make the code in "savefile.c" capable of reading files with | ||||
|  *	the old file header as well as files with the new file header | ||||
|  *	(using the magic number to determine the header format). | ||||
|  * | ||||
|  * Then supply the changes as a patch at | ||||
|  * | ||||
|  *	http://sourceforge.net/projects/libpcap/ | ||||
|  * | ||||
|  * so that future versions of libpcap and programs that use it (such as | ||||
|  * tcpdump) will be able to read your new capture file format. | ||||
|  */ | ||||
| struct pcap_file_header { | ||||
| 	bpf_u_int32 magic; | ||||
| 	u_short version_major; | ||||
| 	u_short version_minor; | ||||
| 	bpf_int32 thiszone;	/* gmt to local correction */ | ||||
| 	bpf_u_int32 sigfigs;	/* accuracy of timestamps */ | ||||
| 	bpf_u_int32 snaplen;	/* max length saved portion of each pkt */ | ||||
| 	bpf_u_int32 linktype;	/* data link type (LINKTYPE_*) */ | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * Macros for the value returned by pcap_datalink_ext(). | ||||
|  *  | ||||
|  * If LT_FCS_LENGTH_PRESENT(x) is true, the LT_FCS_LENGTH(x) macro | ||||
|  * gives the FCS length of packets in the capture. | ||||
|  */ | ||||
| #define LT_FCS_LENGTH_PRESENT(x)	((x) & 0x04000000) | ||||
| #define LT_FCS_LENGTH(x)		(((x) & 0xF0000000) >> 28) | ||||
| #define LT_FCS_DATALINK_EXT(x)		((((x) & 0xF) << 28) | 0x04000000) | ||||
|  | ||||
| typedef enum { | ||||
|        PCAP_D_INOUT = 0, | ||||
|        PCAP_D_IN, | ||||
|        PCAP_D_OUT | ||||
| } pcap_direction_t; | ||||
|  | ||||
| /* | ||||
|  * Generic per-packet information, as supplied by libpcap. | ||||
|  * | ||||
|  * The time stamp can and should be a "struct timeval", regardless of | ||||
|  * whether your system supports 32-bit tv_sec in "struct timeval", | ||||
|  * 64-bit tv_sec in "struct timeval", or both if it supports both 32-bit | ||||
|  * and 64-bit applications.  The on-disk format of savefiles uses 32-bit | ||||
|  * tv_sec (and tv_usec); this structure is irrelevant to that.  32-bit | ||||
|  * and 64-bit versions of libpcap, even if they're on the same platform, | ||||
|  * should supply the appropriate version of "struct timeval", even if | ||||
|  * that's not what the underlying packet capture mechanism supplies. | ||||
|  */ | ||||
| struct pcap_pkthdr { | ||||
| 	struct timeval ts;	/* time stamp */ | ||||
| 	bpf_u_int32 caplen;	/* length of portion present */ | ||||
| 	bpf_u_int32 len;	/* length this packet (off wire) */ | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * As returned by the pcap_stats() | ||||
|  */ | ||||
| struct pcap_stat { | ||||
| 	u_int ps_recv;		/* number of packets received */ | ||||
| 	u_int ps_drop;		/* number of packets dropped */ | ||||
| 	u_int ps_ifdrop;	/* drops by interface XXX not yet supported */ | ||||
| #ifdef HAVE_REMOTE | ||||
| 	u_int ps_capt;		/* number of packets that are received by the application; please get rid off the Win32 ifdef */ | ||||
| 	u_int ps_sent;		/* number of packets sent by the server on the network */ | ||||
| 	u_int ps_netdrop;	/* number of packets lost on the network */ | ||||
| #endif /* HAVE_REMOTE */ | ||||
| }; | ||||
|  | ||||
| #ifdef MSDOS | ||||
| /* | ||||
|  * As returned by the pcap_stats_ex() | ||||
|  */ | ||||
| struct pcap_stat_ex { | ||||
|        u_long  rx_packets;        /* total packets received       */ | ||||
|        u_long  tx_packets;        /* total packets transmitted    */ | ||||
|        u_long  rx_bytes;          /* total bytes received         */ | ||||
|        u_long  tx_bytes;          /* total bytes transmitted      */ | ||||
|        u_long  rx_errors;         /* bad packets received         */ | ||||
|        u_long  tx_errors;         /* packet transmit problems     */ | ||||
|        u_long  rx_dropped;        /* no space in Rx buffers       */ | ||||
|        u_long  tx_dropped;        /* no space available for Tx    */ | ||||
|        u_long  multicast;         /* multicast packets received   */ | ||||
|        u_long  collisions; | ||||
|  | ||||
|        /* detailed rx_errors: */ | ||||
|        u_long  rx_length_errors; | ||||
|        u_long  rx_over_errors;    /* receiver ring buff overflow  */ | ||||
|        u_long  rx_crc_errors;     /* recv'd pkt with crc error    */ | ||||
|        u_long  rx_frame_errors;   /* recv'd frame alignment error */ | ||||
|        u_long  rx_fifo_errors;    /* recv'r fifo overrun          */ | ||||
|        u_long  rx_missed_errors;  /* recv'r missed packet         */ | ||||
|  | ||||
|        /* detailed tx_errors */ | ||||
|        u_long  tx_aborted_errors; | ||||
|        u_long  tx_carrier_errors; | ||||
|        u_long  tx_fifo_errors; | ||||
|        u_long  tx_heartbeat_errors; | ||||
|        u_long  tx_window_errors; | ||||
|      }; | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Item in a list of interfaces. | ||||
|  */ | ||||
| struct pcap_if { | ||||
| 	struct pcap_if *next; | ||||
| 	char *name;		/* name to hand to "pcap_open_live()" */ | ||||
| 	char *description;	/* textual description of interface, or NULL */ | ||||
| 	struct pcap_addr *addresses; | ||||
| 	bpf_u_int32 flags;	/* PCAP_IF_ interface flags */ | ||||
| }; | ||||
|  | ||||
| #define PCAP_IF_LOOPBACK	0x00000001	/* interface is loopback */ | ||||
|  | ||||
| /* | ||||
|  * Representation of an interface address. | ||||
|  */ | ||||
| struct pcap_addr { | ||||
| 	struct pcap_addr *next; | ||||
| 	struct sockaddr *addr;		/* address */ | ||||
| 	struct sockaddr *netmask;	/* netmask for that address */ | ||||
| 	struct sockaddr *broadaddr;	/* broadcast address for that address */ | ||||
| 	struct sockaddr *dstaddr;	/* P2P destination address for that address */ | ||||
| }; | ||||
|  | ||||
| typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *, | ||||
| 			     const u_char *); | ||||
|  | ||||
| /* | ||||
|  * Error codes for the pcap API. | ||||
|  * These will all be negative, so you can check for the success or | ||||
|  * failure of a call that returns these codes by checking for a | ||||
|  * negative value. | ||||
|  */ | ||||
| #define PCAP_ERROR			-1	/* generic error code */ | ||||
| #define PCAP_ERROR_BREAK		-2	/* loop terminated by pcap_breakloop */ | ||||
| #define PCAP_ERROR_NOT_ACTIVATED	-3	/* the capture needs to be activated */ | ||||
| #define PCAP_ERROR_ACTIVATED		-4	/* the operation can't be performed on already activated captures */ | ||||
| #define PCAP_ERROR_NO_SUCH_DEVICE	-5	/* no such device exists */ | ||||
| #define PCAP_ERROR_RFMON_NOTSUP		-6	/* this device doesn't support rfmon (monitor) mode */ | ||||
| #define PCAP_ERROR_NOT_RFMON		-7	/* operation supported only in monitor mode */ | ||||
| #define PCAP_ERROR_PERM_DENIED		-8	/* no permission to open the device */ | ||||
| #define PCAP_ERROR_IFACE_NOT_UP		-9	/* interface isn't up */ | ||||
|  | ||||
| /* | ||||
|  * Warning codes for the pcap API. | ||||
|  * These will all be positive and non-zero, so they won't look like | ||||
|  * errors. | ||||
|  */ | ||||
| #define PCAP_WARNING			1	/* generic warning code */ | ||||
| #define PCAP_WARNING_PROMISC_NOTSUP	2	/* this device doesn't support promiscuous mode */ | ||||
|  | ||||
| char	*pcap_lookupdev(char *); | ||||
| int	pcap_lookupnet(const char *, bpf_u_int32 *, bpf_u_int32 *, char *); | ||||
|  | ||||
| pcap_t	*pcap_create(const char *, char *); | ||||
| int	pcap_set_snaplen(pcap_t *, int); | ||||
| int	pcap_set_promisc(pcap_t *, int); | ||||
| int	pcap_can_set_rfmon(pcap_t *); | ||||
| int	pcap_set_rfmon(pcap_t *, int); | ||||
| int	pcap_set_timeout(pcap_t *, int); | ||||
| int	pcap_set_buffer_size(pcap_t *, int); | ||||
| int	pcap_activate(pcap_t *); | ||||
|  | ||||
| pcap_t	*pcap_open_live(const char *, int, int, int, char *); | ||||
| pcap_t	*pcap_open_dead(int, int); | ||||
| pcap_t	*pcap_open_offline(const char *, char *); | ||||
| #if defined(WIN32) | ||||
| pcap_t  *pcap_hopen_offline(intptr_t, char *); | ||||
| #if !defined(LIBPCAP_EXPORTS) | ||||
| #define pcap_fopen_offline(f,b) \ | ||||
| 	pcap_hopen_offline(_get_osfhandle(_fileno(f)), b) | ||||
| #else /*LIBPCAP_EXPORTS*/ | ||||
| static pcap_t *pcap_fopen_offline(FILE *, char *); | ||||
| #endif | ||||
| #else /*WIN32*/ | ||||
| pcap_t	*pcap_fopen_offline(FILE *, char *); | ||||
| #endif /*WIN32*/ | ||||
|  | ||||
| void	pcap_close(pcap_t *); | ||||
| int	pcap_loop(pcap_t *, int, pcap_handler, u_char *); | ||||
| int	pcap_dispatch(pcap_t *, int, pcap_handler, u_char *); | ||||
| const u_char* | ||||
| 	pcap_next(pcap_t *, struct pcap_pkthdr *); | ||||
| int 	pcap_next_ex(pcap_t *, struct pcap_pkthdr **, const u_char **); | ||||
| void	pcap_breakloop(pcap_t *); | ||||
| int	pcap_stats(pcap_t *, struct pcap_stat *); | ||||
| int	pcap_setfilter(pcap_t *, struct bpf_program *); | ||||
| int 	pcap_setdirection(pcap_t *, pcap_direction_t); | ||||
| int	pcap_getnonblock(pcap_t *, char *); | ||||
| int	pcap_setnonblock(pcap_t *, int, char *); | ||||
| int	pcap_inject(pcap_t *, const void *, size_t); | ||||
| int	pcap_sendpacket(pcap_t *, const u_char *, int); | ||||
| const char *pcap_statustostr(int); | ||||
| const char *pcap_strerror(int); | ||||
| char	*pcap_geterr(pcap_t *); | ||||
| void	pcap_perror(pcap_t *, char *); | ||||
| int	pcap_compile(pcap_t *, struct bpf_program *, const char *, int, | ||||
| 	    bpf_u_int32); | ||||
| int	pcap_compile_nopcap(int, int, struct bpf_program *, | ||||
| 	    const char *, int, bpf_u_int32); | ||||
| void	pcap_freecode(struct bpf_program *); | ||||
| int	pcap_offline_filter(struct bpf_program *, const struct pcap_pkthdr *, | ||||
| 	    const u_char *); | ||||
| int	pcap_datalink(pcap_t *); | ||||
| int	pcap_datalink_ext(pcap_t *); | ||||
| int	pcap_list_datalinks(pcap_t *, int **); | ||||
| int	pcap_set_datalink(pcap_t *, int); | ||||
| void	pcap_free_datalinks(int *); | ||||
| int	pcap_datalink_name_to_val(const char *); | ||||
| const char *pcap_datalink_val_to_name(int); | ||||
| const char *pcap_datalink_val_to_description(int); | ||||
| int	pcap_snapshot(pcap_t *); | ||||
| int	pcap_is_swapped(pcap_t *); | ||||
| int	pcap_major_version(pcap_t *); | ||||
| int	pcap_minor_version(pcap_t *); | ||||
|  | ||||
| /* XXX */ | ||||
| FILE	*pcap_file(pcap_t *); | ||||
| int	pcap_fileno(pcap_t *); | ||||
|  | ||||
| pcap_dumper_t *pcap_dump_open(pcap_t *, const char *); | ||||
| pcap_dumper_t *pcap_dump_fopen(pcap_t *, FILE *fp); | ||||
| FILE	*pcap_dump_file(pcap_dumper_t *); | ||||
| long	pcap_dump_ftell(pcap_dumper_t *); | ||||
| int	pcap_dump_flush(pcap_dumper_t *); | ||||
| void	pcap_dump_close(pcap_dumper_t *); | ||||
| void	pcap_dump(u_char *, const struct pcap_pkthdr *, const u_char *); | ||||
|  | ||||
| int	pcap_findalldevs(pcap_if_t **, char *); | ||||
| void	pcap_freealldevs(pcap_if_t *); | ||||
|  | ||||
| const char *pcap_lib_version(void); | ||||
|  | ||||
| /* XXX this guy lives in the bpf tree */ | ||||
| u_int	bpf_filter(const struct bpf_insn *, const u_char *, u_int, u_int); | ||||
| int	bpf_validate(const struct bpf_insn *f, int len); | ||||
| char	*bpf_image(const struct bpf_insn *, int); | ||||
| void	bpf_dump(const struct bpf_program *, int); | ||||
|  | ||||
| #if defined(WIN32) | ||||
|  | ||||
| /* | ||||
|  * Win32 definitions | ||||
|  */ | ||||
|  | ||||
| int pcap_setbuff(pcap_t *p, int dim); | ||||
| int pcap_setmode(pcap_t *p, int mode); | ||||
| int pcap_setmintocopy(pcap_t *p, int size); | ||||
|  | ||||
| #ifdef WPCAP | ||||
| /* Include file with the wpcap-specific extensions */ | ||||
| #include <Win32-Extensions.h> | ||||
| #endif /* WPCAP */ | ||||
|  | ||||
| #define MODE_CAPT 0 | ||||
| #define MODE_STAT 1 | ||||
| #define MODE_MON 2 | ||||
|  | ||||
| #elif defined(MSDOS) | ||||
|  | ||||
| /* | ||||
|  * MS-DOS definitions | ||||
|  */ | ||||
|  | ||||
| int  pcap_stats_ex (pcap_t *, struct pcap_stat_ex *); | ||||
| void pcap_set_wait (pcap_t *p, void (*yield)(void), int wait); | ||||
| u_long pcap_mac_packets (void); | ||||
|  | ||||
| #else /* UN*X */ | ||||
|  | ||||
| /* | ||||
|  * UN*X definitions | ||||
|  */ | ||||
|  | ||||
| int	pcap_get_selectable_fd(pcap_t *); | ||||
|  | ||||
| #endif /* WIN32/MSDOS/UN*X */ | ||||
|  | ||||
| #ifdef HAVE_REMOTE | ||||
| /* Includes most of the public stuff that is needed for the remote capture */ | ||||
| #include <remote-ext.h> | ||||
| #endif	 /* HAVE_REMOTE */ | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
| @@ -0,0 +1,129 @@ | ||||
| /*- | ||||
|  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 | ||||
|  *	The Regents of the University of California.  All rights reserved. | ||||
|  * | ||||
|  * This code is derived from the Stanford/CMU enet packet filter, | ||||
|  * (net/enet.c) distributed as part of 4.3BSD, and code contributed | ||||
|  * to Berkeley by Steven McCanne and Van Jacobson both of Lawrence | ||||
|  * Berkeley Laboratory. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. All advertising materials mentioning features or use of this software | ||||
|  *    must display the following acknowledgement: | ||||
|  *      This product includes software developed by the University of | ||||
|  *      California, Berkeley and its contributors. | ||||
|  * 4. Neither the name of the University nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  * | ||||
|  * @(#) $Header: /tcpdump/master/libpcap/pcap/sll.h,v 1.2.2.1 2008-05-30 01:36:06 guy Exp $ (LBL) | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * For captures on Linux cooked sockets, we construct a fake header | ||||
|  * that includes: | ||||
|  * | ||||
|  *	a 2-byte "packet type" which is one of: | ||||
|  * | ||||
|  *		LINUX_SLL_HOST		packet was sent to us | ||||
|  *		LINUX_SLL_BROADCAST	packet was broadcast | ||||
|  *		LINUX_SLL_MULTICAST	packet was multicast | ||||
|  *		LINUX_SLL_OTHERHOST	packet was sent to somebody else | ||||
|  *		LINUX_SLL_OUTGOING	packet was sent *by* us; | ||||
|  * | ||||
|  *	a 2-byte Ethernet protocol field; | ||||
|  * | ||||
|  *	a 2-byte link-layer type; | ||||
|  * | ||||
|  *	a 2-byte link-layer address length; | ||||
|  * | ||||
|  *	an 8-byte source link-layer address, whose actual length is | ||||
|  *	specified by the previous value. | ||||
|  * | ||||
|  * All fields except for the link-layer address are in network byte order. | ||||
|  * | ||||
|  * DO NOT change the layout of this structure, or change any of the | ||||
|  * LINUX_SLL_ values below.  If you must change the link-layer header | ||||
|  * for a "cooked" Linux capture, introduce a new DLT_ type (ask | ||||
|  * "tcpdump-workers@lists.tcpdump.org" for one, so that you don't give it | ||||
|  * a value that collides with a value already being used), and use the | ||||
|  * new header in captures of that type, so that programs that can | ||||
|  * handle DLT_LINUX_SLL captures will continue to handle them correctly | ||||
|  * without any change, and so that capture files with different headers | ||||
|  * can be told apart and programs that read them can dissect the | ||||
|  * packets in them. | ||||
|  */ | ||||
|  | ||||
| #ifndef lib_pcap_sll_h | ||||
| #define lib_pcap_sll_h | ||||
|  | ||||
| /* | ||||
|  * A DLT_LINUX_SLL fake link-layer header. | ||||
|  */ | ||||
| #define SLL_HDR_LEN	16		/* total header length */ | ||||
| #define SLL_ADDRLEN	8		/* length of address field */ | ||||
|  | ||||
| struct sll_header { | ||||
| 	u_int16_t sll_pkttype;		/* packet type */ | ||||
| 	u_int16_t sll_hatype;		/* link-layer address type */ | ||||
| 	u_int16_t sll_halen;		/* link-layer address length */ | ||||
| 	u_int8_t sll_addr[SLL_ADDRLEN];	/* link-layer address */ | ||||
| 	u_int16_t sll_protocol;		/* protocol */ | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * The LINUX_SLL_ values for "sll_pkttype"; these correspond to the | ||||
|  * PACKET_ values on Linux, but are defined here so that they're | ||||
|  * available even on systems other than Linux, and so that they | ||||
|  * don't change even if the PACKET_ values change. | ||||
|  */ | ||||
| #define LINUX_SLL_HOST		0 | ||||
| #define LINUX_SLL_BROADCAST	1 | ||||
| #define LINUX_SLL_MULTICAST	2 | ||||
| #define LINUX_SLL_OTHERHOST	3 | ||||
| #define LINUX_SLL_OUTGOING	4 | ||||
|  | ||||
| /* | ||||
|  * The LINUX_SLL_ values for "sll_protocol"; these correspond to the | ||||
|  * ETH_P_ values on Linux, but are defined here so that they're | ||||
|  * available even on systems other than Linux.  We assume, for now, | ||||
|  * that the ETH_P_ values won't change in Linux; if they do, then: | ||||
|  * | ||||
|  *	if we don't translate them in "pcap-linux.c", capture files | ||||
|  *	won't necessarily be readable if captured on a system that | ||||
|  *	defines ETH_P_ values that don't match these values; | ||||
|  * | ||||
|  *	if we do translate them in "pcap-linux.c", that makes life | ||||
|  *	unpleasant for the BPF code generator, as the values you test | ||||
|  *	for in the kernel aren't the values that you test for when | ||||
|  *	reading a capture file, so the fixup code run on BPF programs | ||||
|  *	handed to the kernel ends up having to do more work. | ||||
|  * | ||||
|  * Add other values here as necessary, for handling packet types that | ||||
|  * might show up on non-Ethernet, non-802.x networks.  (Not all the ones | ||||
|  * in the Linux "if_ether.h" will, I suspect, actually show up in | ||||
|  * captures.) | ||||
|  */ | ||||
| #define LINUX_SLL_P_802_3	0x0001	/* Novell 802.3 frames without 802.2 LLC header */ | ||||
| #define LINUX_SLL_P_802_2	0x0004	/* 802.2 frames (not D/I/X Ethernet) */ | ||||
|  | ||||
| #endif | ||||
| @@ -0,0 +1,90 @@ | ||||
| /* | ||||
|  * Copyright (c) 2006 Paolo Abeni (Italy) | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  * notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  * notice, this list of conditions and the following disclaimer in the | ||||
|  * documentation and/or other materials provided with the distribution. | ||||
|  * 3. The name of the author may not be used to endorse or promote  | ||||
|  * products derived from this software without specific prior written  | ||||
|  * permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
|  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
|  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
|  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
|  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
|  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
|  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
|  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
|  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
|  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
|  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  * | ||||
|  * Basic USB data struct | ||||
|  * By Paolo Abeni <paolo.abeni@email.it> | ||||
|  * | ||||
|  * @(#) $Header: /tcpdump/master/libpcap/pcap/usb.h,v 1.6 2007/09/22 02:06:08 guy Exp $ | ||||
|  */ | ||||
|   | ||||
| #ifndef _PCAP_USB_STRUCTS_H__ | ||||
| #define _PCAP_USB_STRUCTS_H__ | ||||
|  | ||||
| /*  | ||||
|  * possible transfer mode | ||||
|  */ | ||||
| #define URB_TRANSFER_IN   0x80 | ||||
| #define URB_ISOCHRONOUS   0x0 | ||||
| #define URB_INTERRUPT     0x1 | ||||
| #define URB_CONTROL       0x2 | ||||
| #define URB_BULK          0x3 | ||||
|  | ||||
| /* | ||||
|  * possible event type | ||||
|  */ | ||||
| #define URB_SUBMIT        'S' | ||||
| #define URB_COMPLETE      'C' | ||||
| #define URB_ERROR         'E' | ||||
|  | ||||
| /* | ||||
|  * USB setup header as defined in USB specification. | ||||
|  * Appears at the front of each packet in DLT_USB captures. | ||||
|  */ | ||||
| typedef struct _usb_setup { | ||||
| 	u_int8_t bmRequestType; | ||||
| 	u_int8_t bRequest; | ||||
| 	u_int16_t wValue; | ||||
| 	u_int16_t wIndex; | ||||
| 	u_int16_t wLength; | ||||
| } pcap_usb_setup; | ||||
|  | ||||
|  | ||||
| /* | ||||
|  * Header prepended by linux kernel to each event. | ||||
|  * Appears at the front of each packet in DLT_USB_LINUX captures. | ||||
|  */ | ||||
| typedef struct _usb_header { | ||||
| 	u_int64_t id; | ||||
| 	u_int8_t event_type; | ||||
| 	u_int8_t transfer_type; | ||||
| 	u_int8_t endpoint_number; | ||||
| 	u_int8_t device_address; | ||||
| 	u_int16_t bus_id; | ||||
| 	char setup_flag;/*if !=0 the urb setup header is not present*/ | ||||
| 	char data_flag; /*if !=0 no urb data is present*/ | ||||
| 	int64_t ts_sec; | ||||
| 	int32_t ts_usec; | ||||
| 	int32_t status; | ||||
| 	u_int32_t urb_len; | ||||
| 	u_int32_t data_len; /* amount of urb data really present in this event*/ | ||||
| 	pcap_usb_setup setup; | ||||
| } pcap_usb_header; | ||||
|  | ||||
|  | ||||
| #endif | ||||
| @@ -0,0 +1,46 @@ | ||||
| /*- | ||||
|  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 | ||||
|  *	The Regents of the University of California.  All rights reserved. | ||||
|  * | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions | ||||
|  * are met: | ||||
|  * 1. Redistributions of source code must retain the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright | ||||
|  *    notice, this list of conditions and the following disclaimer in the | ||||
|  *    documentation and/or other materials provided with the distribution. | ||||
|  * 3. All advertising materials mentioning features or use of this software | ||||
|  *    must display the following acknowledgement: | ||||
|  *      This product includes software developed by the University of | ||||
|  *      California, Berkeley and its contributors. | ||||
|  * 4. Neither the name of the University nor the names of its contributors | ||||
|  *    may be used to endorse or promote products derived from this software | ||||
|  *    without specific prior written permission. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | ||||
|  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||||
|  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | ||||
|  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||||
|  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
|  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
|  * SUCH DAMAGE. | ||||
|  * | ||||
|  * @(#) $Header: /tcpdump/master/libpcap/pcap/vlan.h,v 1.1.2.2 2008-08-06 07:45:59 guy Exp $ | ||||
|  */ | ||||
|  | ||||
| #ifndef lib_pcap_vlan_h | ||||
| #define lib_pcap_vlan_h | ||||
|  | ||||
| struct vlan_tag { | ||||
| 	u_int16_t	vlan_tpid;		/* ETH_P_8021Q */ | ||||
| 	u_int16_t	vlan_tci;		/* VLAN TCI */ | ||||
| }; | ||||
|  | ||||
| #define VLAN_TAG_LEN	4 | ||||
|  | ||||
| #endif | ||||
| @@ -0,0 +1,444 @@ | ||||
| /* | ||||
|  * Copyright (c) 2002 - 2003 | ||||
|  * NetGroup, Politecnico di Torino (Italy) | ||||
|  * All rights reserved. | ||||
|  *  | ||||
|  * Redistribution and use in source and binary forms, with or without  | ||||
|  * modification, are permitted provided that the following conditions  | ||||
|  * are met: | ||||
|  *  | ||||
|  * 1. Redistributions of source code must retain the above copyright  | ||||
|  * notice, this list of conditions and the following disclaimer. | ||||
|  * 2. Redistributions in binary form must reproduce the above copyright  | ||||
|  * notice, this list of conditions and the following disclaimer in the  | ||||
|  * documentation and/or other materials provided with the distribution.  | ||||
|  * 3. Neither the name of the Politecnico di Torino nor the names of its  | ||||
|  * contributors may be used to endorse or promote products derived from  | ||||
|  * this software without specific prior written permission.  | ||||
|  *  | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS  | ||||
|  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT  | ||||
|  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR  | ||||
|  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  | ||||
|  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,  | ||||
|  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT  | ||||
|  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  | ||||
|  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY  | ||||
|  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  | ||||
|  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  | ||||
|  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  *  | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef __REMOTE_EXT_H__ | ||||
| #define __REMOTE_EXT_H__ | ||||
|  | ||||
|  | ||||
| #ifndef HAVE_REMOTE | ||||
| #error Please do not include this file directly. Just define HAVE_REMOTE and then include pcap.h | ||||
| #endif | ||||
|  | ||||
| // Definition for Microsoft Visual Studio | ||||
| #if _MSC_VER > 1000 | ||||
| #pragma once | ||||
| #endif | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
|  | ||||
| /*! | ||||
| 	\file remote-ext.h | ||||
|  | ||||
| 	The goal of this file it to include most of the new definitions that should be | ||||
| 	placed into the pcap.h file. | ||||
|  | ||||
| 	It includes all new definitions (structures and functions like pcap_open(). | ||||
|     Some of the functions are not really a remote feature, but, right now,  | ||||
| 	they are placed here. | ||||
| */ | ||||
|  | ||||
|  | ||||
|  | ||||
| // All this stuff is public | ||||
| /*! \addtogroup remote_struct | ||||
| 	\{ | ||||
| */ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /*! | ||||
| 	\brief Defines the maximum buffer size in which address, port, interface names are kept. | ||||
|  | ||||
| 	In case the adapter name or such is larger than this value, it is truncated. | ||||
| 	This is not used by the user; however it must be aware that an hostname / interface | ||||
| 	name longer than this value will be truncated. | ||||
| */ | ||||
| #define PCAP_BUF_SIZE 1024 | ||||
|  | ||||
|  | ||||
| /*! \addtogroup remote_source_ID | ||||
| 	\{ | ||||
| */ | ||||
|  | ||||
|  | ||||
| /*! | ||||
| 	\brief Internal representation of the type of source in use (file,  | ||||
| 	remote/local interface). | ||||
|  | ||||
| 	This indicates a file, i.e. the user want to open a capture from a local file. | ||||
| */ | ||||
| #define PCAP_SRC_FILE 2 | ||||
| /*! | ||||
| 	\brief Internal representation of the type of source in use (file,  | ||||
| 	remote/local interface). | ||||
|  | ||||
| 	This indicates a local interface, i.e. the user want to open a capture from  | ||||
| 	a local interface. This does not involve the RPCAP protocol. | ||||
| */ | ||||
| #define PCAP_SRC_IFLOCAL 3 | ||||
| /*! | ||||
| 	\brief Internal representation of the type of source in use (file,  | ||||
| 	remote/local interface). | ||||
|  | ||||
| 	This indicates a remote interface, i.e. the user want to open a capture from  | ||||
| 	an interface on a remote host. This does involve the RPCAP protocol. | ||||
| */ | ||||
| #define PCAP_SRC_IFREMOTE 4 | ||||
|  | ||||
| /*! | ||||
| 	\} | ||||
| */ | ||||
|  | ||||
|  | ||||
|  | ||||
| /*! \addtogroup remote_source_string | ||||
|  | ||||
| 	The formats allowed by the pcap_open() are the following: | ||||
| 	- file://path_and_filename [opens a local file] | ||||
| 	- rpcap://devicename [opens the selected device devices available on the local host, without using the RPCAP protocol] | ||||
| 	- rpcap://host/devicename [opens the selected device available on a remote host] | ||||
| 	- rpcap://host:port/devicename [opens the selected device available on a remote host, using a non-standard port for RPCAP] | ||||
| 	- adaptername [to open a local adapter; kept for compability, but it is strongly discouraged] | ||||
| 	- (NULL) [to open the first local adapter; kept for compability, but it is strongly discouraged] | ||||
|  | ||||
| 	The formats allowed by the pcap_findalldevs_ex() are the following: | ||||
| 	- file://folder/ [lists all the files in the given folder] | ||||
| 	- rpcap:// [lists all local adapters] | ||||
| 	- rpcap://host:port/ [lists the devices available on a remote host] | ||||
|  | ||||
| 	Referring to the 'host' and 'port' paramters, they can be either numeric or literal. Since | ||||
| 	IPv6 is fully supported, these are the allowed formats: | ||||
|  | ||||
| 	- host (literal): e.g. host.foo.bar | ||||
| 	- host (numeric IPv4): e.g. 10.11.12.13 | ||||
| 	- host (numeric IPv4, IPv6 style): e.g. [10.11.12.13] | ||||
| 	- host (numeric IPv6): e.g. [1:2:3::4] | ||||
| 	- port: can be either numeric (e.g. '80') or literal (e.g. 'http') | ||||
|  | ||||
| 	Here you find some allowed examples: | ||||
| 	- rpcap://host.foo.bar/devicename [everything literal, no port number] | ||||
| 	- rpcap://host.foo.bar:1234/devicename [everything literal, with port number] | ||||
| 	- rpcap://10.11.12.13/devicename [IPv4 numeric, no port number] | ||||
| 	- rpcap://10.11.12.13:1234/devicename [IPv4 numeric, with port number] | ||||
| 	- rpcap://[10.11.12.13]:1234/devicename [IPv4 numeric with IPv6 format, with port number] | ||||
| 	- rpcap://[1:2:3::4]/devicename [IPv6 numeric, no port number] | ||||
| 	- rpcap://[1:2:3::4]:1234/devicename [IPv6 numeric, with port number] | ||||
| 	- rpcap://[1:2:3::4]:http/devicename [IPv6 numeric, with literal port number] | ||||
| 	 | ||||
| 	\{ | ||||
| */ | ||||
|  | ||||
|  | ||||
| /*! | ||||
| 	\brief String that will be used to determine the type of source in use (file, | ||||
| 	remote/local interface). | ||||
|  | ||||
| 	This string will be prepended to the interface name in order to create a string | ||||
| 	that contains all the information required to open the source. | ||||
|  | ||||
| 	This string indicates that the user wants to open a capture from a local file. | ||||
| */ | ||||
| #define PCAP_SRC_FILE_STRING "file://" | ||||
| /*! | ||||
| 	\brief String that will be used to determine the type of source in use (file, | ||||
| 	remote/local interface). | ||||
|  | ||||
| 	This string will be prepended to the interface name in order to create a string | ||||
| 	that contains all the information required to open the source. | ||||
|  | ||||
| 	This string indicates that the user wants to open a capture from a network interface. | ||||
| 	This string does not necessarily involve the use of the RPCAP protocol. If the | ||||
| 	interface required resides on the local host, the RPCAP protocol is not involved | ||||
| 	and the local functions are used. | ||||
| */ | ||||
| #define PCAP_SRC_IF_STRING "rpcap://" | ||||
|  | ||||
| /*! | ||||
| 	\} | ||||
| */ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /*! | ||||
| 	\addtogroup remote_open_flags | ||||
| 	\{ | ||||
| */ | ||||
|  | ||||
| /*! | ||||
| 	\brief Defines if the adapter has to go in promiscuous mode. | ||||
|  | ||||
| 	It is '1' if you have to open the adapter in promiscuous mode, '0' otherwise. | ||||
| 	Note that even if this parameter is false, the interface could well be in promiscuous | ||||
| 	mode for some other reason (for example because another capture process with  | ||||
| 	promiscuous mode enabled is currently using that interface). | ||||
| 	On on Linux systems with 2.2 or later kernels (that have the "any" device), this | ||||
| 	flag does not work on the "any" device; if an argument of "any" is supplied, | ||||
| 	the 'promisc' flag is ignored. | ||||
| */ | ||||
| #define PCAP_OPENFLAG_PROMISCUOUS		1 | ||||
|  | ||||
| /*! | ||||
| 	\brief Defines if the data trasfer (in case of a remote | ||||
| 	capture) has to be done with UDP protocol. | ||||
|  | ||||
| 	If it is '1' if you want a UDP data connection, '0' if you want | ||||
| 	a TCP data connection; control connection is always TCP-based. | ||||
| 	A UDP connection is much lighter, but it does not guarantee that all | ||||
| 	the captured packets arrive to the client workstation. Moreover,  | ||||
| 	it could be harmful in case of network congestion. | ||||
| 	This flag is meaningless if the source is not a remote interface. | ||||
| 	In that case, it is simply ignored. | ||||
| */ | ||||
| #define PCAP_OPENFLAG_DATATX_UDP			2 | ||||
|  | ||||
|  | ||||
| /*! | ||||
| 	\brief Defines if the remote probe will capture its own generated traffic. | ||||
|  | ||||
| 	In case the remote probe uses the same interface to capture traffic and to send | ||||
| 	data back to the caller, the captured traffic includes the RPCAP traffic as well. | ||||
| 	If this flag is turned on, the RPCAP traffic is excluded from the capture, so that | ||||
| 	the trace returned back to the collector is does not include this traffic. | ||||
| */ | ||||
| #define PCAP_OPENFLAG_NOCAPTURE_RPCAP	4 | ||||
|  | ||||
| /*! | ||||
| 	\brief Defines if the local adapter will capture its own generated traffic. | ||||
|  | ||||
| 	This flag tells the underlying capture driver to drop the packets that were sent by itself.  | ||||
| 	This is usefult when building applications like bridges, that should ignore the traffic | ||||
| 	they just sent. | ||||
| */ | ||||
| #define PCAP_OPENFLAG_NOCAPTURE_LOCAL	8 | ||||
|  | ||||
| /*! | ||||
| 	\brief This flag configures the adapter for maximum responsiveness. | ||||
|  | ||||
| 	In presence of a large value for nbytes, WinPcap waits for the arrival of several packets before  | ||||
| 	copying the data to the user. This guarantees a low number of system calls, i.e. lower processor usage,  | ||||
| 	i.e. better performance, which is good for applications like sniffers. If the user sets the  | ||||
| 	PCAP_OPENFLAG_MAX_RESPONSIVENESS flag, the capture driver will copy the packets as soon as the application  | ||||
| 	is ready to receive them. This is suggested for real time applications (like, for example, a bridge)  | ||||
| 	that need the best responsiveness.*/ | ||||
| #define PCAP_OPENFLAG_MAX_RESPONSIVENESS	16 | ||||
|  | ||||
| /*! | ||||
| 	\} | ||||
| */ | ||||
|  | ||||
|  | ||||
| /*! | ||||
| 	\addtogroup remote_samp_methods | ||||
| 	\{ | ||||
| */ | ||||
|  | ||||
| /*! | ||||
| 	\brief No sampling has to be done on the current capture. | ||||
|  | ||||
| 	In this case, no sampling algorithms are applied to the current capture. | ||||
| */ | ||||
| #define PCAP_SAMP_NOSAMP	0 | ||||
|  | ||||
| /*! | ||||
| 	\brief It defines that only 1 out of N packets must be returned to the user. | ||||
|  | ||||
| 	In this case, the 'value' field of the 'pcap_samp' structure indicates the | ||||
| 	number of packets (minus 1) that must be discarded before one packet got accepted. | ||||
| 	In other words, if 'value = 10', the first packet is returned to the caller, while | ||||
| 	the following 9 are discarded. | ||||
| */ | ||||
| #define PCAP_SAMP_1_EVERY_N	1 | ||||
|  | ||||
| /*! | ||||
| 	\brief It defines that we have to return 1 packet every N milliseconds. | ||||
|  | ||||
| 	In this case, the 'value' field of the 'pcap_samp' structure indicates the 'waiting | ||||
| 	time' in milliseconds before one packet got accepted. | ||||
| 	In other words, if 'value = 10', the first packet is returned to the caller; the next  | ||||
| 	returned one will be the first packet that arrives when 10ms have elapsed.  | ||||
| */ | ||||
| #define PCAP_SAMP_FIRST_AFTER_N_MS 2 | ||||
|  | ||||
| /*! | ||||
| 	\} | ||||
| */ | ||||
|  | ||||
|  | ||||
| /*! | ||||
| 	\addtogroup remote_auth_methods | ||||
| 	\{ | ||||
| */ | ||||
|  | ||||
| /*! | ||||
| 	\brief It defines the NULL authentication. | ||||
|  | ||||
| 	This value has to be used within the 'type' member of the pcap_rmtauth structure. | ||||
| 	The 'NULL' authentication has to be equal to 'zero', so that old applications | ||||
| 	can just put every field of struct pcap_rmtauth to zero, and it does work. | ||||
| */ | ||||
| #define RPCAP_RMTAUTH_NULL 0 | ||||
| /*! | ||||
| 	\brief It defines the username/password authentication. | ||||
|  | ||||
| 	With this type of authentication, the RPCAP protocol will use the username/ | ||||
| 	password provided to authenticate the user on the remote machine. If the | ||||
| 	authentication is successful (and the user has the right to open network devices) | ||||
| 	the RPCAP connection will continue; otherwise it will be dropped. | ||||
|  | ||||
| 	This value has to be used within the 'type' member of the pcap_rmtauth structure. | ||||
| */ | ||||
| #define RPCAP_RMTAUTH_PWD 1 | ||||
|  | ||||
| /*! | ||||
| 	\} | ||||
| */ | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| /*! | ||||
|  | ||||
| 	\brief This structure keeps the information needed to autheticate | ||||
| 	the user on a remote machine. | ||||
| 	 | ||||
| 	The remote machine can either grant or refuse the access according  | ||||
| 	to the information provided. | ||||
| 	In case the NULL authentication is required, both 'username' and | ||||
| 	'password' can be NULL pointers. | ||||
| 	 | ||||
| 	This structure is meaningless if the source is not a remote interface; | ||||
| 	in that case, the functions which requires such a structure can accept | ||||
| 	a NULL pointer as well. | ||||
| */ | ||||
| struct pcap_rmtauth | ||||
| { | ||||
| 	/*! | ||||
| 		\brief Type of the authentication required. | ||||
|  | ||||
| 		In order to provide maximum flexibility, we can support different types | ||||
| 		of authentication based on the value of this 'type' variable. The currently  | ||||
| 		supported authentication methods are defined into the | ||||
| 		\link remote_auth_methods Remote Authentication Methods Section\endlink. | ||||
|  | ||||
| 	*/ | ||||
| 	int type; | ||||
| 	/*! | ||||
| 		\brief Zero-terminated string containing the username that has to be  | ||||
| 		used on the remote machine for authentication. | ||||
| 		 | ||||
| 		This field is meaningless in case of the RPCAP_RMTAUTH_NULL authentication | ||||
| 		and it can be NULL. | ||||
| 	*/ | ||||
| 	char *username; | ||||
| 	/*! | ||||
| 		\brief Zero-terminated string containing the password that has to be  | ||||
| 		used on the remote machine for authentication. | ||||
| 		 | ||||
| 		This field is meaningless in case of the RPCAP_RMTAUTH_NULL authentication | ||||
| 		and it can be NULL. | ||||
| 	*/ | ||||
| 	char *password; | ||||
| }; | ||||
|  | ||||
|  | ||||
| /*! | ||||
| 	\brief This structure defines the information related to sampling. | ||||
|  | ||||
| 	In case the sampling is requested, the capturing device should read | ||||
| 	only a subset of the packets coming from the source. The returned packets depend | ||||
| 	on the sampling parameters. | ||||
|  | ||||
| 	\warning The sampling process is applied <strong>after</strong> the filtering process. | ||||
| 	In other words, packets are filtered first, then the sampling process selects a | ||||
| 	subset of the 'filtered' packets and it returns them to the caller. | ||||
| */ | ||||
| struct pcap_samp | ||||
| { | ||||
| 	/*! | ||||
| 		Method used for sampling. Currently, the supported methods are listed in the | ||||
| 		\link remote_samp_methods Sampling Methods Section\endlink. | ||||
| 	*/ | ||||
| 	int method; | ||||
|  | ||||
| 	/*! | ||||
| 		This value depends on the sampling method defined. For its meaning, please check | ||||
| 		at the \link remote_samp_methods Sampling Methods Section\endlink. | ||||
| 	*/ | ||||
| 	int value; | ||||
| }; | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| //! Maximum lenght of an host name (needed for the RPCAP active mode) | ||||
| #define RPCAP_HOSTLIST_SIZE 1024 | ||||
|  | ||||
|  | ||||
| /*! | ||||
| 	\} | ||||
| */ // end of public documentation | ||||
|  | ||||
|  | ||||
| // Exported functions | ||||
|  | ||||
|  | ||||
|  | ||||
| /** \name New WinPcap functions | ||||
|  | ||||
| 	This section lists the new functions that are able to help considerably in writing | ||||
| 	WinPcap programs because of their easiness of use. | ||||
|  */ | ||||
| //\{ | ||||
| pcap_t *pcap_open(const char *source, int snaplen, int flags, int read_timeout, struct pcap_rmtauth *auth, char *errbuf); | ||||
| int pcap_createsrcstr(char *source, int type, const char *host, const char *port, const char *name, char *errbuf); | ||||
| int pcap_parsesrcstr(const char *source, int *type, char *host, char *port, char *name, char *errbuf); | ||||
| int pcap_findalldevs_ex(char *source, struct pcap_rmtauth *auth, pcap_if_t **alldevs, char *errbuf); | ||||
| struct pcap_samp *pcap_setsampling(pcap_t *p); | ||||
|  | ||||
| //\} | ||||
| // End of new winpcap functions | ||||
|  | ||||
|  | ||||
|  | ||||
| /** \name Remote Capture functions | ||||
|  */ | ||||
| //\{  | ||||
| SOCKET pcap_remoteact_accept(const char *address, const char *port, const char *hostlist, char *connectinghost, struct pcap_rmtauth *auth, char *errbuf); | ||||
| int pcap_remoteact_list(char *hostlist, char sep, int size, char *errbuf); | ||||
| int pcap_remoteact_close(const char *host, char *errbuf); | ||||
| void pcap_remoteact_cleanup(); | ||||
| //\} | ||||
| // End of remote capture functions | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #endif | ||||
|  | ||||
										
											Binary file not shown.
										
									
								
							| @@ -0,0 +1,526 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * Logging utility that allows FreeRTOS tasks to log to a UDP port, stdout, and | ||||
|  * disk file without making any Win32 system calls themselves. | ||||
|  * | ||||
|  * Messages logged to a UDP port are sent directly (using FreeRTOS+TCP), but as | ||||
|  * FreeRTOS tasks cannot make Win32 system calls messages sent to stdout or a | ||||
|  * disk file are sent via a stream buffer to a Win32 thread which then performs | ||||
|  * the actual output. | ||||
|  */ | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdio.h> | ||||
| #include <stdint.h> | ||||
| #include <stdarg.h> | ||||
| #include <io.h> | ||||
| #include <ctype.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include <FreeRTOS.h> | ||||
| #include "task.h" | ||||
|  | ||||
| /* FreeRTOS+TCP includes. */ | ||||
| #include "FreeRTOS_IP.h" | ||||
| #include "FreeRTOS_Sockets.h" | ||||
| #include "FreeRTOS_Stream_Buffer.h" | ||||
|  | ||||
| /* Demo includes. */ | ||||
| #include "demo_logging.h" | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* The maximum size to which the log file may grow, before being renamed | ||||
| to .ful. */ | ||||
| #define dlLOGGING_FILE_SIZE		( 40ul * 1024ul * 1024ul ) | ||||
|  | ||||
| /* Dimensions the arrays into which print messages are created. */ | ||||
| #define dlMAX_PRINT_STRING_LENGTH	255 | ||||
|  | ||||
| /* The size of the stream buffer used to pass messages from FreeRTOS tasks to | ||||
| the Win32 thread that is responsible for making any Win32 system calls that are | ||||
| necessary for the selected logging method. */ | ||||
| #define dlLOGGING_STREAM_BUFFER_SIZE  32768 | ||||
|  | ||||
| /* A block time of zero simply means don't block. */ | ||||
| #define dlDONT_BLOCK	0 | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* | ||||
|  * Called from vLoggingInit() to start a new disk log file. | ||||
|  */ | ||||
| static void prvFileLoggingInit( void ); | ||||
|  | ||||
| /* | ||||
|  * Attempt to write a message to the file. | ||||
|  */ | ||||
| static void prvLogToFile( const char *pcMessage, size_t xLength ); | ||||
|  | ||||
| /* | ||||
|  * Simply close the logging file, if it is open. | ||||
|  */ | ||||
| static void prvFileClose( void ); | ||||
|  | ||||
| /* | ||||
|  * Before the scheduler is started this function is called directly.  After the | ||||
|  * scheduler has started it is called from the Windows thread dedicated to | ||||
|  * outputting log messages.  Only the windows thread actually performs the | ||||
|  * writing so as not to disrupt the simulation by making Windows system calls | ||||
|  * from FreeRTOS tasks. | ||||
|  */ | ||||
| static void prvLoggingFlushBuffer( void ); | ||||
|  | ||||
| /* | ||||
|  * The windows thread that performs the actual writing of messages that require | ||||
|  * Win32 system calls.  Only the windows thread can make system calls so as not | ||||
|  * to disrupt the simulation by making Windows calls from FreeRTOS tasks. | ||||
|  */ | ||||
| static DWORD WINAPI prvWin32LoggingThread( void *pvParam ); | ||||
|  | ||||
| /* | ||||
|  * Creates the socket to which UDP messages are sent.  This function is not | ||||
|  * called directly to prevent the print socket being created from within the IP | ||||
|  * task - which could result in a deadlock.  Instead the function call is | ||||
|  * deferred to run in the RTOS daemon task - hence it prototype. | ||||
|  */ | ||||
| static void prvCreatePrintSocket( void *pvParameter1, uint32_t ulParameter2 ); | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* Windows event used to wake the Win32 thread which performs any logging that | ||||
| needs Win32 system calls. */ | ||||
| static void *pvLoggingThreadEvent = NULL; | ||||
|  | ||||
| /* Stores the selected logging targets passed in as parameters to the | ||||
| vLoggingInit() function. */ | ||||
| BaseType_t xStdoutLoggingUsed = pdFALSE, xDiskFileLoggingUsed = pdFALSE, xUDPLoggingUsed = pdFALSE; | ||||
|  | ||||
| /* Circular buffer used to pass messages from the FreeRTOS tasks to the Win32 | ||||
| thread that is responsible for making Win32 calls (when stdout or a disk log is | ||||
| used). */ | ||||
| static StreamBuffer_t *xLogStreamBuffer = NULL; | ||||
|  | ||||
| /* Handle to the file used for logging.  This is left open while there are | ||||
| messages waiting to be logged, then closed again in between logs. */ | ||||
| static FILE *pxLoggingFileHandle = NULL; | ||||
|  | ||||
| /* When true prints are performed directly.  After start up xDirectPrint is set | ||||
| to pdFALSE - at which time prints that require Win32 system calls are done by | ||||
| the Win32 thread responsible for logging. */ | ||||
| BaseType_t xDirectPrint = pdTRUE; | ||||
|  | ||||
| /* File names for the in use and complete (full) log files. */ | ||||
| static const char *pcLogFileName = "RTOSDemo.log"; | ||||
| static const char *pcFullLogFileName = "RTOSDemo.ful"; | ||||
|  | ||||
| /* Keep the current file size in a variable, as an optimisation. */ | ||||
| static size_t ulSizeOfLoggingFile = 0ul; | ||||
|  | ||||
| /* The UDP socket and address on/to which print messages are sent. */ | ||||
| Socket_t xPrintSocket = FREERTOS_INVALID_SOCKET; | ||||
| struct freertos_sockaddr xPrintUDPAddress; | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vLoggingInit( BaseType_t xLogToStdout, BaseType_t xLogToFile, BaseType_t xLogToUDP, uint32_t ulRemoteIPAddress, uint16_t usRemotePort ) | ||||
| { | ||||
| 	/* Can only be called before the scheduler has started. */ | ||||
| 	configASSERT( xTaskGetSchedulerState() == taskSCHEDULER_NOT_STARTED ); | ||||
|  | ||||
| 	#if( ( ipconfigHAS_DEBUG_PRINTF == 1 ) || ( ipconfigHAS_PRINTF == 1 ) ) | ||||
| 	{ | ||||
| 		HANDLE Win32Thread; | ||||
|  | ||||
| 		/* Record which output methods are to be used. */ | ||||
| 		xStdoutLoggingUsed = xLogToStdout; | ||||
| 		xDiskFileLoggingUsed = xLogToFile; | ||||
| 		xUDPLoggingUsed = xLogToUDP; | ||||
|  | ||||
| 		/* If a disk file is used then initialise it now. */ | ||||
| 		if( xDiskFileLoggingUsed != pdFALSE ) | ||||
| 		{ | ||||
| 			prvFileLoggingInit(); | ||||
| 		} | ||||
|  | ||||
| 		/* If UDP logging is used then store the address to which the log data | ||||
| 		will be sent - but don't create the socket yet because the network is | ||||
| 		not initialised. */ | ||||
| 		if( xUDPLoggingUsed != pdFALSE ) | ||||
| 		{ | ||||
| 			/* Set the address to which the print messages are sent. */ | ||||
| 			xPrintUDPAddress.sin_port = FreeRTOS_htons( usRemotePort ); | ||||
| 			xPrintUDPAddress.sin_addr = ulRemoteIPAddress; | ||||
| 		} | ||||
|  | ||||
| 		/* If a disk file or stdout are to be used then Win32 system calls will | ||||
| 		have to be made.  Such system calls cannot be made from FreeRTOS tasks | ||||
| 		so create a stream buffer to pass the messages to a Win32 thread, then | ||||
| 		create the thread itself, along with a Win32 event that can be used to | ||||
| 		unblock the thread. */ | ||||
| 		if( ( xStdoutLoggingUsed != pdFALSE ) || ( xDiskFileLoggingUsed != pdFALSE ) ) | ||||
| 		{ | ||||
| 			/* Create the buffer. */ | ||||
| 			xLogStreamBuffer = ( StreamBuffer_t * ) malloc( sizeof( *xLogStreamBuffer ) - sizeof( xLogStreamBuffer->ucArray ) + dlLOGGING_STREAM_BUFFER_SIZE + 1 ); | ||||
| 			configASSERT( xLogStreamBuffer ); | ||||
| 			memset( xLogStreamBuffer, '\0', sizeof( *xLogStreamBuffer ) - sizeof( xLogStreamBuffer->ucArray ) ); | ||||
| 			xLogStreamBuffer->LENGTH = dlLOGGING_STREAM_BUFFER_SIZE + 1; | ||||
|  | ||||
| 			/* Create the Windows event. */ | ||||
| 			pvLoggingThreadEvent = CreateEvent( NULL, FALSE, TRUE, "StdoutLoggingEvent" ); | ||||
|  | ||||
| 			/* Create the thread itself. */ | ||||
| 			Win32Thread = CreateThread( | ||||
| 				NULL,	/* Pointer to thread security attributes. */ | ||||
| 				0,		/* Initial thread stack size, in bytes. */ | ||||
| 				prvWin32LoggingThread,	/* Pointer to thread function. */ | ||||
| 				NULL,	/* Argument for new thread. */ | ||||
| 				0,		/* Creation flags. */ | ||||
| 				NULL ); | ||||
|  | ||||
| 			/* Use the cores that are not used by the FreeRTOS tasks. */ | ||||
| 			SetThreadAffinityMask( Win32Thread, ~0x01u ); | ||||
| 			SetThreadPriorityBoost( Win32Thread, TRUE ); | ||||
| 			SetThreadPriority( Win32Thread, THREAD_PRIORITY_IDLE ); | ||||
| 		} | ||||
| 	} | ||||
| 	#else | ||||
| 	{ | ||||
| 		/* FreeRTOSIPConfig is set such that no print messages will be output. | ||||
| 		Avoid compiler warnings about unused parameters. */ | ||||
| 		( void ) xLogToStdout; | ||||
| 		( void ) xLogToFile; | ||||
| 		( void ) xLogToUDP; | ||||
| 		( void ) usRemotePort; | ||||
| 		( void ) ulRemoteIPAddress; | ||||
| 	} | ||||
| 	#endif /* ( ipconfigHAS_DEBUG_PRINTF == 1 ) || ( ipconfigHAS_PRINTF == 1 )  */ | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvCreatePrintSocket( void *pvParameter1, uint32_t ulParameter2 ) | ||||
| { | ||||
| static const TickType_t xSendTimeOut = pdMS_TO_TICKS( 0 ); | ||||
| Socket_t xSocket; | ||||
|  | ||||
| 	/* The function prototype is that of a deferred function, but the parameters | ||||
| 	are not actually used. */ | ||||
| 	( void ) pvParameter1; | ||||
| 	( void ) ulParameter2; | ||||
|  | ||||
| 	xSocket = FreeRTOS_socket( FREERTOS_AF_INET, FREERTOS_SOCK_DGRAM, FREERTOS_IPPROTO_UDP ); | ||||
|  | ||||
| 	if( xSocket != FREERTOS_INVALID_SOCKET ) | ||||
| 	{ | ||||
| 		/* FreeRTOS+TCP decides which port to bind to. */ | ||||
| 		FreeRTOS_setsockopt( xSocket, 0, FREERTOS_SO_SNDTIMEO, &xSendTimeOut, sizeof( xSendTimeOut ) ); | ||||
| 		FreeRTOS_bind( xSocket, NULL, 0 ); | ||||
|  | ||||
| 		/* Now the socket is bound it can be assigned to the print socket. */ | ||||
| 		xPrintSocket = xSocket; | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vLoggingPrintf( const char *pcFormat, ... ) | ||||
| { | ||||
| char cPrintString[ dlMAX_PRINT_STRING_LENGTH ]; | ||||
| char cOutputString[ dlMAX_PRINT_STRING_LENGTH ]; | ||||
| char *pcSource, *pcTarget, *pcBegin; | ||||
| size_t xLength, xLength2, rc; | ||||
| static BaseType_t xMessageNumber = 0; | ||||
| va_list args; | ||||
| uint32_t ulIPAddress; | ||||
| const char *pcTaskName; | ||||
| const char *pcNoTask = "None"; | ||||
| int iOriginalPriority; | ||||
| HANDLE xCurrentTask; | ||||
|  | ||||
|  | ||||
| 	if( ( xStdoutLoggingUsed != pdFALSE ) || ( xDiskFileLoggingUsed != pdFALSE ) || ( xUDPLoggingUsed != pdFALSE ) ) | ||||
| 	{ | ||||
| 		/* There are a variable number of parameters. */ | ||||
| 		va_start( args, pcFormat ); | ||||
|  | ||||
| 		/* Additional info to place at the start of the log. */ | ||||
| 		if( xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED ) | ||||
| 		{ | ||||
| 			pcTaskName = pcTaskGetName( NULL ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			pcTaskName = pcNoTask; | ||||
| 		} | ||||
|  | ||||
| 		if( strcmp( pcFormat, "\n" ) != 0 ) | ||||
| 		{ | ||||
| 			xLength = snprintf( cPrintString, dlMAX_PRINT_STRING_LENGTH, "%lu %lu [%s] ", | ||||
| 				xMessageNumber++, | ||||
| 				( unsigned long ) xTaskGetTickCount(), | ||||
| 				pcTaskName ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			xLength = 0; | ||||
| 			memset( cPrintString, 0x00, dlMAX_PRINT_STRING_LENGTH ); | ||||
| 		} | ||||
|  | ||||
| 		xLength2 = vsnprintf( cPrintString + xLength, dlMAX_PRINT_STRING_LENGTH - xLength, pcFormat, args ); | ||||
|  | ||||
| 		if( xLength2 <  0 ) | ||||
| 		{ | ||||
| 			/* Clean up. */ | ||||
| 			xLength2 = dlMAX_PRINT_STRING_LENGTH - 1 - xLength; | ||||
| 			cPrintString[ dlMAX_PRINT_STRING_LENGTH - 1 ] = '\0'; | ||||
| 		} | ||||
|  | ||||
| 		xLength += xLength2; | ||||
| 		va_end( args ); | ||||
|  | ||||
| 		/* For ease of viewing, copy the string into another buffer, converting | ||||
| 		IP addresses to dot notation on the way. */ | ||||
| 		pcSource = cPrintString; | ||||
| 		pcTarget = cOutputString; | ||||
|  | ||||
| 		while( ( *pcSource ) != '\0' ) | ||||
| 		{ | ||||
| 			*pcTarget = *pcSource; | ||||
| 			pcTarget++; | ||||
| 			pcSource++; | ||||
|  | ||||
| 			/* Look forward for an IP address denoted by 'ip'. */ | ||||
| 			if( ( isxdigit( pcSource[ 0 ] ) != pdFALSE ) && ( pcSource[ 1 ] == 'i' ) && ( pcSource[ 2 ] == 'p' ) ) | ||||
| 			{ | ||||
| 				*pcTarget = *pcSource; | ||||
| 				pcTarget++; | ||||
| 				*pcTarget = '\0'; | ||||
| 				pcBegin = pcTarget - 8; | ||||
|  | ||||
| 				while( ( pcTarget > pcBegin ) && ( isxdigit( pcTarget[ -1 ] ) != pdFALSE ) ) | ||||
| 				{ | ||||
| 					pcTarget--; | ||||
| 				} | ||||
|  | ||||
| 				sscanf( pcTarget, "%8X", &ulIPAddress ); | ||||
| 				rc = sprintf( pcTarget, "%lu.%lu.%lu.%lu", | ||||
| 					( unsigned long ) ( ulIPAddress >> 24UL ), | ||||
| 					( unsigned long ) ( (ulIPAddress >> 16UL) & 0xffUL ), | ||||
| 					( unsigned long ) ( (ulIPAddress >> 8UL) & 0xffUL ), | ||||
| 					( unsigned long ) ( ulIPAddress & 0xffUL ) ); | ||||
| 				pcTarget += rc; | ||||
| 				pcSource += 3; /* skip "<n>ip" */ | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		/* How far through the buffer was written? */ | ||||
| 		xLength = ( BaseType_t ) ( pcTarget - cOutputString ); | ||||
|  | ||||
| 		/* If the message is to be logged to a UDP port then it can be sent directly | ||||
| 		because it only uses FreeRTOS function (not Win32 functions). */ | ||||
| 		if( xUDPLoggingUsed != pdFALSE ) | ||||
| 		{ | ||||
| 			if( ( xPrintSocket == FREERTOS_INVALID_SOCKET ) && ( FreeRTOS_IsNetworkUp() != pdFALSE ) ) | ||||
| 			{ | ||||
| 				/* Create and bind the socket to which print messages are sent.  The | ||||
| 				xTimerPendFunctionCall() function is used even though this is | ||||
| 				not an interrupt because this function is called from the IP task | ||||
| 				and the	IP task cannot itself wait for a socket to bind.  The | ||||
| 				parameters to prvCreatePrintSocket() are not required so set to | ||||
| 				NULL or 0. */ | ||||
| 				xTimerPendFunctionCall( prvCreatePrintSocket, NULL, 0, dlDONT_BLOCK ); | ||||
| 			} | ||||
|  | ||||
| 			if( xPrintSocket != FREERTOS_INVALID_SOCKET ) | ||||
| 			{ | ||||
| 				FreeRTOS_sendto( xPrintSocket, cOutputString, xLength, 0, &xPrintUDPAddress, sizeof( xPrintUDPAddress ) ); | ||||
|  | ||||
| 				/* Just because the UDP data logger I'm using is dumb. */ | ||||
| 				FreeRTOS_sendto( xPrintSocket, "\r", sizeof( char ), 0, &xPrintUDPAddress, sizeof( xPrintUDPAddress ) ); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		/* If logging is also to go to either stdout or a disk file then it cannot | ||||
| 		be output here - so instead write the message to the stream buffer and wake | ||||
| 		the Win32 thread which will read it from the stream buffer and perform the | ||||
| 		actual output. */ | ||||
| 		if( ( xStdoutLoggingUsed != pdFALSE ) || ( xDiskFileLoggingUsed != pdFALSE ) ) | ||||
| 		{ | ||||
| 			configASSERT( xLogStreamBuffer ); | ||||
|  | ||||
| 			/* How much space is in the buffer? */ | ||||
| 			xLength2 = uxStreamBufferGetSpace( xLogStreamBuffer ); | ||||
|  | ||||
| 			/* There must be enough space to write both the string and the length of | ||||
| 			the string. */ | ||||
| 			if( xLength2 >= ( xLength + sizeof( xLength ) ) ) | ||||
| 			{ | ||||
| 				/* First write in the length of the data, then write in the data | ||||
| 				itself.  Raising the thread priority is used as a critical section | ||||
| 				as there are potentially multiple writers.  The stream buffer is | ||||
| 				only thread safe when there is a single writer (likewise for | ||||
| 				reading from the buffer). */ | ||||
| 				xCurrentTask = GetCurrentThread(); | ||||
| 				iOriginalPriority = GetThreadPriority( xCurrentTask ); | ||||
| 				SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL ); | ||||
| 				uxStreamBufferAdd( xLogStreamBuffer, 0, ( const uint8_t * ) &( xLength ), sizeof( xLength ) ); | ||||
| 				uxStreamBufferAdd( xLogStreamBuffer, 0, ( const uint8_t * ) cOutputString, xLength ); | ||||
| 				SetThreadPriority( GetCurrentThread(), iOriginalPriority ); | ||||
| 			} | ||||
|  | ||||
| 			/* xDirectPrint is initialised to pdTRUE, and while it remains true the | ||||
| 			logging output function is called directly.  When the system is running | ||||
| 			the output function cannot be called directly because it would get | ||||
| 			called from both FreeRTOS tasks and Win32 threads - so instead wake the | ||||
| 			Win32 thread responsible for the actual output. */ | ||||
| 			if( xDirectPrint != pdFALSE ) | ||||
| 			{ | ||||
| 				/* While starting up, the thread which calls prvWin32LoggingThread() | ||||
| 				is not running yet and xDirectPrint will be pdTRUE. */ | ||||
| 				prvLoggingFlushBuffer(); | ||||
| 			} | ||||
| 			else if( pvLoggingThreadEvent != NULL ) | ||||
| 			{ | ||||
| 				/* While running, wake up prvWin32LoggingThread() to send the | ||||
| 				logging data. */ | ||||
| 				SetEvent( pvLoggingThreadEvent ); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvLoggingFlushBuffer( void ) | ||||
| { | ||||
| size_t xLength; | ||||
| char cPrintString[ dlMAX_PRINT_STRING_LENGTH ]; | ||||
|  | ||||
| 	/* Is there more than the length value stored in the circular buffer | ||||
| 	used to pass data from the FreeRTOS simulator into this Win32 thread? */ | ||||
| 	while( uxStreamBufferGetSize( xLogStreamBuffer ) > sizeof( xLength ) ) | ||||
| 	{ | ||||
| 		memset( cPrintString, 0x00, dlMAX_PRINT_STRING_LENGTH ); | ||||
| 		uxStreamBufferGet( xLogStreamBuffer, 0, ( uint8_t * ) &xLength, sizeof( xLength ), pdFALSE ); | ||||
| 		uxStreamBufferGet( xLogStreamBuffer, 0, ( uint8_t * ) cPrintString, xLength, pdFALSE ); | ||||
|  | ||||
| 		/* Write the message to standard out if requested to do so when | ||||
| 		vLoggingInit() was called, or if the network is not yet up. */ | ||||
| 		if( ( xStdoutLoggingUsed != pdFALSE ) || ( FreeRTOS_IsNetworkUp() == pdFALSE ) ) | ||||
| 		{ | ||||
| 			/* Write the message to stdout. */ | ||||
| 			printf( "%s", cPrintString ); /*_RB_ Replace with _write(). */ | ||||
| 		} | ||||
|  | ||||
| 		/* Write the message to a file if requested to do so when | ||||
| 		vLoggingInit() was called. */ | ||||
| 		if( xDiskFileLoggingUsed != pdFALSE ) | ||||
| 		{ | ||||
| 			prvLogToFile( cPrintString, xLength ); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	prvFileClose(); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static DWORD WINAPI prvWin32LoggingThread( void *pvParameter ) | ||||
| { | ||||
| const DWORD xMaxWait = 1000; | ||||
|  | ||||
| 	( void ) pvParameter; | ||||
|  | ||||
| 	/* From now on, prvLoggingFlushBuffer() will only be called from this | ||||
| 	Windows thread */ | ||||
| 	xDirectPrint = pdFALSE; | ||||
|  | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		/* Wait to be told there are message waiting to be logged. */ | ||||
| 		WaitForSingleObject( pvLoggingThreadEvent, xMaxWait ); | ||||
|  | ||||
| 		/* Write out all waiting messages. */ | ||||
| 		prvLoggingFlushBuffer(); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvFileLoggingInit( void ) | ||||
| { | ||||
| FILE *pxHandle = fopen( pcLogFileName, "a" ); | ||||
|  | ||||
| 	if( pxHandle != NULL ) | ||||
| 	{ | ||||
| 		fseek( pxHandle, SEEK_END, 0ul ); | ||||
| 		ulSizeOfLoggingFile = ftell( pxHandle ); | ||||
| 		fclose( pxHandle ); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		ulSizeOfLoggingFile = 0ul; | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvFileClose( void ) | ||||
| { | ||||
| 	if( pxLoggingFileHandle != NULL ) | ||||
| 	{ | ||||
| 		fclose( pxLoggingFileHandle ); | ||||
| 		pxLoggingFileHandle = NULL; | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvLogToFile( const char *pcMessage, size_t xLength ) | ||||
| { | ||||
| 	if( pxLoggingFileHandle == NULL ) | ||||
| 	{ | ||||
| 		pxLoggingFileHandle = fopen( pcLogFileName, "a" ); | ||||
| 	} | ||||
|  | ||||
| 	if( pxLoggingFileHandle != NULL ) | ||||
| 	{ | ||||
| 		fwrite( pcMessage, 1, xLength, pxLoggingFileHandle ); | ||||
| 		ulSizeOfLoggingFile += xLength; | ||||
|  | ||||
| 		/* If the file has grown to its maximum permissible size then close and | ||||
| 		rename it - then start with a new file. */ | ||||
| 		if( ulSizeOfLoggingFile > ( size_t ) dlLOGGING_FILE_SIZE ) | ||||
| 		{ | ||||
| 			prvFileClose(); | ||||
| 			if( _access( pcFullLogFileName, 00 ) == 0 ) | ||||
| 			{ | ||||
| 				remove( pcFullLogFileName ); | ||||
| 			} | ||||
| 			rename( pcLogFileName, pcFullLogFileName ); | ||||
| 			ulSizeOfLoggingFile = 0; | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| @@ -0,0 +1,48 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| #ifndef DEMO_LOGGING_H | ||||
| #define DEMO_LOGGING_H | ||||
|  | ||||
| /* | ||||
|  * Initialise a logging system that can be used from FreeRTOS tasks and Win32 | ||||
|  * threads.  Do not call printf() directly while the scheduler is running. | ||||
|  * | ||||
|  * Set xLogToStdout, xLogToFile and xLogToUDP to either pdTRUE or pdFALSE to | ||||
|  * lot to stdout, a disk file and a UDP port respectively. | ||||
|  * | ||||
|  * If xLogToUDP is pdTRUE then ulRemoteIPAddress and usRemotePort must be set | ||||
|  * to the IP address and port number to which UDP log messages will be sent. | ||||
|  */ | ||||
| void vLoggingInit(	BaseType_t xLogToStdout, | ||||
| 					BaseType_t xLogToFile, | ||||
| 					BaseType_t xLogToUDP, | ||||
| 					uint32_t ulRemoteIPAddress, | ||||
| 					uint16_t usRemotePort ); | ||||
|  | ||||
| #endif /* DEMO_LOGGING_H */ | ||||
|  | ||||
| @@ -0,0 +1,373 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  * This project is a cut down version of the project described on the following | ||||
|  * link.  Only the simple UDP client and server and the TCP echo clients are | ||||
|  * included in the build: | ||||
|  * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html | ||||
|  */ | ||||
|  | ||||
| /* Standard includes. */ | ||||
| #include <stdio.h> | ||||
| #include <time.h> | ||||
|  | ||||
| /* FreeRTOS includes. */ | ||||
| #include <FreeRTOS.h> | ||||
| #include "task.h" | ||||
|  | ||||
| /* Demo application includes. */ | ||||
| #include "FreeRTOS_IP.h" | ||||
| #include "FreeRTOS_Sockets.h" | ||||
| #include "SimpleUDPClientAndServer.h" | ||||
| #include "SimpleTCPEchoServer.h" | ||||
| #include "TCPEchoClient_SingleTasks.h" | ||||
| #include "demo_logging.h" | ||||
|  | ||||
| /* Simple UDP client and server task parameters. */ | ||||
| #define mainSIMPLE_UDP_CLIENT_SERVER_TASK_PRIORITY		( tskIDLE_PRIORITY ) | ||||
| #define mainSIMPLE_UDP_CLIENT_SERVER_PORT				( 5005UL ) | ||||
|  | ||||
| /* Echo client task parameters - used for both TCP and UDP echo clients. */ | ||||
| #define mainECHO_CLIENT_TASK_STACK_SIZE 				( configMINIMAL_STACK_SIZE * 2 )	/* Not used in the Windows port. */ | ||||
| #define mainECHO_CLIENT_TASK_PRIORITY					( tskIDLE_PRIORITY + 1 ) | ||||
|  | ||||
| /* Echo server task parameters. */ | ||||
| #define mainECHO_SERVER_TASK_STACK_SIZE					( configMINIMAL_STACK_SIZE * 2 )	/* Not used in the Windows port. */ | ||||
| #define mainECHO_SERVER_TASK_PRIORITY					( tskIDLE_PRIORITY + 1 ) | ||||
|  | ||||
| /* Define a name that will be used for LLMNR and NBNS searches. */ | ||||
| #define mainHOST_NAME				"RTOSDemo" | ||||
| #define mainDEVICE_NICK_NAME		"windows_demo" | ||||
|  | ||||
| /* Set the following constants to 1 or 0 to define which tasks to include and | ||||
| exclude: | ||||
|  | ||||
| mainCREATE_SIMPLE_UDP_CLIENT_SERVER_TASKS:  When set to 1 two UDP client tasks | ||||
| and two UDP server tasks are created.  The clients talk to the servers.  One set | ||||
| of tasks use the standard sockets interface, and the other the zero copy sockets | ||||
| interface.  These tasks are self checking and will trigger a configASSERT() if | ||||
| they detect a difference in the data that is received from that which was sent. | ||||
| As these tasks use UDP, and can therefore loose packets, they will cause | ||||
| configASSERT() to be called when they are run in a less than perfect networking | ||||
| environment. | ||||
|  | ||||
| mainCREATE_TCP_ECHO_TASKS_SINGLE:  When set to 1 a set of tasks are created that | ||||
| send TCP echo requests to the standard echo port (port 7), then wait for and | ||||
| verify the echo reply, from within the same task (Tx and Rx are performed in the | ||||
| same RTOS task).  The IP address of the echo server must be configured using the | ||||
| configECHO_SERVER_ADDR0 to configECHO_SERVER_ADDR3 constants in | ||||
| FreeRTOSConfig.h. | ||||
|  | ||||
| mainCREATE_TCP_ECHO_SERVER_TASK:  When set to 1 a task is created that accepts | ||||
| connections on the standard echo port (port 7), then echos back any data | ||||
| received on that connection. | ||||
| */ | ||||
| #define mainCREATE_SIMPLE_UDP_CLIENT_SERVER_TASKS	1 | ||||
| #define mainCREATE_TCP_ECHO_TASKS_SINGLE			1 | ||||
| #define mainCREATE_TCP_ECHO_SERVER_TASK				0 | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* | ||||
|  * Just seeds the simple pseudo random number generator. | ||||
|  */ | ||||
| static void prvSRand( UBaseType_t ulSeed ); | ||||
|  | ||||
| /* | ||||
|  * Miscellaneous initialisation including preparing the logging and seeding the | ||||
|  * random number generator. | ||||
|  */ | ||||
| static void prvMiscInitialisation( void ); | ||||
|  | ||||
| /* The default IP and MAC address used by the demo.  The address configuration | ||||
| defined here will be used if ipconfigUSE_DHCP is 0, or if ipconfigUSE_DHCP is | ||||
| 1 but a DHCP server could not be contacted.  See the online documentation for | ||||
| more information. */ | ||||
| static const uint8_t ucIPAddress[ 4 ] = { configIP_ADDR0, configIP_ADDR1, configIP_ADDR2, configIP_ADDR3 }; | ||||
| static const uint8_t ucNetMask[ 4 ] = { configNET_MASK0, configNET_MASK1, configNET_MASK2, configNET_MASK3 }; | ||||
| static const uint8_t ucGatewayAddress[ 4 ] = { configGATEWAY_ADDR0, configGATEWAY_ADDR1, configGATEWAY_ADDR2, configGATEWAY_ADDR3 }; | ||||
| static const uint8_t ucDNSServerAddress[ 4 ] = { configDNS_SERVER_ADDR0, configDNS_SERVER_ADDR1, configDNS_SERVER_ADDR2, configDNS_SERVER_ADDR3 }; | ||||
|  | ||||
| /* Set the following constant to pdTRUE to log using the method indicated by the | ||||
| name of the constant, or pdFALSE to not log using the method indicated by the | ||||
| name of the constant.  Options include to standard out (xLogToStdout), to a disk | ||||
| file (xLogToFile), and to a UDP port (xLogToUDP).  If xLogToUDP is set to pdTRUE | ||||
| then UDP messages are sent to the IP address configured as the echo server | ||||
| address (see the configECHO_SERVER_ADDR0 definitions in FreeRTOSConfig.h) and | ||||
| the port number set by configPRINT_PORT in FreeRTOSConfig.h. */ | ||||
| const BaseType_t xLogToStdout = pdTRUE, xLogToFile = pdFALSE, xLogToUDP = pdFALSE; | ||||
|  | ||||
| /* Default MAC address configuration.  The demo creates a virtual network | ||||
| connection that uses this MAC address by accessing the raw Ethernet data | ||||
| to and from a real network connection on the host PC.  See the | ||||
| configNETWORK_INTERFACE_TO_USE definition for information on how to configure | ||||
| the real network connection to use. */ | ||||
| const uint8_t ucMACAddress[ 6 ] = { configMAC_ADDR0, configMAC_ADDR1, configMAC_ADDR2, configMAC_ADDR3, configMAC_ADDR4, configMAC_ADDR5 }; | ||||
|  | ||||
| /* Use by the pseudo random number generator. */ | ||||
| static UBaseType_t ulNextRand; | ||||
|  | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| int main( void ) | ||||
| { | ||||
| const uint32_t ulLongTime_ms = pdMS_TO_TICKS( 1000UL ); | ||||
|  | ||||
| 	/* | ||||
| 	 * Instructions for using this project are provided on: | ||||
| 	 * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/examples_FreeRTOS_simulator.html | ||||
| 	 */ | ||||
|  | ||||
| 	/* Miscellaneous initialisation including preparing the logging and seeding | ||||
| 	the random number generator. */ | ||||
| 	prvMiscInitialisation(); | ||||
|  | ||||
| 	/* Initialise the network interface. | ||||
|  | ||||
| 	***NOTE*** Tasks that use the network are created in the network event hook | ||||
| 	when the network is connected and ready for use (see the definition of | ||||
| 	vApplicationIPNetworkEventHook() below).  The address values passed in here | ||||
| 	are used if ipconfigUSE_DHCP is set to 0, or if ipconfigUSE_DHCP is set to 1 | ||||
| 	but a DHCP server cannot be	contacted. */ | ||||
| 	FreeRTOS_debug_printf( ( "FreeRTOS_IPInit\n" ) ); | ||||
| 	FreeRTOS_IPInit( ucIPAddress, ucNetMask, ucGatewayAddress, ucDNSServerAddress, ucMACAddress ); | ||||
|  | ||||
| 	/* Start the RTOS scheduler. */ | ||||
| 	FreeRTOS_debug_printf( ("vTaskStartScheduler\n") ); | ||||
| 	vTaskStartScheduler(); | ||||
|  | ||||
| 	/* If all is well, the scheduler will now be running, and the following | ||||
| 	line will never be reached.  If the following line does execute, then | ||||
| 	there was insufficient FreeRTOS heap memory available for the idle and/or | ||||
| 	timer tasks	to be created.  See the memory management section on the | ||||
| 	FreeRTOS web site for more details (this is standard text that is not not | ||||
| 	really applicable to the Win32 simulator port). */ | ||||
| 	for( ;; ) | ||||
| 	{ | ||||
| 		Sleep( ulLongTime_ms ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vApplicationIdleHook( void ) | ||||
| { | ||||
| const uint32_t ulMSToSleep = 1; | ||||
|  | ||||
| 	/* This is just a trivial example of an idle hook.  It is called on each | ||||
| 	cycle of the idle task if configUSE_IDLE_HOOK is set to 1 in | ||||
| 	FreeRTOSConfig.h.  It must *NOT* attempt to block.  In this case the | ||||
| 	idle task just sleeps to lower the CPU usage. */ | ||||
| 	Sleep( ulMSToSleep ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vAssertCalled( const char *pcFile, uint32_t ulLine ) | ||||
| { | ||||
| const uint32_t ulLongSleep = 1000UL; | ||||
| volatile uint32_t ulBlockVariable = 0UL; | ||||
| volatile char *pcFileName = ( volatile char *  ) pcFile; | ||||
| volatile uint32_t ulLineNumber = ulLine; | ||||
|  | ||||
| 	( void ) pcFileName; | ||||
| 	( void ) ulLineNumber; | ||||
|  | ||||
| 	FreeRTOS_debug_printf( ( "vAssertCalled( %s, %ld\n", pcFile, ulLine ) ); | ||||
|  | ||||
| 	/* Setting ulBlockVariable to a non-zero value in the debugger will allow | ||||
| 	this function to be exited. */ | ||||
| 	taskDISABLE_INTERRUPTS(); | ||||
| 	{ | ||||
| 		while( ulBlockVariable == 0UL ) | ||||
| 		{ | ||||
| 			Sleep( ulLongSleep ); | ||||
| 		} | ||||
| 	} | ||||
| 	taskENABLE_INTERRUPTS(); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* Called by FreeRTOS+TCP when the network connects or disconnects.  Disconnect | ||||
| events are only received if implemented in the MAC driver. */ | ||||
| void vApplicationIPNetworkEventHook( eIPCallbackEvent_t eNetworkEvent ) | ||||
| { | ||||
| uint32_t ulIPAddress, ulNetMask, ulGatewayAddress, ulDNSServerAddress; | ||||
| char cBuffer[ 16 ]; | ||||
| static BaseType_t xTasksAlreadyCreated = pdFALSE; | ||||
|  | ||||
| 	/* If the network has just come up...*/ | ||||
| 	if( eNetworkEvent == eNetworkUp ) | ||||
| 	{ | ||||
| 		/* Create the tasks that use the IP stack if they have not already been | ||||
| 		created. */ | ||||
| 		if( xTasksAlreadyCreated == pdFALSE ) | ||||
| 		{ | ||||
| 			/* See the comments above the definitions of these pre-processor | ||||
| 			macros at the top of this file for a description of the individual | ||||
| 			demo tasks. */ | ||||
| 			#if( mainCREATE_SIMPLE_UDP_CLIENT_SERVER_TASKS == 1 ) | ||||
| 			{ | ||||
| 				vStartSimpleUDPClientServerTasks( configMINIMAL_STACK_SIZE, mainSIMPLE_UDP_CLIENT_SERVER_PORT, mainSIMPLE_UDP_CLIENT_SERVER_TASK_PRIORITY ); | ||||
| 			} | ||||
| 			#endif /* mainCREATE_SIMPLE_UDP_CLIENT_SERVER_TASKS */ | ||||
|  | ||||
| 			#if( mainCREATE_TCP_ECHO_TASKS_SINGLE == 1 ) | ||||
| 			{ | ||||
| 				vStartTCPEchoClientTasks_SingleTasks( mainECHO_CLIENT_TASK_STACK_SIZE, mainECHO_CLIENT_TASK_PRIORITY ); | ||||
| 			} | ||||
| 			#endif /* mainCREATE_TCP_ECHO_TASKS_SINGLE */ | ||||
|  | ||||
| 			#if( mainCREATE_TCP_ECHO_SERVER_TASK == 1 ) | ||||
| 			{ | ||||
| 				vStartSimpleTCPServerTasks( mainECHO_SERVER_TASK_STACK_SIZE, mainECHO_SERVER_TASK_PRIORITY ); | ||||
| 			} | ||||
| 			#endif | ||||
|  | ||||
| 			xTasksAlreadyCreated = pdTRUE; | ||||
| 		} | ||||
|  | ||||
| 		/* Print out the network configuration, which may have come from a DHCP | ||||
| 		server. */ | ||||
| 		FreeRTOS_GetAddressConfiguration( &ulIPAddress, &ulNetMask, &ulGatewayAddress, &ulDNSServerAddress ); | ||||
| 		FreeRTOS_inet_ntoa( ulIPAddress, cBuffer ); | ||||
| 		FreeRTOS_printf( ( "\r\n\r\nIP Address: %s\r\n", cBuffer ) ); | ||||
|  | ||||
| 		FreeRTOS_inet_ntoa( ulNetMask, cBuffer ); | ||||
| 		FreeRTOS_printf( ( "Subnet Mask: %s\r\n", cBuffer ) ); | ||||
|  | ||||
| 		FreeRTOS_inet_ntoa( ulGatewayAddress, cBuffer ); | ||||
| 		FreeRTOS_printf( ( "Gateway Address: %s\r\n", cBuffer ) ); | ||||
|  | ||||
| 		FreeRTOS_inet_ntoa( ulDNSServerAddress, cBuffer ); | ||||
| 		FreeRTOS_printf( ( "DNS Server Address: %s\r\n\r\n\r\n", cBuffer ) ); | ||||
| 	} | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| void vApplicationMallocFailedHook( void ) | ||||
| { | ||||
| 	/* Called if a call to pvPortMalloc() fails because there is insufficient | ||||
| 	free memory available in the FreeRTOS heap.  pvPortMalloc() is called | ||||
| 	internally by FreeRTOS API functions that create tasks, queues, software | ||||
| 	timers, and semaphores.  The size of the FreeRTOS heap is set by the | ||||
| 	configTOTAL_HEAP_SIZE configuration constant in FreeRTOSConfig.h. */ | ||||
| 	vAssertCalled( __FILE__, __LINE__ ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| UBaseType_t uxRand( void ) | ||||
| { | ||||
| const uint32_t ulMultiplier = 0x015a4e35UL, ulIncrement = 1UL; | ||||
|  | ||||
| 	/* Utility function to generate a pseudo random number. */ | ||||
|  | ||||
| 	ulNextRand = ( ulMultiplier * ulNextRand ) + ulIncrement; | ||||
| 	return( ( int ) ( ulNextRand >> 16UL ) & 0x7fffUL ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvSRand( UBaseType_t ulSeed ) | ||||
| { | ||||
| 	/* Utility function to seed the pseudo random number generator. */ | ||||
|     ulNextRand = ulSeed; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void prvMiscInitialisation( void ) | ||||
| { | ||||
| time_t xTimeNow; | ||||
| uint32_t ulLoggingIPAddress; | ||||
|  | ||||
| 	ulLoggingIPAddress = FreeRTOS_inet_addr_quick( configECHO_SERVER_ADDR0, configECHO_SERVER_ADDR1, configECHO_SERVER_ADDR2, configECHO_SERVER_ADDR3 ); | ||||
| 	vLoggingInit( xLogToStdout, xLogToFile, xLogToUDP, ulLoggingIPAddress, configPRINT_PORT ); | ||||
|  | ||||
| 	/* Seed the random number generator. */ | ||||
| 	time( &xTimeNow ); | ||||
| 	FreeRTOS_debug_printf( ( "Seed for randomiser: %lu\n", xTimeNow ) ); | ||||
| 	prvSRand( ( uint32_t ) xTimeNow ); | ||||
| 	FreeRTOS_debug_printf( ( "Random numbers: %08X %08X %08X %08X\n", ipconfigRAND32(), ipconfigRAND32(), ipconfigRAND32(), ipconfigRAND32() ) ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if( ipconfigUSE_LLMNR != 0 ) || ( ipconfigUSE_NBNS != 0 ) || ( ipconfigDHCP_REGISTER_HOSTNAME == 1 ) | ||||
|  | ||||
| 	const char *pcApplicationHostnameHook( void ) | ||||
| 	{ | ||||
| 		/* Assign the name "FreeRTOS" to this network node.  This function will | ||||
| 		be called during the DHCP: the machine will be registered with an IP | ||||
| 		address plus this name. */ | ||||
| 		return mainHOST_NAME; | ||||
| 	} | ||||
|  | ||||
| #endif | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| #if( ipconfigUSE_LLMNR != 0 ) || ( ipconfigUSE_NBNS != 0 ) | ||||
|  | ||||
| 	BaseType_t xApplicationDNSQueryHook( const char *pcName ) | ||||
| 	{ | ||||
| 	BaseType_t xReturn; | ||||
|  | ||||
| 		/* Determine if a name lookup is for this node.  Two names are given | ||||
| 		to this node: that returned by pcApplicationHostnameHook() and that set | ||||
| 		by mainDEVICE_NICK_NAME. */ | ||||
| 		if( _stricmp( pcName, pcApplicationHostnameHook() ) == 0 ) | ||||
| 		{ | ||||
| 			xReturn = pdPASS; | ||||
| 		} | ||||
| 		else if( _stricmp( pcName, mainDEVICE_NICK_NAME ) == 0 ) | ||||
| 		{ | ||||
| 			xReturn = pdPASS; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			xReturn = pdFAIL; | ||||
| 		} | ||||
|  | ||||
| 		return xReturn; | ||||
| 	} | ||||
|  | ||||
| #endif | ||||
|  | ||||
| /* | ||||
|  * Callback that provides the inputs necessary to generate a randomized TCP | ||||
|  * Initial Sequence Number per RFC 6528.  THIS IS ONLY A DUMMY IMPLEMENTATION | ||||
|  * THAT RETURNS A PSEUDO RANDOM NUMBER SO IS NOT INTENDED FOR USE IN PRODUCTION | ||||
|  * SYSTEMS. | ||||
|  */ | ||||
| extern uint32_t ulApplicationGetNextSequenceNumber( uint32_t ulSourceAddress, | ||||
| 													uint16_t usSourcePort, | ||||
| 													uint32_t ulDestinationAddress, | ||||
| 													uint16_t usDestinationPort ) | ||||
| { | ||||
| 	( void ) ulSourceAddress; | ||||
| 	( void ) usSourcePort; | ||||
| 	( void ) ulDestinationAddress; | ||||
| 	( void ) usDestinationPort; | ||||
|  | ||||
| 	return uxRand(); | ||||
| } | ||||
|  | ||||
| @@ -0,0 +1,667 @@ | ||||
| /* | ||||
| 	Copyright 2001, 2002 Georges Menie (www.menie.org) | ||||
| 	stdarg version contributed by Christian Ettinger | ||||
|  | ||||
| 	This program is free software; you can redistribute it and/or modify | ||||
| 	it under the terms of the GNU Lesser General Public License as published by | ||||
| 	the Free Software Foundation; either version 2 of the License, or | ||||
| 	(at your option) any later version. | ||||
|  | ||||
| 	Changes for the FreeRTOS ports: | ||||
|  | ||||
| 	- The dot in "%-8.8s" | ||||
| 	- The specifiers 'l' (long) and 'L' (long long) | ||||
| 	- The specifier 'u' for unsigned | ||||
| 	- Dot notation for IP addresses: | ||||
| 	  sprintf("IP = %xip\n", 0xC0A80164); | ||||
|       will produce "IP = 192.168.1.100\n" | ||||
| */ | ||||
|  | ||||
| #include <stdarg.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #include "FreeRTOS.h" | ||||
|  | ||||
| #define PAD_RIGHT 1 | ||||
| #define PAD_ZERO 2 | ||||
|  | ||||
| /* | ||||
|  * Return 1 for readable, 2 for writeable, 3 for both. | ||||
|  * Function must be provided by the application. | ||||
|  */ | ||||
| extern BaseType_t xApplicationMemoryPermissions( uint32_t aAddress ); | ||||
|  | ||||
| extern void vOutputChar( const char cChar, const TickType_t xTicksToWait  ); | ||||
| static const TickType_t xTicksToWait = pdMS_TO_TICKS( 20 ); | ||||
|  | ||||
| struct xPrintFlags | ||||
| { | ||||
| 	int base; | ||||
| 	int width; | ||||
| 	int printLimit; | ||||
| 	unsigned | ||||
| 		pad : 8, | ||||
| 		letBase : 8, | ||||
| 		isSigned : 1, | ||||
| 		isNumber : 1, | ||||
| 		long32 : 1, | ||||
| 		long64 : 1; | ||||
| }; | ||||
|  | ||||
| struct SStringBuf | ||||
| { | ||||
| 	char *str; | ||||
| 	const char *orgStr; | ||||
| 	const char *nulPos; | ||||
| 	int curLen; | ||||
| 	struct xPrintFlags flags; | ||||
| }; | ||||
|  | ||||
| static void strbuf_init( struct SStringBuf *apStr, char *apBuf, const char *apMaxStr ) | ||||
| { | ||||
| 	apStr->str = apBuf; | ||||
| 	apStr->orgStr = apBuf; | ||||
| 	apStr->nulPos = apMaxStr-1; | ||||
| 	apStr->curLen = 0; | ||||
|  | ||||
| 	memset( &apStr->flags, '\0', sizeof( apStr->flags ) ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t strbuf_printchar( struct SStringBuf *apStr, int c ) | ||||
| { | ||||
| 	if( apStr->str == NULL ) | ||||
| 	{ | ||||
| 		vOutputChar( ( char ) c, xTicksToWait ); | ||||
| 		apStr->curLen++; | ||||
| 		return pdTRUE; | ||||
| 	} | ||||
| 	if( apStr->str < apStr->nulPos ) | ||||
| 	{ | ||||
| 		*( apStr->str++ ) = c; | ||||
| 		apStr->curLen++; | ||||
| 		return pdTRUE; | ||||
| 	} | ||||
| 	if( apStr->str == apStr->nulPos ) | ||||
| 	{ | ||||
| 		*( apStr->str++ ) = '\0'; | ||||
| 	} | ||||
| 	return pdFALSE; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static portINLINE BaseType_t strbuf_printchar_inline( struct SStringBuf *apStr, int c ) | ||||
| { | ||||
| 	if( apStr->str == NULL ) | ||||
| 	{ | ||||
| 		vOutputChar( ( char ) c, xTicksToWait ); | ||||
| 		if( c == 0 ) | ||||
| 		{ | ||||
| 			return pdFALSE; | ||||
| 		} | ||||
| 		apStr->curLen++; | ||||
| 		return pdTRUE; | ||||
| 	} | ||||
| 	if( apStr->str < apStr->nulPos ) | ||||
| 	{ | ||||
| 		*(apStr->str++) = c; | ||||
| 		if( c == 0 ) | ||||
| 		{ | ||||
| 			return pdFALSE; | ||||
| 		} | ||||
| 		apStr->curLen++; | ||||
| 		return pdTRUE; | ||||
| 	} | ||||
| 	if( apStr->str == apStr->nulPos ) | ||||
| 	{ | ||||
| 		*( apStr->str++ ) = '\0'; | ||||
| 	} | ||||
| 	return pdFALSE; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static portINLINE int i2hex( int aCh ) | ||||
| { | ||||
| int iResult; | ||||
|  | ||||
| 	if( aCh < 10 ) | ||||
| 	{ | ||||
| 		iResult = '0' + aCh; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		iResult = 'A' + aCh - 10; | ||||
| 	} | ||||
|  | ||||
| 	return iResult; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t prints(struct SStringBuf *apBuf, const char *apString ) | ||||
| { | ||||
| 	register int padchar = ' '; | ||||
| 	int i,len; | ||||
|  | ||||
| 	if( xApplicationMemoryPermissions( ( uint32_t )apString ) == 0 ) | ||||
| 	{ | ||||
| 		/* The user has probably made a mistake with the parameter | ||||
| 		for '%s', the memory is not readbale. */ | ||||
| 		apString = "INV_MEM"; | ||||
| 	} | ||||
|  | ||||
| 	if( apBuf->flags.width > 0 ) | ||||
| 	{ | ||||
| 		register int len = 0; | ||||
| 		register const char *ptr; | ||||
| 		for( ptr = apString; *ptr; ++ptr ) | ||||
| 		{ | ||||
| 			++len; | ||||
| 		} | ||||
|  | ||||
| 		if( len >= apBuf->flags.width ) | ||||
| 		{ | ||||
| 			apBuf->flags.width = 0; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			apBuf->flags.width -= len; | ||||
| 		} | ||||
|  | ||||
| 		if( apBuf->flags.pad & PAD_ZERO ) | ||||
| 		{ | ||||
| 			padchar = '0'; | ||||
| 		} | ||||
| 	} | ||||
| 	if( ( apBuf->flags.pad & PAD_RIGHT ) == 0 ) | ||||
| 	{ | ||||
| 		for( ; apBuf->flags.width > 0; --apBuf->flags.width ) | ||||
| 		{ | ||||
| 			if( strbuf_printchar( apBuf, padchar ) == 0 ) | ||||
| 			{ | ||||
| 				return pdFALSE; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if( ( apBuf->flags.isNumber == pdTRUE ) && ( apBuf->flags.pad == pdTRUE ) ) | ||||
| 	{ | ||||
| 		/* The string to print represents an integer number. | ||||
| 		 * In this case, printLimit is the min number of digits to print | ||||
| 		 * If the length of the number to print is less than the min nb of i | ||||
| 		 * digits to display, we add 0 before printing the number | ||||
| 		 */ | ||||
| 		len = strlen( apString ); | ||||
|  | ||||
| 		if( len < apBuf->flags.printLimit ) | ||||
| 		{ | ||||
| 			i = apBuf->flags.printLimit - len; | ||||
| 			for( ; i; i-- ) | ||||
| 			{ | ||||
| 				if( strbuf_printchar( apBuf, '0' )  == 0 ) | ||||
| 				{ | ||||
| 					return pdFALSE; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	/* The string to print is not the result of a number conversion to ascii. | ||||
| 	 * For a string, printLimit is the max number of characters to display | ||||
| 	 */ | ||||
| 	for( ; apBuf->flags.printLimit && *apString ; ++apString, --apBuf->flags.printLimit ) | ||||
| 	{ | ||||
| 		if( !strbuf_printchar( apBuf, *apString ) ) | ||||
| 		{ | ||||
| 			return pdFALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	for( ; apBuf->flags.width > 0; --apBuf->flags.width ) | ||||
| 	{ | ||||
| 		if( !strbuf_printchar( apBuf, padchar ) ) | ||||
| 		{ | ||||
| 			return pdFALSE; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return pdTRUE; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| /* the following should be enough for 32 bit int */ | ||||
| #define PRINT_BUF_LEN 12	/* to print 4294967296 */ | ||||
|  | ||||
| #if	SPRINTF_LONG_LONG | ||||
| #warning 64-bit libraries will be included as well | ||||
| static BaseType_t printll( struct SStringBuf *apBuf, long long i ) | ||||
| { | ||||
| 	char print_buf[ 2 * PRINT_BUF_LEN ]; | ||||
| 	register char *s; | ||||
| 	register int t, neg = 0; | ||||
| 	register unsigned long long u = i; | ||||
| 	lldiv_t lldiv_result; | ||||
|  | ||||
| /* typedef struct | ||||
|  * { | ||||
|  * 	long long int quot; // quotient | ||||
|  * 	long long int rem;  // remainder | ||||
|  * } lldiv_t; | ||||
|  */ | ||||
|  | ||||
| 	apBuf->flags.isNumber = pdTRUE;	/* Parameter for prints */ | ||||
| 	if( i == 0LL ) | ||||
| 	{ | ||||
| 		print_buf[ 0 ] = '0'; | ||||
| 		print_buf[ 1 ] = '\0'; | ||||
| 		return prints( apBuf, print_buf ); | ||||
| 	} | ||||
|  | ||||
| 	if( ( apBuf->flags.isSigned == pdTRUE ) && ( apBuf->flags.base == 10 ) && ( i < 0LL ) ) | ||||
| 	{ | ||||
| 		neg = 1; | ||||
| 		u = -i; | ||||
| 	} | ||||
|  | ||||
| 	s = print_buf + sizeof( print_buf ) - 1; | ||||
|  | ||||
| 	*s = '\0'; | ||||
| 	/* 18446744073709551616 */ | ||||
| 	while( u != 0 ) | ||||
| 	{ | ||||
| 		lldiv_result = lldiv( u, ( unsigned long long ) apBuf->flags.base ); | ||||
| 		t = lldiv_result.rem; | ||||
| 		if( t >= 10 ) | ||||
| 		{ | ||||
| 			t += apBuf->flags.letBase - '0' - 10; | ||||
| 		} | ||||
| 		*( --s ) = t + '0'; | ||||
| 		u = lldiv_result.quot; | ||||
| 	} | ||||
|  | ||||
| 	if( neg != 0 ) | ||||
| 	{ | ||||
| 		if( ( apBuf->flags.width != 0 ) && ( apBuf->flags.pad & PAD_ZERO ) ) | ||||
| 		{ | ||||
| 			if( !strbuf_printchar( apBuf, '-' ) ) | ||||
| 			{ | ||||
| 				return pdFALSE; | ||||
| 			} | ||||
| 			--apBuf->flags.width; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			*( --s ) = '-'; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return prints( apBuf, s ); | ||||
| } | ||||
| #endif	/* SPRINTF_LONG_LONG */ | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t printi( struct SStringBuf *apBuf, int i ) | ||||
| { | ||||
| 	char print_buf[ PRINT_BUF_LEN ]; | ||||
| 	register char *s; | ||||
| 	register int t, neg = 0; | ||||
| 	register unsigned int u = i; | ||||
| 	register unsigned base = apBuf->flags.base; | ||||
|  | ||||
| 	apBuf->flags.isNumber = pdTRUE;	/* Parameter for prints */ | ||||
|  | ||||
| 	if( i == 0 ) | ||||
| 	{ | ||||
| 		print_buf[ 0 ] = '0'; | ||||
| 		print_buf[ 1 ] = '\0'; | ||||
| 		return prints( apBuf, print_buf ); | ||||
| 	} | ||||
|  | ||||
| 	if( ( apBuf->flags.isSigned == pdTRUE ) && ( base == 10 ) && ( i < 0 ) ) | ||||
| 	{ | ||||
| 		neg = 1; | ||||
| 		u = -i; | ||||
| 	} | ||||
|  | ||||
| 	s = print_buf + sizeof( print_buf ) - 1; | ||||
|  | ||||
| 	*s = '\0'; | ||||
| 	switch( base ) | ||||
| 	{ | ||||
| 	case 16: | ||||
| 		while( u != 0 ) | ||||
| 		{ | ||||
| 			t = u & 0xF; | ||||
| 			if( t >= 10 ) | ||||
| 			{ | ||||
| 				t += apBuf->flags.letBase - '0' - 10; | ||||
| 			} | ||||
| 			*( --s ) = t + '0'; | ||||
| 			u >>= 4; | ||||
| 		} | ||||
| 		break; | ||||
|  | ||||
| 	case 8: | ||||
| 	case 10: | ||||
| 		/* GCC compiles very efficient */ | ||||
| 		while( u ) | ||||
| 		{ | ||||
| 			t = u % base; | ||||
| 			*( --s ) = t + '0'; | ||||
| 			u /= base; | ||||
| 		} | ||||
| 		break; | ||||
| /* | ||||
| 	// The generic case, not yet in use | ||||
| 	default: | ||||
| 		while( u ) | ||||
| 		{ | ||||
| 			t = u % base; | ||||
| 			if( t >= 10) | ||||
| 			{ | ||||
| 				t += apBuf->flags.letBase - '0' - 10; | ||||
| 			} | ||||
| 			*( --s ) = t + '0'; | ||||
| 			u /= base; | ||||
| 		} | ||||
| 		break; | ||||
| */ | ||||
| 	} | ||||
|  | ||||
| 	if( neg != 0 ) | ||||
| 	{ | ||||
| 		if( apBuf->flags.width && (apBuf->flags.pad & PAD_ZERO ) ) | ||||
| 		{ | ||||
| 			if( strbuf_printchar( apBuf, '-' ) == 0 ) | ||||
| 			{ | ||||
| 				return pdFALSE; | ||||
| 			} | ||||
| 			--apBuf->flags.width; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			*( --s ) = '-'; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return prints( apBuf, s ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static BaseType_t printIp(struct SStringBuf *apBuf, unsigned i ) | ||||
| { | ||||
| 	char print_buf[16]; | ||||
|  | ||||
| 	sprintf( print_buf, "%u.%u.%u.%u", | ||||
| 		i >> 24, | ||||
| 		( i >> 16 ) & 0xff, | ||||
| 		( i >> 8 ) & 0xff, | ||||
| 		i & 0xff ); | ||||
| 	apBuf->flags.isNumber = pdTRUE;	/* Parameter for prints */ | ||||
| 	prints( apBuf, print_buf ); | ||||
|  | ||||
| 	return pdTRUE; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| static void tiny_print( struct SStringBuf *apBuf, const char *format, va_list args ) | ||||
| { | ||||
| 	char scr[2]; | ||||
|  | ||||
| 	for( ; ; ) | ||||
| 	{ | ||||
| 		int ch = *( format++ ); | ||||
|  | ||||
| 		if( ch != '%' ) | ||||
| 		{ | ||||
| 			do | ||||
| 			{ | ||||
| 				/* Put the most like flow in a small loop */ | ||||
| 				if( strbuf_printchar_inline( apBuf, ch ) == 0 ) | ||||
| 				{ | ||||
| 					return; | ||||
| 				} | ||||
| 				ch = *( format++ ); | ||||
| 			} while( ch != '%' ); | ||||
| 		} | ||||
| 		ch = *( format++ ); | ||||
| 		/* Now ch has character after '%', format pointing to next */ | ||||
|  | ||||
| 		if( ch == '\0' ) | ||||
| 		{ | ||||
| 			break; | ||||
| 		} | ||||
| 		if( ch == '%' ) | ||||
| 		{ | ||||
| 			if( strbuf_printchar( apBuf, ch ) == 0 ) | ||||
| 			{ | ||||
| 				return; | ||||
| 			} | ||||
| 			continue; | ||||
| 		} | ||||
| 		memset( &apBuf->flags, '\0', sizeof( apBuf->flags ) ); | ||||
|  | ||||
| 		if( ch == '-' ) | ||||
| 		{ | ||||
| 			ch = *( format++ ); | ||||
| 			apBuf->flags.pad = PAD_RIGHT; | ||||
| 		} | ||||
| 		while( ch == '0' ) | ||||
| 		{ | ||||
| 			ch = *( format++ ); | ||||
| 			apBuf->flags.pad |= PAD_ZERO; | ||||
| 		} | ||||
| 		if( ch == '*' ) | ||||
| 		{ | ||||
| 			ch = *( format++ ); | ||||
| 			apBuf->flags.width = va_arg( args, int ); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			while( ch >= '0' && ch <= '9' ) | ||||
| 			{ | ||||
| 				apBuf->flags.width *= 10; | ||||
| 				apBuf->flags.width += ch - '0'; | ||||
| 				ch = *( format++ ); | ||||
| 			} | ||||
| 		} | ||||
| 		if( ch == '.' ) | ||||
| 		{ | ||||
| 			ch = *( format++ ); | ||||
| 			if( ch == '*' ) | ||||
| 			{ | ||||
| 				apBuf->flags.printLimit = va_arg( args, int ); | ||||
| 				ch = *( format++ ); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				while( ch >= '0' && ch <= '9' ) | ||||
| 				{ | ||||
| 					apBuf->flags.printLimit *= 10; | ||||
| 					apBuf->flags.printLimit += ch - '0'; | ||||
| 					ch = *( format++ ); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		if( apBuf->flags.printLimit == 0 ) | ||||
| 		{ | ||||
| 			apBuf->flags.printLimit--;  /* -1: make it unlimited */ | ||||
| 		} | ||||
| 		if( ch == 's' ) | ||||
| 		{ | ||||
| 			register char *s = ( char * )va_arg( args, int ); | ||||
| 			if( prints( apBuf, s ? s : "(null)" ) == 0 ) | ||||
| 			{ | ||||
| 				break; | ||||
| 			} | ||||
| 			continue; | ||||
| 		} | ||||
| 		if( ch == 'c' ) | ||||
| 		{ | ||||
| 			/* char are converted to int then pushed on the stack */ | ||||
| 			scr[0] = ( char ) va_arg( args, int ); | ||||
|  | ||||
| 			if( strbuf_printchar( apBuf, scr[0] )  == 0 ) | ||||
| 			{ | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			continue; | ||||
| 		} | ||||
| 		if( ch == 'l' ) | ||||
| 		{ | ||||
| 			ch = *( format++ ); | ||||
| 			apBuf->flags.long32 = 1; | ||||
| 			/* Makes not difference as u32 == long */ | ||||
| 		} | ||||
| 		if( ch == 'L' ) | ||||
| 		{ | ||||
| 			ch = *( format++ ); | ||||
| 			apBuf->flags.long64 = 1; | ||||
| 			/* Does make a difference */ | ||||
| 		} | ||||
| 		apBuf->flags.base = 10; | ||||
| 		apBuf->flags.letBase = 'a'; | ||||
|  | ||||
| 		if( ch == 'd' || ch == 'u' ) | ||||
| 		{ | ||||
| 			apBuf->flags.isSigned = ( ch == 'd' ); | ||||
| #if	SPRINTF_LONG_LONG | ||||
| 			if( apBuf->flags.long64 != pdFALSE ) | ||||
| 			{ | ||||
| 				if( printll( apBuf, va_arg( args, long long ) ) == 0 ) | ||||
| 				{ | ||||
| 					break; | ||||
| 				} | ||||
| 			} else | ||||
| #endif	/* SPRINTF_LONG_LONG */ | ||||
| 			if( printi( apBuf, va_arg( args, int ) ) == 0 ) | ||||
| 			{ | ||||
| 				break; | ||||
| 			} | ||||
| 			continue; | ||||
| 		} | ||||
|  | ||||
| 		apBuf->flags.base = 16;		/* From here all hexadecimal */ | ||||
|  | ||||
| 		if( ch == 'x' && format[0] == 'i' && format[1] == 'p' ) | ||||
| 		{ | ||||
| 			format += 2;	/* eat the "xi" of "xip" */ | ||||
| 			/* Will use base 10 again */ | ||||
| 			if( printIp( apBuf, va_arg( args, int ) ) == 0 ) | ||||
| 			{ | ||||
| 				break; | ||||
| 			} | ||||
| 			continue; | ||||
| 		} | ||||
| 		if( ch == 'x' || ch == 'X' || ch == 'p' || ch == 'o' ) | ||||
| 		{ | ||||
| 			if( ch == 'X' ) | ||||
| 			{ | ||||
| 				apBuf->flags.letBase = 'A'; | ||||
| 			} | ||||
| 			else if( ch == 'o' ) | ||||
| 			{ | ||||
| 				apBuf->flags.base = 8; | ||||
| 			} | ||||
| #if	SPRINTF_LONG_LONG | ||||
| 			if( apBuf->flags.long64 != pdFALSE ) | ||||
| 			{ | ||||
| 				if( printll( apBuf, va_arg( args, long long ) ) == 0 ) | ||||
| 				{ | ||||
| 					break; | ||||
| 				} | ||||
| 			} else | ||||
| #endif	/* SPRINTF_LONG_LONG */ | ||||
| 			if( printi( apBuf, va_arg( args, int ) ) == 0 ) | ||||
| 			{ | ||||
| 				break; | ||||
| 			} | ||||
| 			continue; | ||||
| 		} | ||||
| 	} | ||||
| 	strbuf_printchar( apBuf, '\0' ); | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| int vsnprintf( char *apBuf, size_t aMaxLen, const char *apFmt, va_list args ) | ||||
| { | ||||
| 	struct SStringBuf strBuf; | ||||
| 	strbuf_init( &strBuf, apBuf, ( const char* )apBuf + aMaxLen ); | ||||
| 	tiny_print( &strBuf, apFmt, args ); | ||||
|  | ||||
| 	return strBuf.curLen; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| int snprintf( char *apBuf, size_t aMaxLen, const char *apFmt, ... ) | ||||
| { | ||||
| 	va_list args; | ||||
|  | ||||
| 	va_start( args,  apFmt ); | ||||
| 	struct SStringBuf strBuf; | ||||
| 	strbuf_init( &strBuf, apBuf, ( const char* )apBuf + aMaxLen ); | ||||
| 	tiny_print( &strBuf, apFmt, args ); | ||||
| 	va_end( args ); | ||||
|  | ||||
| 	return strBuf.curLen; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| int sprintf( char *apBuf, const char *apFmt, ... ) | ||||
| { | ||||
| 	va_list args; | ||||
|  | ||||
| 	va_start( args,  apFmt ); | ||||
| 	struct SStringBuf strBuf; | ||||
| 	strbuf_init( &strBuf, apBuf, ( const char * )apBuf + 1024 ); | ||||
| 	tiny_print( &strBuf, apFmt, args ); | ||||
| 	va_end( args ); | ||||
|  | ||||
| 	return strBuf.curLen; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| int vsprintf( char *apBuf, const char *apFmt, va_list args ) | ||||
| { | ||||
| 	struct SStringBuf strBuf; | ||||
| 	strbuf_init( &strBuf, apBuf, ( const char* ) apBuf + 1024 ); | ||||
| 	tiny_print( &strBuf, apFmt, args ); | ||||
|  | ||||
| 	return strBuf.curLen; | ||||
| } | ||||
| /*-----------------------------------------------------------*/ | ||||
|  | ||||
| const char *mkSize (unsigned long long aSize, char *apBuf, int aLen) | ||||
| { | ||||
| static char retString[33]; | ||||
| size_t gb, mb, kb, sb; | ||||
|  | ||||
| 	if (apBuf == NULL) { | ||||
| 		apBuf = retString; | ||||
| 		aLen = sizeof( retString ); | ||||
| 	} | ||||
| 	gb = aSize / (1024*1024*1024); | ||||
| 	aSize -= gb * (1024*1024*1024); | ||||
| 	mb = aSize / (1024*1024); | ||||
| 	aSize -= mb * (1024*1024); | ||||
| 	kb = aSize / (1024); | ||||
| 	aSize -= kb * (1024); | ||||
| 	sb = aSize; | ||||
| 	if( gb ) | ||||
| 	{ | ||||
| 		snprintf (apBuf, aLen, "%u.%02u GB", ( unsigned ) gb, ( unsigned ) ( ( 100 * mb ) / 1024ul ) ); | ||||
| 	} | ||||
| 	else if( mb ) | ||||
| 	{ | ||||
| 		snprintf (apBuf, aLen, "%u.%02u MB", ( unsigned ) mb, ( unsigned ) ( ( 100 * kb) / 1024ul ) ); | ||||
| 	} | ||||
| 	else if( kb != 0ul ) | ||||
| 	{ | ||||
| 		snprintf (apBuf, aLen, "%u.%02u KB", ( unsigned ) kb, ( unsigned ) ( ( 100 * sb) / 1024ul ) ); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		snprintf (apBuf, aLen, "%u bytes", ( unsigned ) sb); | ||||
| 	} | ||||
| 	return apBuf; | ||||
| } | ||||
| @@ -0,0 +1,4 @@ | ||||
| FreeRTOS+UDP was removed in FreeRTOS V10.1.0 as it was replaced by FreeRTOS+TCP, | ||||
| which was brought into the main download in FreeRTOS V10.0.0.  FreeRTOS+TCP can | ||||
| be configured as a UDP only stack, and FreeRTOS+UDP does not contain the patches | ||||
| applied to FreeRTOS+TCP. | ||||
| @@ -0,0 +1,5 @@ | ||||
| [{000214A0-0000-0000-C000-000000000046}] | ||||
| Prop3=19,2 | ||||
| [InternetShortcut] | ||||
| URL=http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html | ||||
| IDList= | ||||
| @@ -0,0 +1,4 @@ | ||||
| FreeRTOS+UDP was removed in FreeRTOS V10.1.0 as it was replaced by FreeRTOS+TCP, | ||||
| which was brought into the main download in FreeRTOS V10.0.0.  FreeRTOS+TCP can | ||||
| be configured as a UDP only stack, and FreeRTOS+UDP does not contain the patches | ||||
| applied to FreeRTOS+TCP. | ||||
| @@ -0,0 +1,5 @@ | ||||
| [{000214A0-0000-0000-C000-000000000046}] | ||||
| Prop3=19,2 | ||||
| [InternetShortcut] | ||||
| URL=http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html | ||||
| IDList= | ||||
| @@ -0,0 +1,4 @@ | ||||
| FreeRTOS+UDP was removed in FreeRTOS V10.1.0 as it was replaced by FreeRTOS+TCP, | ||||
| which was brought into the main download in FreeRTOS V10.0.0.  FreeRTOS+TCP can | ||||
| be configured as a UDP only stack, and FreeRTOS+UDP does not contain the patches | ||||
| applied to FreeRTOS+TCP. | ||||
| @@ -0,0 +1,5 @@ | ||||
| [{000214A0-0000-0000-C000-000000000046}] | ||||
| Prop3=19,2 | ||||
| [InternetShortcut] | ||||
| URL=http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html | ||||
| IDList= | ||||
| @@ -0,0 +1,97 @@ | ||||
| /* | ||||
|  * FreeRTOS Kernel V10.2.1 | ||||
|  * 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://www.FreeRTOS.org | ||||
|  * http://aws.amazon.com/freertos | ||||
|  * | ||||
|  * 1 tab == 4 spaces! | ||||
|  */ | ||||
|  | ||||
| #ifndef FREERTOS_CONFIG_H | ||||
| #define FREERTOS_CONFIG_H | ||||
|  | ||||
| /*----------------------------------------------------------- | ||||
|  * Application specific definitions. | ||||
|  * | ||||
|  * These definitions should be adjusted for your particular hardware and | ||||
|  * application requirements. | ||||
|  * | ||||
|  * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE | ||||
|  * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. | ||||
|  * http://www.freertos.org/a00110.html | ||||
|  *----------------------------------------------------------*/ | ||||
|  | ||||
| #define configUSE_PREEMPTION			1 | ||||
| #define configUSE_IDLE_HOOK				1 | ||||
| #define configUSE_TICK_HOOK				0 | ||||
| #define configTICK_RATE_HZ				( 1000 ) /* In this non-real time simulated environment the tick frequency has to be at least a multiple of the Win32 tick frequency, and therefore very slow. */ | ||||
| #define configMINIMAL_STACK_SIZE		( ( unsigned short ) 60 ) /* In this simulated case, the stack only has to hold one small structure as the real stack is part of the Win32 thread. */ | ||||
| #define configTOTAL_HEAP_SIZE			( ( size_t ) 0 ) /* This parameter has no effect when heap_3.c is included in the project. */ | ||||
| #define configMAX_TASK_NAME_LEN			( 7 ) | ||||
| #define configUSE_TRACE_FACILITY		1 | ||||
| #define configUSE_16_BIT_TICKS			0 | ||||
| #define configIDLE_SHOULD_YIELD			1 | ||||
| #define configUSE_CO_ROUTINES 			0 | ||||
| #define configUSE_MUTEXES				1 | ||||
| #define configCHECK_FOR_STACK_OVERFLOW	0 /* Not applicable to the Win32 port. */ | ||||
| #define configUSE_RECURSIVE_MUTEXES		1 | ||||
| #define configQUEUE_REGISTRY_SIZE		0 | ||||
| #define configUSE_MALLOC_FAILED_HOOK	0 | ||||
| #define configUSE_APPLICATION_TASK_TAG	0 | ||||
| #define configUSE_COUNTING_SEMAPHORES	1 | ||||
| #define configUSE_ALTERNATIVE_API		0 | ||||
|  | ||||
| #define configUSE_TIMERS				1 | ||||
| #define configTIMER_TASK_PRIORITY		2 | ||||
| #define configTIMER_QUEUE_LENGTH		20 | ||||
| #define configTIMER_TASK_STACK_DEPTH	( configMINIMAL_STACK_SIZE * 2 ) | ||||
|  | ||||
| #define configMAX_PRIORITIES			( 7 ) | ||||
| #define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) | ||||
|  | ||||
|  | ||||
| /* Co-routine definitions. */ | ||||
| #define configUSE_CO_ROUTINES 			0 | ||||
| #define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) | ||||
|  | ||||
| /* Set the following definitions to 1 to include the API function, or zero | ||||
| to exclude the API function. */ | ||||
|  | ||||
| #define INCLUDE_vTaskPrioritySet			1 | ||||
| #define INCLUDE_uxTaskPriorityGet			1 | ||||
| #define INCLUDE_vTaskDelete					1 | ||||
| #define INCLUDE_vTaskCleanUpResources		0 | ||||
| #define INCLUDE_vTaskSuspend				1 | ||||
| #define INCLUDE_vTaskDelayUntil				1 | ||||
| #define INCLUDE_vTaskDelay					1 | ||||
| #define INCLUDE_uxTaskGetStackHighWaterMark	1 | ||||
| #define INCLUDE_xTaskGetSchedulerState		1 | ||||
|  | ||||
| /* Run time stats gathering definitions. */ | ||||
| #define configGENERATE_RUN_TIME_STATS	0 | ||||
|  | ||||
| extern void vAssertCalled( void ); | ||||
| #define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled() | ||||
|  | ||||
| /* The TCP port used by both the secure client and the secure server. */ | ||||
| #define configTCP_PORT_NUMBER	5001 | ||||
|  | ||||
| #endif /* FREERTOS_CONFIG_H */ | ||||
| @@ -0,0 +1,20 @@ | ||||
|  | ||||
| Microsoft Visual Studio Solution File, Format Version 11.00 | ||||
| # Visual C++ Express 2010 | ||||
| Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WIN32", "WIN32.vcxproj", "{C686325E-3261-42F7-AEB1-DDE5280E1CEB}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		Debug|Win32 = Debug|Win32 | ||||
| 		Release|Win32 = Release|Win32 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||
| 		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.ActiveCfg = Debug|Win32 | ||||
| 		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Debug|Win32.Build.0 = Debug|Win32 | ||||
| 		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Release|Win32.ActiveCfg = Release|Win32 | ||||
| 		{C686325E-3261-42F7-AEB1-DDE5280E1CEB}.Release|Win32.Build.0 = Release|Win32 | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(SolutionProperties) = preSolution | ||||
| 		HideSolutionNode = FALSE | ||||
| 	EndGlobalSection | ||||
| EndGlobal | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user