forked from mfulz_github/qmk_firmware
		
	Add a TELNET server to the webserver project, which currently can list active TCP connections.
This commit is contained in:
		
							parent
							
								
									77e86e7d82
								
							
						
					
					
						commit
						16ea5aa7a2
					
				
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -17,6 +17,7 @@ | |||||||
|   *      -# Add ability to get number of bytes not written with pipe/endpoint write routines after an error |   *      -# Add ability to get number of bytes not written with pipe/endpoint write routines after an error | ||||||
|   *      -# Add standardized descriptor names to class driver structures |   *      -# Add standardized descriptor names to class driver structures | ||||||
|   *      -# Correct mishandling of error cases in Mass Storage demos |   *      -# Correct mishandling of error cases in Mass Storage demos | ||||||
|  |   *      -# Add BOARD=NONE Option | ||||||
|   *  - Documentation/Support |   *  - Documentation/Support | ||||||
|   *      -# Remake AVRStudio project files |   *      -# Remake AVRStudio project files | ||||||
|   *      -# Add detailed overviews of how each demo works |   *      -# Add detailed overviews of how each demo works | ||||||
|  | |||||||
| @ -34,27 +34,27 @@ | |||||||
|  *  DHCP server on the network. |  *  DHCP server on the network. | ||||||
|  */ |  */ | ||||||
|   |   | ||||||
| #include "DHCPApp.h" | #include "DHCPClientApp.h" | ||||||
| 
 | 
 | ||||||
| #if defined(ENABLE_DHCP) || defined(__DOXYGEN__) | #if defined(ENABLE_DHCP) || defined(__DOXYGEN__) | ||||||
| /** Timer for managing the timeout period for a DHCP server to respond */ | /** Timer for managing the timeout period for a DHCP server to respond */ | ||||||
| struct timer DHCPTimer; | struct timer DHCPTimer; | ||||||
| 
 | 
 | ||||||
