diff options
| author | tmk <hasu@tmk-kbd.com> | 2015-05-13 11:13:10 +0900 | 
|---|---|---|
| committer | tmk <hasu@tmk-kbd.com> | 2015-05-13 11:13:10 +0900 | 
| commit | f6d56675f9f981c5464f0ca7a1fbb0162154e8c5 (patch) | |
| tree | 57c9d4b3808a26116ae0ee7956fc00b84841aa2b /protocol/lufa/LUFA-git/Projects/Webserver/Lib/TELNETServerApp.c | |
| parent | 4d116a04e94cf0d19317d5b44e4fa9f34a3e5594 (diff) | |
Squashed 'tmk_core/' changes from caca2c0..dc0e46e
dc0e46e Rename LUFA to LUFA-git
3bfa7fa Remove LUFA-120730
215b764 Merge commit 'afa0f22a9299686fd88f58ce09c5b521ac917e8f' as 'protocol/lufa/LUFA'
afa0f22 Squashed 'protocol/lufa/LUFA/' content from commit def7fca
c0c42fa Remove submodule of LUFA
30f897d Merge commit '87ced33feb74e79c3281dda36eb6d6d153399b41' as 'protocol/usb_hid/USB_Host_Shield_2.0'
87ced33 Squashed 'protocol/usb_hid/USB_Host_Shield_2.0/' content from commit aab4a69
14f6d49 Remove submodule of USB_Host_Shield_2.0
git-subtree-dir: tmk_core
git-subtree-split: dc0e46eaa4367d4e218f8816e3c117895820f07c
Diffstat (limited to 'protocol/lufa/LUFA-git/Projects/Webserver/Lib/TELNETServerApp.c')
| m--------- | protocol/lufa/LUFA-git | 0 | ||||
| -rw-r--r-- | protocol/lufa/LUFA-git/Projects/Webserver/Lib/TELNETServerApp.c | 163 | 
2 files changed, 163 insertions, 0 deletions
| diff --git a/protocol/lufa/LUFA-git b/protocol/lufa/LUFA-git deleted file mode 160000 -Subproject b6c18b2a7c544653efbe12a1d4e8ba65e7d83c3 diff --git a/protocol/lufa/LUFA-git/Projects/Webserver/Lib/TELNETServerApp.c b/protocol/lufa/LUFA-git/Projects/Webserver/Lib/TELNETServerApp.c new file mode 100644 index 0000000000..a05cd286f8 --- /dev/null +++ b/protocol/lufa/LUFA-git/Projects/Webserver/Lib/TELNETServerApp.c @@ -0,0 +1,163 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2014. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2014  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + * + *  TELNET Webserver Application. When connected to the uIP stack, + *  this will serve out raw TELNET to the client on port 23. + */ + +#define  INCLUDE_FROM_TELNETSERVERAPP_C +#include "TELNETServerApp.h" + +#if defined(ENABLE_TELNET_SERVER) || defined(__DOXYGEN__) + +/** Welcome message to send to a TELNET client when a connection is first made. */ +const char PROGMEM WelcomeHeader[] = "********************************************\r\n" +                                     "*       LUFA uIP Webserver (TELNET)        *\r\n" +                                     "********************************************\r\n"; + +/** Main TELNET menu, giving the user the list of available commands they may issue */ +const char PROGMEM TELNETMenu[] = "\r\n" +                                  "  == Available Commands: ==\r\n" +                                  "     c) List Active TCP Connections\r\n" +                                  "  =========================\r\n" +                                  "\r\n>"; + +/** Header to print before the current connections are printed to the client */ +const char PROGMEM CurrentConnectionsHeader[] = "\r\n* Current TCP Connections: *\r\n"; + +/** Initialization function for the simple TELNET webserver. */ +void TELNETServerApp_Init(void) +{ +	/* Listen on port 23 for TELNET connections from hosts */ +	uip_listen(HTONS(TELNET_SERVER_PORT)); +} + +/** uIP stack application callback for the TELNET server. This function must be called each time the + *  TCP/IP stack needs a TCP packet to be processed. + */ +void TELNETServerApp_Callback(void) +{ +	uip_tcp_appstate_t* const AppState   = &uip_conn->appstate; +	char*               const AppData    = (char*)uip_appdata; + +	if (uip_connected()) +	{ +		/* New connection - initialize connection state values */ +		AppState->TELNETServer.CurrentState = TELNET_STATE_SendHeader; +	} + +	if (uip_acked()) +	{ +		/* Progress to the next state once the current state's data has been ACKed */ +		AppState->TELNETServer.CurrentState = AppState->TELNETServer.NextState; +	} + +	if (uip_rexmit() || uip_acked() || uip_newdata() || uip_connected() || uip_poll()) +	{ +		switch (AppState->TELNETServer.CurrentState) +		{ +			case TELNET_STATE_SendHeader: +				/* Copy over and send the TELNET welcome message upon first connection */ +				strcpy_P(AppData, WelcomeHeader); +				uip_send(AppData, strlen(AppData)); + +				AppState->TELNETServer.NextState = TELNET_STATE_SendMenu; +				break; +			case TELNET_STATE_SendMenu: +				/* Copy over and send the TELNET menu to the client */ +				strcpy_P(AppData, TELNETMenu); +				uip_send(AppData, strlen(AppData)); + +				AppState->TELNETServer.NextState = TELNET_STATE_GetCommand; +				break; +			case TELNET_STATE_GetCommand: +				if (!(uip_datalen())) +				  break; + +				/* Save the issued command for later processing */ +				AppState->TELNETServer.IssuedCommand = AppData[0]; + +				AppState->TELNETServer.CurrentState  = TELNET_STATE_SendResponse; +				break; +			case TELNET_STATE_SendResponse: +				/* Determine which command was issued, perform command processing */ +				switch (AppState->TELNETServer.IssuedCommand) +				{ +					case 'c': +						TELNETServerApp_DisplayTCPConnections(); +						break; +					default: +						strcpy_P(AppData, PSTR("Invalid Command.\r\n")); +						uip_send(AppData, strlen(AppData)); +						break; +				} + +				AppState->TELNETServer.NextState = TELNET_STATE_SendMenu; +				break; +		} +	} +} + +/** Sends a list of active TCP connections to the TELNET client. */ +static void TELNETServerApp_DisplayTCPConnections(void) +{ +	char* const AppData    = (char*)uip_appdata; + +	strcpy_P(AppData, CurrentConnectionsHeader); + +	uint16_t ResponseLen     = strlen(AppData); +	uint8_t  ActiveConnCount = 0; + +	/* Loop through the complete uIP TCP connections list, looking for active connections */ +	for (uint8_t i = 0; i < UIP_CONNS; i++) +	{ +		struct uip_conn* CurrConnection = &uip_conns[i]; + +		/* If the connection is not closed, it is active and must be added to the out buffer */ +		if (CurrConnection->tcpstateflags != UIP_CLOSED) +		{ +			/* Add the current connection's details to the out buffer */ +			ResponseLen += sprintf_P(&AppData[ResponseLen], PSTR("%u) %d.%d.%d.%d (Local Port %u <=> Remote Port %u)\r\n"), +			                         ++ActiveConnCount, +			                         CurrConnection->ripaddr.u8[0], +			                         CurrConnection->ripaddr.u8[1], +			                         CurrConnection->ripaddr.u8[2], +			                         CurrConnection->ripaddr.u8[3], +			                         HTONS(CurrConnection->lport), HTONS(CurrConnection->rport)); +		} +	} + +	uip_send(AppData, ResponseLen); +} + +#endif + | 
