-/*\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 / 2);\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_CLIENT)\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
- uip_split_output();\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
- uip_split_output();\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
- /* Split and send the outgoing packet */\r
- uip_split_output();\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
- /* Split and send the outgoing packet */\r
- uip_split_output();\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
- /* Split and send the outgoing packet */\r
- uip_split_output();\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();
+ }
+}
+