Update Studio Integration DLL, to include package logging.
[pub/USBasp.git] / Projects / Webserver / Lib / uIPManagement.c
index ba2a505..692da0d 100644 (file)
-/*\r
-             LUFA Library\r
-     Copyright (C) Dean Camera, 2010.\r
-              \r
-  dean [at] fourwalledcubicle [dot] com\r
-      www.fourwalledcubicle.com\r
-*/\r
-\r
-/*\r
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
-  Permission to use, copy, modify, distribute, and sell this \r
-  software and its documentation for any purpose is hereby granted\r
-  without fee, provided that the above copyright notice appear in \r
-  all copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting \r
-  documentation, and that the name of the author not be used in \r
-  advertising or publicity pertaining to distribution of the \r
-  software without specific, written prior permission.\r
-\r
-  The author disclaim all warranties with regard to this\r
-  software, including all implied warranties of merchantability\r
-  and fitness.  In no event shall the author be liable for any\r
-  special, indirect or consequential damages or any damages\r
-  whatsoever resulting from loss of use, data or profits, whether\r
-  in an action of contract, negligence or other tortious action,\r
-  arising out of or in connection with the use or performance of\r
-  this software.\r
-*/\r
-\r
-/** \file\r
- *\r
- *  uIP Management functions. This file contains the functions and globals needed to maintain the uIP\r
- *  stack once an RNDIS device has been attached to the system.\r
- */\r
-\r
-#define  INCLUDE_FROM_UIPMANAGEMENT_C\r
-#include "uIPManagement.h"\r
-\r
-/** Connection timer, to retain the time elapsed since the last time the uIP connections were managed. */\r
-struct timer ConnectionTimer;\r
-\r
-/** ARP timer, to retain the time elapsed since the ARP cache was last updated. */\r
-struct timer ARPTimer;\r
-\r
-/** MAC address of the RNDIS device, when enumerated */\r
-struct uip_eth_addr MACAddress;\r
-\r
-\r
-/** Configures the uIP stack ready for network traffic. */\r
-void uIPManagement_Init(void)\r
-{\r
-       /* uIP Timing Initialization */\r
-       clock_init();\r
-       timer_set(&ConnectionTimer, CLOCK_SECOND / 10);\r
-       timer_set(&ARPTimer, CLOCK_SECOND * 10);        \r
-\r
-       /* uIP Stack Initialization */\r
-       uip_init();\r
-       uip_arp_init();\r
-       uip_setethaddr(MACAddress);\r
-\r
-       /* DHCP/Server IP Settings Initialization */\r
-       #if defined(ENABLE_DHCP)\r
-       DHCPClientApp_Init();\r
-       #else\r
-       uip_ipaddr_t IPAddress, Netmask, GatewayIPAddress;\r
-       uip_ipaddr(&IPAddress,        DEVICE_IP_ADDRESS[0], DEVICE_IP_ADDRESS[1], DEVICE_IP_ADDRESS[2], DEVICE_IP_ADDRESS[3]);\r
-       uip_ipaddr(&Netmask,          DEVICE_NETMASK[0],    DEVICE_NETMASK[1],    DEVICE_NETMASK[2],    DEVICE_NETMASK[3]);\r
-       uip_ipaddr(&GatewayIPAddress, DEVICE_GATEWAY[0],    DEVICE_GATEWAY[1],    DEVICE_GATEWAY[2],    DEVICE_GATEWAY[3]);\r
-       uip_sethostaddr(&IPAddress);\r
-       uip_setnetmask(&Netmask);\r
-       uip_setdraddr(&GatewayIPAddress);\r
-       #endif\r
-       \r
-       /* HTTP Webserver Initialization */\r
-       HTTPServerApp_Init();\r
-       \r
-       /* TELNET Server Initialization */\r
-       TELNETServerApp_Init();\r
-}\r
-\r
-/** uIP Management function. This function manages the uIP stack when called while an RNDIS device has been\r
- *  attached to the system.\r
- */\r
-void uIPManagement_ManageNetwork(void)\r
-{\r
-       if ((USB_CurrentMode == USB_MODE_HOST) && (USB_HostState == HOST_STATE_Configured))\r
-       {\r
-               uIPManagement_ProcessIncomingPacket();\r
-               uIPManagement_ManageConnections();\r
-       }\r
-}\r
-\r
-/** uIP TCP/IP network stack callback function for the processing of a given TCP connection. This routine dispatches\r
- *  to the appropriate TCP protocol application based on the connection's listen port number.\r
- */\r
-void uIPManagement_TCPCallback(void)\r
-{\r
-       /* Call the correct TCP application based on the port number the connection is listening on */\r
-       switch (uip_conn->lport)\r
-       {\r
-               case HTONS(HTTP_SERVER_PORT):\r
-                       HTTPServerApp_Callback();\r
-                       break;\r
-               case HTONS(TELNET_SERVER_PORT):\r
-                       TELNETServerApp_Callback();\r
-                       break;\r
-       }\r
-}\r
-\r
-/** uIP TCP/IP network stack callback function for the processing of a given UDP connection. This routine dispatches\r
- *  to the appropriate UDP protocol application based on the connection's listen port number.\r
- */\r
-void uIPManagement_UDPCallback(void)\r
-{\r
-       /* Call the correct UDP application based on the port number the connection is listening on */\r
-       switch (uip_udp_conn->lport)\r
-       {\r
-               case HTONS(DHCPC_CLIENT_PORT):\r
-                       DHCPClientApp_Callback();\r
-                       break;\r
-       }\r
-}\r
-\r
-/** Processes Incoming packets to the server from the connected RNDIS device, creating responses as needed. */\r
-static void uIPManagement_ProcessIncomingPacket(void)\r
-{\r
-       /* If no packet received, exit processing routine */\r
-       if (!(RNDIS_Host_IsPacketReceived(&Ethernet_RNDIS_Interface)))\r
-         return;\r
-         \r
-       LEDs_SetAllLEDs(LEDMASK_USB_BUSY);\r
-\r
-       /* Read the Incoming packet straight into the UIP packet buffer */\r
-       RNDIS_Host_ReadPacket(&Ethernet_RNDIS_Interface, uip_buf, &uip_len);\r
-\r
-       /* If the packet contains an Ethernet frame, process it */\r
-       if (uip_len > 0)\r
-       {\r
-               switch (((struct uip_eth_hdr*)uip_buf)->type)\r
-               {\r
-                       case HTONS(UIP_ETHTYPE_IP):\r
-                               /* Filter packet by MAC destination */\r
-                               uip_arp_ipin();\r
-\r
-                               /* Process Incoming packet */\r
-                               uip_input();\r
-\r
-                               /* If a response was generated, send it */\r
-                               if (uip_len > 0)\r
-                               {\r
-                                       /* Add destination MAC to outgoing packet */\r
-                                       uip_arp_out();\r
-\r
-                                       RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, uip_buf, uip_len);\r
-                               }\r
-                               \r
-                               break;\r
-                       case HTONS(UIP_ETHTYPE_ARP):\r
-                               /* Process ARP packet */\r
-                               uip_arp_arpin();\r
-                               \r
-                               /* If a response was generated, send it */\r
-                               if (uip_len > 0)\r
-                                 RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, uip_buf, uip_len);\r
-                               \r
-                               break;\r
-               }\r
-       }\r
-\r
-       LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
-}\r
-\r
-/** Manages the currently open network connections, including TCP and (if enabled) UDP. */\r
-static void uIPManagement_ManageConnections(void)\r
-{\r
-       /* Poll TCP connections for more data to send back to the host */\r
-       for (uint8_t i = 0; i < UIP_CONNS; i++)\r
-       {\r
-               uip_poll_conn(&uip_conns[i]);\r
-\r
-               /* If a response was generated, send it */\r
-               if (uip_len > 0)\r
-               {\r
-                       /* Add destination MAC to outgoing packet */\r
-                       uip_arp_out();\r
-\r
-                       RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, uip_buf, uip_len);\r
-               }\r
-       }\r
-\r
-       /* Manage open connections for timeouts */\r
-       if (timer_expired(&ConnectionTimer))\r
-       {\r
-               timer_reset(&ConnectionTimer);\r
-\r
-               LEDs_SetAllLEDs(LEDMASK_USB_BUSY);\r
-               \r
-               for (uint8_t i = 0; i < UIP_CONNS; i++)\r
-               {\r
-                       /* Run periodic connection management for each TCP connection */\r
-                       uip_periodic(i);\r
-\r
-                       /* If a response was generated, send it */\r
-                       if (uip_len > 0)\r
-                       {\r
-                               /* Add destination MAC to outgoing packet */\r
-                               uip_arp_out();\r
-\r
-                               RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, uip_buf, uip_len);\r
-                       }\r
-               }\r
-               \r
-               #if defined(ENABLE_DHCP_CLIENT)\r
-               for (uint8_t i = 0; i < UIP_UDP_CONNS; i++)\r
-               {\r
-                       /* Run periodic connection management for each UDP connection */\r
-                       uip_udp_periodic(i);\r
-\r
-                       /* If a response was generated, send it */\r
-                       if (uip_len > 0)\r
-                       {\r
-                               /* Add destination MAC to outgoing packet */\r
-                               uip_arp_out();\r
-\r
-                               RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, uip_buf, uip_len);\r
-                       }\r
-               }\r
-               #endif\r
-\r
-               LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
-       }\r
-\r
-       /* Manage ARP cache refreshing */\r
-       if (timer_expired(&ARPTimer))\r
-       {\r
-               timer_reset(&ARPTimer);\r
-               uip_arp_timer();\r
-       }\r
-}\r
+/*
+             LUFA Library
+     Copyright (C) Dean Camera, 2015.
+
+  dean [at] fourwalledcubicle [dot] com
+           www.lufa-lib.org
+*/
+
+/*
+  Copyright 2015  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
+ *
+ *  uIP Management functions. This file contains the functions and globals needed to maintain the uIP
+ *  stack once an RNDIS device has been attached to the system.
+ */
+
+#define  INCLUDE_FROM_UIPMANAGEMENT_C
+#include "uIPManagement.h"
+
+/** Connection timer, to retain the time elapsed since the last time the uIP connections were managed. */
+static struct timer ConnectionTimer;
+
+/** ARP timer, to retain the time elapsed since the ARP cache was last updated. */
+static struct timer ARPTimer;
+
+/** MAC address of the RNDIS device, when enumerated. */
+struct uip_eth_addr MACAddress;
+
+
+/** Configures the uIP stack ready for network traffic processing. */
+void uIPManagement_Init(void)
+{
+       /* uIP Timing Initialization */
+       clock_init();
+       timer_set(&ConnectionTimer, CLOCK_SECOND / 2);
+       timer_set(&ARPTimer, CLOCK_SECOND * 10);
+
+       /* uIP Stack Initialization */
+       uip_init();
+       uip_arp_init();
+
+       /* DHCP/Server IP Settings Initialization */
+       if (USB_CurrentMode == USB_MODE_Device)
+       {
+               MACAddress.addr[0] = SERVER_MAC_ADDRESS[0];
+               MACAddress.addr[1] = SERVER_MAC_ADDRESS[1];
+               MACAddress.addr[2] = SERVER_MAC_ADDRESS[2];
+               MACAddress.addr[3] = SERVER_MAC_ADDRESS[3];
+               MACAddress.addr[4] = SERVER_MAC_ADDRESS[4];
+               MACAddress.addr[5] = SERVER_MAC_ADDRESS[5];
+
+               #if defined(ENABLE_DHCP_SERVER)
+               DHCPServerApp_Init();
+               #endif
+
+               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(&Netmask,          DEVICE_NETMASK[0],    DEVICE_NETMASK[1],    DEVICE_NETMASK[2],    DEVICE_NETMASK[3]);
+               uip_ipaddr(&GatewayIPAddress, DEVICE_GATEWAY[0],    DEVICE_GATEWAY[1],    DEVICE_GATEWAY[2],    DEVICE_GATEWAY[3]);
+               uip_sethostaddr(&IPAddress);
+               uip_setnetmask(&Netmask);
+               uip_setdraddr(&GatewayIPAddress);
+       }
+       else
+       {
+               #if defined(ENABLE_DHCP_CLIENT)
+               DHCPClientApp_Init();
+               #else
+               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(&Netmask,          DEVICE_NETMASK[0],    DEVICE_NETMASK[1],    DEVICE_NETMASK[2],    DEVICE_NETMASK[3]);
+               uip_ipaddr(&GatewayIPAddress, DEVICE_GATEWAY[0],    DEVICE_GATEWAY[1],    DEVICE_GATEWAY[2],    DEVICE_GATEWAY[3]);
+               uip_sethostaddr(&IPAddress);
+               uip_setnetmask(&Netmask);
+               uip_setdraddr(&GatewayIPAddress);
+               #endif
+       }
+
+       /* Virtual Webserver Ethernet Address Configuration */
+       uip_setethaddr(MACAddress);
+
+       /* HTTP Webserver Initialization */
+       HTTPServerApp_Init();
+
+       /* TELNET Server Initialization */
+       #if defined(ENABLE_TELNET_SERVER)
+       TELNETServerApp_Init();
+       #endif
+}
+
+/** uIP Management function. This function manages the uIP stack when called while an RNDIS device has been
+ *  attached to the system.
+ */
+void uIPManagement_ManageNetwork(void)
+{
+       if (((USB_CurrentMode == USB_MODE_Host)   && (USB_HostState   == HOST_STATE_Configured)) ||
+           ((USB_CurrentMode == USB_MODE_Device) && (USB_DeviceState == DEVICE_STATE_Configured)))
+       {
+               uIPManagement_ProcessIncomingPacket();
+               uIPManagement_ManageConnections();
+       }
+}
+
+/** 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;
+               #if defined(ENABLE_TELNET_SERVER)
+               case HTONS(TELNET_SERVER_PORT):
+                       TELNETServerApp_Callback();
+                       break;
+               #endif
+       }
+}
+
+/** 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)
+       {
+               #if defined(ENABLE_DHCP_CLIENT)
+               case HTONS(DHCP_CLIENT_PORT):
+                       DHCPClientApp_Callback();
+                       break;
+               #endif
+               #if defined(ENABLE_DHCP_SERVER)
+               case HTONS(DHCP_SERVER_PORT):
+                       DHCPServerApp_Callback();
+                       break;
+               #endif
+       }
+}
+
+/** Processes Incoming packets to the server from the connected RNDIS device, creating responses as needed. */
+static void uIPManagement_ProcessIncomingPacket(void)
+{
+       /* Determine which USB mode the system is currently initialized in */
+       if (USB_CurrentMode == USB_MODE_Device)
+       {
+               /* If no packet received, exit processing routine */
+               if (!(RNDIS_Device_IsPacketReceived(&Ethernet_RNDIS_Interface_Device)))
+                 return;
+
+               LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
+
+               /* Read the Incoming packet straight into the UIP packet buffer */
+               RNDIS_Device_ReadPacket(&Ethernet_RNDIS_Interface_Device, uip_buf, &uip_len);
+       }
+       else
+       {
+               /* If no packet received, exit processing routine */
+               if (!(RNDIS_Host_IsPacketReceived(&Ethernet_RNDIS_Interface_Host)))
+                 return;
+
+               LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
+
+               /* Read the Incoming packet straight into the UIP packet buffer */
+               RNDIS_Host_ReadPacket(&Ethernet_RNDIS_Interface_Host, uip_buf, &uip_len);
+       }
+
+       /* If the packet contains an Ethernet frame, process it */
+       if (uip_len > 0)
+       {
+               switch (((struct uip_eth_hdr*)uip_buf)->type)
+               {
+                       case HTONS(UIP_ETHTYPE_IP):
+                               /* Filter packet by MAC destination */
+                               uip_arp_ipin();
+
+                               /* Process Incoming packet */
+                               uip_input();
+
+                               /* If a response was generated, send it */
+                               if (uip_len > 0)
+                               {
+                                       /* Add destination MAC to outgoing packet */
+                                       uip_arp_out();
+
+                                       uip_split_output();
+                               }
+
+                               break;
+                       case HTONS(UIP_ETHTYPE_ARP):
+                               /* Process ARP packet */
+                               uip_arp_arpin();
+
+                               /* If a response was generated, send it */
+                               if (uip_len > 0)
+                                 uip_split_output();
+
+                               break;
+               }
+       }
+
+       LEDs_SetAllLEDs(LEDMASK_USB_READY);
+}
+
+/** Manages the currently open network connections, including TCP and (if enabled) UDP. */
+static void uIPManagement_ManageConnections(void)
+{
+       /* Poll TCP connections for more data to send back to the host */
+       for (uint8_t i = 0; i < UIP_CONNS; i++)
+       {
+               uip_poll_conn(&uip_conns[i]);
+
+               /* If a response was generated, send it */
+               if (uip_len > 0)
+               {
+                       /* Add destination MAC to outgoing packet */
+                       uip_arp_out();
+
+                       /* Split and send the outgoing packet */
+                       uip_split_output();
+               }
+       }
+
+       /* Manage open connections for timeouts */
+       if (timer_expired(&ConnectionTimer))
+       {
+               timer_reset(&ConnectionTimer);
+
+               LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
+
+               for (uint8_t i = 0; i < UIP_CONNS; i++)
+               {
+                       /* Run periodic connection management for each TCP connection */
+                       uip_periodic(i);
+
+                       /* If a response was generated, send it */
+                       if (uip_len > 0)
+                       {
+                               /* Add destination MAC to outgoing packet */
+                               uip_arp_out();
+
+                               /* Split and send the outgoing packet */
+                               uip_split_output();
+                       }
+               }
+
+               #if defined(ENABLE_DHCP_CLIENT)
+               for (uint8_t i = 0; i < UIP_UDP_CONNS; i++)
+               {
+                       /* Run periodic connection management for each UDP connection */
+                       uip_udp_periodic(i);
+
+                       /* If a response was generated, send it */
+                       if (uip_len > 0)
+                       {
+                               /* Add destination MAC to outgoing packet */
+                               uip_arp_out();
+
+                               /* Split and send the outgoing packet */
+                               uip_split_output();
+                       }
+               }
+               #endif
+
+               LEDs_SetAllLEDs(LEDMASK_USB_READY);
+       }
+
+       /* Manage ARP cache refreshing */
+       if (timer_expired(&ARPTimer))
+       {
+               timer_reset(&ARPTimer);
+               uip_arp_timer();
+       }
+}
+