// Scheduler include files. #include "FreeRTOS.h" #include "task.h" // lwIP includes #include "dhcp.h" #include "dns.h" #include "DHCP_client.h" #include "IP_Settings.h" #include "UserInterface.h" #ifndef LWIP_DNS #error "LWIP_DNS not defined, check your lwipopts.h file !!!!" #endif // Private macro ------------------------------------------------------------- #ifndef MY_DHCP_DEBUG #define MY_DHCP_DEBUG LWIP_DBG_OFF //LWIP_DBG_ON //LWIP_DBG_OFF // LWIP_DBG_ON #endif #if (MY_DHCP_DEBUG == LWIP_DBG_ON) #define DHCP_BUFF_S 350 static char lpbuf[DHCP_BUFF_S]; #ifdef ATLONA_PROC #ifdef ATLONA_PROC_WS_WSS #define DHCPP_DEBUG(x, ...) { snprintf(lpbuf, DHCP_BUFF_S, (char *)x, ##__VA_ARGS__); streamPrint(AMS_RS232_ID, DefaultInterface, FALSE, "%s", lpbuf); } #else #define DHCPP_DEBUG(x, ...) { snprintf(lpbuf, DHCP_BUFF_S, (char *)x, ##__VA_ARGS__); streamPrint(DefaultInterface, FALSE, "%s", lpbuf); } #endif #else #define DHCPP_DEBUG(x, ...) { snprintf(lpbuf, WSS_BUFF_S, (char *)x, ##__VA_ARGS__); streamPrint(DefaultInterface, "%s", lpbuf); } #endif #else #define DHCPP_DEBUG(x, ...) #endif #define MAX_DHCP_TRIES 4 static DHCP_States DHCP_state = eDHCP_LinkDown; bool DhcpAddressAssigned = FALSE; //------------------------------------------------------------------------- void SetDhcpState(DHCP_States NewState) { DHCP_state = NewState; #if (MY_DHCP_DEBUG == LWIP_DBG_ON) DHCPP_DEBUG("DHCP_NewState:\r\n"); switch(NewState) { case eDHCP_Start: DHCPP_DEBUG(" eDHCP_Start\r\n"); break; case eDHCP_WaitAddress: DHCPP_DEBUG(" eDHCP_WaitAddress\r\n"); break; case eDHCP_AddressAsigned: DHCPP_DEBUG(" eDHCP_AddressAsigned\r\n"); break; case eDHCP_TimeOut: DHCPP_DEBUG(" eDHCP_TimeOut\r\n"); break; case eDHCP_LinkDown: DHCPP_DEBUG(" eDHCP_LinkDown\r\n"); break; } #endif } //------------------------------------------------------------------------- bool GetDhcpAddressAssignedState(void) { return DhcpAddressAssigned; } //------------------------------------------------------------------------- /** * @brief DHCP Process * @param argument: network interface * @retval None */ void vDHCP_thread( void *pvParameters ) { DHCP_TaskParams_t *pDHCP_TaskParams = (DHCP_TaskParams_t*)pvParameters; __DwordOrBytes Addr; bool ShowNewAddress = FALSE; struct ip_addr DnsIpAddr; while(1) { switch(DHCP_state) { case eDHCP_Start: DhcpAddressAssigned = FALSE; // Stop DHCP netifapi_dhcp_stop(pDHCP_TaskParams->netif); if(GetTcpIpMode() == TRUE) { // init values to ZERO before starting DHCP pDHCP_TaskParams->netif->ip_addr.addr = 0; pDHCP_TaskParams->netif->netmask.addr = 0; pDHCP_TaskParams->netif->gw.addr = 0; Addr.Dword = 0; ShowNewAddress = FALSE; // start DHCP and wait for address netifapi_dhcp_start(pDHCP_TaskParams->netif); // change DHCP task state machine DHCP_state = eDHCP_WaitAddress; #if ((defined ATLONA_PROC) || (defined ATLONA_PROC_WS_WSS)) #ifdef ATLONA_PROC_WS_WSS streamPrint(AMS_DEBUG_PRINT, DefaultInterface, FALSE, "State: Looking for DHCP server ...\r\n"); #else streamPrint(DefaultInterface, FALSE, "State: Looking for DHCP server ...\r\n"); #endif #else streamPrint(DefaultInterface, "State: Looking for DHCP server ...\r\n"); #endif } else { DHCP_state = eDHCP_TimeOut; } break; //------------------------------------------------------------------- case eDHCP_WaitAddress: DHCPP_DEBUG(" from inside eDHCP_WaitAddress\r\n"); // Read the new IP address if(pDHCP_TaskParams->netif->ip_addr.addr != 0) { // if new address assigned change DHCP task state DHCP_state = eDHCP_AddressAsigned; ShowNewAddress = TRUE; DHCPP_DEBUG(" from inside if(pDHCP_TaskParams->netif->ip_addr.addr != 0)\r\n"); } else { // DHCP timeout if(pDHCP_TaskParams->netif->dhcp->tries > MAX_DHCP_TRIES) { // Stop DHCP netifapi_dhcp_stop(pDHCP_TaskParams->netif); DHCP_state = eDHCP_TimeOut; DHCPP_DEBUG(" from inside dhcp->tries > MAX_DHCP_TRIES\r\n"); } } break; //------------------------------------------------------------------- case eDHCP_TimeOut: pDHCP_TaskParams->netif->ip_addr.addr = GetIpAddDword(); pDHCP_TaskParams->netif->netmask.addr = GetIpMaskDword(); pDHCP_TaskParams->netif->gw.addr = GetIpGwDword(); netifapi_netif_set_addr(pDHCP_TaskParams->netif, &pDHCP_TaskParams->netif->ip_addr , &pDHCP_TaskParams->netif->netmask, &pDHCP_TaskParams->netif->gw); // make it the default interface netifapi_netif_set_default(pDHCP_TaskParams->netif); netifapi_netif_set_up(pDHCP_TaskParams->netif); if(GetTcpIpMode() == TRUE) { #if ((defined ATLONA_PROC) || (defined ATLONA_PROC_WS_WSS)) #ifdef ATLONA_PROC_WS_WSS streamPrint(AMS_DEBUG_PRINT, DefaultInterface, FALSE, "DHCP timeout !!\r\n"); #else streamPrint(DefaultInterface, FALSE, "DHCP timeout !!\r\n"); #endif #else streamPrint(DefaultInterface, "DHCP timeout !!\r\n"); #endif } DHCP_state = eDHCP_AddressAsigned; ShowNewAddress = TRUE; break; //------------------------------------------------------------------- case eDHCP_AddressAsigned: if(ShowNewAddress == TRUE) { ShowNewAddress = FALSE; // display IP settings Addr.Dword = pDHCP_TaskParams->netif->ip_addr.addr; #if ((defined ATLONA_PROC) || (defined ATLONA_PROC_WS_WSS)) #ifdef ATLONA_PROC_WS_WSS streamPrint(AMS_DEBUG_PRINT, DefaultInterface, FALSE, "IP address set to: %d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]); Addr.Dword = pDHCP_TaskParams->netif->netmask.addr; streamPrint(AMS_DEBUG_PRINT, DefaultInterface, FALSE, "Net Mask value set to: %d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]); Addr.Dword = pDHCP_TaskParams->netif->gw.addr; streamPrint(AMS_DEBUG_PRINT, DefaultInterface, FALSE,"Gateway IP address set to: %d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]); DnsIpAddr = dns_getserver(0); Addr.Dword = DnsIpAddr.addr; streamPrint(AMS_DEBUG_PRINT, DefaultInterface, FALSE,"DNS #1 IP set to: %d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]); DnsIpAddr = dns_getserver(1); Addr.Dword = DnsIpAddr.addr; streamPrint(AMS_DEBUG_PRINT, DefaultInterface, FALSE,"DNS #2 IP set to: %d.%d.%d.%d\r\n\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]); #else streamPrint(DefaultInterface, FALSE, "IP address set to: %d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]); Addr.Dword = pDHCP_TaskParams->netif->netmask.addr; streamPrint(DefaultInterface, FALSE, "Net Mask value set to: %d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]); Addr.Dword = pDHCP_TaskParams->netif->gw.addr; streamPrint(DefaultInterface, FALSE,"Gateway IP address set to: %d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]); DnsIpAddr = dns_getserver(0); Addr.Dword = DnsIpAddr.addr; streamPrint(DefaultInterface, FALSE,"DNS #1 IP set to: %d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]); DnsIpAddr = dns_getserver(1); Addr.Dword = DnsIpAddr.addr; streamPrint(DefaultInterface, FALSE,"DNS #2 IP set to: %d.%d.%d.%d\r\n\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]); #endif #else streamPrint(DefaultInterface, "IP address set to: %d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]); Addr.Dword = pDHCP_TaskParams->netif->netmask.addr; streamPrint(DefaultInterface, "Net Mask value set to: %d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]); Addr.Dword = pDHCP_TaskParams->netif->gw.addr; streamPrint(DefaultInterface, "Gateway IP address set to: %d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]); DnsIpAddr = dns_getserver(0); Addr.Dword = DnsIpAddr.addr; streamPrint(DefaultInterface, "DNS #1 IP set to: %d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]); DnsIpAddr = dns_getserver(1); Addr.Dword = DnsIpAddr.addr; streamPrint(DefaultInterface, "DNS #2 IP set to: %d.%d.%d.%d\r\n\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]); #endif // update TCP IP struct in RAM with the new addresses: SetIpAddDword(pDHCP_TaskParams->netif->ip_addr.addr, NO_WRITE_TO_FLASH); SetIpMaskDword(pDHCP_TaskParams->netif->netmask.addr, NO_WRITE_TO_FLASH); SetIpGwDword(pDHCP_TaskParams->netif->gw.addr, NO_WRITE_TO_FLASH); DnsIpAddr = dns_getserver(0); Addr.Dword = DnsIpAddr.addr; SetDnsIpDword(eDNS_Primary, Addr.Dword); DnsIpAddr = dns_getserver(1); Addr.Dword = DnsIpAddr.addr; SetDnsIpDword(eDNS_Secondary, Addr.Dword); // set the IP settings structure for later usage // add function calles here !!! pDHCP_TaskParams->DHCP_AddrAssignedCB(); DhcpAddressAssigned = TRUE; } break; //------------------------------------------------------------------- case eDHCP_LinkDown: // do nothing, wait for link to established DHCPP_DEBUG(" from inside eDHCP_LinkDown\r\n"); break; //------------------------------------------------------------------- default: break; } /* wait 250 ms */ vTaskDelay((250 / portTICK_RATE_MS)); } }