X-Git-Url: http://git.linex4red.de/pub/lufa.git/blobdiff_plain/f0d6d4ef13ddce09cfc3f684a5e5192cdd4e6a60..d66f227ccef46a65e17b06d31c82c30158ae36a5:/Projects/Incomplete/Webserver/Webserver.c diff --git a/Projects/Incomplete/Webserver/Webserver.c b/Projects/Incomplete/Webserver/Webserver.c index e6ef9f018..1bc658fb4 100644 --- a/Projects/Incomplete/Webserver/Webserver.c +++ b/Projects/Incomplete/Webserver/Webserver.c @@ -31,7 +31,7 @@ /** \file * * Main source file for the Webserver project. This file contains the main tasks of - * the demo and is responsible for the initial application hardware configuration. + * the project and is responsible for the initial application hardware configuration. */ #include "Webserver.h" @@ -57,20 +57,13 @@ USB_ClassInfo_RNDIS_Host_t Ethernet_RNDIS_Interface = }, }; -volatile uint8_t uIPManagementTimeout; +/** Connection timer, to retain the time elapsed since the last time the uIP connections were managed. */ +struct timer ConnectionTimer; + +/** ARP timer, to retain the time elapsed since the ARP cache was last updated. */ +struct timer ARPTimer; -/** ISR for the management of the connection management timeout counter */ -ISR(TIMER0_COMPA_vect, ISR_BLOCK) -{ - if (uIPManagementTimeout) - uIPManagementTimeout--; -} -void TCPCallback(void) -{ - printf("Callback!\r\n"); -} - /** Main program entry point. This routine configures the hardware required by the application, then * enters a loop to run the application tasks in sequence. */ @@ -78,8 +71,6 @@ int main(void) { SetupHardware(); - puts_P(PSTR(ESC_FG_CYAN "RNDIS Host Demo running.\r\n" ESC_FG_WHITE)); - LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); for (;;) @@ -95,7 +86,6 @@ int main(void) if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData, sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful) { - printf("Error Retrieving Configuration Descriptor.\r\n"); LEDs_SetAllLEDs(LEDMASK_USB_ERROR); USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; @@ -104,7 +94,6 @@ int main(void) if (RNDIS_Host_ConfigurePipes(&Ethernet_RNDIS_Interface, ConfigDescriptorSize, ConfigDescriptorData) != RNDIS_ENUMERROR_NoError) { - printf("Attached Device Not a Valid RNDIS Class Device.\r\n"); LEDs_SetAllLEDs(LEDMASK_USB_ERROR); USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; @@ -112,7 +101,6 @@ int main(void) if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful) { - printf("Error Setting Device Configuration.\r\n"); LEDs_SetAllLEDs(LEDMASK_USB_ERROR); USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; @@ -120,21 +108,15 @@ int main(void) if (RNDIS_Host_InitializeDevice(&Ethernet_RNDIS_Interface) != HOST_SENDCONTROL_Successful) { - printf("Error Initializing Device.\r\n"); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } - printf("Device Max Transfer Size: %lu bytes.\r\n", Ethernet_RNDIS_Interface.State.DeviceMaxPacketSize); - - uint32_t PacketFilter = (REMOTE_NDIS_PACKET_DIRECTED | REMOTE_NDIS_PACKET_BROADCAST | REMOTE_NDIS_PACKET_ALL_MULTICAST); + uint32_t PacketFilter = (REMOTE_NDIS_PACKET_DIRECTED | REMOTE_NDIS_PACKET_BROADCAST); if (RNDIS_Host_SetRNDISProperty(&Ethernet_RNDIS_Interface, OID_GEN_CURRENT_PACKET_FILTER, &PacketFilter, sizeof(PacketFilter)) != HOST_SENDCONTROL_Successful) { - printf("Error Setting Device Packet Filter.\r\n"); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; @@ -144,20 +126,14 @@ int main(void) if (RNDIS_Host_QueryRNDISProperty(&Ethernet_RNDIS_Interface, OID_802_3_CURRENT_ADDRESS, &MACAddress, sizeof(MACAddress)) != HOST_SENDCONTROL_Successful) { - printf("Error Getting MAC Address.\r\n"); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); USB_HostState = HOST_STATE_WaitForDeviceRemoval; break; } - printf("MAC Address: 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\r\n", - MACAddress.addr[0], MACAddress.addr[1], MACAddress.addr[2], - MACAddress.addr[3], MACAddress.addr[4], MACAddress.addr[5]); - uip_setethaddr(MACAddress); - printf("RNDIS Device Enumerated.\r\n"); + LEDs_SetAllLEDs(LEDMASK_USB_READY); USB_HostState = HOST_STATE_Configured; break; case HOST_STATE_Configured: @@ -179,41 +155,39 @@ void ProcessIncommingPacket(void) LEDs_SetAllLEDs(LEDMASK_USB_BUSY); /* Read the incomming packet straight into the UIP packet buffer */ - RNDIS_Host_ReadPacket(&Ethernet_RNDIS_Interface, &uip_buf, &uip_len); - - printf("RECEIVED PACKET (%d):\r\n", uip_len); - for (uint16_t i = 0; i < uip_len; i++) - printf("0x%02X ", uip_buf[i]); - printf("\r\n\r\n"); + RNDIS_Host_ReadPacket(&Ethernet_RNDIS_Interface, &uip_buf[0], &uip_len); - #define BUF ((struct uip_eth_hdr *)&uip_buf[0]) - - if (BUF->type == HTONS(UIP_ETHTYPE_IP)) + if (uip_len > 0) { - /* Filter packet by MAC destination */ - uip_arp_ipin(); + bool PacketHandled = true; - /* Process incomming packet */ - uip_input(); + struct uip_eth_hdr* EthernetHeader = (struct uip_eth_hdr*)&uip_buf[0]; + if (EthernetHeader->type == HTONS(UIP_ETHTYPE_IP)) + { + /* Filter packet by MAC destination */ + uip_arp_ipin(); - /* Add destination MAC to outgoing packet */ - if (uip_len > 0) - uip_arp_out(); - } - else if (BUF->type == HTONS(UIP_ETHTYPE_ARP)) - { - /* Process ARP packet */ - uip_arp_arpin(); - } + /* Process incomming packet */ + uip_input(); - /* If a response was generated, send it */ - if (uip_len > 0) - RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, &uip_buf, uip_len); + /* Add destination MAC to outgoing packet */ + if (uip_len > 0) + uip_arp_out(); + } + else if (EthernetHeader->type == HTONS(UIP_ETHTYPE_ARP)) + { + /* Process ARP packet */ + uip_arp_arpin(); + } + else + { + PacketHandled = false; + } - printf("SENT PACKET (%d):\r\n", uip_len); - for (uint16_t i = 0; i < uip_len; i++) - printf("0x%02X ", uip_buf[i]); - printf("\r\n\r\n"); + /* If a response was generated, send it */ + if ((uip_len > 0) && PacketHandled) + RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, &uip_buf[0], uip_len); + } LEDs_SetAllLEDs(LEDMASK_USB_READY); } @@ -221,8 +195,11 @@ void ProcessIncommingPacket(void) void ManageConnections(void) { - if (!(uIPManagementTimeout)) + /* Manage open connections */ + if (timer_expired(&ConnectionTimer)) { + timer_reset(&ConnectionTimer); + LEDs_SetAllLEDs(LEDMASK_USB_BUSY); for (uint8_t i = 0; i < UIP_CONNS; i++) @@ -232,15 +209,18 @@ void ManageConnections(void) /* If a response was generated, send it */ if (uip_len > 0) - RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, &uip_buf, uip_len); + RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, &uip_buf[0], uip_len); } - uip_arp_timer(); - - uIPManagementTimeout = 250; - LEDs_SetAllLEDs(LEDMASK_USB_READY); } + + /* Manage ARP cache refreshing */ + if (timer_expired(&ARPTimer)) + { + timer_reset(&ARPTimer); + uip_arp_timer(); + } } /** Configures the board hardware and chip peripherals for the demo's functionality. */ @@ -254,28 +234,26 @@ void SetupHardware(void) clock_prescale_set(clock_div_1); /* Hardware Initialization */ - SerialStream_Init(9600, false); LEDs_Init(); USB_Init(); - /* Millisecond timer initialization for managing the command timeout counter */ - OCR0A = ((F_CPU / 64) / 1000); - TCCR0A = (1 << WGM01); - TCCR0B = ((1 << CS01) | (1 << CS00)); - + /* uIP Timing Initialization */ + clock_init(); + timer_set(&ConnectionTimer, CLOCK_SECOND / 2); + timer_set(&ARPTimer, CLOCK_SECOND * 10); + /* uIP Stack Initialization */ uip_init(); - uip_ipaddr_t IPAddress, Netmask, GatewayIPAddress; - uip_ipaddr(&IPAddress, 192, 168, 1, 10); - uip_ipaddr(&Netmask, 0xFF, 0xFF, 0xFF, 0x00); + uip_ipaddr(&IPAddress, 192, 168, 1, 10); + uip_ipaddr(&Netmask, 255, 255, 255, 0); uip_ipaddr(&GatewayIPAddress, 192, 168, 1, 1); uip_sethostaddr(&IPAddress); uip_setnetmask(&Netmask); uip_setdraddr(&GatewayIPAddress); - + /* HTTP Webserver Initialization */ - uip_listen(HTONS(80)); + WebserverApp_Init(); } /** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and @@ -283,7 +261,6 @@ void SetupHardware(void) */ void EVENT_USB_Host_DeviceAttached(void) { - puts_P(PSTR("Device Attached.\r\n")); LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); } @@ -292,7 +269,6 @@ void EVENT_USB_Host_DeviceAttached(void) */ void EVENT_USB_Host_DeviceUnattached(void) { - puts_P(PSTR("\r\nDevice Unattached.\r\n")); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); } @@ -309,9 +285,6 @@ void EVENT_USB_Host_HostError(const uint8_t ErrorCode) { USB_ShutDown(); - printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n" - " -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); for(;;); } @@ -321,10 +294,5 @@ void EVENT_USB_Host_HostError(const uint8_t ErrorCode) */ void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, const uint8_t SubErrorCode) { - printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n" - " -- Error Code %d\r\n" - " -- Sub Error Code %d\r\n" - " -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState); - LEDs_SetAllLEDs(LEDMASK_USB_ERROR); }