X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/e8b8ed2bad293b190c6b2ce9a575e73fbf93e9e2..a9e0935a90346beb0c981924becc1f55d969a08b:/Projects/Webserver/Lib/uIPManagement.c diff --git a/Projects/Webserver/Lib/uIPManagement.c b/Projects/Webserver/Lib/uIPManagement.c index f00119372..45f8a6ae5 100644 --- a/Projects/Webserver/Lib/uIPManagement.c +++ b/Projects/Webserver/Lib/uIPManagement.c @@ -30,7 +30,7 @@ /** \file * - * uIP Managament functions. This file contains the functions and globals needed to maintain the uIP + * 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. */ @@ -46,22 +46,27 @@ struct timer ARPTimer; /** MAC address of the RNDIS device, when enumerated */ struct uip_eth_addr MACAddress; +bool HaveIPConfiguration; /** Configures the uIP stack ready for network traffic. */ void uIPManagement_Init(void) { /* uIP Timing Initialization */ clock_init(); - timer_set(&ConnectionTimer, CLOCK_SECOND / 100); + timer_set(&ConnectionTimer, CLOCK_SECOND / 2); timer_set(&ARPTimer, CLOCK_SECOND * 10); /* uIP Stack Initialization */ uip_init(); + uip_arp_init(); + uip_setethaddr(MACAddress); /* DHCP/Server IP Settings Initialization */ - #if defined(ENABLE_DHCP) - DHCPApp_Init(); + #if defined(ENABLE_DHCP_CLIENT) + HaveIPConfiguration = false; + DHCPClientApp_Init(); #else + HaveIPConfiguration = true; 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]); @@ -70,11 +75,14 @@ void uIPManagement_Init(void) uip_setnetmask(&Netmask); uip_setdraddr(&GatewayIPAddress); #endif - - uip_setethaddr(MACAddress); /* HTTP Webserver Initialization */ - WebserverApp_Init(); + 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 @@ -84,61 +92,113 @@ void uIPManagement_ManageNetwork(void) { if ((USB_CurrentMode == USB_MODE_HOST) && (USB_HostState == HOST_STATE_Configured)) { - uIPManagement_ProcessIncommingPacket(); + uIPManagement_ProcessIncomingPacket(); uIPManagement_ManageConnections(); } } -/** Processes incomming packets to the server from the connected RNDIS device, creating responses as needed. */ -static void uIPManagement_ProcessIncommingPacket(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) { - if (RNDIS_Host_IsPacketReceived(&Ethernet_RNDIS_Interface)) + /* Call the correct TCP application based on the port number the connection is listening on */ + switch (uip_conn->lport) { - LEDs_SetAllLEDs(LEDMASK_USB_BUSY); + case HTONS(HTTP_SERVER_PORT): + HTTPServerApp_Callback(); + break; + #if defined(ENABLE_TELNET_SERVER) + case HTONS(TELNET_SERVER_PORT): + TELNETServerApp_Callback(); + break; + #endif + } +} - /* Read the incomming packet straight into the UIP packet buffer */ - RNDIS_Host_ReadPacket(&Ethernet_RNDIS_Interface, &uip_buf[0], &uip_len); +/** 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; + } +} - if (uip_len > 0) - { - bool PacketHandled = true; +/** Processes Incoming packets to the server from the connected RNDIS device, creating responses as needed. */ +static void uIPManagement_ProcessIncomingPacket(void) +{ + /* If no packet received, exit processing routine */ + if (!(RNDIS_Host_IsPacketReceived(&Ethernet_RNDIS_Interface))) + return; + + LEDs_SetAllLEDs(LEDMASK_USB_BUSY); - struct uip_eth_hdr* EthernetHeader = (struct uip_eth_hdr*)&uip_buf[0]; - if (EthernetHeader->type == HTONS(UIP_ETHTYPE_IP)) - { + /* Read the Incoming packet straight into the UIP packet buffer */ + RNDIS_Host_ReadPacket(&Ethernet_RNDIS_Interface, 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 incomming packet */ + /* Process Incoming packet */ uip_input(); - /* Add destination MAC to outgoing packet */ + /* If a response was generated, send it */ if (uip_len > 0) - uip_arp_out(); - } - else if (EthernetHeader->type == HTONS(UIP_ETHTYPE_ARP)) - { + { + /* Add destination MAC to outgoing packet */ + uip_arp_out(); + + uip_split_output(); + } + + break; + case HTONS(UIP_ETHTYPE_ARP): /* Process ARP packet */ uip_arp_arpin(); - } - else - { - PacketHandled = false; - } - - /* If a response was generated, send it */ - if ((uip_len > 0) && PacketHandled) - RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, &uip_buf[0], uip_len); + + /* If a response was generated, send it */ + if (uip_len > 0) + uip_split_output(); + + break; } - - LEDs_SetAllLEDs(LEDMASK_USB_READY); } + + LEDs_SetAllLEDs(LEDMASK_USB_READY | ((HaveIPConfiguration) ? LEDMASK_UIP_READY_CONFIG : LEDMASK_UIP_READY_NOCONFIG)); } /** Manages the currently open network connections, including TCP and (if enabled) UDP. */ static void uIPManagement_ManageConnections(void) { - /* Manage open connections */ + /* 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); @@ -156,11 +216,12 @@ static void uIPManagement_ManageConnections(void) /* Add destination MAC to outgoing packet */ uip_arp_out(); - RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, &uip_buf[0], uip_len); + /* Split and send the outgoing packet */ + uip_split_output(); } } - #if defined(ENABLE_DHCP) + #if defined(ENABLE_DHCP_CLIENT) for (uint8_t i = 0; i < UIP_UDP_CONNS; i++) { /* Run periodic connection management for each UDP connection */ @@ -172,7 +233,8 @@ static void uIPManagement_ManageConnections(void) /* Add destination MAC to outgoing packet */ uip_arp_out(); - RNDIS_Host_SendPacket(&Ethernet_RNDIS_Interface, &uip_buf[0], uip_len); + /* Split and send the outgoing packet */ + uip_split_output(); } } #endif