| /** Initialization function for the DHCP client. */ | /** Initialization function for the DHCP client. */ | ||||||
| void DHCPApp_Init(void) | void DHCPClientApp_Init(void) | ||||||
| { | { | ||||||
| 	uip_udp_appstate_t* const AppState = &uip_udp_conn->appstate; | 	uip_udp_appstate_t* const AppState = &uip_udp_conn->appstate; | ||||||
| 	 | 	 | ||||||
| 	/* Create a new UDP connection to the DHCP server port for the DHCP solicitation */ | 	/* Create a new UDP connection to the DHCP server port for the DHCP solicitation */ | ||||||
| 	uip_ipaddr_t DHCPServerIPAddress; | 	uip_ipaddr_t DHCPServerIPAddress; | ||||||
| 	uip_ipaddr(&DHCPServerIPAddress, 255, 255, 255, 255); | 	uip_ipaddr(&DHCPServerIPAddress, 255, 255, 255, 255); | ||||||
| 	AppState->Connection = uip_udp_new(&DHCPServerIPAddress, HTONS(DHCPC_SERVER_PORT)); | 	AppState->DHCPClient.Connection = uip_udp_new(&DHCPServerIPAddress, HTONS(DHCPC_SERVER_PORT)); | ||||||
| 	 | 	 | ||||||
| 	/* If the connection was sucessfully created, bind it to the local DHCP client port */ | 	/* If the connection was sucessfully created, bind it to the local DHCP client port */ | ||||||
| 	if(AppState->Connection != NULL) | 	if(AppState->DHCPClient.Connection != NULL) | ||||||
| 	{ | 	{ | ||||||
| 		uip_udp_bind(AppState->Connection, HTONS(DHCPC_CLIENT_PORT)); | 		uip_udp_bind(AppState->DHCPClient.Connection, HTONS(DHCPC_CLIENT_PORT)); | ||||||
| 		AppState->CurrentState = DHCP_STATE_SendDiscover; | 		AppState->DHCPClient.CurrentState = DHCP_STATE_SendDiscover; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* Set timeout period to half a second for a DHCP server to respond */ | 	/* Set timeout period to half a second for a DHCP server to respond */ | ||||||
| @ -64,33 +64,33 @@ void DHCPApp_Init(void) | |||||||
| /** uIP stack application callback for the DHCP client. This function must be called each time the TCP/IP stack 
 | /** uIP stack application callback for the DHCP client. This function must be called each time the TCP/IP stack 
 | ||||||
|  *  needs a UDP packet to be processed. |  *  needs a UDP packet to be processed. | ||||||
|  */ |  */ | ||||||
| void DHCPApp_Callback(void) | void DHCPClientApp_Callback(void) | ||||||
| { | { | ||||||
| 	uip_udp_appstate_t* const AppState    = &uip_udp_conn->appstate; | 	uip_udp_appstate_t* const AppState    = &uip_udp_conn->appstate; | ||||||
| 	DHCP_Header_t*      const AppData     = (DHCP_Header_t*)uip_appdata; | 	DHCP_Header_t*      const AppData     = (DHCP_Header_t*)uip_appdata; | ||||||
| 	uint16_t                  AppDataSize = 0; | 	uint16_t                  AppDataSize = 0; | ||||||
| 	 | 	 | ||||||
| 	switch (AppState->CurrentState) | 	switch (AppState->DHCPClient.CurrentState) | ||||||
| 	{ | 	{ | ||||||
| 		case DHCP_STATE_SendDiscover: | 		case DHCP_STATE_SendDiscover: | ||||||
| 			/* Clear all DHCP settings, reset client IP address */ | 			/* Clear all DHCP settings, reset client IP address */ | ||||||
| 			memset(&AppState->DHCPOffer_Data, 0x00, sizeof(AppState->DHCPOffer_Data)); | 			memset(&AppState->DHCPClient.DHCPOffer_Data, 0x00, sizeof(AppState->DHCPClient.DHCPOffer_Data)); | ||||||
| 			uip_sethostaddr((uip_ipaddr_t*)&AppState->DHCPOffer_Data.AllocatedIP); | 			uip_sethostaddr((uip_ipaddr_t*)&AppState->DHCPClient.DHCPOffer_Data.AllocatedIP); | ||||||
| 
 | 
 | ||||||
| 			/* Fill out the DHCP response header */ | 			/* Fill out the DHCP response header */ | ||||||
| 			AppDataSize += DHCPApp_FillDHCPHeader(AppData, DHCP_DISCOVER, AppState); | 			AppDataSize += DHCPClientApp_FillDHCPHeader(AppData, DHCP_DISCOVER, AppState); | ||||||
| 			 | 			 | ||||||
| 			/* Add the required DHCP options list to the packet */ | 			/* Add the required DHCP options list to the packet */ | ||||||
| 			uint8_t RequiredOptionList[] = {DHCP_OPTION_SUBNET_MASK, DHCP_OPTION_ROUTER, DHCP_OPTION_DNS_SERVER}; | 			uint8_t RequiredOptionList[] = {DHCP_OPTION_SUBNET_MASK, DHCP_OPTION_ROUTER, DHCP_OPTION_DNS_SERVER}; | ||||||
| 			AppDataSize += DHCPApp_SetOption(AppData->Options, DHCP_OPTION_REQ_LIST, sizeof(RequiredOptionList), | 			AppDataSize += DHCPClientApp_SetOption(AppData->Options, DHCP_OPTION_REQ_LIST, sizeof(RequiredOptionList), | ||||||
| 			                                 RequiredOptionList);			 | 			                                       RequiredOptionList);			 | ||||||
| 			 | 			 | ||||||
| 			/* Send the DHCP DISCOVER packet */ | 			/* Send the DHCP DISCOVER packet */ | ||||||
| 			uip_udp_send(AppDataSize); | 			uip_udp_send(AppDataSize); | ||||||
| 
 | 
 | ||||||
| 			/* Reset the timeout timer, progress to next state */ | 			/* Reset the timeout timer, progress to next state */ | ||||||
| 			timer_reset(&DHCPTimer); | 			timer_reset(&DHCPTimer); | ||||||
| 			AppState->CurrentState = DHCP_STATE_WaitForOffer;			 | 			AppState->DHCPClient.CurrentState = DHCP_STATE_WaitForOffer;			 | ||||||
| 			 | 			 | ||||||
| 			break; | 			break; | ||||||
| 		case DHCP_STATE_WaitForOffer: | 		case DHCP_STATE_WaitForOffer: | ||||||
| @ -98,45 +98,45 @@ void DHCPApp_Callback(void) | |||||||
| 			{ | 			{ | ||||||
| 				/* Check if the DHCP timeout period has expired while waiting for a response */ | 				/* Check if the DHCP timeout period has expired while waiting for a response */ | ||||||
| 				if (timer_expired(&DHCPTimer)) | 				if (timer_expired(&DHCPTimer)) | ||||||
| 				  AppState->CurrentState = DHCP_STATE_SendDiscover; | 				  AppState->DHCPClient.CurrentState = DHCP_STATE_SendDiscover; | ||||||
| 				 | 				 | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| 			   | 			   | ||||||
| 			uint8_t OfferResponse_MessageType; | 			uint8_t OfferResponse_MessageType; | ||||||
| 			if ((AppData->TransactionID == DHCP_TRANSACTION_ID) && | 			if ((AppData->TransactionID == DHCP_TRANSACTION_ID) && | ||||||
| 			    DHCPApp_GetOption(AppData->Options, DHCP_OPTION_MSG_TYPE, &OfferResponse_MessageType) && | 			    DHCPClientApp_GetOption(AppData->Options, DHCP_OPTION_MSG_TYPE, &OfferResponse_MessageType) && | ||||||
| 			    (OfferResponse_MessageType == DHCP_OFFER)) | 			    (OfferResponse_MessageType == DHCP_OFFER)) | ||||||
| 			{ | 			{ | ||||||
| 				/* Received a DHCP offer for an IP address, copy over values for later request */ | 				/* Received a DHCP offer for an IP address, copy over values for later request */ | ||||||
| 				memcpy(&AppState->DHCPOffer_Data.AllocatedIP, &AppData->YourIP, sizeof(uip_ipaddr_t)); | 				memcpy(&AppState->DHCPClient.DHCPOffer_Data.AllocatedIP, &AppData->YourIP, sizeof(uip_ipaddr_t)); | ||||||
| 				DHCPApp_GetOption(AppData->Options, DHCP_OPTION_SUBNET_MASK, &AppState->DHCPOffer_Data.Netmask); | 				DHCPClientApp_GetOption(AppData->Options, DHCP_OPTION_SUBNET_MASK, &AppState->DHCPClient.DHCPOffer_Data.Netmask); | ||||||
| 				DHCPApp_GetOption(AppData->Options, DHCP_OPTION_ROUTER,      &AppState->DHCPOffer_Data.GatewayIP); | 				DHCPClientApp_GetOption(AppData->Options, DHCP_OPTION_ROUTER,      &AppState->DHCPClient.DHCPOffer_Data.GatewayIP); | ||||||
| 				DHCPApp_GetOption(AppData->Options, DHCP_OPTION_SERVER_ID,   &AppState->DHCPOffer_Data.ServerIP); | 				DHCPClientApp_GetOption(AppData->Options, DHCP_OPTION_SERVER_ID,   &AppState->DHCPClient.DHCPOffer_Data.ServerIP); | ||||||
| 				 | 				 | ||||||
| 				timer_reset(&DHCPTimer); | 				timer_reset(&DHCPTimer); | ||||||
| 				AppState->CurrentState = DHCP_STATE_SendRequest; | 				AppState->DHCPClient.CurrentState = DHCP_STATE_SendRequest; | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			break; | 			break; | ||||||
| 		case DHCP_STATE_SendRequest: | 		case DHCP_STATE_SendRequest: | ||||||
| 			/* Fill out the DHCP response header */ | 			/* Fill out the DHCP response header */ | ||||||
| 			AppDataSize += DHCPApp_FillDHCPHeader(AppData, DHCP_REQUEST, AppState); | 			AppDataSize += DHCPClientApp_FillDHCPHeader(AppData, DHCP_REQUEST, AppState); | ||||||
| 
 | 
 | ||||||
| 			/* Add the DHCP REQUESTED IP ADDRESS option to the packet */ | 			/* Add the DHCP REQUESTED IP ADDRESS option to the packet */ | ||||||
| 			AppDataSize += DHCPApp_SetOption(AppData->Options, DHCP_OPTION_REQ_IPADDR, sizeof(uip_ipaddr_t), | 			AppDataSize += DHCPClientApp_SetOption(AppData->Options, DHCP_OPTION_REQ_IPADDR, sizeof(uip_ipaddr_t), | ||||||
| 			                                 &AppState->DHCPOffer_Data.AllocatedIP); | 			                                       &AppState->DHCPClient.DHCPOffer_Data.AllocatedIP); | ||||||
| 
 | 
 | ||||||
| 			/* Add the DHCP SERVER IP ADDRESS option to the packet */ | 			/* Add the DHCP SERVER IP ADDRESS option to the packet */ | ||||||
| 			AppDataSize += DHCPApp_SetOption(AppData->Options, DHCP_OPTION_SERVER_ID, sizeof(uip_ipaddr_t), | 			AppDataSize += DHCPClientApp_SetOption(AppData->Options, DHCP_OPTION_SERVER_ID, sizeof(uip_ipaddr_t), | ||||||
| 			                                 &AppState->DHCPOffer_Data.ServerIP); | 			                                       &AppState->DHCPClient.DHCPOffer_Data.ServerIP); | ||||||
| 
 | 
 | ||||||
| 			/* Send the DHCP REQUEST packet */ | 			/* Send the DHCP REQUEST packet */ | ||||||
| 			uip_udp_send(AppDataSize); | 			uip_udp_send(AppDataSize); | ||||||
| 			 | 			 | ||||||
| 			/* Reset the timeout timer, progress to next state */ | 			/* Reset the timeout timer, progress to next state */ | ||||||
| 			timer_reset(&DHCPTimer); | 			timer_reset(&DHCPTimer); | ||||||
| 			AppState->CurrentState = DHCP_STATE_WaitForACK; | 			AppState->DHCPClient.CurrentState = DHCP_STATE_WaitForACK; | ||||||
| 
 | 
 | ||||||
| 			break; | 			break; | ||||||
| 		case DHCP_STATE_WaitForACK: | 		case DHCP_STATE_WaitForACK: | ||||||
| @ -144,22 +144,22 @@ void DHCPApp_Callback(void) | |||||||
| 			{ | 			{ | ||||||
| 				/* Check if the DHCP timeout period has expired while waiting for a response */ | 				/* Check if the DHCP timeout period has expired while waiting for a response */ | ||||||
| 				if (timer_expired(&DHCPTimer)) | 				if (timer_expired(&DHCPTimer)) | ||||||
| 				  AppState->CurrentState = DHCP_STATE_SendDiscover; | 				  AppState->DHCPClient.CurrentState = DHCP_STATE_SendDiscover; | ||||||
| 				 | 				 | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| 			 | 			 | ||||||
| 			uint8_t RequestResponse_MessageType; | 			uint8_t RequestResponse_MessageType; | ||||||
| 			if ((AppData->TransactionID == DHCP_TRANSACTION_ID) && | 			if ((AppData->TransactionID == DHCP_TRANSACTION_ID) && | ||||||
| 			    DHCPApp_GetOption(AppData->Options, DHCP_OPTION_MSG_TYPE, &RequestResponse_MessageType) && | 			    DHCPClientApp_GetOption(AppData->Options, DHCP_OPTION_MSG_TYPE, &RequestResponse_MessageType) && | ||||||
| 			    (RequestResponse_MessageType == DHCP_ACK)) | 			    (RequestResponse_MessageType == DHCP_ACK)) | ||||||
| 			{ | 			{ | ||||||
| 				/* Set the new network parameters from the DHCP server */ | 				/* Set the new network parameters from the DHCP server */ | ||||||
| 				uip_sethostaddr((uip_ipaddr_t*)&AppState->DHCPOffer_Data.AllocatedIP); | 				uip_sethostaddr((uip_ipaddr_t*)&AppState->DHCPClient.DHCPOffer_Data.AllocatedIP); | ||||||
| 				uip_setnetmask((uip_ipaddr_t*)&AppState->DHCPOffer_Data.Netmask); | 				uip_setnetmask((uip_ipaddr_t*)&AppState->DHCPClient.DHCPOffer_Data.Netmask); | ||||||
| 				uip_setdraddr((uip_ipaddr_t*)&AppState->DHCPOffer_Data.GatewayIP); | 				uip_setdraddr((uip_ipaddr_t*)&AppState->DHCPClient.DHCPOffer_Data.GatewayIP); | ||||||
| 			 | 			 | ||||||
| 				AppState->CurrentState = DHCP_STATE_AddressLeased; | 				AppState->DHCPClient.CurrentState = DHCP_STATE_AddressLeased; | ||||||
| 			} | 			} | ||||||
| 			 | 			 | ||||||
| 			break; | 			break; | ||||||
| @ -175,7 +175,7 @@ void DHCPApp_Callback(void) | |||||||
|  * |  * | ||||||
|  *  \return Size in bytes of the created DHCP packet |  *  \return Size in bytes of the created DHCP packet | ||||||
|  */ |  */ | ||||||
| uint16_t DHCPApp_FillDHCPHeader(DHCP_Header_t* DHCPHeader, uint8_t DHCPMessageType, uip_udp_appstate_t* AppState) | uint16_t DHCPClientApp_FillDHCPHeader(DHCP_Header_t* DHCPHeader, uint8_t DHCPMessageType, uip_udp_appstate_t* AppState) | ||||||
| { | { | ||||||
| 	/* Erase existing packet data so that we start will all 0x00 DHCP header data */ | 	/* Erase existing packet data so that we start will all 0x00 DHCP header data */ | ||||||
|  	memset(DHCPHeader, 0, sizeof(DHCP_Header_t)); |  	memset(DHCPHeader, 0, sizeof(DHCP_Header_t)); | ||||||
| @ -189,8 +189,8 @@ uint16_t DHCPApp_FillDHCPHeader(DHCP_Header_t* DHCPHeader, uint8_t DHCPMessageTy | |||||||
| 	DHCPHeader->ElapsedSeconds        = 0; | 	DHCPHeader->ElapsedSeconds        = 0; | ||||||
| 	DHCPHeader->Flags                 = HTONS(BOOTP_BROADCAST); | 	DHCPHeader->Flags                 = HTONS(BOOTP_BROADCAST); | ||||||
| 	memcpy(&DHCPHeader->ClientIP, &uip_hostaddr, sizeof(uip_ipaddr_t)); | 	memcpy(&DHCPHeader->ClientIP, &uip_hostaddr, sizeof(uip_ipaddr_t)); | ||||||
| 	memcpy(&DHCPHeader->YourIP, &AppState->DHCPOffer_Data.AllocatedIP, sizeof(uip_ipaddr_t)); | 	memcpy(&DHCPHeader->YourIP, &AppState->DHCPClient.DHCPOffer_Data.AllocatedIP, sizeof(uip_ipaddr_t)); | ||||||
| 	memcpy(&DHCPHeader->NextServerIP, &AppState->DHCPOffer_Data.ServerIP, sizeof(uip_ipaddr_t)); | 	memcpy(&DHCPHeader->NextServerIP, &AppState->DHCPClient.DHCPOffer_Data.ServerIP, sizeof(uip_ipaddr_t)); | ||||||
| 	memcpy(&DHCPHeader->ClientHardwareAddress, &MACAddress, sizeof(struct uip_eth_addr)); | 	memcpy(&DHCPHeader->ClientHardwareAddress, &MACAddress, sizeof(struct uip_eth_addr)); | ||||||
| 	DHCPHeader->Cookie                = DHCP_MAGIC_COOKIE; | 	DHCPHeader->Cookie                = DHCP_MAGIC_COOKIE; | ||||||
| 	 | 	 | ||||||
| @ -214,7 +214,7 @@ uint16_t DHCPApp_FillDHCPHeader(DHCP_Header_t* DHCPHeader, uint8_t DHCPMessageTy | |||||||
|  * |  * | ||||||
|  *  \return Number of bytes added to the DHCP packet |  *  \return Number of bytes added to the DHCP packet | ||||||
|  */ |  */ | ||||||
| uint8_t DHCPApp_SetOption(uint8_t* DHCPOptionList, uint8_t Option, uint8_t DataLen, void* OptionData) | uint8_t DHCPClientApp_SetOption(uint8_t* DHCPOptionList, uint8_t Option, uint8_t DataLen, void* OptionData) | ||||||
| { | { | ||||||
| 	/* Skip through the DHCP options list until the terminator option is found */ | 	/* Skip through the DHCP options list until the terminator option is found */ | ||||||
| 	while (*DHCPOptionList != DHCP_OPTION_END) | 	while (*DHCPOptionList != DHCP_OPTION_END) | ||||||
| @ -238,7 +238,7 @@ uint8_t DHCPApp_SetOption(uint8_t* DHCPOptionList, uint8_t Option, uint8_t DataL | |||||||
|  * |  * | ||||||
|  *  \return Boolean true if the option was found in the DHCP packet's options list, false otherwise |  *  \return Boolean true if the option was found in the DHCP packet's options list, false otherwise | ||||||
|  */ |  */ | ||||||
| bool DHCPApp_GetOption(uint8_t* DHCPOptionList, uint8_t Option, void* Destination) | bool DHCPClientApp_GetOption(uint8_t* DHCPOptionList, uint8_t Option, void* Destination) | ||||||
| { | { | ||||||
| 	/* Look through the incomming DHCP packet's options list for the requested option */ | 	/* Look through the incomming DHCP packet's options list for the requested option */ | ||||||
| 	while (*DHCPOptionList != DHCP_OPTION_END) | 	while (*DHCPOptionList != DHCP_OPTION_END) | ||||||
| @ -30,11 +30,11 @@ | |||||||
| 
 | 
 | ||||||
| /** \file
 | /** \file
 | ||||||
|  * |  * | ||||||
|  *  Header file for DHCPApp.c. |  *  Header file for DHCPClientApp.c. | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #ifndef _DHCP_APP_H_ | #ifndef _DHCPCLIENT_APP_H_ | ||||||
| #define _DHCP_APP_H_ | #define _DHCPCLIENT_APP_H_ | ||||||
| 
 | 
 | ||||||
| 	/* Includes: */ | 	/* Includes: */ | ||||||
| 		#include <stdio.h> | 		#include <stdio.h> | ||||||
| @ -156,11 +156,11 @@ | |||||||
| 		}; | 		}; | ||||||
| 
 | 
 | ||||||
| 	/* Function Prototypes: */ | 	/* Function Prototypes: */ | ||||||
| 		void DHCPApp_Init(void); | 		void DHCPClientApp_Init(void); | ||||||
| 		void DHCPApp_Callback(void); | 		void DHCPClientApp_Callback(void); | ||||||
| 		 | 		 | ||||||
| 		uint16_t DHCPApp_FillDHCPHeader(DHCP_Header_t* DHCPHeader, uint8_t DHCPMessageType, uip_udp_appstate_t* AppState); | 		uint16_t DHCPClientApp_FillDHCPHeader(DHCP_Header_t* DHCPHeader, uint8_t DHCPMessageType, uip_udp_appstate_t* AppState); | ||||||
| 		uint8_t  DHCPApp_SetOption(uint8_t* DHCPOptionList, uint8_t Option, uint8_t DataLen, void* OptionData); | 		uint8_t  DHCPClientApp_SetOption(uint8_t* DHCPOptionList, uint8_t Option, uint8_t DataLen, void* OptionData); | ||||||
| 		bool     DHCPApp_GetOption(uint8_t* DHCPOptionList, uint8_t Option, void* Destination); | 		bool     DHCPClientApp_GetOption(uint8_t* DHCPOptionList, uint8_t Option, void* Destination); | ||||||
| 		 | 		 | ||||||
| #endif | #endif | ||||||
| @ -98,36 +98,36 @@ void HTTPServerApp_Callback(void) | |||||||
| 	if (uip_aborted() || uip_timedout() || uip_closed()) | 	if (uip_aborted() || uip_timedout() || uip_closed()) | ||||||
| 	{ | 	{ | ||||||
| 		/* Connection is being terminated for some reason - close file handle */ | 		/* Connection is being terminated for some reason - close file handle */ | ||||||
| 		f_close(&AppState->FileHandle); | 		f_close(&AppState->HTTPServer.FileHandle); | ||||||
| 		AppState->FileOpen = false; | 		AppState->HTTPServer.FileOpen = false; | ||||||
| 		 | 		 | ||||||
| 		/* Lock to the closed state so that no further processing will occur on the connection */ | 		/* Lock to the closed state so that no further processing will occur on the connection */ | ||||||
| 		AppState->CurrentState  = WEBSERVER_STATE_Closed; | 		AppState->HTTPServer.CurrentState  = WEBSERVER_STATE_Closed; | ||||||
| 		AppState->NextState     = WEBSERVER_STATE_Closed; | 		AppState->HTTPServer.NextState     = WEBSERVER_STATE_Closed; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (uip_connected()) | 	if (uip_connected()) | ||||||
| 	{ | 	{ | ||||||
| 		/* New connection - initialize connection state values */ | 		/* New connection - initialize connection state values */ | ||||||
| 		AppState->CurrentState  = WEBSERVER_STATE_OpenRequestedFile; | 		AppState->HTTPServer.CurrentState  = WEBSERVER_STATE_OpenRequestedFile; | ||||||
| 		AppState->NextState     = WEBSERVER_STATE_OpenRequestedFile; | 		AppState->HTTPServer.NextState     = WEBSERVER_STATE_OpenRequestedFile; | ||||||
| 		AppState->FileOpen      = false; | 		AppState->HTTPServer.FileOpen      = false; | ||||||
| 		AppState->ACKedFilePos  = 0; | 		AppState->HTTPServer.ACKedFilePos  = 0; | ||||||
| 		AppState->SentChunkSize = 0; | 		AppState->HTTPServer.SentChunkSize = 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (uip_acked()) | 	if (uip_acked()) | ||||||
| 	{ | 	{ | ||||||
| 		/* Add the amount of ACKed file data to the total sent file bytes counter */ | 		/* Add the amount of ACKed file data to the total sent file bytes counter */ | ||||||
| 		AppState->ACKedFilePos += AppState->SentChunkSize; | 		AppState->HTTPServer.ACKedFilePos += AppState->HTTPServer.SentChunkSize; | ||||||
| 
 | 
 | ||||||
| 		/* Progress to the next state once the current state's data has been ACKed */ | 		/* Progress to the next state once the current state's data has been ACKed */ | ||||||
| 		AppState->CurrentState = AppState->NextState; | 		AppState->HTTPServer.CurrentState = AppState->HTTPServer.NextState; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (uip_rexmit() || uip_acked() || uip_newdata() || uip_connected() || uip_poll()) | 	if (uip_rexmit() || uip_acked() || uip_newdata() || uip_connected() || uip_poll()) | ||||||
| 	{ | 	{ | ||||||
| 		switch (AppState->CurrentState) | 		switch (AppState->HTTPServer.CurrentState) | ||||||
| 		{ | 		{ | ||||||
| 			case WEBSERVER_STATE_OpenRequestedFile: | 			case WEBSERVER_STATE_OpenRequestedFile: | ||||||
| 				HTTPServerApp_OpenRequestedFile(); | 				HTTPServerApp_OpenRequestedFile(); | ||||||
| @ -144,7 +144,7 @@ void HTTPServerApp_Callback(void) | |||||||
| 			case WEBSERVER_STATE_Closing: | 			case WEBSERVER_STATE_Closing: | ||||||
| 				uip_close(); | 				uip_close(); | ||||||
| 				 | 				 | ||||||
| 				AppState->NextState = WEBSERVER_STATE_Closed; | 				AppState->HTTPServer.NextState = WEBSERVER_STATE_Closed; | ||||||
| 				break; | 				break; | ||||||
| 		}		   | 		}		   | ||||||
| 	}		 | 	}		 | ||||||
| @ -175,19 +175,19 @@ static void HTTPServerApp_OpenRequestedFile(void) | |||||||
| 	 | 	 | ||||||
| 	/* If the requested filename has more that just the leading '/' path in it, copy it over */ | 	/* If the requested filename has more that just the leading '/' path in it, copy it over */ | ||||||
| 	if (strlen(RequestedFileName) > 1) | 	if (strlen(RequestedFileName) > 1) | ||||||
| 	  strncpy(AppState->FileName, &RequestedFileName[1], (sizeof(AppState->FileName) - 1)); | 	  strncpy(AppState->HTTPServer.FileName, &RequestedFileName[1], (sizeof(AppState->HTTPServer.FileName) - 1)); | ||||||
| 	else | 	else | ||||||
| 	  strcpy(AppState->FileName, "index.htm"); | 	  strcpy(AppState->HTTPServer.FileName, "index.htm"); | ||||||
| 
 | 
 | ||||||
| 	/* Ensure filename is null-terminated */ | 	/* Ensure filename is null-terminated */ | ||||||
| 	AppState->FileName[(sizeof(AppState->FileName) - 1)] = 0x00; | 	AppState->HTTPServer.FileName[(sizeof(AppState->HTTPServer.FileName) - 1)] = 0x00; | ||||||
| 	 | 	 | ||||||
| 	/* Try to open the file from the Dataflash disk */ | 	/* Try to open the file from the Dataflash disk */ | ||||||
| 	AppState->FileOpen     = (f_open(&AppState->FileHandle, AppState->FileName, FA_OPEN_EXISTING | FA_READ) == FR_OK); | 	AppState->HTTPServer.FileOpen     = (f_open(&AppState->HTTPServer.FileHandle, AppState->HTTPServer.FileName, FA_OPEN_EXISTING | FA_READ) == FR_OK); | ||||||
| 
 | 
 | ||||||
| 	/* Lock to the SendResponseHeader state until connection terminated */ | 	/* Lock to the SendResponseHeader state until connection terminated */ | ||||||
| 	AppState->CurrentState = WEBSERVER_STATE_SendResponseHeader; | 	AppState->HTTPServer.CurrentState = WEBSERVER_STATE_SendResponseHeader; | ||||||
| 	AppState->NextState    = WEBSERVER_STATE_SendResponseHeader; | 	AppState->HTTPServer.NextState    = WEBSERVER_STATE_SendResponseHeader; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /** HTTP Server State handler for the HTTP Response Header Send state. This state manages the transmission of
 | /** HTTP Server State handler for the HTTP Response Header Send state. This state manages the transmission of
 | ||||||
| @ -202,15 +202,15 @@ static void HTTPServerApp_SendResponseHeader(void) | |||||||
| 	uint16_t HeaderLength; | 	uint16_t HeaderLength; | ||||||
| 
 | 
 | ||||||
| 	/* Determine which HTTP header should be sent to the client */ | 	/* Determine which HTTP header should be sent to the client */ | ||||||
| 	if (AppState->FileOpen) | 	if (AppState->HTTPServer.FileOpen) | ||||||
| 	{ | 	{ | ||||||
| 		HeaderToSend = HTTP200Header; | 		HeaderToSend = HTTP200Header; | ||||||
| 		AppState->NextState = WEBSERVER_STATE_SendMIMETypeHeader; | 		AppState->HTTPServer.NextState = WEBSERVER_STATE_SendMIMETypeHeader; | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		HeaderToSend = HTTP404Header; | 		HeaderToSend = HTTP404Header; | ||||||
| 		AppState->NextState = WEBSERVER_STATE_Closing; | 		AppState->HTTPServer.NextState = WEBSERVER_STATE_Closing; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* Copy over the HTTP response header and send it to the receiving client */ | 	/* Copy over the HTTP response header and send it to the receiving client */ | ||||||
| @ -227,7 +227,7 @@ static void HTTPServerApp_SendMIMETypeHeader(void) | |||||||
| 	uip_tcp_appstate_t* const AppState    = &uip_conn->appstate; | 	uip_tcp_appstate_t* const AppState    = &uip_conn->appstate; | ||||||
| 	char*               const AppData     = (char*)uip_appdata; | 	char*               const AppData     = (char*)uip_appdata; | ||||||
| 
 | 
 | ||||||
| 	char*    Extension        = strpbrk(AppState->FileName, "."); | 	char*    Extension        = strpbrk(AppState->HTTPServer.FileName, "."); | ||||||
| 	uint16_t MIMEHeaderLength = 0; | 	uint16_t MIMEHeaderLength = 0; | ||||||
| 
 | 
 | ||||||
| 	/* Check to see if a file extension was found for the requested filename */ | 	/* Check to see if a file extension was found for the requested filename */ | ||||||
| @ -261,7 +261,7 @@ static void HTTPServerApp_SendMIMETypeHeader(void) | |||||||
| 	uip_send(AppData, MIMEHeaderLength); | 	uip_send(AppData, MIMEHeaderLength); | ||||||
| 	 | 	 | ||||||
| 	/* When the MIME header is ACKed, progress to the data send stage */ | 	/* When the MIME header is ACKed, progress to the data send stage */ | ||||||
| 	AppState->NextState = WEBSERVER_STATE_SendData; | 	AppState->HTTPServer.NextState = WEBSERVER_STATE_SendData; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /** HTTP Server State handler for the Data Send state. This state manages the transmission of file chunks
 | /** HTTP Server State handler for the Data Send state. This state manages the transmission of file chunks
 | ||||||
| @ -276,14 +276,14 @@ static void HTTPServerApp_SendData(void) | |||||||
| 	uint16_t MaxSegmentSize = uip_mss(); | 	uint16_t MaxSegmentSize = uip_mss(); | ||||||
| 
 | 
 | ||||||
| 	/* Return file pointer to the last ACKed position */ | 	/* Return file pointer to the last ACKed position */ | ||||||
| 	f_lseek(&AppState->FileHandle, AppState->ACKedFilePos); | 	f_lseek(&AppState->HTTPServer.FileHandle, AppState->HTTPServer.ACKedFilePos); | ||||||
| 	 | 	 | ||||||
| 	/* Read the next chunk of data from the open file */ | 	/* Read the next chunk of data from the open file */ | ||||||
| 	f_read(&AppState->FileHandle, AppData, MaxSegmentSize, &AppState->SentChunkSize); | 	f_read(&AppState->HTTPServer.FileHandle, AppData, MaxSegmentSize, &AppState->HTTPServer.SentChunkSize); | ||||||
| 	 | 	 | ||||||
| 	/* Send the next file chunk to the receiving client */ | 	/* Send the next file chunk to the receiving client */ | ||||||
| 	uip_send(AppData, AppState->SentChunkSize); | 	uip_send(AppData, AppState->HTTPServer.SentChunkSize); | ||||||
| 			 | 			 | ||||||
| 	/* Check if we are at the last chunk of the file, if so next ACK should close the connection */ | 	/* Check if we are at the last chunk of the file, if so next ACK should close the connection */ | ||||||
| 	AppState->NextState = (MaxSegmentSize != AppState->SentChunkSize) ? WEBSERVER_STATE_Closing : WEBSERVER_STATE_SendData; | 	AppState->HTTPServer.NextState = (MaxSegmentSize != AppState->HTTPServer.SentChunkSize) ? WEBSERVER_STATE_Closing : WEBSERVER_STATE_SendData; | ||||||
| } | } | ||||||
|  | |||||||
| @ -47,7 +47,7 @@ | |||||||
| 		/** States for each HTTP connection to the webserver. */ | 		/** States for each HTTP connection to the webserver. */ | ||||||
| 		enum Webserver_States_t | 		enum Webserver_States_t | ||||||
| 		{ | 		{ | ||||||
| 			WEBSERVER_STATE_OpenRequestedFile, /** Currently opening requested file */ | 			WEBSERVER_STATE_OpenRequestedFile, /**< Currently opening requested file */ | ||||||
| 			WEBSERVER_STATE_SendResponseHeader, /**< Currently sending HTTP response headers to the client */ | 			WEBSERVER_STATE_SendResponseHeader, /**< Currently sending HTTP response headers to the client */ | ||||||
| 			WEBSERVER_STATE_SendMIMETypeHeader, /**< Currently sending HTTP MIME type header to the client */ | 			WEBSERVER_STATE_SendMIMETypeHeader, /**< Currently sending HTTP MIME type header to the client */ | ||||||
| 			WEBSERVER_STATE_SendData, /**< Currently sending HTTP page data to the client */ | 			WEBSERVER_STATE_SendData, /**< Currently sending HTTP page data to the client */ | ||||||
|  | |||||||
							
								
								
									
										147
									
								
								Projects/Webserver/Lib/TELNETServerApp.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								Projects/Webserver/Lib/TELNETServerApp.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,147 @@ | |||||||
|  | /*
 | ||||||
|  |              LUFA Library | ||||||
|  |      Copyright (C) Dean Camera, 2010. | ||||||
|  |                | ||||||
|  |   dean [at] fourwalledcubicle [dot] com | ||||||
|  |       www.fourwalledcubicle.com | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |   Copyright 2010  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 disclaim 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 connection information to the client. | ||||||
|  |  */ | ||||||
|  |   | ||||||
|  | #define  INCLUDE_FROM_TELNETSERVERAPP_C | ||||||
|  | #include "TELNETServerApp.h" | ||||||
|  | 
 | ||||||
|  | /** Welcome message to send to a TELNET client when a connection is first made. */ | ||||||
|  | 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 */ | ||||||
|  | char PROGMEM TELNETMenu[] = "\r\n" | ||||||
|  |                             "   Available Commands:\r\n" | ||||||
|  |                             "     c) List Active TCP Connections\r\n" | ||||||
|  | 					        "\r\nCommand>"; | ||||||
|  | 
 | ||||||
|  | /** Initialization function for the simple HTTP 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()) | ||||||
|  | 	{ | ||||||
|  | 		AppState->TELNETServer.CurrentState = TELNET_STATE_SendHeader; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (uip_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 */ | ||||||
|  | 				strncpy_P(AppData, WelcomeHeader, strlen_P(WelcomeHeader)); | ||||||
|  | 				uip_send(AppData, strlen_P(WelcomeHeader)); | ||||||
|  | 				 | ||||||
|  | 				AppState->TELNETServer.NextState = TELNET_STATE_SendMenu; | ||||||
|  | 				break; | ||||||
|  | 			case TELNET_STATE_SendMenu: | ||||||
|  | 				/* Copy over and send the TELNET menu to the client */ | ||||||
|  | 				strncpy_P(AppData, TELNETMenu, strlen_P(TELNETMenu)); | ||||||
|  | 				uip_send(AppData, strlen_P(TELNETMenu)); | ||||||
|  | 				 | ||||||
|  | 				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;					 | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				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(AppData, "\r\n* Current TCP Connections: *\r\n"); | ||||||
|  | 							 | ||||||
|  | 	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(&AppData[ResponseLen], "%u) %02d.%02d.%02d.%02d (Local %u, Remote %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); | ||||||
|  | } | ||||||
							
								
								
									
										68
									
								
								Projects/Webserver/Lib/TELNETServerApp.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								Projects/Webserver/Lib/TELNETServerApp.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,68 @@ | |||||||
|  | /*
 | ||||||
|  |              LUFA Library | ||||||
|  |      Copyright (C) Dean Camera, 2010. | ||||||
|  |                | ||||||
|  |   dean [at] fourwalledcubicle [dot] com | ||||||
|  |       www.fourwalledcubicle.com | ||||||
|  | */ | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |   Copyright 2010  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 disclaim 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
 | ||||||
|  |  * | ||||||
|  |  *  Header file for TELNETServerApp.c. | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef _TELNETSERVER_APP_H_ | ||||||
|  | #define _TELNETSERVER_APP_H_ | ||||||
|  | 
 | ||||||
|  | 	/* Includes: */ | ||||||
|  | 		#include <avr/pgmspace.h> | ||||||
|  | 		#include <string.h> | ||||||
|  | 		#include <stdio.h> | ||||||
|  | 		 | ||||||
|  | 		#include <uip.h> | ||||||
|  | 	 | ||||||
|  | 	/* Macros: */ | ||||||
|  | 		/** TCP listen port for incomming TELNET traffic */ | ||||||
|  | 		#define TELNET_SERVER_PORT  23 | ||||||
|  | 		 | ||||||
|  | 	/* Enums: */ | ||||||
|  | 		/** States for each TELNET connection to the server. */ | ||||||
|  | 		enum TELNET_States_t | ||||||
|  | 		{ | ||||||
|  | 			TELNET_STATE_SendHeader, /**< Currently sending welcome header to the client */ | ||||||
|  | 			TELNET_STATE_SendMenu, /**< Currently sending the command list menu to the client */ | ||||||
|  | 			TELNET_STATE_GetCommand, /**< Currently waiting for a command from the client */ | ||||||
|  | 			TELNET_STATE_SendResponse, /**< Processing the issued command and sending a response */ | ||||||
|  | 		};	 | ||||||
|  | 
 | ||||||
|  | 	/* Function Prototypes: */ | ||||||
|  | 		void TELNETServerApp_Init(void); | ||||||
|  | 		void TELNETServerApp_Callback(void); | ||||||
|  | 		 | ||||||
|  | 		#if defined(INCLUDE_FROM_TELNETSERVERAPP_C) | ||||||
|  | 			static void TELNETServerApp_DisplayTCPConnections(void); | ||||||
|  | 		#endif | ||||||
|  | 		 | ||||||
|  | #endif | ||||||
| @ -58,10 +58,11 @@ void uIPManagement_Init(void) | |||||||
| 	/* uIP Stack Initialization */ | 	/* uIP Stack Initialization */ | ||||||
| 	uip_init(); | 	uip_init(); | ||||||
| 	uip_arp_init(); | 	uip_arp_init(); | ||||||
|  | 	uip_setethaddr(MACAddress); | ||||||
| 
 | 
 | ||||||
| 	/* DHCP/Server IP Settings Initialization */ | 	/* DHCP/Server IP Settings Initialization */ | ||||||
| 	#if defined(ENABLE_DHCP) | 	#if defined(ENABLE_DHCP) | ||||||
| 	DHCPApp_Init(); | 	DHCPClientApp_Init(); | ||||||
| 	#else | 	#else | ||||||
| 	uip_ipaddr_t IPAddress, Netmask, GatewayIPAddress; | 	uip_ipaddr_t IPAddress, Netmask, GatewayIPAddress; | ||||||
| 	uip_ipaddr(&IPAddress,        DEVICE_IP_ADDRESS[0], DEVICE_IP_ADDRESS[1], DEVICE_IP_ADDRESS[2], DEVICE_IP_ADDRESS[3]); | 	uip_ipaddr(&IPAddress,        DEVICE_IP_ADDRESS[0], DEVICE_IP_ADDRESS[1], DEVICE_IP_ADDRESS[2], DEVICE_IP_ADDRESS[3]); | ||||||
| @ -71,11 +72,12 @@ void uIPManagement_Init(void) | |||||||
| 	uip_setnetmask(&Netmask); | 	uip_setnetmask(&Netmask); | ||||||
| 	uip_setdraddr(&GatewayIPAddress); | 	uip_setdraddr(&GatewayIPAddress); | ||||||
| 	#endif | 	#endif | ||||||
| 
 |  | ||||||
| 	uip_setethaddr(MACAddress); |  | ||||||
| 	 | 	 | ||||||
| 	/* HTTP Webserver Initialization */ | 	/* HTTP Webserver Initialization */ | ||||||
| 	HTTPServerApp_Init(); | 	HTTPServerApp_Init(); | ||||||
|  | 	 | ||||||
|  | 	/* TELNET Server Initialization */ | ||||||
|  | 	TELNETServerApp_Init(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /** uIP Management function. This function manages the uIP stack when called while an RNDIS device has been
 | /** uIP Management function. This function manages the uIP stack when called while an RNDIS device has been
 | ||||||
| @ -90,6 +92,37 @@ void uIPManagement_ManageNetwork(void) | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /** uIP TCP/IP network stack callback function for the processing of a given TCP connection. This routine dispatches
 | ||||||
|  |  *  to the appropriate TCP protocol application based on the connection's listen port number. | ||||||
|  |  */ | ||||||
|  | void uIPManagement_TCPCallback(void) | ||||||
|  | { | ||||||
|  | 	/* Call the correct TCP application based on the port number the connection is listening on */ | ||||||
|  | 	switch (uip_conn->lport) | ||||||
|  | 	{ | ||||||
|  | 		case HTONS(HTTP_SERVER_PORT): | ||||||
|  | 			HTTPServerApp_Callback(); | ||||||
|  | 			break; | ||||||
|  | 		case HTONS(TELNET_SERVER_PORT): | ||||||
|  | 			TELNETServerApp_Callback(); | ||||||
|  | 			break; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** uIP TCP/IP network stack callback function for the processing of a given UDP connection. This routine dispatches
 | ||||||
|  |  *  to the appropriate UDP protocol application based on the connection's listen port number. | ||||||
|  |  */ | ||||||
|  | void uIPManagement_UDPCallback(void) | ||||||
|  | { | ||||||
|  | 	/* Call the correct UDP application based on the port number the connection is listening on */ | ||||||
|  | 	switch (uip_udp_conn->lport) | ||||||
|  | 	{ | ||||||
|  | 		case HTONS(DHCPC_CLIENT_PORT): | ||||||
|  | 			DHCPClientApp_Callback(); | ||||||
|  | 			break; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /** Processes incomming packets to the server from the connected RNDIS device, creating responses as needed. */ | /** Processes incomming packets to the server from the connected RNDIS device, creating responses as needed. */ | ||||||
| static void uIPManagement_ProcessIncommingPacket(void) | static void uIPManagement_ProcessIncommingPacket(void) | ||||||
| { | { | ||||||
|  | |||||||
| @ -43,8 +43,9 @@ | |||||||
| 		#include <uip_arp.h> | 		#include <uip_arp.h> | ||||||
| 		#include <timer.h> | 		#include <timer.h> | ||||||
| 		 | 		 | ||||||
| 		#include "Lib/DHCPApp.h" | 		#include "Lib/DHCPClientApp.h" | ||||||
| 		#include "Lib/HTTPServerApp.h" | 		#include "Lib/HTTPServerApp.h" | ||||||
|  | 		#include "Lib/TELNETServerApp.h" | ||||||
| 		 | 		 | ||||||
| 	/* Macros: */ | 	/* Macros: */ | ||||||
| 		/** IP address that the webserver should use once connected to a RNDIS device (when DHCP is disabled). */ | 		/** IP address that the webserver should use once connected to a RNDIS device (when DHCP is disabled). */ | ||||||
| @ -64,6 +65,8 @@ | |||||||
| 	/* Function Prototypes: */ | 	/* Function Prototypes: */ | ||||||
| 		void uIPManagement_Init(void); | 		void uIPManagement_Init(void); | ||||||
| 		void uIPManagement_ManageNetwork(void); | 		void uIPManagement_ManageNetwork(void); | ||||||
|  | 		void uIPManagement_TCPCallback(void); | ||||||
|  | 		void uIPManagement_UDPCallback(void); | ||||||
| 		 | 		 | ||||||
| 		#if defined(INCLUDE_FROM_UIPMANAGEMENT_C) | 		#if defined(INCLUDE_FROM_UIPMANAGEMENT_C) | ||||||
| 			static void uIPManagement_ProcessIncommingPacket(void); | 			static void uIPManagement_ProcessIncommingPacket(void); | ||||||
|  | |||||||
| @ -29,9 +29,10 @@ clock_time_t clock_time() | |||||||
| { | { | ||||||
| 	clock_time_t time; | 	clock_time_t time; | ||||||
| 
 | 
 | ||||||
| 	cli(); | 	ATOMIC_BLOCK(ATOMIC_FORCEON) | ||||||
|  | 	{ | ||||||
| 		time = clock_datetime; | 		time = clock_datetime; | ||||||
| 	sei(); | 	} | ||||||
| 
 | 
 | ||||||
| 	return time; | 	return time; | ||||||
| } | } | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ | |||||||
| #define __CLOCK_ARCH_H__ | #define __CLOCK_ARCH_H__ | ||||||
| 
 | 
 | ||||||
| #include <stdint.h> | #include <stdint.h> | ||||||
|  | #include <util/atomic.h> | ||||||
| 
 | 
 | ||||||
| typedef uint16_t clock_time_t; | typedef uint16_t clock_time_t; | ||||||
| #define CLOCK_SECOND 100 | #define CLOCK_SECOND 100 | ||||||
|  | |||||||
| @ -346,14 +346,18 @@ | |||||||
|  * |  * | ||||||
|  * \hideinitializer |  * \hideinitializer | ||||||
|  */ |  */ | ||||||
|  | #if !defined(UIP_URGDATA) | ||||||
| #define UIP_URGDATA      0 | #define UIP_URGDATA      0 | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * The initial retransmission timeout counted in timer pulses. |  * The initial retransmission timeout counted in timer pulses. | ||||||
|  * |  * | ||||||
|  * This should not be changed. |  * This should not be changed. | ||||||
|  */ |  */ | ||||||
|  | #if !defined(UIP_RTO) | ||||||
| #define UIP_RTO         3 | #define UIP_RTO         3 | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * The maximum number of times a segment should be retransmitted |  * The maximum number of times a segment should be retransmitted | ||||||
| @ -361,7 +365,9 @@ | |||||||
|  * |  * | ||||||
|  * This should not be changed. |  * This should not be changed. | ||||||
|  */ |  */ | ||||||
|  | #if !defined(UIP_MAXRTX) | ||||||
| #define UIP_MAXRTX      8 | #define UIP_MAXRTX      8 | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * The maximum number of times a SYN segment should be retransmitted |  * The maximum number of times a SYN segment should be retransmitted | ||||||
| @ -370,7 +376,9 @@ | |||||||
|  * |  * | ||||||
|  * This should not need to be changed. |  * This should not need to be changed. | ||||||
|  */ |  */ | ||||||
|  | #if !defined(UIP_MAXSYNRTX) | ||||||
| #define UIP_MAXSYNRTX      5 | #define UIP_MAXSYNRTX      5 | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * The TCP maximum segment size. |  * The TCP maximum segment size. | ||||||
| @ -654,7 +662,7 @@ typedef uint32_t uip_stats_t; | |||||||
|  typedef struct httpd_state uip_tcp_appstate_t |  typedef struct httpd_state uip_tcp_appstate_t | ||||||
|  \endcode |  \endcode | ||||||
| */ | */ | ||||||
| #define UIP_UDP_APPCALL DHCPApp_Callback | #define UIP_UDP_APPCALL uIPManagement_UDPCallback | ||||||
| void UIP_UDP_APPCALL(void); | void UIP_UDP_APPCALL(void); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
| @ -664,7 +672,7 @@ void UIP_UDP_APPCALL(void); | |||||||
|  * response to TCP/IP events. |  * response to TCP/IP events. | ||||||
|  * |  * | ||||||
|  */ |  */ | ||||||
| #define UIP_APPCALL     HTTPServerApp_Callback | #define UIP_APPCALL     uIPManagement_TCPCallback | ||||||
| void UIP_APPCALL(void); | void UIP_APPCALL(void); | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
| @ -674,16 +682,27 @@ void UIP_APPCALL(void); | |||||||
|  * uip_conn structure. This usually is typedef:ed to a struct holding |  * uip_conn structure. This usually is typedef:ed to a struct holding | ||||||
|  * application state information. |  * application state information. | ||||||
|  */ |  */ | ||||||
| typedef struct | typedef union | ||||||
| { | { | ||||||
| 	uint8_t  CurrentState; | 	struct | ||||||
| 	uint8_t  NextState; | 	{ | ||||||
|  | 		uint8_t  CurrentState; | ||||||
|  | 		uint8_t  NextState; | ||||||
|  | 		 | ||||||
|  | 		char     FileName[30]; | ||||||
|  | 		FIL      FileHandle; | ||||||
|  | 		bool     FileOpen; | ||||||
|  | 		uint32_t ACKedFilePos; | ||||||
|  | 		uint16_t SentChunkSize; | ||||||
|  | 	} HTTPServer; | ||||||
| 	 | 	 | ||||||
| 	char     FileName[30]; | 	struct | ||||||
| 	FIL      FileHandle; | 	{ | ||||||
| 	bool     FileOpen; | 		uint8_t  CurrentState; | ||||||
| 	uint32_t ACKedFilePos; | 		uint8_t  NextState; | ||||||
| 	uint16_t SentChunkSize; | 		 | ||||||
|  | 		uint8_t  IssuedCommand; | ||||||
|  | 	} TELNETServer; | ||||||
| } uip_tcp_appstate_t; | } uip_tcp_appstate_t; | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
| @ -693,18 +712,21 @@ typedef struct | |||||||
|  * uip_conn structure. This usually is typedef:ed to a struct holding |  * uip_conn structure. This usually is typedef:ed to a struct holding | ||||||
|  * application state information. |  * application state information. | ||||||
|  */ |  */ | ||||||
| typedef struct | typedef union | ||||||
| { | { | ||||||
| 	uint8_t CurrentState; |  | ||||||
| 	struct  uip_udp_conn* Connection; |  | ||||||
| 	 |  | ||||||
| 	struct | 	struct | ||||||
| 	{ | 	{ | ||||||
| 		uint8_t AllocatedIP[4]; | 		uint8_t CurrentState; | ||||||
| 		uint8_t Netmask[4]; | 		struct  uip_udp_conn* Connection; | ||||||
| 		uint8_t GatewayIP[4]; | 		 | ||||||
| 		uint8_t ServerIP[4]; | 		struct | ||||||
| 	} DHCPOffer_Data; | 		{ | ||||||
|  | 			uint8_t AllocatedIP[4]; | ||||||
|  | 			uint8_t Netmask[4]; | ||||||
|  | 			uint8_t GatewayIP[4]; | ||||||
|  | 			uint8_t ServerIP[4]; | ||||||
|  | 		} DHCPOffer_Data; | ||||||
|  | 	} DHCPClient; | ||||||
| } uip_udp_appstate_t; | } uip_udp_appstate_t; | ||||||
| /** @} */ | /** @} */ | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -128,10 +128,11 @@ SRC = $(TARGET).c                                                 \ | |||||||
| 	  USBDeviceMode.c                                             \
 | 	  USBDeviceMode.c                                             \
 | ||||||
| 	  USBHostMode.c                                               \
 | 	  USBHostMode.c                                               \
 | ||||||
| 	  Lib/SCSI.c                                                  \
 | 	  Lib/SCSI.c                                                  \
 | ||||||
| 	  Lib/uIPManagement.c                                         \
 |  | ||||||
| 	  Lib/DHCPApp.c                                               \
 |  | ||||||
| 	  Lib/HTTPServerApp.c                                         \
 |  | ||||||
| 	  Lib/DataflashManager.c                                      \
 | 	  Lib/DataflashManager.c                                      \
 | ||||||
|  | 	  Lib/uIPManagement.c                                         \
 | ||||||
|  | 	  Lib/DHCPClientApp.c                                         \
 | ||||||
|  | 	  Lib/HTTPServerApp.c                                         \
 | ||||||
|  | 	  Lib/TELNETServerApp.c                                       \
 | ||||||
| 	  Lib/uip/uip.c                                               \
 | 	  Lib/uip/uip.c                                               \
 | ||||||
| 	  Lib/uip/uip_arp.c                                           \
 | 	  Lib/uip/uip_arp.c                                           \
 | ||||||
| 	  Lib/uip/timer.c                                             \
 | 	  Lib/uip/timer.c                                             \
 | ||||||
| @ -200,10 +201,10 @@ CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD) $(LUFA | |||||||
| CDEFS += -DENABLE_DHCP=1 | CDEFS += -DENABLE_DHCP=1 | ||||||
| 
 | 
 | ||||||
| CDEFS += -DUIP_CONF_UDP_CONNS=1 -DUIP_CONF_TCP=1 -DUIP_CONF_MAX_CONNECTIONS=5 | CDEFS += -DUIP_CONF_UDP_CONNS=1 -DUIP_CONF_TCP=1 -DUIP_CONF_MAX_CONNECTIONS=5 | ||||||
| CDEFS += -DUIP_CONF_MAX_LISTENPORTS=1 -DUIP_CONF_BUFFER_SIZE=1514  | CDEFS += -DUIP_CONF_MAX_LISTENPORTS=5 -DUIP_CONF_BUFFER_SIZE=1514  | ||||||
| CDEFS += -DUIP_CONF_LL_802154=0 -DUIP_CONF_LL_80211=0 -DUIP_CONF_ROUTER=0 -DUIP_CONF_ICMP6=0 -DUIP_CONF_LL_802154=0 | CDEFS += -DUIP_CONF_LL_802154=0 -DUIP_CONF_LL_80211=0 -DUIP_CONF_ROUTER=0 -DUIP_CONF_ICMP6=0 -DUIP_CONF_LL_802154=0 | ||||||
| CDEFS += -DUIP_ARCH_ADD32=0 -DUIP_ARCH_CHKSUM=0 -DUIP_CONF_ICMP_DEST_UNREACH=1 -DUIP_NEIGHBOR_CONF_ADDRTYPE=0 | CDEFS += -DUIP_ARCH_ADD32=0 -DUIP_ARCH_CHKSUM=0 -DUIP_CONF_ICMP_DEST_UNREACH=1 -DUIP_NEIGHBOR_CONF_ADDRTYPE=0 | ||||||
| CDEFS += -DUIP_CONF_UDP=ENABLE_DHCP | CDEFS += -DUIP_URGDATA=0 -DUIP_CONF_UDP=ENABLE_DHCP | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # Place -D or -U options here for ASM sources
 | # Place -D or -U options here for ASM sources
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Dean Camera
						Dean Camera